ࡱ;   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Root Entry  .)䰱Drawing StarDraw 5.0iwRSfxDocumentInfo  David Hall h|1h\I David Hall k|135 O|12!Writing and Using Java Predicates !Copyright (c) 2002, David A. Hall Info 1 Info 2 Info 3 Info 4 j|1Sd* <44Standard LIBIMBEDDED LIBIMBEDDED TASK,0,1,H 1,0,100,1,SBX sb : Standard StarBASICSBX ARSBX AR SBX ARSBX OBc BasicLibrariesBasicLibrariesSBX ARSBX AR SBX ARSBX OBe DialogLibrariesDialogLibrariesSBX ARSBX AR SBX ARXOutdevItemPool 1   )     &'()*+,-./06789:;UVWXYZ[\]c !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstt      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefd0\a'@qXX' @':@2XXXX&' @X'Q@ZArrow  X'Q@Arrow  X'.@,XXX'"@,XX'@CXX'@fX @ @ @ @ @ @ @'(@,XXX'x@̙ XX X2XDXV' @' @'{@kBitmap 1BM~6(SD}}x^rY}gKw%zI NޛTw Y@bN̿xkΝfܷS;[g86jOV_>wZV*fl>l^Od5Ldq՝UőS7g9FŪugv[ n%û;9{ʞԾL<{0TuXݻcKvsΝ乻7[r9vS΢;7R9>+ld;Ւpp>-?Y*#Rsso -[Ńg㍨WZ_LM&7=i}2hM3VJTPkS}nl$xπ!!|چ?Ƴ c|wV/#d73+FaU3l}䁩d,L*Zh(78,y8dFZ.ƊG9|EuYiξٞVΏGꟌ7uy3h ,$`+C<8-#˵'%]dG@Kp~ r|(xNY+Āae 836s[}U֚n56i+?T<>h~4xrBdT# °3 ]a>n~4x4_dc|Fq^#&e+2\#puې~ #ȶiWNa-yT9R1\䢶̅ʼnF3 7>՜!U|{7P|2ryHg35<k,+k'_QYwCRou4fqܪXZ5e3a«T yl2YYmͿ2d{+?- }ۜ~07QSxzT˗֧?Nr]@QpBVYL`"P̓'SITTөԧdc`ԔÄj>yW.5z a̬D: jG b=9W焼ja6@*`-e:2ˉ3Y<=T֓jj1@K X-~['x"Nh2nt-~Sl-x0fuo㟗_]h0}c2ny̝>V֡cY8(=hIoÑlo>LܟnvpO7nw0P$_=aEfu(!TX3 9,gA 6!}kW>س #|bgl/F "o/w؊ܢn—>Ǜ|r+q~+qL\kvԆEc~[y3j.fȇȟ̈eW\ [ۛnyrx/+//+C0ڭB-'̥m㢌͇3ŵtnC6d0]G=<΋']:j[O}e aQv3—C*,R,<ʣ/z;AҸmI_9ӊ@`` <4dN2_e+Nlfj+b,V*^/|_2 hnreK~]*=x,W`qXY,VCE|u7J1nm6&o,<7ltWѳf9[+oEl:m娣-ËC('WV" FfP-#\jv\˙Ό!̎U0 k`-mخB\>gE[}f1kA:Nq/7$ussqKq\8&UQpVB\4IһPzȲ$:ʥ@>AHz]֋I@yܥk tWbš=M$y8ni"\M~[??Jϋv??g89FtN!wVZ"LOc CHۉ3[ SbXŶnL~ޞz8pp흞r\ I/q!O{&+r?hf^t1u5道X$#Θ0;M97SZ9͗+9:Wtxj e7zKuѴ4EZOE\+j?V+cH5MaSc  |)„ތ&$n4ۭϾ՘ruYɜ{+?Ђ0pSk::zs"6H`Ո=qo" sŇK#J 0;fR/w<.ߨ:Z)=]A^!T5<ׂEzW? i_h"K0No95NDn6LX"ou{TZ8x-0HH0dݨ9!)>P}91~ ɼhQa"C$0Y 9'`O$4"  ܧD: ABl2z*o#>x<`v:C"Y~T<)?^~r8Xͺ_p$DZԝc.ٜ# m@~XNVxP< ȃf4Z$0š %G4nkcM9 3܏}.dԦ߇- K Ooyxr'Up9a-7<#}`@~2̎-Qc[u2Rkgsw{*ӭ7Ks;]WKQ8cF}rM>D WA;.$ ӊ&y7VF E 1&RqEpQbZ~NGš?'o~^{s1lHmJ Z)u'NS ^wZΆ,JI@Bx%}%t,-;Z~|2zVXш j#p:l xzPfubYnϼO7ZH{]Ev-*eb(]%+2^}B>kH$85ǹ1/qh")?,^>x>DCt IUd Oj,˧MG(u ]lԉ/H.g罳 LNs±uz1wLpzkJùsj@TC/~rяkVמ@1S1w)?_;649gQ0+sc}=Xx4b5%VhE ̓j;#UxZ/Br۳5GS;9sxqHo6&so T3zD"<)DQ7J[SК˒|?P88H ^G雑YCEZ/41&өuf--r͖AXv<ɖ< E[𿼐}ojDH! x9W l/T*ΤpL "JR9[.6_b5Fo4`Af+,՝ T wj1+ ft93Ln_0+h/U8X κR謓Sx| &Π_< J|%*==\T%P;-Ij@]G6oOݜ: Rꏍ]|S%Ph.aI+9:A);̺NYS7ƍ&E}2l:E.m@Ihg"BI}RjH'\/'qs ϋC-"XY% ZFbᕭi̲Q*7ÃQZ*9VAq#n?to7Ka{ ֔rqB;02x˴'%+`/.%RJ]bu85gl8 %GaN%ϙ/&o1>L(a)Hʚ =yEX+#3h'Sdd<e%OĆ"Ȇ'׌&cz s6D.Ǐ*`Âlhu))#˘^$,3wBDy8ecRAlNJyg@ʓ.а}j8( O(z3Dg1֖;L8Y|BΦuxޱ(x. .0 g ր?lz1 &fCj呵DW@6On$$eYqZ!~d 7&W/ N#Ɲ,sSc^BY% bFJYNQ)f$ܭP;Hx`GH5K&&^/IDYӞ C_&8x ha`gcM7ykV8Q+ٴ:&^ ob *bP60gͲTQH1uI{ѽHV꼮e)8XO5~yIp&uhwZtI<$i+XT78" %IH竏4,6(7[U`KLa@gdP>0LLb>Hr }&0ΣaiAKr^wGK^탡G#w[v8NxXov#҈uwUB~Ҍ! rM@eLX o@/3 BJc,]*kKܧ*M\1\X,_N+~&έ՞!J^|D~1{È{ 2zޚfEN ׫ ; o+TPВY \݅?WFMª\VK p8\^!>V>8+F\ac0r1%@nT:dVS=H'F9XC6Nlfm{V~n:gOR )4[,R'EU,C|L'Re» o̯Q^WS,^l+׌)u΋ݾGtDc SL-hc;ްaX&L - 'eeO<^Jç+( H"f{ܚ̻ٞUӐ_VhYQt c)s2e .q4ؐWoÀ7+ Q[-r1/N8ɵ c+ę$'DD# *$^# , xމ>N_<HQ8R,c#xdf472S` ٠8!C<"$9Tءj,'kſ.9W3iEX]ZɽWus A'r{ǫ]{*Ld3/w4ۇ=_qB4 \) 9Crz1a ]Iv7HR}#D-WN*M.Q H/cr!Z8hf/nG,r`Mxob^Ͱ%\2~˙VVc-7%75/6g%Ǭvّ;'6NsX~#)RQ!S߁D(?# osuŁկisǯ^<| D)Of_Z{ϫ92'z=~A Y}<\/<mvӻ"թR{=l\x:ne^Dfʣ1|, k欷q'`Sk( VlAP 0:[SxZcV xEe0HPQ:"2dad </@ ,Ć"2̣rYr2> X2qm.qzY ADȩ L6WAzg)0T쭄q~T /\M/h%<ޠ4(6&wO I1yĕ0dy8ـ{J룩3 b - y_JdC~CTRj:Y^ .,|&{yl^u x?7L}LIXx8I58c $6!m>'(_}A/HǢ\7S]9,$"3"i^+͛R#,+ "<`@ă_8f Y>[*)Rɤ}eR?"AHA5d]B(M L,WQQ59uHO( _׆~S71X{G6y*M> H_ؔ BƖGbC1Hta%, |//vڼzeE$iePmqV&M[@Dq>q}Y_AyELk0Ku=1D);|#t)o,ȿAgƭFRK|!/%lqLIrJˆ9 0v{Kv|? un|3Mۗ Q>E%W*ꑉjr"G)8Ո3/2[itQWH5)[c-=BcCqd:su,4e=ڎjB*i39A l.1"W4u]+y͗sx:fmć!Ğ۫m_}ǕϛwفPM>** ʀ+#F갿\.+FTTSj`' ϟSA-ِ}!:BBpAo[vJSvKdl FLn #"ϒ{2JrK'Yk]6PjSF2A†#$ Zlo ZB^(=xonN'XP86 "|Q~#d ?K쥆] btk5'v~ȫ}FJB?XF,Di,,@:* 53p iQ=4ui nLe3>x=O3<@KܗA0pf\?a«^DahT ]T14<O‡f~2h u\*c:qbf 9eQ#!p_'I(#y_Qy)^}JNDN@WJ!'B>:_D"ƒRBu$Fd"7&XL40 _H`Zb 8RY,%9yhbZ- c|,9/\hAQkhŁJÌH 3@(M*`~=T1/rͧy(-u".)^; ?ϝ*~VM jK?_.iWɕ}k ;#H;xAUDM!1mmA\gN;RT&oMFRdl\t5_q %1.h{*(zG6cGfp! 4a0C)}d&*u͉4܀G &7ݵύ(D(:2?ʆ XLwzi' !ԭhA#!BkO"ON F]{GjT:eB,Yaբ%X- Zr9-dwsg 6mȆpc5i\E%"oڀt4w[sbBse#:i!|K%Zf%s_bBRQt`Ԋ['aX=r~ F,"VȤqiUs1rHKd@E  Lr3H!g HPRD1ͨ(J*=TLA1‡5 1gëUx)=JҢ_>feN0! 7͜ŶAᰨ(>xG3_*ȳ_7/:^_"C)Ű7foTOg+觹n2h4*Zu,U%łT}YY8"zz4ԊI+y v3xccFFdY,_I ̿QBWƒS~۩kbh)bMe0Fj{/蛄h!;Y#x ͵.r.4 SU*w;y_&k(5V5&m"A{3ʓݵv0:"5҄/#US8j.XW}Q  `!Ӿ 5 I.rK"xxX"3xӕgrLh~>2d9Jswf@ cj™C<2M\ Ϫ;M J50 zZH]pN!J  qWİ j|; ivCnFnw@g%Mn+FĉKbݤө* !V2t*pFm!g0g͖k/2~STIck '憆uXCR rHSR2Ѥ ٲ*cLXă@ /L U]39j#ň  !^ Յ1r( QOQ4-_@}!F`=8XBfXDu9d^ utC֊В|k o_x{^-qV^`< B?Y@ڊY /N>Mw#Ï*~j6<5U A-<>g&74W>kʄ{IvV1LI7|jO/jzZ }ޙ~<~u;ݥx/+8a@-axܟ91Q$-#\mv)";IHf0&N`>$5]GvW3UdB#6`hQPڌ4H0*`l,), :8-jߖ1uY|hZa GZpHR֞Wǔӵ{Q2nghHDQN[ 2boͶXP*ѬsjQ|-U ǒ~stR#f݈c-k[p;ga{@{#fbV+0xn5h֚ΊMξ҇͹"Aqq9y11_ 3{B; Z 52µW~pf,el=M>7)p-9fBۃ$fu-8:P35pM?Kq"<Ẍx A)!_WgABHÑpY%Ќ ոP&xġRO/% U\7# 1~xG]/Z `-ч7ZJ Ǜ ˃_ZQEa'qMK[Œ!dO܆FZպ<QX3.x%rP7>PXŤ?hŧ%4D$ ]4! uq<)qB-+Wq]Ca(`ֱ R1QK~zrC0@AVAψ…LORErR ۦ ~Hpc'@iZ@-M$nR8sAiHֈ/l>3`@%9UD&iGԦͦ;,@^-f#n$qZ `7fݹ飪b^Of8]F戠6O}Zc}dA0,ynR2I_vu->H3NhʝVNrҩ(3k/ Rڂ{-a! N ōws8}6UZx++#o^ fpi*2(+w[k: >Sy/@ڳ(KO%ZU7s4 RY?ܽ;Ѩy;Q,Q&0*j+[E,Rw&j9P}Ρ~wnW.,A?ȆCErW;jOU67Jv_}s5KvИ?2h$Pa`"`f7ZܾL; Z7W ID™Z=;DhdK 9(F|ѹry Hf.2Ǥ˥DoFո7/iZmCpzK8$ˏd5c\zP5¶:.璘\| 9s F[KdcvGx[EL` о,WD[ބlj> 4T=~d&ni{xAMhBŗF^݊V}# DbK} T]/!CA| S'Njx d OW6) bLkc}: T6E^"rK "J8Y8fRxc=H2@P MBiQ8?2ދE.E@\}+F6UIdL{BC4PGtoAz#`-hfG|9o5Ro 3 #{Sd")|Oű poraxz))2˩DfjYLx_wBb]e0F<hqp(VKt 7`}j`h)FǍWpx߭[g3`V oQE[@"=JK̻-Cu`W\߫kh

dO"zc }?kņl"䂷[_t:/.$C yW Y'2|JPK;,~J-9uu$E[ɶҒ;3M) ڜDW()}9y~׍coG>lL~ٙQ,BE@\We}OC8]p)@|_!lvcaߥ$!/f+pUJz8DTz1H0?[5pT ;! 2y?3zd`Pcm,RUlC"A6FT. >ADY"N1c-eU'SP.2է`ҘO ֜H I%WKOt@C'ȁ΢XTx@-TII~]snn\s FF8x3-{hekV>_}7ƾES!z7u@$ i#$p}yT,t䐁 y4I(xJP,S*h)H,B -= ֦s`!Dzlٝ`uhΞ|(mekٵ3Zr`$ Mf'΅?ԱeAȣq*!n  OL emdvX#T# b?QMi*z0gǮ^qH0 @O[]?(6;>{[B1Nkt1bPjp/b=DoKEB'%o%ˎsf!%=k 5,=(j\s/*EAY2oiU*ȆŃ BYAμQ,l9R>m и!@`!HO.<~\览ݎ FlnH] OA4I#kO/u?8O@D;7` kB*?@NC:tmM݋|hf:͊q6gq6+1`:Sl '%JSqgՁ Q{{S.(ϒ堳K VRyobߨۑ'eh 9;ܙOwkz~<;< Lcc~ c1!6Zsg`yjJTǠ{VplKN+^4$*&*q0ۥ!rJP *m# 2\8U᭙ohFg4; as՛J'}t?/o!',|ߘϝK-?xzLK/pw/Jڎ]2Ŵ{d6q1OjP7iSIs62m{te|OTԁX!Wh gZBā0UETvJ-#WU/ P K eL3ݐ vR}ypд?)BAsYJBK0m?>r"4JlӸ,t).g7T줲{2C(إ9 `V١O˓_F(h᲏{aZ6,/CmLGaIZ 7@9<ʫL ;"ă,uC]%GU @6VxPڽB+d=!б'mO O{PEH.0)X{sK8BLAr~-Ƕ}UGQ_0p-#撱1ѹ%*ERih8@ YЄ\h2ZcbC6nlrDUZZHޭvv7&{'ԚcM8T(aa@:΍n+PԿtV>h{~uwkV>ó8g1.\6dqza |ܘxzٻeČj5D(OQ*BO!/S{A2w*/Z=ݶbYUOB@ vS{H5@P*"$E]Pnz'KmJJ$@pJNΝ@O'Ն1߲/* (G%"VjA`HaW*Ւ.)uĭ~T3FQS b.P;{n\D<:?oL|XƂQt1N2Fy f_dTT iEo[pu5~n5k z "R֛aƏZTgBr_%ī CJܪMwM|~*&_>QsZH cG̘7v3)5`iɡ%j#;B< Kë3DBxO! UC3ɿ"XNJŶβY5/%kұ<1&0D2;,HHyUmw?)@]eC4nnAX[J̙NūE<2A:V LI,(ss[mjVh:DGyM4u{mvɒbD\(Ğ\llja}h,C5|zp/S@5LZG:q\kJiDN/U%6v2v%qȸ.(gxſLAw͗1 IX)ڼxq,J'~Y@=ju|8p6(vNi{,05e![=+?M ĉf`^I&ыP-ފؙ0KHtY}^$ϭKSp|ͪm:2!w@y&8K-k]4&{gB?U$.РҬ1v;zfQE3 []AJdIa&G,!eг4+r[9ebgv?eivLJPkТCtףDmȆI:2`n|oayoF#=Ui@*ԯtX70=?tɡBKNSLNuelFa~ߛiD=eCHj{D+ד/{vl,=YqZ?9#M~tAWRZr?6|6" C'Ԭ(Ī0h@2a@a51XbgFV @Q[m:5cLpτvEэ}-'ie"Yc;cZ^i;C4?H}Mv8TZ+;[}T_8acQ)n1{qCo<Ƅ x&A@=l W:ͪmcϽ'6UA+>8 Ƒ&H$.?[w1 MhĈϬ9;۲dL ]cŴ#V3w#e#'.~<7i cGjYyܞB.ġ :ZZx G)Ӵ=҉[]}OD68kh Հrf0${svqH^-b)uJ[)"Ss=TKX#,4E`I* aOx;#@xF9y i|= gzM쏼Wb33T~_V 9WmjiT3" gfzqV_4-]YΰˈPjF1tpvpMU[q\mP 0e_{Es*{ 㯕?`t˭~ Wy-c8M@#!-RLq|W ZsZŽ}vAD-M?]ej91I&῜d7O@6&X\]#f \Ç8h^ġGWJK]@@ ",HPZ$Hf1̵;v^.La +Wߥ-ibCL7O f 7n4 dVRkOs%^>V4=Rz}w { Ab`_u̚ѯ<|VB`\\tPVsrZQV%SF&o@WC]e#~iZ~KrHe?eGED}u/E T‘kѨ-|>t`ˌ9&n#zr%$&evGiU5DDQV> lU'`i|}D5.wP|t[qg,M:+/St>Ơ FSN7ם^~TpBa/;,4ŭ7f#TbЩgB!x܍Hӿ(BT֋+-.؄[,[NfM AR SUQ%CM)#>gB*4o+?b7- <qҠРsSſHpP]W)a`!,xy{H E F؞^)KF; Tpb(MmVk:>P,eVg?rRp uW<[jR RBKha*tlm/RD<tQ:;\l6lh6 +Bn([t_H~f"^SE"(`51VP>}#p{6\B "As,28|uJoTtʜ 0LYڠ8P;q*Qe׼`[`euqI[enKWxazP1oqd~.#M;8C-Z@ldoJJl-ڤܰQjZPlcƵ30_TD`ѝ~4&׆ktbO9jqH_T0k&ZPAޖZ͉Ɂ]NCH A)ךC\،TUP K ' =wU"PȉCbm*+%5ܞs|4_(xP|"l(;X6ω;6MӔ*3zdETpbqcGjM_A(^=Jv2#oh?(4ȝ+%ۋ#EA+)=Pph^_ 3_6fO9RS+rJGdnN%80udaw^J3J.r A顎b@v0)|F+3Wrt(lWqvD m@Vڝ%- 9Q3^:WyJ_1ۣ,#ۦeHk?#T]:\b;o6l1٫HwCDY|b/N/s[YzR^HԡГHWD>-n_3ST DsBaOyE%so;>υt'0ņqڥSʢq"LS{ɼɼ U^/8~ۜ~$Z-pЊ|fd/׋/].zCr*ٯtF q6Ν4aG:™JysHhX[D l7v`r*{T3]6c5~p0V'QZZADEЇɐs6(JBc3. t{1WVQ $rh7t"Q# 8e1 ƹW$x"ڤQ-? [X͝T! jn^l֒G2ҁ nD&W|o6E?Ajm\QZtR"(`*%wL}^+<kpo|-q ~-}F3\o._xA*rRP/){2PD|)_=ݚQz[\e;Ki }MΡun PIhDP4䤨Jf9z)?PH.u{q=*~zNpퟢO_8cI#*rU[O`LA:AD$s:p>{S4Cr:\~cC}{l#TmnKo80!AiOD'I e X TSۨ+$4aj|/8rƑu$e&*=7XWW" dfJ*`i8[RW=xn//#.F,r,o_"4`J@0CA@\ȓp)<*nKz 6VM-Us? PQUgq2./C.&`U<1>D"FD =P0GweFb'QEm*.­;|wvF'+7Ȳpw6f"D?pNTiSՃ]g>B[oFq-_%S&ӎu*q chat}i OYuUolڌ{|7)Ui)@ܟ|\*`{i e7p塵V߃uR@< vTřa/TkP"@ǯK_|AJ}C]NZf28^;jX4&ć4^ Kj\><6㌶iHPߎu4x:09Az'׌h]g l=c&0'7;p30tPÈ$hi :9G!S>UWgwC }{xY0 {1?=;qrd|L}9uƮyqd*} _CMbNo8-UJC/㳅SYy)vt`om+QCkٛhDzmɒ8$8^v8Yq`|>=g7$]I.n9HuqZT A MM|N/'!Rk鑅H{̌ݿGsQ9DUKK(n9,&X8,kh &Pس+G48򅎋b. b49i1[Fm.j$pܹ(pkњFGNYfg-,*t ޚLJCӽh<(fy P3d2Oχ0k;>~G_ѣm aL\Ukަ#=ZZ޿ݸ)ڭ?g`:.B[~c4Rm>,˻'3jI /EیҲh6=u-JN?F RPCky_hpfu\#.U㓅'#6CHKdq<m3mU=~~b㉑V$naL"R{],tSJޤ>$t=g$uD=O67/WԚd̽d;:yr';'Y})9eoQW!5#=w'8{Cm O{o֏I}]GWGOZj#7OS?93)?Ŏ;FΗx)%/zb=t#IJRx_dg(>W=*j:dɅup oa޾:~A7 ٩Hz<ƃAAT8"M=16o4ɼdS/[J$NFn%qbs+jHN8K6"lxRb{z} Iص1+!"p;|\H0հVܹ,8E=hSN#_o3 Ii+yWNd?>7 aϮ!1L]b'a8@Aw`&(K8!tJxzOcp_?ӳ[DP CS5 ϶gNQW(>`&^Eݓ4iiZ@t!:V&c'*2~ @-jYElav6u #uD7xYKj{z3T*˻"7cI i`jja*W)hA"7duΓ[^u4*4 s#v+O>{et:܍%qiw#߼.Gm-D eiH[[mM/l6H~Ikv;J?^Oq o9Nx$]ҁ{3G*?酝D0lROG跷S 1ߓ &#oNT }S!U~S(עE4 W‰:}'(k:3-WqR0;OR/,a*wܞfQ['2VʈYK:\`,ҽ&SarϠFVq0f@RǢ@BQ[_q峛W>z,{ # XEzÇSkɯ]9*]PT_XٲNdhB޸kHty;q*A ̘4@b]e>=f\حCIk.bۏ:!K0Y2Ɖl<ݯBhZ;Y'z3<1[JGx=w1di-a UmT2wW";F{Gr(~[r&A$>ròǜ:gl4讓C4Limr_~ډyPj.HڄH]?@=n^eofÊSYƙ p&rmHpn*m*}A|/NW2%S IIkF|]-.HϪrakH'B;oFq\;t}n%˺evܢDV'u/_|u3C6Z*?@Un~MKG'b ̲뿣䧩! =jBv|Y]hɽd̫m>>z>#Du>& z>X&ƪ&s{'1p#Qq=r&w\] W^E38u3yl:8SJLmb?erI: 9p<=t֒7u4Ӈ1_\*}qG#V qU3I7L9}W/gD}l?I=Dgz!BR'7`0ӛ;ó,5 ǥhuHn6-rR@} 2 ˛bbJDJy|-e \0ƒͨ淼5ZN@!lFK )RnH ${}t#hݣqA_gݭǘf[SPDצQGMN9'\%ld\9cu{-&`(JU |VtV>^6d7o0\I )hL^0wKg6f>>V@˝3lּ2նm-ӎ"QK41c)TyypwOtTAmM39q};=u6}0 VgwGh0b61'ԣ4VёGh”bk :ڡYea]ogoT^r KKXg'Nhaym΀!kqՒޗf35 bmW[Qimkx$d ~)DoXY" PXdO̊qטx>yx0 3S}mtk4Nq裫-hV{]koBn~x/7N3 $2 ie2a^0t/sqGK{,nH;S,*Iz;Vt=GjTE!.n|-Gr3x~>{JZ-|{®:/Qʕ?)AP_~sű/J5BlfWgۊdbqw~mA3͒ v(V#l_L4(ؓ9Yta wf 2usC|/3̡y:*ܰmI@lI9\{2 (˻a [[J=e^+kY/SLzEEb˭on&;kFWK8$w58$4EMy:X۝gǽ[{獫^/5tKDUd[L? i FRVVE>{=UK`*! D,-lFQytxc)!/]ۇ>qʐ.~HkȸPQWK*nN"Ҩ耰Wz/LDƂ摢p&!x$ˇDw#零q0Eer@^[= E%=M\sy/\ (8I[w~h kJ`<[];5DŽ>jjQ49}|킗::$V>oR?|҃! }֬sNP4"?"r#ޔ';U'l;û-BOR.h ACNª[X+U3 |9ZQU=~K[OgtpA(CF`F-G<}&h WJjJ j2Z?yé.U'EN]S$Q|=&hU6ŢýXU'G^ߙR+KI$>;a /N T<LJL Mbͤ (E 8(yLQc:\$ OmU1:J'^RONoxнv{ t3\wCh >DH MuP&¢Vpomg;9bSduI){~nMQ5P~$j?ҳmmHP.nE: s$#MNH+cujW'M۩"<8nUi:t9hqϨӑDKs .a,|ڼfD~߮1Tkޙ{0"X_4kprXhT7?xa;)GiK<̄Eִ"{# %J-Q/(MnϨ;_u)s'6ExVÀh^TWrzND :g8`/.̄jՑܒGQ&e$GpGщ2tmFsn<Wώll@Ck`O{Ϻl^$d|phEI'w6As6KKem~O9*1i ѹTfJ{ʫPX23gy`QWCRjU3kȁ0{ɩv&(d-[JoRAKqiPo7Sؼiu O>Һ0bA@=RL ( :}5̥R7+~~\C٧Ԍm f, a<#C0x6#Gp X]EYqU,'D6ǵ{.J6wcMYM{OK`OFe#4:qfH|YP;1jw4Z5idcwu沒YmDLlFʽWD%9<$'68AJ3Y`'6)W3E'CCB/=9( C2y篜_yE,ҙmuuf!)|0eAZ}˜ki8Pqh>fqV7Z/-A9LEKt6L[f2M;}V;WH;fHJVhIۙzHs|Ҝ 11Jxilc~xT(EKD/XY+CB52 &kiu̶el.KOf܅j(Qc"P?!azt (N^ܨJ~Z0<%k,z[fNYkU%V1KeXWwfv$Ԍ7̾L4oE HP6&IR&fhRYۘY29aXgj[N"|x=jlX>W.r,ƥŽ{ Xz^>lSqDXqzק}vuK-*4>'Y s;~,[vpc.f#Ēx6aCGW4>_;I M<ƨS WYܹ;%~/73i񃫻]=qN}?~}QԹU )DF![}ѶX?[+[t7'@jױ;&} +BjTl㓇H0-ja,'!$GZLmC`nE$3e'R>ִ޼Ϸrfr )T7è8W24\sXJo鎙rnml/i /?Oi1c4[n j(6Ҹ^$ОHKܛ|h!xXi\Q_AlKʽXowËݎBqIMk̈Υ23gG7a78@Dל?xORr׬FI#- <49?9g~$qy&,ײTԉvl\ToN6TC==I?`~5 p->{'/]ꕳ^ 8[oB1 / UC`?6l%@ckɴL {#"ܫnȨ§ؖU wfmb'>.Fn(Blg-q?w^YC͚ѕ՛z-YZ+6~y|ϭ0єU Ӂ P)\M&i@ ^v$}f[Iȫc Z!jy!Kv7Nyb3(g֛2[H%hd$SE ܶpY)Ge,ۋ!DVUt||2w1U}M8b{"D)|ߊR6n|g=˹=jP$Jp1-=׆xl#ڪVP Tp`432 A:S?z!4Q9 6}2TlFvV]\+#L[uGeYnH~m4_ӈvFf6̿ow:]$#tA .~'#H#YX{ē3ܘc*,J ݒo;뤹p母lᬇʇ'_BQfeRV A DpIɵkCQOMK IN\[JbQל!j"za{9j ;f8_=HIT[ j;e׭rrޤ&θ?q٥ݑxyA6vY(;F"3w{Ճ9bڔ R- >Fwm` wLu|xiæn{DnH}U[A<|~~[P}Ccbj`U}?\AVO"`R?sxpZe#u(9 0{cS,`Z`dDT,]_6v󚅳Xsڤ'd,UWՍ `{Di3CՋ *fvg|_]<w*}'-|,h*s#_#jaS_(B#fI+‹VV~u->g{S6&!mu,ӊUն~L-`Vō(Hy ,5%NӰ&I jq'!A3& IC#Q~OV\ `f0UdA KF$S 0UŬT¯.`T֠ gJUl$qxxR'7~)Z;nsӊU3uymw^_]䁧}W^WE(T[IDa4Fͷ$p~hfn>8ZU6Tdb|gß&tW-ak |1$O B=ƋT`6%#76.b& %3>/); yUmd[%޽ʾ_.vՈb'axiFNH ߈a4 4%>~FK:P~y"p) (f_\Sda}f(~}v߅6<.4dQ づU&igS.tO!TTX{'ֽv'Bk#}@I&YuO4S[PX<М,9ܧYmg0K< f..B5ģd?wm?<} qې9)Sm޶ :D / t}wS::&a*V.dTG"d2?oѼ C/_pʄ8 w҄@ƮO]ehѿ~!t?zP-C֓YUBGZ^ٳmr@\WŢ ՎU-R36;tso(1~oVZïsQa:Tp{-fDNu`;w:)K ,}Ѷ5+TP'ѢK;o^J*Ƿ N: MB(",A>XQ"u3Й%0S0qG,dA2f 4/#o%/RƤyݺ_ K*:zo?I7t~~{v3RfJMyEl VQe ;yk%Q_im]pWַA߼pMl}JD!;xawoS**R .u.{MIe#>{o\"g_kI VSU-ٓ[1?D~= LGYk>uo ^P@#R qA[5)fߴT!bDGG :#<>P8飋{y//nCuxeI"a# h6y,e>Die32V9oȍ7 iGR(7 ta;w #RtI[!i\5o }xIAc(MkپfR K;ЧQnUyGKI cg~X0:4{YR9m8wiI># ^q 눟t/5 GHᵠvTA~㬆O^>70c)f;EyS£Dz5N2| ;HKW)IJb ̒sҼgo*>NU^Nv]~\-3~ғy.uIrlQinl4HT>{ bc=p y"3ŵv)@F`XAĽS۴ApKH?uc= ],D;=lhhF_F].Go=2b.M-O8ghIUuE jM7{g~"D!fԪYF]e0mFLVĩ1JRVyGCde#xyH!?_D]9]ϯL>ϒ''=_g/Ѕ YeBΙ WzwX38S؃&+mxg s2uK)%kҾGG'=&)+&D]aQK`8&~iwӷ> .¯0"m2"PzIU [, Y Bh|>z7G{aO?>% zDQ_U2!\՚7-R1 ۰/o1W{&kv՜ցi)7z/}ygfR-H~ܙM . *AĝnȎ{d*^ ~Ԇ1ۜbN=[FkRƍ}}m؞*,t)x$U6 QϢvz.m*p^rd ͶZq,O e04&g.?Њybݷ\*JEtaLWo Q<+Ca%{lu6uYy ~ef9^9Q <+ݮ?/bLyZ$i7MFfdam~bvS]D&8֘+_| ށF9sO70RȞ#e-6O2B{iKl;am=>B,:$9ϼxؽ~ ~Jr9L!et9r|<)U<t(w"]ZV \9vX@*V5"T֬?SaB5>]VF|i 7Cޣ?)WM3ܡUWIc͡^;9Q8j42x% g{ ҾuQ & fcg BxQtC=e#ka^~a:Z0ϹGtʗkͱF̔[mװq}J1,nX4="_J?7UiS F>*/:!MIb&YϢm>Z302N9YHj <@|lian!m<\?{`7 !&!Z֛җRV 7=/$$QG᎒]^Ju//3[ְ3 Q%sDAtȠ4n螰B)nNmm)63l1!At@;oaE~V.WxgiWq1˖oi~9Zy}tz[@ Fv!>YYVmNߣ43;ӊ8J@wf]'B(guy!hŝ$lmq5/mkzeeD@Qm$?%ܪKNؑB]Id #GSh+@m7gl{r#Tl  z*pAF y,г1+zkޣu<OʖOE^hG+xdў*iV1;}1{3*߽]'HgGWuPfΚfY=&gQV=qD,Uߟ4*):wA&Mȕe ٭lc0Y*]e;hH"۠fYuf$aon.?޺7/y,bv3>ݷ[pE>g/qcA-VX$؍28`ۼf+NxH3/iya W̬E8soZFb*ʎp\hyq75オC39<* z]+TIƈ&U5nb8Z;^šo7l J'?tKN˻){"OxnؽQ)['7d?Ud6WԞij45po(T;s(I dik[OzqHŗW_왓z =V8<$Lwe,)~_u795Pj! _} K2a[*lUl*p~pbüfˌ5ݙatMuIA0S.^,)mbͶNh`;KM9i&*TY"W#€r7X="\s%#= e(sJް K֑,ON.즼į-j$ڝ~XȹJUڰd vZHq&f$ljM3U | z^ο)9&T3iZTRoU2="\2Ȍ)RS4-9[ ]*teu"#+hsAӚtawqwʻK@ڽzD[ |1:,Qwo:@gf1 eCVV;?I|#A끙Q[}@JP~1kd+{x^8/ {gr/}E{lϋ+Vz 8.9紝U4MVw|ĭ\Ƣ[ng@(mW9}~gNԈa}. 9w~A4&'?=+zҩt=(eHPHXHk1e})Ƿ)qQ1%idwE1nmE" *&S"mqSvܶz7&oW=Lަ8OnS'߹u5S䙕?>C~+&VH+Wa~)'][%d[M`D3lN pC>ȯd&͊ [48iDzA*Zk~KY5ҳL2M4=qn+fY1w Qt(8{U=pObXf!b @Dzyv7@:,FՌ*r;Rtto6i X4 3cWv " OZ95>V\RqNU";86gQ^UT'kG`[JQ wԨ-2x=NirfE iiGy+lmb{[f+|ָx2z'$LxK;k&N+ٕL֒v)pcL% m^T[88 VѦ$lW`V1s1=I6`\:oqw]hWl1WTD+4ѕ /}uVә`i#OU1/HX!seLzΰ)sUӺF\SmȮBG"O3S$㧏U7g/N7MTqڽ;%N6>W&ް6lЖB̗(G5_*E~D5P9j)WycV%Q ?Yƞ>a̖R!ph5}Э_]x{ߴ .ph(kE?Hxe$~>B܋Byc 5?aD!g*PKZB?҅ ;fiRG;čDi&)pFK?#oW, I[yjpѲ8b6*.'$7%Y_o=:hid  Z!8xSj}XpT쎭u]2ah:=%XznOu ;1E@R&{6`ez }@ 8xѨ)Zݤtob/ wZzzYU cKB?̘ZTVh u=^K8:k*Ш'Jݧi:Ki4+}+ r&!. "u5 ГoV!ͭf!f@x6dF=+Qru0e"v`ֱ~9Gj|,5 ӄm4i#*ЋJ|4c|]!'M)ڍ5бhESښ*D\tX!Ͳ@H;RSH~_[maXd5Z&hvfL T{0Ks7fF*lg5.gdkz5^ |WMS,V8Z[=#ƆW/0\~%r,0r{xD+Dܡ&=|MӼS}u[ڣƍfcVŅAz8Q2CQ+`E&,Senh$CВ\la)*\.KeAeCg'S&E'$! "xw@4l7 [nlf}dTIs黮7ܓ":Cuu7J؛h'K1jU3U`̣E&hmp%[S; `t3uli­>eu|}}٣~Cm,zN۟8T~;# \w:U'K$jS;ezԅn|ۋ9 a^Kkjª- o'A h8l?yԐ 5Ah0JÉ`G $PgJehSrnj]Wv(0=j nY%4' U+m*(<pfX$ Y1fݕ}|F'ׁ0 *gN"L 1/iDd&61~_UA#vA))ló(|xi'5h mDGn>K<ۮ.4]zgZʓϫXid6 Z6< W=|=Wt .EڙSj6j9֯% bXah|شE?Ril2/ b>rݻoz:KBhoz%4d|u -}lC啌KʒRmǭl}n=6,k0du:h)U4݃wp|9. 0"ҨmnDA}ۼ,HՔVwb76CDžȟUE :Kl 6$iE=vtj,C/ Q(&sfU{?wU}!lC_&U `]_$?~ >y 9_`9FvۨIUaU)#;nl|B̟_>cUo5=\DDjz2[=*Vlis_={\<*7 )}\G{3Hy`9JPex ǒkAK_рvcrav¯ 2ЃD0(v>GRCQLF|BjyܓuqywpR3UϐJ~wy'=x8ž$J̸HPxZ %sI*_ǎ1`ŗ_<SKێ/] [nqP NL?"`ѩP_R@o4iUߧЩjf@+YVLKI &sSs{_v0wjPs ^5\ nU2f]*;NٶHF3Zti-]Xb{{yv?yҩ?ay;{b3N$[1 }*hHCUM3?a1]EW&3Vcbu'/9zL˸vlO?K?yʧ/]ͧz=sO?~GGJ?q}j@z2.qqucJ첀E9C[t.eM6' CVʈu T:kE*aAOm*oߚ 9AK#낖A{` ^Ae MK~F4z>qnCUHbT`N/:o\O._Dk qGr{cR~\+.~`$Ր1C_qv7cp(Vuй!Bwo?\Z !` Pm4*s;"[0?}Ǐŕ:ū?zW?t/_/|I|Ipa[^H*a3"peaʊhy\@x'7˽0T>N?)muZ;^ލx;):p~~y.lccmmi?+r/d76FrH!=Ho][ԱoP{𹚇hN=- чf]{;>tPqw xS[ ޹JѧO3Zc#o@d|a#G3]:_yn7P"SzCmws4 M6Wjxf0'VҾ??z`d-Rx'O{ 匈4̘bPىS^4*h% Jo%4J{0ƝSisگݚWtE|-m*ty\SY6Sz{ ;hg5jIq>6 f:h,2A#M_ub/NGM6~v!mh: VΘqp@T4;`Qn\GGǏf+>pGt )W9VCpa_"9kO=E+gva|w.@ldixDwF>)b7cuJ!K:~r炿4ޠ!'m@=wHp﯐M_hQhl)2<7cE %]xJrVkcmzJI_.3f6RT?ߖ+$@m^O,'79Q|ΚZM|Ӑ͕oY.)s"A cCD__kmOB >!$u: ߕ?|숸7~Wƒk_t#rjyl秇ׇriD?AowwgoCXwV~4,t6"|]G6;Z9|hrZz$ EodHk|!k-zVߖS"hc9!6Z"*8l=*-!'7JI=l]rP=|x2CrJ>vؘ!\beM?xK\EbHrwkYܼ&2Li2򎏟8kzjtWIPo勢f tdq#oj6"dB+Y'tbC̉g@Q@oNL$Ǹ /ό5hgopbtS=tDa .خ2Ӭc)ķ4B|D}䏾MgK)|wܘIs2AYO[T6C*,1/l #|Mo=Je 3ǼiԠFyOYR=dZ6ҙ;*bCk:"'7g]C5)wb{j!b]suuI0gP8Qvf=xbUgo)Otք@C#". ܀c-D)ޭJ;.5PЮo%EF-80sm}߰T9pjم\j>N¸/~4r ̖ O g*qr1IFv3v ۍҾp%fٛܠSޜi%ѡ`:QI1l />ifs Sr)N?NX_sikSЯn)[X6 R${o\wKmP*E^y+@(䠜Ӓ(UNQuR2S]*7m_):Ԟ@h$PJ\,`2lꆼ_;F *ҳӓwGh=UC"@hթl%.[w nFuOe16j31Ҕ 5aDeҾ^=(G3զO>iE 3oX}UpCa03K"oe"w ҜI.Mv*{r EB5 ^!LYa-w6mz=&qOJnY&+ïg15Wv%_%,EZS~ 2+]9%B`]h. } 9_I{2.0%Oz SJf<aN}5\Ǜ9t3Sֽ+Q-g \b́_\ޥ=qK9T ) En$fZәpHIG{nmFk!q#c Np4tҤT}}/cˈae{{qHJ%* ޥm0j kzgRXdn#\q ֆ}w; f:Ro.8i]q t_ؒg7(S(/ a}MvEMō<=z@}]ݦ"40߄|XO(w1l+뫀 rN Yc]p0#+sL'}] 4rSO5ضoR4 2~c[׊JsdϜnG#.]MF|Qn 0Gv#=(I~zݖxta\L 8AμxH@y&B#QW/}uHJɭaӡBM xɑoظ:Iʒl+`.Ugouo!9ڵ=d+  t`745hu aV'@$Cdy\RMTfG;7m\*ecªN*ʮeP**1%j{e Yl&}/n#. jAOc2 v'/xO'GS8+Z*-tUx/qc˜tAx8k':y:%X @ @ @ @ @ @ @  @ @5 @K   @a   @w   @   @   @ @ @ @ @ @' @= @S @i @;(+@XX,, @X--"@,XX.."@',XX// @E00 @[11 @q22 @33 @44 @55 @66 @IIL@KMDipъFAan D&nG F  \sG nLFtGco ivG HyGlFVwGwG inP@cGG !ap"#45$ht%4[G?tG@返GAΔGB\pGC%aGDLoE(FLGG)HzGI*JܒGKlGXXXX&X.X6X>XFXNXVX^XfXnXvX~XXXXXXXXXXXXXXXXXXXXX&X.X6X>XFXNXVX^XfXnXvX~XXXXXXXXXXXXXXXXXXXXX&X.X6X>XFXNXVX^JJB@_ R h%) 3"$, 3 4 B7 3 5g4 6`<44W;X:993 5XXXX&X.X6X>XFXNXVX^XfXnXvX~XXXXXXXXXXXKK@gXX(L @MM@#BXNN@EBXOO@gBXPP@BXQQ@"'XXRR @SS@CXTT @UU@%BXXVV(@U'XXXWW @wXX @YY @ZZ @[[ @\\ @]] @__ @`` @'aa @=bb @Scc @idd @ee @@M''''''++'+' +' '  ' ''XXX,X2X8XPXVX\XhXtXXXX@ a''''''','''+''+'' +'' ''  ''XXX&X>XJXVXhXtXXXXX**F@6-,,XXXX X&X,77f@96,+,,+,,XXXX X&X,X8XDHHv@+'4+'<(@' <(@'+<(@'  <(@'"+<(@' g* <(@'"  g*  <(@'  <(@'"' +'''XXX&X>XVX\XbXzXXXXXXXX(ffpz@pJJKKQQVVIIQQVVIIJJKKIIJJKK,QQVVJJKKJJKK JJKKMMNNOOPPQQSSUUVV JJKKMMNNOOPPQQSSUUVV IIJJKK JJKKMMNNOOPPQQSSUUVV  JJ KKMMNNOOPPQQSSUUVV IIJJKK  IIJJ KKMMNNOOPPQQSSUUVVIIJJKK IIJJKKMMNNOOPPQQSSUUVV IIJJ KKMMNNOOPPQQSSUUVVIIJJKK IIJJKKMMNNOOPPQQSSUUVV IIJJ KKMMNNOOPPQQSSUUVVII JJKK II JJKKMMNNOOPPQQSSUUVV II JJ KKMMNNOOPPQQSSUUVVII JJKK II JJ KKMMNNOOPPQQSSUUVV IIJJKKMMNNOOPPQQSSUUVV IIJJ KKMMNNOOPPQQSSUUVVII JJKK II JJKKMMNNOOPPQQSSUUVV II JJ KKMMNNOOPPQQSSUUVV IIJJKKMMNNOOPPQQSSUUVVIIJJKK  IIJJ KKMMNNOOPPQQSSUUVV!IIJJKK" IIJJKKMMNNOOPPQQSSUUVV# IIJJ KKMMNNOOPPQQSSUUVV$IIJJKK% IIJJKKMMNNOOPPQQSSUUVV&IIJJKK'IIJJKK( IIJJKKMMNNOOPPQQSSUUVV) IIJJ KKMMNNOOPPQQSSUUVV*IIJJKK+IIJJKK, IIJJKKMMNNOOPPQQSSUUVV- IIJJ KKMMNNOOPPQQSSUUVV.IIJJKK/ IIJJKKMMNNOOPPQQSSUUVV0 IIJJ KKMMNNOOPPQQSSUUVV1IIJJKK2 IIJJKKMMNNOOPPQQSSUUVV3 IIJJKKMMNNOOPPQQSSUUVV4 IIJJKKMMNNOOPPQQSSUUVV5II JJKK6 II!JJKKMMNNOOPPQQSSUUVV7 II!JJ KKMMNNOOPPQQSSUUVV8II"JJKK9 II#JJKKMMNNOOPPQQSSUUVV: II$JJ KKMMNNOOPPQQSSUUVV;II%JJKK< II&JJKKMMNNOOPPQQSSUUVV= IIJJ KKMMNNOOPPQQSSUUVV>II'JJKK? II$JJKKMMNNOOPPQQSSUUVV@II(JJKKA II)JJKKMMNNOOPPQQSSUUVVB II)JJ KKMMNNOOPPQQSSUUVVCII*JJKKD II!JJKKMMNNOOPPQQSSUUVVEII+JJKKF II,JJKKMMNNOOPPQQSSUUVVG II,JJKKMMNNOOPPQQSSUUVVH II-JJKKMMNNOOPPQQSSUUVVI II-JJ KKMMNNOOPPQQSSUUVVJII.JJKKK II/JJKKMMNNOOPPQQSSUUVVL II0JJ KKMMNNOOPPQQSSUUVVM IIJJKKMMNNOOPPQQSSUUVVNII1JJKKO II2JJKKMMNNOOPPQQSSUUVVP II2JJ KKMMNNOOPPQQSSUUVVQII3JJKKR II4JJKKMMNNOOPPQQSSUUVVSII5JJKKT II6JJKKMMNNOOPPQQSSUUVVU II7JJ KKMMNNOOPPQQSSUUVVVII8JJKKWII9JJKKX II:JJKKMMNNOOPPQQSSUUVVY II:JJ KKMMNNOOPPQQSSUUVVZII;JJKK[ II<JJKKMMNNOOPPQQSSUUVV\ II=JJKKMMNNOOPPQQSSUUVV]II>JJKK^ II?JJKKMMNNOOPPQQSSUUVV_ II@JJKKMMNNOOPPQQSSUUVV` IIAJJ KKMMNNOOPPQQSSUUVVaIIBJJKKb IICJJKKMMNNOOPPQQSSUUVVc IIDJJ KKMMNNOOPPQQSSUUVVdIIEJJKKe IIFJJKKMMNNOOPPQQSSUUVVf IIFJJ KKMMNNOOPPQQSSUUVVgIIGJJKKh IIHJJKKMMNNOOPPQQSSUUVVi IIHJJ KKMMNNOOPPQQSSUUVVjIIIJJKKk IIJJJ KKMMNNOOPPQQSSUUVVlIIKJJKKmnQQVVoJJKKSSUUVVXX,XDX\XtXXXXX.XFXXXX*XBXXXX2XzXXX"X:XXXX*XrXXXXbXzXX X"XjXXXX*XBXZXXX XJ X X X X: X X X X* XB X X X X2 Xz X X X X: X X X X XBXXXX2XzXX X"XjXXXX*XrXXXX2XzXXX"X:XXXX*XrXXXXbXzXX X"XjXXX8Nz )?Uk{.DZp 6Lbx(>f0F\r8*Lv 6Lbx(>TDT PUqEditEngineItemPool  6fVk0tg*/Q@Z "X,StarBats-",StarBats-",StarBats-"` ` ,StarBats-" ,StarBats-",StarBats-"hh,StarBats-",StarBats-",StarBats-"pp,StarBats- ",StarBats-",StarBats-",StarBats-"` ` ,StarBats-" ,StarBats-",StarBats-"hh,StarBats-",StarBats-",StarBats-"pp,StarBats- "3Times New Romand"3Times New Romand"3Times New Romand"` 3Times New Romand" 3Times New Romand"3Times New Romand"h3Times New Romand"3Times New Romand"3Times New Romand"p3Times New Romand rWW,StarBats -",StarBats-",StarBats-"` ` ,StarBats-" ,StarBats-",StarBats-"hh,StarBats-",StarBats-",StarBats-"pp,StarBats- r,StarBats -",StarBats-",StarBats-"` ` ,StarBats-" ,StarBats-",StarBats-"hh,StarBats-",StarBats-",StarBats-"pp,StarBats- "H3Times New Romand3Times New Romand"g 3Times New Romand]` 3Times New RomandS 3Times New RomandS3Times New RomandSh3Times New RomandS3Times New RomandS3Times New Romand "3Times New Romand3Times New Romand"g 3Times New Romand]` 3Times New RomandS 3Times New RomandS3Times New RomandSh3Times New RomandS3Times New RomandS3Times New RomandSp3Times New Romand  d'Qu,StarBats ((LLK'P,StarBats ((LLK'Q ,StarBats ((LLK'Q` ,StarBats ((LLK'P ,StarBats ((LLK'P,StarBats ((LLK'Ph,StarBats ((LLK'P,StarBats ((LLK",StarBats-+  d=Qu,StarBats ((LL-=P,StarBats ((LL-=Q ,StarBats ((LL-=Q` ,StarBats ((LL-=P ,StarBats ((LL-=P,StarBats ((LL-=Ph,StarBats ((LL-=P,StarBats ((LL-=P,StarBats ((LL-   dQu,StarBats ((LLK'P,StarBats ((LLK'Q ,StarBats ((LLK'Q` ,StarBats ((LLK'P ,StarBats ((LLK'P,StarBats ((LLK'Ph,StarBats ((LLK'P,StarBats ((LLK",StarBats-   d'Qu,StarBats ((LLK'P,StarBats ((LL]'Q ,StarBats ((LLK'Q` ,StarBats ((LLK'P ,StarBats ((LLK'P,StarBats ((LLK'Ph,StarBats ((LLK'P,StarBats ((LLK",StarBats- (  d=,StarBats -=,StarBats -=` ,StarBats -= ` ,StarBats -= ,StarBats -=h,StarBats -=h,StarBats -=,StarBats -=p,StarBats -  "WW3Times New Romand3Times New Romand"g 3Times New Romand]` 3Times New RomandS 3Times New RomandS3Times New RomandSh3Times New RomandS3Times New RomandS3Times New RomandSp3Times New Romand  d'Qu,StarBats ((LLK"P.,StarBatsN((LLK'Q ,StarBats ((LLK'Q` ,StarBats ((LLK'P ,StarBats ((LLK'P,StarBats ((LLK'Ph,StarBats ((LLK'P,StarBats ((LLK",StarBats-  drW,StarBats -",StarBats-",StarBats-"` ` ,StarBats-" ,StarBats-",StarBats-"hh,StarBats-",StarBats-",StarBats-  d"Qu.,StarBatsN((LLK'P,StarBats ((LLK'Q ,StarBats ((LLK'Q` ,StarBats ((LLK'P ,StarBats ((LLK'P,StarBats ((LLK'Ph,StarBats ((LLK'P,StarBats ((LLK",StarBats-*  d'Qu,StarBats ((LL]'P,StarBats ((LLK'Q ,StarBats ((LLK'Q` ,StarBats ((LLK'P ,StarBats ((LLK'P,StarBats ((LLK'Ph,StarBats ((LLK'P,StarBats ((LLK",StarBats-  d'Qu,StarBats ((LLA'P,StarBats ((LLK'Q ,StarBats ((LLK'Q` ,StarBats ((LLK'P ,StarBats ((LLK'P,StarBats ((LLK'Ph,StarBats ((LLK'P,StarBats ((LLK",StarBats-   d=Qu,starbats ((LL2=P,starbats ((LL2=Q ,starbats ((LL2=Q` ,starbats ((LL2=P ,starbats ((LL2=P,starbats ((LL2=Ph,starbats ((LL2=P,starbats ((LL2=,starbats 2  d=Qu,starbats ((LL2=P,starbats ((LL2=Q ,starbats ((LL2=Q` ,starbats ((LL2=P ,starbats ((LL2=P,starbats ((LL2=Ph,starbats ((LL2=P,starbats ((LL2=,starbats 2XX.XNX XXXXSXA!X/%X)X -X0X_5XN9X<=X+AXEXIXL @H[@j[XX*@X] ddd,dddY2dddxddsdHdddxdddxYdddYddsdj ddd YD dddYD dddYD Fddd dddYs gdddYjdddjYsdddYD8ddd8YDXdddXYDxdddxYD!ddd!YDXX!X:XMX`XsXXXXXXXX/XHXaXzXXX<( n@ ]l  XXXX X&X,X2X8X>XD (#@Re StarSymbol!?-((LL StarBats!'] StarBatsX!=-Times New Roman!d((LL  StarSymbol!?K  StarSymbolW!?-((LL StarSymbol!?- StarSymbolX!?-((LL  StarSymbol!?] ((LL StarBats!'A ((LL  StarSymbol!K  StarBatsX!"- Times New RomanW!d((LL StarSymbol!?K. ((LL  StarSymbol!?]((LL  StarSymbol!?A,Times New Roman!"d StarBats!r- StarBatsW!r-((LL StarBats!'K((LL StarBats!'KStarBatsX!"-((LL StarBats!=-Times New RomanW!"d((LL StarBats!=- ((LL starbats!=2((LLStarBats!"K.((LL starbats!=2((LLStarBats!"K.((LL StarBats!K((LL StarBats!']XXIXXXX6XqXXX"X[XXXXKXXXX:XsXXXXWXXX XCX|XX@'2,@ h;ddddddYWdddWY Xdddddd,dd|d_uddduYQdddYP ddd YQdddYQdddYPdddYdddddduddduddd ddd dddddd ddd! Xddd"ddQdu#=ddQdu$dddY%dddW&dddX'dddY( ` ddd` Y*ddPd+ddd-dddW1ddd` XX!X:XSXfXyXXXXXX X"X5XHX[XnXXXXXXXX XX2XKXdXwXXA'@ i dddddddd dd dd dd ddd+ddddadXXX&X2X>XJXVXbXnXz1'd@j=lkMjag`XXX$X/X:XE+'(@Tj, XXX' @ o, , , h, 6, ', ., 6, l>, :F, N, U, ], pe, >m, u, , , , , Q, #, *, 2, :, UB, #J, Q, Y, a, Yi, 'q, , , , }, K#, +, 2, :, B, OJ, R, Y, a, i, Sq,  , , , , ', 1, ;, tE, `O, LY, 8c, $m, W, % , , , !, [), )1, 8, @, H, _P, -X, _, g, o, , , , o, =&, ., 5, =, tE, AM, U, \, d, xl, , , , M, #, *, 2, :, QB, J, Q, Y, a, Ui, , , a, /, , ', /, e7, 3?, G, N, V, i^, 7f,  q, ? , , , $, u,, C4, <, C, K, yS, G[, c, , !, , , , &, g., B6, >, E, M, U, \, d, xl, /, d, ? , , , !, ), 1, `9, ;A, I, P, -X, _, g, o, XXXXfXX-XXXbXX0!'J@o ((LL^HffXXX&X2' @CpHTimes New RomanArial;Helvetica^Times New Roman;Times]Courier Courier New'ArialCourierXX(XBXbXtXX'@ p'd 04d d {d  d d d 6id $Od d d XXX"X,X6X@XJXTX^XhXr?( @%q'@Eq'XX'@hq0X'@q0X'@q0XX'@qX'@q0X%' @r0d:!XXS' @3r"' @Ir' @_r@yrX@rX*@r0X{(@tpZ$http://mini.net/cetus/oo_prolog.html$http://mini.net/cetus/oo_prolog.htmlW!X!p{(http://www.yrl.co.uk/~phil/stl/stl.htmlxAhttp://www.yrl.co.uk/~phil/stl/stl.htmlx#Algorithms_and_FunctionsW!X!ph+http://www.byte.com/art/9510/sec12/art3.htm+http://www.byte.com/art/9510/sec12/art3.htmW!X!p~6http://www.objectmentor.com/resources/articles/acv.pdf6http://www.objectmentor.com/resources/articles/acv.pdfW!X!XXsXXlIQ_QQS9T[__C`w`Peevf&gc ? ` x*fDwC2c%bqqOh+'0H h t 10@= @$O@D9D@ David Hall David Hall"Copyright (c) 2002, David A. Hall"Writing and Using Java PredicatesDrMd2#JoeM0j|18Sk|135k|1`.* standard.soc standard.sod standard.soe standard.soh standard.sog standard.sobODrLy LAYER_LAYOUTDrLy LAYER_BCKGRNDDrLy LAYER_BACKGRNDOBJDrLyLAYER_CONTROLSDrLy!LAYER_MEASURELINESDrMP'JoeM$mVTDrML DrOb<SVDr&o%)DrOb<SVDr&b.K)DrOb<SVDr&oD%0ZDrOb<SVDr&b.DK0ZDrXXDefaultgg iDefault~LT~GliederungDrMPJoeM`mRDrML DrObSVDr&`mR*Default~LT~Hintergrund`mRDrObSVDr5Rc]SDUDQ StandardBRDrObSVDrRc]SDUDQ StandardRDrObdSVDr*UGK\Rc]SDUDQ DrObSVDrVGK\Rc]SDUDQ StandardVTK[RDrObSVDr*UGKZRc]SDUDQ Standard7UTK|ZRDrXXDrObdSVDr]GKdRc]SDUDQ DrObSVDr4_GKdRc]SDUDQ StandardA_TKdRDrObSVDr]GKcRc]SDUDQ Standard]TKcRDrXXDrObdSVDrfGKfmRc]SDUDQ DrObSVDr hGKfmRc]SDUDQ StandardhTKYmRDrObSVDrfGKkRc]SDUDQ StandardfTKkRDrXXDrObSVDr&~ le{$Default~LT~Titel~ le{sxV4B1^#Click to edit the title text formatDefault~LT~Titel<( (@'DrObuSVDr& UiN+Default~LT~Gliederung 1 UiN xV4B1 %Click to edit the outline text formatDefault~LT~Gliederung 1<( (@'Second Outline LevelDefault~LT~Gliederung 2<( (@'Third Outline LevelDefault~LT~Gliederung 3 <( (@'Fourth Outline LevelDefault~LT~Gliederung 4 <( (@'Fifth Outline LevelDefault~LT~Gliederung 5<( (@'Sixth Outline LevelDefault~LT~Gliederung 6<( (@'Seventh Outline LevelDefault~LT~Gliederung 7<( (@'Eighth Outline LevelDefault~LT~Gliederung 8<( (@'Ninth Outline LevelDefault~LT~Gliederung 9<(  (@' DrObSVDr&PR oStandardPRxV4B1wCopyright 2002, David A. HallDefault~LT~Hintergrundobjekte<( ( @'&DrXXDefaultgg aDefault~LT~GliederungDrMPvJoeMVT$mDrML DrObSVDrVT$mc]SDUDQ StandardVT$mDrObSVDr&?% CH3$Default~LT~Titel?% CH3gxV4B1RClick to move the slideDefault~LT~Titel<( (@'DrObSVDr& 17bEc&Default~LT~Notizen 17bEcpxV4B1[Click to edit the notes formatDefault~LT~Notizen<( (@'DrXXDefaultgg YDefault~LT~GliederungDrPgcJoeM$mVTDrML8DrMD,DrXX Handoutsgg IDefault~LT~GliederungDrPg JoeM`mRDrML8DrMD,DrObSVDr e,c]SDUDQ $Default~LT~Titel e,xV4B1SWriting and Using JavaTM Programming Language-Based Predicates ('Java Predicates')Default~LT~Titel<( (@'S?@DrObSVDr /UiNc]SDUDQ +Default~LT~Gliederung 1 /UiNxV4B1 David HallDefault~LT~Gliederung 1<( (@'#A' +'Default~LT~Gliederung 1<( (@'#A' +'DrXXDrObuSVDr&`mRStandard`mRkSWriting and Using JavaTM Programming Language-Based Predicates ('Java Predicates')gg QDefault~LT~GliederungDrPgJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3DrObFSVDr 17bEcc]SDUDQ &  Default~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXXkSWriting and Using JavaTM Programming Language-Based Predicates ('Java Predicates')gg QDefault~LT~GliederungDrPglJoeM`mRDrML8DrMD,DrObKSVDr~ lec]SDUDQ $ Default~LT~Titel~ lekxV4B1VFunctorDefault~LT~Titelg*<( (@'DrObISVDr UiNc]SDUDQ + Default~LT~Gliederung 1 UiNbxV4B1E.Functor: an Object that represents a function Default~LT~Gliederung 1g*<( (@'#A' /Evaluated as function: passed runtime argumentsDefault~LT~Gliederung 1g*<( (@'#A' #Functors can be passed as argumentsDefault~LT~Gliederung 1g*<( (@'#A' .Instantiated at runtime based on configurationDefault~LT~Gliederung 1g*<( (@'#A' Serialized or PersistedDefault~LT~Gliederung 1g*<( (@'#A' DrXXDrObuSVDr&`mRStandard`mRFunctorgg QDefault~LT~GliederungDrPgqJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3DrObFSVDr 17bEcc]SDUDQ &  Default~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXXFunctorgg QDefault~LT~GliederungDrPg JoeM`mRDrML8DrMD,DrOb_SVDr~ lec]SDUDQ $ Default~LT~Titel~ lexV4B1jFunctors vs. Method ObjectsDefault~LT~Titelg*<( (@'DrObSVDr UivOc]SDUDQ + Default~LT~Gliederung 1  UivOxV4B1 public void evaluate(Method m) { Object[] args = { arg1, arg2, etc }; try { Object val = m.invoke(args); } catch(IllegalAccessException x) { ... } catch(IllegalArgumentException x) { ... } catch(InvocationTargetException x) { ... }}Default~LT~Gliederung 2 g*  <( (@'A' 1''   !"JKTUyz +Number, types of arguments known in advanceDefault~LT~Gliederung 2g*  <( (@'$A'  +)Compiler cannot check method's signatureDefault~LT~Gliederung 2g*  <( (@'$A' 1') )()DrXXDrObuSVDr&`mRStandard`mR,Using Method Objectsgg QDefault~LT~GliederungDrPg~JoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3DrObFSVDr 17bEcc]SDUDQ & Default~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX,Using Method Objectsgg QDefault~LT~GliederungDrPg JoeM`mRDrML8DrMD,DrObYSVDr~ lec]SDUDQ $Default~LT~Titel~ leyxV4B1dFunctors vs. Method ObjectsDefault~LT~Titel<( (@'DrObSVDr UiNc]SDUDQ + Default~LT~Gliederung 1 UiNxV4B1>Functors can be nestedMethods are not dependent on each otherDefault~LT~Gliederung 1g*<( (@'#A' MFunctors are open for examinationMethods are opaque (no way to examine code)Default~LT~Gliederung 1g*<( (@'#A' !"NFunctors can be assembled at runtimeMethods must written prior to compilationDefault~LT~Gliederung 1g*<( (@'#A' $%DrXXDrObuSVDr&`mRStandard`mR3Functors vs. Method Objectsgg QDefault~LT~GliederungDrPgJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3DrObFSVDr 17bEcc]SDUDQ & Default~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX3Functors vs. Method Objectsgg QDefault~LT~GliederungDrPgQJoeM`mRDrML8DrMD,DrOb\SVDr~ lec]SDUDQ $Default~LT~Titel~ le|xV4B1gUnary and Binary FunctorDefault~LT~Titelg*<( (@'DrObSVDr UiNc]SDUDQ + Default~LT~Gliederung 1U UiN6xV4B1QUnary Functorpublic interface UnaryFunctor { public Object fn(Object arg);}Default~LT~Gliederung 1g* <( (@'A'   QQ-.OP`BinaryFunctorpublic interface BinaryFunctor { public Object fn(Object arg1, Object arg2);}Default~LT~Gliederung 1g* <( (@'A'   ``./^_Trinary, etc. are possibleDefault~LT~Gliederung 1g* <( (@'A'  DrXXDrObuSVDr&`mRStandard`mR0Unary and Binary Functorgg QDefault~LT~GliederungDrPgJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3 DrObFSVDr 17bEcc]SDUDQ & Default~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX0Unary and Binary Functorgg QDefault~LT~GliederungDrPgCJoeM`mRDrML8DrMD,DrObMSVDr~ lec]SDUDQ $Default~LT~Titel~ lemxV4B1X PredicateDefault~LT~Titelg*<( (@' DrObSVDr Ui3Rc]SDUDQ +Default~LT~Gliederung 1V Ui3R7xV4B1+Predicate: a Functor that returns a BooleanDefault~LT~Gliederung 1g* <( (@'A' TUnaryPredicatepublic interface UnaryPredicate { public Boolean p(Object arg);}Default~LT~Gliederung 2g* <( (@'A' TT01RSeBinaryPredicatepublic interface BinaryPredicate { public Boolean p(Object arg1, Object arg2) ;}Default~LT~Gliederung 2g* <( (@'A' ee23cdDrXXDrObuSVDr&`mRStandard`mR! Predicategg QDefault~LT~GliederungDrPg<JoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3 DrObSVDr 17bEcc]SDUDQ & Default~LT~Notizen 17bEcxV4B1.There are two design decisions reflected here:Default~LT~Notizen<( (@'21) do your Predicates extend your Functors, or notDefault~LT~Notizen<( (@'#2) do you return Boolean or booleanDefault~LT~Notizen<( (@'In C++, the distinctions can be a little more blurred, as it is possible to parameterize the return type of the functional method. In current Java, you need to make these decisions carefully. Default~LT~Notizen<( (@'DJGL did not extend the predicates from the functors, and they chose to return boolean rather than Boolean in order to use predicates in place of functors, they introduced a pair bridging function that each took a corresponding predicate at construction, and converted the primitive to the reference type at execution time.Default~LT~Notizen<( (@'jkDrXX! Predicategg QDefault~LT~GliederungDrPgHJoeM`mRDrML8DrMD,DrObJSVDr~ lec]SDUDQ $Default~LT~Titel~ lejxV4B1UPrologDefault~LT~Titelg*<( (@'DrObSVDr qewJc]SDUDQ + Default~LT~Gliederung 1 qewJxV4B1Ygrandmother(G,S) :- parent(P,S), mother(G,P).mother(sarah,issac).parent(issac, jacob).Default~LT~Gliederung 2g* <( (@'A' 1'YY-.BCXYA?- grandmother(sarah, jacob)yes?- grandmother(sarah, issac)noDefault~LT~Gliederung 2g* <( (@'A' ' AA!">?DrXXDrObuSVDr&`mRStandard`mRProloggg QDefault~LT~GliederungDrPgpJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3 DrObFSVDr 17bEcc]SDUDQ & Default~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXXProloggg QDefault~LT~GliederungDrPg(JoeM`mRDrML8DrMD,DrObGSVDr~ lec]SDUDQ $Default~LT~Titel~ legxV4B1RSTLDefault~LT~Titelg*<( (@'DrOb SVDr UiNc]SDUDQ +Default~LT~Gliederung 1A UiN"xV4B1 Part of C++ Standard LibraryDefault~LT~Gliederung 1g* <( (@'A' NContains a number of template based collections classes and common algorithms Default~LT~Gliederung 1g* <( (@'A' Functors/Predicates used as arguments for many of the algorithmscount_if(InputIterator first, InputIterator last, Predicate pred);Default~LT~Gliederung 1g* <( (@'A' @AAAst}DrXXDrObuSVDr&`mRStandard`mRSTLgg QDefault~LT~GliederungDrPgmJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3DrObFSVDr 17bEcc]SDUDQ & Default~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXXSTLgg QDefault~LT~GliederungDrPg5JoeM`mRDrML8DrMD,DrObGSVDr~ lec]SDUDQ $Default~LT~Titel~ legxV4B1RSTLDefault~LT~Titelg*<( (@'DrObSVDr 8Hc]SDUDQ +Default~LT~Gliederung 1R 8H3xV4B1XArithmeticPlus(x, y)Minus(x, y)Multiplies(x, y)Divides(x, y)Modulus(x, y)Negate(x)Default~LT~Gliederung 1g* <( (@'A' 1'    X X!"23@ANOyComparisonmin(x, y)max(x, y)EqualTo(x, y)NotEqualTo(x, y)Less(x, y)LessEqual(x, y)Greater(x, y)GreaterEqual(x, y)Default~LT~Gliederung 1g* <( (@'A' 1'    y y,-=>HIXYfgDrObSVDr:ahGc]SDUDQ   StandardC:ah      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~G$xV4B1 9LogicalLogicalAnd(x, y)LogicalOr(x, y)LogicalNot(x, y)Standardg* <( (@'%A' 1'9 99()ConstructionIdentity(x)ConstantUnary(x) ConstantBinary(x,y)Bind1st(x)Bind2nd(x)UnaryCompose(x)BinaryCompose(x)Project1st(x, y)Project2nd(x, y)Standardg* <( (@'%A' 1'     *+>?IJTUdeuvDrXXDrObuSVDr&`mRStandard`mR1STL Predicates & Functorsgg QDefault~LT~GliederungDrPgJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3DrObFSVDr 17bEcc]SDUDQ & Default~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX1STL Predicates & Functorsgg QDefault~LT~GliederungDrPgJoeM`mRDrML8DrMD,DrObGSVDr~ lec]SDUDQ $ Default~LT~Titel~ legxV4B1RjglDefault~LT~Titelg*<( (@'DrObqSVDr UiNc]SDUDQ + Default~LT~Gliederung 1 UiNxV4B1qAdaptation of STL in JavaDefault~LT~Gliederung 1g*<( (@'#A' &Originally created by ObjectSpace, incDefault~LT~Gliederung 1g*<( (@'#A' @Now owned by Recursion Software, Inchttp://www.recursionsw.com/Default~LT~Gliederung 1g*<( (@'#A' $%DrXXDrObuSVDr&`mRStandard`mRjglgg QDefault~LT~GliederungDrPgmJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3DrObFSVDr 17bEcc]SDUDQ & !Default~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXXjglgg QDefault~LT~GliederungDrPgQJoeM`mRDrML8DrMD,DrObWSVDr~ lec]SDUDQ $"Default~LT~Titel~ lewxV4B1bBuilding PredicatesDefault~LT~Titelg*<( (@'DrObSVDr qewJc]SDUDQ + #Default~LT~Gliederung 1 qewJxV4B1Primitives are easy to use, but of limited utilityPredicate andP = new LogicalAnd();Boolean flag = andP.p(Boolean.TRUE, Boolean.FALSE)Default~LT~Gliederung 1g* <( (@'A' 2333UV4STL/JGL provide for assembly of compound expressionsDefault~LT~Gliederung 1g* <( (@'A' DrXXDrObuSVDr&`mRStandard`mR+Building Predicatesgg QDefault~LT~GliederungDrPg}JoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3DrObFSVDr 17bEcc]SDUDQ & $Default~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX+Building Predicatesgg QDefault~LT~GliederungDrPgqJoeM`mRDrML8DrMD,DrObOSVDr~ lec]SDUDQ $ Default~LT~Titel~ leoxV4B1ZBind1st & Bind2ndDefault~LT~Titel<( (@'DrObJSVDr UiLc]SDUDQ +%Default~LT~Gliederung 1 UiLcxV4B1L9Binders allow use of constant values with binary functorsDefault~LT~Gliederung 1g* <( (@'A'  9Require BinaryFunctor, Constant at constructionUnaryFunctor discounter = new Bind1st(new Multiplies(), 1 - discountPct);UnaryFunctor taxer = new Bind1st(new Multiplies(), 1 + salesTaxRate);...salesPrice = discounter.fn(markedPrice);total = taxer.fn(salesPrice);Default~LT~Gliederung 1g* <( (@'A'  //0/0/0JK~DrXXDrObuSVDr&`mRStandard`mR)Bind1st & Bind2ndgg QDefault~LT~GliederungDrPg{JoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3DrObFSVDr 17bEcc]SDUDQ & &Default~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX)Bind1st & Bind2ndgg QDefault~LT~GliederungDrPgXJoeM`mRDrML8DrMD,DrObKSVDr~ lec]SDUDQ $ Default~LT~Titel~ lekxV4B1V Unary ComposeDefault~LT~Titel<( (@' DrObSVDr UiNc]SDUDQ + Default~LT~Gliederung 1 UiNxV4B1@UnaryCompose allows result of one functor to be input to anotherDefault~LT~Gliederung 1g* <( (@'A' Requires two UnaryFunctors at constructionUnaryCompose netPrice = new UnaryCompose(taxer, discounter);...total = netPrice.fn(markedPrice);Default~LT~Gliederung 1g* <( (@'A' *+++CDpqtuDrXXDrObuSVDr&`mRStandard`mR% Unary Composegg QDefault~LT~GliederungDrPgwJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3DrObFSVDr 17bEcc]SDUDQ & 'Default~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX% Unary Composegg QDefault~LT~GliederungDrPg[JoeM`mRDrML8DrMD,DrObKSVDr~ lec]SDUDQ $(Default~LT~Titel~ lekxV4B1V BinaryComposeDefault~LT~Titel<( (@' DrObSVDr FtiJc]SDUDQ +)Default~LT~Gliederung 1 FtiJxV4B1&BinaryCompose is itself a UnaryFunctorDefault~LT~Gliederung 1g* <( (@'A' UBinaryCompose passes the results of two UnaryFunctors as arguments to a BinaryFunctorDefault~LT~Gliederung 1g* <( (@'A' 9Requires BinaryFunctor, two UnaryFunctors at constructionDefault~LT~Gliederung 1g* <( (@'A'  BinaryCompose cappedDiscount = new BinaryCompose(new min(), discounter, new ConstantUnary(10.0));Default~LT~Gliederung 1 g* <( (@'A' 1'' "#OPDrXXDrObuSVDr&`mRStandard`mR% BinaryComposegg QDefault~LT~GliederungDrPgwJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3DrObFSVDr 17bEcc]SDUDQ & *Default~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX% BinaryComposegg QDefault~LT~GliederungDrPgJoeM`mRDrML8DrMD,DrObKSVDr~ lec]SDUDQ $ Default~LT~Titel~ lekxV4B1V MiscellaneousDefault~LT~Titel<( (@' DrObhSVDr UiNc]SDUDQ + Default~LT~Gliederung 1 UiNxV4B1h-Constant returns value passed at constructionDefault~LT~Gliederung 1g*<( (@'#A' %Identity returns the runtime argumentDefault~LT~Gliederung 1g*<( (@'#A' ,Project returns one of two runtime argumentsDefault~LT~Gliederung 1g*<( (@'#A' DrXXDrObuSVDr&`mRStandard`mR% Miscellaneousgg QDefault~LT~GliederungDrPgwJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3DrObFSVDr 17bEcc]SDUDQ & +Default~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX% Miscellaneousgg QDefault~LT~GliederungDrPgEJoeM`mRDrML8DrMD,DrOb`SVDr~ lec]SDUDQ $,Default~LT~Titel~ lexV4B1kApplication Level PredicatesDefault~LT~Titelg*<( (@'DrOblSVDr UiNc]SDUDQ + -Default~LT~Gliederung 1 UiNxV4B1hGPrimitives and assemblies provide support for built in reference types:Default~LT~Gliederung 1g* <( (@'!A' 'Arithmetic Functors require Number argsDefault~LT~Gliederung 3g* <( (@'1A'%Logical Functors require Boolean argsDefault~LT~Gliederung 3g* <( (@'1A'+Comparison Functors require Comparable argsDefault~LT~Gliederung 3g* <( (@'1A'*No support for user/business level objectsDefault~LT~Gliederung 1g* <( (@'!A' DrXXDrObuSVDr&`mRStandard`mR4Application Level Predicatesgg QDefault~LT~GliederungDrPgJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3DrObFSVDr 17bEcc]SDUDQ & .Default~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX4Application Level Predicatesgg QDefault~LT~GliederungDrPg JoeM`mRDrML8DrMD,DrObOSVDr~ lec]SDUDQ $/Default~LT~Titel~ leoxV4B1ZCustom PredicatesDefault~LT~Titel<( (@'DrObSVDr UiNc]SDUDQ +0Default~LT~Gliederung 1 UiNxV4B1<You can build customized functors for your business objectsDefault~LT~Gliederung 1g* <( (@'A' ;<public class GetStatusFn implements UnaryFunctor { public Object fn(Object arg) { PurchaseOrder po = (PurchaseOrder) arg; return po.getStatus(); }}Default~LT~Gliederung 1 g* <( (@'A' 1'' 34VWDrXXDrObuSVDr&`mRStandard`mR)Custom Predicatesgg QDefault~LT~GliederungDrPg{JoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3!DrObFSVDr 17bEcc]SDUDQ & 1Default~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX)Custom Predicatesgg QDefault~LT~GliederungDrPgJoeM`mRDrML8DrMD,DrObKSVDr~ lec]SDUDQ $ Default~LT~Titel~ lekxV4B1V GetPropertyFnDefault~LT~Titel<( (@' DrObSVDr UiQWc]SDUDQ +2Default~LT~Gliederung 1( UiQW xV4B18Alternatively, you can reflect using bean idiomspublic class GetPropertyFn implements UnaryFunctor { private String methName; public GetPropertyFn(String propName) { if (propName.startsWith("get")) methName = propName; else methName = "get" + propName; }...Default~LT~Gliederung 1g*<( (@'A' 011817ef-.347878DrXXDrObuSVDr&`mRStandard`mR% GetPropertyFngg QDefault~LT~GliederungDrPgwJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3#DrObFSVDr 17bEcc]SDUDQ & 1Default~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX% GetPropertyFngg QDefault~LT~GliederungDrPgqJoeM`mRDrML8DrMD,DrObSSVDr~ lec]SDUDQ $3Default~LT~Titel~ lesxV4B1^GetPropertyFn (cont.)Default~LT~Titel<( (@'DrObSVDr UiOc]SDUDQ +4Default~LT~Gliederung 1 UiOxV4B1...public Object fn(Object arg) { try { Object[] parm = new Object[0]; Class[] types = new Class[0]; Class argclass = arg.getClass(); Method meth = argclass.getMethod(methName,types); return getMethod(arg).invoke(arg, parm); } catch (IllegalAccessException x) {...} catch (IllegalArgumentException x) {...} catch (InvocationTargetException x) {...} catch (NoSuchMethodException x) {...}}Default~LT~Gliederung 1 <( (@'A' 1'' #$-.TUz{BCpqDrXXDrObuSVDr&`mRStandard`mR-GetPropertyFn (cont.)gg QDefault~LT~GliederungDrPgJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3%DrObFSVDr 17bEcc]SDUDQ & 5Default~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX-GetPropertyFn (cont.)gg QDefault~LT~GliederungDrPg pJoeM`mRDrML8DrMD,DrObSSVDr~ lec]SDUDQ $6Default~LT~Titel~ lesxV4B1^Business Rule ExampleDefault~LT~Titel<( (@'DrObESVDr UiNc]SDUDQ +7Default~LT~Gliederung 1} UiN^xV4B1IBusiness Rule exampleUnaryPredicate requiresApproval = new BinaryCompose(new GreaterThan(), new GetPropertyFn("Amount"), new ConstantUnary(500.00));Default~LT~Gliederung 1g* <( (@'A' 78`aDrXXDrObuSVDr&`mRStandard`mR-Business Rule Examplegg QDefault~LT~GliederungDrPgJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3'DrObFSVDr 17bEcc]SDUDQ & 8Default~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX-Business Rule Examplegg QDefault~LT~GliederungDrPgEJoeM`mRDrML8DrMD,DrObKSVDr~ lec]SDUDQ $9Default~LT~Titel~ lekxV4B1V SimpleCompareDefault~LT~Titel<( (@' DrObSVDr UiNc]SDUDQ +:Default~LT~Gliederung 1 UiNxV4B1public class SimpleCompare implements UnaryPredicate{ BinaryCompose bc; public SimpleCompare(BinaryPredicate comp, String propName, Object value) { fn = new BinaryCompose(comp, new GetPropertyFn(propName), new ConstantUnary(value); } public Boolean p(Object arg) { return (Boolean) bc.fn(arg); }}Default~LT~Gliederung 1 <( (@'A' 1'' 67LM{|+,YZbcDrXXDrObuSVDr&`mRStandard`mR% SimpleComparegg QDefault~LT~GliederungDrPgwJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3)DrObFSVDr 17bEcc]SDUDQ & ;Default~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX% SimpleComparegg QDefault~LT~GliederungDrPg/JoeM`mRDrML8DrMD,DrObKSVDr~ lec]SDUDQ $<Default~LT~Titel~ lekxV4B1V SimpleCompareDefault~LT~Titel<( (@' DrOb SVDr UiNc]SDUDQ +=Default~LT~Gliederung 1D UiN%xV4B1Same Business RuleUnaryPredicate requiresApproval = new SimpleCompare(new GreaterThan(), "Amount", 500.00);Default~LT~Gliederung 1g* <( (@'A' 1'45ghDrXXDrObuSVDr&`mRStandard`mR*Same Business Rulegg QDefault~LT~GliederungDrPg|JoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3+DrObFSVDr 17bEcc]SDUDQ & >Default~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX*Same Business Rulegg QDefault~LT~GliederungDrPgJoeM`mRDrML8DrMD,DrObGSVDr~ lec]SDUDQ $ Default~LT~Titel~ legxV4B1R SimpleKeyDefault~LT~Titel<( (@' DrObdSVDr !ieKc]SDUDQ +?Default~LT~Gliederung 1 !ieK}xV4B1f]Most SimpleCompare objects will use Equality comparisons, so create a special implementationDefault~LT~Gliederung 1g* <( (@'A' 1'] ]\]public class SimpleKey extends SimpleCompare { public SimpleKey(String propName, Object value){ super(new EqualTo(), propName,value); } }...UnaryPredicate pendingOrders = new SimpleKey("Status", "PENDING");Default~LT~Gliederung 1 g* <( (@'A' 1'' /0deDrXXDrObuSVDr&`mRStandard`mR! SimpleKeygg QDefault~LT~GliederungDrPgsJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3-DrObFSVDr 17bEcc]SDUDQ & @Default~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX! SimpleKeygg QDefault~LT~GliederungDrPgJoeM`mRDrML8DrMD,DrObPSVDr~ lec]SDUDQ $ADefault~LT~Titel~ lepxV4B1[ ApplicationsDefault~LT~Titelg*<( (@' DrObSVDr qewJc]SDUDQ + BDefault~LT~Gliederung 1. qewJxV4B1 CollectionsDefault~LT~Gliederung 1g*<( (@'#A' Swing: ListCellRendererDefault~LT~Gliederung 1g*<( (@'#A' Dynamic Query & Query-By-ExampleDefault~LT~Gliederung 1g*<( (@'#A' EJB: BMP Finder methodsDefault~LT~Gliederung 1g*<( (@'#A' Symbolic Set ManipulationDefault~LT~Gliederung 1g*<( (@'#A' DrXXDrObuSVDr&`mRStandard`mR$ Applicationsgg QDefault~LT~GliederungDrPgvJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3/DrObFSVDr 17bEcc]SDUDQ & CDefault~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX$ Applicationsgg QDefault~LT~GliederungDrPgJoeM`mRDrML8DrMD,DrObUSVDr~ lec]SDUDQ $6Default~LT~Titel~ leuxV4B1`Filtered IteratorDefault~LT~Titelg*<( (@'DrObSVDr UiHVc]SDUDQ +DDefault~LT~Gliederung 1$ UiHVxV4B1public class FilteredIterator implements Iterator { private Object next; private Iterator base; private UnaryPredicate pred; public FilteredIterator(Iterator iter, UnaryPredicate p) { base = iter; pred = p } ...Default~LT~Gliederung 1 <( (@'A' 1'' 45MNhiDrXXDrObuSVDr&`mRStandard`mR)Filtered Iteratorgg QDefault~LT~GliederungDrPg{JoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH31DrObFSVDr 17bEcc]SDUDQ & EDefault~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX)Filtered Iteratorgg QDefault~LT~GliederungDrPgJoeM`mRDrML8DrMD,DrOb\SVDr~ lec]SDUDQ $FDefault~LT~Titel~ le|xV4B1gFiltered Iterator (cont)Default~LT~Titelg*<( (@'DrObSVDrM #h{Nc]SDUDQ +GDefault~LT~Gliederung 1M #h{NxV4B1  ... public boolean hasNext() { while (iter.hasNext() { Object obj = iter.next(); if (pred == null || pred.p(obj)) { next = obj; return true; } } return false; }...Default~LT~Gliederung 1 <( (@'A' 1'  %&EFkl DrXXDrObuSVDr&`mRStandard`mR+Filtered Iterator 2gg QDefault~LT~GliederungDrPg}JoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH33DrObFSVDr 17bEcc]SDUDQ & 1Default~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX+Filtered Iterator 2gg QDefault~LT~GliederungDrPgUJoeM`mRDrML8DrMD,DrOb\SVDr~ lec]SDUDQ $HDefault~LT~Titel~ le|xV4B1gFiltered Iterator (cont)Default~LT~Titelg*<( (@'DrObSVDr UiNc]SDUDQ +IDefault~LT~Gliederung 1 UiNxV4B1... public Object next() { if (next != null) { Object val = next; next = null; return val; } throw new NoSuchElementException(); }}Default~LT~Gliederung 1 <( (@'A' 1''  !<=\]uvDrXXDrObuSVDr&`mRStandard`mR+Filtered Iterator 3gg QDefault~LT~GliederungDrPg}JoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH35DrObFSVDr 17bEcc]SDUDQ & JDefault~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX+Filtered Iterator 3gg QDefault~LT~GliederungDrPgJoeM`mRDrML8DrMD,DrObVSVDr~ lec]SDUDQ $(Default~LT~Titel~ levxV4B1aCollections & AlgorithmsDefault~LT~Titel<( (@'DrObSVDrqIhNc]SDUDQ +)Default~LT~Gliederung 1qIhNxV4B1public Iterator findAll (Collecton coll, UnaryPredicate p) { return new FilteredIterator(coll.iterator(), p);}Default~LT~Gliederung 1 g* <( (@'A' 1'' )*UVWXpublic int countIf (Collection coll, UnaryPredicate p){ Iterator iter = new FilteredIterator(coll.iterator() , p); int ct = 0; while(iter.hasNext()) { iter.next(); ++ct; } return ct;}Default~LT~Gliederung 1 g* <( (@'A' 1'' 89LMDrXXDrObuSVDr&`mRStandard`mR0Collections & Algorithmsgg QDefault~LT~GliederungDrPgJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH37DrObFSVDr 17bEcc]SDUDQ & 1Default~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX0Collections & Algorithmsgg QDefault~LT~GliederungDrPgJoeM`mRDrML8DrMD,DrObKSVDr~ lec]SDUDQ $KDefault~LT~Titel~ lekxV4B1V Swing ExampleDefault~LT~Titel<( (@' DrObSVDr UiNc]SDUDQ + LDefault~LT~Gliederung 1 UiNxV4B1gSwing provides many default models that work with built in primitives and/or collections of primitives.Default~LT~Gliederung 1g*<( (@'#A' `You are expected to provide implementations that map your business objects within Swing defaultsDefault~LT~Gliederung 1g*<( (@'#A' +By default, Swing hijacks toString() methodDefault~LT~Gliederung 1g*<( (@'#A' DrXXDrObuSVDr&`mRStandard`mR% Swing Examplegg QDefault~LT~GliederungDrPgwJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH39DrObFSVDr 17bEcc]SDUDQ & 1Default~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX% Swing Examplegg QDefault~LT~GliederungDrPgBJoeM`mRDrML8DrMD,DrObNSVDr~ lec]SDUDQ $ Default~LT~Titel~ lenxV4B1YListCellRendererDefault~LT~Titel<( (@'DrObSVDrObmOc]SDUDQ +MDefault~LT~Gliederung 1TObmO5xV4B1 public class FunctorRenderer extends DefaultListCellRenderer{ private UnaryFunctor func; public FunctorRenderer(UnaryFunctor fn) { func = fn; } public Component getListCellRendererComponent( JList list, Object value, int index, boolean sel, boolean focus) { setText(func.fn(value).toString()); setBackground(sel ? Color.red : Color.white); setForeground(sel ? Color.white : Color.black); return this; }}Default~LT~Gliederung 1 g* <( ( @'A' 1'' =>?@^_UV[\eDrXXDrObuSVDr&`mRStandard`mR(ListCellRenderergg QDefault~LT~GliederungDrPgzJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3;DrObFSVDr 17bEcc]SDUDQ & NDefault~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX(ListCellRenderergg QDefault~LT~GliederungDrPgWJoeM`mRDrML8DrMD,DrObTSVDr~ lec]SDUDQ $ODefault~LT~Titel~ letxV4B1_ListCellRenderer UsageDefault~LT~Titel<( (@'DrOb+SVDr UiNc]SDUDQ +PDefault~LT~Gliederung 1c UiNDxV4B1/JList list = new JList();UnaryFunctor fn = new GetPropertyFn("Id");list.setCellRenderer(new FunctorRenderer(fn)); getContentPane().add(list);Default~LT~Gliederung 1 <( (@'A' 1'' FGDrXXDrObuSVDr&`mRStandard`mR.ListCellRenderer Usagegg QDefault~LT~GliederungDrPgJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3=DrObFSVDr 17bEcc]SDUDQ & QDefault~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX.ListCellRenderer Usagegg QDefault~LT~GliederungDrPgvJoeM`mRDrML8DrMD,DrObKSVDr~ lec]SDUDQ $RDefault~LT~Titel~ lekxV4B1V Dynamic QueryDefault~LT~Titel<( (@' DrObSSVDr UiNc]SDUDQ +=Default~LT~Gliederung 1 UiNlxV4B1WVisitable and Visitor interfacespublic interface Visitable { public void accept(Visitor visitor);}public interface Visitor { public void visit(Visitable visitable);}Default~LT~Gliederung 1g* <( (@'A'  !!!=>fghiijjkDrXXDrObuSVDr&`mRStandard`mR% Dynamic Querygg QDefault~LT~GliederungDrPgwJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3?DrObFSVDr 17bEcc]SDUDQ & SDefault~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX% Dynamic Querygg QDefault~LT~GliederungDrPgmJoeM`mRDrML8DrMD,DrObZSVDr~ lec]SDUDQ $(Default~LT~Titel~ lezxV4B1eImplementing Acyclic VisitorDefault~LT~Titel<( (@'DrOb;SVDr UiyTc]SDUDQ +TDefault~LT~Gliederung 1s UiyTTxV4B1?UAdd Visitation support to SimpleKeypublic class SimpleKey extends SimpleCompare, implements Visitable{ ... public void accept(Visitor v) { if (v instanceof SimpleKey.Viz) ((SimpleKey.Viz)v).visit(this); } public interface Viz extends Visitor { public void visit(SimpleKey host); }}Default~LT~Gliederung 1g* <( (@'A' 1'# ##$#$#U$UQRnopqxy!"LMRSTUDrXXDrObuSVDr&`mRStandard`mR4Implementing Acyclic Visitorgg QDefault~LT~GliederungDrPgJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3ADrObFSVDr 17bEcc]SDUDQ & 1Default~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX4Implementing Acyclic Visitorgg QDefault~LT~GliederungDrPg tJoeM`mRDrML8DrMD,DrObQSVDr~ lec]SDUDQ $Default~LT~Titel~ leqxV4B1\Translation VisitorDefault~LT~Titel<( (@'DrObKSVDr UiNc]SDUDQ +UDefault~LT~Gliederung 1 UiNdxV4B1O]public class CloudscapeTranslator implements SimpleKey.Viz, ... { StringBuffer buf; public String translate(UnaryPredicate p) { buf = new StringBuffer(256); try { p.accept(this); } catch (Exception x) { x.printStackTrace(); } return buf.toString(); }...Default~LT~Gliederung 1 <( (@'A' 1'' ]]#$JKLMbc  *+45STYZDrXXDrObuSVDr&`mRStandard`mR+Translation Visitorgg QDefault~LT~GliederungDrPg}JoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3CDrObFSVDr 17bEcc]SDUDQ & VDefault~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX+Translation Visitorgg QDefault~LT~GliederungDrPgJoeM`mRDrML8DrMD,DrObQSVDr~ lec]SDUDQ $ Default~LT~Titel~ leqxV4B1\Translation VisitorDefault~LT~Titel<( (@'DrObSVDr UiNc]SDUDQ + Default~LT~Gliederung 1 UiNxV4B1... public void visit(Visitable host) {} public void visit(SimpleKey host) { buf.append('"'); buf.append(host.getPropName()); buf.append("\" = "); host.getPredicate().accept(this); quote(host.getValue()); }...Default~LT~Gliederung 1 <( (@'A' 1'' -.UVnoDrXXDrObuSVDr&`mRStandard`mR-Translation Visitor 2gg QDefault~LT~GliederungDrPgJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3EDrObFSVDr 17bEcc]SDUDQ & WDefault~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX-Translation Visitor 2gg QDefault~LT~GliederungDrPgWJoeM`mRDrML8DrMD,DrObQSVDr~ lec]SDUDQ $XDefault~LT~Titel~ leqxV4B1\Translation VisitorDefault~LT~Titel<( (@'DrOb.SVDr UiNc]SDUDQ +YDefault~LT~Gliederung 1f UiNGxV4B12P... private void quote(Object val) { if (val instanceof Number) { buf.append(val); } else if (val instanceof String) { buf.append("'"); buf.append(val); buf.append("'"); } // plus any other cases: Dates, Booleans, // Objects, etc }Default~LT~Gliederung 1 <( (@'A' 1'' PP)*NOkluv23JKDrXXDrObuSVDr&`mRStandard`mR-Translation Visitor 3gg QDefault~LT~GliederungDrPgJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3GDrObFSVDr 17bEcc]SDUDQ & ZDefault~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX-Translation Visitor 3gg QDefault~LT~GliederungDrPg+JoeM`mRDrML8DrMD,DrObNSVDr~ lec]SDUDQ $[Default~LT~Titel~ lenxV4B1YTranslator UsageDefault~LT~Titel<( (@'DrObSVDr UiNc]SDUDQ + \Default~LT~Gliederung 1= UiNxV4B1Iprivate Collection selectIf(UnaryPredicate p) throws SQLException {Default~LT~Gliederung 1g* <( (@'A' 1'II./GHBCloudscapeTranslator trans = new CloudscapeTranslator();Default~LT~Gliederung 1g* <( (@'A' 1'BBString selectStatement = "select \"poId\" from \"PurchaseOrderEJBTable\ + where " + trans.translate(p); PreparedStatement prepStmt = getDBConnection().prepareStatement(selectStatement);...Default~LT~Gliederung 1g* <( (@'A' 1' LMMNNOTU`rst|}DrXXDrObuSVDr&`mRStandard`mR(Translator Usagegg QDefault~LT~GliederungDrPgzJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3IDrObFSVDr 17bEcc]SDUDQ & ]Default~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX(Translator Usagegg QDefault~LT~GliederungDrPglJoeM`mRDrML8DrMD,DrObUSVDr~ lec]SDUDQ $,Default~LT~Titel~ leuxV4B1`Translator Usage (cont)Default~LT~Titel<( (@'DrObSVDr UiOc]SDUDQ + ^Default~LT~Gliederung 1 UiOxV4B1...ResultSet rs = prepStmt.executeQuery();ArrayList a = new ArrayList();while (rs.next()) { a.add(rs.getString(1));}prepStmt.close();return a;Default~LT~Gliederung 1g* <( (@'A' 1' +,JK^_z{|}}Default~LT~Gliederung 1g* <( (@'A' 1'DrXXDrObuSVDr&`mRStandard`mR/Translator Usage (cont)gg QDefault~LT~GliederungDrPgJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3KDrObFSVDr 17bEcc]SDUDQ & 1Default~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX/Translator Usage (cont)gg QDefault~LT~GliederungDrPg"JoeM`mRDrML8DrMD,DrObYSVDr~ lec]SDUDQ $_Default~LT~Titel~ leyxV4B1dPredicates and Entity BeansDefault~LT~Titel<( (@'DrObSVDr UiNc]SDUDQ +`Default~LT~Gliederung 1) UiN xV4B1public interface OrderHome extends EJBHome { public Order create(String id, String userId, Date date, BigDecimal amount, String status) throws RemoteException, CreateException; public Order findByPrimaryKey(UnaryPredicate p) throws RemoteException, FinderException; public Collection findByPredicate(UnaryPredicate p) throws RemoteException, FinderException;Default~LT~Gliederung 1 g* <( (@'A' 1'' ./^_MNNO }Default~LT~Gliederung 1g* <( (@'A' 1'DrXXDrObuSVDr&`mRStandard`mR3Predicates and Entity Beansgg QDefault~LT~GliederungDrPgJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3MDrObFSVDr 17bEcc]SDUDQ & aDefault~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX3Predicates and Entity Beansgg QDefault~LT~GliederungDrPgJoeM`mRDrML8DrMD,DrObTSVDr~ lec]SDUDQ $bDefault~LT~Titel~ letxV4B1_Set ManipulationDefault~LT~Titelg*<( (@'DrObSVDr UiNc]SDUDQ +cDefault~LT~Gliederung 1  UiNxV4B1cPredicate implicitly defines a set (the set of all values for which the Predicate will return true)Default~LT~Gliederung 1g*<( (@'#A' 9Define set manipulation operations in terms of PredicatesDefault~LT~Gliederung 1g*<( (@'#A' MAllows program to work with sets of values without having to instantiate themDefault~LT~Gliederung 1g*<( (@'#A' DrXXDrObuSVDr&`mRStandard`mR(Set Manipulationgg QDefault~LT~GliederungDrPgzJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3ODrObFSVDr 17bEcc]SDUDQ & dDefault~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX(Set Manipulationgg QDefault~LT~GliederungDrPgoJoeM`mRDrML8DrMD,DrObTSVDr~ lec]SDUDQ $eDefault~LT~Titel~ letxV4B1_Set ManipulationDefault~LT~Titelg*<( (@'DrObCSVDrhlNc]SDUDQ + fDefault~LT~Gliederung 1{hlN\xV4B1E1public class Predicates { static public UnaryPredicate union(UnaryPredicate p1, UnaryPredicate p2) { return new BinaryCompose(new LogicalOr(),p1,p2); /* thank you to the guy in the back row */ } // intersection, set difference, etc Default~LT~Gliederung 1 <( (@'A' 1' 11TU }Default~LT~Gliederung 1 <( (@'A' 1'DrXXDrObuSVDr&`mRStandard`mR&Set Manip Codegg QDefault~LT~GliederungDrPgxJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3QDrObFSVDr 17bEcc]SDUDQ & gDefault~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX&Set Manip Codegg QDefault~LT~GliederungDrPgJoeM`mRDrML8DrMD,DrObHSVDr~ lec]SDUDQ $hDefault~LT~Titel~ lehxV4B1S ReferencesDefault~LT~Titel<( (@' DrObSVDr UiNc]SDUDQ + iDefault~LT~Gliederung 12 UiNxV4B1PrologDefault~LT~Gliederung 1g*  <( (@''A' Default~LT~Gliederung 3g*  <( (@'(A'STLDefault~LT~Gliederung 1g*  <( (@''A' Default~LT~Gliederung 3g* <( (@'(A'Default~LT~Gliederung 3g* <( (@'(A'http://www.sgi.com/tech/stl/Default~LT~Gliederung 3g* <( (@'(A'JGL: Recursion Software, IncDefault~LT~Gliederung 1g*  <( (@''A' http://www.recursionsw.com/Default~LT~Gliederung 3g* <( (@'(A'DrXXDrObuSVDr&`mRStandard`mR" Referencesgg QDefault~LT~GliederungDrPgtJoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3SDrObFSVDr 17bEcc]SDUDQ & jDefault~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX" Referencesgg QDefault~LT~GliederungDrPgJoeM`mRDrML8DrMD,DrObOSVDr~ lec]SDUDQ $ Default~LT~Titel~ leoxV4B1ZReferences (cont)Default~LT~Titel<( (@'DrObSVDr UiNc]SDUDQ + kDefault~LT~Gliederung 1 UiNxV4B1Acyclic Visitor PatternDefault~LT~Gliederung 1g* <( (@'!A'  aJames O. Coplien. Advanced C++ Programming Styles and Idioms. Addison-Wesley, Reading, MA, 1992Default~LT~Gliederung 1g* <( (@'!A'  a=wErich Gamma, et al. Design Patterns Elements of Reusable Object-Oriented Software. Addison-Wesley, Reading, MA, 1995Default~LT~Gliederung 1g* <( (@'!A'  wSVKenneth P. Bogart. Discrete Mathematics. D. C. Heath and Company, Lexington, MA, 1988Default~LT~Gliederung 1g* <( (@'!A'  V(DrXXDrObuSVDr&`mRStandard`mR)References (cont)gg QDefault~LT~GliederungDrPg{JoeMVT$mDrML8DrMD,DrOb<SVDr&?% CH3UDrObFSVDr 17bEcc]SDUDQ & lDefault~LT~Notizen 17bEcdxV4B1OClick to add notesDefault~LT~Notizen<( (@'DrXX)References (cont)gg QDefault~LT~GliederungDrXXi%Generic PrinterSGENPRTkd,,lprdefault_queueSGENPRT#PageSize:LetterResolution:360dpi DrVwP SVDr SVDr:SVDrSVDrALayout:SVDrSVDr#SVDr SVDr# SVDr0 SVDr1 SVDr3 SVDr4SVDr@SVDr SVDrD SVDrP SVDrQ DrHL DrHL DrHL iwR Root Entry.)䰱CompObj=Ole persist elements" SfxDocumentInfo uStarBASIC BasicManager24SfxWindowsSfxStyleSheetshStandardJSummaryInformation( xStarDrawDocument3$