doMC/0000755000176200001440000000000013213656003011073 5ustar liggesusersdoMC/inst/0000755000176200001440000000000013212620516012047 5ustar liggesusersdoMC/inst/examples/0000755000176200001440000000000013212617756013701 5ustar liggesusersdoMC/inst/examples/bootMC.R0000644000176200001440000000142411472541377015211 0ustar liggesuserslibrary(doMC) registerDoMC() x <- iris[which(iris[,5] != "setosa"), c(1,5)] trials <- 10000 ptime <- system.time({ r <- foreach(icount(trials), .combine=cbind) %dopar% { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) } })[3] cat(sprintf('Parallel time using doMC on %d workers: %f\n', getDoParWorkers(), ptime)) stime <- system.time({ r <- foreach(icount(trials), .combine=cbind) %do% { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) } })[3] cat(sprintf('Sequential time: %f\n', stime)) cat(sprintf('Speed up for %d workers: %f\n', getDoParWorkers(), round(stime / ptime, digits=2))) doMC/inst/doc/0000755000176200001440000000000013212620516012614 5ustar liggesusersdoMC/inst/doc/gettingstartedMC.pdf0000644000176200001440000040367513212620516016576 0ustar liggesusers%PDF-1.5 % 38 0 obj << /Length 2347 /Filter /FlateDecode >> stream xڥYIs6W* e6p_2,X1cO FU>v쳩mvΜXz4&$)+P,5X5jϔݎY,{vL-UM#DvwLl| . ׍P͙eUIѵn /Ѵ|1+I":灇oG!l|!xqWI䊶h- TMtS6.Pni^FF_5Z)B!U<^sYwѹzJz ZS\xHqΞ;nR0e%ap*P$i`tA}쌡=uEsԙx|_iFi4.ubl2Wݿ Yhqo&'|wX5'&%X1뿚i1&#?Ɛ$N| 4QShUBV捨[P'yC`%&kYqҐ%gb=ROPܠr-}In7 sj.{UW@mԤCx76=D0< |gSNZ@7j$i@mPUrY㘈-?w1 y(L0 ݈O`x!5}Q+&)htwCPg䉌 xMTAA~u)T3lqUՐōUngɩ^=aQڐ<4+H;*h:3 \v5J ' Œ9ݨ,UT,J}-Xyun6P&c蹙ĪX&LQ4KQ6NzOq†|TZ7vԹ2jŘz[Ev\ôxRGsN8ęM*̅BLӉ1h`J"j`wrsr!dAs4R(NY"!+zQ J8;n`;W70|~9YMyH|_&7:5!{²]1]C' 0@RI(ux*Ϸs]2\ۑU: FRr UNUnQKxc`d hge\{w,4j[1jm| ˁ̹j6i$ERqU ?GsePm^^?4cl|pʽ1VUMmz~96 >DN 1 &T6gQk H6()ot_|:DsӞܜƺBj%Pklш@`D jaetETb$JYqGRgr!ލI~܁u_| 4?n2p ^qs]0LUZZyrwfX6T0#>> ,#B$NA4Eꄣ:|g*v{k 5y7=N@7)*O3 endstream endobj 53 0 obj << /Length 2557 /Filter /FlateDecode >> stream xڥZYoG~ׯ2qs: DbaLe(QaG~Y@q:*J.gjˋi]ޛzfu7kM.V7a+\>5- 0xUx+x𽩆@',_o˹iaۋuqL̻Yf9{VV0L}>ѪW7~9St[ d@Hte|qկ%2GG#yQֳ8#rUrrj[8?xqyu絬Cwgw 5xbju-jtkżCu/LWpu{]!m}?"‰trNwT#UuGdlbNmif678[+7Mu?7]=]u/GXF];3M1շuTsǡɰU 7"1Ri]]b&61p` Bڹ&p2{t-ȯ(uHI \<}[CP_51  w.` 4^]u+WFwLjsڮy'(2x. nirܓ 4+y4llaU6 =l/2'q=(i, 8vaw8dѹlϺp (*4s(W?fC6ּu)ZۂS dc](ԳBQ uᘃ˿ WX'#%DQ,it0ǹwQk%Fhآ&ȴƏ1A֗ @?#`b!M/uW!ı7M/\s2)] X SS_ZGN$t_d0]$3adEeV<]T(',zQ$U%ror{!2'!)E1;!VFܑÊL"Gb LE h.|86~ 6o& v{J<=ietl@u FT+|PoYR_E mDL:,h`,8@p}gT2xZx-$)lj\ǐ0 l(ۈi->rq;/JUhEuP9'K34ƚʃ~ 0Xie-RzLJrY@cl p3Y+SUnզ:^J(?_n0!.ېdžS6?qɺs2u0dD3 v>&dţ!'mS_z޶t;5 < :bUhXO!@q.)*MB^CrxyZqhTי4w_4rAl)MdmRjhooiӶw $-'i2$[<;/:*~J D (Q w^ 4a'֪ng$m7LSǰ̑nm2j ũ}.MX=J:G)6lA;"9oX5 A9^ٲp~q>%(E{ȵb%Jk>|Iݰ*!xmq7=kzLh17UV0p"JR`c(1x஭]gem诈 b "jQM21m&td*.k>+%b;гK =g]QE,e](tHx' B%\N\/C2X*!vRTc3bLII mӂÞ[z ܏ ;Qd&`H."|p-0,ܜGGjZuWJ2)˲uK$`Y`7܄L\ӥ6u9p1 sf6!M]Jbx5r( as9o:}SuI:C1#?KI&,!e֗&K>'MTK3 KͻlC RdOr>k&&o:uR/QdUlm[UD(o>8j4 CntΓ܎r aƒpȳJ| G}{_=t\ʐjgMSRJ[NצIKK_W!5%cX1& ?eѯ"@J)cl5/ݾVEF*{O_3 SMIhK;z5> stream xXYoF~ׯ`Pk]rym&MM4SJe!RlH{ZrEn(P3;(XQbtUa NJAfe<8nC|\³Obc72\nQyj)ܟCSa)|F&Ug/GNGF.Tb`;9 "UipETF |WQt&Y** o5 P(lJʞ#Ʊa7ةEX]l==~(BI z(ʃB3}T֭`Re>D䏂htɶ{dP=t<[W1=-=k,Vi9ț^$?1D'*liIpC eq_w[$CUq"Ɠ׺598B.$hsV^r,8lydNs#qew"l+ ߣ @`j5$:&-EKٮDg/Ciџ7H,JSgI 2Sz)2?i4^T8MJ@) %jQ{{!?$vNt̬^y+u1"Sˀ`)!al1cDiO6Il!oH1b@Q@j04" hIx@*w`~#M  RrJWnbcv~\1Dͦ^; B83쒉 cpq$,.E\)SbIheb00M[&)c8ʍRsB*_3 N "*n\& W-xH Km!vk&ي.9lCFSܵJT^Bq]rs#d[jݺ԰n3spf>([8XVMwe²=1oH䈐9~@*A>n3H=h 9lfVdqٌ qN՟Cf3J = V Knz>cOPȘ<PFj DmR5;Cڋ G)O-,C<6v:ƢYorյ:~  ]w*_K(ou98v==Kh=ќ 8_\ l:wHOL":qpT<Jɘ2KhT"RP J+!erS}y TBgJhEׇ\E{3ubl.mpv%憯YH5g'/QAɋD'olIƣ&O ܳڅ3J#}hddN8 0az®VKp w,{! w.b+_Yڬ:o=Y:PpȚ;\L]G4pY.7¾ՌK~`b 8?4duڙnVujN[WE`]qU5_+/<Fo U}1L~?it_衿(ccNȿaL endstream endobj 64 0 obj << /Length 2377 /Filter /FlateDecode >> stream xڭYK6ϯ`bMECv˩ʖ֖4c,̿~ rMA4uD(]4,Ku&66eT.N2YEYo 6Kf>I]V:}#u|}Zmf}7W 0 F S.ˣfS(*je.ꇫ!2vgJ7w2n:l~gwH_E#zho/sٵ z-d7?;f<ϜP8 O00#["<L`Ga;#2x{|MN(T::mDY?CU+]\XLd%M5tUE4e\OyR+L 64lxibf%ҰY5V+"$V. q"ߣj$ [3vR[Ѻ?#t Mur[ ;/H4.vNd=}RfCxh`P+O"YݫDILM+YUl︮E%/fdAnх*v=X5!{2&iӪp#2{< 5s4U~փjht_S4 $d3u,m~n W`Jh5Oj/@B ;yGVNa/'fpeߞhq{#?74S?R$:*& V&B 3~YިEo‘@-h'Q4UZތ,ܢANG܌,d Б``?! 35dpuD25j9M.MRS[tʑgؼSL ~ 4[J: A8}}.(dEn P{M+Abͤ{A <+'np딦O2"N 'kv1ұ q5-B݁kr=s/ CRFnYK}՜KnpZim}0Y ,KW*=) 'SARsLCQdoӲ|\ "&6zA-y@M&^HYo/1TYzaQ׬/<Ʃk\Oxo,3%~A4Ff}$Ka掟7j,Cr@Slp 4f2`CžLfST$ `6{^#rHiO yyP!fT!/=b>ח/&^ȶ.cy` gV 'tRM"+xdZ<A&WHCjATN,/-Mq2 Qa'Lt^V:a[JKHDE$+EWHɔ4Wst9I/z}ޏ `M V~,`1Q<'9nxƃf7Ja"΋Rnq2w46LW;L'0fQ : 2>ONƥۓҗcR#~`|T"ZVr[u`fl!',''ɴ>k@p><'T[|ubK)̯5 (4_Y]V5C'GgUJ)OoZu| '5Rb Ot(Fb}-'4Ae0/ Yc3X$ ӻȮaK7{+ɿxס<۳еVX.LSCb|k;M@ ScV%kCf"Ȧ=ʅ\5̆f ⬨6/)cc}U?^0EA4/ E 0&}mPF*9ƹD8/Xvۋ@VQ74" 9aDR$K{Af{"\ {7"0 Gj#:.`:ɾL+% v0ٰ<77 =-\ ˊR:/\8v=Gw7*E$y n`7}p;2˃V9Cgrc[]2 ;)1 ~RY30iۉ R=oY<9GNo 91֧jL&_<r endstream endobj 69 0 obj << /Length 1622 /Filter /FlateDecode >> stream xXmo6_! (&W 뀮+!Q#ZNȱ1`y<=LLN~:|RrN'׉F2),"}[*g 43ڥxzA}ͼ|} _*ܙzSR!CDg J{.Y;ֿ7o@{52ND@êm{ / ,D҂y5$u#CjjSoKv:mz ;bLS)@zOrܨ#4OV5a?IuJup{J8Ng3l]E] ϐ1fOQy0mkx.7|J7ަ4>nvOm!py$YPSs&FӃDS:ހ6?ڧu.\' Ba?>{a73 pӚalNۺ>A3,?$7G4 z*CefڏG֯5|̼ BOT[YNe~z}/@{:m^K5^q ddIR* K SnbBP3.IH.#ehms_D׋.#\1b}N*7JS? |?_ endstream endobj 73 0 obj << /Length 915 /Filter /FlateDecode >> stream xڕVKs0W3FAfN2tЙ4jcScRcw_pL{H>}HZX}.>X[5[*;m25Yf u|* palaYvI`Z6xiia_V(yh'p~v=00 T>Q3ՉOռj*iT>NQd:pԲw܇7.DE.~*tBk `ήѼ.1s1"{8Xҙ-k`0Ѫ%^D*ASLZV$s$̽6ٜ2Lob3ѿ\;+ l&._y'FL׎N9~l_Sb Ϧ5GGz7-Ȟ}kBi ]wEy.J8)\ǀi;e&[H\6ưYcaij3 J1dɄ:4Ng.k$gnsyNʹ+sb_͠= 5~ O"Ȕg9BAT ~&m8/6q'I g)_tbFX0\% Z24/rD K @3Gwꚤ_E%_uNPUmRHVF3$s!XҠ>4[vr }>_xwN "}W{;O XMQj*gu4wt mO1wC-IdX^\`nlpeA2jv'Kf iYZ ƿ7S[3z=; h|5zRt xNذRJ IM[ h\nujUUҁ 9}Ѥ6͙4 m~0* }J endstream endobj 85 0 obj << /Length1 1902 /Length2 12459 /Length3 0 /Length 13639 /Filter /FlateDecode >> stream xڍP.wwkwA--K={W[S53Ov[3ZPs,C "fBՆځcG9@BbH96i3QPtpr8888\!B@w%@ uJA!V֮+)(G8@ :T -v-_)]]=<<؀.lPg+QF r9,[AƆJ жЂ]= brpyqs9Oh)(A$tENq#haw:xA`&:X&\@w hLt @VB|\,!.l.=N.@w o#TNN%`8 3`,?NLf u#fWVSc忝PO+/7-wu :8UpC<ZFR>+`Gor#O忳_ɺg!v^1*]p_ՕYO Vv" YC\-˟vߋfqC] +'py.2P[:;P9 |^GK*9@]CPgO.'K9r ggH9 $`7 -F;f|>7|naCx>X0_P7p}Fuhy .Jwu=PH`*A }7b7io8WS9.W.'A;ؘrѹ8 5pӚ25⛃Lr'[QXҢ 8%Uo̧}SqtY'-9b#DlbË!(j.J8bå*jB KRd.=Icy:hD[= I aoUK@G%z ;#ن:f˧ȅU~QՉ:1LBNm0麴cNyx:D3a&Ǡ;i|MaJB ۥH%\= U>ar獠clߥF| uQtd|NsTiQC#BgQoWܥ;y![BpH-3#l'-< >}*&aH 6KUZJ}R-3٠4!Jho"@(_Aw:af+[)M.]+a!44*>h X>\&!ϭlbc2z󋹙Aj_Gb:`_Æ2 /lS}W`ܳY} N@\(2x`U\:A`ВwF8wE2]_* RelI{ܔ~Qsҫy;ƩaR!:VQ2Fosߤk]\FXp~bXQ}Cm[e>F'j˕o`Prb^.9TM G@Dvaw^H1$Wf09꛽u&i[gKx$QK~6aJĿ!~o$[]f%h]`oP ҷ695 eHq^j+Zd@`b橡Yl,B]Wb҃kp}a69gqEIq_E=UrW7\3EϲCcοgft,(>Vd6G S$#%ƍBTE2j;ZyH`Y cH"O2EH~Vc>/ *)HrһO`)܄<rL8ItJW(mon`1.#!r|XupwaloC RS՟NLnj"#fˊ(R b¼'yh.~noT۩3ڿ^_RDvM:;g~;Q&.JJ+;:5ir٥'CeSdB^6F}ER ׯ!A^*/5bZ3rƼԛFac;J?LjRTHX>1,i?-'yut|%*@>+iPa ӓnm~.9'@BYAX|K/:b0)V1 -&i j\XAkթZ ZSs@ֻS7t͒&wڶvkW'Y?2tܹUv1Z^k.PvH VD4B(u%~'zԌQ9:Te > bG(06$\x!|dOqOr[D0 6+⥏59 5Ty;;[\!֯ UNg'EYt-痧 KCIo* 7=C͚"p%pICEM;BE1yH+ .M{ᜫ\}d)V@;dȂEY3Ѭ3ҧ* )l@c ר$v?bCQ 2 Nu+6l)XYZBZTos*f{Цo`%vn_+^]&w AYw4i%a$8;4e+g}r钏iVέ;H.Tl:w H>-woF{%/rL+y=,lpe \>24T qi[r4 84')]Z9NQp-L`jKpC[*}}g22v)1(au$"ߏ ¡qtnz'Qv<)ϢDnR= $F6'u,QկߘoN\:3ų\ Aq%uemIoj*RjTDt/9 KmEcrT.7kO~{LzQ?X>ucӺ Ãn"0- mM.-eomed"W ؕv'u-/[s`4Ʋ^f='@ӢyEZۺya?T| S )᫟J-ԘX,B+'{*sl]PIs%,y<p GtNψ*rJ +HaΜ$q"hZ *~zʅg47 Ϭ%-O0cZ:v~l=&[U[,Β~cf)z $Aj~ 5HPMpx{>?ȕ ̈́}Fy/=r@CTZO#)0><))%Lmh)ieaTSv ( aA4YRCiL!Ž&w;I,XXWô$]) 0/Z` Mp:}FJm})v60 doYTry~x m׬<;_Rc~F6Ƌ5)א:+Dt٣iyȚhyV m8PlJϒygƾc=72p49sfFo@1m%bW2U@ FTT'gܠ[q0}BAhgl!W bUp"l̸#r.Y_'ا|ݟĶhs7i-4kZ)_0l DQ,bigLG;dB}Q5+pS e~(BB$B:.++P ?>ƚ0 yrasBJ~ 0k Hkeo7U~ {={ɢBPvDw-6?w"0IfO{]ng"Y8ǍE e 5y_JI"%+q\9'R:DXdl!r0~dDI=1a 咙KBXKL{ UGρR?@~ڹ攝@[v.zHxsaDKo 6ޣwu_o ҳ}6tr|CI']yȂG{C[mqxkܬ,YvF K2atJl{y3DX T-}t4".A!ߡVYʼ)[PK&?ûmҗJ? ᴘfi= BAdkIR 7Ti V4M=FC{|d ڊ"HOR$ |Q*JE[<@ܡw}]#;|-gּM}ȅ{Âb&]&”֌À4<~R8bРjwf/;(ࡠ%er"|P15׹D"-#7m= -7FǎEڳѣkQ(Pd?B" |T&`(tMޅ=o\V#gE(ZAB{CgH @ Q-c҄70TMӍz#!6}єkd:m0ʤ5r"6`lx C-j'gbƱmmhJKCn^@U Bq$#GH.˝}pm$x2&ɮJ4*ݓ^wrMd|մV޳n:8vRדfuԓ+D2/CAP˫z?=LcT"Il1q5?l440gsϳ}n=v>O2kGxR&*̦|WscW֙픵Z kڍ\^ȸHSl5/ޚ;n[Y*FR,͹{jO#&47k0T.}aKߢu<<)F4ŏe9?1~‾~gNKg᩹O o@n$Gm 8o>dkNmHd5FFLCZ { r{SnbxDP7&Be .['ՀO$: {3O'f}mZhŐ6V`vGHNEމy,nU(ۡ\'_hT?;~04Fz51U6j@x|K 6sH)lb٢rP,al/)#Qwyۯ QqWeP*,ܐdۏCl\m_H=rnGvڔ! e< $,]i~,핁e /*Y)]* I/549B-f @b MNrD{o)pCLib?Y's +Tr>V~Wf6߾R׃CP-, >jG;RI/3k<CPX)`V:WVb`1ܹBa>['ZuC&2\!}Ƌ: >8Y>野4?4A58+Xk+~zׁt9NTSՄع,o}5.DsJZ{lKBAlM(f\ or$;.$#9qlC+b.)_pUKW}TDٸ$޾b}6H + ρ1Uȶa'q4 'mH7!%~kyo7eeRB ry;ZQ$,iVmbpbfy"4a30-%ASّ?;❾v5Kr`Q"\uc% n6 Kb s#cJ=54/Ѯ 4'k`ܣL1ߎDjrh%iYrgl ]7nʯʜ$f`G: ,7 [/ ƈ/^h?VB~cq;`jc1/TQm\lC~|4Dy#<_LЗ4G_zl禗!(%#:?82igiPR3 mjͤY&F2~:wߵ< =0!BAIe-KM `]:Tl1lU C_h{P1sC*].vzϊQ eHɐ첄rxG[40l2ֺ\.0=VWal V\7}?Εu>/\SB姎V;n̆:؃  *}Hk.W]ľX40jZ.ACԝ cDC)Dp$;qv2[wȫxLEQpÆl}4D3p'"Qۆ< e@etI ry-Z/Z8pԚq B}D0*Ū)iKתOH[AL~Txu2EQGp5,I.o&f( 넖~!˧^)41y0EZ|~\ȶ%.=#Muo-i'`|UQrB5TS'^ 1ޞ9U֐n;ӟ8--Rf&:СG=ZTodYW~+_I22Q}|ziS5*3|CnlZ0Pp˻s&M .}|}O1wxż 5VLe)- Ap)ޜMAXä}uh^:wɾsQI|d_G&ixODp6p ['YVv-_ts@˖DմǍ:Y߲Oy  q)@^|Y79bhݒоX;G%Nv)G_J-z-nv άSg#?VZUg-Wlz 6z tKJݨںF$+z)3}(c% ޺ e_#|AKSRƨ.JOs_͏dlo*8bPGw4'?*~ȉ{^iu'aq{+~}U -5 CKw6QsE徜Qs|j\^Y-  #F` #$xz*8/v|nA2Ё3n5l$:|XSwGٮKvU<+LchnϾKa.,(sޥRjȪ𼰿Fo\Z;FLBG]^Qd6JI [Aѻo<<7!nr hʚ?GV<9z;Qyh J@aPƁD%a쀸9; ГxTVxkh)Y ~oϓΛOt W.kC1>V=a xô=%uSMNU"6r+4x4.OU\K uRKnha RMLmت/#XP %d C\b5c.Lޑr~|Q{@tt3mµnMa N n~YQ2~{50J#k{eԖwv%7c$LjOU{8Į936ɒ|ݾ4q^20ul{瘛X T /`BRj 7D0[r%0wn:<؜JT3ȹBy]!ٛ6Ǘ=`E+6$uƋk!: m!Od,eԯD x fH_ijKlUiC~! mea\ʵk2 pZFguy !Cj785Nv Z7"BviNl9:sPRI-v4>|f #V7i>&o)? kGb6(_hA4Z.r`|Rc n|.4\U.L*BO $ a ^|<Osj'(gm7,ִ i.5%*:gN$GfG3̄kcvrbfŕ_2,y>zv|0Q/CW2©O7ՏLDӮWQ -whe!SYLJ?R{Ro.lZKO^}śأ[;S8(bH~:qYjQ2>OV*5w]nOm1\ DoP_m0[+y@bPqS|NէJbX'mO]܀DH.jyؓ< t>Ȑ|J=[|*׭gI򨺄t2W# V }ۺq14Qnt|)8t~KW=캬Cv6] CeQRl4 P"ΥY{<ݺb!wKU9=ïCx~ ݗKm2ёĻ =[o~tT56gqQp?$/Tc$_Z{c|9ףԳpPe`Sߵky8+ؑv3밢DDB%º:bJ`V{".H Yua"1e h~aPYD)qOX=Q$~@eu,>zA(h"luo]0 ю4`N]Qd1]ɰ֦ ƸLԤL yQV? 3$@k)́ @4Wj\ԛi;6<IM6Zru1y3JĊ1fA?5*|9gKm$Z}^ˏML(CgXU(^S8K#;c%T)R^Y<f3Ocw}ܻ쾌/n(Zv򱾗B uGl!@ΛJ6-S}-򳘁[vFhLz,xg?k 8[l*^^׼e*_MUL<#P,τ9mba-S0sɿ}GhЄ$Y4 )C#Y[dxūm*:_Yթ!@@ALju=È6lռmBTI*v?s@5y;ڰ,z8ecFX pK/c,&R䅈 (TP6>闏u$;Λ!^QT/ȯil@zvv[o5Dnoc 0Kq)X03밋1wO%tra-'}0l^QYe e4]BšztVK(1BףůVѪ9MJ9qz EYZCިmʡ-HQV XSN U["409!Ltٵ23kSJ9 H@ S!w)3A H9dv@HU_]kn .9QX]7@ڸ0;yqsZ(HάU0۝zZ3Hԣ'RItyK Me?j9䷺ Oh C)rM(1y+ X 1w|ʚg %LLc6?[@).p&hv崶>{ye__${q&W16C!^GSC4̉K=t$BxYy'd]Ֆ,J'%vBuƑ%(Ҽ츟)2r { `ŮYG Oa=rpȩ,mwIsS[inG] rJ͒5OKq}]77͇yК^QBw81^"ACbuL*W#Zzw}[M^i^x"Й<,=mAeD^]#'G#3[ظvP8|R>oo@K" p|rĵ8ݸ>!'!6p J]LFE~6jy AQ'Z༃ް텵, p='|Uf%nYI3;T FJ8)ڙ@\k1$Ʀ|gUf9?>&#So #`8x }vA]տ_ I8쭋<]2` ~Rn .+ю}2 ՎkMY?h :- D)5KqY YJi4In.=RE'Y"5hMe>s^Xq\㯋/@!i;XA. ևʍZeF6Ln*l:y/d;;цtq 045Sn mk?oQz8KTEɻ+NT*Тx$KS}5z}K祈X593Xh,(8P\@w+y7 Uᣑ ű~S۲fYqւ%VU y:G/&[cuUiԿ!UZ9 ^>0#6H$OyB~1 }Fw&m]LE)?OD endstream endobj 87 0 obj << /Length1 1785 /Length2 13749 /Length3 0 /Length 14877 /Filter /FlateDecode >> stream xڍP;ݝ=@pwwwv{y~ݽZݫj(HTL Ff 3B d Bb`G3n3;d\m,lN.ff+33:8Čݬ{ %56pss lt25,vo45:ZArabrwwg4satp[,*@ Wc;?1"P,\:܍w)}r@hO? DV/665us4[r =@c[nV&+7H+ Wy.V F+ۿJd+.ۛ:A.ro'?'kcn/0733WG&u{+'WؿBMYAfff.n6 0d+#o'_ |E}́?.n@ `fe - 4{,>~o/3{[}L*2’tTo `ɸ|;տdVmnj  s)8w-@&c`6}bnu_YoMIqYz+i]A >;Tͬ\Wd>F+ +nǮהZ\V G|ej~u.+M1VN'!}̀71^/b0Ie>ML&n.=?iobgO_1,& `25Y,@.|e .|*8A~39ʜwe.{.| u ߅zu_@aq7غ6Za'4Ůf so4Uםo lS-xÆ&(=<ƩL!,LbL 2 8h@vrA)޽Oңtyܮ^,s/h(Y\2-478:ߓho ֘Yr5V.",[:{sd\V4+tn̠ۺq*H>?dzd7B.K[ l *e:ߨf+$X$/`ݝi[B+G2I$ACHPHmY֡y{p̦WpNxJ.TIH»^xj"nvM(j]bT|> bxB7M`H1{ː ;4.^ETs?zm&&+bkrDBQo]SGEG4 /֤ OƠD>v1c <Pea%dYoye =6Wծaui O=s~C2G~ -oǪb.1t~ A F7+ z4H[Ip$ƺ_T:(8eȗI\vhwV6ly^qP].8g$xŕth8 ꓇;,?h^ l 3Y֕)M] * ^ TQ;5{K\5Nڴ6B䲩7?dMipG'6-*(Kc&aԎ;ɳD.)Mhz|r"3UMpâ5$/TsxJ߭@~0y7@Wcj}smUߡwPi"(m9z#b[B\ɐ'箥5rq0=;e tuU}1.UKc":C UCaɑ]P  hGcؾ&L %qb aU9=RYywޣ][%`"R?y,8ģuPjC8#bM'ku {qetHYs2$.HT4Db5E}5hB-[c7ctIDBv(e2tAMxCCVήBVSzq ~@;.9[&<6'b_| 2Ƈ*}52d×ZW2vS2>9SBL[3^+O7h{t >B @Cw!}(M|y0fWfqo9i4] lNs]b?xuVeyǠ:#F)uFKrqKYR&/XlrzJ(6\++ ㎸}I_eKp;_OLsir7+9Pdo$ G`Tw6pOKlUkEi&.{{")T[kI(6VOJJSK娗%`!^9rNp%In0Xɶ c7'W+WۋdW^SmUC).5Y$<&~$,^<47I7Y?>5Ӈ[6Wo~Cw:[_ieOfI!p~ g^g6n!D;sTT$Q_xq1E)ŌaJL:(f[ $O}It?<݂H6 kE*GBfti8j7#7okH wϵ+-䩪w"Ad<$)Ӎ)B"3ucݰJR!X>G˒sdl"W{Rzde0,I?SOM9KXdD^\ G4ZP_x`) Vn}Oto!Q!Ĥ {󬤱jp>,S1 R1qQg=S!_T{,#:?d1w(&aPΜV 9z>H:hqQBh9 ~%Sy$ l,mm`l=mD\=yZ,+v k^!kFH<,KcCC%S4/*A JZӣ.HYrg+ֲDL`Uy*oW'@(KVc?)nWAN*]aK1pBuL&I~i$-t9q+pXyQC \Cӻf!T2]oS0E:t\nF{x;,ŁixU S:☴>A* t+1]/r T_=9Jڒ%PфP%S8`ؑ!BSqAMbR֡.XX=V{&窪r&l+lx)>/U_ҘOHx5 6 nK JQ&Aك}̔LQSe\!Lپs1MeJqdBu.|ܗm=)xppL$ b\e vDKSY!1`fz|T,RQ nx<1 ܖL[·@䋰(T|/DmB i _m4/ca>.Ok{[/BURIfoԐ?L+x'ˆWt4>0@ \ILnϼԂے豸\_LhW-/GLqԎәp1um4+՝ˎ_ΨDb75c-wF -HH=$@C"w>#Kp)LPe* z|l!a"Q)6A;]h2 ( rX Яni:ݠ`Љ3)J@YLaUW-})53~=I%s* qս\WNf9n"!d̸PAc =@bB,5) ~]u lꙹ=gkи:}}0ő3LTҊo BQCF#I _x0|-䦕fŞn#^;cS_vݑ0[QZ/ zAƣ;MF( φǂ0KXAĂvdxYHIm P]ΥOg߼>zUYaعsUD>~9:g :l Klӓ%܀QP5@kVeT+ޘ[,8e}7_3RӕuWԻx>/- Rl*rp."˨8P;l_10)쇃Y%DÔ`ED%l`*:Wj{|qN6%0b E`sz^DdȲӎ2ͯj*EW JRafFO NJܲiiI}8vR7qi۬}*9a\kԗSU_p;0A Ю\[qYh6Y/D?| l_/X"KZ icSk0ů h̤T翮IoŸ`NjYe{6-f66{R9DxƥVZbm 4|d))i/rjŮ~+&tۉ¤BVދgUiYY4űp\y-jVz4ozE@ cY} Q6о9(VN|Y*vqh-LO+#Գ $% 5(W}_+w)`O,z0KȂ-7DF³jW6kz ݟZߕ@.1JcXK)<nz9zLc8a`io mݝPSҁ EA\)e>{ P 0M#wDkKh@NM^]aQ~"!OlH .n<#ՍP&n%^?vqozmjO]J  n}e}/ ~ƃgr_}۶f%kmiqUըkY趻sXJbiGT!}q:}sfQfϔ@W9;rZvrTdp Y7~~}آr}}g<22d_/Kؾ8^vjNF+B*3U\ť9Եd-'gLVܮ.\pDIr-MؙT:h 22%jb YF+FwnyRBͶ}p*4osU4!A%1֣(ZǎCN4e"sR/NS}F40<{K156kc"~K-|񎽫E;ݟi _{Tw/ER*j.vmb!kD' r3b)DdFYrj*[O4Ѷeі9Ry|*$B6kI\ԁ*i} 꼄:7K~KG}j}CzX ~г&%45TPq"NFپ:Pm@nh*̮ha5ovRv 9_S!0ڥ<ڪoga&9]C!0J'V@sS_j>BAWX`v",kٽtt%MbSĜY7ЛvLJ]#5Hkgh]Éju~ <~h&+ u VF*[69Qֆcנ@" >EHOц>۝7nQV{8Zd7OiqokUb]yC]m|1m =HyklRnNQ9TD]I)9S d<ϡ k5 GgP [?ndDz#HwL#|Өaѭ77Hd)Q|pɬN/V"@8g[fC Q_xjoeF^2.PKg^Kr’  Jt6 з 'm!!06Uc$h0})M-50u|=ЃQp) pSzjas|<͌ɈY=:ܛlA^ dDWBq[eRhC>kP}5Z^vjdOTd7|HA-m4X`Iʩ7 u#?X28^U=WZŭ? ]#ʟA>=9}*" BvR&]HM*USvfKZ]dw/4ġ>yL&YNb3 ˑ·VJw}n]^Qod ǝ 'rsē4쑢VR0$(}_٧Ecج-Җ9 * q[^C ? C5挘lE BTG3Z8;V* hXA; @ckd~/w~)*pu>̔2v]Q[njxpG06o[\ޒʬf'e2]MXr@[1g/Am3]_!W^To '_ja_gVJ\WT{͉51nR>YTDaPcd_`l  V_q,^ Z^=(O1/\Y>'CL17t&u ompJq'ݢ{LV1΀!+I/#!46>-KgkOcw`90va?pNJYu7MkЅ% EʍUl(2lСwkj~k/K!x eҌ`Z :}tcg{H |5ONb~akPdLe EP6_C^[8fMV|kQh]w&݌k39RU3aTlMTdK4siFF6 W2_b]%!JOW5T7ǧ~6{{tp<3EDQ_ec7vsj<"U WjRi D"ijEf*l41evj28cմ94>j\!_w @>"/ӆ;E)-kB!%Yot)?>l\=ʃX}SaNZؕwV;佹np#0"F%;ߥU$0r4n.ȰLմAqekA,NE4N":vN8O3!yOXzo` tzNj_#yRϓc;y"rS2&%̢ԔRmf,*̙R11M8\pxoMC!KyOʅej@sum{+!z-Fh{VE3T" 8F+c꼦I8!e;?h{ ӷ^`¤g-c:A*An*rTո Mx3Rqh -;y4UkEfh;d(ZaRE kMIFsm_Bab+.^Nz0"bmeҍػՉ`ɐ =mᅩa |~C|Q%~o֗\Kvӵ`EwRͽ?Ve;HRYy|`Z jnۍ\0gJ 4v;<,jğ%Db5먳6,Xi>l PC(,]}VQ-#α#ReU <)V-A\bǕNCylhٚsg\&p}l l6"vԔDfwxmB){e2:٤Q|Nh&?z$tv)c}:jo4`Lx\:X[%~L2qf;%_r&{&} '%>"-3űoH|.wFll\WZjû)/ծU5-R?.mv7o"򈫄`s/.rv]\#d߅ a&Dna _)"c͙ j짱O`㠔'DrJ2֊ubDHۄD>G9uOpvQ>G'$e;Zw0~:ySljb;4cj~:m#G cUDFխ]5WVa Wth.'\_[cܧ喊sыݮY^W'!vO>SWV)2'}3p[ʡeQ `{hPd 瑙R樼:uXc-\uGZV7mnf# 51<"׬{xȀ:_PA)D43jE/܍r2>,5ٺR!=#VhrB-H_3V!B2#䟭i}"cIļb[Hȍ~tyRj:\4P՗A\p'ϵ >e V,F׆x| eIx餶e[+,զ/1}5]%l=ͮ N$#>ºRx<6bq<~T& Û)HƱwQR}o`$+W'hBEh`'Xq}ze%WGM!Ħ7j|f9)5OvǸLr-j}{xj͏!|Xwzo?Br]l<{@o[qT Tj7P&Łرԃ&*0k6DcQkg=vY`^wccr6ڡ}_g7ܮPOpsm܀TeUN.vr~v߷IqOg>o`-?@2e-LW~3RW %"r-=c)̔ AnX+(S,Rto]O4aqQ:n̠@tU%%Y"!2XjkF+J,z[U@: em !8kiM$$|8H?`FέO)X*Nb%@F}*XΉP%W`jϻ &4U,1a̡te2E'Bqk(FewGNÏTy꨹(MԪBGۻ'|xayu= CiܦԚ%Xʼ@-)!YUkAb,MzN҈q-}5u23M[nAىP=XJ_ P^lcu1(+0ԖXHą$bdRқ]\P;BNU*g,Fmc,4Sg% bY]Ά> CF)K!ȳUUC 5JйoKʭ!*t+\w۹c N.[ :16K",Y3%8O]֬kr)-Q8?Ȍub>-1jPX endstream endobj 89 0 obj << /Length1 2481 /Length2 19043 /Length3 0 /Length 20472 /Filter /FlateDecode >> stream xڌP0݂ nA4.{*emDQ^(nrgf`)3XXU-mՁNv ? DFo2Q#7;9;@ `aab01qΑ jji cHہN"voa@eB ` d t41䌜-oMl*v&@gpvadtssc0ubs4秦Y:[N@GW)ூF*c'ZX:#W3sv3r6&@ӛ x P(Ac@7f%og#;[{#%`fi(28;@8ٽY@\H `V98Z;;18YU"_4o]AN'j4yk?ٹf S0ugTY:D5yLLLlnb=o%_ |foE},̀oཛྷ\gGןESKg1M 4 {~ImL@6/ ?W',lgeг3LeQ47 ߮R 3;?ɾu? ;5ޖLL&o?o./ [6mg]_3+4tZ)gs 2o--݁&,?r%hd׭gfb?ebvs8m*ߐb ;ӿN ;mX^oG@vo.|fvM(`8"Q (1-o`XR[-oA70*qS"(FoT~#6oVoO7z/~4]o団oh_3y$llIlm5hF?[ZϖGV mlyko`d ZA?BsqFh񻢷Zx[AXV&:Gio z; ߊ̛ߊ~#{@6@ecW~et|{0[fi|F hjl?Qޮ*O 5+fkpLN;u7sg⿹dcd[]?Fg7?8\or%^y=~g tn-Ƿ;]iI݁& sv&w |&HZptyDM\sJC]\$u֖l<?ħ#AB8zU]_֐.\ȊnKcs;J52S1jѺ3980hQfnn&^h}cXYbf=W*UYzppq!o&)Sz9;߰Mf٧ܑWw<ԧ aĔ^kL-%Ia9_^sl5vSH|UgWF}̫܇IlRO g#ϫ@/1~^6Y]llF6#l4pJ2UjBs*`$n{wW<1o-%O?}}-w+>4^̇VFEa/;GY5nჇ[jB5U\h$ab!6]K]Eې} -Ҩ:+ge(7WFAIU=.en|)i> ~,ωѭ>9t@`wZ1駹~Q|?8;E=xUn~~9@E'ngʔbৗ-,X^c(V9/d`30 |n@ h߉j^VI ~9lY"nr-^7J|+}yQע\lPYO 9*QIrԡK#ѧ-?2K}P0qZ>Uܥ3LkRbRb;V ٜJ3*l%/ B vy+ :̲)l,M eɨ boArR:,6괗OxJR0F\;ĚLE-+zSHÉFMgB%_& ang3XEwIC .Oi(Mp8p>Q{$)ף sx1#^*nGDYgzO#nWssW WbfE8aO>oQSkĠfh+ÈL_ #eYUȝfldٜXG_r:؉ںMIB$9fgcD@+dȻTucLNM7+M{ib$zJ>/xg%}z5^+G)H☲ցcYXkODviӡMN>܂l{"~tlSzaؗ hX_$XD y i(Z.7c7؁Dq(Yւ*c;"60c>M܂mkU8fH7H$L5E,\^kvؚ)ÒIEliʋ8]U0s;jX? i!1*#w#qUPTAc yْCvNXn;pt E6|0$CQ"v`5'؁`Z Ӳl3j7 1Imƥc3]d.oPKR:zj ,nP#G vģ8fx'775P! ,5BhV N(Ϝ齔R2G'WomAh8{)*Z*"kה]Nnp jpbbwzIu6 XWG?X iT?p+RU I:@i _ʿ95OF6(``XzG WhOv9k#wZ՚9h/ pIe5w$pƏ.RpA/A{@||R. 7yc8ZuCK;tV E>qSEZLg`]8w >vՃ2' 0omA.71fuS#͖1llǔx2K};hu Bܮy4R-<ewIBMI:3i.awUEM1j/CS|,؁ URt ͰŸh6ġY 8܍FTsߩзS5H76kwyhux\ $l>.ITqAr6v0RᐒaVA mɪz:3_ԕ@?q}t;ߒKfw(8})H+!ߖ$ÔY:o-!hcZXvhxOܘpĀ1=`ū1q.iJRv)3Rd ųu|V-sM@G1xO\7TYVb󞫗B{ll&q&witNmYQRk])2+~.Fh\EXFa(ܰt$ ڂ/oVjڹw|uT@z`Þ DӠ0g\LsOsϘeKư&ĭK x~Bk ± FvPB a{y||'cT b~D\ب>ysRɉ$8#z>M݃= b,_m-yJY3  m&CGdSh`yρU,"#62eh 0'ͳy$p3"mՔ^/_@Tߍmy>Mų:ON|'J> 9g@ե*È!E禀D^5sDhW5d#wNu"!: pt];Ş`5Vj4+/Vp68 [Ff,r;&X p|a'ë7*{PSxVT҂vo(Xy[,4ڳkEe_7GCu?R;zn"qβr$*,I?>ŃYyn$}S2(JE}BMe]ZҿRf%iPfTb1E܇캋-eӣ0jWXVk?Y9pNBbGNsFp}k> Zn;ҙ#fOZV nrÔ:/ UT\W5F)l"ILrfx^O⬄pI1A*n {:ǣkm#OAeBb ʨyk;i&j ejd | a_ {c)Et3GQJh[Ue'yN|`9]靥:ְ.%UcFVч;fWϛ>JVM#2p^Xh&](-lsD\k-*<|з~.aH8=qs{lU`Ū@3ChʬpwĈ3,Doؼ?3zl$ WrΜ(ccPط~YYV'y ƉFp̵Lket#8 [^[0N-hl48ߒӾ)%PI'{z:!݋Ҙv|g):J>Eū4hl!?Լ飛&#yѡxF c[Y 6 k?ؕ{7\Ru,e؈%5G_.k`ƉjcJ Av"h?ޯY*/is TSt `=Ħ7P 3&UqJkT&]2<5"Uj @+xASYY/131t1BEs9 ƺ7[_\VvG  WѯrEfR -2 Cb>+RZ+V|GoаI  n<(ZILirFI$J3CmH*AE8Y1tz3e 3 :/4is%\}S22#f1Yb1N=rS @TS<}J4LEH|@Hnnw 򴗧HdXB.gCy@ܐuB5PA}\eI>3T{s+$J0caESޚbXiyi::F/_ Ƹ}4 uY7XhLH7]9nuP Okn[`EyOE1Sl-7SGHKį]QIO> |]TX<_rJwnMHÈtDTo}ԎeʐB O[ -MJ lR xWuJzrV,[<K bQEiJ/TKO߻JZUc ܱX9.h+=Zz٠W-Vpmdlu|2iq e0omP?coNdB')pVRidW>bk{ܩ"d,hш${eD*&;9>.zX:>JD:}"ן| 4@앎{?Y9_3;>-JFh2$a0۵HCpvзc^M}v ~(a>j7wӻN;"` Nuld~r4N4å3L5d}mД rJ,4/24::y{o,+eꋰ} w[O$n[S5۩f"lPAs'aE*<ﲶlryԶpDGwcuU^^:W/azR٥6yFs!J2Go4Ec3Z~|&^'}g7﫻$_> Nq\f}$WJ "{`XL& gZ  An6sqBY?bRvx"+!%tL^R7VC*]T4Eu &}ݟsH+,K5Hׂb %7O}!k?@')՟V6O{f"FRrk JQ5tM㬗^O8 CUaz|[e4FSzPEFL+ξuː˟E~Iz~ъ7!;SW$,iI{d_̨j= lؗ hCU$i&:P>8OpN_4#)Ʌf{rRb%JCZU"xāh3O5MWB*MᵳD5XSSDsr>'Wq [ KEV#n`./m"(Њ[3X9 GDhI oq.Si tWz58U7b-G'G|h0O黮.ʕkndXLKu4莰lo4=l%X$x%DSnj̏N$94:kOѬjg.ep>G)Y^"a"ӜD};ԂwE@G6qxӃ8ңOaam?6l

y$ѳAyݔ=0dĴBպњ?;KܩB}j6L A''vsM5z*`j}szsiMaa[LS:",|O߼fxc^?rwUra"T!(=Cڮ= 18v,sئ^xj)P_fkK|ۘxv,[C4 0h@"WCFa[ y.+/D>eӠkˣ| X1Yy7|)t5`&d'h `KjE0rԇӼbZll E*}Q ߟg4%hT5Iq ~RmN^(T+{~10`&/ $HTMr.NG sp= \Š/S'QU$&T|u=R2"߽Upj%nt7({ Ǖ<ۗcjN[rxg@8 */JIgt%+1LmϦ'88=^8| L^S6⯺?0wJhPZ}j'uMX-5thDڣ\9z^FTE缁ᜇS_fS5b1M>_L{;*Q69_ '5ɲ:PJFu=s'|//p¾+Ž]6)D=l<ލN'Q/ciBܒ=NR蕧t)k'¬ xi]țگ^k:_'񫕳{ENoLҺCp?v,dkq UT$./ YBء~L{gϓP׮*{l}=P<) ǡj;|"C=g$y =vi/|nsevA'o BK[wNJNRKX\fsiA5@ًali^eTX#6i 3;BKlIv>@= k@5 $%BF˽4S4t/O_^rPf\冡 3E䣑XyR&A< MMr~VҮi_σձXiZCDU^5x4]IoƂ&,bۣϝe)*r "X01V pO M:󯽔}w}nOmS5}E ?XbzVV'?q^bQ`"*=MR+N,a2ܚ.%6OͣͼC Ә *A6bn:". NNz5s bZWgH0RO r%U9 4=4z$IJEU7"e٪Wˌ5¥.ǘ%q{|gF(x]: SZq0 B0P'tBQ5HIsB+v!&Z,.s'H 5;gu'1k#ޖ[k9' sCi7bp%2D6A֏Rsg>e)i}45j ?O9]R7]eyh1Vg:R'/x+"D`.O1$ WOIN]NPgV0F~܇<_-M < [-ٟ_`tOᏪT8}:MQc0(c%F%,Yb{KD aN^Nl}cwȟ{ } b-!NcWg?ݝzzM4 hㇿ8h Nڽ1Hw_dmAm<=[太#'V& _ml ^Ԗ$vuWJ:>co=\S.rHKi LKqӕm%U#x/Bl8yHCW5:CxSTYt31)pWpO"i3l^y>j#C̈<Q-`'l'FR z1 v(;$,5d ]}z S|]_W/[f49!\S w:Oں?U2ظ}BFKI>63GpH3 1jk)"\.?βD s>`ב.X罒[{~=\P X5luxDEc{7X鲋EQimf):Uش;=(5WJgZ.^)ETBSPYQE4=kMIZd<-^婘lCcM)|}hZS(FM[ADO/s8B 6T#Z8Gb1Au[]>us aZ#"OĦ.D %W)_Z/{9z<UotJ,I^kqE =bzBd_u[ \V%0^Q8R:ڝ-~MF .DN鬘29&DD")-$\Y=` gLFܶeT-פIKk(,ӛLZc[C5;(̡&:X}a0S8 "',_ϝ-F AD=Ы`9:Jټ=BDndnL |G@-"{Q5S4Zs%fLRtVtlY 3m1ejxh,,bܕlwajÝ.l\Qֆ:7b r~'w8$z!g"o1#t62U_۱>oz[>6cP|$Z`}.She^+`8ZR%}<\ޭK(=.?APy'%AqUU}n Qad;eHfE2' ޛ5ю+(=$/x=F}9٣T3VU>V[]b| j ¼^pUCRWO'oi1ui:q|&(GǪ4h}tJc L`%ץ3A:O_cذ$:XIDiQbd1of~Mu]'9`̐Ȯ.#xPyͫNວ"$hlpg$*jS񭮷`j08U{d̈p{iQWȎ ]x.'bB{rɲЮA$v0q mFKi3RJ}FMe3܈6sNF9D%$r#bJi蓍+ [}됻t$ GHOuÒnz5>e_CqXf羔ŐRN,M8lY բXd_R){<@TĭhozѶ_DA=xDyX}9&_=$sM\3$eY!Tƺ}+Sfb%ۖU [X<}m/nQؽ: /Ti^0gOdIap4QT|"2hANJKZʖ g;j}#JSС9?dz1\*~t̼~@|w.:Qd~au\4P76yo>V~[Ġ#]+"̃'ve0/Đ&֮û:mq"KdKaˆ=0 9QXJ8'9}Mi!o7f0whIW֚$IpA-=~.H]ANEN;:{\ Aqk"u}M ;  \Jp<5=a3ωĺgkBs8aT/"'Ҧ^KU;DeI6XS|ݦaU:㡨UR6jmD>BvԐ iPA<֜mm %Lxx^$"1>]N~>%{gs8dMāqwW҆lHDB'}Ϲ*=Qىti{+AƼ ~^KI` bbu%6pu™]j왪E[r@z/)-"t,(|,al@6a8PVD$0GO2P(<ф8f/]E 9їwSVGyN[{ hPՠG.kܰQB8/bzFw yаݦt:4L_:UKmCzHVpRe՝?3㤵Ӣ?jQv*>{d~x!ua KUwncܪI$_wJvя}֌#h#4_CvJ]쪓d/4($11DóZPw{:v+C}^;-Z$ K̛'g%k#Jճ)(78%@N|. b8z@!jos'ڌuaX'RZ̤&)A rnLs^U>y_ZE8DR8N Xb@䬞SG _~`XPѽ`c~ɨ>%|ݏIʁB5lNff9-*8ҫ$(}}(X,g"m_v"9-,` zHE/,xh=2tRkeԝFN$ ]]0sv1Vǻ9vڴ")on]#;;,z/# hweZXֻl~PAzk|̊!?2ݲJYi4~$u=rDD[ {DgD`ARߚ=Zfd"[9#&SpH=io̸D'T"Fz"'qFyC6N1}^ϞC.eMGIi+^38nj{չ]V`!-t Fevf_wZb"/CزMM%Dr[dK|oF89Ͼ6M.xsX0A0AŞUP8 xg=sqbZ/{'#Hb烠 (3 >X* t;6'i8nof刹zuxxlLT:bQ>;ͦ|$\Ӛ"uUm9:vs\' ڭ3j<+|H5|fd4M DJhN=~75xF3.z7ߢ?lP.E'Î#="yʹPju:3U 7G_2˪jeCL2p^s6> "1lmBmY[0H j̟ 2(pkj̴$2Tjg]_߭FeN"*rݍ! HqW?.ck|gƅP"t3F7sXo b'Sؗ3k. 9mCR Y2n]H NooQep$j@ i̓s0R 描bi85EQa8kh{5C Y`b5vYgNs TOq(dlL{زt$A߰ez!m#jEeRxXC彲EiIJYI23*NqI04hȕN_;JDC܈LHYWɓISq<>[ݺdH%U{ŮcNr&{f.fFSwT磫B IGb:[`ArO04Aע,'- xɯ{=݀^:g2\q5nS&f$d OFVd{ɝ,Dbxڥ'8e(ͬ(*#јѶ|>9Ֆơ= (E\` WtKm1ʕSbqnsSZW&ɱTQĈ&roηRLo-lkF $*P[<>6bm?Ψ-9m^ B`2ᦶ<.*rZ#ޏN¶4(QN`OP:8%Tа&mvf$6HMJ:%MJ$}[.Rehb#^VɌaԱ>VȆQU-ʊ[ 1I@!bO_s^ӎ>=Ο„r]:Q>#vzBi'Μd& 2 )n؅xFx6,D> AiimxK52HsZu$e~c#AsE08+ YeWa bjg%ԭҜ:D/d"/ߩ/gDWM]0T^Ef13mdi T6FiDE;XYpYM VL,C'!lQGt6e^YXR!P=5rGcsۭf_A(vD,{Wg 0Ms]Uc3Pk){( VNNMZ0HnVƭFқޅ{7Xt1*,"Em+p 0 ;x9jJJզxwIwSg"mk_?]IT _f/ ]d9Tɂ<}"E'7rnuWff0Qj(qƟ9i[{;uXqLDcWN6;-*P85m+r*_[FuIv֞KN$N4EjmWNTW},"Ξҟ#/VZ5-%_A` s}WK[H cђ@bc3ɒE3lsH.,5Zsȑ+ Sk~+]c@p˄ȇ79VJb* Qng&tlc:-!H$:*(!16 @yt00sWҍd >?L}C^Ә>hȽМbxJF" #D7)Q2IO1]TbOQ4'PpC԰2 I􇊇7g N6'ZB=k={lj=)ub]1  >.yja=ʘ`:p/Mgŭ8mGrԳԳJ ;ΖrKErH|xuvxb6TтP}ᕵ|׈h ?}*(q pA%lT)ZtS ܃sf·ea$2~\6bթm ɯ+(}K&'釧Ұa v2-Fd# G (eOO"WIēW j4C{Dڟ+hlzK^R(U wY׬,K#K}y#FJ  7Rz_VCV$>h^U*9 nE,\}<ߣ>V@8׳wCw5;xoPD}-R|"YgJ?eYwzzׂ,o Юw\-Ѫ(z/I J]rײoG9|[i@6? P3"Ug5vMLlưќM񮺀b;%̺iw_UGCG{tmHoq(W6NY?bw{[ cfEpafcRNE^{B3;C)V 4JyăqdにCמ) co ͱ9,B*EW&k:PoG(<S8v"{VӦr.7m*t6 Z ʂ!Xcm5LX6 Kb8M0q@OBtx3e<*FaoKN%SNZAeUW${ gR,FvpK1 DI?-܃.;<؅8@*rjIJ\(#o:?3 A8ZKgPkF?y,vб(ф̑"<6`EʰD>j8qmOG/|^}0fUУac>M8%@Z BccspjMɾjPgF]%ny\d-jF~EC;c{Xk}fm YPDdN2 >iLA O~/*Qn?FF[kAW, qB")kȣZ4gEvK?`/wsp]o[kSMߥo9bAcy̒ɝ ~H_֛I5DU'$sHFRq+64))_ ֲ{q\i*Yn zSY,..h tJot$^T\5.TE)Qܜ:xGBwdn7UֺKx~8#;]6inY38‘rCu* 6лtaFlyXK&biWy;߻rp'qf8B>o'=6@ 3f/&U*Ә\c_?g8ShSEc9fU/'y4W'ɖ3"IʈFPtTt[xw̢MVzjlh,׬6WN5Ж B6>OlqHa%SK b%ͱ]mm26?ǖ?QD\k2q䎫Bbk!.ϩgݷ  @(þhOK0jP6*;3jO|e&i[$}s o+3MPk.cRl!KgM݃鍨7F2D=\A>;Mb`ƋSfS6>yv^nq?( {%oUbM52S)I!yލj'sr,Dq>eq!i^kě*djd }qy8HV\>6w1]rEbV-uCmO"ѕk-r}_ endstream endobj 91 0 obj << /Length1 1597 /Length2 9017 /Length3 0 /Length 10058 /Filter /FlateDecode >> stream xڍP-K$X Cin5[p; AK4;3{UڲYTP3CMARP33; ?P\Q;ۂ2hށPA&6 8E((b dggcr'0qYrP @#p[Z9??@:3z ;@Q;#T4q=5==?+ R v@ sJ&v?;c5Nաn& l8=g@Ae ȟ 0 o!$AM `%l *K)8;3M Ml&&`[?*7JM='3Gwi, 1ف NIAfc`dm P7_ 1݄=&+f rrqA@oz {N|@&@>` tvtx49MA`g3O|`w۳؁l??< 'e`}bbPw3'' 7 *IX@|<R>Gllf_J#OYo߂\lmpMſ/'Uo3YF`5|f rY-y-V@V?/ |u|du|._4sqt|Cx@ w`qj&l]~S#JƼ;.8MFrL_x%{e[RdDն{x6W~2TRf =_l?~‹w'^_<:WFl9F3Z?d&4{33 Ow˫i܉' xFa gY .bjb]"2K^bSJ[XF8eF( w{廑%6"_B;F}P~zJ7DiHw کBఘa^}u9, cu}|1@N7,·]}edc/oʴpRletNT!(#6bL7sR[Je6v'=t;N)5j7S},mep 1/*z݄֚ݿ ~e5վH&b16Gw;UdYB_W5 z[:N4g)LQX5,HЙߑʪ/{(xd &RNo`̵4_R;~6f=ˊ#Qd~jI0>TovYKI]>Ԗq" [&DOL:=YКvqj-ڡUp7{;T_C&Z|"=?PT¯ڞ*Jt]d;+҂en0f rh}G *< FeRwɥIXTdQ aj+~Ҷ)[4:lK.ÕRFn,E6*hަjUKuL\ܾwrH!UfSzW*}Yտ)DoQ11[ ~r&X $E;* OdXۆśjB3Qa$_c)bX !emN(d^[0j;yBAß8zgLJQ, ̙y*,rMHN1 $ޓM VY-݁ ڹAm[R#|wTh1&V|AїR-mcg3q!Fd_ |XV~f4E8VG$kڲE0 s LBۮW&H\!e+Zaa 3K[X.~#L!ѥ5d=R6jdsK2㎠zwG$B5ꗂh 0?v?6*[dkN[Hcjym J$}Gm S#j[E%ovYj[S"r-|6a숡g]gN#( Va <jb.n7׾ZjAVϠ, RۢEx5km.Gfj'#;|OT$H%s0+帹k,=y,e*'/N/50ɼ F#Ɗm[[5]q'T~v _g`[pga^tPn%B8")$f~WhKD[inaUύ܇63|<7斧d}Z wD0j8?\pAQ}'R2wt¶$F8iM.#iRn^(8]&tSiG_J_ḧ́Ɍf]1n4<ǴÛ A/CZ?l*5Dt(qIح GۚW*g3+&7[p*!H|}{Es}o M vAߵkJ=n`'E UHʃJ>W{s`hV@ucR\x{ Ro襎SrD#kiҾٌ}zq7$, EAo6"?(w#6T\M_wDD9Tɷ/5+yHl9SURxR8,+kmR^R]F lyA6ɷQ?؅F]H _Aio$mτ:k^@Q48|lT;BH2H]2m=PpiMG768πS] 0vmЍ+"Suf0))rQWr'+Q{wrox_ u>&J*#F|܄%e\{cՁɦaDBgV jZ.oB{ՍNvU:$.iC=N,\h<.Zf%O%Gˑ*-,I3իl xT?1ٲ) {D`7Jw:\eE RU8E4WA\Ip_D Bl6WAO>z}Ոz {Du1Z\gYm< C͌u_r/Ws>*~4mMhn0н+0m`7}D UA]GxP ASH'>YdJ U?Em4齺'[dLY$&4M~zU̫o uUjj \aGTImc+ <2+}g*o|'jH?&W(;d{L꼌`g";] $mڦfکxjFAY9XM*m؀@]Bj¥HU@E? @Q`^ݗ3 /ЌbKWГm r ҁXj!I){zSiKb:NȈ]~Tk3×T5bxDӇ6,;0O)m&MƘ)|(O:?["0I`$VklG؞]w90 MI::r*[BFT V\׳ m=``cEllS!%C8>gy @OvlNÙ'-WeB4?2ѳ3KX }Q~6Cl嶌N.Fk9)QAS2+Ԯ5:#hn鸲 Έ3x:"@(sᛱ [ f{B*PDf+TNyTܝ%V:u 1\c& r*C,3y?iRy _Ws :KҪI\ T-CA0hj0_=y3k}`jBӛ'1̎Otܷ 䊥렏[Jd=}BZQv%ZwTAҐLk5R_aFUgձ2Oi~v 8̺Hްسȇ(-PȂ0w5H[O dI9#w"1"˕Hoj=8l*ۄCkiR6P~Hxnw2pYyY㤭d'N) k˕DIOa^^I٧`١G9=Y O~Ki">aH'on,oW,W ]KQ'^ cl?;}4~- Qt&:bAnz &vz♏ΩV y5]-CJ+ɪ'D5 OL_)w,aAxBb2SgNTKj$~ rtH܏T\8d#}AkE64t =oqMAo$R}>N)^]@m&ڳ%Ĺ5(oR푧?z$YJVK>SUdɾ_~ͰV/r) n?@ = Gw׀ؖJ<>{Ѭ";X EcE3; YYqφO+`Ah>_VeT^%'r gr~ d?Xf9d:J-\!5(RaAl8/C*ئzmnG ;}{ ͔+.M"7p\EaW(:M7dE7r, 7,w1XYSejGȠteۢ3/Z~壸C˕1tkYIT"r|)'5M;[L!Cos]d?$)\؃oR챽`wVy,c=5,#{C5R%(KJYF79hXg,L/K inZ_w7#֧2YF_-lo9 d+=m $D\a`q <>a`A ՚K.`/&Gǿ)[MjFrЎrG+x.EħqW㩕K|7xD"fRrYЪ b?#eJ'uLS?uz c]m>Y󕀭A fٮkOX]!?v[ ]C{MjxSvǎFRi!ܺ;e+g]V#d%"["q:S7wG3 <yEQ%f \Dx &wK21wE1!Iw>!pBU ѶƝ-{x[^3s\s8L d0)!Kɀz$A^16 v9%p~DdPշF}]QPcsr:1@\+ aLC,*_ TaOJw#O׈9gg\ 9N:CPot敮n<5vK)!wv)"^ 5T2?hR/+N,L"߮#0wn9cJ"WWu?l-ǽx ry酃<՗j%I-vS бm!Q=;_NkZHXL-]_JFHiGsTurب!N)(C+5Ã?f$A^9 +/,(ԉȀ Cl{{Z,ް7½yʕk #AnTk֚36A[.^U5]4l)%RisW^vf$x$ʘpu~*cmטTE+k1e84qZ3>G$/;?RΛ5gV?N}=]qR~t Z<;0Go~_+ӕH(`v-THhc&2na4pΞ`„O 6OfȲ#@貢|GWq86ּӗLc͟3nK?҉u endstream endobj 93 0 obj << /Length1 1373 /Length2 6090 /Length3 0 /Length 7029 /Filter /FlateDecode >> stream xڍvTl7%1:I(nI 1 ch$$QA@$$.%E@RywW_}~uc3QUg\ ŠB@uCS ,!XO_Z8F/:uP,z!@.X(+<08rc@3]m/8/gD_ "w'BCa04 D\.O8𶖁6+;B=}x u;i R5B= <Oɚ(gu4 Ga}@`0G: P.GpY޾p]=*tp,P ȁpo << B{]#C.p_x) 3:](pd1]0x ';<(Y.HZ[B68Qqef1"X] (W[W~o_obG,(ۂ0BoGUBxb7DoWK_t5;#|mBPEz>Z1 s *-~}( /U0ODο%.% b0@~xI i ` H CB.h >% [Gab0x8 aI4=Wr)Zf 1-4d/s"1Gt5Uf/pobRMςRLGWS#mpQp_x߉ n$l1.d<驘=jRZhEmD8 VR(^C%^0 d+Qg t2幹O; +!Ç8 =O⹢q[ߒ8vڡK2 W}\nQ6 Dcf2]TUyIvp\ uyΟɨy|uI:.\:4=̃?nn jnj-7=. 5\<~UO9s}e}6aHB@: G!ZX1"-(q;E}Z5eРrz-i,l%mղݚr1SB sZmB8$)UrI1՝2v/GJފc{vmf |[˃(~)ҦPݯt/}5$Lȏ2l\}%6r:JGN~%@8>.X-z˰f7*sonή?,ʧ?tXFԐ!uxNMg@ϖFy=iK3n3CHxN~MsL`xm6agA8!ZЅ@q.ȧv!@+LkFm2~ϊe- ; , O}]F64]a4M:՛ @G+&IsFROr!_q*;0Z]ǹmUJM3 ΊMQc_SNF%ED"ߎ5+L㖷24jO+9kD 4w| $o"Dž8a#Ӌ؛zg]1<>^|HNTQ|ƽjHp8~D/g;oI*oސ^|bHC)پˡ3+~_: )Ip^ߓ{(Ux4ei zV[b[hwe9&Ӳ_>9.X4VwO&S ؜*> g}YsrN%XA{]c*cYJŏ4_^? AxBCy޷g{(rGBtY!NvV컘WCJ+ܒ7ȵ{1Ŷe4 %)Ԅ1jɰ|~̅o˃qlk]#fCpj7~`d.&sC'-M7-*2tS]mepWץ>D,OWniLT@FFD{kqOm.pf&P4J_M|EtjqAyM⊒UMTj~#.'1HcH,.[(vKl4i$1&DϘ)6< n˛][$g.7̓?>n~`Go*q/͎;*w5We`GuX5Zv("]zN|Hsu8nmrF^ɯs:Μ]~G[qU+ҟy ޥl]5jkܟ5ѻL&ܤҪ2#ygWxyAԶ._W}`2[hV%!Ҥׅx0;m lew|CwVs k1md!2U*f[GyYa;݌:# gD^`V gOl}wX`[^jo L6Zaumu}x_p$t\1x`Wcؓ`ܫ[l<{ySPen~ƀ(=4{ޕnһ6gצ,e9Ijl,_n Onkw^ޥ>Ǔt%G^w~_8?_֢[לT>͒@)5;J?v~ jcSۏ$SLʁJ5@+联Z=]Hxt50ꨢ\_|J>kdsۇEW*e'M}eRt8ݖ)"%W#_G|يVWlW;Q)zcK_ pu ;- D? gKB([;}r mEJ4>sYo0 ݼjl3r m#^lS4)JlٞPxy@c:xFf̽$K *!j eȀIe^+qzo3i);\bG?ӓ o*(>s?@2*1u>M NI6tB:S PBq3EKx_K^抠-/WCI\Ow8׼NK\AV EwMSG'gP;bەQ{m=X~y кDP˲B'XꝮVKZ&=߽'[vody_=0֛i27KUΝٵx/~MUCgiKyD%,, Wk;{ME^${3t\{͌TfKI{4'-Ʒ1Ē!ܳTŎFm`JHfj Ki Sh1z/>ɉ BJ{2 j~: 3WD m{1 ӷ1$桳! cR%0:߯:|^4ĵX: ;hFJMh(f7ɬE_6 鐤=!B(ټ nER 9N6 2_q|=9k^LuЉ#nf&/W6$~ ̣#̢{u=Gb# >=\/. ~esmZ ә[{wZ ~ p[<7?as:YgAh' {!Y/̻|,6nFdjxߨjK)q.יn9o gLvt옇麵j#ҫ3^4"rli ԣ3ˀkbgӃRk-ρu_2)K3&C)!1J66΁~ۅefR%|*\-ռJ՗ #^8UVWsJ`u T>&gb^pj娑dK{ugke"Kmi{ҷP_) EbVY-F] :qto/guxB3hFP%G`t0kˠ -䍝hFWeYOMTq:&[ovt% gu۬!'?gBCՊ.`)(p.iG:I4.#dŽdٖحbԝXpaAybFP,r%[L-x\^-eV吔UfޟIyM>ЪWgC?)$K|FTop\NSܳE}8 > ȅ9J*~|"UMcu%F%\A ]Uo*$Hh$ve{E6UY$erXIX!|?Fyj5`eBEd}Xܭr3Rl[5xZ=J?g^ 1JұI4B.c?3{ʽgìKmϝw#zQ.l[]\Rt|ҍKɭuB!,e>ʒ_%g>2>p |mS |^K-/kUj_[vd~Q36[Id<@ )=)5Vxv׫S(ȪpEHs\`~wdpu-.F>CY~MUq*kw ӚӖdZ,#9 wҎkz o~F_vzP܏X lzh׋LsNsig#:0{~D^ΌUP] Y,gu7]DhUrzb;@}M墄. _sO=yQ$% ewj:ԑ6#ٴ1+˥W|p{7UV^0k'لZNTC.#AlDu,"Gn,p|ωM0fy&)+n㽝pa+`Bե,S}w۷'[э/z!slUj944! JnX*ӝ}IP-GU):=@?[|;bL#Ykv/3|kWDtY h՗NZ!3k&5c:$j &.k@ǽVPfH)~ S#^ݭ*y}G$D B*^t7J5kǪ/q9:F1=P.O`$D,X-\:~⥙_mK BCL1+4:JJ9l7"P~g)8{n2ɞ N⑝4'B6RMT.XJVs09L,ųhnW'qG.Y,Dݟo;B=! &meE4E1RTmw$u[3xtGB<vMS㐟߹R.ѱ$CDE%~zKg?1P endstream endobj 95 0 obj << /Length1 1373 /Length2 6093 /Length3 0 /Length 7034 /Filter /FlateDecode >> stream xڍtT/]%Ȁ9H#) 00--J#tJK(ߨ9{Ͻkݻf<~mp/( P >"bc3?Z"6c0 $]:E ݡ#PT(&)(#! Py@Zu8 $bSz# (t\p Z #]m!`?Rp>vD\%<==A.H~8 /r胑`k\6{0~"6#GmGy`Z؂aHt;k 4:`g?;ѿA`ApWsC`&? ~9H8:@A6hߍrzzC" ($?54KV)]\0W} {|!0;_#ع  n`5ſ=*(vl~%7v6Vu#!`/`mD ( #OvlGFo dƖ *&yy(OHD̢ ݅b`pğfѷ=>36X0?7E0C,w?Po+/a@xuGG3߮OU Bs@%B/.e*Fp$׃ *[gD &?K*lv%$" ! o"ђ708 @#~SX ~~):(Ool4~ſߜDp[Pֳj9OQ)ͧ\|6 R4+>+q.0_~kÏhNkJҟl!8N7\m/!#ߵq3vf:[8nՙgWmopVƝI8XiW63tx(>&n/)ʗcIC6 nslj!v~ZIr `SĮ4&$ |R_R)dI@jHz&j3ڐR[iuӃr+Q^ujяza~(It)i/9K:*J(9镤+;xz$LiR8΀ہFmCRn|qnV.CǤ1K 2/tx;\<+1R]0sߕD55bM;EJp@*δ;3Ŧn(rD>IE7,(sA%V=0!J%a8.aS>h;Y&`=uʚK#H|!PSynf/1T4Shn^B!KIi!! 5J-#Q(ͼNqE3Ɠ#GZHLwW$wC>4l(B~ב:S6!U/~5&, YOlj hy̥U1 N\Id:v@ SQ/]tCG2uk@uѝ,$ ?c}Q0@u=44mg z{ I.DmX6WD(LkEhni(9}d{az 1,Ũe(ǻ3e,3&—$O^u'5oU;ЫM-([t` ?Rl}1Đ7N.ĩ2t7?ER=zYbf6]pD`@g31,ܹRo>3kMonFJy_^t.~X] |N"K#вMd Cb.ך"&z B##]],P A1±V^aV36~jzwQu0<~՚ζoULby[p#i:m:w \!ܾ-onVIz6(JhqSnuߧpk#Eq",_U@i CF)(؁XkaD5lPB- ^K=&j2}EHLjq2٩Y 13̾< fGSiU[x"5O-ݎ7u>1^E.)a&'ѩ' J:^DN.E\&mدg#bCbv^~v& -ޔ*,lc@+nNG)d_LQ0:}_U-!8]0ˎqksm1m 6. Ǒ$2Z{ګvZG7Ym&Ќw#0Gf}P${Ǖ])fDDzGbez"uO>sl"ɑÌxG^IĺO4Z >A[0OT_q"2Wng]ŸխTw ΧRټos`bA=swǴ-Wer{*RP)N{^Ou/|fYڏzΜ~4N NA)lV#xbg&G=We\[i3SSM/:Xа*s|^4OA#~kR2Vq`L׬=GY¨Eg dw%nMz.+1T SFv7rTr]LRSux·{pD+6:5YE#05.h߸=0п# lD)cZ͓_g)'IXg6}ܕM))=fL#C~}wiZ'I*屨{lּ.嵐]-u$#] pdi+t}%-ޮJ=ƭ? _(UwR&x@fTf֏;;Om-(a C䛨LQO'_y}#kjɔB̞UlU$uw:yx4tJlRB7Z+&2Y'cdy䴧}+ݔfmycj'DUzkɟX ܝ=XE-*b7x2G>[<9ЬOgș}u^=?XecYʀߨS0z@\)"Jҙ/~nwY1z:|wZpaťM*)j/b-HΫIƹ A’C _?cG>o\}ѭ$JrxdU=_!;YH}U, - o'PWoܳ L|] :Ut&UZl¥RFQ'iSW%bgGO i,CG_ޱwȓRi[J)`\R!zB+l[4Ct?4wSK5uƾ>VkS#9c^z`J"BNu0Y,e,5v;4fc>ج]™kXp8Hx>:4"9 P6!K@Hf./+w52:' 8G'0c@|#bySb?C(sv,l_}cu (g&1y6Qyt+z4TtHHVaGR#ikTʻe;m2 h v2\pI_c!@ڻ˛xԑm Pܽwyn@.=| joKLy[0c-lrF2[f1*1^5$WlyNvGZm A>Nh$!JRt6ܴѵ)cԄC]7ĔgWGScmVKZeWІI3/}FUTּXkꋪO%y~@5drjoSXz_yecvФ%^Fw ΂4:[Ay~Q5ewWHG)]3YgwIR!&y:gB;!]| +V\8t\GuX mz}mNv-N?(mۇS3o ;z?lt `VɊen" eԭ$ca~f6Us< /Gl#ڿhD;M2slFp^b*U yµR69 }$ܓlF_7(u"R%k9y:t5׼I bKc`UGܾ̃#-EKqiDr&"ViJ|Yςc9(C"U)7ݣ6%{5!9i!E͘0o"ؒ]3{Vp_} v Jv|'n`#uAAUcmͰw!}> _!1+m%O=XX%cpW/QjpAeRQ}zsJrKCy3PE5,('v\W`68cZ >,.hAQ Pgt}h=,J\"a.hR;LRXk:2#[\eCQiV[ٶ--dÛwQ+Bƒߕ^ȩԼUq)ey`ɖwڑ-^l7f@7-lHW0p+ YMyGQym!FF 2JcX>c3V<,oΦ jc-v/enHy.Qiʎ8UP*!ᅀfOnux\'x>|\vLgEO~ ͙T' CMk?n&_~5*^o5$ʽa]-M'}6qx,ez4rtxglޗt͛=!pk1!Z%xu@.;R Ϳ9sp Lo1;8!Z#xnÛxectk->g)6pzE ~F u`2٬ojrVS8tl-\5\KF PÑ4AM7=G6}S[C]IT"2VմV.^ۡ9 xW_-]` =1AD3M&ī^?-~){?g>cAM]Q?a|&_5jzhg4D\%&J=^Dt[)þN>ET mM$m}'݅{M0}C4C$M'{@͖L BN5S7R*9?ziZr. 8$x7{HH=5=ۊs]và)~YN8?S7 -) ʩb ?I#C>u"Љ*m9[OQE >OwmX3z`Ќ%}]nk;1Eq*- IuF%Jz{rAdEګgJ. Җ`^]e|lw3`(=y'Ǎ!գg'8Ы|[qM` e#&"VUp[&(D$_a1vy$ê endstream endobj 97 0 obj << /Length1 2399 /Length2 15243 /Length3 0 /Length 16650 /Filter /FlateDecode >> stream xڍeT\Ӹ;\. qι${=FwϪY$j "掦@IG7Ff^: 3B[G tqvt#4q{Sv6 '/ /33DG^9@ tstvr{߿j3 {@ hhf tVnnNLL&.4Ok7+*4U6@oqpu+kTjn&.@ n`t! #˿c#kML,v@<=/㻽;M"*S+_U2b@7Wvwޛ#upt--*݉I(#ֻ`ff~?X3efWuo'Ju:9:,K[[|]M<7wEp,,sk37)w1>.^=!d0;:y}Lr"""tZT ``ecpp8y8H?a*`'F7g =f_,oay9I͠/0}A})/U +ͭV}-D,G\1GY;]j ,Gkf׉tFp0s4kX98&..&pCey_Ns `btpt{7Wpth99L"A\&߈$$E\&߈${Q޽(#Vo`RL{{<=ֿXXߩ&f=3fge=h?_cĶ@+?3q6s{?J,0CΞ/6o81ۙa]Qpvtwb;ȻO{V~ƻ~g^_[ީ?JxИ~29}~i?g{N@Tοe֎ρCNv$N{{݀vpޥCzx;]fpt=W?{8b>9+AUU*-`=P PZg Hn}Յo:^݉f4 A έ_kɪSN $:dQ#R奟>3`- J/Ҩ2/@$j<VTVnLkB;af TH cK}bLA꼨?Ox4}ps m2c@*Y#.S-{yYۍbgkAPkE/Lid+YSEU 7gHqa<&NA髅08`PA*a׳x!݌W;x>{Y3OXE'un룿* 0V=˰ Zz(d jYtgV'=HrŕmȐ iy D 6A\ IɳhݒBA߳# `6ήWqy^d(gyff3?H䡮"n[Fj(NْXh$YWMgt;EfO~yjHRj'p+Qa܂=eGM~W/˪c(O{S/foi4*:(E|,rKbqH;cz"]3{$%[Gk"?\#咭Rdq3"D_I_Fs!m̙yB' /&8CT ^/lF(ú$gze8HJM V{i MWQ}Lّ#B噘LZj?YEd0p΋Wu⛅~񺃗c~G}e 慪pGW#ע$XP%&7aIq=J麔 ҏ.1Xf|:A'*xqqJvϬOv N mdWvN iʖ@ k)D0NR%!Qzs"Hi5kT3]W&mADQ `d˹BZ ?+ C!p pHq*PپRoB _^o55 g_3N_G<{zlyv7'UyJo^ڎjȬ[\grkm@q0|oFo޵'tCrvj?WkO6OmI9<)J_t3l/4u0=8Y/nW|;c.5 #&/6zbw*#8MY C}}h ]de'p=2 [3ieqwZd~4{, K~ri*]iNeoK,;qJA*&tEOs*f nB\l\pZl`̖cegQFQ)S&|+A)x&\WoR!:ǜ4 [?gҚuQid {^# (F_M[CM6x+$O @ylccLh 8J?̦djzɱeZbI[$7?˜}1? YL/_o&H>ŋHݣ6̴#UڃVIǓ#ldy6[,V덥e_<"h' b&3ȆDOgC`uraJ=ԘB Hk ҏW,NW_Gms4hE*2ԫ>4.nhո4F R^'Q/yA#fg jTAk•o0ꖸl)s<T} _w"4O)/{F1Ofv wΝ*)2  ]/j=YK-9ye٣P:=,#*_x>xװ:YA[2w봨Z yە l[->P; HIV/(S\ZTR+͙+lrsr)0GHN MNK9147[ng6 ;{j(3kRM^[ͯ] (LW)#f.G9AGsD`#F X ?vg o[|V[:QaVsGo7k`qKI[>EAj_8D( bz9|#^Ĵ}]"5(8d sʉ7p ra|uykh(p^T:DÔHЇTpJ:^w\JrcЭ>BJW{sϬJ$ksqVP9 B}eW i Qd q@at=VKC-4A|yvk^IjB S by "͜#N.btsN1nWBOlLĢ hn|Aa3N3$nf1caeuх+gp~_[>E;Nڶ+ncb'M[9{:f {.K+w記+ rdmFD3.m繖NR9`=״vq4+B-T&o9|8Xz<<ŗjIK\wMY6Vԙ# ud+ KuVs>WT.h*x'R eęm&WhW9dl>zґB(8A"FDbBpxxdG'6==_'/$FMXŮ妃8cƛUcv5ꛦoU9s0-(,Y7eH;Ͼ4= YN=Us#t^A\4t~}\.&_g]wҙ'O؃a.{'WP~$@0_ԺR3U[>M˂.R_Z_e@7duC 4ihy1K:zXjzQ+y(c_2&ȝgg2F6xZ1|u)Z @;F4!_"'|e|- v~6SpWoT_n|\,!QCo*'r# .n ިq'E]б5$OZ}T[sy҄EU.jz\qM;Ou՚g{ΚOO?FZj;b?%zv";Ov`}Vbp< ђQ mjf\A_ݮ*3h-jJ9}lnEZkO >`}5Ρ79fIet-*3bLG&I)2g>de]ӈ{q\J-A7vAbsH^+ -S0olLI荊a $v0xW],/xW $%;4 XVѓ0K;z1Iw 4s|C͗G>#jeqrIy[82]fW]SHF{T+"ኊ9e1"ܰ#A7~5';={*fHpbɊvM~мk9D.ǔ*ԵǶζMϤ-q.TVx3'M5wU1+"#? xMOK  v9AZ 0̉a9o5!!*]`d|'Pbɧ<ֳLڦ鏄h 6]/4Z!}+b(S  DM61qQK4#_MUKzjslp|g&-Gn꣐*Ϟ@-F΄:7KeqǼj]]bqJN#mQXCe#?TӖYu ?āǢɮLa+p/5}+#vwGE<}6}%_CNۭ+aS1v)1h?DL=U~هN]n'T2XG/&_Jt0OE i_TkZ[[#YZ 2#%ZLJP{7_OLȭ14!l0Rq ): zmDǧ|Dw+C[ؼ_#BVRS+1"q\ş%H벧Ca쾪d0yv+!ӿcpq#IHU8r6}\iL2 "mf)rWtlGjmF9ry >َCEJ`#;r鬣Eo$urދpnQu$b[Dߚ*_J0E3$9Z*??7K^pr@BcJjN @2TmJz~=g0@鎈G:*f*G,^L=ۯ;er6j0!)d\(j=}]to YYQ(5j l7&|> ˷==&VĆϣ`?bTT3GGqDigc23 Nn#dϽrXkqVIr~D) 4@߫R=1>bq*}~h 5qqgXIG-%[[# R,𧅁Cm\c=rۅFOV>[9}.@yE6t)NcĬ a{ 9Ium"~4**N/7#YPa3p%ϭDnf C_FRJÐN2XAmfFkd/gyVtb;/ b &RvÌ&S i3Ubr5k)!;mÛ`Oŧ$ <Ö4|O3/6٧:|G0*T6Ӳ$B~pʎHFYIuָźGKi3N& hg Y-YoɃhCWc /-TҨս`rwr,4vn\~ӯ#*V;6uyff=k6ҩ+&ҮGǴlEGfng]j%\p}7$VF7;QRGV-?~d;<_Brls/ uPlmې|uv̊U %SV9+2Da1 ƴLaxT׆B4Y Cmχ+lzB= [F6B{lg鯉ʊ1$H'hjLgѰC0X8U?Ֆ|̫')gўƘYUl_!׶W)-9zL ,vFIbjDu9kQr.聣P/yav'\sK$ A@djvIy{s/MIx6[~lj 8.xw#>2\ -jf-SLy!m}(6<w0z& VjCO -!ȏpMlQ6~n/F&ΐTe=Ccq-U2u"('V<%_y1QipHr'ȿ25{rwDs"(C/yqE33v{3w7?j7LJcT >)#іW~8mמfbߏ??wH_V.pP+Qu$r( Hl8 Y8Gwu^qIswy)zfy$D(t24Qg-EZ㧳OQuQݶG.FY湴ƣpg(Wi2R:ob@ߚpz[MXŖO(;OQFRն؁+0!PWZƦfg[xۆԺI%_=Έ7pҐwFɄsF4"H;n (Ŷ4tRO\h˫*{J%tC8OŇ~@0g=I7e+,l ?{/kq<|q] #h؀Fwj[pgQP-1 +|w[C$\OAaQ8ؿlØ',ܴ^%50rUpCq9*~^=^ڲE+:k5iFVfu-ޘ`Yn[q`Uɕ$;n|B?4Pt*`^T\RbK6 '40] Uq~Xk7A NS皹UXE<9ҧEΞȕW8YIO2Rk%5DŽ#  fY]1ԇX} نI Sg7]C&$ح̒҃YV-*$e w }G ,8uW? ? rVﺌ8=S9$\ ZV\„pI~in_v^ɥ;%hk?/6aqO| ~ӻ\pz,g ObAvbޫ q2""C;B䯊}s<(O`dNh鲙m*ꔙ%?]DDX%P>9pQp^=rDo+ Ʊ PV~Y֡h✫CEETBBa%lhSz{ׅl^QV ##yP; Z4廤(ƍ~,?SUhYs@GVޑ1[ P^5cH]Oy; tgc*~mUȆ#[Q۶py'kY !XPGvVbYH'hʧj+IsőfWa ' v2,IъG-B0ܽp!P& >đ{"hױZi:'{ C =ҋdݢT><|̷]»[v t"܏g>kf2yܐҘ):Cq)rmC~9XB[vOgUs#z.ic䉌{zkzY>دHɰ@%%GT֪ܯ֜R#{x3n͵.$/Kofnߣ x AJR, Lvށ(w6ႉ#'i2iij9b(Rj/YQh 3U,S@&=@4 ڡtm!dɁܖΑ{t`za |bo:kG*^p>TҤ -ͳpG |*]^ׁзoV:i+ T 緧Ojq"NƠRH%CϳHt%:1qgḼd!}G?(ԇ$]>I۔C!_q0^C7LCoe;ͧ[Gđhg:'j tmQ.YdEcmW F(C4(/SΧEԬԳ_\o`%`??>Kde[/V1#<5 [O>&M)0B:Q!kOa%?tJyR]AiMo E0ڕ퉾>ofgj'|[<`'M `>C2yrM&ϙNM}n7y @IҜ %$n*9,Z8ȋ l?#x6]@`S\ XQu]s'-/^]:* C8EOA^k  菺qÅѼB3NYdY]mPk,Pf}Tgt4 Kzo#n/?(n7tfCQ"ĉ{1q&朡]oUCF< m9/ [uoqC*b6]?RcGSu c>wr [ nS~\ePCx)яS]B*8`gM>.Gtw'J)C5wV~j21vf#$֟fHjwaֽ{]P[7Rʌ#P"VKd)L}3NF qNբQ"\O"xŤEXijQFs`㖁hO㘋Iy&G3(3QQQ{l?FS+O8VWJ*gȫR" ͜Kʥ.$ XV2ab!aN2=x,~"lj"d[mTL(•^K>J ~qx;0UOuJ6W*a-q7JjHqu:r(?D&)^; W }/@-_X4dX3-Cq}1efNflܛׅf*zk-Sоw;'&o Z4u#?8 7FLggΰ~d_s0i;yVh)HdEQ{!\;RrCA'~tGu)Aa{SϥL]_fX/+ݘ9_E!,9Su5?JJZ=4)l[hk .!aS6<Re b)yvNu0,t^+~2ZpWńщ\< EM>(xёօd+{P#+ .MHtT pw< Ƙ(i<0HoY9'ks߭i=E#L#)ɠW.t{ XtjW8NusszI[Ksmsx3z,n[^m6Fm 8љm5\%a"0Jd ab$:Ѯy(as5e`($|TH*YYu}e hc ά72 *"zs d"&fH9X +\O!,KT 1(o(2߈Pʫ[esX*\ 浄IOA 2g O<4ꅻsVcÄn+$Xҗi|aaUh/y\a G+CP]j$4Z7s%,{Ѣlk'4蕑=1obՐpd!'nhٔ>Ahky~ITF&Kj4-ZjșIm3H.0kX/K"ݗKbS h|NĂg A3Čr9z1iQ*E'hv%\O655g^:>W@)f,R# 4Y.'<6:c]a+#αs܁ d^.13f +5w$ZXgmY@} 롻|qd∰.d5EuN;IM H\>5}Ҵ>?M/M0NJv~=6Gltv!poPE7h5ryt tmx$)?&T C$Z86uu'!f3jo-orQqUJjxٜ*mjO\^#$ښHj&>)aaP#zv;s཯z$(y#ṙ]"EREs0 R{dƠ˪ZĽV])JkaM r3IXp`c¿y|ڻMT*`]2c&@@IMQŸYɺx!0)]39&q8b$`\;XkWwRPv;dbI[)o'rpRuuOѾrޑd;E>$":H/]8'$ѸJ \"FlOWD5X1Q#WQӦBRaGCu>s\Ӳj'K= 癥3܃y9uk{$s4$JuT& R֬yd>IL߉vWd{mh&df|P#n2ׯS9^Y,QЮ/q6W( kH!} D˶yMK>@wE7⬭B*Z~dQ\xm{V:PZ̰}I^Npz’v!'bgfLkp|`E)`Ykv\^,mk^WEX}Iuw| g"f& -εS҅^a~An]"WʴܪǽOLh`B6>HÅ[0g&hᆐ +'׸?P{Tkg ǗV@?@f!CXt& WRvG͔ ,;8RWVa%kEV^Pg7ݣ)oyݷ`, ³NH@ .5f^ L^S]Ph=|47yY4:⠳\a,,aq)ͬ(lȳ >^ aL/\EIݦdMg@?U]$iFI yQ_$~, q~]{scSeϰ+fJl%jk9)6K` {/KΠw:Ri֦`/t ֩yhCa>`Dc3KhFnuLfEpk) 6K}D;pӍ$H]4h 0QB >ƷQYSnݺc/kHv:q o8E ެsX^oCLnuIލBcv}(n pJ(.O jiOj_Zb'1#RH۴Uz﨑ŏo9 &Npݱb6;]%q5 m2Da4Fm^&[6i\鮗>%+SJO476sr%-o\|RXј>~g|I5<+̨U5hP"K$ % endstream endobj 99 0 obj << /Length1 1407 /Length2 6266 /Length3 0 /Length 7225 /Filter /FlateDecode >> stream xڍuXm> %%H3RJ:  6ZNA$$FD[VZ}ǎc]u^u'=CEL A@e#X@$Fpo? }'DHB`}*P D5܀` X\,! A HOi j"04 2 wr`$ap{(8ܱn@C=G Yg %-$#uG "=y>p3yzVBaV$9 ' ua46 b !@= X/?;jotGA~pi b|1@(FbP =:b7 p_; *=fU2I~ͧcO">-G8^(!c QHsab HRX |흅~50C~PH,0 Z$`0nWǺa-@X_=YaD4!Fj&w "`PB  g{P9@΅ @Ş#{YKe. o[@/S,U%O;Cn~Xza*Abo /^`X5(" Djp_=8/7778vz`@aEf}a5Ͼ{/ P?Qbb0V0d "l c Ib !~`?Lq^X vz|a$SH{pƓJE~aQCbeUz5PeIy-u W2cij  R˝mWZZmEN; >[PzW~\C]-HKt[RR /I1\h3[*ifGbt)?.|!asu)Ae;\z<'1<k( QP;CæO2$)!"y'n^ʉE Ty?B u( >K3a7Cq^Gjx{-ayN-EYT>N'k!0r]Q6C嚡L)3Vp@gJO; YwߘWcѴGt_4f6`.|ME !<5cC߲QWJ3a {A b*u)Jxt5A. 7AGwKPJ͂YN=~p!Ĥ狗R\{9ۿ5-7>P h\wd9ȭ˝).i |#f4vl? !5,(~R!Rn$vc˨S3n6~X2 75,HS %ߟWΣ4R4p j{~mCT&PE7=`wZh^/{IɎ4<l0. ,6-{x. ;m .+,{RL#ܔ;G"_}oPe^apd[B` 3G4;@({nJ"K,n `"QvWĹMn~ݪV`U Cu:ֹ Z93kx5 &; LKw)Vn'L8Xpr.hzM/#4 )(C/n$99b6R ~#N_}u"YC"k % c(,[*0w[[ĶḙBɪF-~vؕ9gsѴiKZdm($nk7Tg͗:%>+ SAv7J,Ҏ!E o Z F 9hךyɡJK]VT" ,FOa*KSTTʩVN>0f#?ohvi;U UT/NZ4עE]4}>f9xDEQ0D-ݜ7|"pENLh(E )>H_vO\*8l"ќ2rSVguepG?. C} v~ɆD Nn)da'^E;(ڋ2MuJ\"̈{,EZ*TWHq@^Vƕehyչ[M*2w DI4+\U\Lmg-oSzvt%\Z9PV6'0Rn'VB8=(ssz7!0:sD"!S96nVSv45Aˋn/4dGOR/Hg[^I~̝p߾^Cz}CCc'-Wx.`āZYݠP<+>y9'` Rssթ!$[eL7;龸t,=)k S*U VzQLŅ*DX{>۪YsR 2ڻ;{ʹmOY!Yx%6xW8C|2Hf=bBnW/:- ^-ψXE0˕E=_/6j:"o[uh5V_.8i>&*@%oiVL# Gނ__ җ`u|tPٝ:Ȣ}|#.\|ncɂܕsⰰ{~j<G*(trZEJӇ0vע& Z#.¦; H-cަl0;mrgrL㹯ӵ$z픿6ձ#Vu-*&tvue GgV'xM!c@u= "±]"N\NӗM?p*'J~<;x,FyQnLKlkphT\)ٖYF! $^kY<}-g4m1/ݟ5 vGH1-)ؘI +]<>⻳мbJg!7'+,V~ Qn/"qqg7}/%% 0'<&hwd&[>gqWJQu9Q \NbӖѮz2O1x'42ytʨFpmy(cu.Nf>oV+?xW-LbBZL5뮸)_ 5Z5\V:TǚfWEm҆~?34\u vOdIq 277I)|ELtםILL2JHV3=cH[WO^wͽD;볣W9氙t$~| s) t:Tg(_D ~pe:.t aC_jP݈J:h)^PvPs#<ϱkr)@,Zkh O"ڠ&֘0l64c(^ˁUwgls󊹒;mzNWd=&/uc Ken+n֎yFjLE@mƭ&vjmQ5xo1J'8"[t$N?9:,cϲ;,jK\mI(_zu1|9^.uO?IW ZvֹAɒ1CR _%smzkө)H 3e 3gیꯪ<\m*8<-Q"lRlOh8+!b`„}.Fg!H"q}7Upp&jɢǶAif@}{YvOwƒ#Kw7-Eg~%6]Q :a` 3Y\*Uʔ; ,grT$%SEX=LcےyhV0 Wwiw6\@^eECsPIYጋQHqBV uw̒@q~-ɮ s_|1N+Z9Mz9[q !oT ZS8z4vVsu\<tږb8KUFjB\*a{u𵽫 ʉi zd]K&~ J^X?-s 7uUpn Fk-Ͼ|OGT㺿$LN=`Z\wH+p71)|~G(.EȀgE.+4>%@Pk.IHt^}Û;/}?~ )>P^yJ:fM"!p7$iJ 'esoN"n3qgu YvnY)ۤ(wm2.3Qѻ+"~;^CoOZ;{R:8hes@g 3Fu9]fo;5^bcw5f~)Lu"b? [G;P'w/Kjǫ>Ri/!ܮT-aɆ09IAeVvR͘2Ww;'Z+h#oi 0 0nNz r[ P5՘ٙ(*[>b騯Z];GOzke9jl4QG-9=+~\Fz,3*8JlKBXM蓂|2AzΛ\Bx/{lj.%% D!q봍f]?ecӈt $u[NF7]9DR_%&kXA,G$@5/jm ./_6qgQsƬQ_Ѣ6O w^_y.U&%x{)1E_0YC(Z䶟lW C4\@UtxH&A<똔RMH73ßna|ג$Dȭw`nM9հX0ѽд&w2:!ǐ@.RHixW|jI3IFWOOzhnl~F`sȚ^a. 38]t)Gqߛ,d ҽOdN=X%W,_TG0z*l_a endstream endobj 101 0 obj << /Length1 1500 /Length2 8527 /Length3 0 /Length 9532 /Filter /FlateDecode >> stream xڍT6LtԀt 1 0t7%HJ7HtH{yo=k=s}}}׾td`E#(S@~n IˎwC@<@T9T\^!1^a1 AnP+:7@qb9y¡6u `xEE9d p(P!l!+A AxW V [Iݝ Hqܡ[6wX~ 9@n k uˡF 8<:ZA:jM'_d7tGNu aN GO jh*q#<o"rAA?2/ :!\]{a`G pa=y>\;G5wVN(OP0V?"p;!|08#6AHHD<ߵXx |@?ZG}} L k~yURʝks$Ӧ~< 3"3h~&qza*b-HM:ٌ(DTݩ< -^H?Gr& V]4/ɻ"|jQ}^$ڔQV8ȿ!U:R$RIАgaC¨/{~^xo"2Qe.g0R)l"42doO*lUkL_ILj5v~dx;q޴_ڰdќGEtux@}fy fiqQP-K߶ +nј܅!%eǭ݋>؁IIvi-Ta%\n&8'ko|tvN.OE8E ׁJ)TL3%f޴ n{,dզS-L))}&YR‹4 3N&zkhp0ZJ8YOky:\a1@0RԴ>akw,Oƈ/) k3lG6ZfݱӠ0`Y}dhf $`=.f{S7qWmMqYJ,_ J*}1#Sp';dlCuDY ˱o RAg0AK/%JFؔI@xJ۽J&4ql1zA  ز^㠾 }ҳ"v'm81ԣܷl_$bwlS)bR.4K> ձBDi#Ԃ-tbV =G{2)6鸢rQ+lDGܬbX뇥(LN%$?Jxyp.x%MB򆰺ӼJKrcdMq@SKF7uGGFE/i0%{UYmusl`/fʪ9rŋ_ls /S[.)@uR LV,Q)Yp̱x|+գl_$DBdIm5nrA {c*_L;M7]&pǠ0 ݻ\25'mS[,lqbCLOLb+HKٹYrlx(Cvꩊ/zm1CoeN<ö&kpd[/05^аBuYtD~9ഒji.zs԰Ke-oIyQ3?|YǓ6/+5W)3xм<#TytWD*+3!:Y,9O),>L,"a󪺺/ F6'CpuK'9?~E_dVHI|]6< plen|iTYM+vm{XKW$(潅 Py8Ujk1c w-RίJٰ콝Ȯϓ!'v_iP&^!['@|\YG J Uw_.|є/dܟ"0 VߐB]Qt3-}h$v;)-e|Csҟ|P3ھ!`A:nEm/mF&=VFf<}Ι|?n| |P g{5Ulz7K8(S1i7,ՆD ͧulaAky!1=^۪&Oda--NIdr= ာnC <{]c;7{F2>t"&x;71,kQyRly,UqDJž6Bsr_ܯw˓N_o\2FuʷPu}Ĺ62*eTKNH%yG67i&tXЧU^7+`YBd2%E}G0u1mCtK-Ԇ2`)su;A#XluQNM0T?]S7su{#96lLQDPr,@<Nۣ;||PԢ+cV q$S\hc7D\T$& --Te+Vim wEpO>S|aٞTJ 򶄩f(o9NܧmhN:c|ۜiJYuf`3/Mz0M36Q1+Fu¨% WhG0ar(EcE26N% < qX8WAbN,]VΒ=Oi2!ìl`/s>^W䰠_Yai$ԉʼnk 1HH>k %LR{\]D֟1m9fS|Xyi<f,z~֡dԦy'RUzot5$q@mP92P~YVbJc=LZBl;4#ἐBv']u{Λ_\2PvJ/[kUUs#j*8:U9Ő!p9iv}λR3o\'X wUIf>^  ,'C{ݵ~2놜#&lu*n/ol&ϙ 7`j5A[[$/^qlE3"GtLR~`5Pb",}%xCpI^;)y7c˦NzK$5WGK8_~X*Y?Qh_k(W1):zvh{UWˆ%j˛it=8mb4.UӪ!/U/'Ì]"YgvG$XGb˷!V/ԱD0FEn\'Ok Jŋ_BKda;h1W}^d;帱~jª|q޽W%t.oYRwJ 0K !{+V$Pjh:eȿ 2RY)R2VLNoZܓ>5'4]c̚jpI r5G⪑ 71ekO`rF@_MVM6/q4PmY kcJ+RY{I3 e6:)g4 pr`c]WRg!up3XAʋi' # Cį/[HAu~_ kaXds+GÌӌx/4mSQDXGo)2n8mؿO[Gv7kUi3sc]lm[i:1wRW՜r®0P!@̉14EsoԢ(>vP>bRF4+rPki)Fh٠ges`'xkzd$'U9'"!q uvKFVUmCD[Pyk }EZzmmtyF6tHwrF U|OE4846g6 &ӬC$xR f{Ө?㵵w]NŖw%U)%K<}Gy}"ZaT|JKwf٢llAQ[B3-{u3Ԗmo&uYX80"-dI7Q}^O+~]! x°(}"4ruSp) YR@&۝.|D.D2 W22C0Vx&lh+[0>>S41K #.IMw[غZ/u oJD*W/pHKCP91ӶtfW*涕`ʦi}vtJtkة_R_e6t}wl2Us{҂% *DA.`74G9ZiT"ߡtйDO+mXm5\'X}eKzG%C) ^<>@oNs@|ɓ9>nUqٞa".OBµyQE81;8}d>pb;2d{g\>/^{fFY)-U}3>Z\~U t 04127Y%6OUH)4Stm7F~;߼D(?0LEkN#LZ~EE{oޛ }B;;m˾ѐ۪Cyj=pzFIPgvU*0j[4*zb{_A͑bGFR ~ӟ b؋s$ U$_S@)y&Q=JlwQB40e BP癴%8D] oǏL3G\b^n */ݧ, :a8ErqKzK/{g "KT*4*[h")rc,TZ)#"|˓^4% /"MC XtLnQVf$s3 vB>/DKxս?~T~o'M{ٜ bd$[XBKo^,4|4i溫|)N@όohn])Su.sX\Oae^ci%m6tYzH⦆C _fE?_' =eJKYΦ O ~Ví\uQ#X+Yt9uïIVkvd8⍋ʨ ϪMIkk3)6]_p-u xop3 #{'-'Kê>YiVtݲ/1ƽų!TRG9~^ɂY1}幩 DiʚLQɻxto^t@/Gխ=-4 lWxs{yyZȦbԯo߁@^JpV ϫ;&" endstream endobj 103 0 obj << /Length1 2143 /Length2 8060 /Length3 0 /Length 9336 /Filter /FlateDecode >> stream xڍ46(jUFމ a*kw(ADD B=zD%ŷ[}gyf{fy 쐶0u$+UtML@HLps.n3G"dPA XL"@-w X Kɀ@@QHC$Z uZH VApG,^P> XZZJ CáPuNB\H( ^9G,%#") q# |@O8h0;ϔzWߩ &p_ c=q8(;;hGe 8@0_w:#~!P(Ax@{ # ! LJx@.[!@u%C ah8 ]~( j;+ ~Ƨ Gà{}'dGL%b4Ue0,P܀0/LQ_JO1.?_ǥp_ Ģa~*`0mapwf? vavHo_W,of/w*^@_!0PHTL(!*׋wLM=(W*xK[w[$@P(=7"uw_z޿ ?z+o \ߺcq3MM\]Xn.Q{ XKls\YB`t:גT0D5isD%$4 :ITB MWEH,eG?TR (S Q"j")&(b"P7qxhۿr5п \Hςq`B\=D`aKԻ7E(b;񇏟j;GƇi"qK7H[d? (@-".gWe"}C [pjbP04na*KGQuGP7 ; #0NG1<( sG#"XG4{%DA9>0_L+ č? AHlSUhiꀨ8EAɝ5FO*rgb1SJck1gKԛEut bdk.~|0D-q]niC9u{) g|-wqvK` 6M1rf2Jѱ7\Ł$VgiD%;gҘ76(PG mL6CQ65 GMA~q&{w} tvՊя#LB, S(^F֒$6RWv({]by>I!^>1?p8-Wq9ᇃ(Lյ{)q+C˶wSAl'yys"[kF䨢Xn=ΜvSEs{?.7wiy-)?N5?<]L4S#t|}QRG1뤈/؏Zg*6ܽĮCU{\n^10K©&۪ZŽ@8cgGN%*$HH֞ߪV1gm'eǰB6}j4ԍ,pg N)c'p0t݃Wߏ s$L:ҖA~%7u:AG5?<!h&2bQG>ŒՎ~b[יM<<ɷ@!\<"O}׽Q%1}b-"0f[2s;1K2x님;\ ʯG:}Dr=eWl>@aɛè4B6t#GvbeEgg&T 5=>n=u72T7I^<0(r.v47ʸTs9R7ђ`&InE[Uúm{AYㅘ LSw$d*-7Kc \"n;7F8[;K>\;  f?H=]|(56u8`6{ |yic;\X澓鶌 >Wӛ9͎Ъ*[iޙ1 T`AhT^kF3Dteȕi"b|~J66rhΓ93V{h;\|Yʟ*K+޼/mVvR*^@_V!׃XF@ơò-lG_m dfIS2JOtz˿r=R\R?sE,j5;(Y4u$غhwI@مeHx'kl^J 1l9\=?&t;>gy$UNR$M_a\jh %9uD*Ŵ 'E7ݲ`(\"RJ=qɽMpơ×| N];/t#v`Tt5*uG !d p7cjʊ]Jk.1h[CT艏thIخ\Gys_$iu) rQn? >c.҈Qawُ8K&\԰3OnIv%HS95W(޺:D&`d9}@NM|OGB‚H oV&x_(ʯ -? muϠWc/%rb%Xވdzɵfk:QҢZUd;d=z|U-60&mbI[~!5d*g؇ v3$ϞڼB˥WӖBLG9{'2i捗/n)W]fzaI=itӒd[Qq'"ARpCqs?Zm*r)w84뫣}Xμ6W@|Ig=Eu J N^NeĜrF͖9[[y{ $Yd2"7 Ou BRGP{*C@T6 DpAD'/|@t.+O}A @ޫI 8n;ܓIHj)8jlQ%FQ3ػ-3}>2&C\&?vJx2 3^!}GiwL'ucl\JZ@𝚤e{mIr]4O7IQ0~"w{0Jûd^eG/j=HSBZHP:-Ad}h^c+e8BNyG8Ykȗf{MO+)Usu>:֎(|%z5fgĵ/6i ."&ʉv % ?R1̑gQ7Q ?t ߎ4W:$JLӃRb,??5<A% ZOf'Fer|(~)^*U=nٽ;B)x>u&sy;NVC0{Yև!qwh3@x±7Y0YmkgQ;MU]f{ \g'"RWGsӑMgF,;b]Sy};覗 &6+gl$@fS3twx-nEڂswq*=?+KfjCE^dfgZUo囨 9d~bK<Skj^f^{kO'S}B-M@eqhGQ֨K|*Ë́ /`K%V`H@{j-%Lw5i"c3AywWSE/]cz؋<CRG Q*_)%,6rU;^J,M&@bh`g"۝5Ξ W6+f<{9JEw]((s^Gl>Fr_ Ҽe?!tvgK~YQɓZ23I0tW6`){G-34=>⎤BLGɜ?g & &P,=?fʞaʇ~Zu bU7V0=i2K;k><QHAq"Q-rd'GE>:g&Y9\X/{o3XB ϘLkYsctU|э29БHw2MŁŏ(_"zRnŮ}AmtmEpT''Zam⹺y& ,l2 5֕n"izy,ԭ ᄾVba= +t^,Bph? ;V.uO /#H]@:Ch򺊰˔1Ê7P+#6k#9_6s/HM</02{Ëe7s /?՟MJmplƊy8YkmƼ`GS ST~3#mTE)kW=\,۴L[ul ʮl'(J*hKNU0'^ ώҿH֡i|oG A6귫ÊOFtx,fE D%k]uᏋlo[k{[|vH\c~ey3iȯg`er\!uhk|!Yk_Ԁ,?B] .hR_ t*dh;Qr^U˪=ET' 5>/ߒ8A*XH&C-.UeA!. p7C|2)D_|H<~IQ3*o) lz^g1ϭń4)xJ*hIf3d"BLEiBAb;9s7 36-kaaVP1ȥgs #aӒovw]z Irî~ҲTb&K]rM<) 6~[&z;kϴyG-'\?ãB(Howw.ѷ&TƋ/G{ZJS]$uDбp 2*:V7+s,%;OʱcV-"tUzL44&'VfMR?G G|c8PM.'ݜW&=g¥e9o~y:.0:qbœ)"6 ,=4Vn6W+Z5HˡܫZsFd& h4bٞS+H#ؠEIf}W W_/6V2XD׏)Kej[55wQH{~H,Y`:6#yd@B|Vqwil|yMwX:cpy>q] U.[<{BG?R$yAXiX찷*ـFIX# 2$y0B6T~@-eJtyLruKd޴i*R|ï4*Y@ ˟ǷADP7_?{Nm^lWom%Ϗgc=][Ѻ~Eox#W sJ7n9$ DoT{aH_˟XoǦ>tJد@zsDK ] >FD#2p=ڍ*qϭ%XX')r3j؋}g>Ab"s0LA-MoE^?o]>:ZPAPcYj|>c)/Wb9 rc_ endstream endobj 112 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.18)/Keywords() /CreationDate (D:20171209003333+01'00') /ModDate (D:20171209003333+01'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/Debian) kpathsea version 6.2.3) >> endobj 2 0 obj << /Type /ObjStm /N 94 /First 735 /Length 3100 /Filter /FlateDecode >> stream xZ[o8~cEMNiڤMIg-:Jcy,R%R;]`l";DfJeڰ9DR\7̈́1AI)Iɤ(?n)cLQLk40 ,d T s࢘9 hqKS5*9 4Kp> =By,x60xu,, ,&{cHfn%O&Y+`.0DTRʃNk&YDRZJ%R9H =LҶB!$K)Ka. InOG@wD TџZz8OChn,AXR!L-D>x0TP@ L CMU AD@DhyR+rfB$B0q'ZI)+L5*J͋Y9籹N"M1P|*fU0aw]dw1Ɇwx?Ut*&DRncb<Z$ao?Ϋ+"~/O2 nG*W%۬,faVRb 5|>&G*z`0EO@v8ą}Y>O+40N ~ʏ>@ +ٗ:}iZ>Y7EQA\VGpHɌBf5}ƳjE$@&co%sOii/u1 >B]$ 2BƊe>zN)CŲUXJP)Qi1ʳc/oU׫ 2DFDK8l±QM-a[6 .$l(h6Y?tn40wA@G@waǸF.;Dm%Eh捇z=]{X[Cܷ(Y`?~6JtLnt:RS#H&mh)ئIv\+d~گQyN?h^]jlY_c ]!PkU?W9^] JOٺ }kRc&':CoKCֺ[eHQ^RZfI)T*`J?djr^ }Jғ]IhWh!Z*Ѹj ~&eg)]( i1ny$#Ni OO/xJ;iW,$x$d*U({LՁ m,ƫn5ɩK+m)e҈B> wA9FiL5=X&UXvmHCyI"B,4/lKzT}mMJtq?𞤥)y0nރ-KK <5e}3׹6x5deaҲezJ2LT)KŞ5oISa_&*ŃI}viDl;vZY؇g>XPŶHX^Euc9\L#qp "%hFHiJvp>M衝|ݻ.C2 L)5^ʴj #^Kr&r ULt|'8'*'m 4 "5nϲr8'U1k׃{^Ba4-Oö1%}666`"o-vYl{,v*^%Mq7?G'><ごKo3{>/)/y}Ƽ̿Ww,ׂW?ǛG@=?z+8p  'ۄI&L5P4,X&|B 8|Yg?\$6D KC#jhAP Q1n`C+6 )k*Z;sțv{T4 \=ʮ?!҆XlGq9wX}M#}n#U >tgG 4ȤH bx 6L>v8yٹL+Km.pb5oޟxfy%5v/kJ/ÚMURfE,Z-M e=. R zYC:yS2T4RGɧ`JqRsV-Q kϟ|)v (+֔K♌fe#S丒Nҽ_O<<81RB/\6@Z/;90uK~*.wxGIiHʈ翿9{}M*A'M3[L #74c[FPccgAx M+uC{#<YxoΩ76'gAH#J:겷¶#ۯd;R-;M);lٕm]SH+h&Y"/zHJ^;WBMpNgV-iy!/;t(R_z7w4yUrFC̯1HE}]a;_>g;Vպ6L0EQ~1\Ag#'~:,J7P:=::״ t鼫ۺֺOJc|6>IZ}Ĝ[WࣷM>> h6h}l(oXbI”<Gϊj0fti׭t5TND3ڍn<:-by;]r3tVvlllxnT5PJ(5ؠZQqnR6O&v]mU:Q!A':JjmHე2:ຒŽX湨]٫{weL\l|IZu endstream endobj 113 0 obj << /Type /XRef /Index [0 114] /Size 114 /W [1 3 1] /Root 111 0 R /Info 112 0 R /ID [<683E4F01E5A6D99439DBE7001843D116> <683E4F01E5A6D99439DBE7001843D116>] /Length 273 /Filter /FlateDecode >> stream x2QDG J޻19Xyx ˌ=|{\3,07nT5 8ȅz8AA>@ B ! P=@C,*XXmX5,4B,O`6 ZIVG ؽڡz !kW|Y AaF!c0.K פ95%󚖢 )]5+톼椧y- }|{-.9\%\2W7# endstream endobj startxref 132524 %%EOF doMC/inst/doc/gettingstartedMC.R0000644000176200001440000000345613212620516016217 0ustar liggesusers### R code from vignette source 'gettingstartedMC.Rnw' ################################################### ### code chunk number 1: loadLibs ################################################### library(doMC) registerDoMC(2) foreach(i=1:3) %dopar% sqrt(i) ################################################### ### code chunk number 2: bootpar ################################################### x <- iris[which(iris[,5] != "setosa"), c(1,5)] trials <- 10000 ptime <- system.time({ r <- foreach(icount(trials), .combine=cbind) %dopar% { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) } })[3] ptime ################################################### ### code chunk number 3: bootseq ################################################### stime <- system.time({ r <- foreach(icount(trials), .combine=cbind) %do% { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) } })[3] stime ################################################### ### code chunk number 4: getDoParWorkers ################################################### getDoParWorkers() ################################################### ### code chunk number 5: getDoParName ################################################### getDoParName() getDoParVersion() ################################################### ### code chunk number 6: options ################################################### mcoptions <- list(preschedule=FALSE, set.seed=FALSE) foreach(i=1:3, .options.multicore=mcoptions) %dopar% sqrt(i) ################################################### ### code chunk number 7: coreoptions2 ################################################### registerDoMC(2) options(cores=4) getDoParWorkers() doMC/inst/doc/gettingstartedMC.Rnw0000644000176200001440000002575012303167452016572 0ustar liggesusers% \VignetteIndexEntry{Getting Started with doMC and foreach} % \VignetteDepends{doMC} % \VignetteDepends{foreach} % \VignettePackage{doMC} \documentclass[12pt]{article} \usepackage{amsmath} \usepackage[pdftex]{graphicx} \usepackage{color} \usepackage{xspace} \usepackage{url} \usepackage{fancyvrb} \usepackage{fancyhdr} \usepackage[ colorlinks=true, linkcolor=blue, citecolor=blue, urlcolor=blue] {hyperref} \usepackage{lscape} \usepackage{Sweave} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % define new colors for use \definecolor{darkgreen}{rgb}{0,0.6,0} \definecolor{darkred}{rgb}{0.6,0.0,0} \definecolor{lightbrown}{rgb}{1,0.9,0.8} \definecolor{brown}{rgb}{0.6,0.3,0.3} \definecolor{darkblue}{rgb}{0,0,0.8} \definecolor{darkmagenta}{rgb}{0.5,0,0.5} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcommand{\bld}[1]{\mbox{\boldmath $#1$}} \newcommand{\shell}[1]{\mbox{$#1$}} \renewcommand{\vec}[1]{\mbox{\bf {#1}}} \newcommand{\ReallySmallSpacing}{\renewcommand{\baselinestretch}{.6}\Large\normalsize} \newcommand{\SmallSpacing}{\renewcommand{\baselinestretch}{1.1}\Large\normalsize} \newcommand{\halfs}{\frac{1}{2}} \setlength{\oddsidemargin}{-.25 truein} \setlength{\evensidemargin}{0truein} \setlength{\topmargin}{-0.2truein} \setlength{\textwidth}{7 truein} \setlength{\textheight}{8.5 truein} \setlength{\parindent}{0.20truein} \setlength{\parskip}{0.10truein} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \pagestyle{fancy} \lhead{} \chead{Getting Started with doMC and foreach} \rhead{} \lfoot{} \cfoot{} \rfoot{\thepage} \renewcommand{\headrulewidth}{1pt} \renewcommand{\footrulewidth}{1pt} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \title{Getting Started with doMC and foreach} \author{Steve Weston \\ doc@revolutionanalytics.com} \begin{document} \maketitle \thispagestyle{empty} \section{Introduction} The \texttt{doMC} package is a ``parallel backend'' for the \texttt{foreach} package. It provides a mechanism needed to execute \texttt{foreach} loops in parallel. The \texttt{foreach} package must be used in conjunction with a package such as \texttt{doMC} in order to execute code in parallel. The user must register a parallel backend to use, otherwise \texttt{foreach} will execute tasks sequentially, even when the \%dopar\% operator is used.\footnote{\texttt{foreach} will issue a warning that it is running sequentially if no parallel backend has been registered. It will only issue this warning once, however.} The \texttt{doMC} package acts as an interface between \texttt{foreach} and the \texttt{multicore} functionality of the \texttt{parallel} package, originally written by Simon Urbanek and incorporated into \texttt{parallel} for R 2.14.0. The \texttt{multicore} functionality currently only works with operating systems that support the \texttt{fork} system call (which means that Windows isn't supported). Also, \texttt{multicore} only runs tasks on a single computer, not a cluster of computers. That means that it is pointless to use \texttt{doMC} and \texttt{multicore} on a machine with only one processor with a single core. To get a speed improvement, it must run on a machine with multiple processors, multiple cores, or both. \section{A word of caution} Because the \texttt{multicore} functionality starts its workers using \texttt{fork} without doing a subsequent \texttt{exec}, it has some limitations. Some operations cannot be performed properly by forked processes. For example, connection objects very likely won't work. In some cases, this could cause an object to become corrupted, and the R session to crash. In addition, it usually isn't safe to run \texttt{doMC} and \texttt{multicore} from a GUI environment. \section{Registering the \texttt{doMC} parallel backend} To register \texttt{doMC} to be used with \texttt{foreach}, you must call the \texttt{registerDoMC} function. This function takes only one argument, named ``cores''. This specifies the number of worker processes that it will use to execute tasks, which will normally be equal to the total number of cores on the machine. You don't need to specify a value for it, however. By default, the \texttt{multicore} package will use the value of the ``cores'' option, as specified with the standard ``options'' function. If that isn't set, then \texttt{multicore} will try to detect the number of cores, and use approximately half that many workers. Remember: unless \texttt{registerDoMC} is called, \texttt{foreach} will {\em not} run in parallel. Simply loading the \texttt{doMC} package is not enough. \section{An example \texttt{doMC} session} Before we go any further, let's load \texttt{doMC}, register it, and use it with \texttt{foreach}: <>= library(doMC) registerDoMC(2) foreach(i=1:3) %dopar% sqrt(i) @ \begin{quote} Note well that this is {\em not} a practical use of \texttt{doMC}. This is my ``Hello, world'' program for parallel computing. It tests that everything is installed and set up properly, but don't expect it to run faster than a sequential \texttt{for} loop, because it won't! \texttt{sqrt} executes far too quickly to be worth executing in parallel, even with a large number of iterations. With small tasks, the overhead of scheduling the task and returning the result can be greater than the time to execute the task itself, resulting in poor performance. In addition, this example doesn't make use of the vector capabilities of \texttt{sqrt}, which it must to get decent performance. This is just a test and a pedagogical example, {\em not} a benchmark. \end{quote} But returning to the point of this example, you can see that it is very simple to load \texttt{doMC} with all of its dependencies (\texttt{foreach}, \texttt{iterators}, \texttt{multicore}, etc), and to register it. For the rest of the R session, whenever you execute \texttt{foreach} with \texttt{\%dopar\%}, the tasks will be executed using \texttt{doMC} and \texttt{multicore}. Note that you can register a different parallel backend later, or deregister \texttt{doMC} by registering the sequential backend by calling the \texttt{registerDoSEQ} function. \section{A more serious example} Now that we've gotten our feet wet, let's do something a bit less trivial. One good example is bootstrapping. Let's see how long it takes to run 10,000 bootstrap iterations in parallel on \Sexpr{getDoParWorkers()} cores: <>= x <- iris[which(iris[,5] != "setosa"), c(1,5)] trials <- 10000 ptime <- system.time({ r <- foreach(icount(trials), .combine=cbind) %dopar% { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) } })[3] ptime @ Using \texttt{doMC} and \texttt{multicore} we were able to perform 10,000 bootstrap iterations in \Sexpr{ptime} seconds on \Sexpr{getDoParWorkers()} cores. By changing the \texttt{\%dopar\%} to \texttt{\%do\%}, we can run the same code sequentially to determine the performance improvement: <>= stime <- system.time({ r <- foreach(icount(trials), .combine=cbind) %do% { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) } })[3] stime @ The sequential version ran in \Sexpr{stime} seconds, which means the speed up is about \Sexpr{round(stime / ptime, digits=1)} on \Sexpr{getDoParWorkers()} workers.\footnote{If you build this vignette yourself, you can see how well this problem runs on your hardware. None of the times are hardcoded in this document. You can also run the same example which is in the examples directory of the \texttt{doMC} distribution.} Ideally, the speed up would be \Sexpr{getDoParWorkers()}, but no multicore CPUs are ideal, and neither are the operating systems and software that run on them. At any rate, this is a more realistic example that is worth executing in parallel. I'm not going to explain what it's doing or how it works here. I just want to give you something more substantial than the \texttt{sqrt} example in case you want to run some benchmarks yourself. You can also run this example on a cluster by simply registering a different parallel backend that supports clusters in order to take advantage of more processors. \section{Getting information about the parallel backend} To find out how many workers \texttt{foreach} is going to use, you can use the \texttt{getDoParWorkers} function: <>= getDoParWorkers() @ This is a useful sanity check that you're actually running in parallel. If you haven't registered a parallel backend, or if your machine only has one core, \texttt{getDoParWorkers} will return one. In either case, don't expect a speed improvement. \texttt{foreach} is clever, but it isn't magic. The \texttt{getDoParWorkers} function is also useful when you want the number of tasks to be equal to the number of workers. You may want to pass this value to an iterator constructor, for example. You can also get the name and version of the currently registered backend: <>= getDoParName() getDoParVersion() @ This is mostly useful for documentation purposes, or for checking that you have the most recent version of \texttt{doMC}. \section{Specifying multicore options} The \texttt{doMC} package allows you to specify various options when running \texttt{foreach} that are supported by the underlying \texttt{mclapply} function: ``preschedule'', ``set.seed'', ``silent'', and ``cores''. You can learn about these options from the \texttt{mclapply} man page. They are set using the \texttt{foreach} \texttt{.options.multicore} argument. Here's an example of how to do that: <>= mcoptions <- list(preschedule=FALSE, set.seed=FALSE) foreach(i=1:3, .options.multicore=mcoptions) %dopar% sqrt(i) @ The ``cores'' options allows you to temporarily override the number of workers to use for a single \texttt{foreach} operation. This is more convenient than having to re-register \texttt{doMC}. Although if no value of ``cores'' was specified when \texttt{doMC} was registered, you can also change this value dynamically using the \texttt{options} function: \begin{verbatim} > registerDoMC() > getDoParWorkers() [1] 3 > options(cores=2) > getDoParWorkers() [1] 2 > options(cores=3) > getDoParWorkers() [1] 3 \end{verbatim} If you did specify the number of cores when registering \texttt{doMC}, the ``cores'' option is ignored: <>= registerDoMC(2) options(cores=4) getDoParWorkers() @ As you can see, there are a number of options for controlling the number of workers to use with \texttt{multicore}, but the default behaviour usually does what you want. \section{Conclusion} The \texttt{doMC} and \texttt{multicore} packages provide a nice, efficient parallel programming platform for multiprocessor/multicore computers running operating systems such as Linux and Mac OS X. It is very easy to install, and very easy to use. In short order, an average R programmer can start executing parallel programs, without any previous experience in parallel computing. \end{document} doMC/inst/unitTests/0000755000176200001440000000000013212617756014065 5ustar liggesusersdoMC/inst/unitTests/options.R0000644000176200001440000000056211472541377015707 0ustar liggesuserstest01 <- function() { x <- list(1:3, 1:9, 1:19) cs <- 1:20 for (chunkSize in cs) { mcopts <- list(preschedule=FALSE) for (y in x) { actual <- foreach(i=y, .options.multicore=mcopts) %dopar% i checkEquals(actual, as.list(y)) actual <- foreach(i=y, .combine='c', .options.multicore=mcopts) %do% i checkEquals(actual, y) } } } doMC/inst/unitTests/runTestSuite.sh0000644000176200001440000000152111472541377017077 0ustar liggesusers#!/bin/sh LOGFILE=test.log R --vanilla --slave > ${LOGFILE} 2>&1 <<'EOF' library(doMC) library(RUnit) verbose <- as.logical(Sys.getenv('FOREACH_VERBOSE', 'FALSE')) library(doMC) registerDoMC() options(warn=1) options(showWarnCalls=TRUE) cat('Starting test at', date(), '\n') cat(sprintf('doMC version: %s\n', getDoParVersion())) cat(sprintf('Running with %d worker(s)\n', getDoParWorkers())) tests <- c('options.R') errcase <- list() for (f in tests) { cat('\nRunning test file:', f, '\n') t <- runTestFile(f) e <- getErrors(t) if (e$nErr + e$nFail > 0) { errcase <- c(errcase, t) print(t) } } if (length(errcase) == 0) { cat('*** Ran all tests successfully ***\n') } else { cat('!!! Encountered', length(errcase), 'problems !!!\n') for (t in errcase) { print(t) } } cat('Finished test at', date(), '\n') EOF doMC/tests/0000755000176200001440000000000013212617756012250 5ustar liggesusersdoMC/tests/doRUnit.R0000644000176200001440000000535113212615310013743 0ustar liggesusers## unit tests will not be done if RUnit is not available if(require("RUnit", quietly=TRUE)) { ## --- Setup --- pkg <- "doMC" # <-- Change to package name! if(Sys.getenv("RCMDCHECK") == "FALSE") { ## Path to unit tests for standalone running under Makefile (not R CMD check) ## PKG/tests/../inst/unitTests path <- file.path(getwd(), "..", "inst", "unitTests") } else { ## Path to unit tests for R CMD check ## PKG.Rcheck/tests/../PKG/unitTests path <- system.file(package=pkg, "unitTests") } cat("\nRunning unit tests\n") print(list(pkg=pkg, getwd=getwd(), pathToUnitTests=path)) library(package=pkg, character.only=TRUE) ################################################################ ## BEGIN PACKAGE SPECIFIC CONFIGURATION # ################################################################ registerDoMC(cores=2) ################################################################ ## END PACKAGE SPECIFIC CONFIGURATION # ################################################################ ## If desired, load the name space to allow testing of private functions ## if (is.element(pkg, loadedNamespaces())) ## attach(loadNamespace(pkg), name=paste("namespace", pkg, sep=":"), pos=3) ## ## or simply call PKG:::myPrivateFunction() in tests ## --- Testing --- ## Define tests testSuite <- defineTestSuite(name=paste(pkg, "unit testing"), dirs=path, testFileRegexp = "^options\\.R$") ## Run tests <- runTestSuite(testSuite) ## Default report name pathReport <- file.path(tempdir(), "report") ## Report to stdout and text files cat("------------------- UNIT TEST SUMMARY ---------------------\n\n") printTextProtocol(tests, showDetails=FALSE) printTextProtocol(tests, showDetails=FALSE, fileName=paste(pathReport, "Summary.txt", sep="")) printTextProtocol(tests, showDetails=TRUE, fileName=paste(pathReport, ".txt", sep="")) ## Report to HTML file printHTMLProtocol(tests, fileName=paste(pathReport, ".html", sep="")) # printHTMLProtocol(tests, fileName=file.path(dirname(dirname(getwd())),pkg,"gsDesign-RUnit-Test-Summary.html")) #paste(pathReport, ".html", sep="")) ## Return stop() to cause R CMD check stop in case of ## - failures i.e. FALSE to unit tests or ## - errors i.e. R errors tmp <- getErrors(tests) if(tmp$nFail > 0 | tmp$nErr > 0) { stop(paste("\n\nunit testing failed (#test failures: ", tmp$nFail, ", #R errors: ", tmp$nErr, ")\n\n", sep="")) } } else { warning("cannot run unit tests -- package RUnit is not available") } doMC/NAMESPACE0000644000176200001440000000010112233530232012276 0ustar liggesusersexport(registerDoMC) import(foreach, iterators, parallel, utils) doMC/demo/0000755000176200001440000000000013212617756012032 5ustar liggesusersdoMC/demo/sincMC.R0000644000176200001440000000166411472541377013341 0ustar liggesuserslibrary(doMC) registerDoMC() # Define a function that creates an iterator that returns subvectors ivector <- function(x, chunks) { n <- length(x) i <- 1 nextEl <- function() { if (chunks <= 0 || n <= 0) stop('StopIteration') m <- ceiling(n / chunks) r <- seq(i, length=m) i <<- i + m n <<- n - m chunks <<- chunks - 1 x[r] } obj <- list(nextElem=nextEl) class(obj) <- c('abstractiter', 'iter') obj } # Define the coordinate grid and figure out how to split up the work x <- seq(-10, 10, by=0.1) nw <- getDoParWorkers() cat(sprintf('Running with %d worker(s)\n', nw)) # Compute the value of the sinc function at each point in the grid z <- foreach(y=ivector(x, nw), .combine=cbind) %dopar% { y <- rep(y, each=length(x)) r <- sqrt(x ^ 2 + y ^ 2) matrix(10 * sin(r) / r, length(x)) } # Plot the results as a perspective plot persp(x, x, z, ylab='y', theta=30, phi=30, expand=0.5, col="lightblue") doMC/demo/00Index0000644000176200001440000000006111472541377013162 0ustar liggesuserssincMC computation of the sinc function doMC/NEWS0000644000176200001440000000372713212615310011576 0ustar liggesusers NEWS/ChangeLog for doMC ------------------------- 1.3.5 2017-12-08 o Change test report path for compliance with CRAN policies. 1.3.3 2014-02-25 o Modified so that vignette uses no more than two workers. 1.3.2 2013-11-18 o Modified to check for errors early to avoid calling combine function when errors occur. 1.3.1 2013-10-28 o Added iterators, parallel, and utils to NAMESPACE imports. o Removed restriction to Unix, since parallel exists on Windows. (However, as with parallel's multicore functionality, only one core is supported on Windows.) 1.3.0 2013-02-19 o Changed dependency on multicore package to parallel. 1.2.5 2012-04-11 o Moved vignettes to new preferred location. 1.2.4 2012-02-24 o Modified default cores computation to use parallel package tools from R 2.14.0 and later if possible. o Modified doRUnit.R to use two cores when run during R CMD check. 1.2.3 2011-08-15 o Added support for package options via registerDoMC o Added package option "nocompile" to disable compiler support 1.2.2 2011-05-16 o Added support for the compiler package in R 2.13.0 o Enhanced unit tests to enable running them under R CMD check. 1.2.1 2010-01-25 o Changed license to GPL-2 o Error handling for the doMC backend should now be correct. If .errorhandling is set to anything other than 'stop', it should return an array containing the results of all iterations which did not cause errors. (From a bug report by Brian Peterson) 1.2.0 2009-10-05 o added support for all of the mclapply options via the foreach .options.multicore argument o added a "Getting Started" vignette. o added examples directory 1.1.1 2009-06-29 o added cores option to registerDoMC o fixed bug that caused getDoParWorkers to report incorrect value 1.1.0 2009-06-26 o initial public release doMC/R/0000755000176200001440000000000013212617756011307 5ustar liggesusersdoMC/R/doMC.R0000644000176200001440000001472412242556354012262 0ustar liggesusers# # Copyright (c) 2008-2010, Revolution Analytics # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License (version 2) as # published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # A copy of the GNU General Public License is available at # http://www.r-project.org/Licenses/ # .options <- new.env(parent=emptyenv()) # this explicitly registers a multicore parallel backend registerDoMC <- function(cores=NULL, ...) { opts <- list(...) optnames <- names(opts) if (is.null(optnames)) optnames <- rep('', length(opts)) # filter out unnamed arguments with a warning unnamed <- ! nzchar(optnames) if (any(unnamed)) { warning('ignoring doMC package option(s) specified with unnamed argument') opts <- opts[!unnamed] optnames <- optnames[!unnamed] } # filter out unrecognized options with a warning recog <- optnames %in% c('nocompile') if (any(!recog)) { warning(sprintf('ignoring unrecognized doMC package option(s): %s', paste(optnames[!recog], collapse=', ')), call.=FALSE) opts <- opts[recog] optnames <- optnames[recog] } # clear .options in case registerDoMC is called multiple times old.optnames <- ls(.options, all.names=TRUE) rm(list=old.optnames, pos=.options) # set new options for (i in seq(along=opts)) { assign(optnames[i], opts[[i]], pos=.options) } # register multicore backend setDoPar(doMC, cores, info) } # internal function that determines the number of workers to use workers <- function(cores) { if (identical(.Platform$OS.type, "windows")){ return(1) } if (!is.null(cores)) { # use the number specified when registering doMC cores } else { cores <- getOption('cores') if (!is.null(cores)) { # use the number specified via the 'cores' option cores } else { # use the number detected by parallel cores <- parallel::detectCores() if (cores > 2) { # try to use about half the cores cores <- ceiling(cores/2) } cores } } } # passed to setDoPar via registerDoMC, and called by getDoParWorkers, etc info <- function(data, item) { switch(item, workers=workers(data), name='doMC', version=packageDescription('doMC', fields='Version'), NULL) } comp <- function(expr, ...) { if (isTRUE(.options$nocompile)) expr else compiler::compile(expr, ...) } doMC <- function(obj, expr, envir, data) { # set the default mclapply options preschedule <- TRUE set.seed <- TRUE silent <- FALSE cores <- workers(data) if (!inherits(obj, 'foreach')) stop('obj must be a foreach object') it <- iter(obj) argsList <- as.list(it) accumulator <- makeAccum(it) # make sure all of the necessary libraries have been loaded for (p in obj$packages) library(p, character.only=TRUE) # check for multicore-specific options options <- obj$options$multicore if (!is.null(options)) { nms <- names(options) recog <- nms %in% c('preschedule', 'set.seed', 'silent', 'cores') if (any(!recog)) warning(sprintf('ignoring unrecognized multicore option(s): %s', paste(nms[!recog], collapse=', ')), call.=FALSE) if (!is.null(options$preschedule)) { if (!is.logical(options$preschedule) || length(options$preschedule) != 1) { warning('preschedule must be logical value', call.=FALSE) } else { if (obj$verbose) cat(sprintf('setting mc.preschedule option to %d\n', options$preschedule)) preschedule <- options$preschedule } } if (!is.null(options$set.seed)) { if (!is.logical(options$set.seed) || length(options$set.seed) != 1) { warning('set.seed must be logical value', call.=FALSE) } else { if (obj$verbose) cat(sprintf('setting mc.set.seed option to %d\n', options$set.seed)) set.seed <- options$set.seed } } if (!is.null(options$silent)) { if (!is.logical(options$silent) || length(options$silent) != 1) { warning('silent must be logical value', call.=FALSE) } else { if (obj$verbose) cat(sprintf('setting mc.silent option to %d\n', options$silent)) silent <- options$silent } } if (!is.null(options$cores)) { if (!is.numeric(options$cores) || length(options$cores) != 1 || options$cores < 1) { warning('cores must be numeric value >= 1', call.=FALSE) } else { if (obj$verbose) cat(sprintf('setting mc.cores option to %d\n', options$cores)) cores <- options$cores } } } # define the "worker" function, compiling expr if possible c.expr <- comp(expr, env=envir, options=list(suppressUndefined=TRUE)) FUN <- function(args) tryCatch(eval(c.expr, envir=args, enclos=envir), error=function(e) e) # execute the tasks results <- mclapply(argsList, FUN, mc.preschedule=preschedule, mc.set.seed=set.seed, mc.silent=silent, mc.cores=cores) # check for errors before calling combine function if error handling # is 'stop' so we can exit early if (identical(obj$errorHandling, 'stop')) { errorIndex <- 1 for (r in results) { if (inherits(r, 'error')) { msg <- sprintf('task %d failed - "%s"', errorIndex, conditionMessage(r)) stop(simpleError(msg, call=expr)) } errorIndex <- errorIndex + 1 } } # call the accumulator with all of the results tryCatch(accumulator(results, seq(along=results)), error=function(e) { cat('error calling combine function:\n') print(e) NULL }) # check for errors errorValue <- getErrorValue(it) errorIndex <- getErrorIndex(it) # throw an error or return the combined results if (identical(obj$errorHandling, 'stop') && !is.null(errorValue)) { msg <- sprintf('task %d failed - "%s"', errorIndex, conditionMessage(errorValue)) stop(simpleError(msg, call=expr)) } else { getResult(it) } } doMC/vignettes/0000755000176200001440000000000013212620516013102 5ustar liggesusersdoMC/vignettes/gettingstartedMC.Rnw0000644000176200001440000002575012303167452017060 0ustar liggesusers% \VignetteIndexEntry{Getting Started with doMC and foreach} % \VignetteDepends{doMC} % \VignetteDepends{foreach} % \VignettePackage{doMC} \documentclass[12pt]{article} \usepackage{amsmath} \usepackage[pdftex]{graphicx} \usepackage{color} \usepackage{xspace} \usepackage{url} \usepackage{fancyvrb} \usepackage{fancyhdr} \usepackage[ colorlinks=true, linkcolor=blue, citecolor=blue, urlcolor=blue] {hyperref} \usepackage{lscape} \usepackage{Sweave} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % define new colors for use \definecolor{darkgreen}{rgb}{0,0.6,0} \definecolor{darkred}{rgb}{0.6,0.0,0} \definecolor{lightbrown}{rgb}{1,0.9,0.8} \definecolor{brown}{rgb}{0.6,0.3,0.3} \definecolor{darkblue}{rgb}{0,0,0.8} \definecolor{darkmagenta}{rgb}{0.5,0,0.5} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcommand{\bld}[1]{\mbox{\boldmath $#1$}} \newcommand{\shell}[1]{\mbox{$#1$}} \renewcommand{\vec}[1]{\mbox{\bf {#1}}} \newcommand{\ReallySmallSpacing}{\renewcommand{\baselinestretch}{.6}\Large\normalsize} \newcommand{\SmallSpacing}{\renewcommand{\baselinestretch}{1.1}\Large\normalsize} \newcommand{\halfs}{\frac{1}{2}} \setlength{\oddsidemargin}{-.25 truein} \setlength{\evensidemargin}{0truein} \setlength{\topmargin}{-0.2truein} \setlength{\textwidth}{7 truein} \setlength{\textheight}{8.5 truein} \setlength{\parindent}{0.20truein} \setlength{\parskip}{0.10truein} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \pagestyle{fancy} \lhead{} \chead{Getting Started with doMC and foreach} \rhead{} \lfoot{} \cfoot{} \rfoot{\thepage} \renewcommand{\headrulewidth}{1pt} \renewcommand{\footrulewidth}{1pt} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \title{Getting Started with doMC and foreach} \author{Steve Weston \\ doc@revolutionanalytics.com} \begin{document} \maketitle \thispagestyle{empty} \section{Introduction} The \texttt{doMC} package is a ``parallel backend'' for the \texttt{foreach} package. It provides a mechanism needed to execute \texttt{foreach} loops in parallel. The \texttt{foreach} package must be used in conjunction with a package such as \texttt{doMC} in order to execute code in parallel. The user must register a parallel backend to use, otherwise \texttt{foreach} will execute tasks sequentially, even when the \%dopar\% operator is used.\footnote{\texttt{foreach} will issue a warning that it is running sequentially if no parallel backend has been registered. It will only issue this warning once, however.} The \texttt{doMC} package acts as an interface between \texttt{foreach} and the \texttt{multicore} functionality of the \texttt{parallel} package, originally written by Simon Urbanek and incorporated into \texttt{parallel} for R 2.14.0. The \texttt{multicore} functionality currently only works with operating systems that support the \texttt{fork} system call (which means that Windows isn't supported). Also, \texttt{multicore} only runs tasks on a single computer, not a cluster of computers. That means that it is pointless to use \texttt{doMC} and \texttt{multicore} on a machine with only one processor with a single core. To get a speed improvement, it must run on a machine with multiple processors, multiple cores, or both. \section{A word of caution} Because the \texttt{multicore} functionality starts its workers using \texttt{fork} without doing a subsequent \texttt{exec}, it has some limitations. Some operations cannot be performed properly by forked processes. For example, connection objects very likely won't work. In some cases, this could cause an object to become corrupted, and the R session to crash. In addition, it usually isn't safe to run \texttt{doMC} and \texttt{multicore} from a GUI environment. \section{Registering the \texttt{doMC} parallel backend} To register \texttt{doMC} to be used with \texttt{foreach}, you must call the \texttt{registerDoMC} function. This function takes only one argument, named ``cores''. This specifies the number of worker processes that it will use to execute tasks, which will normally be equal to the total number of cores on the machine. You don't need to specify a value for it, however. By default, the \texttt{multicore} package will use the value of the ``cores'' option, as specified with the standard ``options'' function. If that isn't set, then \texttt{multicore} will try to detect the number of cores, and use approximately half that many workers. Remember: unless \texttt{registerDoMC} is called, \texttt{foreach} will {\em not} run in parallel. Simply loading the \texttt{doMC} package is not enough. \section{An example \texttt{doMC} session} Before we go any further, let's load \texttt{doMC}, register it, and use it with \texttt{foreach}: <>= library(doMC) registerDoMC(2) foreach(i=1:3) %dopar% sqrt(i) @ \begin{quote} Note well that this is {\em not} a practical use of \texttt{doMC}. This is my ``Hello, world'' program for parallel computing. It tests that everything is installed and set up properly, but don't expect it to run faster than a sequential \texttt{for} loop, because it won't! \texttt{sqrt} executes far too quickly to be worth executing in parallel, even with a large number of iterations. With small tasks, the overhead of scheduling the task and returning the result can be greater than the time to execute the task itself, resulting in poor performance. In addition, this example doesn't make use of the vector capabilities of \texttt{sqrt}, which it must to get decent performance. This is just a test and a pedagogical example, {\em not} a benchmark. \end{quote} But returning to the point of this example, you can see that it is very simple to load \texttt{doMC} with all of its dependencies (\texttt{foreach}, \texttt{iterators}, \texttt{multicore}, etc), and to register it. For the rest of the R session, whenever you execute \texttt{foreach} with \texttt{\%dopar\%}, the tasks will be executed using \texttt{doMC} and \texttt{multicore}. Note that you can register a different parallel backend later, or deregister \texttt{doMC} by registering the sequential backend by calling the \texttt{registerDoSEQ} function. \section{A more serious example} Now that we've gotten our feet wet, let's do something a bit less trivial. One good example is bootstrapping. Let's see how long it takes to run 10,000 bootstrap iterations in parallel on \Sexpr{getDoParWorkers()} cores: <>= x <- iris[which(iris[,5] != "setosa"), c(1,5)] trials <- 10000 ptime <- system.time({ r <- foreach(icount(trials), .combine=cbind) %dopar% { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) } })[3] ptime @ Using \texttt{doMC} and \texttt{multicore} we were able to perform 10,000 bootstrap iterations in \Sexpr{ptime} seconds on \Sexpr{getDoParWorkers()} cores. By changing the \texttt{\%dopar\%} to \texttt{\%do\%}, we can run the same code sequentially to determine the performance improvement: <>= stime <- system.time({ r <- foreach(icount(trials), .combine=cbind) %do% { ind <- sample(100, 100, replace=TRUE) result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) coefficients(result1) } })[3] stime @ The sequential version ran in \Sexpr{stime} seconds, which means the speed up is about \Sexpr{round(stime / ptime, digits=1)} on \Sexpr{getDoParWorkers()} workers.\footnote{If you build this vignette yourself, you can see how well this problem runs on your hardware. None of the times are hardcoded in this document. You can also run the same example which is in the examples directory of the \texttt{doMC} distribution.} Ideally, the speed up would be \Sexpr{getDoParWorkers()}, but no multicore CPUs are ideal, and neither are the operating systems and software that run on them. At any rate, this is a more realistic example that is worth executing in parallel. I'm not going to explain what it's doing or how it works here. I just want to give you something more substantial than the \texttt{sqrt} example in case you want to run some benchmarks yourself. You can also run this example on a cluster by simply registering a different parallel backend that supports clusters in order to take advantage of more processors. \section{Getting information about the parallel backend} To find out how many workers \texttt{foreach} is going to use, you can use the \texttt{getDoParWorkers} function: <>= getDoParWorkers() @ This is a useful sanity check that you're actually running in parallel. If you haven't registered a parallel backend, or if your machine only has one core, \texttt{getDoParWorkers} will return one. In either case, don't expect a speed improvement. \texttt{foreach} is clever, but it isn't magic. The \texttt{getDoParWorkers} function is also useful when you want the number of tasks to be equal to the number of workers. You may want to pass this value to an iterator constructor, for example. You can also get the name and version of the currently registered backend: <>= getDoParName() getDoParVersion() @ This is mostly useful for documentation purposes, or for checking that you have the most recent version of \texttt{doMC}. \section{Specifying multicore options} The \texttt{doMC} package allows you to specify various options when running \texttt{foreach} that are supported by the underlying \texttt{mclapply} function: ``preschedule'', ``set.seed'', ``silent'', and ``cores''. You can learn about these options from the \texttt{mclapply} man page. They are set using the \texttt{foreach} \texttt{.options.multicore} argument. Here's an example of how to do that: <>= mcoptions <- list(preschedule=FALSE, set.seed=FALSE) foreach(i=1:3, .options.multicore=mcoptions) %dopar% sqrt(i) @ The ``cores'' options allows you to temporarily override the number of workers to use for a single \texttt{foreach} operation. This is more convenient than having to re-register \texttt{doMC}. Although if no value of ``cores'' was specified when \texttt{doMC} was registered, you can also change this value dynamically using the \texttt{options} function: \begin{verbatim} > registerDoMC() > getDoParWorkers() [1] 3 > options(cores=2) > getDoParWorkers() [1] 2 > options(cores=3) > getDoParWorkers() [1] 3 \end{verbatim} If you did specify the number of cores when registering \texttt{doMC}, the ``cores'' option is ignored: <>= registerDoMC(2) options(cores=4) getDoParWorkers() @ As you can see, there are a number of options for controlling the number of workers to use with \texttt{multicore}, but the default behaviour usually does what you want. \section{Conclusion} The \texttt{doMC} and \texttt{multicore} packages provide a nice, efficient parallel programming platform for multiprocessor/multicore computers running operating systems such as Linux and Mac OS X. It is very easy to install, and very easy to use. In short order, an average R programmer can start executing parallel programs, without any previous experience in parallel computing. \end{document} doMC/MD50000644000176200001440000000162213213656003011404 0ustar liggesusers56a9d03558809f05fc05897f21d0480e *DESCRIPTION 7fe3d7214125288822cd4472ecc6c4a4 *NAMESPACE 72e69cd7aaf23d401d2ad269d2f21e1f *NEWS 32dfc0390122f8f3211a9ad035402c3b *R/doMC.R 08fbc17b6ef734f9ea50a0f697b2f9c2 *build/vignette.rds c09a9ac7a720c8ceb98ae815a5542092 *demo/00Index b6ddb31150961d04b467a413affde041 *demo/sincMC.R 64cace2ee0f1986d1baf44199b483faa *inst/doc/gettingstartedMC.R 0b3be19ecbd467c465d6264bf6768e7e *inst/doc/gettingstartedMC.Rnw a384981e91583ddb6a3b74251c9ee148 *inst/doc/gettingstartedMC.pdf 794817093fdd85b71f892689a8ffe99d *inst/examples/bootMC.R ccb40b21ecc17bd71f764d7d67da9a7d *inst/unitTests/options.R 59f11a4ad61aea4c525507b6ac0ae4b2 *inst/unitTests/runTestSuite.sh 4065e26e2a11bd6bc313caaeefdc585a *man/doMC-package.Rd 9e2f90b44819dbc6b3ea34f5337d66d0 *man/registerDoMC.Rd 4ea3d878f4f2fc4b3a78a48af9a2ba0c *tests/doRUnit.R 0b3be19ecbd467c465d6264bf6768e7e *vignettes/gettingstartedMC.Rnw doMC/build/0000755000176200001440000000000013212620516012171 5ustar liggesusersdoMC/build/vignette.rds0000644000176200001440000000034613212620516014533 0ustar liggesusersQ0,QHLx' x0$F=xmhy$XHiB"blffg6!a #C=l,@d\BdRqQf1ԃH[*4YaSqpcթA2z3Aр\fo<5bom%cQQA\SGdȿ#vXvu G_4)i/2Jw_-doMC/DESCRIPTION0000644000176200001440000000164413213656003012606 0ustar liggesusersPackage: doMC Type: Package Title: Foreach Parallel Adaptor for 'parallel' Version: 1.3.5 Authors@R: c(person("Rich", "Calaway", role="cre", email="richcala@microsoft.com"), person("Revolution", "Analytics", role=c("aut", "cph")), person("Steve", "Weston", role="aut")) Description: Provides a parallel backend for the %dopar% function using the multicore functionality of the parallel package. Depends: R (>= 2.14.0), foreach(>= 1.2.0), iterators(>= 1.0.0), parallel Imports: utils Enhances: compiler, RUnit License: GPL-2 Author: Rich Calaway [cre], Revolution Analytics [aut, cph], Steve Weston [aut] Maintainer: Rich Calaway Repository: CRAN Repository/R-Forge/Project: domc Repository/R-Forge/Revision: 18 Repository/R-Forge/DateTimeStamp: 2017-12-08 23:05:44 Date/Publication: 2017-12-12 04:33:07 UTC NeedsCompilation: no Packaged: 2017-12-08 23:33:34 UTC; rforge doMC/man/0000755000176200001440000000000013212617756011661 5ustar liggesusersdoMC/man/doMC-package.Rd0000644000176200001440000000247712110733555014365 0ustar liggesusers\name{doMC-package} \alias{doMC-package} \alias{doMC} \docType{package} \title{ The doMC Package } \description{ The doMC package provides a parallel backend for the foreach/\%dopar\% function using the multicore functionality of the parallel package. } \details{ Further information is available in the following help topics: \tabular{ll}{ \code{registerDoMC} \tab register doMC to be used by foreach/\%dopar\%\cr } To see a tutorial introduction to the doMC package, use \code{vignette("gettingstartedMC")}. To see a tutorial introduction to the foreach package, use \code{vignette("foreach")}. To see a demo of doMC computing the sinc function, use \code{demo(sincMC)}. Some examples (in addition to those in the help pages) are included in the ``examples'' directory of the doMC package. To list the files in the examples directory, use \code{list.files(system.file("examples", package="doMC"))}. To run the bootstrap example, use \code{source(system.file("examples", "bootMC.R", package="doMC"))}. This is a simple benchmark, executing both sequentally and in parallel. There are many more examples that come with the foreach package, which will work with the doMC package if it is registered as the parallel backend. For a complete list of functions with individual help pages, use \code{library(help="doMC")}. } \keyword{package} doMC/man/registerDoMC.Rd0000644000176200001440000000224012110733555014465 0ustar liggesusers\name{registerDoMC} \alias{registerDoMC} \title{registerDoMC} \description{ The \code{registerDoMC} function is used to register the multicore parallel backend with the \code{foreach} package. } \usage{ registerDoMC(cores=NULL, \dots) } \arguments{ \item{cores}{The number of cores to use for parallel execution. If not specified, the number of cores is set to the value of \code{options("cores")}, if specified, or to approximately half the number of cores detected by the \code{parallel} package.} \item{\dots}{Package options. Currently, only the \code{nocompile} option is supported. If \code{nocompile} is set to \code{TRUE}, compiler support is disabled.} } \details{ The \code{multicore} functionality, originally written by Simon Urbanek and subsumed in the \code{parallel} package in R 2.14.0, provides functions for parallel execution of R code on machines with multiple cores or processors, using the system \code{fork} call to spawn copies of the current process. The \code{multicore} functionality, and therefore \code{registerDoMC}, should not be used in a GUI environment, because multiple processes then share the same GUI. } \keyword{utilities}