PKm9'PNtalk-Core.mczPKm9packageKMUP+Iu/JUPKm9,+ versionn0 W큅>(JmN6$j|q})In2`@ɧ}މ~vI`ڼ3NqPjPkVCQsD5dgX$8D]Lj5Ͽ5#ѓ:aRô}|N@} . ydfRi@Fe*u?e)ڊ6-l5}l3`H^WZXe~8 ,z[S dk{6=Kf|/@!5 yKsd`=D 8'rq/ӂ #Dn7tg!AF*#8ׅy`vqYgC}bBH'1GBlP?TWW:74:}?-Zѭw/s`h ZbSlIK0j{?ר Fq,$(,97ݘ?q/>FĚVJtxA4ƜJ Rwn9t_ijIPKm9 u*`snapshot/source.stk{F($z-p:~ qx>ބJ7ol0 )Vh6L4}9\ē45#%ECdGQ'Z/*YGE&q;5up2d9).o'4wU$hO/jzdN^k|(N4f|qۨ׾S|A|‡(ΖwQ}%`0/u8^F4Z`5%̢d2T.2Mo1'e6 y-:fp 橦۸yd9^ U9V Xs`"cNI)}0A|G#C/@r-^Ge_->/~N+X~w/Ƒ&v)(̢i3Xsl "Nix}A+dv[ ~=IyGEI"WaMQgDRsaEʓ:3D'(8~),r5/q$Etkc˅o^x]ؠg\zCVH|_cɺ<$9^$3w~:g:>?oplDA&).6Ǭz3/|xxw=s|7Uƃk8?/#)̱cv4 lTiJXo;t|є&^j$d| }[ )EFyk38t| ?Tfp:z]'"iY u;V(d—S}8Nf7@#ZPa kǑќ lkivx 3i"vXCIP9s!aԫa\h5T2_wG0?^opUgtZU(.`&#L'3êv}gtQp/rNh8]l B4:@C4;} te4/"LCyRcК%@i03 $9=B/Z)`l}'6R\2\Oc^p +ct0rf$n Ƿd] ltx^>sU8ú_eR53y!=dV7O%XK dsaAB8]p8Y]] õeBR^`J~޴Ą_h℄c*fK] }i P7Whߊw)+N۷;iH r`o.X8^} ٝ=0*3gj]oYe@NŊ7U;R=bճ%a24nFT Wu08^l&1\rp&!Gd{]c #PprS_LL5}'8ȑO! Ⱥxm )/cZ ILj("}4Iu@/ s^*jwh 0bU<_~s8?GS"lX'ȕɟPϠ h;pixA^Ѵ)z{s"Ȫn/ SzOrɦy#MQ}u54&1A/{ern2;^Z'FJ)k5_w }'02:&\o4_ϚnJ݁݃A/h]C! qY4ԝ̺H`PR3o>)!|Nd (N?;ںB®=ph^aWpN}fWaԺBeP*DV|Pj8Bqx  ·o$QJlXcv8vGwÎ=[z$n9aɥXd}"bƂ%c1Zr;^Hmcͩ屃7j@g5HTmP7e6ڙ4e@kA 8ŖDc9q۾~vL#P%/(a %PȖ]=>Tr/sn}$7R0JQ}h< YɉX5}J1D? H¿Ed>WG*o|U:4.!TW敒 1ڎɍޫYH=ќ"7;]=53QNitL!JgHO` 2N”pepR\`(XVZVA \86J^C(YXu4<$<5z0 Txs׸Ᏸe-d 74F$ xُWS-+_CDT(߼DӺ2Zg"["V]"2wZCq \mpjx&UKZL0 F23w$)/MY X.Wh{z 4AC*nN?mI&ѕjL65-nQ.C4H#CbK@hqyxeuHj m5 xźw;;R|>BJ 2D@>FoO+Ux6"P/ڧ[- 8!_I#|om"_WCNtn7h]EjRӸy@?/)V,gDAn o0M0scǡ 1%^}\'%^}8c&+[p-m8U~62T ȃ7 |$]ՃO #M6(P|[^mdҳ~WZd!RdEoc|5И]ЇbyCV;0mmu潲4t$W#;#ŷМrB~)<0&7,O*֠X>P㼜ΪHzRr+V!3J9x<]I3;4lQP1Sn{c)f .tP³ytJʊ-*D͗3$Iyn<_}`]"G9ѠGf 'xl#T! D`q;(4~jX*f(cn}$OLǁ}1/ 67eՕK^Hh"I9;YC4 uڱUh!N4䋲ָ匳s@6~(EY5eDC6iMڥe(_aA%4%%)!戧ܙfTaԄS-X1̜>@OEgcveΐ Jt'aN8)ׁdu8X_Kp"Td'|~+K@4])% TX*Mh1?12fO, J@}Vl)*FW*~^;ǙuQٺU22/E|/"_ǜ+l ѴKɞi4;lܦe, Y w+P~ f.Y9WSzܔs=J.3-WEo~՗ _mݶ^Vhd_$eҶԲHom=Ϸ:Nswcc:Xsi/crܿƌ6p}/3?˰UiUp1-_pĆ!ԦTUw3#W¹x%i%䉬igMgwbmx♍9\3e!XL~{[Wtfɣr?9X@M SSencc^ԚvY)V=QW3I,J˪CY<ɼ@" W)JQ`o 72Yϑn  zȼJ ɅYi ׻U=FJc:rxv8P=,LeqjўQD<僙RVwT:_PϦ+*n0 Ǿe{F}"Ssrf6vw7xw+.#VaE$&* ` *4v|~9Uzh:u*zBL3&lɛFϚFE(*lD>dքk+37<%+hԒO*qMRJكl^~Du7 I9]p3N"hI92 }<}nYٓ+yFG97e56okCK&POql~1#!X';p9GQX (AIk4?d@jtOX 5Tɘ2 ˅٘Fp=xzŒVb9bLw+o+`>O([W `QjHfԺ=y¼Yy$UobyÈ?8@45a5 f`;x2xx/BJ(\E!V܉:{/p*е0p87m:JO3 Y+PUdYf/5S> cU ӿ4l-|+qqa\gӳ1S{| ct-H>ƗPm[0OmlmBa2t!{!pcqꩩS?=4~qVპ1R/K)?-g'K2A;4F3ӛ| )rrb[ÃqxZqU7A[AԟD/74o.G1wQ}:Axy9|i_,/ѧKY(Va|=Q_0!me lƁK> @%=EϵqtB3NX+ Ϧg7~,h4ďv$9KP3^G 4hiхGF!Ctmy0)8#3<]}c+;3=}}뙛8X|7'%a͝s|k*QS^>ONJb^m+}hvxENJZh\ .zE9Ëf U8Knd ^K:Sjt*=6_q+}G3 2eS-7'GF0'(z b o$FmV,Kp"mO"qtaL fڐF-yϟn2T6= PQ,`Ȉ|- ).vgm,!+;Zm`6mbΌA|->8f2b7ep !_QS>MBODQs$6P2a( o+FiogrC˵3YIȟ]D۾gUSZ | ^gH@H. d)j#=|u;uPpσƫ4 wYwE'wV<fw #*cH)]W}0WVMp9_N}zaCM#yqr3k3ʣ`Dg`IM(o\ '4AYNRb{0Yl)%l@@P8 ,$i y`qc!Kwn|{:tMDG5(gu*2*ţB&䇶j6llV@ɾŽ H8N|Ӂ`z}6(i,xmwCA5)EUUwӉwu—,}ϣop$mM;e' mNHu _M/ydTZ=|D؏VЛ.n 5#jCnrl~bm`I,燜G F;_omZek|'lpBspN @֩j~kTQ~x;f ybM3)p#ӉܧJeuj}X`@3_ȆWJdFB5Ֆr'OsRY{ȏVd] z"O6=va1Y"N91 Y!de ~(4.IvJhjsjhhEqTgMͺx55RQ-:"G2 ?/Rp E(-nϯp1zOH "KNoI)Dr7/iiЋ4,FVyuQwDi"C UKj1]үx5r1]qf*7\Lf}>T>ku̼fpȕIH]jZK) LZlM[{D)4&Fq2阣7E旜괽[#4dd*20ܔuVa@_Φӽ栙 \:*+*׬7F$! #`f`'`SWzÃ"qͻ|CҫCV@ozZ +tġ oa<#6kXe-f0}'\,`]n.喼, ԭ(#.\}X"]'D=7a/T/If=-w|MBG(x(g6^;SKl(}uک{T^޻Xf{1)CŭDe'ӗejQ37mdThۮ;MGcfr8bM%gZ.'Q{GBgZ'bƩrm5TP&J+cBQǘb#P4>_Ρ. Q0&q?{!lmqi8#{I?v2D=9 @4I8!Z`q=uV"B ?97/rCP@ӴRl8jtx)FlqXIėvȄrq?FA=,g}DRM?‘#}rB ~%#GcVB0sQϸ2[y@(ӘCi-)N)Ҕ }o;b[-=bԹ v@ݡHH౸4 ٷ٬yՕ15Y*Iy˦wY*e#-U[4?l_ImW[&'@H=R,ic<+ hT)NFn1gfPϼ(z+MZt1&leg@ VD.B|71T6x+6TtmJz^ͶLR|)Z-0{ VΆCe~6lmuF2U^Rzy5=y u`6xיK+ wc[HKpu1+7>q[bQ@cQW眽C@SLF!/s匊轄h+4=,[bʼJ3rl#y|}|zG!s/~_qoƿ=xԙHdqՃ!JR?`LLb XB`؁sIj *!ϭ&~oکIn: k䏊:{a) 5|xcnqZ<:|M7豀}5w_|bZd`߬LhTA wH_cmpd(*d5Q1H+WEߥ!da$]a.Iw- Pdu3}0L[uh{/n `<[hXH ʬΖt7PwTU<Ziˀ*@9Sh] %JR j-l[\i7䶡d1p٘(:> #a""ZH+Rhh!t(V n$rP vE*"r**2#~#Ct/=n9xUlz`E2{'pp;+;CF @w&_hv:nQ3}yϾw&C;kYŭ_~گ_[ښNeZ ׯLwL^R6mFfv,S_EI߭64>CȊ^ab+ 1:w<'}pU'uo`{8ͫd4NIC Ӱ2hO y : ztLv mgL-v>VשB#;wRPn$^×/gLk ["Q~6EE_;&;\<4r  Ss%KMYqPnM<[H^} /vf#RDĢn@UM2tp>@Vx/|hbn~79Yť!‘ v\cp*&5Wi tunvЊ=ac'Qږ p5JBDKG8) 8,"1S(8z˴'F!ݳ3Ldv=֎ )\y(ٟ⣙IpiAH<7\wz9! /4;krD W$FZevjwImdbm[[yLY gxP cpiRÙYK.IEk&<\[TY3ӑe[ 4NY/X ed6Ad '7%`t$:W5[EMSkn⌫M@-GAqjNZr6rSFAm#+&vĚ\ l+{m=\L;F#3B_gC wWqt *rZvFxki`@J]iulį03akzGYyޱ{z&]P;ر=d]r+ڶR۸ yol~󕴉hUzUҚg̟z%mX|e-f^r aTRt-ieYsTZhm.OѮ6R]N~a[a¶F_֍F_֯?P5OHbU44>N讦. L$t{& $X?KG[d^0ϠV0V>9O$= q}R zO%>hu Y|*$K'/5:ȩ XH@.d;>K쯂բE-ȗk;d]M#Gh  g)/+r;Zq3$a&pwgТvP*C}"3=nT0a854!U) @;gaʷibkO :llƟ:vub~`S\ pиQ]1Vޕ{՞qLbښmŖكX*̭LYGZ6𯽎X8;qtp ?AfB~M=MEIgGГ6ˍ۞U,r[^{TZЍ<~Pxq@}gE ^oHwK VnY +nBk M;v+樅S o8mAW2F.T;EUO@ޢ#:+Tv^u୽ Qnu^+W!0Gc*,)k6Gy02NiGauC)^x%6d і, >^/1*l̠ep/k' db K"Ԟ0Mhkl@ZMZ GwV|d1IA#f$rJ5?3$RƗ^n Q̌y@gGM(栶?=̆\wƔM곤p-pؖjG(59+\9̻7!cK/E&tL0ϣ1ژ $Mh ӏʅWkxt.$ 7َŚdl4;ʚ?BZL9,3|ZA #V|ox}`xƭ8Z;4ArJ_Ѩ CZB 8ab8rFK'^'I~}A6[EGi'v39SY鹄Syj3Q,Dd=njw}TV=R[:XZZ{9$. Oa Ba[MٟVbXv?ࣙT%HÙǜSA>PkpƅE8qOOqLǷ'J'_ѷMaQKQ!IU\vs2p[q|T*. =ﲠ rkG~Rhn X*B1i6Wm]b:8Bi Rd#`ЖJj( `B0P$tIEMTJ~MF&8S;GרsUsT%fFc] :CM 2H:1O àe@5C Mw4C{!YÈه݉ RءP5v"&@gHJP ;(9b'̈́BD{g@*6] iHiҴZbR3 w Vd9yX$E'(oܔn0Y?ϭDPs 5Xv})R򁣾⇞qk2]/'8U*EJ:].'\R>FϦ'X.`΃5-TKدo!ֲ-Y-JI3,Ujk9QqͿ#4cx btH m ga y": QA(G "&RΦםyA ŢaF_4;Hט,~hm%PJYnSۣ0nU~6buO@~La Q=G==~Ea. h#c AuEP~mR܊((8~ 1V2 e3^yNBDI ^8]13X?7%s-2mS Riץz<dzs]],Gp8|ȆMGGvFB~ m1Oybu uſTfs|1B(kH%ΨO0WΠ&6<0 ZѨ`PS{ߢXKAOn.\(øE!5ϺMAzAcO)yq= yUiHn< 7{rbA MK=: F+=JvL \pGzM՚|ڛ|+:K';|3a[hx`o>0vg1 d̷|K |7&+ jDC'(Z5[gTF6Vei+f#HׅrszU%B+VT˟1"svZ?sLt*^.p&Jian+)Vӯ.pJ֢ mDK:ٺc[󭕋ppBFefvf󱼧-SuTXh8/ 57+PlC,*$F)&ւ6^DsL*'W xHE2$T> %>Jo1>Uwj\*`/ oed]iQ6OonHax@}43Elԭ1%360z{ޣm6>(v(snȉ qefmU@ xu3 s] @R krcr"S=Sge;mM}^ 1xCXNNR {U {&9I7a q0.6t1Sq{@sd<:)݈d;ALA6csf౮-|B_lK!qc8sCqBb` iE4 CMl@6YBީ]STo"jٍpv7"oDr.ےY~BMBMz @}Uؙ@[[ߋ<:CBb3LSkկP܈J9ѝ igt2l5oLI8Rg9[Z-m Ho ;ȋ{(|o{2riD U9M:h8So_ 7MlGWjgZ >\Sa]w+zM3<0AֲT#pyɑ+_=̩S>(c+HW-fW3-"vzk*cZ?JL`>dӨLEZ$de./*6 hI,ro ]i4[\ .=Xlfay5F@KCؗʑ")Xj/hT[dKuL]$6:r!3ӗk1̶|GCE?x_}6ώQ饨[#o|t%xq`U IJy1 -g(Y? ,k< 2]].U_$p|cl^"0v8ٓɵm=I b38C욢Ǽ_u?г7FUV&[Fd2[*I[X|w45o[=$ڜA(wI(E\آSCsCf@-y=Ĥ2;70}QW .dWWiݾf;NrS(ˠ[TϏiyFgFa=x; Le.@^7nFa \8R[Iy$ KE H}T|{Oʧ`+=0k' 7T-|#X==lk5͛ lqɤ8;'1Ϳpz kS{}NK>EK2qH](֮>}[!G`zW}y_!j!VEs/mFqÄf{-ƣm [$Xs{z/>Sr]^ý`@x3 ၍4B#(R) y_!9σ*wb>uYJ$.\_ *Z4ۚ)qn*쒢m/=]̘ޛ)x90^D2b^VI#U1ùރ8f)>/$@.9}=?:o5i "cf( g%GЫh,lW/və /K#'wyb;jSUI:B՝0N5ܬW/sǬ2.|N#He}[am Zep 84)z֫B/A%ךyize藠ֈz*gNO>T@e _{4aη?tP/ yq I+޽yJY$6װREXzJ(.CO"35x7ɧ⸏S_=:S{GTPPGA LF!=qHϲnS!b6z *䀦wVoK`cjRw[MZD"Q ʟk C-ctKYWc0"~ϣ(xAaȷI2@S/:Z Ak DGcrܩT3o]|LRf(rpK04K?2Xtw a^%nٹ18I8LC6r%g aEԐ M4hMjf$R4h` FGpу#&f1?%4M7G}+C?`&D`R&ɪЁ{GP$;FD˚kMEWv,JAaM9ZtPNpLWqSj@Hܙ'x#eDьƝIPsDy2ov $LvUaMYhP?t7fawɄΙ`1Ie~.xI(xlVh ]wίVi>Bo&W-̠]Gx0S"w(mE{b^nY*"Sn|S:7N~Zgۊ k#\R*lq>eU/¹$whT)ĿƷ-z5 sNwEvvz?ln ު}80dCVҙLOY0l(ˌmZu+᠋3p ].,ME}MG|=Q)~!qr'X|Ze3 }q=jfU2eiդc}j6"@.ZW}PV!L4aV&u|kPvo$gu 狪%JALd)^Etg rJcR66q+~ kng倁W;& гJvpk5w-aGW4Rؓh2XkS3aoVCJjt&hfت[W .zVR߉*\` >hn#mE`6l#`qw5%E䗔m?bAKW(V14UUBVBZNE]g#qLlػ{D]&Q3|G0LJ?-ڂSLOC녈tHY[| y=?fmFe26e78hjƎdsHZf$N8Kס`2% b|?ܼ `|r&#I{]"Xڭ\iZܴJt2>j%ۭ- *\euBlO]VSʪ"./8dAM;}TiL|W#CDͦA!ڎA^ēl7u10kZ(.Gہhьղbt>$9g7٬P*8 a/PsJ3gߩ-SIS`פWk3|#AGL=W[ms~He nCf 2MXtpQN 4gIR{2҄Fj YtE8|z(x B$M@Hf9;9hZzL&bL/$޺Z᠉U[$2)ʆAK*k#͈Oej‰^E\4}=u2Q/F1AMhPaPsȺQ[iɵq*eAI8c6p[^vɘt< < ƞ6xmÇ8o˒Q)2fN= 5OWOjrxV'_rco6Mll5Mh"GKF&`-V QRj*{ j15`lLp;,T=!#S+4ج[[k7irvrw lVZv*ko| z]}J  aT$XDASeaNQ+ZtaC^yZ;5Vu>]Ea /jYI=2-Ϧ-6L6JIT *ٶS[JWu.öNӄA5YͿ1^]_8]@dlqT[Aq;:-g~*Bsiř?z\o:#w%kaU;H &mAMFlcVndZ \~ՇNu%)\JPtEmݖo.rdxo+;_,`9ijnBbP K;3}f+v-(8A{s0ibP^f, WS8ad\\PG]q;Lŝt* hz U%H\rbG u > ETD+x 9᷊+R"HRnEz1ml_P)3 "\xK5Өqyo S6> 6Y %w@ێwx{[1ǘL U9ə\fHw[֋ J)ˏYv7r _–T)wm l`psY#R-̫U|:#G0o:9r|-j~ x DS ()CMavf f*#w =WR-Nst BA<_W6唆_$UIJؐPsUv20Q[[qR3_|*㢧S9H,-e?Fjߡw_59(ѭ>ܥPR %j*g(8'#D l9uQ CG(Txj fQeZHuEIkt )g9CceqjPp.:G޿ԐR`ô*![.G#5i5 H e `IJàc:TCnJ -*!Ŷ&aġkᵚئ G",gaL`k~uzXbԼp%_e!FN%QFREFVuF5/;?eg/aL)iۗ:q]`}' D$~)WEU8# ӂAC/S,S(}5 3+mi<|F6g9\|9E>:C/.xT-^EkfnMެ#N`O!{^#n\}{ŕWt4.qB"x2!KCˈS]̓ .7AE\&g#5"Qt¸Lnca87^ 0Ml54,oՈ7,q5~򔽳ndɂ̒>ek(ThH6tɞz_QxPӦlK4}NsnuOEI/<籣<o/N4ͱ$͒ @2t`ۑJJD~et:PJxy|9GL T#csVU8öj (fs<œ!tHU^7Ϗ'=;FĶHz:In4vNyKjwhr3:]ucQV?9t `S;! ).ȁ-ѯt@\'byt'T wE]5A~(LN$nI*~|$m 3lk#VxogG4?#Pb౒hEaCX&PCqT&`旔hWI!²"[jABS?M%>4L`pA~i3˵ǚx[w~|;9OmuتbEd}q0?+xi~A<S`"z@czUŽoHuwD! D{'Ph8ȧugc}KpNCnةѯxl·LxgImV55^ڌ͇1\&)pdpNNJ11]LHho^T'W#x߂B't&D^r/ZWW5Zw-x9g%*elH[.% GfAp]'`3{ŠM01c&$y1'9JAWmlJz_;Ҥ͙VՕQ[GaM|CGkvYnDFT$-˻1QEY%GcūUcԩO!{zR :[p%{bG/4rꤖTl F(ACiY7fS?m.RgwҤk`L~Gu $Q8Il iUvQw(Zq ʋ)@[%v`>F}i?WҢ@},>Xt\tg_P bM]FSjC!Z=k\q^S/hz<t;p˅_DQ| g"7Еle4^<6wų17$ =jzUw~h?3{XdÞ= ;hZd^gd`"N!KgM, @Rq\woSh9%(A3X#~4~?E-W[P}d|窯/rN~|ՐaC~s:רrje|ɤ ߦh"]osnSdfPm8{N#Fv9Ϗ2T5s26Rbہy 4$@8"4 ΂%Xb7KЬbNJV/] iKy2;V?jyx0I<ڤ(Z5tښ*7!)j\̪iN {mc`ζ! jiXbK6M`[SYu7gz?9@Xit8χ\$?hJV6G#5RfՌ >^ЅP)eW&~FW-3v ~Y _ǡ7 C8}9jZh2K|a4-d `5ui+'GʪP%21%IR꣆Id}mWm;YGlsEOka9iU I]Zґ/HbbR~cw"VfE߱*^7;zIs%;Z ;dܨt/E%=~4I5XsہCt$Q 7.g!,k18I =MɌMR_%{ `RQd>mL 7fBxT hz?3/ݸ3[^8Ӊ_i3Gڇ@NP)Ot&m<}q4gɊPU`G w> ZQOuнA&;|e胵 8J{%\L@ҺnvQqQ.34ꦞ糽Q }{:w0c_ \ol2=!ײx1뇩rtgH=y RK)i}+ΐ2TclE<=-dYPku%/|y-î%UVO:rLx&@Q2`{sȰŐ"^fgGmCAt2J;c_ƉbB| <|F Cf$Lƫcf}A Vi+%qW; ]e#*o*6Ȃl8^>9pu׏Bo,$*F,^#`\JY=+Xڪuºz*4md̈́0)U}xjʴr# 3z%7™N?W 9.@C^Q 4tw~?3{#cߗ!K v]鱿ovvSv6Ϳ]e<zGQS*Yd!q&>Tb ZJ\Np%J჌'Pj[|ΑSYuL+ +&'h>b&K(vo$FꊘmL= Z06, G?W܈JJXb͆P 8谧 uS[ΦLvF.}G]벊к7=7`O @؅g<,son{CXSwjߚ2]f`]7tywqjXXxBn 2X{FP@ YiydP玗pB43wKzgo)#F>!;hl QQ@@}9ٶ ӎv;Ay|h.pؓHbkLfsz=ԞSS)^ǁnQDMvE0Rg&P-+Nݤִ)o1f;rb[ ) mǯDWHlOY8wOfM_F_$Zݭ5d\MTbqRrvxsie5' s=41`}f*Xٱ+E*E8=ZYфįcB#$ 5oGjZ%G\"=]Q}!"K:EWDδ#,؀b0I+AVPݶeT#'F2#eq/4$iH4c4eQΖ =OU :;]պ֞ȰbW!2=R0Ľ%fg`Ut,l^@\N! F|\؇Zd7\`3Cku&YLc2p)34Ƅ|cO0H;Wdx_vCyņ œ% d1%B&NۣRbΞ_RLW-ٔVO#pr㘻w枧!(@Ar=2nGRQ`Ut:6uw2{v偆1Ns\dڒi4$"Ga %P:c((l4A`)\VjBP/]jQ8 Ƿu\h3z<hbgn N%v`L{Ҹ "+:=Z:@QaiTQC*H =xN;47ϮO[{5w>t;橐AA{> kgY'@讐kSSzig1 Ez?|ۤ(1s*+~YɦYlH@9kjkpCKB˶97Ljq8c=tv7IVΒrto[K*5YP6vs!GQ-F'O#`PɗU;zl DTˆwwӓtWتI>lPC:MPecˑEW@c(:n yx~y(!1$:|9S;YzTq۱̭G'Yv^Dr,p' f^}Qpa ǀ3h!S~Ϗ$fƴQCm6T`6`tRK_::77 ,F8d U:XS7Ĥ7 l/[H*/%0&!Π_IiL@B`4c, DYH2f'4WPRb9W0۽c2PQwm $)*RP1D2NaFxLzm!HM+JE]$s}-)q DZ䣊pnLʧO(N9zN~ɡPxs?6QFF ІܿjCQ }h6U $vEԗӌOG>#M^o²Fi &,$)i WB–Ǭ1 njYK@cq uȪpX:Aܤ^k-SRbQE={ķ-]j!5M8Q C8s=)yZN%?{Pm ڽm5!akpCZ|n)2Ohzg>KY.ql i̲.J&.φA?3Z&3cG=vהZ֘P@zjVhZ6Ȗꫨ0} ΃\"((HaEۻ#8g wK\܆Z^^u3krAP&?L# |yjh4MΡ-Y?'U|1 HQ&\. bNnKkϠY6׷M_YV7VY8Ld2>N7 < vy0 'NDOд|e;!OTg}N=KX[Q;9/y@}-B+l)<}*߲npvɉqE;۞SSvl#ϱ9PD /s`~! om8Ne]_FUܧYtF=#hx a >(=,&h~|6kT3V4cvXS茶`8ӱMƙF<=υp#fF]^<{j4BMB/g)k[K;~^ F"sKܓ-QhrXZV`qpu50) ~[B7)7L样j]\W[x婦JL5NLFw` HxsN^-8qt84>ӵ)zL$* S5FZvبqsB?[.kd:N;k8%ު*5;hr?gEDZXI߳Vf{fY|oAaȣ+ T8p?XNFUYB,S_,߻e=nɍK=I2C25VHh: KHݷ " T^rc8/q>?`:ư"UWڜ<-ĩgn8ۖi2A*1=d7q%\G(!ҁeK:cP '-n@3T@AG,a$@R`p’Y eғyv6qxGq3 Y0LvN,j94çv6 ;1`Q̣6r(z0GH0J1ٷZ|^Uw\ Q6C.Է-^MGt``g7Bq|"*?sC)P /3 B}v:9 YDXRF ΗHoŜ ׆b^G X#M/\D ^kӯ38T 8ѬUȦ]d G1 6c=s jj(UQ-[!Lqe oZȣ4pR5Da4N_+H~c]rF-w}I߈|\n[9Zʴ8Vrʶn [FNiJ{F~_Ī̠U~V `u2 ^F]$H& fAH(bXd%+WUh~4[^(X=a ig`=vji%MɎ6/(g9 <~k[61.PfJLW3YGҞ(Cҗ`l_>r:sY[4e;.c0Oj妛N>LBp涓,exM}ri 'D '"_b B}+rO1J +Jx5KƺVC3S^]rj2 [|2l8! %sz:aD0deX7v [QITTF$@iU"`׾(m'=G.m[L>R Zt _SEEンGzFUз ufH^Ae l*,#I$FW"e*^j^P6- G^n3UʘZiTs[SmXމ:kos)ZC%s"t;PlQ*Re2OONک 3qjY`6atSNLfk퉣 E%8"ނP3x~ c%~ [:TH-al )Z$̈X@D gJ&[YcԢZj"Bc< hpI_uhjbURpv.' JLSK}K <͹L|61K$ ^i|KT!?EGB CL6xecC@66Y=ҢW2b[%DuDSLT.3enucÜ3ͧʒQ~ICU \l]kk}7ub{^:5''J_U']cãϓ˫U5o.@) h]=~N1TSfx,KX~~5}@`s[$7N.5iӠm~U=vGH0RBb0yak-ˑl@dW0h-_4ꂦ V_=#.%(Px7ŀqҶ!O8kE'T)aqHK!az\dBSԪT) |s٦=bVE5Dl\.K^sh_@l3bwqT~CXp+ޑlGz bDl77$L#}YS RTF%t,*h0Sc\k-ƵOX9h9*]VvLsyr1Ghq2-{:%R|j(5)!W?qu?x1e໹H$5]?%n%~IK٫mi'1OJ*yb rX&ħF YbK᪠97*V c#8j :TU9yf3%Y#V7ZMv+eY |_x7Gu uNKKx%g0%+ ''rGOx!K~GvucKJ T_l1fe5QDDw h'3(F@^|VJӅY,g\+HܚU_+ JG2)g5W L-K I ɍIce}|\pd\7cGapu8 UHgbpNW*Hyxڈ#%=ۧ^ "j x`j;,S)k8N7Yr)bKo81f 4??9&@ -ֲQ"Xul p^̓:.1?b;q".yDɂ C#  zd*\Wou ݈ |5AV's-v;rS )KoeV CɁ8OO@ IWL1>5`qӬoqE9PLذ Ll2Wjslu~4#tPTz[; E2(^wwǝFm33[ػ=n97m׌VC[D AzR(IkW }b㙵`)9ts;>wr _1S}e0'lG$Y˳y/B.3f'#;oTH&0Qp< c\f5J2 ;UAȢLP8qqpZ40%u'Y4\mn=o V8NXشZl7(21zYWz*8tF$J8- B2Ͱ > bI}:3"QE7Fieٮ?N4 R?xjؼoyV-7t{'&Ѯ赤sGW!:dn:\!̮K V_}j3 g~Pr Z!Mc"7{S92W͵L~ݶ9 FHFby{mtl6W;Oy3pm#F%߬'{9d__}f[hd E;3q&)z{Efs(Zv^v4y-@舑wN2iDk!ۯZE~摢r7GU6G|fI%2N1uîVOCz\x F  ו:EPWp=7>|i9|m);LBT`8 *Shn^t=R.dDgQƘ6 :Ɩ+e!Lf)Xo 8E/V" UQӑ=VVrQ{6V") MG9xRɚxMtcnC`TsS kK=d"'t*_Zih!w&GF09}ӽ Nnn??l}zfyM{ <=k: eL%WہisDI LKܠuWSU챪'jtJf!hR@%*Y)s > p^s?M*(ds 㚙lph:A?;vŢnG--LJXsgY=Sfrpf/d19.I}d'x2X18' W@kEɌ~i\}4NbL1ZCC͒S:/WBB [޻[NsAѠ'#U{j'S1 2 ܠU>'^`A N jӊ=5W"ujDŽ'ZN^b:ТXSMS<{ ޼|*x/{?ϓo `8-Aнs/Gp%]x02 w]sy-k QE²!w{ ,"UoDOsik$1MBZת\7k~Cu'֜Y%FDp+k&hAT15V~9PTޑud'!AU_FX@W(4By-z?z,@(ﴄx>Cu34(FS|gEz]"=Y>"(uc _I.VJ#h31B=myog֠Vu=1$ ֥qf18e׏k'}9Ƙb7)DLYƨeq ߕ,p,,+`La cC(.p8qߌku}y'yLb‡ 9$m!voNFS0 c(dYA )v)xwx0Q16δCyX #_ vN:0;2Wy;~~ kr[~4\h` *0)ӭ':ª4nBH>}p/9np!$"wDSfm'.TkMog?pgԄM`ψG{rwܓq%pr[k{GVO""Hc53fBŕ^)B[-uqÔ;qBP4i jTlm  7c%% իvF5wTwu*;*" )Ո~8p9Yk4Y+L$ dC9#?X}E?V%~*I7ȧjN156JxJ's:teOv:@*Qb֝r{vU2Pqڐ(?(@w^9# nE@ЋprGpQ*{7ej!#y5nx4"Ÿyƪ Q9ݲ%ÆmM hm_,M |U6g ZO9 RTnGNo't6`#(3Mb/LɎP@?~PB1[ >nJbY1a~!&tUȗYڗzʵ^%7BQ6H*<IPA;ʻ\Vb;!?yJM2F;-#!:C0pTDyx( !5urX \Y"LWdc:|qUwX8T )?fkyocWIbΆӳfg@YCL}Df3mޛVyZ=:漻J-(tRdx08|Ij~sI.w{A,Udo(EPޱ49'k7 [T6nvLB?{_$1CWBoՊ SFF*/OW7jj櫱rхdT%4qHUw4)$W)砽9ScI,:e7 e_wu@w-EwxgUpsfZf˝9 8BQ:d%ᝦrr%MI8"OeJ9މ׫uBadTN=NBDHLpt&-}LhQ$̋h酧rPĥxqbܑH )}7<>$"Sov&Z ~@**g¿fʜFXLZ `Wa`Ygi>ʆb-غ[7nrC@蛵#D*@op3zYuoka] 7!^*tD=~tE)V0ͶqMed>" f~Ag {J-Gh_2刲%),!0s,y5f^!&] v`G9$i6yZ0 L|GF4-k 1y0C9x- \|L*}+ ?*@/_a!i F'ЫXQ|OxN4uzI+p6p9*}]p.(.)kЌ*cr ,R6t7GAa?4!P&q8qlo%Z-novpN)!$vQKe:XL ц#Q&5%W -Үat4NC%%hH->^m1xc@5PV.!C I$ :}µp&E8S+IbLyON}C~{t'Kg)f4n½@|نk>? :7X7>p\nKUyqcmwЫ`Ruuh\‹9xnM |P~Kl魶h8`Rq3Rwcs@O\WB9!k.T56U'$+ A3bHL̕3fhM(c^2$,Y=Qb{O7nPsZ^V6 _S-d!"{$fPhlh|G{G5$ ~G ܱpTsBFY$rlӜiĥ&VNJg#8Hd".#5|s߂cmvfաL8j\'+V|AW­^FG(G:,pz[#TȚ:!#, 1My-G&i]F6=~=޽{/| 6 >½= iB`Ney6 42c=gPGC{Su6`sꃪ+ÖWVc}j 5CצK;KOo1jqKiT+G\n?Oc0 9W,4 !Hb89V>=3U=&ήy5GBM}b6%<}1-&ri'?5D ~'x ؈b>?eŮD˘v 0s8ϩ#v2vī ϓ(˦0%gy~tRÈtg:@ag 1\^.#ۑ澸*jOgh[趨Ϊp Id]ig4x^ToOTt)O`μOGFaAgsq?XPI,ЏːO7d\9IlXV4v&^G!>l'>^fMO+![f Y^~Xm2zUeZI DyH5YтyIIi&+J[oJJk00jQCC52LaAҶ_Feur_Vb3J|9|Bь816>_0Tm d܉>,H s bCK Nm&hf˯g 'FN+zt>>޵D8Ŀuq9|pkAZQ§w]YF5Cƪ')$Jo@YÉPBJ"|m1@^Yj$<5jz;vMS$ "%rjN;IuAێfv2SK_Pe cxggC?e_'D}50-)j w[uؐ*i]k<"]ʣO!`"_"Ot$xx m\X&-"v}qձa$zތ@dv@&T)e%w5hӭߋhQsP^,՛i2ej9:^xy4#Ħ ."]OWjy z_,X *e#44:({>x^J((w>ժWx< }*xE o!epI%~2qi5vbdXy V%1uv]z8WRgS"UgMG1uK<٘]W.v-G1t*rL9?5pp" Z~NdkuJ|mzvAߛ^Η7D\k(mq=c9KJ^mW:&qؼ3;zcM©^qlcXˆF7kmekơRtil8z"zk4XsEC2igh&qvP{bGi$!H']p.hI0{ԐC,Fu#c "NOvFwռ&!믴q˝]!{IE5&gQ )VIk&8Zx[&?XVeNj׎w j1#W$ْdRvd8!~7 ]QLUe 21*%֍,# uړ:C:KSrR:Y,Gd6I#̅ϳe'סabL7r} F>u2d?.7 .Kӡcʅwub[r*x"̎^H_EÏhIJwf"2zcMRِX#xtZf\;07r #0dn`>4mWEB'IsG9(nOͣ }ތF\@@9+0E=5PyG+ >H a"f6Ӎ5E&0rXVԋSW@א ZA=;5hVKаi03 Cpu{i\̓[NX=C[Q$Mh~#h1) <g\1R{iQBInVe/ȂDuدUc[AHFopSxs^@>eHIc&NNqt5UD9meW&5}U2t"c6,2SI^A%vO '#/j2Q|ᴣ_"YwOWz7^IfIA^a$o-Kopd[?,s gNhM]|z3|Y0du%ε:j2`{X]-l!$ ـf?@4ER`K@ *KMʳx'xgֳ౭ A^Y#a_o"ƌ㬷Vn}iS WTO蹮рE],ѠHCZ МpNpQ|FNt8Ag)A.8FF@Y>iOi>ؕva ` % E픓 D&Arȩ;ugG* lgs 25:N&-5gG~ņ:gr}9}E9 fvlRe2`@;/pdD f̮C}Y#*X&(!pq"۾X-M'e\ZoyI{Nl-Y hu(ſZ l~b&6BfX0dOQ[˲#ٛGz| <;ٴ9{ݳQ* +bj3%! =p,r$)PhPaUJwTڠ]Q' H2#z ؄^ ;l4 "3' vN ё,T$E3)mqgy5a5# 3@4P2SŵLZC۞tZ0@֌jÝ$&z2oYAYIW=NW4@E,8@iٱKI\-Gj{ڔo4%7)%9 Y9}ѧ& +Jdk'vꋱ(Id aХuVai$2mK(YWx@WC䡖P:NI`kv y4>󑌠МƑ=C,mEy| {ʪhrFw߂VW/ڨ1RvSux, m5?x"exSVs2he8<݉f-DtAᠣ^[.nJėfEQ]QܦX#E-C3\e3Uƛ!ЩxxV1PoU4 r$IvGWb@i͖ؤ$ Ob XQGnlЍjETz$ߩrm(n[Y.ٳW^t4L\H_ɳ@eGMKvI݆<'@0fKJ56̹**3O1I")+5}b`{ǰoB.ܻ7jA֩ƷJ-=aYGboΎR#'tV>Vzunk"QT׻5+5V~n@Gԑ?qؐQl<: iT쮤DB S&9cO/-urg,‡Q}q-lXϷN)Ab#ycXx(U#9bq8}逎!(Ҍ[rjӹMIM}nlָ;ն3Nw=QpWq^c d0ֵpSfx 4r\}ط DlYbXOh`ķU/n%i%oQ$$@6ShԲJ:.h\DsLh`:0;`.X~PISV.BP.l4;MZ ڏzM`qm,@䓃U\I^-o?$B?dtz뺐.++`deRDU?μj{$@Ǚao,p!v*OF 6#/ d#6g#yZ5T4m:.Uxir' Sw䘁B44N&/Ȼ$3F݉v k9Ԣ4cۥ%K6L eyk:!i̺5!9 ?.A&Wvy`%jg,ZNxP9.XO{9XJ?մNZպ˶btvdـ+%VueY<=tj;^iOg"i0 oweLK]ynW? $٘YކvS#6{HrCd"o BZڻޜk!O:V#5NZ]d^5b2n=ݑ.}m:"#6dh+NGșNY4Ӣ/em`q;-5->@C t %+x , HKYXV*$~hB*]S xPtsԵ=fʅ;<, =L%Cjl~l~'&s6>-)g<~_l@Pd("[eOM/Gv7ѵXi3j?/4 p2lQVC Nmg}kJ+Zj vc%ᮧWemh'J-Ռ Ӭ:C*e؅Gl8⌆> 6w6% R)ʖ|R5Fwleg|UNQ@p*f!9ZÖ~B 5QDZ-Pn9 r9u[=Pj]O'4!hd\SLX5'6?d;o,>&#`v:7*֙/w(MٷQ mbōq[cgPNaݱʪ62n(6sӷ:pNdy3%[ڀ,--XvY/ *!^SÛ5xW WMm" ȥd5CuVf-miAG=]W"Mkfm%ϞVZ\6 D ల즆'm\,spIĠWK&5˯}wGZYeKn?7n%C0qpn4 e~{G$)}Wb|䍣1 !vojF\NMtPy'2֬P«뺬 b&rᲮ4׮_]"hrq??I.H}=cf\QS"~E*_]mML$S˰4GF̓lNu h2ONڋ|ʖ  h pd8)Ef@P ,JτLgb#妧Bt'8ܕYszuoBKhA GG.6*yN*Lh㹚I^iW!R;jJ csN16xfr])@'xua$ qrlHi* .S}ۍ8.;qb;,Iksge1[6'P%d_Vi bBTJ3hi)ξ 92W3.z`ތiP[5m9kT 9@zo8iuVΠugDZHQm҆ԉ)^K/¦URnvw $~rv2h}fj˯ a+oE=`uك k[;ng`MM n z(yy)2qœr_wc:a&f | 2n㺆4D G0pA{OVmʆx&3M`mic,Wl58[U_'ZX9x.=.TTEy\، ZuBôf`=vZuFBzEEYAW|Pn;^Z]?*zעEcqߦ@g#=:>Pt;^z1-iQlEٷE^QDѶ< Xyx t ϗXy@϶uwTfeXȁ\y5d+^Wd#ݐ{t7Q #)~a"Ç$ZMc;F㯞G؂̸E2'®h.,pQ=3JGϚ8]\ 3X-uخ=≀UC;\Ή:mbjD*U'yoEn-qw^a{`ׂ|p\VtwF:C`Н%%s9J[kFwN/niOI πt]fG#+#p O.].ϯB{w= ?4UlX#Il-[Z߂~|rG3}'qH#eWpyQba:3Qg2܄ mJLұln2!e؍ti7܌Wu%Y3O#bg$MۺQ:ޙRzê|aKu-@&֎U1!\MݛBqV *Tq(IL . ES3#\\DO8L5lEE0||zAvv蛗~љ cC}ʒ{i9+ 50xpg hpZnʖ΅^Ry3|!3m{+֎դܢՠ7Ftcx.΁2F*ydY &:vZ>VdY=O4EF7ť,J͖Y&fctZ_GXg҉pNdeu<`|ÇyG7 PEIz a7yd̈|q*> nJ3.t\-@RWs/:3|6ŹlXO?Y a€%1ߐ XW!\#ӏ.Ks0 T3QXO-ioZD[FJa֎tIOJ_NqMd^Js#!=P!rwt3Q> j&+u) _nOU(V-D[-{rN N6<Մu607Hz_ޟ-bS4Of34b @B p?2w9` X#69[4v;%+rd{ y1/`3C\7Q}vIBR\+ v2E^HsITr9+Sr3op!9S>JR1 W>T6_rG"q8ے_UQ댁vmei`u^U6'PMHm ;†MgSZz\;Jfê i{qgPfU[^mZYlSKZp@Ҝ`V(uFY ?8 qNeϣ8J eWm:}@q͑;&/n@R/Rkexq}fsHjK!sC#ͥR:s1e7#Np~>Nmϝ~ECO _g[% $y'ɱYV0$9|c iq0\1MJP,_Ƨݿ@ogZُh/btnu ^K.G]?uFk0(F NHR!vT{'C|${ABp<[\xմ#xH)#qRJivzC{bVPvgݒS&@.ԩx{/h!hòzې8}6p VTz#ݴi4LAairhq/n !TG&m@s(FM(jtYpۖf#Pr x/󍸊nHQآ>פS2iJʔϽYs÷O)lRݬV9ΰ4l<`7zF>>`~n&s29i^u}KCWtcNs( 0GIqν ܤyæ: ` WLK6U\_rwU0xT듷0 U<'ar{°hp qè7}%U0"U8(P8jJLe1>D9[HryᔎNbyG߃tA݅7rWqŮ^d}57pV޸yf2|^8h}6v:Q:V#ès _D[7ͅ]; UkᅏGzxV6#xstރ%{'t2ގ6f,6"c,=#hhu)_gߺ0@+dw7>Њ7ipD#zT [S<2=OJWWR[ t] B(,^xj(No͇[PףB݊ mpDiqtCLSZղO Vo ::+烧?v5VkE8`K`mRc[=J'IW *o4k0v! c! x|%1FRKܚHlZ+nvdXo7]zQo WM'*wvx[!"` %R9%k:{q8|q(!H^M3#r|ͪU|5\x!v^ |k~zW܇pK\8>KR:s/r]:gſtnWu Ez,3̷߫V 'Ǎ,RͼOݾnLs=ǗaWdf#vTV5tǯUK̓bߞ$k1M*WƁb\q\T*5S }j_o:P)b؎V2 2l!1F9Nvf }A6qw<zT [@UܹucaVna8(޺>Zxu e1ŽGf@/ :QkmvabO ]р'q:K> nO?O=c&Z%]ۃx0U\lCfF,o缈;p>urIMZIf0"cs Yw 'ܺLO P+r!א?~^8YxM=;@R~UY] +},Po ъ?H|ZkJHWגo=ICM#5觳OFurH!|DD;T ~{-t^OsӱY(b!Vg)[֨MbF.d; 0JIA@9rs"2lx"|vy0r )8Y_mClB.P+g-e\,pD'w9[ë*X \R@a~Z7H^6.C=}n6K=ß[z{U^[%?[[Ź?kdJ >h@Q/Itfs .QOo-ȏYn.Qg^q&eO<@oE[c/_vd4F!#PΑx\ AKՈr@ڠ&$ƣGPt<#`PD62i"pgϋ`8B$!oG}8M5RvAB-`}k<np> 7]9WA7I(ਨlMJڢ&AZAwE{3[>$Mb ( *j" Tˆn˝.%vT􍑞lpLXqkqqs/6S`?!NS/ҋB uIRXx(mBk]cRWt e+F#s.A3m ƿ|kZ.FᨙKy53# Z|_G紑^hf®.)0>H;r ׹ Yc֋Ri5eEhaU@d "K Xpn%;@#%_ʹz՜L`g8y$R;gvT.ݩ6 +Ѩ7AݓaY2-\;bOOTO h7"uq7DT=4= n E ?R\sa裿܉,TW#[Pzv {c|/3Ki^Sp.®\]{ڸ"_gV۞:wI0ՃO9CFAnF^.*{klg-4 wрG`彛ɥD>0'W]D"Hzy>p OG}X^ 3s{twe3+Y2tc|N RDʀ(FMKzIFVǸ7% ~7iGc@hi#?،4Y _Ό0cd-YXY}wd)8˫ŝ[wd\fMB-@hzIۨGѴEn8zv7M*ꞤĪj3q/b ՜+/2ݓhFp2۷:J A+ך+gF$U,Z|c(5 m&L6e3%m 7/ Fܼoɐ!N%E ̴ qCURհx. G<6U,RsQ[>\LEa& & <֝x']W*;SA#Tl]{~GEJ6PQEtgsx;UX\|E KXuQ2U+(:y\aTN`'Odhq:VʻbhU+yj9&&W$`TԘ,7[zըּL?їp[g lt||&& cb}|S,q׋[?0O| .$[nvFT&y)j-]_~YdlN?!v`/ awdGM֍vM9fu௲:*qflQ%nו$ '<" ,v3br@Jd0IFJJmQ"SGx_*PE/d8KAa #DTfa}NaMU[T=׷@լYA=eW}x *:JUM9e_Ѧ:hvi3_x+.[\7üyY(ΡyrůU:y?tlQˆ /P-)~D#7~}6Q "0 >( FZ7 / 6 m8cv׸(iThy˥7Nc̃9rd^I=Q
٥:ئhۿF!xEAc98=rKbf$KWb:4IIsETBYG l >6`ZU|6wB}D%p>3:kc`mN֧ odqdLJ0H**ZTF!+&T80dc~,],wac6SnWYYPO؜#i%/rӈ9FƄl@Mxׂп:-eN@;Mb#hh0rR<kl[E #1's" {P(ڰTqTicTUJ5rxT%]jR2Ve_[~ŠI֪*b҇ChK't$HתLTx\< :WJOF \_ ,`#)10@N . =V-L#BRQeLe$Q10dn 3PT$3Ff # dPD \oF$Qoև+(?Cu$un#;J 믯ǡ;# y'JI]Գ/JcyD5@d]iN%nvpF`P;|%{n2jo)t YerIYmk@` |nS HkBHy M|MNL!Uph!}bK'g ;qk5%7s,/e.t9Hq /C4 /H Cve BZx:²<孔g_|M:Eʧ X,ʙ*mJ7oCԖ5d#ڨYB"X`]6J5lnCua˅7%0' k4˂ $ӂ:/-c2%V \^%bJ΅$^NYRq3;[`m:vҩ7 ,{1J3hQ)8FW4 6%bCTф `G-ݮ=^ 8!4&YY&ҘZacAB,Y‹d}aEt(+3Q̂cGyZ _ T gS+a5b0ه9A"0C֓% 0μ7rvY§tlEjL|Èeݩhb̪!)^JwQ񬻛 ANSjFyCv2IC dj՜U6reGu`:#R/,Y{P?[spIČ}Akfnj׹m'Uhʆ:" hm ØXjqaSu1ĦfuMՔLGeyiQ2gcϫ2pFwPg0R#vVJVcGϿb;#iB.[P;2 A:d:WP}دFVDo >-·Gi{M)-dLtwd>H,tl9Z\g9Nq#v ,'˗rmF$?,9V1`B!߳5)\Q( A3W!Ktۂ#;K bSџCV͏_:$WW?=g-?dY5ۿgl4ボ;hcY /*Hz,ji0r@4}49d7ǣ)(ܯp fD}j7eUczhZ!M[1BzYyk`(TPR7cI -jxńQhc$ӵ;zoL̀zT9i!kB>! Ѳ^@W˲GI5u6[ɴxb,!GU3KDD2~L),W(tNP % ֜5Kh*&Sb R$*KFn-wǛڣ#xL\)V $B\ʲB6)s"z8* >VQP`2j%(VrtPX[Q.|+8T%YP<%I}h5dM \ E*(SDR#Xޛ% }Т`EtuucI钙Rԩݠ QZfjłI@@!9608ö5" :H9w6YaH^r;YKat=~{sFmi a ǞcC-ݤ, InF4sFͣ]̍ A>>j8-o|ԕzO+M4E$Z֊}ȧkD: )/+R0=YPmEZHg.$ V:lZedcKQR0WO52`a&R#RDzA+{ p+aXEhKq"`?xu|LC6y%Q9T~#Leyz%y!bc+FMiR"* [E'ʔA`jL7zHȾG<*D݄= z]31[;̣hA3z4Ɛ'1xJfC˰0Ld޶Q"q . :DaaQlG&j 3 ה>NVR *_4V(px$xnaX4 +@aanj`\$XZO)Sdi 6*Qt)Ț3Q ?`\1~ߙe]W oV T]7ũ,:f.*9XLzf Z<['2^d^U܀ Ҍ/CM72K}spRޫG9%gv,s8pgm <AV2aj`@kU=f*ֳ8 _vKnpɭ;q VZM6i<C-pX _Xcqo*b{Ք>Td3gժFa7cй[qh5 #ȆU`L-f_%?v'2K[UX<C%wQ{c+A,u D&M@l- ƒ!k.!»)Vݘ%CXX?ZUM?f0Ɵι(LTg\Ep.W;4T30%SW&] 0/Ժ cX|B93P]{c;0jSF@9pBXTJc1` YąDߩWQm9ρfmy+5A bV <) H2ٱDʘX1QqAl(HOryb eMdJ҉ӤB}fY1{h3\Y7ȋIE;#c/zҳo3W/5mşQ[C?_x2WvF$gv+ʸjf!xr\oec\y'&n0̒|f](Ωk3'bTE$}/IΗOXW&/o4I$w2VvU`>wšw|TBP36+4G2> & zҼ ؇/_zyG۷# r@+ٹ+(j@p@7X&Z ۮ2[#Z3sUv90𻻈HT"L\\ԈB6JH.c/)s잰Rv#w/4UMT]V]xA3k5-}Sη6x'h rdp_7 :G؅pfNoUDgR;_8?+dcHA*}qJ  ^\FTQ0V2Ѵ!x%3D~Ӱf  !"Q+2a<7|evYŬv@勉v* td:)ٍ>mKqsRw7Gj:NM4X0Soّu[.p-Ѱ_} QDvqGٖV50%׺ɻq"Y0/,Yo`g%|n &RpՇNjf&93C]UTzP/5(2༧O!{E`h7iLz%)R?1ݯ 0T , tR}PC, ^AaCܺ VPE/Nq &ɨW:-'6@"FuV \Y+́_j%f 'g24ɋƼh^5KC!WTFOŷ#wyf<}DM,;KfC| x4 kϡ".K$Wo9ttY<=Yٰ̛ K0R]ۢr>nZbF6\:l͢Mqk("͕yst_a <Ͼ/ Z WۢJV@RM9R-U"\./ ?-:bWVGK>ӭ3Wv8&<gߏɏ‡ξoDv9 sR]o'dS oiݗ@{m_%p]eb{hޑ AR톦_SUFN1}?[`_h*QOTB'`EwPCW߿ہl+3 !@qVf6M _-2<ֳ.BNEQ<>\ VI/i11]6-R(4Q\N&"3Aم'kFb ;)f <+},><><+-: {|/SiceG[GѪ!5]6V14+56kg<Y%_+44iRv4b#[F"~jl0S 7Pd?ճ[VtEt_)RQ0U$jvm5)Q(gl*׼j\g[ңv38AݟaG?#qiW=%O#@shO ?,~ d_( qS@~A{ @EwЮK 5opavY _xb6(.uHC. [O u&ˎXJmH5Fclԩ-^GY([EN|8Zs;bd쯖I+=hFop͈WQ KT!XeLԿ*MU) (ldmז|վ'Ml$a=9 M7fәd{\x,/rL<gbntUPz]_XͺY uj:#` :bpF1c:jɎ`j[Iܧ-h#MQK,VxDL j sn YZ   4"15i↨x7S nйYCbzvQu+m)KdL'&<9TYGoV\>Q>0}L :a߰lnAug)VӾE"~GO'h^m(Ƒ<&cXE`$jY\ M3wE '#0uVx^b?jH 袏Ѕmz%͓ 7^LNu k&Skfu>ƾiҦ1@e1?I9[,v̹@~2)qT{I/{A?B!$P{zw$jᒗu²sHM#j{_+ap2QX~(HlgjAo!KdcP+.eX"faAӕjHW np=qDE۱&[^pٰJRdnȼ$hX Gh9B鞙~\x%$Ә.GI:a w@$K}5US)d;f&6Aߪ8+t)hW =1t2ɻs`Bw,\# xXF>oлȟvLApV`ض0=h,{ @hWo4K8>ZϦ#t܍ިWăAe@ϧhp2HЮ Ԭbh2BlkV{v+5|ryFsܝY .}7 FgԧNuͦ ( TI?Ce kuyG9_,-pb~|VXAQ|nIKa􏔕ҚIt .%4`` +s |wQo<7bk`XY^^?Mn,.FKx)tݤ'b0~;lq+|,vV, L576="QRπ"i3sM1PN*::Q7_m͇lX32/6+U入ZFW; tRWcDDx!!t9L<^20/xkt8< 1 EyMS͐ s1LW"X bs@ݞ=mOi2}CQi@f$$6 ~MF"mQ H clU.ܕwTL݆gh_3kHi)bpJ4!]~2M4K6Ѱ[IKfg2*[$L P 1lbm=F/|$S5Qd A3HT_œNS/َGgY1P-Tħc0:SP FN4n* tע3J@V3oEIG]/g-4 W ܑQ2 ˥4&o+w.te)(Kƃ({Dh|4̃66z8 7 6)'Zxq,AֱLV N%vx誆Xhe -AE,Ph {^M9(Q˦% a/H_÷%s$B'sk<"9D !dQd*n"b K4?X "m~|'IكA_`O\&GZ$Hzvaf494@&IgGؔ3aK@W Rc?$iRQpYq6!?ŗQJ ]ߔ ~ %-!Skdjt$o}~a {jxPJ'RGJhZfU꛻ :Y+$Ɗ8i_& TqD-Ȟu܎wWR6{ T/qDGEatu$d9~^U=KM@T@EAt >.@Ұm4 : Zʋiq8huG H|)de(5uVL}Իk06$ X{QNH:d%%Qjntj\&g7B a+ʃz(L⭌BOWiJ|4WA#IzUSn |݅Ëzy $hgԉKXj"?"@hbi2ߎZL\HVdY3 GΛǃ4cヒh)2ߑӢ{ rKJ0Iro쥪p/ U 5NٍPQ˖/X o&eUěhN[ۑMě1Cog Ŝm$T*>>C93R[qD:M s*30_ph[).NԼE0) !F #"\ ~|FF4G璧hϐ+{nCJô m>,-4zJΥt hoXnE*(;q5*x0F;UU/i2[oцg~G)YD*f+3zRp ;U1xXU#f:ǃd`gfÛ}=ke@QBVL0Y<y|vofj-PR 9ݴq3ޠtajЅ riYJW+Zgٝt; WZeCW0} H0z5!{`+g5 H_MJMpZGnٲZj5r)ʜ#.9[60s3;PAZUbң0MA xSpvmF;\D.ʇq0{=Ba8;~z@G_މU&(?VncAn aa:m0FލZQnG a /Ҩ *Fܯ>ijGmͅ`w^w;lg5ܭW) Àc_KWqh B5'*[ઘ1[ 9L8q3:Mh9At'&ˌ Z ?1 W]&ɝ>Jr/r&/]j̚Θk67ahm] Qa]6"bi޸RMQ5ݤ(~p 0KLJMPO9^fVuwv$SwA{TR$=;l >Cn23 ߤeq#o=:[3b;-!uIf]$Y2tytq\ۣ@a[1; E)_8&/Q '`t(dZ o1)b(g(ppN:ןSDt`90 @&n?x'p?Mw%P﬒`7龊']-&x;&`a}JC`P\\RWӦ@j`a!W(YX2F@.#wԐ>Eh oоcn;fQQҽBH -]8!_vg9D:3JTHu'P[,Ay]RL7cԞ1.sG{)Q5ogm,I]wDFQ'xZO8C[:Td |7N-Kdаt!ل1S=ʍ*x^HBglg9,ѝH^@ꀏw6MQ{NB@ 'L}Ey,ty5@u曘e=VgEu:salkKH ozɃv AV+{)DlY&:pT0DORb)>X繢gat309 ;!MIw#G!WtnLj.lm2~0G>WP>)<)ppjFNLA@2:+v*}q9(j?K\)˧(#*pTg*JSAy)l4M [${:548o& FkUz!| d}N#B&t"Zl ,(= hr=a)NrJz* SZ i{ٺݻŴF>'fḷ26}Ha88J1i5!`7s:\uu~W8D񢐾*%ըx@XcTMQY':[:0xA^&z;_3eG>Q7F۱uaS|O^00k%,5z"7Z#8>c]r{Ypoƈ6ooWH>?HSE]'ȝTh:R(Nhm!'x ݠ$ x#|CnڽNfF&J,̱n!H*|Wkv%#"m1:١KΠ-yx J{&*M\xM,-)<ݺk ?*5o@#}6٧fI:NcgD/INC(x_N cØJ*F 1,A@ε`ϐ+)t4멫fK5oS:bImZX ຾E"P7K!H@ő;nQ 8K9k~9wѸPԟt9+ﯪk3 q"`)a;1xw窐^Q:A+ Z_>eo@>t%◰h%|& HrN4?ݎed>+QL*-M9盩w}eg,+Y^ Ft0?y$邈# ? 7Tsvu/@C튖F8?V7\Z"D1hp9GQZf(Vu诈ve@t/1=r@3<P πޓ r e)bcVLQ[`Q z3ǯ#Au9sF?=m=f(ј1^<ϣǓi7"V  2Vn{tu/l| Hč(%eQ2:EthMCRK1wiлVsD*5Dў\ q)XOCd6T6!gɧQr қ-ԗw|lc%· o#d׽8ߠG|43?\*bZ gnK~Ut#ȕT_!EiX/_]`oYLLjH ֥R2Vٶ&\l8nr:+aшBv2&oB9Tz;e_ >M${oIc_ZtRr.4}d9 U2븁ŠD_b.3E{Tj(Zܮ syjLW,3] .ȳD#W"YwJaYBHeyt"vʲTzbSKTmw䌶j Ly*$[WܳN0zZ'JAj8΋4{aKCRۚ}Kho)G0 D%ZU̫!1ϡ ru 3}};Ծt tK{._fhJu`@/+FUSDydoetוӴe6%n~t}.N>C(fdF.-iH߫r2} 媪 {ux,ՠ[ѣO1xor fh{yo; FmHre=xEEAӹy2tǵMlUIۼm2ߦd5l!!5f~mKP[E\ +f;/VlFӕO+Ip;9\kv9"71+%_A}#zOk YڵՈl U.EZJ%t0 <^@&I/ISVvxHۧX@u4v P1^2@Uר EE"UL5Ѽ]yng C69 oi>o‹XdU<)L 4 +OHcI{GaoI{G+fS<N^O=V/=CלB\"@̎4`ky;6v7)Ufclwl4:뭅^l\¹u&X0EpU#R LdDi\QRjw35 P))M2UȬf&8YO*v;Eλ`xf-]  ۙTG|[@LюūoK݀ (M"N6u*Ҳ`*g)0D P@]7Uه[LZ[E[CCC)G91 clJ^Gx% psOE"o&)i?@ ],2'@sF*??8lj' ':F/Υ3)nMMImbf pjcsst"轠0@&!hmIFRwۡZ)B]M~޾7~8?$&6&2Bquou~ϼJևc+)&Ê"FMvc$֐ D$vn5״_pS4qW֕!~~)IǑSZBZ~rft~;ۓ>6t(U-nj̼*t4]-lv{rQW+(Rf箋|3#͌2ܓkGiv|+Y5S^vNpWf-‰/ Nlŏ3c=*BRb*dh4MgVD[7]Nm1V"Gȉ1ܘi 6.Ӓlnbu1od>$FBfv/dy3[iesXxN }=eUJlw:l"Bq:ݼ"G,?J}>F*KLG̨͘&p\P:GtY.8xu'9`}PNq4)CJ$bHZe25MhsT~yB;3=@VZᷖz=ň'~Ku3 'Mhe8Ns%3V^\{Ĩ{y?E3 cE6;?zt=: ӬFn4HdG"Qj%q~4Rݓ?PSj4l֬ԐsbUjߩD:~~jztd [] )g"H[\ ,ZcB m>rhḘYW+0&of -N98QDajq \X ]ۈTP֧\ئUw}k-gI$7 !)5?'(9١N2ѽ14#  €޸?>w`jW}Qߘ:6>a]h ewIX)Hm#tkx.q`G(1͖y,*9\u({0Hbﮁ0ќ9h`#TNx0@"4o9q8Lyeu>lL_6 W J"$vEQ0!4ݤS z5U%"8,2c<1Dx*PRCA }ք;{c7̢#^ySi&7&x =ǩ5k{) ͺ9Zlu G&rAL0tj饖,1&ejϑ,47eJ_6E1@(~,g@<-FZC$W N$Rvz]0Dߖ6/Y.(!i2lVz#rY.>!|Z@y  CF$œD&{#+S=o CU? 'V|"P쉨( MH_." _$ᐗRO:0%ⷥ$e;D YýǨ2L&ŕ諵!>0MN\ NЭZJ6hba|,/{` h~/|TOPuYylb6*=Ȱ$a KdPu3PF,XDh|>n|v1434fQ~VH ڂ4[&)6eF%,ނBYI\sX߀@_2P7c~GQD0GGSlOT:`T&mR3j\.B‘)y#ͣE_ԽQejrAU+4(j^/Ho0|}"7A3@=w)DIƒOVer92IZEfJ=FO*J $^jڳ VtJE oҙdd!(6c|#A(,e@ O#G+;׳"xEps)M2Rm-.`-h[!}xdy>,a0nY&'ы0L{8zW&ǙDӃF3$kH N:U@+]4ѵ8 >%F UoaLa. ;Fi |ŦIxc2XK5IfUUGcsjh7/IQ773 x5Bug Ǡߦ7Pءo#0d0UPG,%P'πkȖ3Y-;)lk@Ī=؏z}49;LkE߼ojVp"Q<֤a$&}%fX fDpVqXڲ1" >F c2pne ICKgH "FIgk;tX!OĆ"+Fs^̘\ɑk^H qهigXf >鋣Ro9y udz]zg5V_(-rq.=. BFu5fbtV8]94Ujס`oVA1z6xR̓Olz ppagw)|xHu%2S. skY՝P$uJΤͻyhlll[19#]ouEJU16utmlTf|AV!y٢ʬ&1b1"])Ⱦz{R~RldiB详=5iaNUm(foKH+Kpp _R4k[i޻ȿaf\ݝȔT$3]  @rt)Bj:@dѦz%^I*`g).'LcԎ }S(9ͯٝ;x}w Z +~mϤo{Wۀ9V9v+nG+Ķ[Nn[!v lۄ*4^Y@ۭ 0|_yq`{FF,#;ЅXWX%;58MIK8|&(Mr*_:No#E/,y:}v;1͋m9KG}_N.KeA^ʺR:jtQkz~{.c`*8_VYn*^ݦbΕ͋1noQF\ OYdpWͩorxAjv&,l@nP%*8fuhE 1=ȼfl7l_>E,lp*pKŰـҟEn䇾֊$u\ )O!j'Yw`WJ.2δKIOͲԽs.jbX(t);`\fD)6r,a-B4AN)Ym[f^3v5Ϛ\Ј1|e 0֍HbT>rrUgU5p6_Ϣgp¿I{v쇃;R8v,, :'L WDv]LVy=I2IjF;=-La.iŦw9Ks~fyˢu*: :~I66]"S8\^Ȉ1ԔWUuN _~:1%$<_TiՂjdu~;u-n\vg5l|wqK}/Cy%Ͼ{ݳ^^NZY,q_h*SyDHEkam N}_H @)_ח0uw*a(vHbvJSޔ5Fr4ZĈ8@D[lƟP$&]zͺz$0 ,j^8 U+Oy_G7QtEĸe4Yv"*a!_-kw/VPkl74HoБEN!J28Rdpj4B>\ν"Y߁sw7JL>~Dvn~Z` \L~ 4#v 6F42[OJ 9O0ܞKOޱg#a XsEq.^%~ypn]?_nV|Ř{!5Unt.Oq~2*|ST;.ct5%y~+(}e]{=)D]%Mn_;ԲI2TYqh9;m>i>?GMW*4ڐiߪ֨`#C)8;ivd4>>#عiGbXhHhcSrZT=s+XqkZ4q1fx`# c>L21 QCOPD:~'B\!ș` i}W  Qne ov$^=Eٔ~w('xS .'E@R/rAN3Fd8&wCM4M~L*W-Crt jb6-du" +^ڃ+%[5sbzkUkBg6SP<ٰx~\ ؼb`b<)Ԓl>ih%]}1G$\6Y26Akg>X\Rk~3/6~B7n? ԲZYʰ\ sdӦ% 8{g, Ś# XY\gyCpdU_eA6MK]֔c%=VwQ5{P }^N+DKmijN@ @K}swほ'dO!2?$Q'JflkF?~2~8ƣ;h@ L4O>}:z֯%{8x_xUKNzpZoP$yQB|dzYx4a! ҙIZ``B78^تOPBq:R~@-%OhxhQdUșVÛ]'oTxS(DՍu4 ղQZTeArGxP )8B`0T] 7R/`*|л5N8 @vH"\S@ i@:,L DLN̜YTw"EiGOv=~yL=wNߌSf !v?-4>`EK2Ň^P:kf0"ʊOp~ZOAH)L|1FVU]eؒч{j ?v[9$ ܮ_G$$rplxݯ].G"fIfD(! >{V}ts<zBŁQ6"ie%aFMdunq>B2+EH6ݗvG"b vlp!lUOF"-sX_[BYϦH3H68] P04Hi ݥw=vHYY8fAtY{P ytz8 ]K,y .C_`.j_.8!u"y4q(JDX PX*)DkhX20Xq?ԺU|x|dM,Y$qiL0)!\Mn}y[kӢe9?w>{vѨO5x4;mΓ#ojZzbIDeg;jl9VuiU%.9mQqTbI`tM|uZ,.$RwXp?5YTF30˩OL49XAvgJ|ygע۳jc%lb0Dúׂe ӱk(\'S 1HZE3"@O#\Jd5f:byy)m|"9+tܻr][U/T HaL?TL껄~诣"_GaP9 DfQBeklu~ eFlT?22Q+sr`{ 4oWCM%C~9e{;x.4~lxd!ῑt:!c85H&ќLF@'R&;M4 T\fArR/Sc[qcC?pV@##ƓdD1v:v(ܱeZFG KC.MKT+T]`XErv.X}Mk0l @Gu1/ dBpn}芯Hvpd2+|9A:6֑7->(cv.,iR1i]*YiOx?s^w;TSTtjvxs(M޳IﲌJYDa Ԇ*?q 0kC١;R3)^_/|djV)<4sW&A_F}?E5<D@fW;Z%q@ y$7ӑX^T9=3=\O,87Bs9g;d^:K\U߿OSV')r#jra5Qm ~!7DN {t_Ϙ<{+p]"= o1U3Ƃ!nWFxCVݤh'~o OLjr`h.xzhf2 lkh#N8vf!O }vq觟2ˍc!FZ4$cBbJ*^1ݫf ծA(ThR9â`@Y1m5 cifct.EY]-;m5|[;ojp۹N;[gyAQ|<ٷB`]e7LsrŧPOs-tdȃ. ѱ4L~'cJD~g+mzK&=FQcNylUch/4{c$S>K,rALƓF.̟lT7_}Y԰}L?ilc0PAXp+cߪ̉ja^_qȂfNF,qBL L%+gBhn(ㄢDOqJiD(Q 2#8YZNXe6G m"ڞ+ZTo kvjNR~LM7#m4 v'7l^a)RE^猋퀠 jv0?Q7TCK,H)̿Nh@ymz&UkDHlI(U}Zg6vGSpP%G߇ T\vm^'X -eC,i=] bc@Z'gheJP3HԧF:&{=䒫Zs ^u!mo`CCxs0P PP"Lr y\7˃^6 2+oI"M>[K`HzKLX~Aww47h?3fL9Rt[vhr5"@k ['PG$|)Ri[2g(+[saUzM^Yy㴟q3]\ VyK&^Xje @XE0>pj5/}/et&1e'3_R_.眞paCbi)Um_1 =ԄE/-Js. #;Zo?#iTa6U+']ճG/g#Ǡ!psI76li1vr(nCrrPE kSr(oRLFrqGL5uM]#B{!ݻqNtUh[1W"Iʶ>jqiT\7=VJͿ]wMkѽWѽѭknDWox^~A Y|)ּ.FRڋ?j=,n,C5w{{HcrK\W}y7sWCzG]@,Ob6z؍S7ՊrY_f7h٤<oj%3nMj&a5Ge1d%1'm\̥]K:r;?,{H!\Uc;a7bgh9KէCj%Pf(e* 01oTS,2ߣ@fqxP8jD$uyYkO~UehruK)5{@śy>L̿O]đǞDR.3Q`ks ;E#9>h5CR eͼTT$W>7r?MGe6jXGjf˿[]+ac,M-pJώhl,%[k WQZjX)βXUvP=rp@z8jZ:S#Y2NSrQbTTlb'޷Xəq b- 5jy` {ѯxyq)*Q+XDΪj2Wt̕wB?)_fYZ3KLܡ4uˢ=yW5qH3)B鿯|:2xLXPDvl?46*j׶uVM.G5J>:VZk̄e"b""~iz2_,^_g엨VNqAMlpPN:m㶳ow8׮H0L eն(kPBIS̀,mB٤n@U!is1J_7T?mCN)<@XC$b$ w%Ge!`(()cD+ӘJX3sXiUڦsIfȠ Ra$*^G@%2򉧵k]zE7A }t%LR< /ѫABA痳ʬ ¿2c0嫾DV٘ ~H.UM!TfscE+qT}RdERRӳQAx u̗m}Xʚ`b="|?01&]r-3=IU{ 83q )>km 76Ÿ1b$ĜB+QLY!98lZD?,QêU_@Sn˛J+CѳfTߗ9޸?mzў9ͣ:{`lb~:H/)?%Fp۟\[P=h 7kEhEؓ'e5S!&HmOp|0%_Ml6V␞$v ٛيFR/ gz rX[㎰VD"E{(~ҷH Bg=N ,h)D` ]UwU1} 7И dBB>' O5;Ofw!\є G9tNËpG$"YU#St=a.ggaǐߓBp;dב lP/+Nv@ʧRKO`N|\Y1WDX B>P.'YD"s3F$߉6t@5=YmAAXSC!@!НtgH: ˡle@! bYt=-7+ɠL (_-ǓOO&-f0]Rn%٬]"99LVApw9 P*e(-U@i\yF c7 I~1c?GΣD"tr3ŽI?/}xZ(?"R*F{f'r"jic }g쫅 ]3Ѭ0dAY_>ANjoVH'a&WGȩT5n.`l6AE ±r *}<1Mpܤ/N)J:R>4N~I|V;P4}Sa_~Ǜ#?l}5ĥ3ց7iQXϩR=(\n k #yTv s'gzG|$zGpɱFG&jBtݨmZk%?a^oI127JMfK5-WkG3 )/p{GVVIa &A1>v$OtR=~3B W9U;DE-^}?1k?9`?Q[v_=BWB#> ĕVSCOcl[ TnY}s>4گOd;f %+[7@vjQ,-J8F9'nMlY5 гo-ʬEADڄ!DzlU2?j]WN$tڍb *x_4p"觘`E=&ѝhI ,E1TsDME>{ 9˻*z 2 /8n7a;o\뗌 g &nm.DN|{aYIԵF wt>枙MWI_ˆ!%4+F?#|w||0s+ƗnD[}E#l=k㱗l!\TjQ)nA4{̨/ĩt8t\uJ"ͽk:'09w.)o ,!X8cZ`?eJv&Q'Sy/FyDS5-,3-(RX'JPG"1r`j>.$kU*'+ԓt?^6I-1,݉4$NͬVPN+o_'[c !=γV^.l\/o K@Lm+"A̯ngixs^"DWo(LB 08D 0%ϔ}ؔ?**U=#cU w~(N97a齼-qcۄe边W'M8$HIBSa^珀RD"i8ʹ|Junפy$կ.Ϊ`m8:iø?6] $Q8 2!2!>z@ۦBU'\a@2"ܱ+j5y@זa)WDMJw )e|*~c1H8n;Vn!|]NԻj,u9\ Kst\kGJٯ3 [~kiipJ\ܿz(BI6cOD1FE3e7>dNܟWh{l$o_ᧂ.*R3otH`"ȜtZYxMɨOO an=uI!@HbUe 2^5 Br.3k>)j^F\ bASuvO cyKtVG>* ga t8j/&b> #B251iސ Đ*ц> %H=\pqpFB7g"!e= @ ﰌxO}[ %kfTa"":[!3c/5#I5P>2cc@P36, (/8zTh[ְ!*.6tjK*TAC=.ځT_(ZQT8b_']juBDM_{qx/?[(c=9ȡ QԷ9YvBVх-я莫g`;6#EFƟ$,ƃWp lffTU?:aZ*{b (мO"_Ugg4v+!/=b6hpF:pO"PjO$KSNPCق:3$XV7W# bEL|!BO(H󜸙l NL(dEQٔdzB+^zQw0%)ߔ-d>ڄx-VnߟL!-oJ٣r߶R}{>O.K]>sM[8e}CYEEGccEupEߘC?[0KM2.oBd|WuSP/41FEʦʴx:eƖ4( 5-q 5[DP!I$}&ď/nȮUQT.L WB<}SLOBO^wu${$8V06b϶yl`]|J׳כxV+EZ:x&HqO?>dbVa CW0JWs[$qsl}{J+;4>K='=t(DlæĩUW&ŝGhxhJUflWwRJ PEy :yH nd:KQGg@ٴ 6y3%^+0I%Lw&о>wGt nA94ių4b/("oG{Qw`.#>V$q@ cp%8|ww6!鯚ġo޾B5Uk=2{GpLԳmf^ kEPhnOUjjba[K`0L)N*o2eQF+]7s "4reW,sjĞQbWt$Dn<ǽuX1$ڃvG?WEZ_("oҍ^GZ85ƚԗpĢ?Z[\idicoQ.3V#vV*+ϔ~F5M5C<,ؙ8 PHY#Y֐f fNGF TxuweN·YwǸ2Dttu"l)f&1w33.6m N)>98Z%p+[17ˏ,ގmV6!E@mx9McA8L2K*Evnro9E*@C^P[Ȑ =]Bڔ(sMt)%ט0dkP[B_-ې&ratBNO C%u4d< ㄢJ6n/ l%c֡¿RyYt0V8Wz @`NfW }#-BG "I#LWT;G囩oʃeyMGjZ^FM++UB $rV{)jcuXiP QoܷIK̝`<;<7]N8z[>{5}žBk])dD1YOD_ǯBTj;5n &ԇ#4!"-SQEKvLQ\F*hI wAO2veپBs .ٙoY_ėe{ vHC}E$wWF. L!)"ǻ dGM ?SX݋( n4bCe1Ʀ%2./-0tEH5i-ZR-/wގH <ƕggI nF[I21k=hSNӞXh+ٔftcIׄ\!8 K:9 }|Fim-`AcDCKWzp&V(CRe"~[_UgC2^"d\}wOsEU׷!s] կ[Qe{:jF`Gn vq /h2] p]?[3eg,ifxTRIzk<3),Xz/َ^x?fưlPm$TibxLXNŠ#a_1ڏ]wO@Yn=.0d%3 N$Aڏ!fqi(-Zaʂ …(F}2@M %5{=5XhIqu)2H}EK{oŤTXRu{8 K yA8Ə4:=@5#% /%m';EVPà?&uԼZGi]_ 6"wewim'Qo1b gxLYF5I!prCV=mɍ/BO3d"63%vΔaVQ+#0ͻVĩ+LacXYxJC|=WJí;NhJrBl-NMo$-~I]{BEѾ1[γhNgxa]zh3ȴ @F3zlm}IBUchیNU`N8v' |2TYT\q'Y ʟɘX9,y5wiSQ烡sb%䚡߻旸g+6Z/GPz6SӅ733*aJDX>6)LWDMާS|n<QgyXc(1 J8IL RSXRZ]T%r8&l eqܗ9 ƿ>5oC+sBiH^J v;q̷N G~B`5gɬHyAc1)1 ';>k4\iIwtԽ+ 8E,&Ǯ mwVCڊwd Tÿ'R,mS[[S7MqtoV#r!]6+apÒYްQ2z굺h)gQI3 F!SzeWLdSaݚE\' ԫ!L/اsg++'t.KR/mC_rP d oH@>(~u6)6ҼuZ 5>HM[V;8Aҋz){,$ )yGVr|EJuesc1Z`11KPimgf-&'do1^xMD2FPƈ{.yJ1TeGG;6O-3rߺZF#NXɘ92y>pUslHK{Yy3Z>r -k:.EA9I < apFݸWA $| o}@{Ư3% t6T)KK@ai9ul +j#.Wq4;Q]]v0n! ~զ|;i>L>'SKRѪз ͤo},:J7IIVu<1e|=' 91-Ǖ؍V4*ɍHVkɭ9ݘ>M*݉M߆Ng%ܸcݵ/97ٿ_f/k29~](U# ؽ8oEs7l7'H\~U1 œ׶aB䴤HN~}b09),cGYSLk1Hr|0gj@M}}.n6.K/ͪ}\Ay &oI){n:f ?E%MݍSAZ(C:;/z8b!_~OFps.@V:§.0y;'^;+z2 z/(#R=~SP`a';6(f??B3 CDdqd"K&zC2X ?Ϩ:|*gA,/D"|ݰQhtʈ)ʈ=ьVJ.O$9eocado1WnU&IE$s6O^ V+?u|.PmܧWUe201qDKQ x Fc>pl<s}V'"+h{U"I>q @8to`4XA ǏGy҃ghGu Ra\}Fi1wf(§Cu5Kh"жӒ7FRKW; 7wU]6ZW : *lDM#Y#^\".{϶DKt-9~3 %Kcb):LY:]RTܙ r-Wh'29!gY*MmC `\ŁVeW6ҩpQ~ )$2 ɣ^⊈[{;c6WbFڞlb6 \&6t Ha??(1լM/ƲTb,5 *Xà2 CN$u5ԩҘ@LLDOɻQ5BJP,M7U "n+: Ä3-&#y LQVUbTGijtTL683g4SMX_;+NeCE3e8=SC61^KVR:È ֙Mޫ~3/{ˁjXtJ.p@[Y-L"*LIߐʟMLjV$O/yt3cj`'.`[E09gF:]6 ʕWSE[09w-wI|)\pnA+%mWr e;~1G,5lE:=:Os BLa#C`WZ: k^i*&%=K}dH,W% y)w;{ViB#_#Wy%O^y0/tp=z?$%g1qzRG/3<{g*3 0Oi,TTYоSaGGJ|C.Y # a{泏<gSvD}p\C-`hs~ȥc6 e/Ty&P*I1#JUO3m{ϨKٚ>kYwQOvFsaLV ω6s2@>pEi<]gޒ#+k1 ˚@. / Qk`2֮7'DGf%DdEcl6n{ ?8->5^N:/e!N^ȷ*X A=‰j.t>ae }MR;"0,呔#) KkyXB,0(;ʴHHhw))ϋ~v x{4n%( EBB<"/&Р[xodgU_;,^8p?1pm"YlrGe="쫃5 J{ B㛑Ļ~WW͆9(F?)-I +fSȯhP=1T5߾D: (|q}2C7Kj[+f7Xz쳜{)가?(,zvn|5dnMUR :RF6șmJ4p,Gx/I&^/B:WueqbȤu2l|YQf@MOX-sRƭnp6>\F"C^u0x-LKx wd (!fW>|KBjEߘBZVH Tԑ@gNT`>_x6x矣qd1/E`w:A~4F񃈳DS Ӎ3gTS4~4Nh;b"~D$b󥟐+Du$Imµ6C0EȅjR|)V܌+M: ٣0Gra,U$|^ 'z$yGO"TSJJp7d prSRf3g_e4X"z c e`_1"Ak s&e{ܢvħrHibp;RFoD &_[`ܷ"&"+]O%gɸMZQ ̑;(fl1r +H/O).րYθ\c&E;N]Xg˾o jW=*eg'I,].j5%L<*J w]{f*j[pa*r1 ۧo9Qy|8֝(C?\V#>"H}i?3V1{4qmBZX>wr+bYBY`0K5K矄Sڢu vk8%WD%KOPo3v#Qt&@h%-M`霟85釦pqo-5Ǫď@["`YW Y&XU+ ^+4,kEP_F4t /( RܳDvJ=p :(":/clze'U |M_D+zg鞓NqQQ EDĊi詢Y moJZ)b uAe*#>7ubYnh96jj2%3櫵,f3/𣴈Bۡvus\$ڎmFhls_-+ [w7UQ%6Յ݄p;u^(r^O,xlH[ ʂ q1w+j0(/J"@}ɶT`F!*9DM̛EAb7w"W 8o.NȷS4?2Xje1B0g#-wnOΰoAroBA,_v ָs#XR[\w Kr|$>V+lyKՂϟZ.9[<xųa x>A3=Ec,|2gUܺc D2YCXv^U]vm*\ );-<7-vf&R;`X^[ xn*@#i i;TDJIF~ U'"'~zy K46#wT|JjhҮ#/DXhc:fk5@lBUc]A~:ɼlg4YrށΟ[wengU_d=p秤oE(Q%z/R(VDD /¿@<Ʈ3Yvt8A2}f[Yng_k-/8j0l؆&ׅ A-i/K{Œ@ǣ>%VF߂ozd\Keֈ~n@_WnYW//EˍߧWH/a(BWܳ^nge.Bf5X"/]Z>ˈd3-#΢9j;ȏ_ٍxpXÀD] DY i -~r;ʔ~ SZa(?1KV+A<sƹȽ2%6k3pWpu3A>0mbrܤCG?Z:6z3;a6 qH-bo\{!xkm.Q=XAjNZ?@-^dwH ^% Q{ueAO6o| ρ"B/}PmYE"C8Qc #׸f飬\MS؜ZBZpӋZyd 1B`8jxfXz;/ c)`̗\l$@_!o Օb/8^hac& qFQ 2OLcʚ+0ɑ浖m!L? v. ge+.0(& C4֚n."*f0Jd?yĵbjR8z/ R 52-gZ,>] K[y-wPtdm}W{$&3{cpÁdEW-BDS_i]b̊\ҋa G!-+c"KvHbe^f))0 -Qu+zqH<:6(fbf]+7+˹Qz|Q.3 2B^Ⴔrl~7u >UZ\L],:) \cQit^z25xD-IυZR.>!M4, ăC& ^ K rPrh2fqWts8iM `<ģbp!__Q{<)\M- M8y?,ɆMjs8u9%jD>۬ Ƕh~>Ń;61n8۔GeΘn9(.+( )Zל#l~fPɡUxZ+ +8:ѣw;~0؅E^ҁ ?N 9X=Չ>ȁ"ʉ뭥5@/եgeUoGX}M!}3э@OK=|][v(hX܃pv=e !HDw&E~m^U#K芺jE\քt ԟ|)gF6 T0Z&uRTo{Pjv6ԍ`ӄ ؙK׹rֽ5Upy4*GKDoAաO9@nI0ul&gú|`0uI"&vF>|MU>Z|X E.Ku?~nނ NDC@igDGĎ"5ubFe, Q}q񢎝#[Óuk#< b l6EYyHZ@[:pM)Q(DI!%^ f#CNbH<%Rk)^X_a"lιgL0|8s_a Y F jxV</SՌ `&ZW#nyU5r&4 A7IV9"_156\G!nABrXO"GSla>MK /PS&ڏId=<*l7A GsVR ;~Ř_v^lۚ/ݢ]" 0Wi}9{apȔ0.׹ n`HS=xd`[f8%kq1JAFA2uoԽ묶Q-E`'1:ÑB[8vceBߋ.zwox{SP(VPpeɷKS0L_}nn˼g0VIfVL*'&jӘvԧX.'7 032/Qaftʮ0:bq0Y3:mhFq̱g"Z/igM .4X cŬ#8xK$(~`V9n~ԇܸʅЀƘ-,u!19#H@UÉam }ɽ *N#rѪψU O ' y)Ж@X1^4npAmTbglJUuRHI;ؤ  ~)ϧiǣbdaob? [y(R=ziN3XW*)r6Ў[A$Bf1d)aDT-`n2+@%QOw%JG,ӕ`D+>NI25~=LTW#I*6茊2ȃث ŠLDŽEU]1 *guY,wnXt3ڱV`YIi*8F] :o6Q>w 4hk ԤMpnFcJy)#MkԝO9Eƈ3w67+`wR#K)'wyK0(NՋeeA@-s2??Uw xNS/@݂tByDZi0l$; ]|p ? #3Kֲ֜8.U=$H BÉ=]]),xiKUĻbw9ʋRB0XGr}(CWS=ikoDTvxYqǠI;+J7ovjNŬ% 6VyLf0~0U"TWֵ}~32 qϴZgګZ:+suq1s BƼ(1{# Z{ē%4d9a!TSU @7_\/"JHZg!+<3vT!b*ds ^=H7?CSl`koyE[ \ BaO0wUY Zy@SFq} U NT@j#st@yB_e36¥1Y0?7oT`u Nk]Xdے1܅\j 3uF} *31^hiO =Pid>]ʙkcMTg]:x7 GI7~8㞄\`=Mƕ@cx&+ACOp` ЀdA~X4%ܱh%Izs7zTJOMBRm^/uˣ)ŎY+aA󎚨K}]Yp=+[* ˎtp,[U6VX4ΨvP^1R̂IJ3RiHx4 ܢ2Ŭe 匽Z^ѻ޵}w ~s5@/8:kasxRA2k>}DP*t0XfiTHX@"2J[lZ9u·\Wf <}Tx,ѬwTf_r.wY"A=4$EvO ~'ڗO!Q3/|.Z3/? y ۦdEqh߲cg͓~<ڟ?V N3nQq>)=ʌd͋ S@$ktaSf dpqEW1ZOq (H'"hQPE1w2ܒmcbHm= 9rm:evim*sUa?祘d$ ΜA˅۠ JbgT.g$x`S& {'QifNT#(8.J|\JWP]*XֱJi]_׬_g_V̟uA4H2s,BFenNl+-&q2m%~~+W[FvE^ml㹭ʙ5mSZAgmn+ ky[lŶŕ#٧xXs0E'+j:_5ZWfWJ6%Xnywn d9myx^5׌9&?m pzҘN3(!]0{ KGg~rr%DVv0 #a`pvȞ#TK L͎!I\R; RXI#w@\5䠴, ʗn_޵-Aԑq&V dҔE\dɞR֖ScUHHBL RԾ@Urț*O t ؤ K@_Pz;@ͼ *?G =)7ϸu'i~f A(||Y>NٻKP="c&S 75 Љ.ˋ?p#`]3@.ZkE_؍ߥT}Q4!`IS ~7-j31jy!;E 6@"Q:^/'jG ,-D3;n k]b7B/MB٥6ыBJsZO O2ʁ X5@Gntv`GgXOeU#9apҢ=+{vo0yDń@рj pA;)u,]#V jUKTt/n 9}B"rk5y^͑69-dSt6_MLI(e!gǾ<_TS\S 6 e 1ceR^je*^]"]y'nv7L1}mzzvɓ<>ٔDLZ)g!)P#ŗat$1-_}8ګp4|7L7i1VZʋ̾'@VכZm#[>e?\LVw5i})$bXW*\'B\O]׺c^Wx2)8Rv@=[oc:thLqþEqd,ÝK ]K0ײ4 uesTGs{ήy\,]*:U$IzrTt\";X7dtH{[)Ŀչ'9 =>VPhBY*kMiQa;_"‘ŊhcHhm\[^\BGڧ ~<I)3qAUOZh„y2ҜVɐIXZ6/A&1l2${JLƀ%\BV "V”&4~SI|0`QHYy:uvJ 襸r |ȃ9)x1;Jt9R{Hj(TR>T#1iRN-;h1ivix9noN<>nkY9Hei7)6eVV@9m;j]rZk-2Nfi(Mhq^א9ܑLe@n;^ 9a_C js(eg*oP"qկ!tVzt'"oy}Dҹ~Ҕ,6NJQA2qiv~;I\ ܵ|5E/J%~n"AU~NIXuLt]iN Ԕ] {fr&- WfHqYu%`'s$ ^N+RQ${' GȞӤ0^˛΢ue*QcezEqgCf.C!׻e{*l=X]IA,վpþ Kt8ѹx-| | 77|#FjDxᄈ^P63shk`!ʡREU,}.ڪŬip;x*t[vJZ{"MAP1UՒSb=۴JPϒFdcDvWRPaCW4{=P)@u⥥"\O8YWSy8Ṿ*٢syRgj_kBHG`s*-@8)zio֋V̋njppAv^re|)9u }:XG؉/E|؈G?@cYZL~ⷚ(b$kV[RN}zgj"q8iBJ+IjCg/:E"z2M|M{I)D5.5󴢛Cp. qA]c9D"ըØrjbB=<0޸3;;X!Q|@<UxN -rI49t+3R:#c 3Rv1;?r-h;nB2mɬrYar""Mv[K%v͖g`&U uhYapj( Dx: XOe>2o[=ByDu2PfhB9H\H7jdĴ(:=Ɂ6V~P6,BMV*-Kj'Ⴕɒ ,hJ3rql#H\Iĭ 7*@9űI^_xnWCfilN6!`V)(ZTDk(]ZOs',\fKaV=YИ ڬs~s#Jd2pq;G'H9K77 @}J{'Tb$cj#(O,tB}aKA  7>F௒$T_YLuSX;*bm*-T+YEO,9l>:&Å_1+ ?(2p ;/#-A1ߘ8Pï[nDžjj ,$Bvվ!3o`b)EIuH0|sîݲni$T% I zG_H d?c8桛 G_sVf[$qO T(ċr^T)OҰې/\P .?)DVw~%֫ubc {%]BV,ʮ趡+=;l #  m(0D:¦D$7lR1-2 '.R"#d9ɩy7U%lh~{Kq"n7_&a~ʎ:` =ZVy}CMwB, 8p "%iXjYRFOc +C}x"H`W,E5;J2ًRLjmRPKʯ$0kc.l3aD0gJ;dMvc-?92>zϳ.k5o6hMvNЌ}Wڹ(؇BwK oX<@bf ܺo~fgO0<Ƙ4p3)6u6)|B؁IɖsarϮILVujMc>> |F?hv >P%X('8,pFLjthS;T&\ͅ3d*'<=gv)YKšum/jDf H<վ0C1F6^uQiR/|t >i'-1 ޸ahJǑni~8mWdϋXtFtο78R7c AO"^\a 8GqܠS1z REqrij Aޝ8hIq_N-DtXl\EG|Q,Ph&L&#$<7+1*vh)E nw ^C`dbG0S#'?47d,lݩ #C:rό=P\бUgwhqfUs27$k>g}b$}{k12,)‡e 5pJq*0`X;:&b$c4Kvb2*+0TB_ jI%Mx5"sRif&MPFGf;6 jl0_ی&~hRxm?5pPuB~aDE4;0a`"H(C@l+l<>@6m Z۳=oǪsOs\Hz+]I)#icY:#^% O 5ֿRbK& x+T]ܑFx34])7|-dI0k/G'Nݝ@eUQi h,®y/ՉC#7)?){C7e (MyRepository new instVarNamed: 'name' put: #PNagent; addComponents: { 'CMNMAS' -> (PNCompiledClass compileClass: 'class CMNMAS is_a PN object place platform() place agents() place start(1`#e) place msg1() place msg2() trans createMAS precond start(1`#e) action { p := Platform new . in := CMNInitiatorAgent new . in createWith: (p nextAID ) at: p . p addAgent: in . resp := CMNResponderAgent new . resp createWith: (p nextAID ) at: p . p addAgent: resp . } postcond platform(1`p), agents(1`in), agents(1`resp), msg1(1`(in, resp)) trans respMsg precond msg1(1`(in, resp)) action { ev := CMNCreateResponderPlanEvent new . resp addEvent: ev . } postcond msg2(1`(in, resp)) trans inMsg precond msg2(1`(in, resp)) action { ev := CMNCreateInitiatorPlanEvent new . in addEvent: ev . } '). 'RCRandomMovePlanInstance' -> (PNCompiledClass compileClass: 'class RCRandomMovePlanInstance is_a PlanInstance object place step2() place step3() place step4() trans makeRandomRotation precond start(1`#e) guard { self step: myAgent . myAgent rcMath: m . myAgent sonars: data . } action { dir := m randomDirectionFor: data . myAgent rotateTo: dir . } postcond step2(1`dir) trans sendRotateComm precond step2(1`dir) guard { self step: myAgent . myAgent followingAgentAID: aid . } action { self suspend . } postcond step3(1`#e) trans noRotateComm precond step2(1`dir) guard { self step: myAgent . myAgent noFollowingAgent . } action { self suspend . } postcond step3(1`#e) trans moveForward precond step3(1`#e) guard { self step: myAgent . } action { myAgent moveForward . } postcond step4(1`#e) trans sendMoveComm precond step4(1`#e) guard { self step: myAgent . myAgent followingAgentAID: aid . } action { self suspend . } postcond start(1`#e) trans noMoveComm precond step4(1`dir) guard { self step: myAgent . myAgent noFollowingAgent . } action { self suspend . } postcond start(1`#e) method createFor: anEvent at: anAgent place anAgent() place anEvent() place return() trans create precond anEvent(1`evt), anAgent(1`a) action { we1 := RCRobotHitEvent new . we2 := RCRobotStoppedEvent new . we3 := RCObstacleObservedEvent new . } postcond triggerEvt(1`evt), wakeUpEvtTemplate(1`we1), wakeUpEvtTemplate(1`we2), wakeUpEvtTemplate(1`we3), myAgent(1`a), return(1`self) method wakeUp place return() trans wakeUpAndRemove precond status(1`s) postcond status(1`#ready), return(1`self) '). 'MsgReceivedEvent' -> (PNCompiledClass compileClass: 'class MsgReceivedEvent is_a Event object place msg() place type(1`#MsgReceivedEvent) sync msg: aMsg cond msg(1`aMsg) sync unifiesWith: anEvent cond msg(1`msg), type(1`t) guard { anEvent type: tt . t = tt . anEvent msg: evMsg . msg unifiesWith: evMsg . } method create: aMsg place aMsg() place return() trans create precond aMsg(1`msg) postcond msg(1`msg), return(1`self) '). 'ACLMessage' -> (PNCompiledClass compileClass: 'class ACLMessage is_a PN object place sender() place receiver() place content() place replyWith() place conversation() sync conversation: anID cond conversation(1`anID) inhibitor senderEmpty cond sender(1`s) inhibitor contentEmpty cond content(1`c) sync receiver: anAID cond receiver(1`anAID) inhibitor contentUnifiesWith: anACLMessage cond content(1`myContent) guard { anACLMessage content: c . myContent ~= c . } inhibitor receiverEmpty cond receiver(1`r) inhibitor replyWithUnifiesWith: anACLMessage cond replyWith(1`myReplyWith) guard { anACLMessage replyWith: r . myReplyWith ~= r . } inhibitor receiverUnifiesWith: anACLMessage cond receiver(1`myReceiver) guard { anACLMessage receiver: r . myReceiver ~= r . } inhibitor senderUnifiesWith: anACLMessage cond sender(1`mySender) guard { anACLMessage sender: s . mySender ~= s . } sync unifiesWith: anACLMessage guard { self senderUnifiesWith: anACLMessage . self receiverUnifiesWith: anACLMessage . self contentUnifiesWith: anACLMessage . self replyWithUnifiesWith: anACLMessage . self conversationUnifiesWith: anACLMessage . } sync sender: anAID cond sender(1`anAID) sync content: aContent cond content(1`aContent) sync replyWith: anID cond replyWith(1`anID) inhibitor conversationEmpty cond conversation(1`anID) inhibitor replyWithEmpty cond replyWith(1`anID) inhibitor conversationUnifiesWith: anACLMessage cond conversation(1`myConversation) guard { anACLMessage conversation: c . myConversation ~= c . } method content place return() trans ret cond content(1`c) postcond return(1`c) method createReplyTmp place start(1`#e) place fillConversation() place return() trans createReply precond start(1`#e) action { reply := ACLMessage new . } postcond fillConversation(1`reply) trans rwNotEmpty precond fillConversation(1`reply) guard { self replyWith: rw . } action { reply conversation: rw . reply replyWith: rw . } postcond return(1`reply) trans rwEmpty precond fillConversation(1`reply) guard { self replyWithEmpty . } postcond return(1`reply) method conversation: anID place anID() place return() trans noPrevValue precond anID(1`id) guard { self conversationEmpty . } postcond conversation(1`id), return(1`self) trans prevValue precond anID(1`id), conversation(1`con) postcond conversation(1`id), return(1`self) method sender: anAID place anAID() place return() trans noPrevValue precond anAID(1`aid) guard { self senderEmpty . } postcond sender(1`aid), return(1`self) trans prevValue precond anAID(1`aid), sender(1`rec) postcond sender(1`aid), return(1`self) method content: aContent place aContent() place return() trans noPrevValue precond aContent(1`c) guard { self contentEmpty . } postcond content(1`c), return(1`self) trans prevValue precond aContent(1`c), content(1`con) postcond content(1`c), return(1`self) method replyWith: anID place anID() place return() trans noPrevValue precond anID(1`id) guard { self replyWithEmpty . } postcond replyWith(1`id), return(1`self) trans prevValue precond anID(1`id), replyWith(1`rw) postcond replyWith(1`id), return(1`self) method receiver: anAID place anAID() place return() trans noPrevValue precond anAID(1`aid) guard { self receiverEmpty . } postcond receiver(1`aid), return(1`self) trans prevValue precond anAID(1`aid), receiver(1`rec) postcond receiver(1`aid), return(1`self) method createReply place start(1`#e) place fillConversation() place fillSender() place fillReceiver() place return() trans createReply precond start(1`#e) action { reply := ACLMessage new . } postcond fillConversation(1`reply) trans rwNotEmpty precond fillConversation(1`reply) guard { self replyWith: rw . } action { reply replyWith: rw . reply conversation: rw . } postcond fillSender(1`reply) trans rwEmpty precond fillConversation(1`reply) guard { self replyWithEmpty . } postcond fillSender(1`reply) trans recNotEmpty precond fillSender(1`reply) guard { self receiver: r . } action { reply sender: r . } postcond fillReceiver(1`reply) trans recEmpty precond fillSender(1`reply) guard { self receiverEmpty . } postcond fillReceiver(1`reply) trans senNotEmpty precond fillReceiver(1`reply) guard { self sender: s . } action { reply receiver: s . } postcond return(1`reply) trans senEmpty precond fillReceiver(1`reply) guard { self senderEmpty . } postcond return(1`reply) '). 'CWNewWasteEvent' -> (PNCompiledClass compileClass: 'class CWNewWasteEvent is_a Event object place type(1`#CWNewWasteEvent) place wastePosition() sync wastePosition: aPosition cond wastePosition(1`aPosition) method updateBeliefs: anAgent place anAgent() place return() trans updateBeliefs cond wastePosition(1`wp) precond anAgent(1`a) action { a addWasteAtPosition: wp . } postcond return(1`self) method createForX: x Y: y place x() place y() place return() trans create precond x(1`x), y(1`y) postcond wastePosition(1`(x, y)), return(1`self) '). 'BWStackPlanInstance' -> (PNCompiledClass compileClass: 'class BWStackPlanInstance is_a PlanInstance object place obj1() place obj2() place step1() place step2() place step3() trans notStacked cond obj1(1`obj1), obj2(1`obj2) precond start(1`#e) guard { self step: myAgent . myAgent isNot: obj1 on: obj2 . } postcond step1(1`#e) trans nothingToDo cond obj1(1`obj1), obj2(1`obj2) precond start(1`#e) guard { self step: myAgent . myAgent is: obj1 on: obj2 . } postcond success(1`#e) trans obj1clear cond obj1(1`obj1) precond step1(1`#e) guard { self step: myAgent . myAgent clear: obj1 . } postcond step2(1`#e) trans obj1notClear cond obj1(1`obj1) precond step1(1`#e) guard { self step: myAgent . myAgent notClear: obj1 . myAgent is: obj3 on: obj1 . } action { goal := BWAchieveOnGoal new . goal create: obj3 on: #Table . self postSubgoal: goal . } postcond start(1`#e) trans obj2clear cond obj2(1`obj2) precond step2(1`#e) guard { self step: myAgent . myAgent clear: obj2 . } postcond step3(1`#e) trans obj2notClear cond obj2(1`obj2) precond step2(1`#e) guard { self step: myAgent . myAgent notClear: obj2 . myAgent is: obj3 on: obj2 . } action { goal := BWAchieveOnGoal new . goal create: obj3 on: #Table . self postSubgoal: goal . } postcond step2(1`#e) trans moveEm cond obj1(1`obj1), obj2(1`obj2) precond step3(1`#e) guard { self step: myAgent . } action { myAgent move: obj1 on: obj2 . } postcond success(1`#e) method createFor: anEvent at: anAgent place anAgent() place anEvent() place aux() place return() trans create precond anEvent(1`evt), anAgent(1`a) guard { evt on: obj . } postcond triggerEvt(1`evt), myAgent(1`a), aux(1`obj) trans create2 precond aux(1`(obj1, obj2)) postcond obj1(1`obj1), obj2(1`obj2), return(1`self) '). 'CMNCreateResponderPlanEvent' -> (PNCompiledClass compileClass: 'class CMNCreateResponderPlanEvent is_a Event object place type(1`#CMNCreateResponderPlanEvent) place aaInit(1`#e) place msgTmp() trans aaaaaaaInit precond aaInit(1`#e) action { mt := ACLMessage new . } postcond msgTmp(1`mt) sync msgTmp: mt cond msgTmp(1`mt) '). 'RCPlatform' -> (PNCompiledClass compileClass: 'class RCPlatform is_a Platform object inputPlace r1Sonars() inputPlace r1Bumpers() inputPlace r1Position2D() outputPlace r1MoveForward() outputPlace r1RotateTo() place r1RobotStoppedEvent(1`0) place r1RobotHitEvent(1`0) place r1ObstacleObservedEvent(1`0) place start(1`#e) place eventToAdd() place deleteMe() trans initialize precond start(1`#e) action { r1 := RCAgent new . r1 createWith: (self nextAID ) at: self . self addAgent: r1 . } trans createEvents precond r1Sonars(1`sonars), r1Bumpers(1`bumpers), r1Position2D(1`position2d), r1RobotStoppedEvent(1`rse), r1RobotHitEvent(1`rhe), r1ObstacleObservedEvent(1`ooe) action { rse := (rse + 1 ) \\ 10 . rhe := (rhe + 1 ) \\ 10 . ooe := (ooe + 1 ) \\ 10 . evtToAdd := RCMath selectEventForSonars: sonars Bumpers: bumpers Position2D: position2d rse: rse rhe: rhe ooe: ooe . } postcond r1RobotStoppedEvent(1`rse), r1RobotHitEvent(1`rhe), r1ObstacleObservedEvent(1`ooe), eventToAdd(1`(evtToAdd, sonars, bumpers, position2d)) trans generatePercepts precond deleteMe(1`#e) action { self hold: 250 . sonars := RCMath sonars . bumpers := RCMath bumpers . pos2d := RCMath pos2d . } postcond deleteMe(1`#e), r1Sonars(1`sonars), r1Bumpers(1`bumpers), r1Position2D(1`pos2d) trans createRobotStoppedEvent cond agents(1`a) precond eventToAdd(1`(eventType, sonars, bumpers, position2d)), r1RobotStoppedEvent(1`rse) guard { #RCRobotStoppedEvent = eventType . } action { evt := RCRobotStoppedEvent new . evt sonars: sonars bumpers: bumpers compass: 0 motorStatus: 0 . a addEvent: evt . } postcond r1RobotStoppedEvent(1`0) trans createRobotHitEvent cond agents(1`a) precond eventToAdd(1`(eventType, sonars, bumpers, position2d)), r1RobotHitEvent(1`rhe) guard { #RCRobotHitEvent = eventType . } action { evt := RCRobotHitEvent new . evt sonars: sonars bumpers: bumpers compass: 0 motorStatus: 0 . a addEvent: evt . } postcond r1RobotHitEvent(1`0) trans createObstacleObservedEvent cond agents(1`a) precond eventToAdd(1`(eventType, sonars, bumpers, position2d)), r1ObstacleObservedEvent(1`ooe) guard { #RCObstacleObservedEvent = eventType . } action { evt := RCObstacleObservedEvent new . evt sonars: sonars bumpers: bumpers compass: 0 motorStatus: 0 . a addEvent: evt . } postcond r1ObstacleObservedEvent(1`0) trans killDummyEvents cond agents(1`a) precond eventToAdd(1`(eventType, sonars, bumpers, position2d)) guard { #nil = eventType . } method robot1MoveForward place start(1`#e) place return() trans move precond start(1`#e) postcond r1MoveForward(1`1), return(1`self) method robot1Stop place start(1`#e) place return() trans move precond start(1`#e) postcond r1MoveForward(1`0), return(1`self) method robot1RotateTo: aDir place start(1`#e) place return() place aDir() trans move precond start(1`#e), aDir(1`dir) postcond r1RotateTo(1`dir), return(1`self) '). 'CMNResponderAgent' -> (PNCompiledClass compileClass: 'class CMNResponderAgent is_a CommunicatingAgent object place acceptedReq(1`#r1) sync acceptsReq: aRequest cond acceptedReq(1`ar) guard { ar = aRequest . } inhibitor refusesReq: aRequest cond acceptedReq(1`ar) guard { ar = aRequest . } method createWith: anAID at: aPlatform place anAID() place aPlatform() place return() trans create precond anAID(1`aid), aPlatform(1`p) action { self create . pt := CMNResponderPlanTemplate new . pt create: self . } postcond aid(1`aid), platform(1`p), planTemplates(1`pt), return(1`self) '). 'CMNInitiatorAgent' -> (PNCompiledClass compileClass: 'class CMNInitiatorAgent is_a CommunicatingAgent object method createWith: anAID at: aPlatform place anAID() place aPlatform() place return() trans create precond anAID(1`aid), aPlatform(1`p) action { self create . pt := CMNInitiatorPlanTemplate new . pt create: self . } postcond aid(1`aid), platform(1`p), planTemplates(1`pt), return(1`self) '). 'BWStackPlanTemplate' -> (PNCompiledClass compileClass: 'class BWStackPlanTemplate is_a PlanTemplate object method create: anAgent place anAgent() place return() trans create precond anAgent(1`a) action { tet := BWAchieveOnGoal new . } postcond return(1`self), myAgent(1`a), triggerEvtTemplate(1`tet) method createInstanceFor: anEvent place return() place anEvent() trans create cond myAgent(1`agent) precond anEvent(1`evt) action { pi := BWStackPlanInstance new . pi createFor: evt at: agent . agent addPlanInstance: pi . } postcond return(1`pi) '). 'RCObstacleObservedEvent' -> (PNCompiledClass compileClass: 'class RCObstacleObservedEvent is_a RCSensorEvent object place type(1`#RCObstacleObservedEvent) '). 'BWAchieveOnGoal' -> (PNCompiledClass compileClass: 'class BWAchieveOnGoal is_a Event object place on() sync on: tuple cond on(1`tuple) method create: object1 on: object2 place object1() place object2() place return() trans fillIt precond object1(1`o1), object2(1`o2) postcond on(1`(o1, o2)), return(1`self) '). 'CMNInitiatorPlanInstance' -> (PNCompiledClass compileClass: 'class CMNInitiatorPlanInstance is_a PlanInstance object place request() place server() place waitForReply() place replyContent() trans sendRequest cond request(1`req), server(1`sAID) precond start(1`#e) guard { self step: myAgent . myAgent aid: myAID . } action { msg := ACLMessage new . msg receiver: sAID . msg sender: myAID . msg content: req . myAgent sendMsg: msg . replyTmp := msg createReplyTmp . } postcond waitForReply(1`replyTmp) trans waitForReply precond waitForReply(1`replyTmp) guard { self step: myAgent . myAgent noSuchMsgReceived: replyTmp . } action { myAgent waitForMsg: replyTmp plan: self . } postcond waitForReply(1`replyTmp) trans receiveReply precond waitForReply(1`replyTmp) guard { self step: myAgent . myAgent msgReceived: replyTmp . } action { msg := myAgent receiveMsg: replyTmp . content := msg content . } postcond replyContent(1`content) trans requestAccepted precond replyContent(1`content) guard { self step: myAgent . #accept = content . } action { Transcript show: ''Client: request accepted.'' . } postcond success(1`#e) trans requestRefused precond replyContent(1`content) guard { self step: myAgent . #refuse = content . } action { Transcript show: ''Client: request refused.'' . } postcond failure(1`#e) method createFor: anEvent at: anAgent place anAgent() place anEvent() place return() trans create precond anEvent(1`evt), anAgent(1`a) guard { evt request: req . evt server: svr . } postcond triggerEvt(1`evt), myAgent(1`a), request(1`req), server(1`svr), return(1`self) '). 'Event' -> (PNCompiledClass compileClass: 'class Event is_a PN object place type(1`#anEvent) place intention(1`#nil) place failedPlanInstances() sync type: aType cond type(1`aType) sync intention: anIntention cond intention(1`anIntention) sync unifiesWith: anEvent cond type(1`evtType) guard { anEvent type: t . t = evtType . } method intention: anIntention place anIntention() place return() trans setIntention precond anIntention(1`int), intention(1`oldInt) postcond intention(1`int), return(1`self) method updateBeliefs: anAgent place anAgent() place return() trans update precond anAgent(1`agent) postcond return(1`self) method addFailedPlanInstance: aPlanInstance place aPlanInstance() place return() trans addPlanInstance precond aPlanInstance(1`pi) postcond return(1`self), failedPlanInstances(1`pi) '). 'RCRandomMovePlanTemplate' -> (PNCompiledClass compileClass: 'class RCRandomMovePlanTemplate is_a PlanTemplate object sync checkContext cond myAgent(1`agent) guard { agent noRandomPlan . } method create: anAgent place anAgent() place return() trans create precond anAgent(1`a) action { tet := RCRobotStoppedEvent new . } postcond return(1`self), myAgent(1`a), triggerEvtTemplate(1`tet) method createInstanceFor: anEvent place return() place anEvent() trans create cond myAgent(1`agent) precond anEvent(1`evt) action { pi := RCRandomMovePlanInstance new . pi createFor: evt at: agent . agent addPlanInstance: pi . agent randomPlan . } postcond return(1`pi) '). 'Platform' -> (PNCompiledClass compileClass: 'class Platform is_a PN object place agents() place currentAID(1`0) inhibitor noSuchAgent: anAID cond agents(1`a) guard { a aid: aid . aid = anAID . } method nextAID place return() trans next precond currentAID(1`old) action { new := old + 1 . } postcond currentAID(1`new), return(1`new) method deliverMsg: aMsg place aMsg() place return() trans receiverNotFound precond aMsg(1`msg) guard { msg receiver: rec . self noSuchAgent: rec . } postcond return(1`#failure) trans deliver cond agents(1`agent) precond aMsg(1`msg) guard { msg receiver: rec . agent aid: aid . rec = aid . } action { agent addMsg: msg . } postcond return(1`#success) method addAgent: anAgent place anAgent() place return() trans add precond anAgent(1`a) postcond agents(1`a), return(1`self) '). 'CWCollectWastePlanInstance' -> (PNCompiledClass compileClass: 'class CWCollectWastePlanInstance is_a PlanInstance object place aux() trans pickWaste precond start(1`#e) guard { self step: myAgent . myAgent atWastePosition . myAgent notCarryingWaste . } action { myAgent pickWaste . } postcond success(1`#e) trans createMoveToWasteEvent precond start(1`#e) guard { self step: myAgent . self triggerEvt: evt . evt wastePosition: wp . evt intention: int . myAgent notAtWastePosition . } action { goal := CWMoveToPosGoal new . goal create: wp . goal intention: int . myAgent addEvent: goal . self suspend . } postcond aux(1`#e) trans moveCompleted precond aux(1`#e) postcond start(1`#e) '). 'BWTopLevelPlanInstance' -> (PNCompiledClass compileClass: 'class BWTopLevelPlanInstance is_a PlanInstance object place step2() place step3() place step4() trans achieve1 precond start(1`#e) guard { self step: myAgent . } action { goal := BWAchieveOnGoal new . goal create: #Block3 on: #Table . self postSubgoal: goal . } postcond step2(1`#e) trans achieve2 precond step2(1`#e) guard { self step: myAgent . } action { goal := BWAchieveOnGoal new . goal create: #Block2 on: #Block3 . self postSubgoal: goal . } postcond step3(1`#e) trans achieve3 precond step3(1`#e) guard { self step: myAgent . } action { goal := BWAchieveOnGoal new . goal create: #Block1 on: #Block2 . self postSubgoal: goal . } postcond step4(1`#e) trans successful precond step4(1`#e) guard { self step: myAgent . } postcond success(1`#e) '). 'PlanInstance' -> (PNCompiledClass compileClass: 'class PlanInstance is_a PN object place status(1`#ready) place triggerEvt() place suspendEvt() place suspendEvtTemplate() place wakeUpEvtTemplate() place failEvtTemplate() place succeedEvtTemplate() place wakeUpEvt() place failEvt() place succeedEvt() place myAgent() place start(1`#e) place success() place failure() trans planFailed precond failure(1`t) action { self fail . } trans planSucceeded precond success(1`t) action { self succeed . } sync isSuspendedBy: anEvent cond suspendEvtTemplate(1`suspendEvtTemplate), status(1`#ready) guard { suspendEvtTemplate unifiesWith: anEvent . } sync triggerEvt: anEvent cond triggerEvt(1`anEvent) sync succeeded cond status(1`#succeeded) inhibitor wakeUpEvtTemplateEmpty cond wakeUpEvtTemplate(1`evt) sync isSuspended cond status(1`#suspended) sync isReady cond status(1`#ready) sync isMadeSucceededBy: anEvent cond succeedEvtTemplate(1`succeedEvtTemplate) guard { succeedEvtTemplate unifiesWith: anEvent . } inhibitor wakeUpEvtEmpty cond wakeUpEvt(1`evt) sync agent: anAgent cond myAgent(1`anAgent) sync step: myAgent cond myAgent(1`myAgent) precond status(1`#active) postcond status(1`#ready) sync isWokenUpBy: anEvent cond wakeUpEvtTemplate(1`wakeUpEvtTemplate), status(1`#suspended) guard { wakeUpEvtTemplate unifiesWith: anEvent . } inhibitor suspendEvtEmpty cond suspendEvt(1`evt) sync failed cond status(1`#failed) sync isMadeFailedBy: anEvent cond failEvtTemplate(1`failEvtTemplate) guard { failEvtTemplate unifiesWith: anEvent . } method postSubgoal: aGoal place aGoal() place return() trans postSubgoal cond myAgent(1`myAgent) precond aGoal(1`goal) guard { self triggerEvt: evt . evt intention: int . } action { goal intention: int . myAgent addEvent: goal . self suspend . } postcond return(1`self) method suspendBy: anEvent place anEvent() place return() trans noPreviousEvt precond anEvent(1`evt) guard { self suspendEvtEmpty . } action { self suspend . } postcond suspendEvt(1`evt), return(1`self) trans aPreviousEvt precond suspendEvt(1`oldEvt), anEvent(1`evt) action { self suspend . } postcond suspendEvt(1`evt), return(1`self) method fail place start(1`#e) place aux() place return() trans setStatus precond status(1`s), start(1`#e) postcond status(1`#failed), aux(1`#e) trans fail cond myAgent(1`myAgent), triggerEvt(1`te) precond aux(1`#e) guard { te intention: int . } action { te addFailedPlanInstance: self . int removePlanInstance: self . myAgent removePlanInstance: self . myAgent addEvent: te . } postcond return(1`self) method doStep place return() trans doStep precond status(1`#ready) postcond status(1`#active), return(1`self) trans fail cond status(1`s) guard { #ready ~= s . } postcond return(1`self) method suspend place return() trans suspend precond status(1`s) postcond status(1`#suspended), return(1`self) method createFor: anEvent at: anAgent place anAgent() place anEvent() place return() trans create precond anEvent(1`evt), anAgent(1`a) postcond triggerEvt(1`evt), myAgent(1`a), return(1`self) method wakeUp place return() trans wakeUp precond status(1`s) guard { self wakeUpEvtTemplateEmpty . } postcond status(1`#ready), return(1`self) trans wakeUpAndRemove precond status(1`s), wakeUpEvtTemplate(1`evt) postcond status(1`#ready), return(1`self) method succeed place start(1`#e) place aux() place return() trans setStatus precond status(1`s), start(1`#e) postcond status(1`#succeeded), aux(1`#e) trans succeed cond myAgent(1`myAgent), triggerEvt(1`te) precond aux(1`#e) guard { te intention: int . } action { int removePlanInstance: self . myAgent removePlanInstance: self . } postcond return(1`self) method suspendWithCondition: aWakeUpEvent place aWakeUpEvent() place return() trans suspend precond status(1`s), aWakeUpEvent(1`ev) postcond status(1`#suspended), wakeUpEvtTemplate(1`ev), return(1`self) method wakeUpBy: anEvent place anEvent() place return() trans noPreviousEvt precond anEvent(1`evt) guard { self wakeUpEvtEmpty . } action { self wakeUp . } postcond wakeUpEvt(1`evt), return(1`self) trans aPreviousEvt precond wakeUpEvt(1`oldEvt), anEvent(1`evt) action { self wakeUp . } postcond wakeUpEvt(1`evt), return(1`self) '). 'CWMoveToPosGoal' -> (PNCompiledClass compileClass: 'class CWMoveToPosGoal is_a Event object place agentPosition() place type(1`#CWMoveToPosGoal) sync agentPosition: ap cond agentPosition(1`ap) method create: aPosition place aPosition() place return() trans create precond aPosition(1`p) postcond return(1`self), agentPosition(1`p) '). 'CWCollectWastePlanTemplate' -> (PNCompiledClass compileClass: 'class CWCollectWastePlanTemplate is_a PlanTemplate object method create: anAgent place anAgent() place return() trans create precond anAgent(1`a) action { tet := CWNewWasteEvent new . } postcond return(1`self), myAgent(1`a), triggerEvtTemplate(1`tet) method createInstanceFor: anEvent place return() place anEvent() trans create cond myAgent(1`agent) precond anEvent(1`evt) action { pi := CWCollectWastePlanInstance new . pi createFor: evt at: agent . agent addPlanInstance: pi . } postcond return(1`pi) '). 'PlanTemplate' -> (PNCompiledClass compileClass: 'class PlanTemplate is_a PN object place triggerEvtTemplate() place myAgent() sync checkContext cond myAgent(1`agent) sync isTriggeredBy: anEvent cond triggerEvtTemplate(1`tet) guard { tet unifiesWith: anEvent . } method create: anAgent place anAgent() place return() trans create precond anAgent(1`a) postcond return(1`self), myAgent(1`a) method createInstanceFor: anEvent place return() place anEvent() trans create cond myAgent(1`agent) precond anEvent(1`evt) action { pi := PlanInstance new . pi createFor: evt at: agent . agent addPlanInstance: pi . } postcond return(1`pi) '). 'CMNInitiatorPlanTemplate' -> (PNCompiledClass compileClass: 'class CMNInitiatorPlanTemplate is_a PlanTemplate object method create: anAgent place anAgent() place return() trans create precond anAgent(1`a) action { tet := CMNCreateInitiatorPlanEvent new . } postcond return(1`self), myAgent(1`a), triggerEvtTemplate(1`tet) method createInstanceFor: anEvent place return() place anEvent() trans create cond myAgent(1`agent) precond anEvent(1`evt) action { pi := CMNInitiatorPlanInstance new . pi createFor: evt at: agent . agent addPlanInstance: pi . } postcond return(1`pi) '). 'BWStartEvent' -> (PNCompiledClass compileClass: 'class BWStartEvent is_a Event object place type(1`#BWStartEvent) method updateBeliefs: anAgent place anAgent() place return() trans update precond anAgent(1`agent) action { agent addBelief: #Block1 on: #Block2 . agent addBelief: #Block2 on: #Table . agent addBelief: #Block3 on: #Table . agent addClearBelief: #Block1 . agent addClearBelief: #Block3 . agent addClearBelief: #Table . } postcond return(1`self) '). 'BDIAgent' -> (PNCompiledClass compileClass: 'class BDIAgent is_a PN object place eventQueue() place goalStack() place planTemplates() place planInstances() place currentIntention() place intentions() place processedEvents() place aux1() place aux2() place aux3() place aux4() place aux5() place aux6() trans aDestroyProcessedEvents precond processedEvents(1`e) trans updateBeliefsGenerateGoals precond eventQueue(1`evt) action { evt updateBeliefs: self . } postcond aux1(1`evt), aux2(1`evt), aux3(1`evt), aux4(1`evt), aux5(1`evt) trans createPlanInstances precond aux1(1`evt) action { self createPlanInstances: evt . } postcond processedEvents(1`evt) trans wakeUpPlansInstances precond aux2(1`evt) action { self wakeUpPlanInstances: evt . } postcond processedEvents(1`evt) trans suspendPlanInstances precond aux3(1`evt) action { self suspendPlanInstances: evt . } postcond processedEvents(1`evt) trans failPlanInstances precond aux4(1`evt) action { self failPlanInstances: evt . } postcond processedEvents(1`evt) trans succeedPlanInstances precond aux5(1`evt) action { self succeedPlanInstances: evt . } postcond processedEvents(1`evt) trans getCurrentIntention precond currentIntention(1`int) guard { int topPlanInstanceReady . } postcond aux6(1`int) trans performIntentionStep precond aux6(1`int) guard { int topPlanInstance: planInstance . } action { planInstance doStep . } postcond currentIntention(1`int) trans updateCurrentIntention cond intentions(1`newInt) precond currentIntention(1`int) guard { int topPlanInstanceNotReady . newInt topPlanInstanceReady . } postcond currentIntention(1`newInt) inhibitor noSuchIntention: anIntention cond intentions(1`int) guard { int = anIntention . } inhibitor noPlanInstancesTriggeredBy: anEvent cond planTemplates(1`pt) guard { pt isTriggeredBy: anEvent . pt checkContext . } inhibitor noPlanInstancesWokenUpBy: anEvent cond planInstances(1`pi) guard { pi isWokenUpBy: anEvent . } inhibitor noPlanInstancesSucceededBy: anEvent cond planInstances(1`pi) guard { pi isMadeSucceededBy: anEvent . } inhibitor noSuchPlanInstance: aPlanInstance cond planInstances(1`pi) guard { pi = aPlanInstance . } inhibitor noPlanInstancesFailedBy: anEvent cond planInstances(1`pi) guard { pi isMadeFailedBy: anEvent . } inhibitor noPlanInstancesSuspendedBy: anEvent cond planInstances(1`pi) guard { pi isSuspendedBy: anEvent . } method addPlanInstance: aPlanInstance place aPlanInstance() place return() trans addPlanInstance precond aPlanInstance(1`pi) postcond return(1`self), planInstances(1`pi) method wakeUpPlanInstances: anEvent place anEvent() place return() trans wakeUpPlanInstance cond planInstances(1`pi) precond anEvent(1`e) guard { pi isWokenUpBy: e . } action { pi wakeUpBy: e . } postcond anEvent(1`e) trans noPlanInstancesToWakeUp precond anEvent(1`e) guard { self noPlanInstancesWokenUpBy: e . } postcond return(1`self) method removeIntention: anIntention place anIntention() place return() trans removeIntention precond anIntention(1`i), intentions(1`ii) guard { i = ii . } postcond return(1`self) trans noSuchIntention precond anIntention(1`i) guard { self noSuchIntention: i . } postcond return(1`self) method succeedPlanInstances: anEvent place anEvent() place return() trans succeedPlanInstance cond anEvent(1`e), planInstances(1`pi) guard { pi isMadeSucceededBy: e . } action { pi succeed . } trans noPlanInstancesToSucceed precond anEvent(1`e) guard { self noPlanInstancesSucceededBy: e . } postcond return(1`self) method createPlanInstances: anEvent place anEvent() place return() place pi() trans createPlanInstance cond planTemplates(1`pt) precond anEvent(1`evt) guard { pt isTriggeredBy: evt . pt checkContext . } action { pi := pt createInstanceFor: evt . self addPlanInstance: pi . } postcond pi(1`(evt, pi)) trans done precond anEvent(1`evt) guard { self noPlanInstancesTriggeredBy: evt . } postcond return(1`self) trans newIntention precond pi(1`(evt, pi)) guard { evt intention: i . #nil = i . } action { int := Intention new . evt intention: int . int addPlanInstance: pi . self addIntention: int . } postcond return(1`self) trans existingIntention precond pi(1`(evt, pi)) guard { evt intention: int . #nil ~= int . } action { int addPlanInstance: pi . } postcond return(1`self) method addEvent: anEvent place anEvent() place return() trans addEvent precond anEvent(1`e) postcond return(1`self), eventQueue(1`e) method addIntention: anIntention place anIntention() place return() trans addIntention precond anIntention(1`i) postcond return(1`self), intentions(1`i) method removePlanInstance: aPlanInstance place aPlanInstance() place return() trans removePlanInstance precond aPlanInstance(1`pi), planInstances(1`pii) guard { pi = pii . } postcond return(1`self) trans noSuchPlanInstance precond aPlanInstance(1`pi) guard { self noSuchPlanInstance: pi . } postcond return(1`self) method failPlanInstances: anEvent place anEvent() place return() trans failPlanInstance cond anEvent(1`e), planInstances(1`pi) guard { pi isMadeFailedBy: e . } action { pi fail . } trans noPlanInstancesToFail precond anEvent(1`e) guard { self noPlanInstancesFailedBy: e . } postcond return(1`self) method suspendPlanInstances: anEvent place anEvent() place return() trans suspendPlanInstance cond anEvent(1`e), planInstances(1`pi) guard { pi isSuspendedBy: e . } action { pi suspendBy: e . } trans noPlanInstancesToSuspend precond anEvent(1`e) guard { self noPlanInstancesSuspendedBy: e . } postcond return(1`self) method create place start(1`#e) place return() trans createInitialValues precond start(1`#e) action { int := Intention new . } postcond currentIntention(1`int), return(1`self) '). 'CMNResponderPlanInstance' -> (PNCompiledClass compileClass: 'class CMNResponderPlanInstance is_a PlanInstance object place msgTmp() place msgReceived() place replyReady() trans waitForMsg cond msgTmp(1`mt) precond start(1`#e) guard { self step: myAgent . myAgent noSuchMsgReceived: mt . } action { myAgent waitForMsg: mt plan: self . } postcond start(1`#e) trans receiveMsg cond msgTmp(1`mt) precond start(1`#e) guard { self step: myAgent . myAgent msgReceived: mt . } action { msg := myAgent receiveMsg: mt . req := msg content . } postcond msgReceived(1`(msg, req)) trans acceptRequest precond msgReceived(1`(msg, req)) guard { self step: myAgent . myAgent acceptsReq: req . } action { reply := msg createReply . reply content: #accept . Transcript show: ''Server accepts request.'' . } postcond replyReady(1`reply) trans refuseRequest precond msgReceived(1`(msg, req)) guard { self step: myAgent . myAgent refusesReq: req . } action { reply := msg createReply . reply content: #refuse . Transcript show: ''Server refuses request.'' . } postcond replyReady(1`reply) trans sendReply precond replyReady(1`reply) guard { self step: myAgent . } action { myAgent sendMsg: reply . } postcond start(1`#e) method createFor: anEvent at: anAgent place anAgent() place anEvent() place return() trans create precond anEvent(1`evt), anAgent(1`a) guard { evt msgTmp: mt . } postcond triggerEvt(1`evt), myAgent(1`a), msgTmp(1`mt), return(1`self) '). 'CWMoveToPositionPlanInstance' -> (PNCompiledClass compileClass: 'class CWMoveToPositionPlanInstance is_a PlanInstance object place agentPosition() place aux() trans initialize cond triggerEvt(1`te) precond start(1`#e) guard { te agentPosition: ap . } postcond aux(1`#e), agentPosition(1`ap) trans move cond agentPosition(1`ap) precond aux(1`#e) guard { self step: myAgent . myAgent agentPosition: agp . ap ~= agp . } action { myAgent moveToPosition: ap . } postcond aux(1`#e) trans done cond agentPosition(1`ap) precond aux(1`#e) guard { self step: myAgent . myAgent agentPosition: agp . ap = agp . } postcond success(1`#e) '). 'RCSensorEvent' -> (PNCompiledClass compileClass: 'class RCSensorEvent is_a Event object place type(1`#RCSensorEvent) place sonars() place bumpers() place compass() place motorStatus() method updateBeliefs: anAgent place anAgent() place return() trans update cond sonars(1`s), bumpers(1`b), compass(1`c), motorStatus(1`ms) precond anAgent(1`agent) guard { agent updateSonars: s . agent updateBumpers: b . agent updateCompass: c . agent updateMotorStatus: ms . } postcond return(1`self) method sonars: s bumpers: b compass: c motorStatus: ms place s() place b() place c() place ms() place return() trans fillIt precond s(1`s), b(1`b), c(1`c), ms(1`ms) postcond sonars(1`s), bumpers(1`b), compass(1`c), motorStatus(1`ms), return(1`self) '). 'CMNResponderPlanTemplate' -> (PNCompiledClass compileClass: 'class CMNResponderPlanTemplate is_a PlanTemplate object method create: anAgent place anAgent() place return() trans create precond anAgent(1`a) action { tet := CMNCreateResponderPlanEvent new . } postcond return(1`self), myAgent(1`a), triggerEvtTemplate(1`tet) method createInstanceFor: anEvent place return() place anEvent() trans create cond myAgent(1`agent) precond anEvent(1`evt) action { pi := CMNResponderPlanInstance new . pi createFor: evt at: agent . agent addPlanInstance: pi . } postcond return(1`pi) '). 'BWTopLevelPlanTemplate' -> (PNCompiledClass compileClass: 'class BWTopLevelPlanTemplate is_a PlanTemplate object method create: anAgent place anAgent() place return() trans create precond anAgent(1`a) action { tet := BWStartEvent new . } postcond return(1`self), myAgent(1`a), triggerEvtTemplate(1`tet) method createInstanceFor: anEvent place return() place anEvent() trans create cond myAgent(1`agent) precond anEvent(1`evt) action { pi := BWTopLevelPlanInstance new . pi createFor: evt at: agent . agent addPlanInstance: pi . } postcond return(1`pi) '). 'Intention' -> (PNCompiledClass compileClass: 'class Intention is_a PN object place planInstances() place priority(1`50) place top(1`0) sync topPlanInstanceReady cond top(1`top), planInstances(1`(top, aPlanInstance)) guard { aPlanInstance isReady . } inhibitor topPlanInstanceNotReady cond top(1`top), planInstances(1`(top, aPlanInstance)) guard { aPlanInstance isReady . } sync priority: aPriority cond priority(1`aPriority) sync topPlanInstance: aPlanInstance cond top(1`top), planInstances(1`(top, aPlanInstance)) method addPlanInstance: aPlanInstance place aPlanInstance() place return() trans addPlanInstance precond aPlanInstance(1`pi), top(1`top) action { newTop := top + 1 . } postcond return(1`self), planInstances(1`(newTop, pi)), top(1`newTop) method removePlanInstance: aPlanInstance place aPlanInstance() place return() place piToDelete() place done() trans findPlanInstance precond aPlanInstance(1`aPlanInstance), planInstances(1`(n, aPI)), top(1`top) guard { aPlanInstance = aPI . } postcond piToDelete(1`(n, aPI, top)) trans notTopPlan precond piToDelete(1`(n, aPI, top)), planInstances(1`(top, aPI2)) guard { n < top . aPI2 agent: myAgent . } action { newTop := top - 1 . myAgent removePlanInstance: aPI2 . } postcond piToDelete(1`(n, aPI, newTop)) trans topLevelPlanInstance precond piToDelete(1`(n, planInstance, top)) guard { n = top . n = 1 . planInstance agent: agent . } action { agent removeIntention: self . } postcond return(1`self) trans finishedRemovingPIs precond piToDelete(1`(n, planInstance, top)) guard { n = top . n > 1 . } action { newTop := n - 1 . } postcond done(1`(n, planInstance, newTop)) trans succesfulPlanInstance cond planInstances(1`(newTop, pi2)) precond done(1`(n, planInstance, newTop)) guard { planInstance succeeded . } action { pi2 wakeUp . } postcond return(1`self), top(1`newTop) trans failedPlanInstance precond done(1`(n, planInstance, newTop)) guard { planInstance failed . } postcond return(1`self), top(1`newTop) '). 'RCRobotStoppedEvent' -> (PNCompiledClass compileClass: 'class RCRobotStoppedEvent is_a RCSensorEvent object place type(1`#RCRobotStoppedEvent) '). 'CMNCreateInitiatorPlanEvent' -> (PNCompiledClass compileClass: 'class CMNCreateInitiatorPlanEvent is_a Event object place type(1`#CMNCreateInitiatorPlanEvent) place server(1`2) place request(1`#r1) sync request: aRequest cond request(1`aRequest) sync server: anAID cond server(1`anAID) '). 'RCAgent' -> (PNCompiledClass compileClass: 'class RCAgent is_a CommunicatingAgent object place sonars(1`#nil) place bumpers(1`#nil) place compass(1`#nil) place followingAgentAID() place motorStatus(1`#nil) place rcMath() place randomPlan() sync followingAgentAID: anAID cond followingAgentAID(1`anAID) sync updateCompass: newData precond compass(1`oldData) postcond compass(1`newData) sync sonars: sonars cond sonars(1`sonars) inhibitor noRandomPlan cond randomPlan(1`rp) sync updateMotorStatus: newData precond motorStatus(1`oldData) postcond motorStatus(1`newData) sync rcMath: math cond rcMath(1`math) inhibitor noFollowingAgent cond followingAgentAID(1`anAID) sync updateBumpers: newData precond bumpers(1`oldData) postcond bumpers(1`newData) sync updateSonars: newData precond sonars(1`oldData) postcond sonars(1`newData) method stop place start(1`#e) place return() trans move cond platform(1`p) precond start(1`#e) action { p robot1Stop . } postcond return(1`self) method rotateTo: aDirection place aDirection() place start(1`#e) place return() trans move cond platform(1`p) precond start(1`#e), aDirection(1`dir) action { p robot1RotateTo: dir . } postcond return(1`self) method moveForward place start(1`#e) place return() trans move cond platform(1`p) precond start(1`#e) action { p robot1MoveForward . } postcond return(1`self) method create place start(1`#e) place return() trans createInitialValues precond start(1`#e) action { int := Intention new . rpt := RCRandomMovePlanTemplate new . rpt create: self . math := RCMath new . } postcond currentIntention(1`int), planTemplates(1`rpt), rcMath(1`math), return(1`self) method randomPlan place start(1`#e) place return() trans fillRandom precond start(1`#e) postcond randomPlan(1`#e), return(1`self) '). 'CommunicatingAgent' -> (PNCompiledClass compileClass: 'class CommunicatingAgent is_a BDIAgent object place aid() place platform() place msgQueue() inhibitor noSuchMsgReceived: msgTmp cond msgQueue(1`msg) guard { msgTmp unifiesWith: msg . } sync msgReceived: msgTmp cond msgQueue(1`msg) guard { msgTmp unifiesWith: msg . } sync aid: aid cond aid(1`aid) method createWith: anAID at: aPlatform place anAID() place aPlatform() place return() trans create precond anAID(1`aid), aPlatform(1`p) action { self create . } postcond aid(1`aid), platform(1`p), return(1`self) method receiveMsg: msgTmp place msgTmp() place return() trans receive precond msgTmp(1`mt), msgQueue(1`msg) guard { mt unifiesWith: msg . } postcond return(1`msg) method addMsg: aMsg place aMsg() place return() trans addMsg precond aMsg(1`msg) action { ev := MsgReceivedEvent new . ev create: msg . self addEvent: ev . } postcond msgQueue(1`msg), return(1`self) method waitForMsg: msgTmp plan: aPlanInstance place msgTmp() place aPlanInstance() place return() trans suspend precond msgTmp(1`mt), aPlanInstance(1`pi) action { evTmp := MsgReceivedEvent new . evTmp create: mt . pi suspendWithCondition: evTmp . } postcond return(1`self) method sendMsg: aMsg place aMsg() place return() trans send cond platform(1`p) precond aMsg(1`msg) action { result := p deliverMsg: msg . } postcond return(1`result) '). 'PriorityBDIAgent' -> (PNCompiledClass compileClass: 'class PriorityBDIAgent is_a PN object place eventQueue() place goalStack() place planTemplates() place planInstances() place intentions() place processedEvents() place aux1() place aux2() place aux3() place aux4() place aux5() place aux6() trans updateBeliefsGenerateGoals precond eventQueue(1`evt) action { evt updateBeliefs: self . } postcond aux1(1`evt), aux2(1`evt), aux3(1`evt), aux4(1`evt), aux5(1`evt) trans createPlanInstances precond aux1(1`evt) action { self createPlanInstances: evt . } postcond processedEvents(1`evt) trans wakeUpPlansInstances precond aux2(1`evt) action { self wakeUpPlanInstances: evt . } postcond processedEvents(1`evt) trans suspendPlanInstances precond aux3(1`evt) action { self suspendPlanInstances: evt . } postcond processedEvents(1`evt) trans failPlanInstances precond aux4(1`evt) action { self failPlanInstances: evt . } postcond processedEvents(1`evt) trans succeedPlanInstances precond aux5(1`evt) action { self succeedPlanInstances: evt . } postcond processedEvents(1`evt) trans getIntention precond intentions(1`int) guard { int topPlanInstanceReady . int priority: p . self isMaxIntentionPriority: p . } postcond aux6(1`int) trans performIntentionStep precond aux6(1`int) guard { int topPlanInstance: planInstance . } action { planInstance doStep . } postcond intentions(1`int) inhibitor noSuchIntention: anIntention cond intentions(1`int) guard { int = anIntention . } inhibitor noPlanInstancesTriggeredBy: anEvent cond planTemplates(1`pt) guard { pt isTriggeredBy: anEvent . pt checkContext . } inhibitor isMaxIntentionPriority: p cond intentions(1`int) guard { int priority: pp . pp > p . } inhibitor noPlanInstancesSucceededBy: anEvent cond planInstances(1`pi) guard { pi isMadeSucceededBy: anEvent . } inhibitor noPlanInstancesWokenUpBy: anEvent cond planInstances(1`pi) guard { pi isWokenUpBy: anEvent . } inhibitor noSuchPlanInstance: aPlanInstance cond planInstances(1`pi) guard { pi = aPlanInstance . } inhibitor noPlanInstancesFailedBy: anEvent cond planInstances(1`pi) guard { pi isMadeFailedBy: anEvent . } inhibitor noPlanInstancesSuspendedBy: anEvent cond planInstances(1`pi) guard { pi isSuspendedBy: anEvent . } method addPlanInstance: aPlanInstance place aPlanInstance() place return() trans addPlanInstance precond aPlanInstance(1`pi) postcond return(1`self), planInstances(1`pi) method wakeUpPlanInstances: anEvent place anEvent() place return() trans wakeUpPlanInstance cond anEvent(1`e), planInstances(1`pi) guard { pi isWokenUpBy: e . } action { pi wakeUpBy: e . } trans noPlanInstancesToWakeUp precond anEvent(1`e) guard { self noPlanInstancesWokenUpBy: e . } postcond return(1`self) method removeIntention: anIntention place anIntention() place return() trans removeIntention precond anIntention(1`i), intentions(1`ii) guard { i = ii . } postcond return(1`self) trans noSuchIntention precond anIntention(1`i) guard { self noSuchIntention: i . } postcond return(1`self) method succeedPlanInstances: anEvent place anEvent() place return() trans succeedPlanInstance cond anEvent(1`e), planInstances(1`pi) guard { pi isMadeSucceededBy: e . } action { pi succeed . } trans noPlanInstancesToSucceed precond anEvent(1`e) guard { self noPlanInstancesSucceededBy: e . } postcond return(1`self) method createPlanInstances: anEvent place anEvent() place return() place pi() trans createPlanInstance cond planTemplates(1`pt) precond anEvent(1`evt) guard { pt isTriggeredBy: evt . pt checkContext . } action { pi := pt createInstanceFor: evt . self addPlanInstance: pi . } postcond pi(1`(evt, pi)) trans done precond anEvent(1`evt) guard { self noPlanInstancesTriggeredBy: evt . } postcond return(1`self) trans newIntention precond pi(1`(evt, pi)) guard { evt intention: i . #nil = i . } action { int := Intention new . evt intention: int . int addPlanInstance: pi . self addIntention: int . } postcond return(1`self) trans existingIntention precond pi(1`(evt, pi)) guard { evt intention: int . #nil ~= int . } action { int addPlanInstance: pi . } postcond return(1`self) method addEvent: anEvent place anEvent() place return() trans addEvent precond anEvent(1`e) postcond return(1`self), eventQueue(1`e) method addIntention: anIntention place anIntention() place return() trans addIntention precond anIntention(1`i) postcond return(1`self), intentions(1`i) method removePlanInstance: aPlanInstance place aPlanInstance() place return() trans removePlanInstance precond aPlanInstance(1`pi), planInstances(1`pii) guard { pi = pii . } postcond return(1`self) trans noSuchPlanInstance precond aPlanInstance(1`pi) guard { self noSuchPlanInstance: pi . } postcond return(1`self) method failPlanInstances: anEvent place anEvent() place return() trans failPlanInstance cond anEvent(1`e), planInstances(1`pi) guard { pi isMadeFailedBy: e . } action { pi fail . } trans noPlanInstancesToFail precond anEvent(1`e) guard { self noPlanInstancesFailedBy: e . } postcond return(1`self) method suspendPlanInstances: anEvent place anEvent() place return() trans suspendPlanInstance cond anEvent(1`e), planInstances(1`pi) guard { pi isSuspendedBy: e . } action { pi suspendBy: e . } trans noPlanInstancesToSuspend precond anEvent(1`e) guard { self noPlanInstancesSuspendedBy: e . } postcond return(1`self) method create place start(1`#e) place return() trans createInitialValues precond start(1`#e) postcond return(1`self) '). 'BWAgent' -> (PNCompiledClass compileClass: 'class BWAgent is_a BDIAgent object place on() place clear() place start(1`#e) trans sss precond start(1`#e) action { self create . } inhibitor notClear: obj cond clear(1`obj) inhibitor isNot: obj1 on: obj2 cond on(1`(obj1, obj2)) sync is: obj1 on: obj2 cond on(1`(obj1, obj2)) sync clear: obj cond clear(1`obj) method addOnBelief: aTuple place aTuple() place return() trans addBelief precond aTuple(1`tuple) postcond return(1`self), on(1`tuple) method addClearBelief: aSymbol place aSymbol() place return() trans addBelief precond aSymbol(1`symbol) postcond return(1`self), clear(1`symbol) method create place start(1`#e) place step2() place return() trans createInitialValues precond start(1`#e) action { int := Intention new . p1 := BWStackPlanTemplate new . p1 create: self . p2 := BWTopLevelPlanTemplate new . p2 create: self . } postcond currentIntention(1`int), planTemplates(1`p1), planTemplates(1`p2), step2(1`#e) trans createEvt precond step2(1`#e) action { se := BWStartEvent new . self addEvent: se . } postcond return(1`self) method addBelief: obj1 on: obj2 place obj1() place obj2() place return() trans addBelief precond obj1(1`obj1), obj2(1`obj2) postcond return(1`self), on(1`(obj1, obj2)) method move: obj1 on: obj2 place obj1() place obj2() place step2() place step3() place return() trans canMove precond obj1(1`obj1), obj2(1`obj2) guard { self clear: obj1 . self clear: obj2 . } postcond step2(1`(obj1, obj2)) trans clear precond step2(1`(obj1, obj2)), clear(1`obj2) guard { #Table ~= obj2 . } postcond step3(1`(obj1, obj2)) trans noClear precond step2(1`(obj1, obj2)) guard { #Table = obj2 . } postcond step3(1`(obj1, obj2)) trans update precond step3(1`(obj1, obj2)), on(1`(obj1, obj3)) action { Transcript show: ''Move: '' . Transcript show: obj1 . Transcript show: '' to: '' . Transcript show: obj2 . Transcript cr . } postcond on(1`(obj1, obj2)), clear(1`obj3), return(1`#success) '). 'CWMoveToPositionPlanTemplate' -> (PNCompiledClass compileClass: 'class CWMoveToPositionPlanTemplate is_a PlanTemplate object method create: anAgent place anAgent() place return() trans create precond anAgent(1`a) action { evt := CWMoveToPosGoal new . } postcond return(1`self), myAgent(1`a), triggerEvtTemplate(1`evt) method createInstanceFor: anEvent place return() place anEvent() trans create cond myAgent(1`agent) precond anEvent(1`evt) action { pi := CWMoveToPositionPlanInstance new . pi createFor: evt at: agent . agent addPlanInstance: pi . } postcond return(1`pi) '). 'CWAgent' -> (PNCompiledClass compileClass: 'class CWAgent is_a BDIAgent object place start(1`#e) place s2() place wastePosition() place carryingWaste() place agentPosition() trans start precond start(1`#e) action { self initializeAgent . } postcond s2(1`#e) trans s2 precond s2(1`#e) action { we := CWNewWasteEvent new . we createForX: 5 Y: 5 . self addEvent: we . } sync carryingWaste cond carryingWaste(1`#true) sync notCarryingWaste cond carryingWaste(1`#false) sync atWastePosition cond wastePosition(1`wp), agentPosition(1`ap) guard { wp = ap . } inhibitor notAtWastePosition cond wastePosition(1`wp), agentPosition(1`ap) guard { wp = ap . } sync agentPosition: aPosition cond agentPosition(1`aPosition) method moveToPosition: aPosition place aPosition() place return() trans move precond aPosition(1`(tx, ty)), agentPosition(1`(ax, ay)) action { nx := ax + ((tx - ax ) sign ) . ny := ay + ((ty - ay ) sign ) . Transcript show: ''-- EXTERNAL ACTION -- MOVE -- ('' . Transcript show: nx . Transcript show: '', '' . Transcript show: ny . Transcript show: '').'' . } postcond agentPosition(1`(nx, ny)), return(1`self) method pickWaste place return() trans pick cond agentPosition(1`ap) precond wastePosition(1`wp), carryingWaste(1`#false) guard { ap = wp . } action { Transcript show: '' -- ACTION PICK --'' . } postcond return(1`self), carryingWaste(1`#true) method addWasteAtPosition: aPosition place aPosition() place return() trans addWaste precond aPosition(1`position) postcond return(1`self), wastePosition(1`position) method initializeAgent place start(1`#e) place return() trans initialize precond start(1`#e) action { self create . cwpt := CWCollectWastePlanTemplate new . cwpt create: self . mtpt := CWMoveToPositionPlanTemplate new . mtpt create: self . } postcond carryingWaste(1`#false), agentPosition(1`(1, 1)), return(1`self), planTemplates(1`cwpt), planTemplates(1`mtpt) '). 'RCRobotHitEvent' -> (PNCompiledClass compileClass: 'class RCRobotHitEvent is_a RCSensorEvent object place type(1`#RCRobotHitEvent) '). }; yourself) . 'CarSharing' -> (MyRepository new instVarNamed: 'name' put: 'CarSharing'; addComponents: { 'Test' -> (PNCompiledClass compileClass: 'class Test is_a PN object place p1(100`#e) place p2() place p3() place p4() place p5() trans t1 precond p1(1`#e) action { rn := RegistrationNet new . } postcond p2(1`rn) trans t2 precond p2(1`rn) guard { rn login: ''qqq'' . } postcond p3(1`rn) trans t3 precond p3(1`rn) guard { rn user: u . } postcond p4(1`(rn, u)) trans t4 precond p4(1`(rn, u)) guard { rn logout: u . } postcond p5(1`#e) trans t5 precond p5(100`#e) action { Transcript show: ''hotovo'' . Transcript cr . } '). 'RegistrationNet' -> (PNCompiledClass compileClass: 'class RegistrationNet is_a PN object place ready(1`#e) place name() place user() place verifiedUser() trans verify precond name(1`name) action { u := self verify: name . } postcond user(1`u) trans isNil precond user(1`u) guard { u = #nil . } postcond ready(1`#e) trans notNil precond user(1`u) guard { u != #nil . } postcond verifiedUser(1`u) sync login: name precond ready(1`#e) postcond name(1`name) sync isReady cond ready(1`#e) sync user: u cond verifiedUser(1`u) sync logout: u precond verifiedUser(1`u) guard { u logout . } postcond ready(1`#e) method login: name place name() place p() place return() trans do precond name(1`name) guard { self login: name . } postcond p(1`#e) trans ok precond p(1`#e) guard { self user: u . } postcond return(1`u) trans fail precond p(1`#e) guard { self isReady . } postcond return(1`#nil) method verify: name place name() place return() trans verify precond name(1`name) action { user := (UserNet new ) name: name . } postcond return(1`user) '). 'UserNet' -> (PNCompiledClass compileClass: 'class UserNet is_a PN object place name() place ready(1`#e) place resOpened() place reservations() sync reserveCar: c precond resOpened(1`#e) postcond reservations(1`c), ready(1`#e) sync logout precond ready(1`#e) sync reserveCar precond ready(1`#e) postcond resOpened(1`#e) sync reservations: c cond reservations(1`c) sync cancelRes precond resOpened(1`#e) postcond ready(1`#e) method name: nn place nn() place return() trans do precond nn(1`name) postcond name(1`name), return(1`self) method addCar: car place car() place return() trans do precond car(1`c) guard { self reserveCar: c . } postcond return(1`c) '). }; yourself) . 'ConferenceExample' -> (MyRepository new instVarNamed: 'name' put: 'ConferenceExample'; addComponents: { #ReviewerNet -> (PNCompiledClass compileClass: 'class ReviewerNet is_a PN object place name() place conference() place author() sync name: n cond name(1`n) sync downloadPaper: p byAuthor: a cond conference(1`c) guard { (((c phase: 2 ) & (c author: a ) ) & (a review: nil ) ) & (a paper: p ) . } postcond author(1`a) sync uploadReview: r ofPaperByAuthor: a cond conference(1`c), author(1`a) guard { (c phase: 2 ) & (a putReview: r ) . } sync downloadedAuthor: a cond author(1`a) method setName: n place n() place return() trans t precond n(1`n) postcond name(1`n), return(1`n) method conf: c place c() place return() trans t precond c(1`c) postcond conference(1`c), return(1`c) '). 'RegistrationNet' -> (PNCompiledClass compileClass: 'class RegistrationNet is_a PN object place conference() place ready(1`#e) place name() place user() place verifiedUser() trans verify precond name(1`(name, type)) action { u := self newverify: name as: type . } postcond user(1`u) trans isNil precond user(1`u) guard { u = #nil . } postcond ready(1`#e) trans notNil precond user(1`u) guard { u != #nil . } postcond verifiedUser(1`u) sync isReady cond ready(1`#e) sync login: name as: type precond ready(1`#e) postcond name(1`(name, type)) sync user: u cond verifiedUser(1`u) sync logout: u precond verifiedUser(1`u) guard { u logout . } postcond ready(1`#e) method verify: name as: type place name() place type() place return() trans verifyAuthor cond conference(1`conf) precond name(1`name), type(1`#author) guard { conf author: a named: name . } action { net := (AuthorNet new ) for: a . } postcond return(1`net) trans verifyReviewer cond conference(1`conf) precond name(1`name), type(1`#reviewer) guard { conf reviewer: a named: name . } action { net := (ReviewerNet new ) for: a . } postcond return(1`net) trans verifyAdmin cond conference(1`conf) precond name(1`name), type(1`#admin) guard { conf admin: a named: name . } action { net := (AdminNet new ) for: a . } postcond return(1`net) trans notMember cond conference(1`conf) precond name(1`name) guard { conf notMemberNamed: name . } postcond return(1`#nil) method conference: c place c() place return() trans t precond c(1`c) postcond conference(1`c), return(1`c) method newverify: name as: type place name() place type() place m() place return() trans t1 cond conference(1`c) precond name(1`n), type(1`t) guard { c member: m named: n . } postcond m(1`(c, m, t)) trans t2 cond conference(1`c) precond name(1`n) guard { c notMemberNamed: n . } postcond return(1`#nil) trans t3 precond m(1`(c, m, #author)) guard { m isAuthor . } action { net := AuthorNet new . net setMember: m . net conf: c . } postcond return(1`net) trans not precond m(1`(c, m, t)) guard { m notType: t . } postcond return(1`#nil) method verify: name for: type place name() place type() place types(1`(#author, #AuthorNet), 1`(#reviewer, #ReviewerNet), 1`(#admin, #AdminNet)) place member() place return() trans verifyMember cond conference(1`conf) precond name(1`name) guard { conf member: m named: name . } postcond member(1`m) trans verifyType cond conference(1`conf) precond member(1`m), type(1`type), types(1`(type, netClass)) guard { m type: type . } action { net := ((self classNamed: netClass ) new ) for: m . } postcond return(1`net) '). 'Conference' -> (PNCompiledClass compileClass: 'class Conference is_a PN object place dates(1`(0, #open), 1`(100, #review), 1`(100, #final), 1`(100, #close)) place canNextPhase(1`#e) place phase() place members() place papers() trans nextPhase precond canNextPhase(1`#e), dates(1`(t, phase)) action { self hold: t . } postcond canNextPhase(1`#e), phase(1`phase) sync phase: p cond phase(1`p) sync paper: p cond papers(1`p) sync reviewer: r cond members(1`r) guard { r isReviewer . } inhibitor notMemberNamed: n cond members(1`m) guard { m name: n . } sync member: m named: n cond members(1`m) guard { m name: n . } sync author: a cond members(1`a) guard { r isAuthor . } method addPaper: p place p() place return() trans t precond p(1`p) postcond papers(1`p), return(1`p) method addMember: m place m() place return() trans t precond m(1`m) postcond members(1`m), return(1`m) '). 'Member' -> (PNCompiledClass compileClass: 'class Member is_a PN object place type() place name() place papers() sync name: n cond name(1`n) inhibitor notType: t cond type(1`t) sync paper: p cond papers(1`p) sync isReviewer cond type(1`#reviewer) sync isAdmin cond type(1`#admin) sync type: t cond type(1`t) inhibitor notAuthor cond type(1`#author) sync isAuthor cond type(1`#author) method setName: n place n() place return() trans t precond n(1`n) postcond name(1`n), return(1`n) method as: aType place aType() place return() trans t precond aType(1`t) postcond type(1`t), return(1`t) method netForAuthor place return() place do(1`#e) trans t1 cond type(1`#author) precond do(1`#e) action { ret := (AuthorNet new ) setMember: self . } postcond return(1`ret) trans t2 precond do(1`#e) guard { self notAuthor . } postcond return(1`#nil) method putPaper: p place p() place return() trans t precond p(1`p) postcond papers(1`p), return(1`p) '). #AuthorNet -> (PNCompiledClass compileClass: 'class AuthorNet is_a PN object place conference() place member() sync paper: p cond member(1`m) guard { m paper: p . } sync review: r cond member(1`m) guard { m review: r . } sync cannotPutPaper cond conference(1`c) guard { c phase: #final . } sync canPutPaper cond conference(1`c) guard { c phase: #open . } sync cannotPutReview cond conference(1`c) guard { c phase: #final . } sync member: m cond member(1`m) sync canPutReview cond conference(1`c) guard { c phase: #review . } method setMember: m place m() place return() trans t precond m(1`m) postcond member(1`m), return(1`m) method addPaper: p place p() place return() trans t1 cond member(1`m) precond p(1`p) guard { self canPutPaper . } action { m putPaper: p . } postcond return(1`#true) trans t2 cond conference(1`c), member(1`m) precond p(1`p) guard { self cannotPutPaper . } postcond return(1`#false) method conf: c place c() place return() trans t precond c(1`c) postcond conference(1`c), return(1`c) method addReview: r place r() place return() trans t1 cond member(1`m) precond r(1`r) guard { self canPutReview . m putReview: r . } postcond return(1`true) trans t2 cond conference(1`c), member(1`m) precond r(1`p) guard { self cannotPutReview . } postcond return(1`false) '). 'Review' -> (PNCompiledClass compileClass: 'class Review is_a PN object '). 'Paper' -> (PNCompiledClass compileClass: 'class Paper is_a PN object place authors() place document() place review() sync review: r cond review(1`r) sync document: d cond document(1`d) sync author: a cond authors(1`a) inhibitor reviewEmpty cond review(1`r) inhibitor empty cond document(1`d) method putReview: r place r() place return() trans t1 precond r(1`r), review(1`old) postcond review(1`r), return(1`r) trans t2 precond r(1`r) guard { self reviewEmpty . } postcond review(1`r), return(1`r) method author: a place a() place return() trans t precond a(1`a) postcond authors(1`a), return(1`a) method putDocument: d place d() place return() trans t1 precond d(1`d), document(1`old) postcond document(1`d), return(1`d) trans t2 precond d(1`d) guard { self empty . } postcond document(1`d), return(1`d) '). 'AdminNet' -> (PNCompiledClass compileClass: 'class AdminNet is_a PN object '). 'Test' -> (PNCompiledClass compileClass: 'class Test is_a PN object place start(1`#e) place conference() place author() place f1() place f2() place net() place net2() trans start precond start(1`#e) action { c := Conference new . m := Member new . m as: #author . m setName: ''me'' . c addMember: m . } postcond conference(1`c) trans t1 precond conference(1`c) action { net := RegistrationNet new . net conference: c . } postcond net(1`(c, net)) trans t2 precond net(1`(c, net)) guard { net login: ''me'' as: #author . } postcond net2(1`(c, net)) trans t3 precond net2(1`(c, net)) guard { net user: a . } postcond author(1`(c, a)) trans t4 precond author(1`(c, a)) guard { a canPutPaper . } action { a addPaper: ''p1'' . } postcond f1(1`a) trans t5 precond author(1`(c, a)) guard { a cannotPutPaper . } postcond f2(1`a) '). }; yourself) . 'Testing' -> (MyRepository new instVarNamed: 'name' put: 'Testing'; addComponents: { 'TestGUI2' -> (PNCompiledClass compileClass: 'class TestGUI2 is_a TestGUI object place ppp() trans ttt precond p(1`#e) postcond ppp(1`#e) method m trans t '). 'Ackermann' -> (PNCompiledClass compileClass: 'class Ackermann is_a PN object method x: x y: y place x() place y() place return() trans one precond x(1`x), y(1`y) guard { x = 0 . } action { z := y + 1 . } postcond return(1`z) trans two precond x(1`x), y(1`y) guard { x > 0 . y = 0 . } action { x2 := x - 1 . z := self x: x2 y: 1 . } postcond return(1`z) trans three precond x(1`x), y(1`y) guard { x > 0 . y > 0 . } action { x2 := x - 1 . y2 := y - 1 . inner := self x: x y: y2 . z := self x: x2 y: inner . } postcond return(1`z) '). 'TestGC03' -> (PNCompiledClass compileClass: 'class TestGC03 is_a PN object '). 'Optim01' -> (PNCompiledClass compileClass: 'class Optim01 is_a PN object place start(1`#a, 1`#e) place p() place max(1`1000) trans never precond max(1`i) guard { i > 10000 . } trans first precond start(1`#e) action { Transcript show: ((Time current ) printString ) . Transcript cr . } postcond p(1`0) trans t cond max(1`max) precond p(1`i) guard { i <= max . } action { ii := i + 1 . } postcond p(1`ii) trans tt cond max(1`max) precond p(1`i) guard { i > max . } action { Transcript show: ((Time current ) printString ) . Transcript cr . } '). 'Test007' -> (PNCompiledClass compileClass: 'class Test007 is_a PN object place p(1`#e) place in(1`600, 1`500, 1`900) place out() trans t cond in(1`t) precond p(1`#e) action { self hold: t . Transcript show: (t printString ) . Transcript cr . } postcond out(1`t), p(1`#e) '). 'TestInhibitor' -> (PNCompiledClass compileClass: 'class TestInhibitor is_a PN object place p() sync s precond p(1`#e) inhibitor i precond p(1`#e) method test place start(1`#e) place return() trans t1 precond start(1`#e) guard { self s . } action { Transcript show: ''sync'' . Transcript cr . } postcond return(1`#e) trans t2 precond start(1`#e) guard { self i . } action { Transcript show: ''inhibitor'' . Transcript cr . } postcond return(1`#e) '). 'Example1' -> (PNCompiledClass compileClass: 'class Example1 is_a PN object place start(1`#e) place size(1`0) trans inc precond start(1`#e), size(1`size) action { newSize := size + 1 . } postcond start(1`#e), size(1`newSize) method zero place return() trans zero precond size(1`size) postcond size(1`0), return(1`0) '). 'DEVSTest' -> (PNCompiledClass compileClass: 'class DEVSTest is_a PN object inputPlace p1(1`4) outputPlace p2() trans t precond p1(1`a) action { b := self get: a . } postcond p2(1`b) method get: a place a() place return() trans t precond a(1`a) action { b := a + 20 . } postcond return(1`b) '). 'TestPer' -> (PNCompiledClass compileClass: 'class TestPer is_a PN object place p1(1`100) place p2() trans t1 precond p1(1`x) guard { x > 0 . } action { xx := x - 1 . } postcond p1(1`xx), p2(1`xx) trans t2 cond p2(1`x) '). 'Example2' -> (PNCompiledClass compileClass: 'class Example2 is_a PN object place start(1`#e) place goal(1`0) trans inc precond start(1`#e) action { col := FillInTheBlankMorph request: '' Neco zadej ! '' . } postcond goal(1`col) '). 'Test001' -> (PNCompiledClass compileClass: 'class Test001 is_a PN object place p1(1`#e) place p2() place p3() place p4() trans b1 precond p1(1`#e) action { Transcript show: ''t1'' . } postcond p2(1`#e), p3(1`#e) trans c2 precond p2(1`e) action { Transcript show: ''t2'' . } postcond p4(1`e) trans a3 precond p3(1`e) action { Transcript show: ''t3'' . } postcond p4(1`e) trans b4 precond p3(1`e) action { Transcript show: ''t4'' . } postcond p4(1`e) '). 'TestGUI' -> (PNCompiledClass compileClass: 'class TestGUI is_a PN object place p() place ppp() inhibitor i cond p(1`#e) guard { a > 10 . } action { d := 10 . } sync s1 cond p(1`#e) sync port1 inhibitor inhib1 precond ppp(1`#w) sync rrr sync p2 cond p(1`#w) method test01 place p1() place p2(1`#e) place p3(2`#w) trans t cond p2(1`#e) precond p1(1`a), p3(1`q) guard { a > 10 . } action { aa := a - 1 . } postcond p1(1`aa), p3(1`i), p(1`aa) '). 'Test002' -> (PNCompiledClass compileClass: 'class Test002 is_a PN object place c(1`#Test001) place cls() place obj() trans t precond c(1`cname) action { cls := self classNamed: cname . o := cls new . } postcond cls(1`cls), obj(1`o) '). 'TestA' -> (PNCompiledClass compileClass: 'class TestA is_a PN object place onplace(1`#e) method go place go1() place return() trans got precond go1(1`a), onplace(1`#e) postcond return(1`a) '). 'Test003' -> (PNCompiledClass compileClass: 'class Test003 is_a PN object place p1(1`#nil) place p2(1`#nul) trans t precond p1(1`int) guard { int ~= #nul . } postcond p2(1`#e) '). 'Test004' -> (PNCompiledClass compileClass: 'class Test004 is_a PN object place p1(1`(#e, #f, #g)) place p2() trans t1 precond p1(1`(x, y, z)) postcond p2(1`(x, y, z)) '). 'TestGC01' -> (PNCompiledClass compileClass: 'class TestGC01 is_a PN object place p1(1`#e) place p2() trans t precond p1(1`#e) action { o1 := TestGC02 new . o2 := TestGC02 new . o1 set: o2 . o2 set: o1 . } '). 'Test005' -> (PNCompiledClass compileClass: 'class Test005 is_a PN object place p(1`#e) place p2() place p3() place p4() trans t1 precond p(1`#e) action { a := Ackermann new . b := Ackermann new . } postcond p2(1`a), p3(1`b) trans t2 precond p2(1`a), p3(1`b) guard { a ~= a . } postcond p4(1`a) '). 'Test' -> (PNCompiledClass compileClass: 'class Test is_a PN object place p1(1`#e) place p2() trans t precond p1(1`#e) action { o := TestA new . a := (o go ) + 2 . b := a + 3 . } postcond p2(1`b) '). 'TestGC02' -> (PNCompiledClass compileClass: 'class TestGC02 is_a PN object place p() method set: anObj place anObj() place return(1`#e) trans t precond anObj(1`o) action { Transcript show: ''jjj'' . Transcript cr . } postcond p(1`o), return(1`#e) '). 'Test006' -> (PNCompiledClass compileClass: 'class Test006 is_a PN object place aa(1`1.34) place a(1`(3, (4, 5))) place p(1`(3, 4)) place b() trans t precond a(1`(x, (y, z))) action { a := #(2 3) select: [:w | w = x] . } postcond b(1`a) '). }; yourself) . #DJDExample -> (MyRepository new instVarNamed: 'name' put: #DJDExample; addComponents: { 'Case' -> (PNCompiledClass compileClass: 'class Case is_a PN object place start(1`#e) place p2() place p31() place p32() place p41() place p42() place p5() place p6() place p71() place p72() place p73() place stop() sync record precond start(1`#e) postcond p2(1`#e) sync dec1 precond p6(1`#e) postcond p71(1`#e) sync collect precond p41(1`#e), p42(1`#e) postcond p5(1`#e) sync examine precond p5(1`#e) postcond p6(1`#e) sync dec2 precond p6(1`#e) postcond p72(1`#e) sync print precond p2(1`#e) postcond p31(1`#e), p32(1`#e) sync suspend precond p73(1`#e) postcond stop(1`#e) sync dec3 precond p6(1`#e) postcond p73(1`#e) sync complete precond p32(1`#e) postcond p42(1`#e) sync summon precond p72(1`#e) postcond stop(1`#e) sync verify precond p31(1`#e) postcond p41(1`#e) sync charge precond p71(1`#e) postcond stop(1`#e) '). 'Structure' -> (PNCompiledClass compileClass: 'class Structure is_a PN object place start(1`#e) place p1() place p2() place p3() place p4() place p5() place p6() place p7() place p8() trans newCase precond start(1`#e) action { c := Case new . } postcond p1(1`c) trans official1a precond p1(1`c) guard { c record . } postcond p2(1`c) trans official1b precond p1(1`c) guard { c examine . } postcond p2(1`c) trans printer precond p2(1`c) guard { c print . } postcond p5(1`c), p6(1`c) trans secretary precond p5(1`c) guard { c verify . } postcond p7(1`c) trans official2 precond p6(1`c) guard { c complete . } postcond p8(1`c) trans putTogether precond p7(1`c), p8(1`c) guard { c collect . } postcond p1(1`c) trans prosecutor1a precond p2(1`c) guard { c dec1 . } postcond p3(1`c) trans prosecutor1b precond p2(1`c) guard { c dec2 . } postcond p3(1`c) trans prosecutor1c precond p2(1`c) guard { c dec3 . } postcond p3(1`c) trans tribunal1a precond p3(1`c) guard { c charge . } postcond p4(1`c) trans tribunal1b precond p3(1`c) guard { c summon . } postcond p4(1`c) trans official3 precond p3(1`c) guard { c suspend . } postcond p4(1`c) '). }; yourself) . 'AgentExample' -> (MyRepository new instVarNamed: 'name' put: 'AgentExample'; addComponents: { 'Agent' -> (PNCompiledClass compileClass: 'class Agent is_a PN object place wastePos(1`(1, 5), 1`(3, 2), 1`(4, 8)) place binPos() place notAtBinPosition(1`#e) place carryWaste() place myPos(1`(1, 1)) place binCnt(1`0) place notAtWastePos(1`#e) place noPlan(1`#e) place notCarryWaste(1`#e) place havePlan() place wasteCnt(1`3) trans ExecutePlan precond havePlan(1`p) action { p execute . } postcond noPlan(1`#e) trans CreatePlan cond wasteCnt(1`cnt) precond noPlan(1`#e) guard { cnt > 0 . self notCarryingWaste . } action { p := CollectWastePlan new . p createPlan: self . } postcond havePlan(1`p) sync notAtBinPosition cond notAtBinPosition(1`#e) sync notCarryingWaste cond notCarryWaste(1`#e) sync atWastePosition cond wastePos(1`(wx, wy)), myPos(1`(mx, my)) guard { mx = wx . my = wy . } sync atBinPosition cond myPos(1`(mx, my)), binPos(1`(bx, by)) guard { mx = bx . my = by . } sync notAtWastePosition cond notAtWastePos(1`#e) method getClosestWaste place wastePosTmp() place closestWaste() place return() place counter(1`0) place minDstc(1`10000) place doIntOnce(1`#e) trans getClosestWaste cond counter(1`x), wastePosTmp(1`(minDstc, wx, wy)), minDstc(1`minDstc), wasteCnt(1`wasteCnt) precond doIntOnce(1`#e) guard { x = wasteCnt . } postcond closestWaste(1`(wx, wy)) trans countDistance cond myPos(1`(mx, my)), wasteCnt(1`wasteCnt), doIntOnce(1`#e) precond wastePos(1`(wx, wy)), minDstc(1`minDstc), counter(1`x) guard { wasteCnt > 0 . } action { dstc := (((mx - wx ) + (((my - wy ) * (mx - wx ) ) * (my - wy ) ) ) abs ) sqrt . y := x + 1 . newMin := dstc min: minDstc . } postcond counter(1`y), minDstc(1`newMin), wastePosTmp(1`(dstc, wx, wy)) trans finish cond counter(1`x) precond closestWaste(1`(wx, wy)) guard { x = 0 . } postcond return(1`(wx, wy)) trans noWaste cond wasteCnt(1`wasteCnt) guard { wasteCnt = 0 . } postcond return(1`(#e, #e)) trans returnWp cond closestWaste(1`(wwx, wwy)) precond wastePosTmp(1`(dstc, wx, wy)), counter(1`x) action { y := x - 1 . } postcond counter(1`y), wastePos(1`(wx, wy)) method pickWaste place return() trans pickWaste cond myPos(1`(mx, my)) precond wastePos(1`(wx, wy)), notCarryWaste(1`#e), wasteCnt(1`cnt) guard { mx = wx . my = wy . } action { newCnt := cnt - 1 . Transcript show: ''actionPick'' . Transcript cr . } postcond carryWaste(1`#e), return(1`#e), wasteCnt(1`newCnt), notAtWastePos(1`#e) method moveToPosX: posX Y: posY place posY() place closestWaste() place checkWasteStart() place posX() place return() trans nonename169 precond checkWasteStart(1`#e) action { cw := self getClosestWaste . } postcond closestWaste(1`cw) trans nonename165 cond myPos(1`mp) precond closestWaste(1`cw) guard { cw notEquals: mp . } postcond return(1`#success) trans move precond myPos(1`(mx, my)), posX(1`posX), posY(1`posY) action { d := (posX - mx ) sign . newX := mx + d . d := (posY - my ) sign . newY := my + d . Transcript show: ''actionMove ('' . Transcript show: (newX printString ) . Transcript show: '','' . Transcript show: (newY printString ) . Transcript show: '')'' . Transcript cr . } postcond myPos(1`(newX, newY)), checkWasteStart(1`#e) trans isWastePosition cond myPos(1`mp) precond notAtWastePos(1`#e), closestWaste(1`cw) guard { cw = mp . } postcond return(1`#success) '). 'CollectWastePlan' -> (PNCompiledClass compileClass: 'class CollectWastePlan is_a PN object place myAgent() method createPlan: anAgent place anAgent() place return() trans initt precond anAgent(1`anAgent) postcond return(1`#e), myAgent(1`anAgent) method execute place start(1`#e) place return() place result() trans pickWaste cond myAgent(1`myAgent) precond start(1`#e) guard { myAgent atWastePosition . myAgent notCarryingWaste . } action { myAgent pickWaste . } postcond return(1`#success) trans moveSucc precond result(1`res) guard { res = #success . } postcond start(1`#e) trans createMoveToWastePlan cond myAgent(1`myAgent) precond start(1`#e) guard { myAgent notAtWastePosition . } action { p := MoveToWastePlan new . p createPlan: myAgent . res := p execute . } postcond result(1`res) trans fail precond result(1`res) guard { res = #failure . } postcond return(1`#failure) '). 'Test' -> (PNCompiledClass compileClass: 'class Test is_a PN object place p1(5`(1, 5)) place p2() place p3(1`3) trans t1 precond p3(1`x), p1(x`(a, b)) postcond p2(1`#e) '). 'MoveToWastePlan' -> (PNCompiledClass compileClass: 'class MoveToWastePlan is_a PN object place myAgent() method createPlan: anAgent place anAgent() place return() trans initt precond anAgent(1`anAgent) postcond myAgent(1`anAgent), return(1`#e) method execute place start(1`#e) place wastePosition() place return() trans getWaste cond myAgent(1`myAgent) precond start(1`#e) guard { myAgent notAtWastePosition . } action { wastePos := myAgent getClosestWaste . } postcond wastePosition(1`wastePos) trans moveToWaste cond myAgent(1`myAgent) precond wastePosition(1`(x, y)) guard { myAgent notAtWastePosition . } action { myAgent moveToPosX: x Y: y . } postcond wastePosition(1`(x, y)) trans done cond myAgent(1`myAgent) precond start(1`#e) guard { myAgent atWastePosition . } postcond return(1`#success) trans moveComplete cond myAgent(1`myAgent) precond wastePosition(1`wastePos) guard { myAgent atWastePosition . } postcond return(1`#success) '). }; yourself) . #BankExample -> (MyRepository new instVarNamed: 'name' put: #BankExample; addComponents: { 'Bank' -> (PNCompiledClass compileClass: 'class Bank is_a BankModel object place stat(1`(0, 0, 0)) place cashiers(5`#e) place FIFO2() place nonename185() place period(1`1) place tellers(5`#e) place p3() place p4() place p5(1`#e) place cashiers(5`#e) place move2() place move1() place clerks12(1`(5, 5)) place clerks(1`10) trans update_stat precond nonename185(1`arrival), stat(1`(oldCustOut, oldTotalTime, oldMaxTime)) action { custOut := oldCustOut + 1 . spent := (self time ) - arrival . totalTime := oldTotalTime + spent . maxTime := oldMaxTime max: spent . } postcond capacity(1`#e), stat(1`(custOut, totalTime, maxTime)) trans service2 precond FIFO2(1`arrival), cashiers(1`#e) action { self hold: ((Normal mean: 8 deviation: 2 ) next ) . } postcond cashiers(1`#e), nonename185(1`arrival) trans service precond FIFO(1`arrival), tellers(1`#e) action { self hold: ((Normal mean: 6 deviation: 1 ) next ) . } postcond FIFO2(1`arrival), tellers(1`#e) trans inner cond clerks(1`maxClerks), period(1`period) precond clerks12(1`(old1, old2)), p5(1`#e) guard { period <= 3 . } action { result := self innerSimulationForPeriod: period maxClerks: maxClerks . cl1 := self consultManager: result . cl2 := maxClerks - cl1 . move1 := (old1 - cl1 ) max: 0 . move2 := (old2 - cl2 ) max: 0 . } postcond clerks12(1`(cl1, cl2)), move2(move1`#e), move1(move2`#e), p3(1`period) trans simulate precond p3(1`period) action { self hold: (#(120 240 120) at: period ) . } postcond p4(1`period) trans endOfSim precond period(1`period), stat(1`(custOut, totalTime, maxTime)) guard { period > 3 . } action { Transcript show: (''Customers: '' , (custOut printString ) ) . Transcript cr . Transcript show: (''avg. time: '' , ((totalTime / custOut ) printString ) ) . Transcript cr . Transcript show: (''max. time: '' , (maxTime printString ) ) . Transcript cr . } trans move1to2 precond tellers(1`#e), move1(1`#e) postcond cashiers(1`#e) trans move2to1 precond move2(1`#e), cashiers(1`#e) postcond tellers(1`#e) trans nextPeriod precond p4(1`period), period(1`period) action { nextPeriod := period + 1 . } postcond p5(1`#e), period(1`nextPeriod) method innerSimulationForPeriod: p maxClerks: c place p12() place p() place p13() place p11() place p14size(1`0) place p14init(1`#e) place p14() place p15() place return() place c() trans suspendTime precond c(1`c) action { self suspendTime . } postcond p11(1`c), p15(1`c) trans finish cond p14(1`results), p14size(1`size) precond p15(1`c) guard { size = c . } action { self activateTime . } postcond return(1`results) trans makeExperiment cond p(1`p) precond p12(1`(c, b)) action { result := b makeExperimentForPeriod: p clerks: c . } postcond p13(1`(c, result)) trans t14init precond p14init(1`#e) action { result := OrderedCollection new . } postcond p14(1`result) trans finishExperiment precond p13(1`(c, result)), p14(1`oldResults), p14size(1`oldSize) action { results := oldResults add: (Array with: c with: result ) . size := oldSize + 1 . } postcond p14(1`oldResults), p14size(1`size) trans nestedExperiment precond p11(1`c) guard { c > 0 . } action { b := BankModel newIn: (PNtalkWorld new ) . cc := c - 1 . } postcond p12(1`(c, b)), p11(1`cc) method consultManager: result place result() place return() trans consult precond result(1`result) action { self suspendTime . tellers := BankGUI consultResult: result . self activateTime . } postcond return(1`tellers) '). 'BankModel' -> (PNCompiledClass compileClass: 'class BankModel is_a PN object place FIFO() place period() place p1(1`#e) place p2() place clerks() place stat1(1`0) place stat2(1`0) place capacity(100`#e) place nonename87() trans enter precond p2(1`arrival), capacity(1`#e) postcond FIFO(1`arrival) trans update_stat precond nonename87(1`arrival), stat1(1`oldCustOut), stat2(1`oldTotalTime) action { totalTime := (oldTotalTime + (self time ) ) - arrival . custOut := oldCustOut + 1 . } postcond stat1(1`custOut), stat2(1`totalTime) trans generator cond period(1`period) precond p1(1`#e) guard { period <= 3 . } action { self hold: ((Uniform from: (#(1 2 1) at: period ) to: (#(4 9 3) at: period ) ) next ) . arrival := self time . } postcond p1(1`#e), p2(1`arrival) trans service precond FIFO(1`arrival), clerks(1`#e) action { self hold: ((Normal mean: 6 deviation: 1 ) next ) . } postcond capacity(1`#e), clerks(1`#e), nonename87(1`arrival) method makeExperimentForPeriod: p clerks: c place c() place p() place return() place p11() place nonename97() trans nonename95 precond p(1`p), c(1`c) postcond p11(1`#e), period(1`p), clerks(c`#e) trans experiment precond p11(1`#e) action { self hold: 100 . } postcond nonename97(1`#e) trans nonename90 precond nonename97(1`#e), stat1(1`custOut), stat2(1`totalTime), period(1`p) action { avgTime := totalTime / custOut . } postcond return(1`avgTime) '). }; yourself) . }; yourself) PKn9FF|\\install/postscriptself extractMember: 'PNtalk-classes.rps'. PNtalkSystem loadPNClasses: 'PNtalk-classes.rps'. PKm9'PNtalk-Core.mczPKn9oB88install/preamblePKV\9iTT{PNtalk-classes.rpsPKn9FF|\\q@install/postscriptPK@