ࡱ> n>BjMFs(5mL aPNG  IHDRM\V PLTE??ktRNS AbKGDH cmPPJCmp0712OmIDATHm;n0 *@Gjʁ#V,vx aWB $2< ?J@ƴ7;\1W(d}2F[X>Ō mVa-Jh>`d[V -20X!)SNc |Rp;<\D_4e ("4-87XS 3Zm>C?%b<^Jg(=9 lY? Y3]>b}Oّޟhuoc̜#goɢ]:d[˂?m[ne;zt˱a+yEdK!;n6hbI}j gOp-3 .v"tj@5`7.2f;@BqN L*c 9N87xBOH9)5Ae)A&%Qo" 鉇TxVq "tK4=0C`~8Jqrlu?WD__i&!) IG==Wn0R`j겮} ]!;M4Scc:U 04fBaT n~ٓ4>I =S/iw V}Ԯ ١);z^I1? IENDB`n;ӟEB_Е7NPNG  IHDRa<gAMA|Q pHYsnu>;IDATxo,Yo8,A$ EKSȢx$z3RR`[Xʢ#Z0boݬ,ʃňl@bTxr>WDF *ٙ{ιW ~J+~ ~5@)^0W$^"/_~M~Y K%Q釾p$DgPux/"@+nj)hŵ@կ#E\iz؏V,*!-Xٕ֒8da;Cu6ak_ X5Yʨm_Z6M+tͺѲz*tV#XZ55h}LԷF@qWn H-RV42T`ϴtM&:>5pK=6gK< ׳kq#A`dFE 8C@@<X$gJP3l\(&i=PX#8+ާuU_ MK8 lRnR6`- a!w ` JjIJ l:} 7!`K-[{#ۼK>h! \ш@&G \^NQ(/@I.:@.!lMcWa4X[`F@ !P60aH Z^EAb`L=V?F{?FVЛ0W` LL ! 5+%U@@Lh&| @QagЈ7Ի*Vb \R&e`8U! ,*ܒN h@I=_{9( P>A@1@x G:pbXd42-9d$7ȖXYA##c 'FDRrmjD mPEn| , `Ll%z80,Q݋~*tTU#̘^$ko h'a u 12 6E% ښ7ԱU f*á EC(z]k<Nf-}=_ iN@>D4w>ԑ^81æT籟! i:ĽM뀨37 U| {W`#_^Rbo!/{ *PJFP(-ZY_ v[<^-)$@,MH5nYta ^u,M%<~ /bCLwÝ:Z`8OP>FUҢ UfXC@6;to%Ef:aa6Ԝ><4d @O2%bTJ d!j310 эn64`dSFU&6@s-ra6u)vҶ0qU@( p}}pHTDXD ymV *JFh`WKg^`B3MPf}a`"}ak2]^nayҗw ̈y[+% lLrBjIK ,,>;P33P5"֊؉'%TUK&{)mHE}_ R 0UHX6^,XO]f/* X 6FH}k.1[3آpaۛ܄smPM9 gF'! ~f5|aa0 b[Ko PȝVd_/U2a7~1b433Hw/Ph9>@mf34'pb8(ҺܗA6q%+J\XqH~f. P"7@W7f5E9g@V\Sg{2Sw%;* T@L07+0"i9&&B@4Y ^b!Z B dxOl]kqBܫb`-&=qM_̎/yIG<%liw AFTF2'V[X!Tڡ1z14 7Zܺ+qBn*0Am_uM|@ T3T<.BYw9 4*T&–%iİu`u@gU&5}3Y x^`YZ M@s1P C+ZNB``z`R 7,%;c8εȂ>;0KK =`eg=܍0fQoJwAQR#0_vL؇-5`xB"Yɳ@>tMC`b ƞH !P@DƞrTyz5A2FP׆!`plns_%љ,eQslk cPR( ,ѐĚw^0PS$in@_cdd{pJ3*7[= _h39l$`M@?*Q^T\ T*fe s̬+6u n-%`@*^[ W4nm뀒B\6$U 8iHq SXtQ4l?f 8̻Fw35?@ `Ff1hogI e+X03-lh޶,s8Hʷ f Lذ*@;ݨq@TuF4ay?7q[Bq-c >mxmil{ul[; ΘQ,?mZCm0[+d* Tr)`.O;eCn2C`op@2S(X xᅍj 耸 Y s.PF5%{hn[M.u#9\07T;:#Oc3N]1덕Ox.)'&u(.cc̑Ƚ9%yoL5mI`iZh520`J>XfءY);E#&ksha,1_B@ͣ#`ʝgm tl6juk*sMRFR7ʸM;+U.l7ˈN- v]-ěvaKWX!7A†h#[HUdUxc~G/: ":/u쓮l~ZXʐ#}\1lV4Yiud| ;ߚIS E9jb1 ~.N]﵉bD<iQg_n@8AtHX/M@*Ϣ@ J3 l\V&+ӛZIU {I; ,r'^ϑ@1;m2{ZohSvst휽J'rbF * 4R҇؛ Cn縳2b3@^vd}Yv >Vä/BJBkXEn=,9')X" [s,#iぼ4x6U\6E$Q&)jרhgZ~8l]1;Ic@UT6pFKm(K6 ,¥0n,|sܛ2Lؤ ܭe%:{psd5&E߯ m6Vb'N~E3 5 6 @7fAl!9`͉gMT-JJQdn=|akU Ż+3mE{WUvS}g"m+wޕŎ@JkdA|/\& l T9Z`h0Y&y9μ&J3,(q;Kνhvb}nQ$)ĉ$p*ƭVŜa^ۘ+<4-gH%(ܽLOqtXf*Qۨ)UgA$<oXhN0LX!`÷IJ⌷Іc@> AT5D1\l :9Lm`d(;УK@Ù&H2PHz) \ jKm&_s(b#c„ _&Usٹ FBGv@FN_o;4N؀ >041}sG)6k\gv: z#޳[ơ@۹ine t 3% F|Z91{4å] t3[?rFD蒚oJ p7 @@w5V܅ݗfSrE3>5gD\ /V->WEDX}#LxI;yw%Obj&S01C@1W伊}g >nYSY|ab:y ElκXJK-pr=mD+0٩TeDkkUhY_g9'xB;$(B YԭC,,&Ԧ<"!ht&Kfv0GRl 2wyTM|<xd_ cr\E[pzKJf%|M0ӨPK@;1GL I Mp%;XRd c ̯bF@ v?#,dK:D;h(`R [BϛDl[_fGߛ9 ~`/%XiLfL/sBK Q0EcĤXNw_- sQSq*+EKFl!iVaG3HoR{I [s8K8fu7O9PhʌfSz}px"j& I_Є;'5C*%meb @UnSֻ2nsӫr,K(')bi\u艞*Q>dX`J kW[sJپ:D|{@}nNF9oT<ac/\SF֝B*?/a o>:E`+"7 l,oQ=3m2"AoH= X51 I ^tc'䠷>h.u]lc:KpZJ}- _D&cHZ`JJ$ltٸC =wN)*ku3i*g,6#T{( ޝTc$R`#a{@e/CUFս0 u[X^ZV%KĻu't;*L+gik>2@$3y8'e.oEBDf;ʶeQ!% *ӫpNHDt2'b7H kr 7e ʻ@ .60/5[Ggmdڝ6l+ TTcSByF%'F59#-PSD74nGr&MA,@4d]7_&Ҩڏfr/na@D/T%qRTat~ջ:<”i3w:L'z$&s$c PST2mr,[hGqc@ g?KRߝ#0c)Z]! Я'mX̪tq7T&zsL- xwЮpVb0wNIb4RHq-GJ5|dOvN'SE?W0)f=EE)1\NrnPٷME{T$9TwYI<#k7NsZ!iiUOP$U1pRۮ9'@)Mj4PpL3F~>]WBA#gu{z[Q_7wfJ :qlk|zy@׍b05O`*kkG0ک }:h/MjJR8][E ؋+sZv@^p^o2U@)]Ч~`rMvgC7@Jiͯ#j,-1b܃YΝ<+ZqJH1iQop@DMl&RER%qш+׆ :*~@1`֓۱ SN r@RAYT' _^Q$@UY ޟtKH LLӫEsݺzGK.7ڥpbB/x{ pr罭4gbAw`<nĴ"tͷ۽ib#] z'nF6"Js&LH:&1mo p; 2')LQ؈~1pT%% <6}&3p&\P$ph`5v-49 M#0iwY$F*xZ#SsvFݎB磪'N&{GigJ Ot).HΜncw }0Yn~ Y*T A;kUU۩6 Yt իäq,_2rA1wʂ0=ۜBCQfC&gO+yb`'r <M#iߓd$l21CNXp*/UAY,}8` 1զNrݸ9}nP .._c%Ec%NQG\@ĕ'q{ lW\`M w,GXӕ0%NnI)ǦH x &3h4x:80@MMֱBٱWXu\zv1 s61 +LAps{,Pup® +ռ Ӧ8g(b!͕8_թst1Y⩾",Wl!P@U_FIw1ޞBs`a"/gœB9Gn*wOsЎ{Y+{.=$5>Ԩ2@A{.1mbEvA<1mN PM$+CeRpJl^.3S,jܽ1sĩ&Rs~4db4@ SmΟ7IvtsjK@211}8`8g+gHsӍ  h\?a>"/M4=y'xO<`"g{cOAX /jf;YF )Ϸ7᚟=$Pz3JY{w obxI< 5؂M dou,5x4ړKhy3}QNz 41ITRqLUyJ>|Tx^YsZoY8T;)FyB-i1|y4ф-Yv> )bG*MTPNp6au" ;:b>ܲMLN2)S8Ύ3[޹Ytq4K,&%4 hңZFdOK 7*Vt$ Ed踨7Hw.@: ;)zK̕&a?[sʣ(_ M殺qT7(eM{=[@?VH[:<=uJf+!%[gaF pTy2IiZ"S+TxԺ0@ EP*ݕX\"ģYpgLʍrKO ]#5=1 x2w  GܿQ.våqT~Y`8Rx`i{yOy1[S=1'5NG-+{ܲ+L ,X {,1#l30'FB8h؀G>9X!Y}`τ{_e􏌕i3.iyz( 1hCr`ޟNLMH6rd|%U8`az@-#kR,AAτ08@OJ8_YElN%f'|* >t]O n*lғ^)5Y0N"td Փ?s*&K3_U@.?\Oױ`aRMh/8,;/5=9-7 px~J>SQR1m=^M,ÊϾ˵`ap +ϟ.&"p,5} 5 Tݓi]ʡr=ci-KM#k©&IRM.Qj~LOk UƬ} /ɀ,5*'t'2h٧˺fX1вGLOS;U|9_'L!K@iEGX|ͳcN^oZ.hLdl0¼^ lbvgARn`$ U켖TUst}Nm~6b_%ۡ [Wo ~9rGoi0[:-&#~t#lF=iS'k^ BQ=׵z+U@nO@gV\nCaԴ?Kl7,Iu0@:B0xC@_ T?oԧ,p` n+>s(>zGD :dzFSj/dh=kJGw[Vkۈ.Hf=pEA4U?|zd\D=xHwT0:IK,G7.Z Ajԛ\UɚaXWm9<:@6wquU~#TӵmHVF,:jtk%T}=P(:64Q@{p߈'7*`aPMRq\%+uJI/2J W;YWi+p_g*ү x$:CGa ۞ovvJ`1\-4k〺Z-4U#~>uNn:.ÂX%kryx<Z%kp5RP [K ӊ5^;Z%ۥ"bݰ{+b^֢|?P]<y %/$4>{~-##=j :Ǚ1|$P<>iIZIENDB`n \8+΁1Z6$PNG  IHDRl1gPLTE::WWuu3J` w(/7>FMUl"Dfƪ3"J1`@wO^n}Ҍ"Df׈33GG\\pp)Rz"31J@`Ow^n}"Df3M"f+3<DMUh|:Wu3Pm33MMff3Mf"+3<DMUh:|Wu3"J1`@wO^n}Ҍ"Df̈ת33MMff:Wu3(P7mETbq3Mf3Uw--DD[[qq3&M3f@MYfs:WuȒׯ33MMff:Wu3M&f3@MYfs:WultRNSރYbKGDH cmPPJCmp0712Hs5IDATx^ۚ*oF$h4 w^ j෠G%'v-%>v-%>v-%Xv[G --be~Kb/-fQlaw኿q2QLdx2k^YJpݵ64<0`/qu̎E;N2=:4m9qG-t|{~眤[$æk-6vt(֨(]݋_k-džQ |Yl婡O@3KSK% v\̝=CCx 6uUa[g|ڐMbZ+ 7ϘIh$b?n$.Kfac'$-hj&f1,KuxGSps O/yŶp̷DWG2Hbj`n[ׄwTvi/jlѹLT:7yJ-~ppP=m-B:]fpMR(@3lHQn8pblqJe<LJ|&N&!tFwdBB^&Mՙyl"$[,~e++U8. 6^`K ,Qa@"Q>&Ӆ|4B 8pJrY +hHN;e3--gmp'p&N#%#N!pղSe(!r21ffy\ ^(v@$ 𷻨Ɵ}[N0\׃x?78~J>AUWiڢ`t@V}؝&B2WI.yd8S`}` 9%uf3m2ʭ/dޝ>}Rw,pfc뀙8IӐ.ڱ3$[9I0"gq< T5M09#l%*4BzE u(L%8|HዦL2*aĮܰTnF'j2tsttɫ4ȅB}[[R9hS}8L6ұfOq]L _rG֪ l:\HulKj`IlKj`IlKj`IlKj`IlKj`I-PIENDB`n é՟oUdPNG  IHDRlKPLTE::WWuu3J` w(/7>FMUl"Dfƪ3"J1`@wO^n}Ҍ"Df׈33GG\\pp)Rz"31J@`Ow^n}"Df3M"f+3<DMUh|:Wu3Pm33MMff3Mf"+3<DMUh:|Wu3"J1`@wO^n}Ҍ"Df̈ת33MMff:Wu3(P7mETbq3Mf3Uw--DD[[qq3&M3f@MYfs:WuȒׯ33MMff:Wu3M&f3@MYfs:Wux^tRNSރYbKGDH cmPPJCmp0712HsQIDATx^v @N/h4鐇3EDb{ Q45ZoFho|ho|ho|Xyr+A6ȣ[K8>8qݧsZPi 7@0DONSoxRΙ)6`_O"'H+?"=iξ q{ iD^'.Br” ?E0OA~=H}G`]S[˴teTE,ly]xnf)H&i\ $V1Ҹ05}&}^sQ4@DO},Q[n]|Kxg^y fm$`ҡԦ3hioŮqɴY&‡~sui[bzߵD[0]*Hk .P& VVDB+DX˵踸6ZRZج 6EάHIY}ZҦJ1si,4 #D c04kW}#xGQgA$vxhUʓY:JwFo_;W7n{28u!$^h ,VMcdJ뛔?=&Z ^KF` 76x {hՍUiA i3xVjuB?&Z>QsABD"2V0J+GܖJZ{+YZqzj6HM{X y .  з7bC@I+9G,, O0Z-#HJWg"[1Wܹ-'ĿB}#G.~뼤Vp ; VŒ_α/5NH<O3U9TΠps, d:WųHDR1.}s?5n{ X bi)伡 t7_7Uha tޭF2//{V}JwND^+uVCH|6xMݯ]#$/MMFw[W^yłkQ1fl\!}AҊõ"N z+r]۴E9hwFBɢj@S7)uBwS DqI ՜MR=+fO#Na-*+Ws?9Ne"Ί%<>?~yZNx+-~ bbHW|[$^eĴE5߶%8CE쪝ŐjU'*Ha{ʩiգQъ VZ Tq_"A:S_V0V/6Zc[hhFk~k{homoc1m{l45fZ{f췶Zkь֘auF͐IENDB`n 5_^OlPNG  IHDRs'&PLTE::WWuu3J` w(/7>FMUl"Dfƪ3"J1`@wO^n}Ҍ"Df׈33GG\\pp)Rz"31J@`Ow^n}"Df3M"f+3<DMUh|:Wu3Pm33MMff3Mf"+3<DMUh:|Wu3"J1`@wO^n}Ҍ"Df̈ת33MMff:Wu3(P7mETbq3Mf3Uw--DD[[qq3&M3f@MYfs:WuȒׯ33MMff:Wu3M&f3@MYfs:Wu`tRNSS%bKGDH cmPPJCmp0712Hs ,IDATx^v* e_w-!pʫMccKĤ_._0^8.`z0=ԓE.q_WYz('VgkЪC CC:2Y j|%tFz)~xs:Eq{38B n\!j\}=[=T7ų⸸qia1ܨA.2kln"/dDR0軉]b$bC0@pa'9,vc蹈<8|7} 89Z c8 b8l7A|7@o%p8jAZ Q=7_3CWLv~8vtn+ t?֛UR4 > >BaCk8倃0!]]'Q' ]Ù9q2+Ë΃,3I|9ԝd UX6o6w)[8:@LBg '1[ BI(q $2IpHz/\Hp7)cClIshu/ 93IrKB̡o,0q9 G#9þ$!@ 9NbQ'q0\&iOp@Y`cwgˡ* >t5Th53!L A1\ 2TYb6xx@O|$UBV@cq!pD)l.o_p bGzƈCT>0ø(Vr)>f2txf(vGr9B;k%yRI^*Tp;T: XrtbWjSS<&ACa\GgVуqCPHeTPG ?` q`̛Pwa6T.ם78yڃo<-C]> 5' ]Ն~v#-X-DZ}rh~Z]g+ i@h s(~e 9-arDl8L-WpHFC5i]i3?"" \ȑ1ĉٴɉ'1A`HFe#҃H1] cȸw?Ű `MT&ӃvffffS3#Q}p!=|zia?ܵjm׃q ݆34]1vCHT%6r "R[A1.{bӖ Y {:y1 vHvC"vGБ*$a1yϓ¾s|8R⎧<]Ҝs7rU,E)֒>C g6]M (1Z~=hpA&-f\R&GIENDB`n^e4)>AH2UPNG  IHDR-PLTE`@wO^n}Ҍ"Df׈33GG\\pp)Rz"31J@`Ow^n}"Df3M"f+3<DMUh|:Wu3Pm33MMff3Mf"+3<DMUh:|Wu3"J1`@wO^n}Ҍ"Df̈ת33MMff:Wu3(P7mETbq3Mf3Uw--DD[[qq3&M3f@MYfs:WuȒׯ33MMff:Wu3M&f3@MYfs:Wu掉ItRNS AbKGDH cmPPJCmp0712HsfIDATx^뒤* u?!7E&]QC>]˪ʯ)Ώ-8n3I֋/tD+Xb-NWCU/h㋈X68*%xk<# fd2gwQ/>n[/h:Ia=lwg$SCCE_~7!dIF#T(:$</K#E7y[CaK8u7;iqcj"b(gvhe4nuAXBCt-u^m u m&?jNÛQ34gf}z]!%=KhVpS&XũT*©)0i\89&8MhU湜石llkӱ&-x4$ 'ya!egK㣔U\pV[< <_ΈU';M2Z&v󫱗( Nv OȾ?`"mD"4uYƛV$@E姟ǝ|:i~.T>NsyaU y;O +ɫ5)0;M|wic\8gf*tӞ?q[¨D}x8]prKiU MqYǵ?y\8oh`57*lsȲN?tUSTVp;A7^zfK%5*LXR70wQ˕aByPvEe[L*2xjibp7/ȏ|X ΓV\fWJ2O-=Άk0@?ȓpS^T*5%|HfT.YNKsa8*7oS=|w/R P SҗQSmuF[̘Xy W8$$I ɮt֩Qp!&8 Z:Ks <f[)آ+%I1-fS8)0cL,¢p)qg*7Q"T*5eSғQ8ӉqN]n5 NJ4E)E?t%3)I0l9`w2N3&34k~WEn8iF$ #i֔=WOFqr nci2}gkuBaGW.JR7u򰂸FpY8WrTԯ)NG2OCCOUV 'P)Αyu,mU&j4㧱ۄWQlVCN\}'|G(5fˊSs PN8!ږ<37O{;xeV==B.qv$t@ i0Mek;7홻 d仝 ]Yg4vq:1<5K x̬Xza@YP4vNVA.qvLc/*?Q(J g:O#tIfJꪦ˃W@?yXŸxYwpUǨ(X2L'y@VeBժ @XlDz*׻à"-9oX\Ǣ(0\6G糖y~ʑ;<\L~zNrKi|[EM6Ր^wX[_QٵCr$ g,sW%7$XqN{38ciSY,r8'?1gݶ=Z pq"Hm02$Q7fxQSTD/:V,WXϳLplJ1)4py\u2̪/}u 6[ I9[gi@X|&Y(Tr, 㤘ݪN[mjZڻ8#a4ζ`87eW-x;!ˏYĩOC%YviDK)ɑ5|۲%"fP$ n)N)t#4e uĨO`U_EoÓʦҵ֣| nwYūYw/^,ǰg+ n>z2He5l1*B9ŋ|LZݗx0SQ~HZuUSK- ]|ͧQ:S&^Aɏ?{$ps )SCӿa5f6Xg&}?GUƆg&lha*tB0L%Zɱ+`v붅S{6.r( c 4/~4Len֩`f=K'#-gi@˕Ώ&^`/ NZ- fq2]i9u(YTvŨm4+Q!Q';ll`% gTHap>^#RPيsآo+FUG.pSQ ow+FC k 3&Qi,0ӫhR])m?qdl `gnyW8}ڧ= Lq3M8 !!.!L۞cIENDB`nVMQr0Ӓ^iXPNG  IHDRU<PLTE7>FMUl"Dfƪ3"J1`@wO^n}Ҍ"Df׈33GG\\pp)Rz"31J@`Ow^n}"Df3M"f+3<DMUh|:Wu3Pm33MMff3Mf"+3<DMUh:|Wu3"J1`@wO^n}Ҍ"Df̈ת33MMff:Wu3(P7mETbq3Mf3Uw--DD[[qq3&M3f@MYfs:WuȒׯ33MMff:Wu3M&f3@MYfs:WuCM4tRNS AbKGDH cmPPJCmp0712HsIDATx^붫;fuM.((`P4ٳ5ژ||{>?'FDP |lCKd>*^M)s.D͙МB5i>Jur"jMMfU/9V% \)C|eq='; NTlLe@g2M@@Z~M%GD /gy~kx Dqx49-]`~\9i37˚$ VeY^ `w D??8z`nxt6A^E~$:6i5 i(!eO싽5͎k.tߣrf;mq4筮 8D2%=j Qn`D(I0wE4?G3( s!䰛뮽.Η*&$’q\tj'}9J}fsJ'*Vx\;O,9DH$KxM v.T9ݷ ޹ S;#vNI vè&ѿkic{^~=#{\Mh_/$v;*QLkL3MߤNӛi }rDى:ѳp*룖4~,m%zD jDmg+^j 4qJDu-3͈S9j i3TGklAnnx':/,ν"_w4aׅ[zA\ޅ,,!DQvӒBzzxi̎ArBŠlӆ]z?$8 猇M:Z~e$Nu!*\s/Iߟ;QNk%"ZN4;YEC=7Rc>|@# [q=E`6tT"S;-\etz($DiZu"љ|9a?%#E`E.pڅ]ԉMKc$;DzE.>*AY)Q/@#MM#EBt0jMXQ9j,m ϩ]TGD&7'KGά*QxmfQ S&*pr[!D$҉m5\K]z-eIXRX[(u#*6ù*)RO2U#]%%?P+<NNa^E8bx*IR-wNo7z+UG)?ohGϐoeݣ8O7ۚh|Ÿ1U:>5:*uD|Ȉ,KtqNQ# &a PUwA4L6+˄/X X,/DLduSakp]F1BԠgXC;J\$dLP!Q<.NK"ѺM:8Ÿ1MZ6dXyGQL4Ll(yf7ߺ'6׃!M18q8KW$Dn&YXkKDz.<)BQ>&(۪sG9ET_$N.'1$G+DH,ӏzH{e9$;3/e9Q r<-qUx':WT0%2qX>35ȉQK(=e/i!uZ)e"6lWn:tP,5+xX4CST-Dw֏~gm.=,bI|M~N]DpdG/9I7_e'p*vv_2kFʨͅluWݮ^],YשVDZ! Y-siYJ- {bˈ "j2czTXtR,ˠF+D/V.V~Zc*jM+ŪDt1jDkUK_pok5k>z~hy{KrX x5dbbYh+Q uQ)T_lmj%dIbkр0#XV jt#M"F iԫwc^lit6㌞XɷLw/5l8xxS/|.&]erGyiI^Q36k4o]#-r⅜"8'q (A@r 1Q ~}ARfbPR1rX%F/kRcCxRM/>Zt)$7bM+3oEi彈N,d(kV$#] ) )-q^!H4MZh: {.2%<E0qSOwu=dnQJNӑx@IR?y/3h( ձ}{/[4 壜o L&[#Jp|q 6)Th7bDfR͜j;Q'zآ 93ؗU$j@ԈZ|vW^ gR"jzi)'z`M˅ǦyZuѬ^՜NCTS_YQ+VM虜~ )v@'˒t,04ue&XGZ QjvMzRUx,b:9 \꾊Up5Y{G˗όpJD=rkYωJ9E 9Q.clW#3Lx-!0cr}4+'BKUѨ:b~7/'G-u+V D潏KvI `Ҭgۥ38e~Wh%e28̼'d!è@@p@LH I2ّ>H/%c5tB\}gH{q`r|򲍮K%Q2+zBv]D1^~a JFy/MA(WX_^Es0bK/׽#^4{9 ͳ\lBuH}1MB_|V")qg4aIQaM*lܻDPNG  IHDR@CPLTEf׈33GG\\pp)Rz"31J@`Ow^n}"Df3M"f+3<DMUh|:Wu3Pm33MMff3Mf"+3<DMUh:|Wu3"J1`@wO^n}Ҍ"Df̈ת33MMff:Wu3(P7mETbq3Mf3Uw--DD[[qq3&M3f@MYfs:WuȒׯ33MMff:Wu3M&f3@MYfs:Wu)tRNS AbKGDH cmPPJCmp0712HsXIDATx^흋(@f (&Q![=ݭpA}__$/V~qz}KKP3r :8mf@UpRd#@A5pWgfgezq^h-dSmp;ΖQ-t>_?}-Bϱs2pFNOMx 8;e%hh -I {hdrefr-iM3Wi 8QIᔟ 5NRn݁)0+4%{0Fd>@v"GP!'ܤeA .iz'o RΆYiS?V 7!\v }@8%}B9{/x`lN2vOn؂IIB]Hw~KghNtA;a1I1 Сa0reM;^"qh\8{bQ+z~3| >TRe٭`VRc{R_̭)ćfW>:}UXh*MT׶ NbI Vc1،]e@ B76v3aG>lē}4 1UKgM7E *Nur8Ow :Nwv3㧂?c75+? Ӻ˾u/tpz/qZ,gk5Sx:gcilNF\;ӀvJuv/p j8mi[iBN|n@R^B|8L6oc:çuriS=:8yyGהӆvKC+Sp2zV u;B-KIe8gk8M; F;\@f3!me0*oRm.ѭؖ^)lji!BK3kVTY %֋shd :ZewcR=ePMuMv&*eTWqb8-xNΐ,r:ϿPоДKg50'InCޤ=%4EX='5t&bfUu)LbqtrCeS[t>N(QXTy'kv4$@fqyqnܡ+V[8scWJ$!'%W'VzIo]>O/ՠ2S)Gal N8 8?K✻!16RM><8HF&t\lĿ<g(=*vNCf[d m[n3'Xwpﭏp⠞SljӽuЪٞ~j6Grsfʦ*I68qⴉf0_}Kp.[hhSGI L#[mVoM=õ{ĄM YOWn'԰N߄@_Mj78m%bPI1޲HJvͰ5un-}ǡ~YO7b20ќe#;zx8⡷f ؓN RTNK+olqU皁8$ '㩸h;1h o11eBTB wҮcugګWwt\05UNJ*f=fp1J Фj-DL[&L׫Z N>ogPaո*p4ԑ$M)j-# `(>9T2`D:䰖B ¼-=en1eoG3T臵Ng8Up*Ō%LrGۺC 8i:Jz5 o"mj8\2gE\ R65`g_&YNPcQY=8lϸMڙ 0o8 17>_a!H(:QAQ~Βf8[a8pc&Q5^I27Vn$]zA;u`C,Dj-vL3l vQ,Fj 8yMVt_Nbt^Eye[f6ĔsgH$VQǡ/{^;μ y/ێL(ma;Vf^a$Inb?I ])'HqJ 7[^x@ge1;wa#I~uQ9J mK4<_K5DsX0fQUylg4~bCH篑;7l7P䏯GoB:8uxfXp7zCSO Ch 9Rf>ٟZ(5q+4d_PlZ8aؐp: h,2N[,A&t!4IdFuN3`j{Xy*>W/nپ3u/Uh9x/{Ǎ%Ou>~BKg=>\ I~D)'rViЯƉbOUp>;Zӄ_[' mp߅ط,`]裇TL[%Q)!H`z#s?Gs޽z!v ␂P<ӟRX$sY#d橥T g1bhp?F$QU lmRR<i~K'0PjtY QD R1ap,C-UuֹZn0Q"qUe@13&p^}d_=7dRDGZkC穈뉰qy">r 터H 3Ca-EqF5 \>#(6>,-<5`yuY- 喣D?N"Lh]vTϋ(gg{qF-=q N7{rjh8~#8C, +rh٫hu鰒x8+pӈѱ |"ϳݟ^xs8OЕ+'%xq>V/ή$Zݺ8"zRMV}'qkU}J5>K-S&(QÚS7 =J9"Pz= m %aߘ/t]$G>i4xJScZ3}i bXI ]A<5trW4pE+R: kFt;yeP3rư=Qbp. zQ֣s8 rƌR7 N0<*=ނ%Jaysѝǒ*VE){fG.6ʾ.Պ_C+0NjE9]5gJ_Ro_P,QZUQ+X( i4_rd{Rδ|oMmfA?+Ow>rҸQ9>=B"Ʉ?ɺH'\#_ڔfYXh(-Eur-wY=A¿qR>]k+Mm.`&x㈕I=/:k=j%x{&aXl=7fJ@mΣq'QQV^[WWB 7#/&}^a'u&};lj>엙誯>0@,cb(,2eB2]_f-^t4e<&YKhxd L_f~F-#6cm 4ިv0E@ѧڡ2g"<:E㇟YyZQ[B4V%C _J^U7Ѷ2}߯ohâe]ŬW{sڱ/oΜa(uX=-sE>/jȇm̻gL0k50%iޯe mLRkZe)%Nj[zHys+ [iu(C6WWc8"ï1.ٞq֞X2xrMRE~}'Avl5D#T"ndܛRpBXᮩDZd$!.s/:S%-qߟ$l%6r&QOCSbACUDx3B7 #'X>Dꕦl_jbtW`@Xkb2r2֞@C{R`mW A-$cm<:*d]0vXXcm<;\X+e]0vXXcm=8JYdyd ]9SteCbACՕ9ZSOY߫4x53(k/>fd~'Pa[}qݟW9kWWnFs쥸7F$W7+R6Kڞ#sR0h @<1k8j,Jf:A,ivճlpݹJ*ZnJ\'}{kO<' y#oE;HoCXoeG'kȓ$x|M)%%a .ɱ:)qmECRL.X C׆Z+j:)ed 6#_EjXłjzYOȔ>40B3eo Ĕ&){'Ly̔r7 k")%vh֌0Selx~6n eu0Ƭ+S z`Yκ`u0묃Qm]A5:R:u묃Yg r֑⏐xDDSD,XPPogpc%<ﳵcAOcY30ӳg Be#r?R{w㒹l@3HQrqHN)6ZI|M(1&in|nC2π2 X` qI3ypm]3^\kL%ebY#Ejłjz1ETÉL%(jI%ڨ-,e,cbYh82 B,tȾ7xPC>ڏOn  -V يX{Y9Yk5F|C[7A>19_Y pzp kcG͏GҲ6*d;`ֶ`m0kmQq[AEZRfm0km 6%e;4Lh~ώK&4{kGx%Ztm 9ܬWsUhlnu8)%MNibh[5=3VN*2;"su49H1G2}!Er4&d(Å@{c':@>ҏS#IccPŵZ9D$TVM(PfpI#,^BW#bUD}U P,vVg6R fJAgi>-"y664_I/-V˰)5XK0ʕAqoc (PFy1$6mqo<6yqO6ƽ {` e&sܓMidq<"6E[SlX ڡ9nq`ý{+{wA+XWŽ~`254RpI>R!Y XҌ|%v{RVkC-s-?ЙKr`Aq D,Z`+UiY+#yѫgu#C_Z ۊX|[~ αZup iٸ8{1q֊'V80Uq.-2r_"?Pg++VoD]lԒN,OTWpHG7˕rtY^EԖstPc)l7+NȓoM^5h1`F1$[H "-"-0(RPYf`EZ`\l)YDV@_AW#bEDߴ!ѧڡY0mH,vVgL"tʱ5Kw7;P:^N|^k9űoqT5V˰ v5*hxnC;(9)@} qp v'2d#Q~l*'LNdMxHvsBpLۇ*nǜѾI7yl KS~;-196%pmŢ'hgmB%̱,kC-)r[g )s@_FpD۠S8"mP,v6%b %܈,#JiFBm7b5縉8eX" ^sV_,nl;)Z+P>ٮ}J_i\?PS(7yyÄ8r0;aIw^}I!T /J.@Oϡ|֗҂&K8!4Kr=ܟ<))Oٌ'5{7Iro[A2;`fU.PTwgk(?4PHJN~KCw(QZ4N9^d*=GeѬyIV"p;O6! BC50gsfm9gJ3`l l9 f3l͆~Om <"D_tS[gME=5քg^t0g9L>oF3N9vwVu=UhqeKŢeV+EW{dጮ5$>#Fxlo)Og <J1gF̕-kR)e|&,?ä'G 㣿:&Y?o F?%???Q$5 `nT{P~(P9PNG  IHDRݡtEXtCreation Time _^?tIME %, pHYsodIDATx U}1)E/W0⹴~y /oAKwrLIظ_S[l?H6ty$䶯7Ə2~߻5+#}U\ ωN='VoʶTV׾y-MQ.Ac;ϝ;wʕN/f$Gei VR{UU3ό:O$]3 ?y[/sTJz?ԖW_?rNO]?{x4eϿfgVGw,9Zr7N|]`:Tx ֛o2ivn, {>E^~񤏜};;}C}qw秝u X#fA<$T{n.3>qY|\8aֱW.YxxW.'O0wfΗ&sp՝+g1G^=_90a?L'+;Y;l^ FȭN>tKɚUvHhd0IWN4'~G̛O߽nu _OMkO7NxMqkɋ=$~ӧFK΋I7sػ}uo ÚyL oƲmyn}&x{}~ ؆?z_.mڬCt'Cո}?׬ǃș,?Q `nxh`1Gbn&wLߘ5o-7fnj5f^^yvHa%!a<?^Ne4:{~sy^w} }2V"~VyiyweJ-LY}8fUo|óϽ6)wƑ ^.LwQnef<$-8t4>kVl%e,ML' xH[ sT~hopo_WUϩ?5PcŖ7wΛw߾8vx}>1vֳ$Z&~ 7|HVTR+g~g^fmo[m:\ve㎟7︭VIiwA;wn9*KJjֵ_Ltγo,h?٨<@`F⚦޵`-GoH^yM_! [fʹiӲ|kꪫr[(XA ` LGftNQ!2LF{q;7F2VMYzX~A8~=#Rw7\=6{ͦ P/?%wTrvͷJokvrg!J6b?V{bngW(F%i99,}[eocɹTxmT+]$1[1RPYNq+eg*)^z  ծvH->KM"qQ{ՓMJ^RClRh9FjS£ԗ+4?U=[-oʯJ:4s>jYxCZ5 ׬Yf@(X ,6miDۚ$xǒ%K ㎦X,Es[ʕ+N:B nk-!&0CҥK)XʩC;` V[%$ϥk;B ΔlfN%]-KV6'KY=)@$J^'n(l֬j>%Tq4dig@gJRK-8;*Yݰn*{XL^ލ9iIg5Q2Et,a$ya_:di GjbZ,)XT+u&8!|ahyXBB^(êGTn&j;8iLY{Ua4.Ɂ`=zҍhm0eS҃tä4x Wk [=c0S}X5r#;cT0$@_)jRОx}dfU|0Kxn݇:Ks ,` @0(X1<,nM_щ[x+%|Vr.Jێ%TK_E RyXg->ȆdΛy4-++/mI7 .;TpI&~?$Lf/>J_OU|RnVuv\*t@=,u b˘qVOF'}^ii\f*nϠ S ў#~]w΍@۰4@0(XA `P U=8!jjo R{F#oWrE<Ȑt>,I|ǁh*YyXYg6h*ySNG,{hx\Ks   ~` @0(XA `P ,` @0(XA `P ,` @0(X/XC#>Y_qvhf&Z|c =Qn4)oC W=lLݘ<~v(3ڛ8:tcoo;i}jae5>rl4۸LP+ѐ-&w,~ʾE%F)ݨ!=RtjCj/X,!}[\!KsP`QZZ@E `PC[C>IzcN|]HebbChJE@%jl)1і\=5ePj"q0ЪHE rSU/wOGt[CyӀ HqO? @0(XA 㤻z~7=Ϣh&^i2,!@.+6ߊ V&UCn:_n_;)a@4e: TMaYRxvW@5UfOMabϷ}H<,Y,uyX`g` @0(Xtޫi5iSm)yn4AS6EmHmw:DM}mw=Z>,SԧzUxJͫ.YzCNVP:8ޫvU ,K.-s۝#)P ДO/قPxfבG hʊ&0VZK,GigگzTd VRMԹjSX/+rYS`USmVodInDݒ}=$9w\@PĮ,N@i'X ,`Fa3Ս֮E @TX" d+ZE, JꔰZE,͒W ,`aF$#W,_Vf-5d # ֒%KhDo@0{X%`0̙5;v?,IENDB`nU)MGIsj^PsPNG  IHDRݡtEXtCreation Time -8tIME %, pHYsod(IDATx -Uu璧% ZO 93sd7}gfϞ3s,`\uΞ58pw~8ljgtI = 믮̶}B/(|! )2D 8~fl7o@G5gml2Rxl;RZ3AWWxO=a})'\?r~o.&vX+oS^ټ+ou׿~Fs_͏.kYO=}{z_=bU_<'mwL#|vnL+?V;suw~ُkq?4Ʉ9>v響x_;uwFs/TOη巿'K^7'=g=y5]?ύ=G<׭|Kv /s`q34jzSظ{.}_=Ϳ淾/}?}ޥ4'f\>i#vi  Oc`3q!jʬkkUtXW}5?_.=My~ea_}7yr,'~n37v;O8ڍ/}?W^EX=/m7W_go9mW{E×b{Vl'n9?Mgu膫 栉6gu VqOG5ͮS>}G|͡|K,~!w컿_[{|g{3Z#_گqqg>+:?KX:īWׇ¡>rϷQny/ek괋[W>}pS~ݒsƏ q-kzolc߻Gv>'uJVw;vwo ;O_/+ Vի?{1ڝu+j [>_'WZfn |tUKfcN?ܮ3t?~]vї<.}Wǟխ_dM?Y6jY6g6qxA4}x_]m}/{Γƅ_kxcN޽wKan WU'{nC7.<傭i,{凞oyg?{qO~*Mf9-a7ղ%}Vy~ϻ3&2S{{q9`ڭt7/{٫=G:'|ݒΖcθX%48veN>%Kv+ՖuӞsݤ{7%4Vn 9'^kx~SWeu?l_|(OT<5rP7?W^rSN>7}jM?EO۩!/N_H~ :|arRVӼ-7wNou78[SN~s/9ģEX}*[Z}Vy?u[lXl{K]0#93SPa_cj}W\qo}[`nm|5f6c ՀjsXˍQZAiBQӰ!:-l=JX,R\NcGrYVǓs{Td7c0qnW' ^ĺfg;}}1j;2]UzΘV@ MJ{3H|uE;xFq^W%V[)DT.cVIbFM3Fme1sXQp|Pj2N5kEEZh-sX2HP%pm3ШTBrO@l9y 6Od9'<7]0n}eYLQf|gJ>tGQNx :xtywC_ܡVyw)_rEq`qGXᢉ8+o b}PhE3,T eT#J(#E ʷ#̻C-~25j*ȒJcM+JC -: +E©LPjFcLp8HtX-mfW\{n<~L߿OoZC-c㵆N'!IrRk lvGS8,8ˀP VyW)[ #YTaU;ݖs Kgh12v:342NQ-b}#As-N+, *@FZoY^9y)Rao ЈjuឳQW4>KV-y郝̐ w~kBO43L^ 5jm/XnZw(#?O30UJpX0Ό1Q`$|!`#5 GH=4Xy GX2`*ƿ|E`X"*UN p1.e(M ..FF5Ltn OBJ% p~KMN+NXՀja@5pXP 8,̒NSÚKR FcP>.ݕ3Ѩ3gV0ӖS+CS]21(V /sidŜr mp+6dH+0CBO] ̎A0$OCXoDoaD!g KJEɥϴl_PT\2(sB.FLe< HPs!sXr%LV8x?=ʿ?HDy_[ F"[aa@5&<=ҨXPRO ;cDXU\Wd[mM,|l.0֠|XrnFѽIkeO, )~EEIX(J+TXyUbq½{2F|DU9i,{hGi )ҹ+'M}Fe V8g?r҄d:8@iJa)a5dU)䦝&ѕ9g(k XK `a@5a@5a@5a@51L}&|i'3ODRb8M1\%_K8CL?#vO>)_^JN~TOk\D%%crgЕYr]!B4/SL2ZB@5a@5a@5a@5a@54,S)~LPFea y$>_ %2a?i9 @)>bנ$+ ,c `&Lkd\.|I;9۔=)SDMV,`&3E8M@ɇ ,&? L9`|X=$YbISDT)M?4k@LtIL#,5@5a@5a@5̇%䢲 i7$ ^(yi=JX(W $w^0O tT#?sʥF.o5S" d9,YHPnig$\*Ͱ3ͮkgq;$btq ضՖirOM.B9BrLƆP%V[)$zV.cPF赯21Ofl[EY r1Z;>p|Pjڒ1t?Ytp٩BFigM4K9X,Aj{eL}|XF=dNm9Π>B!gmG3~lsχ+Y3$8>ߖs'w7Y$4eӂq-&W$ TLqԘj >hO5n_J+ cT*o?FV`c$lv QSJ4jݺ=JC ƒ\iT?iFO{B CXϵ̉ `\K )q^3d=#,XKFX!{SQmu?JQz*8s,Eu nFPp-tgJb|X'c۸/Fp̒,]ZKt+a- -<ۂ:,ꗬ]X3֚J6{SQCle*^r m ypŢ mprMb61Ok4=HZ }ai4XƤR !~2E%\,R #kC au%s&Q6pvN)MkSFk7Π>B!gmG3~{X;'p,n Y+!?"i)l1bKl>RLrVpY ue界)RRz%Y$KYSd7s': Wpd΂JQS[I+4FvkGROSJiT?iF s`аqk '<+8!0h jظ   Z>%T~%vFK?8sv+Z[z %4͛c cE^=syYgJòWkv+%e|Xme1a!BWDgClkAj`s(a |,Q6gB4;mcJ47#a23KRSWij{g%Sy,oK}K`u}q #a|L8W`[’T1 MDnψ : ފ χ+m^ib?'Ŗ:5=#շ᫫(Bj*M(u{JMȆ%r-q`lZBNHeC#, FDX MaN5v.43GsՕ@]仄ϗ'XMYg]Qۤ.# `ʲ6pgc}eyi_ {ݜSJ 7w6hDfXud=eMGNcx%[5Ѹ\]X6pgTbB ԏW p@' Mmamiy)qlGk $*W6;]w$+mrgϥP`Hݢ>rl8#,-rUGm{zQb)lrjg9~UvG;rda-{DYi܊ ; o,ロ2j'ZFt_v'?rdƼ|झ,aelӆMǴCqWMq9%?}Zw)mX&ȑf:@UO#y5Z%ƴGNccᚱ);e2&$(mNM+ til*ڧvqWRޙ6cYݑp2}È5LjF͇U,/zPxiE8/T2;7^4da9,!ީm f -P簜1'gMT8֏k4+aP-PĖQVT/RgX`V8=] p @ }~ ̊sF>h~[~ \ÅL"`4aCdKB~sJT)*ZPVQ{XOrYJJne#D1eLZBJ|W)~e׌F'e;W2*:Ċu֕wF/kQ8/*t'L<,ko(SB'DXP DXP DXP DXP 32c@&2 :ƎU#T;N O 2 6<%lԩ`cK9,",",",",3Bvdڏ@ 8;/ciRaus{tV0>ZW +S# k Cviڲ+A+ti ےxi^p|f "; ʽ5$o|\`6ANy5P*h _{,cVVTAAd9 g`a]t&MNl!*o2)> er4}4}e«4S̜eO(E5|]]XꚨS3* 0CFXi<|?9kgll.eyg1AygpG>+ev!˜}JuX&| (v;5}f 3)dݑ,09>i a TTTTTTTTTTTTTTTTTTC:iodDYZN߬z!(etVjLkP/CţQ89Rӳί1>0V;Wm[SzQ\'Vbi;8 (bl 򓍠S/_@85.QQ w t{xnG@/? #g_ cioOF5z"Jec}GI?DieXGp݌:<& ";gTdie՗U1&KJM[ 1^m"7\d9LXaoduU.TէG!yGbҢ2 )8|SxZ-Tݨs%Ⱦ9>BJ9E:C(7njb7ۙ`tU.D)4Ҍˀovgb/ f7CŸq!sr2*!QQ.ߙ`nW0K|w1u^br?ZlT ` M5ٵj aW`,~.Y~gtLކz!|?E9\Fá1ETw ziTuKnOk }W0Pփ Ȇ R9F3 #U1oldkj j j(Hc ꕥ³(6p'4~x!k>}R7,)!2z(/YS$^ﱗ2^MbplCr[v&Qe_XY(QNfREE >!$t*siJp%Y;}ۋ)AR+&z݌pKu#׮,A3 3V2JTl)l4wR}xJ|r]D"HW&874DaШ~%^`LSb)\kkK…qݖ'vKLֲG*󡻿|.925C^:QN!8G=,ażVPYZW߿c*mnh.fd1H.d}R0t]gYZL!g`49CJs}m \g*{D&W b e *KJ,氜ٻ`ud*Al9VkE3pbpD)J_ b)&3ċp9 #@;I0sX㣹8O %z-Na@5lbB@P_վ,v̖7gpQJX9}j4/!}5Q(e YL8 dᐡ>A!CNR~mAq'|nZH^cY(WE/ĉQB%+Ϣz:ƆB*U4:AaRtU|@JB?3cO!# \ؖw'iwRp2_=,(MȲp-eH}ԷL&fJg]7qutSyhcI;NM2J]s#.tΘ*繍`9l4-DBC2~v/vC  vN}d=]8|rFW0rvV E4km苣@|ꌛl8?a@W4X Հja@5s/wqr"&N3E?h;ْCTM"ib>}9`j&%\CLH-GJD@CiU#%47ߚv{Bu8wPYh.V%% k\g9uvv[(:SJotʀ(9~]R,=a MtȔ (|Le5IR9@C:{F^#TËEi,\PT4d&HXJ)i}za փ). SBQ3 l ֐#kYy-洧BcD(A"VYyˢG'Vy uw/<ݩd9V6·YIau7nQ5NJ|KoWS>}L1\gpOem7{k[†Ab Wz>oxߍ7|^ATycuDgJ~L;ae+i/[L;fa >oh c>VK3~kaEL&TVsX,}Ǭ",*}+Y ar1j^kgw$ c>V*} d&3bн0vb2*rzbs qP;Iݻ7bAo2a9 LB;?z^9\%)!TV3>_<*?:vγIENDB`n}vmO-jPNG  IHDR,ݽKtEXtCreation Time 1tIME %/>Dy pHYsodIDATxxU Fģ `H3рH.1(HA@"Kh J B G9PZH tE( ym^vfvvvfgfyefN͒@!AuCE ?%@âO}.jO ("?`Y]_?k ~lς9mkВթTXI;iHV'}hyㇶ~):_NެN3!%N3;jK@2E)p 9};CHH'͜$DxR﷑KwVo1Ji+GDDddd8~̭B⩄&RUoE4\?-vEGY2)?s3gגKuoL4v2}M2vF'& .u٩7T4^>%J!|jdE&(~'em\%Yx{KK8rj?tv8͒}p.?NFm6гg.Uյ &ӏV~C;'u7[klpƦ]mE!z(p1EnɕMΝrsyj⥋Ŏ#mae~!UjC['i9JM`VIg~9Vn0_<8Lm<2'1r 9gvT<`!38?ﶄ_ͯ{"3 ϒ{VEj]m 7j'%/ SV>qs&TK"y_6IЈ͏ZRqUuQf|t&nI2ݡ}HK֜\Vx^3Z->{$􏬮 }*ꍒ;ER7S\͞A|3O GwXHJBro SР}"mŒ_NJB GKJmȔdS[;&O#%CK^a72QuoC UYӗ^zZ75P[[8~_pêͫ4Y&$$0tOd=1~[l^'3Uj^t?s֨hiiڐ6kVuC_*K`c|tDyHV E篭g^T1k6FU}^Y0vpg(ѨSUz煤YWGû'GL+7ev//|f!_m=HN7%t`3lyױ[Haf YWG?L,t4 g>$V15aEΔ= RX.Ql1cYϒf!_ܼ?f}3 >٥*c!QU Kn +tWgթSһS;*ޭ7pDqCҙigeph}vۚ t?>Riٴڎ-;X~ۥ=wʔ+UCgnj(d'hg~֝bZߙ3 RYg*YԆۺe=Qb rwMX4WܪIe7eXn]ߙx%!a['wyIT)GY!UN.|{<ng»F¤>pLttt\ɢO j௭xBNȭl ?$Avv6-4 rt!ۧl3t7MSr,{i$dYR]hklMYWkߧVz^8}Bjbxo.\SlԛQ*|I'/J0:Qا&c` ,[zqh=gm͌RRRLo߾EGǢ~! ! ! ! ! ! ! ! Rh^EGG5BMe[!(M#zB B B B B B B B B X/U?cW v8`[at%c:4ή98@|cmBpC٥UgWcH]R) هnQòd0u4Rd2 `RvڄJT+7ƿY^֙Q<1xPR|j쬪ʏFjWtѳ&|F550R!2t0RB1h"@0 uBBBBBBBBBBߖǟp+KB$]ߢP#PuT] *KBOB3'vJW~rs:I1T~T @sȣycwϤ%ۄ1O9rC`b^}e回8&=xCAycGRϷ(peElC%Qv7)}9ᰅ>%|:*+:dCYSga UH\^/57m%r)e%etNLhc<-*}:POVB:+(D9ɡ|cSV>BǧK&`A8&U{SmȺd$.~V$8T7\/o/H!y&S.{1ϼX`.mݕ%! puA=!|$O]K1$u}=d JBQ04%!s9vwϠGqBkGnE @V e5RwKޛ:Jv-6y mBy,ha(:!`iU !uhVxYJXѧE_?IhIENDB`n%Atu`22@PNG  IHDRaȏtEXtCreation Time ":+.~tIME %/>Dy pHYsod%IDATx-GAm_i Q,bR\-DiZ D T/1x" 1{#FE@51!<%cZh#(!AVl뾻3;;O^ۻ9{93[zsc'."wIi]c/wvK;+w9&cup֑ptA]Xv4.X8z/xףHז{Kv8#`*x |!zzЌ|Kf;6/k?Vh3Wj?Z{zP̈?#|4=lwz/[xtGy˚zq{_‹s?;X'=O CO<ʫ={s7_jo~.6e?/jT]7~k/y+|;w{9׿=AՕ:w>׾y3?q/Zx:|-]5Nme;U;}r@y'Wi^ӿpޛ?uWW}S^k.ܱϜʆ=D}KOٮ[/) `#vwpYguI_}G/='Mk>o=g=vN|'],):u]뗳څK._\ȇ^uk.o/$ܶӜi?P^z(7Цz>y߽y?ys>'k@{^h`I4GF z4R+ŗT 5s:E\ ]c^|ޕϾԿ& r~_ry_9_G=O=/=+\}#`w[jK$>LI5s(kaH ?< q-` }PsL!">TPB*B@E}!">Td.0?:w2Cl6jt-JJ?ԹDs[l7}N[NgUidvvpOWjْCsx`Xԍԧg:w;f?r!*BEX7S?4 i^?orHIJ\0z+J'>(7Wp]K=GvLi|Oܯ%m+˰T(VuJ$~'V7]̗m'W4Doڊ^NVdSR`$[uJXm+.$~gL'-@wm#!`p+y}hAf6>G3XxMy)7zT!U7S0[ODGt {?%?L8 l,mL9iLxgz^w(ed C61+A/XT4\&8(.!|d>yzK7sYrRl 8Fԅ)Mֽ wvg_btO_~'eL(Wã~fOp󎣽\`*e/P,U'5ɰ8tcDKz˯ή@GI¢7/U_o2^/cẟB<3&wO] (Yq(Is`@gF!0~e^fF $*Pj)07:fIыnE/CYсj\n-[ņ~;D5:w;q5Yj':-3,Cߛ[f7vfO d1y3(bCc[87WE?fLÞ%N7|#Sf:ak`7;̖-2 >V{yktIvƙ}wJ]*0 s* k$'ڎ]TFZ#9:3qﳕlgG,LW9B"Cr1 ʤ֨mcPUW>Pٟ5oNsO/74vƿ.I4,EQ 324N+^C>2&_ϗ7Ai)K=m{nVX(,/àq7۬kM4DqFX.FF(r"Ūy8 ԇ#E6#{y2<,Y͡`JFewݿ=U_<"(`:НԶuz cҝ$R{ {B(WFvX?Vnr?xDΞ9 E?edU`ѱ,&%2tDWwD;(u<^*`y2ae'YP/Ht0? "ca1z%Ƕ;) iyK6=a{Ǽ,o @Bwng_,'^RPLiCj*|H}?5B='0RܷvAQǭ #^lM4(KDƶO8FXm6+0IY<_L|>h$C̈vJ]$Oaf}~,H;;nV(wHo#z^ 4+~_-Ԡ,}NVe۹[OEǑ˦~t?M~[8?ўss2=r}@f@Jhӏݴ{ rЭMWJÀk.ݗpF, (YW7..tupGxcIf7rv'gOM>moiu1h VdϢcy8!m~>̂_TF PncuL^-D'G^&(Hy k+EUV7(yn lx71ڭmeDo-0F'wW}WtEښw9+ nE1xrS@àkv|+j`6_ПY.jr㾧<5ν5q1W*IGBUQV"Jz%Gt/ oyqHe^(MO߾fwwK2׿qmDR Ʒh+$:U׼Xi9/4G/_}V9ݸާ}s{率WzVu*~6F[oݴ9V&r9ӯkM5[F?tu~V0$z!O/<L kϕ)3fӟ{\O?S΅䴎vpOO7mlw뎚A}|e-|<1qVP&R].:xݛo;n (ŵ<) \>mfD6wܽI@P7k7VP@;s[ "pLf|}\Iyr¦6[l>s%)&:=`fDT6}{'l3̛3!aάIUjB? )Ma j0bC->Nh>pG}`hӟ/Y;軻Y,Q'>d̠,?;͑e>z`]L6*hK 6|QA;Gn8T/m[36[آ1;56+A8 A2Vd[S6}wf<72d {']q1$󀙶#ݬc7.j{9S",FsX'[GN p_#Pf~XH|DW`xݛoSg;6PyS{J_nB]R̠4n c}M½^ f̽~B{ݶgYA1Ό%9rǜE7 Eaܹp>xK }0|]B Y@?}BU(#􁅛E?}L~Ȉ6}) 3"$ww׹ 0.R>dC_O|(AS>d1&5}a b<5jz _DwPTQmSK؜݁P:qng2qey+}Uc\̈;thrϺ>Q;a59Du:kz_7g* \mxnܕi< x&筽9eO]6ۿ"B r<1X>7zH(Dcܪ+1xyޏ{ /#p2`V ϢEQphʯScB?[;tMcFsX'[GN ^駔wǥ弶-*껸3ݛoUz7=M[]aw.{BpR=HrOb{po2fosozО=5{]AqϹQA;4Cc[}`6>dgzO59a]#Qӟ f050.t>7:sz3n7| '> ⏽cl? њl{GK`Xmਸ਼)e3?-L&lҘŴP_9V&hrϺ>Q;Jv^r7+ݺ'Nی]9Ӏgz[lXԊߦ !O ym?TuzdD.j=m c;nùe8qb.ZWEm~mާMf╫y+}9(B4|w4 GXĜCC} r譎M$F_Zc=1MhxY$-]:6)6e ϢQ]9rgӍuφGnˎŅ~KySo4u|t7 j8aE)/_ '$"=sнVQиm{G5\Y{'2}M½^ f̽~B{PPNmӀH5P!"4`֤Z1.#/ĆȅK#0z[:8my}݂d&i\LcnulbAռ|E9:NHj~91~Z6rxL^[{s˞Z{ ʬx!Bf$#{SVa 9MLn˦q3Z<$PR5w0֠OWWŔ1)>3g98 s9O?SO[Z9V&cQ^/Yqbܟiح`ձIB.K6hdK"5c,#.EUq5}v ka ;C9efQJ苦|0s}{{㭢q+&~k@ >%{OӇB]*uu_}ݛ{6{̘{ s՛O.. 6MYC+ϫʽ^?0!m;{{ *zd<L,ChZpn }Z;ߐg#?;r?6 zu.O`ВM?-HLb.9x{{eY^r3sM9P/`eTPB*B@EBaVeP ?#(tAѼs@@E}|!w{{[u[#/As+"nC{G谼nEi]1YU֑ܭY#b[7;p`$Pxd~ ?͓5ك1,z$ }k㬆C"ZW*ұ}7q VߏSTPwBՇ;V2E`MϙG2栘7C'50GI'F~mEWn GƜ?zzo9= ~'iA&qĭJ2 =` XU>#`F /ea Z`aQDhӷ]<`w${G/R%ϕ\W bأ`2)v i.:*z:]{4G@=`9+ݛD) p|+Nxec̸؍b J;ƛN<9k }1&T̯y'f`^Vs@9a`hPB*B@E}!">TPB*B@E}!">TIT-uz]3u#-ofZyy>Vm^3M*B@E}!">T.ޖ]T.SeCGM(":v5-Q\WUJeV:MU:R`Sӟ4=d|D}HYScUԺJ }(_a"5̈́M鞲~s?#yRLDdOZ2mP+b U`Q>z2ƪ\ 觱13n>S`E_yiU~c<?eBX2W㟅m@TPB*B@En.t"[z˯[_;9j]$ڈ*9vyÍ7TPB*B@E ЍX*jP5믿>w1Sغꪫr0*#1IENDB`nh߸}:8ERPNG  IHDR,ݽKtEXtCreation Time #,tIME %/>Dy pHYsod IDATx tE;//"lb@@QAP,ENAE`XN< DAnoos]akRPtW/R]]U]=] Jdjףn %,&;PJ)PIn~%(eXЯxD9d4Q\H<3 ݥvD>NGTNA tto3ڧԑcyC厾,>JغMԷ@!S Ӟ1~1`8S#G=rq8:ٶmR!?mo*>sZZZ^^^X3/p^JF!B ㏥8ǏgG@ĸq][HJ Ԗw3핞7KW@NWvjjԪvx eaG$^jYd9 7z،VCnu9}-Z&7ԩow*j?~RKYêLמe[k k],ud '<7Q,p(?rJ3 ^jgö*J^ؚ=v,>akg=ՄEz_I8xo :ág};2WfsDR+ ՚bE-³͚wƋ=v^Ɯ+:ӶRG? (zVѢm:m (Ai\ԯ⒇.0ujQ{:1]FvNf3/}'w3Cp{ONR6Rby/FRO t֙-un &<4oeʗƄSqEK=|OVyDqbnkHTi$ m.}$Y;DN<[>_Eyv٧,ҧeu bڪ/Rdfљk=Rmܷ@ڮΚoۿVneO k<=cxȰ&.!r맏&2Ȗ0ȖD)gkbL΂!kv`s").[BgFҘwɼn/gv"fPKQwGY{)yu[fZﷂmZ]M,{ޚ,mX"):e:ؾ2@f ٵ>\ך~|ˌ,G#2Ku`},d?e;sf Ú,f~FQy(Ht8Wʟ:KK^xױM|UқVMi F02rc99X,6fbL4v.ֳH_ٟR9ѽ ]*&&'3.RKˆrwҔo?WͣČ_d4Y;XyN ~F?Y/h ֶϱaM8;lX᥮r;vkt+lX(wG[>^io[~2f _l';cNq ?8L }pdNW)K2OU1a~6,la-NLo}ټgeXwgYCN*͍X?E-mrΥ jպ⧟S2b?=#0mAw=o޽&0SyvL7pox1 &nK 7p,yyya<ymw ]=ޤܝ-ZmXŧye5rb(L |nXGRJ`;13}ACުx՟+-em܀.ti. ϘM_e)QS߷O^&Zb?R2jKu`aZ|@XϫvGt9A" #u{8QbN8@FNNu@xdddN<&x`Mn),,LNNW55k"b B "b B "b{GSRRxd۶m v]} 'N0L$k?&E\0P؊"ѐnlb 9iX?S]Msh+ "՘P<L(j9ų|T2%-AӔʇRiR<ŜέkLH ʣ2)!v&!1S( De٨߀:yCzH im\NUl6 |#fn _xۚEOѭ[7(m b B "b B "bE&(,,B}'###99;"@({"`5z z!@@ D1!@@ D1!Ĩ}QpLovC]CL _worL!3-- ]ƗmX~v G~vutI1Yi Wʼn1ayq Nv) @N4}biͺu1<ܻu+'pE ApDZYNAt2*]m b B "b B "b-^zu"%nS/Ƅ@ D1!@(fdSkMp"4T"v4]~d]wk#B@. b B "b B% zWyu*-5?$qqg윸!.,"Zϴs=.ɵi:%n][Z9nEhB~eXmY[X#d 걢4aCKSİ8Tإ:1!7SVK9\ 577D?#ME֛?'Nh2n-(TN4newM="VN҈q+Bâ7SЍҊx9d;uW(!*EõiOKbG,!6pc :`TU7%RMqz[ ]4&t~RM2DVI{'P"a4%cHIh&av8i'̿]ezcvt1._C{8:Aܒp #ڻ䢋OxN9 4K V&XB-<2겋M% @.+C^VTШ&ZC A]ټ( ɠc? bd @(JII!p|P?xrWfWrk9ss&:D~QuUduS(ܲ68E_Os/~9._Ⰳ~ӎ/E-ndK!/#5^ʲMaDj {ݲ_uh$dOIDx}:+ו++6lOWC0e˖oKVR<ګ߱ gkm?gg7on~_b+_"+$r]U?|ag+#~N}> k<9!2ot$þoyd80=ǻmMKlBG^[_h@_M\=!W]ZD25fOGt*F(;Wm&\!~ٿ>K%Ú_+'0D@lES2|~:pmzW2>zK'>?Mݱpl22`._ߘD/m}:+P׾G7!2G_S僪;k$|R+[VYQ^_ >JYXv9gh6/ r%aT?vR01m0h2N!}R6b9L[{)f ɖ"H0Di,8ݨUY痬P\ɔqMx=y(U;PYlRÑtWCGNOuZU?I?tަ4xN3DvWxHD~VZڟ鿔 w,z %K_Ї̫+p^ {vK+logBf|Ȍfl|۟i1cDoޘЫ>b/!־MȰlm'ȠvpSdJjlAnѸXb2%GV;ic,u?~9wbʯ9[rv 9SI8ОS89-:ɕFUMwbO=?՚`q;V=~4 uZOf :703ez!{b`p{ȰYy{MF>Y @-,|O lWfO=;xu!kYDr8mzkzC[1oh|qK#A3rfO?;3~mDI>"n[&ףb/S!}[kN?n?"A2\4YH 6 ]^'\0=Sj?{>m.٩C޻<^>zYEڄȿ~_ =`izkg&3lz1I1\5UTǫsH?2c6>|Y8cVČ:5~I䗣S_}b}lVČ >Bgn4 v|Nm'?N̰2:]JEOp4 ^7p]/fV_/6lr?\]>JN{ŧٔ {]ekQ«½]HJ l6[k!Rg . 0**T#@2@2@2@2@2@2@2@2@2@2F"e] cUB$B(h h #tӉlNi."N9gB}dDJs59g]C)Nͥ&J͒8{ CV "/ HMXpgOxNEp O =bj#xţuj.vơ/ 53z2DEG0zHHHHHHHH[dBhz6-** wBhzSS z =B B B B B B B B B v__:}W ns8xͷ(*.]EC_~vс.XgmBlKjvϮNQ هmaYrytR0IiNL@W|AKe} ,һD`^PG^Oefp8X̀l']DDzpd!d!d!d!d!d!d!d!d S!z!4=@AO2h"@2 `8!d!d!d!d!d!d!d!d!d!oOxʟ з(4EO~jz}%ģ^ ]LJU$_E +q_ ]=zL#E_ԫ3=n[ ! ! ! ! ! ! ! ! ]Yz55S!h:ׂPM=Hz ! ! ! ! ! ! ! ! !Qc3~Q ] - .rU:h:Q]EWBF%T%xv+@HmꟆ$ %& t}_]',}Dۄ:VgN͕$BWc]g;m @2@2@2@2@2@2@2@2@2tfBCOfZw<ԋ6!d!d!d!d!d>;׾l6BTT]p!$BSgזC};rB ڄ!!!!!S|oĞvP:Q z]]tz(Eӻ=7 Oj&tlmPȣe]=gۗM8Щ.tꕺlzZ4g7n %.8eOܚcاߣ:Vg["5o߳UBkP1PsLgcs f}s  jƣT9<"~誊Z80jCdy~zz ڄNm0)$鷧 *}e^pP  f# !3!k ۄyyFk_1 MDX zBs% RڟBrځAX2 A!dF? A"a@ )!gl &^ SRRd@ !k~X<IENDB`n"K?~/¦anm9PNG  IHDRaȏtEXtCreation Time %! tIME %2]( pHYsod"WIDATx&G]}k9lJ{!Z[A+-qm@A?yMo#f'>/]{/sWM2Svgk|ۮyEG}.nnt;9ޱ_{k~5.{߸3˞Q\ȃ?8r'^7.ywuK^XC_|;/ѺW`[S'dO8wk}=f/x׿x?Sg?;/.~'0ZEp/}f3iM3}_k{-uΎoo'Q)qv–اPL.}}|]⚏}g)D-y/I:oU/y3^p.z̉ݿs?r濹_Uyo'={o<:w_]|wQ +aGj{+ާ%{W>oW>@7Ճo}y}_J;&q_޼e7o__]kWޟw޹{w˴5 i"`Kտ!w߹kGYgGdpO|k8.6]?q}>A[A^/-GU}]iKټ%뭯;="Ql ǎow R;/B !}HAB !}HAB !lg\`xyI@p jNռԨw4w(yz f!; `ȰԲF$۬ӕZ4 65*%ݶُö l6; #ANU}>ϧ}' iyğE'NԖbTUE9Sԃ~=rq9ץy~ԮoJD& S V= E^"DC:UFCv:ͤoUUmuol<Ѓ[ۍ d(7KTթzjC] m~V~Hz櫈 >6L~ nJR5թU߰6aĴ'D /}e/f5e(QT"|+ "_bR&5$(XͷݏG>kehOtff˗ng׋]GL4y 螴@vp5i.\Y].:^e* i?A_W{++^MnLO*n~f֥5a6@R:~=c47K j>bA ~~o0h(ZJp UddLvmcMR,d󕙃3BZ RY!;}W6:Ed^Y|w1$~@^*ClZp~(  )~ˀN3)1 $$>V_Ѥ& 0ϧө4w[o6T3MsW@wq'ďw !}HAB !}HAB !}Hu7 bVCGfõX,z͕L g ~ZxV8vFwfC738Bh !٬qڛ ę}+.35Nm.rJa:_ў"s}}TY%$+ Lv@d<5~yT\U9go Y4$-~/$iNJHIlT*ӕl\*y"XPWd'[W]U/ݏ8v'H)*Fϥe^n) ^_|̧/v+ZM_To;CEe#_'x/[+ȴ tҼSPucV0=곅L3$}sa}\M_=}@Qd M4X8+s22iNF/;~򐾧@3FA'C]_&Ilj'KMZѫ B$lǷd2.][VXFÀ0΂b4󈯊㪛jA*1hҢRMn܉jR_=P\MxB;lTHTEXE4Uyax̪m57 #S?gBҒe5uMm0.mL ̰Zlh\>zTs gs'Nb̋I%n[ GTm UՉ+K4ɦן2Gut?JX5qTV4soD~79"a| 睘f 9;e;HM *Fol~l_mrJ4 5@TɆc"#y9d1:ZWP1p!ץ~z,h-o>|aIfаcs蹽Ad!6q)tACo"-$ ҼXT_A`MZbFMb;,f9혷m4 ׶;Qi;k:J&W6dbvXffUQя޽VmҏL7?btlInICWhۀa5\ژlXFN+ ]Y ܍.0&"*!$ !@B Fg\~="ʜbFMb;,f9jybt'-*AmwZvth.C+d~1U;lTG]^6}&ۛs}[ dsU"1J^:+_W 26_ژlX]+N+ ]YqԅԼ1eäX_c>wxiFXiꡗMi)?eRm۸f0k}.:rÍ+ҵrIz0L 4|6Zd E{&#腫g껂tfAA}jD"nB׆mAo|F M2kD/7m9 &Llk~%ڤzt'_䚐 8|!6p鿺3){k4tb㱛d~5R&u]!^5U9d`{+`yRÓKǖ.CեkJopicMn`Vh"ũ2Ś(G]Ŝ }1/&ƺm*Ã>WU'OvxzdSE^WδT3z e3G06wϼ>Z/JnʮVN @zMb 睘qG|l%;HۥMOZڟ@G;e2LWӇuÝ4ꠢ:btf q}߁?cޯC} o|F MkD\šH7f (\?Ti6Q-$FN˛^e"Sٵ˗"Ww&e/s-NQlThΆy=qAt}զʓNu @RĶ{մX @Bbiˀ *9u eEѣ|Kߨ˸p8 -}xky7G6V;bӶM}]g36 bEn)w|&}@lSI$}+'e܏ֱ6vc6Z +9V&+3m&ҽ{P%I,&*,&V)>Riꋤ)Ft: ~4C*^4+wbM5u<2\[RI7<语b9',}bՕ&sębBܼ204߭o615w͚n"x),1H~ ɕnjl^ 09/rU'[ '2vĭđk : iM(u8䀦:O_uKCY0O7 @k6cθ[jl yh /绩f✚/5oN-nѼ{!Ui/5i {< C+KmRv̼(Pi2P+7g FOl=r^7՚;x"jUWx[E4j+܊l6Sm-Ym1糭Vk;~ۘ< ^ /&XtD|\o"]ZQmD|,Dǚt`xW!5-x ͷʶ=OLB_Q8/D˟-qeϼ}zn@#~>/}*^}U'BEڶ-@P5}F kkޞ =ixbk1ryFYpZZٲ3O|>?ݟb2|^ ;z.0IY.qVZ+j4g&# 6}۔up$CT݋'Lk>`+渟Wa W]0]wUa'L34 JųDQ/e>,t2tӃ- AlJyZ㫚bH'L<=h}}?A*1"*x4NZ/qC7Owȧ+6F1O- 41OÍo[$uhp_Czf:}!?5}tPG`i1=hGcI{04ӣmo<L38uὗ;z?oO7_q'Y{'n wc[o;x!QtychȫIXuG:`Z#] ǚ~MB !}HAB !}HABtÐ,z3-zVѼC@ !}Hl&z1G0CVM& 89~#hxz=t'Ҫ@`[I# ҭe\^G.&Ěr1d8Snńy1-POwTv A˘+`jRYZ>6+_E,i2G+bo WCp闱չ6]V9"j۶&n8Rjf51d^UL*~&x-AE~ ah1T{ WZ@iлL[4zJٝfMHG/tʹzcm6-֕J>S3GF$yyU9[+[o3H&ݭo@jC@B!:V+0\ea>OS0\};VÒ@lx !@B>$X@l};| j:Z}UHзW"\.mk@B>$ !@Bީ_n.NxL_snW* 8MÑ[rPܠ?T7`􃄷ӗ_1Jz=镥$@M?zzc:q_}Qi/U3T.4949)fBoAhMĄ=Y m*7^MtF;SOhJW[rΣ= qNl('BꕬR_OOko&#H/C3xIy"{`hr^G8v|=-K?^LZ@$ ҎoCKH />o^'3z !kjZ.}-tj;<ăo m>$ !@B>$ !@B>$ !@B>$ !@BDHXAHF]V>]:GA0q@J*s*@B>$ !@B>l6+N r>VhU,1D>wi>1TLsug՚]eQHz|6  sse͘I59 @M@@x*IkQDr}].oxec΀2kyyyW&Ц] 5oG`wtm,ݼL hok&2g;҇m@Bȉa@B":;2j>$ MHjZ.}#;|;q8 9$dbvСCDy u!c49R  !}HAB !}HAB !}HȖncEMr䪫; ?<.YsӜIENDB`n0^?LH0:PNG  IHDR,ݽKtEXtCreation Time &)btIME %2]( pHYsodDIDATx xD" *"*XV lEWs].rcfga\gQ,uD_y5 n33Vͷia{ť}߼7/+Oca%wpХ:mf(-7#ME&N>I\ycX<2z&#dS!=~%_HuD;yG˚,b P-B0bb}ȼ<)5[y+|޷;s̠kV`:Wڈط)3=A_ٻ)~Ixn cC NƈK2Bj,ܶ&4hb7Vox˸F֐?YϚa]ap#{ӯiy祇XX< uyC lМ[eק#N{-`W'u;ڮ+JcK: ͡rm9kh֬!YʳdDŽB~Sdg' M~ߤ_#NhV9 XԠX8~^헰o'ɯ_Cdf+B=7]woL!<:k۵Isͻ~˵o5ms^/jn;:bcB?&-a-, ?\S ߓa,X˖;jgZf4&vyY>0_ꌺ;~uY0hk?N?SF=W~*Oq, 0K(oiH?gqyH+~kCf tf vY°-&nX02KȊ}[YByI<혉+wqci~ﺣ8P:wz5˟X>_rW}Nܖ)0FHmR+i[UꆺvS? WYƷN'-73.ֳH:U_U眓{$Ί2om~]-9U=r`딟7WK}z>lX(wGϺW `qr awkɆ[Wǐ [cpòʳ&vƆrw/ȸw67Ӣtnfճȉ7w{ h/)޶‰ČH#ukذP.NqtTSC[?_1g*O̘*xp+щ}9qWlXػo=\wG/ҤD][s:6xG5&$$QΧPHL& 1c( Nlo :hވ7PЧhM0ĈFsUʲGXwTL̈~""G '/ l[b B "b B "l %%%R_ Bߓk"=SC0 xxs@@ D1!@@ D1!@E1}Z]MzQlZzqo~!_QX6l]5:]rcmGp7&4]J~v\+j- K(^Fh)eLyTug" ƨ݉);WcB@_[echۙJ:!KM_ԥ$=-E@+>8aQk0Ԁs6I3vr13(cm b B "b B "b-S}<x 0>z z!@@ D1!@@ D1!Ą0o􄔳 r(Ed'@rLǶqGXZj@DD*SOzMU%$%txkT`;h͎Z],R,.~an H?Dvj^/С/$?aaUzrESC:A'*)bAq 2 &O/ nw WKBDkP73)PXB]r]S FsՇTB蠰J< $ %%ZcD+0@iEW3: -ŲGh*0yN(0A gr*+7j2Ѯ8?+Yp^Íc]N[Xsl[b B "b B "F k BO~" R7Cԋ1!@@ D1!xzv4'RSSM)X l&D"4T/b` 끮`Bmu+<;xƄKdj26FNW#Yb B PďJi@,Cpd~^ӭG ΂(BY %$BrR\;%k;K$9Aq$o+tkٔjlmNѣV?ѹII7&DGNTt{j8و *uN"w=Yˆ%BW޴r&4c"-%e~Yw0D$ K=/@{_YQBGB!dMFa1G9O jVB=;"ZDj]#۴amJױyw%>O!{oWYFܮ')&9&c@`شa-7,b}1; Njb$é՟oUd Jjb$5_^Ol Vjb$^e4)>AH2UKdjb$MQr0Ӓ^iX^Cvjb$#>QaM*lܻDjb$OGDh\pj$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j$j2$=ՇƚmJ- A/jb$T{P~(P9pjb$MGIsj^Ps])jb$vmO-jjb$Atu`22@%ojb$h߸}:8ER ?jb$}#WسOQjb$K?~/¦anm9"Pcjb$0^?LH0:Bj 0e0e     A@  A5% 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||S" 3f3ffܘU@U;ʚ;mNʚ;g4QdQdv 0ppp0 <4!d!d` 0L<4dddd` 0L <4BdBd 0L___PPT9{o20}rVC:\Silvano\DIDATTICA\PROGR_OGGETTI\OOP1.htm| 20?  O =0B5#JCL: Input/Output Package (java.io)#~JCL: Files and Streams (1)HJCL: Files and Streams (2)HJCL: Files and Streams (3)HC6JCL: I/O Character Streams" D7JCL: I/O Byte Streams"KTJCL: File Class  Constructors and Methods< ?File An abstract representation of file and directory pathnames.Z;Z;;JCL: File Class - Methods"IJCL: Creating a new directory. FJCL: Reading/Writing charactersV GFileReader and FileWriter can read/write a file one character at a timefH 3 3 3 ~     GJCL: Reading/Writing bytes< MJCL: Data Input/Output Stream"RAn application can use a DataOutputStream to write data that can later be read by a DataInputStream A DataOutputStream lets an application write primitive Java data types to an output stream in a portable way A DataInputStream lets an application read primitive Java data types from an underlying input stream in a machine-independent way|S3+33]3qb+ZqLJCL: Writing data to a StreamVBasic Algorithm Open the file for output by instantiating the appropriate streams Call write methods to transfer data Flush the stream Close the streamPZZ  NJCL: Reading data from a StreamVBasic Algorithm Open the file for input by instantiating the appropriate streams Call read methods to transfer data Close the streamPZuZ u OJCL: Writing text" PJCL: Reading text" QJCL: Object Serialization (1).An object can be converted into a simple stream of bytes in such a way that it can be reconstructed correctly later Once we have such a stream of bytes, we can output it to a file and read it back againZh !   RJCL: Object Serialization (2).import java.io.*; import java.util.*; class Employee implements Serializable { private String name; private double salary; private Date hireDay; public Employee(String n, double s, int year, int month, int day) { name = n; salary = s; GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day); // GregorianCalendar uses 0 for January hireDay = calendar.getTime(); } } class Manager extends Employee { private double bonus; public Manager(String n, double s, int year, int month, int day, double b) { super(n, s, year, month, day); bonus = b; } }2Z                          O  R ( 3f,                    5 \  ?'%"  " 7 SJCL: Object Serialization (3).JCL: File Class (1)JCL: File Class (2)JCL: File Class (3)JCL: File Class (4)JCL: File Class (5),JCL: Writing to a sequential-access file (1)b ,JCL: Writing to a sequential-access file (2)H  ,JCL: Writing to a sequential-access file (3)H  ,JCL: Writing to a sequential-access file (4)H  ,JCL: Writing to a sequential-access file (5)H  ,JCL: Writing to a sequential-access file (6)H  ,JCL: Writing to a sequential-access file (7)H  ,JCL: Writing to a sequential-access file (8)H  ,JCL: Writing to a sequential-access file (9)H  -JCL: Writing to a sequential-access file (10)H  -JCL: Writing to a sequential-access file (11)H  -JCL: Writing to a sequential-access file (12)H  -JCL: Writing to a sequential-access file (13)H  -JCL: Writing to a sequential-access file (14)H  -JCL: Writing to a sequential-access file (15)H  -JCL: Writing to a sequential-access file (16)H  -JCL: Writing to a sequential-access file (17)H  -JCL: Writing to a sequential-access file (18)H  .JCL: Reading from a sequential-access file (1)H  .JCL: Reading from a sequential-access file (2)H  .JCL: Reading from a sequential-access file (3)H  .JCL: Reading from a sequential-access file (4)H  .JCL: Reading from a sequential-access file (5)H   .JCL: Reading from a sequential-access file (6)H   .JCL: Reading from a sequential-access file (7)H   .JCL: Reading from a sequential-access file (8)H   .JCL: Reading from a sequential-access file (9)H  [  ` ` ̙33` 333MMM` ff3333f` f` f` 3>?" dd@3?dd@  " @0` n?" dd@   @@``PR    @ ` ` p>> q i   (    0! h  m9Fare clic per modificare lo stile del titolo dello schema: :9  0#   uFare clic per modificare gli stili del testo dello schema Secondo livello Terzo livello Quarto livello Quinto livello: v  0(*    ^*A  Np-gֳgֳ?"@ ADipartimento di Automatica e Informatica - Politecnico di Torino B B6   %   N1gֳgֳ?"@p  Silvano Rivoira, 2004* 4 ~B   H1?"@  C Axhttp://java.sun.com/docs/white/langenv/HotJava.doc.anc2.gif"`QZB  c $Df"  0d7" OOPB 2  jA.?C:\Silvano\IM\POLI.TIF"0@B  s *@޽h ? ̙33 *Struttura predefinita0 ;(    N$QjKjK ;8  Q n*  I%%IImm  NQjKjK u 8 Q p*  I%%IImmd  c $ ?  QW  NQjKjK  9w Q uFare clic per modificare gli stili del testo dello schema Secondo livello Terzo livello Quarto livello Quinto livello: v   T(QjKjK 0;h  Q n*  I%%IImm   TQjKjK 0u h Q p*  I%%IImmH  06gq ? ̙330 (     NP:QjKjK ;8  Q v* I%%IImm  NHDQjKjK u 8 Q x* I%%IImm  T,?QjKjK 0;h  Q v* I%%IImm  TPVQjKjK 0u h Q x* I%%IImmH  06gq ? ̙33   t!(  tr t S ph    t C A-C:\Silvano\Applicazioni\Java\J2SE\TUTORIAL\figures\essential\19stream.gif@RJ t C A.C:\Silvano\Applicazioni\Java\J2SE\TUTORIAL\figures\essential\20stream2.gif t C A/C:\Silvano\Applicazioni\Java\J2SE\TUTORIAL\figures\essential\21chstream.gif &e  t 0  0  oStream Classes: 2"H t 0@޽h ? ̙33.  ..; ^  B H x 0@޽h ? ̙33  A(  r  S h     0  /Java views a file as a stream of bytes File ends with end-of-file marker or a specific byte number File as a stream of bytes associated with an object Java also associates streams with devices System.in, System.out, and System.err Streams can be redirected File processing with classes in package java.io FileInputStream for byte-based input from a file FileOutputStream for byte-based output to a file FileReader for character-based input from a file FileWriter for character-based output to a file' p * @1 0  'p*  3    3    3  (3"3! 3' 3%t.  "  !   '   & H  0@޽h ? ̙33  S(  r  S h     00 0  ABuffering Improves performance of I/O Copies each output to a region of memory called a buffer Entire buffer output to disk at once One long disk access takes less time than many smaller ones BufferedOutputStream buffers file output BufferedInputStream buffers file input z < P  z<33@     H  0@޽h ? ̙33&  xf(  xr x S (h    x C A0C:\Silvano\Applicazioni\Java\J2SE\TUTORIAL\figures\essential\23reader.gif@P x C A1C:\Silvano\Applicazioni\Java\J2SE\TUTORIAL\figures\essential\24writer.gifH x 0@޽h ? ̙33(  |h(  |r | S ,h    | C A2C:\Silvano\Applicazioni\Java\J2SE\TUTORIAL\figures\essential\25inputs.gif> | C A3C:\Silvano\Applicazioni\Java\J2SE\TUTORIAL\figures\essential\26outputs.gif RH | 0@޽h ? ̙33   N (  L r L S <h   r M S \=@  8 0P   N pP M  TD?"P P  XCreates a new File instance from a parent abstract pathname and a child pathname string.,YG @`  M  TP?"0P  r File (File parent, String child).!33Z!0!0 !0 @`V M  T|I?"P Pz ^Creates a new File instance by converting the given pathname string into an abstract pathname.,_M @` M  THT?"0 P z File (Stringpathname).33. !0!0  @`P M  Ttn?"P zP  XCreates a new File instance from a parent pathname string and a child pathname string.,YE @` M  TTt?"0zP  X"File (Stringparent, Stringchild).#33> !0!0 !0 @` M  Tq?"P d P7 ~6Creates the directory named by this abstract pathname.77 @` M  T?"0d P 7 boolean mkdir ()P@!0  @`" M  Tl?"P Pd  @Deletes the file or directory denoted by this abstract pathname.AA @` M  T@?"0 P d  boolean delete ()P@!0 @` M  Tp?"P 7P  {3Renames the file denoted by this abstract pathname.44 @` M  T?"07P  ^boolean renameTo (File dest)@  h!0!0 @`_ M  T?"P P  }Atomically creates a new, empty file named by this abstract pathname if and only if a file with this name does not yet exist.~~ @` M  T?"0 P  boolean createNewFile ()P@ !0 @`B M  T31 ?"0PB M  N31 ?"0 P B M  T31 ?"0 P B M  N31 ?"P P B M  N31 ?"0d Pd B M  N31 ?"07P7B M  N31 ?"0 P B M  N31 ?"0zPzB M  N31 ?"0 P B M  T31 ?"00 B M  T31 ?"PP B  N B HDo?"0 P H L 0@޽h ? ̙33  (  r  S Dh   l  0A ?? H  0@޽h ? ̙33  ld H (  H r H S h   J H s *U,$D 0 try { File dir; boolean itWorked; dir = new File(  thisDirectory ); if (dir.exists()) { System.out.println(  File exists! ); } else { itWorked = dir.mkdir(); if (itWorked) { System.out.println(  Directory  +  created. ); } } } catch (IOException e) { System.out.println(  I/O exeception ); }q . '-   +*       /  &         ?         H H 0@޽h ? ̙33`     04  (  4 r 4 S h   r 4 S @   4 Hd ?"F- F  o   4 BU?"`Y import java.io.*; public class Copy { public static void main(String[] args) throws IOException { File inputFile = new File(  source.txt ); File outputFile = new File(  destination.txt ); FileReader in = new FileReader(inputFile); FileWriter out = new FileWriter(outputFile); int c; while ((c = in.read()) != -1) out.write(c); in.close(); out.close(); } }  o2         "          +      N j                 H 4 0@޽h ? ̙33   S K @<  (  < r < S !h   R < B:U?" @import java.io.*; public class CopyBytes { public static void main(String[] args) throws IOException { File inputFile = new File(  source.txt ); File outputFile = new File(  destination.txt ); FileInputStream in = new FileInputStream(inputFile); FileOutputStream out = new FileOutputStream(outputFile); int b; while ((b = in.read()) != -1) out.write(b); in.close(); out.close(); } }  o2          "          6  "    R                  < 0I @ wMFileInputStream and FileOutputStream can read/write a file one byte at a time|N 333 t  H < 0@޽h ? ̙33  P\ $(  \ r \ S $Nh   r \ S N   H \ 0@޽h ? ̙33  `T (  T r T S Dah   r T S a@   T s *؎Upl,$D 0 ^,try { FileOutputStream fStream; DataOutputStream writingStream; fStream = new FileOutputStream(  oneFile.bin ); writingStream = new DataOutputStream( fStream ); writingStream.writeDouble( 3.14159 ); writingStream.writeInt( 7 ); writingStream.writeChar(  Z ); writingStream.flush(); writingStream.close(); } catch (IOException e) { System.out.println(  I/O exception ); }. R < :+                                                   H T 0@޽h ? ̙33  ~p` (  ` r ` S h    ` s *hU ,$D 0 > try { double val1; int val2; char val3; FileInputStream fStream; DataInputStream inStream; fStream = new FileInputStream(  oneFile.bin ); inStream = new DataInputStream( fStream ); val1 = inStream.readDouble(); val2 = inStream.readInt(); val3 = inStream.readChar(); inStream.close(); } catch (IOException e) { System.out.println(  I/O exception ); }.  O +                                         ` <d   H ` 0@޽h ? ̙33f     d  (  d r d S h    d s *U0 ,$D 0 try { FileOutputStream fStream; PrintWriter myStream; fStream = new FileOutputStream(  threeLines.txt ); myStream = new PrintWriter( fStream ); myStream.println(  This is line #1. ); myStream.println(  This is line #2. ); myStream.print(  This is the start, ); myStream.println(  and this is the end of line #3. ); myStream.flush(); myStream.close(); } catch (IOException e) { System.out.println(  I/O exception ); }N H."1+                              #    ,           Z d 0T @ NPrintWriter print formatted representations of objects to a text-output stream>O  3C4 >H d 0@޽h ? ̙33   4 , h (  h r h S @h   f h s *U,$D 0 Btry { FileReader fReader; BufferedReader reader; String line; fReader = new FileReader(  threeLines.txt ); reader = new BufferedReader( fReader ); line = reader.readLine(); while ( line != null ) { System.out.println( line ); //echoes input to standard out line = reader.readLine(); } reader.close(); } catch (IOException e) { System.out.println(  I/O exception ); }. T < *3f:+D                   3  >  %       h 0 p DBufferedReader read text from a character-input stream, buffering characters so as to provide for the efficient reading of characters, arrays, and lines> 34H h 0@޽h ? ̙33   l [(  l r l S Hh   r l S hp  /8  p l  p l  TpU?" @ 1A// Write the object out ObjectOutputStream outstream = new ObjectOutputStream(outputStreamObject); outstream.writeObject(theObject); outstream.close(); // Read the object back in ObjectInputStream instream = new ObjectInputStream(inputStreamObject); theObject = (Serializable)instream.readObject(); instream.close();B o3f!_3f j6          l  B?"p p @The class of theObject must implement the Serializable interfaceZA( 2 b cb c b@         B l HD?" P pH l 0@޽h ? ̙33  t R(  t r t S h    t  6HU `  "P@08XH t 0@޽h ? ̙33i     x  (  x r x S Oh     x 0 vU p class ObjectFileTest { public static void main(String[] args) { Manager boss = new Manager( "Carl Cracker" , 80000, 1987, 12, 15); boss.setBonus(5000); Employee[] staff = new Employee[3]; staff[0] = boss; staff[1] = new Employee( "Harry Hacker", 50000, 1989, 10, 1); staff[2] = new Employee( "Tony Tester" , 40000, 1990, 3, 15); try { // save all employee records to the file employee.dat ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("employee.dat")); out.writeObject(staff); out.close(); // retrieve all records into a new array ObjectInputStream in = new ObjectInputStream(new FileInputStream("employee.dat")); Employee[] newStaff = (Employee[])in.readObject(); in.close(); // print the newly read employee records for (int i = 0; i < newStaff.length; i++) System.out.println(newStaff[i]); } catch (Exception e) { e.printStackTrace(); } } }80Z   -             5  4                              6 3f       > ) 3f      X ) 3f     ("&"d+ d   L    S #3 P@08XH x 0@޽h ? ̙33  5(  r  S lyh   8 0 0%   6$׈ 0 1 // FileTest.java 2 // Demonstrating the File class. 3 import java.awt.*; 4 import java.awt.event.*; 5 import java.io.*; 6 import javax.swing.*; 7 8 public class FileTest extends JFrame 9 implements ActionListener { 10 11 private JTextField enterField; 12 private JTextArea outputArea; 13 14 // set up GUI 15 public FileTest() 16 { 17 super( "Testing class File" ); 18 19 enterField = new JTextField( "Enter file or directory name here" ); 20 enterField.addActionListener( this ); 21 outputArea = new JTextArea(); 22 23 ScrollPane scrollPane = new ScrollPane(); 24 scrollPane.add( outputArea ); 25 ` g ___g g g ___ g g g ___g g g ___g g g ___g g g ___g g g ___g g ___g g g g g g g ___g g g g ___g g ___g g g g ___g g g g ___g g ___g g g g ___g g g g ___g g ___g g g g g g ___g g ___g g g #g g g ___$g g g g ___g g g g ___g g ___g g g g ___$g g ___G .   A        &           3  L      5                       @ P P*  HD?"P Import java.io package<( 2bc b&    B  ND?"H  0@޽h ? ̙33    #(  r  S X h   q8 @    6(׈  .26 Container container = getContentPane(); 27 container.add( enterField, BorderLayout.NORTH ); 28 container.add( scrollPane, BorderLayout.CENTER ); 29 30 setSize( 400, 400 ); 31 setVisible( true ); 32 33 } // end constructor 34 35 // display information about file user specifies 36 public void actionPerformed( ActionEvent actionEvent ) 37 { 38 File name = new File( actionEvent.getActionCommand() ); 39 40 // if name exists, output information about it 41 if ( name.exists() ) { 42 outputArea.setText( name.getName() + " exists\n" + 43 ( name.isFile() ? "is a file\n" : "is not a file\n" ) + 44 ( name.isDirectory() ? "is a directory\n" : 45 "is not a directory\n" ) + 46 ( name.isAbsolute() ? "is absolute path\n" : 47 "is not absolute path\n" ) + "Last modified: " + 48 name.lastModified() + "\nLength: " + name.length() + 49 "\nPath: " + name.getPath() + "\nAbsolute path: " + 50 name.getAbsolutePath() + "\nParent: " + name.getParent() ); g ___.g g ___.g g g g ___.g g g g ___g g ___g g g g g g ___g g g g ___g g ___g g g g ___g g ___g 0g g g ___g g g g ,g g ___g g ___g g )g g ___g g ___g .g g g ___g g g g ___.g g g g ___g g g g g g ___#g g g g ___g g g g ___"g g g g ___g g g g g g ___"g g g g ___ g g g g g g ___%g g g G "        %               0     z       -  D   c   {     *        #         !  H?"P 'create a new File and assign it to name<(( 2 bcb ( B B ND?"0 4  Hx?"` @  :Body of if outputs information about the file if it exists<;( 2bc1b ; B  B ND?" ` H  0@޽h ? ̙33   @F(  r  S $h   8 0@` @0`r   <׈ 0@B` 52 // output information if name is a file 53 if ( name.isFile() ) { 54 55 // append contents of file to outputArea 56 try { 57 BufferedReader input = new BufferedReader( 58 new FileReader( name ) ); 59 StringBuffer buffer = new StringBuffer(); 60 String text; 61 outputArea.append( "\n\n" ); 62 63 while ( ( text = input.readLine() ) != null ) 64 buffer.append( text + "\n" ); 65 66 outputArea.append( buffer.toString() ); 67 } 68 69 // process file processing problems 70 catch ( IOException ioException ) { 71 JOptionPane.showMessageDialog( this, "FILE ERROR", 72 "FILE ERROR", JOptionPane.ERROR_MESSAGE ); 73 } 74 75 } // end ifJ g ___ g 'g g g ___ g g g g ___g g ___ g (g g g ___ g g g g ___&g g g g ___g g %g g ___%g g g g ___g g ___"g g g g ___g g ___g g "g g g g ___(g g g g ___g g ___7g g ___g g ___g g ___ g #g g g ___ g g g g ___.g g g g g g ___g g g g g g ___g g ___g g ___ g g G P  >   .        /      ;   I  e     q       <   H   Ht?"t jTest if our object is a file( 2b  B  ND?" 0  H?"p x*Create reader to gather data from the file+( 2+b + B   ND?"p0   HLw?"P  z,Read text until there is no more in the file-( 2-b - B   ND?" H  0@޽h ? ̙33  wo  (  r  S 'h   E8 `@  `@  6@J׈ `r R77 // output directory listing 78 else if ( name.isDirectory() ) { 79 String directory[] = name.list(); 80 81 outputArea.append( "\n\nDirectory contents:\n"); 82 83 for ( int i = 0; i < directory.length; i++ ) 84 outputArea.append( directory[ i ] + "\n" ); 85 } 87 } // end outer if 88 89 // not file or directory, output error message 90 else { 91 JOptionPane.showMessageDialog( this, 92 actionEvent.getActionCommand() + " Does Not Exist", 93 "ERROR", JOptionPane.ERROR_MESSAGE ); 94 } 96 } // end method actionPerformed 97 98 public static void main( String args[] ) 99 { 100 FileTest application = new FileTest(); 101 application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 102 } 103 } // end class FileTest~ g ___ g g g g ___ g g g g g g ___.g g ___g g ___g g g g ___g g ___ g g g g g g g g ___3g g g g ___ g g ___g g ___g g g g ___g g ___g .g g g ___g g g g ___(g g g g ___-g g g g ___ g g g g g g ___g g ___g g g g ___g g ___g g g g g g g g ___g g ___g g g g ___,g g g g ___g g ___g g ___g g G I   W       2  9             3   @  1          1     H K?"$  s%If file does not exist, display error&( 2&b & B B ND?" d0   H?"`l@ v(Get a list of the files in the directory)( 2)b ) B   ND?" `,H  0@޽h ? ̙33  >6(  r  S h     C bAJC:\Java5e\powerpoint\ch17\17_05a.pngP   C bAJC:\Java5e\powerpoint\ch17\17_05b.png`  H  0@޽h ? ̙33    0 (  r  S  h   i8 P  P3  6a׈  1 // BankUI.java 2 // A reusable GUI for the examples in this chapter. 3 package com; 4 5 import java.awt.*; 6 import javax.swing.*; 7 8 public class BankUI extends JPanel { 9 10 // label text for GUI 11 protected final static String names[] = { "Account number", 12 "First name", "Last name", "Balance", "Transaction Amount" }; 13 14 // GUI components; protected for future subclass access 15 protected JLabel labels[]; 16 protected JTextField fields[]; 17 protected JButton doTask1, doTask2; 18 protected JPanel innerPanelCenter, innerPanelSouth; 19 20 protected int size; // number of text fields in GUI 21 22 // constants representing text fields in GUI 23 public static final int ACCOUNT = 0, FIRSTNAME = 1, LASTNAME = 2, 24 BALANCE = 3, TRANSACTION = 4; 25  g ___g g g ___3g g g ___g g g ___g g ___g g g ___g g g ___g g ___g g g g g g g ___g g ___g g g g ___g g g g g g g g g g ___g g g g g g g g g g ___g g ___g 7g g g ___g g g g ___g g g g ___g g g g ___g g +g g ___g g ___g g g g g g g g ___g g ___g ,g g g ___g g g g g g g g g g g g g g g g g g g g g g ___g g g g g g g g g g ___G L   p    &            %        Y   H$q?"@p ~ w)Bank GUI for all examples in this chapter*( 2*b * B  ND?" 0@`  HXu?"p P  4These buttons will perform actions in later examples5( 25b 5 B  B ND?" p    Hy?"` w)Compile this class in a package for reuse*( 2*b * B   ND?"0 ^H  0@޽h ? ̙33  zr0 (  r  S h   X  6<ܘ  26 // Set up GUI. Constructor argument size determines the number of 27 // rows of GUI components. 28 public BankUI( int mySize ) 29 { 30 size = mySize; 31 labels = new JLabel[ size ]; 32 fields = new JTextField[ size ]; 33 34 // create labels 35 for ( int count = 0; count < labels.length; count++ ) 36 labels[ count ] = new JLabel( names[ count ] ); 37 38 // create text fields 39 for ( int count = 0; count < fields.length; count++ ) 40 fields[ count ] = new JTextField(); 41 42 // create panel to lay out labels and fields 43 innerPanelCenter = new JPanel(); 44 innerPanelCenter.setLayout( new GridLayout( size, 2 ) ); 45 46 // attach labels and fields to innerPanelCenter 47 for ( int count = 0; count < size; count++ ) { 48 innerPanelCenter.add( labels[ count ] ); 49 innerPanelCenter.add( fields[ count ] ); 50 }  g ___g Ag g g ___g g g g ___g g g g g g ___g g ___g g ___g g g g ___g g g g ___g g ___g g g g ___g g g g g g #g g ___g g g g ___ g g ___g g g g ___g g g g g g #g g ___g g g g ___g g ___g ,g g g ___g g g g ___"g g g g g g ___g g ___g /g g g ___g g g g g g g g ___2g g ___2g g ___g g ___g G      !    #   @  R  [  R   P            A    5  (  1 H  0@޽h ? ̙33i  @(  r  S ,h   8 @ P   6tGܘ @R  52 // create generic buttons; no labels or event handlers 53 doTask1 = new JButton(); 54 doTask2 = new JButton(); 56 // create panel to lay out buttons and attach buttons 57 innerPanelSouth = new JPanel(); 58 innerPanelSouth.add( doTask1 ); 59 innerPanelSouth.add( doTask2 ); 61 // set layout of this container and attach panels to it 62 setLayout( new BorderLayout() ); 63 add( innerPanelCenter, BorderLayout.CENTER ); 64 add( innerPanelSouth, BorderLayout.SOUTH ); 66 validate(); // validate layout 68 } // end constructor 69 70 // return reference to generic task button doTask1 71 public JButton getDoTask1Button() 72 { 73 return doTask1; 74 } 75 76 // return reference to generic task button doTask2 77 public JButton getDoTask2Button() 78 { 79 return doTask2; 80 } g ___g 6g g g ___g g g g ___g g g g ___g 5g g g ___g g g g ___&g g ___&g g ___g 7g g g ___g g g g ___*g g g g ___)g g g g ___g g ___g g g g ___g g g g ___g g ___g 2g g g ___g g g g ___g g ___g g g g ___g g ___g g ___g 2g g g ___g g g g ___g g ___g g g g ___g G |]    S        a                    I B  ND?"  B B ND?"   H|U?"`   eReturn the task buttons( 2b  H  0@޽h ? ̙33:  Pz(  r  S Zh      6аܘ  b |82 // return reference to fields array of JTextFields 83 public JTextField[] getFields() 84 { 85 return fields; 86 } 87 88 // clear content of text fields 89 public void clearFields() 90 { 91 for ( int count = 0; count < size; count++ ) 92 fields[ count ].setText( "" ); 93 } 94 95 // set text field values; throw IllegalArgumentException if 96 // incorrect number of Strings in argument 97 public void setFieldValues( String strings[] ) 98 throws IllegalArgumentException 99 { 100 if ( strings.length != size ) 101 throw new IllegalArgumentException( "There must be " + 102 size + " Strings in the array" ); 103 104 for ( int count = 0; count < size; count++ ) 105 fields[ count ].setText( strings[ count ] ); 106 } h} g ___g 2g g g ___g g g g ___g g ___g g g g ___g g ___g g ___g g g g ___g g g g g g ___g g ___g g g g g g g g ___"g g g g ___g g ___g g ___g ;g g g ___g *g g g ___g g g g $g g ___g g g g ___g g ___g g g g ___ g g g g g g g g ___g g g g ___g g ___g g g g g g g g ___6g g ___g G D0         |      C  C  M  (  M  _  B  ! H  0@޽h ? ̙33  _W`(  r  S h   =  6ܘ   q107 108 // get array of Strings with current text field contents 109 public String[] getFieldValues() 110 { 111 String values[] = new String[ size ]; 112 113 for ( int count = 0; count < size; count++ ) 114 values[ count ] = fields[ count ].getText(); 115 116 return values; 117 } 118 119 } // end class BankUI r g ___g g ___g 8g g g ___g g g g ___g g ___g g g g ___g g ___g g g g g g g g ___6g g ___g g ___g g g g ___g g ___g g ___g g g G h_  V  U  H  H  0@޽h ? ̙33p   p  (  r  S  h   8 p  p@   6(ܘ  [ '1 // AccountRecord.java 2 // A class that represents one record of information. 3 package com; 5 import java.io.Serializable; 6 7 public class AccountRecord implements Serializable { 8 private int account; 9 private String firstName; 10 private String lastName; 11 private double balance; 12 13 // no-argument constructor calls other constructor with default values 14 public AccountRecord() 15 { 16 this( 0, "", "", 0.0 ); 17 } 18 19 // initialize a record 20 public AccountRecord( int acct, String first, String last, double bal ) 21 { 22 setAccount( acct ); 23 setFirstName( first ); 24 setLastName( last ); 25 setBalance( bal ); 26 } h( g ___g g g ___5g g g ___g g g ___g g ___g g g ___g g ___g g g g g g g ___g g g g g g ___g g g g ___g g g g ___g g g g g g ___g g ___g Fg g g ___g g g g ___g g ___g g g g g g g g g g g g ___g g ___g g ___g g g g ___g g g g "g g g g ___g g ___g g ___g g ___g g ___g g ___g g ___G     m              "        w     F               HH?"t w)Compile this class in a package for reuse*( 2*b * B  ND?"@   H0?"@p TImplements Serializable so AccountRecords can be used with input and output streamsZU( 2 b cb c-b@      + B   ND?"ppH  0@޽h ? ̙33   ; 3  (  r  S 9h      6;ܘ pa 28 // set account number 29 public void setAccount( int acct ) 30 { 31 account = acct; 32 } 33 34 // get account number 35 public int getAccount() 36 { 37 return account; 38 } 39 40 // set first name 41 public void setFirstName( String first ) 42 { 43 firstName = first; 44 } 45 46 // get first name 47 public String getFirstName() 48 { 49 return firstName; 50 } 51  g ___g g g g ___g g g g g g g g ___g g ___g g ___g g ___g g ___g g g g ___g g g g g g ___g g ___g g g g ___g g ___g g ___g g g g ___g g g g g g ___g g ___g g ___g g ___g g ___g g g g ___g g g g ___g g ___g g g g ___g g ___g 7     s  u   (   Q   #    H  0@޽h ? ̙33     6 (  r  S h      6ܘ   &52 // set last name 53 public void setLastName( String last ) 54 { 55 lastName = last; 56 } 57 58 // get last name 59 public String getLastName() 60 { 61 return lastName; 62 } 63 64 // set balance 65 public void setBalance( double bal ) 66 { 67 balance = bal; 68 } 69 70 // get balance 71 public double getBalance() 72 { 73 return balance; 74 } 75 76 } // end class AccountRecord ' g ___g g g g ___g g g g g g ___g g ___g g ___g g ___g g ___g g g g ___g g g g ___g g ___g g g g ___g g ___g g ___g g g g ___g g g g g g g g ___g g ___g g ___g g ___g g ___g g g g ___g g g g g g ___g g ___g g g g ___g g ___g g ___g g g G 2   '  O   "  G   y   T  H  0@޽h ? ̙33N   0 z(  r  S h   8 p  p  <@ܘ p "1 // CreateSequentialFile.java 2 // Writing objects sequentially to a file with class ObjectOutputStream. 3 import java.io.*; 4 import java.awt.*; 5 import java.awt.event.*; 6 import javax.swing.*; 8 import com.BankUI; 9 import com.AccountRecord; 10 11 public class CreateSequentialFile extends JFrame { 12 private ObjectOutputStream output; 13 private BankUI userInterface; 14 private JButton enterButton, openButton; 16 // set up GUI 17 public CreateSequentialFile() 18 { 19 super( "Creating a Sequential File of Objects" ); 20 21 // create instance of reusable user interface 22 userInterface = new BankUI( 4 ); // four textfields 23 getContentPane().add( userInterface, BorderLayout.CENTER ); 24 25 // configure button doTask1 for use in this program 26 openButton = userInterface.getDoTask1Button(); 27 openButton.setText( "Save into File ..." );R g ___g g g ___Hg g g ___g g g ___g g g ___g g g ___g g g ___g g ___g g g ___g g g ___g g ___g g g g g g g ___g g g g ___g g g g ___g g !g g ___g g ___g g g g ___g g g g ___g g ___g g g 'g g g ___g g ___g -g g g ___g g g g g g g g ___8g g g g ___g g ___g 3g g g ___5g g ___g g g G    B                             *                   d      !        H1?" s%Import our GUI class and record class&( 2&b & B B ND?" B  H5?"   ACreate our interface and get a reference to the first task buttonB( 2Bb B B  B ND?"P B  B ND?" ` H  0@޽h ? ̙33y  )!(  r  S  *h   8 0    6(ܘ 0B p 28 29 // register listener to call openFile when button pressed 30 openButton.addActionListener( 31 32 // anonymous inner class to handle openButton event 33 new ActionListener() { 34 35 // call openFile when button pressed 36 public void actionPerformed( ActionEvent event ) 37 { 38 openFile(); 39 } 40 41 } // end anonymous inner class 42 43 ); // end call to addActionListener 44 45 // configure button doTask2 for use in this program 46 enterButton = userInterface.getDoTask2Button(); 47 enterButton.setText( "Enter" ); 48 enterButton.setEnabled( false ); // disable button 49 50 // register listener to call addRecord when button pressed 51 enterButton.addActionListener( 52  g ___g g ___g 9g g g ___$g g ___g g ___ g 3g g g ___ g g g g ___g g ___ g $g g g ___ g g g g &g g ___g g ___g g ___g g ___g g ___ g g g g ___g g ___ g g g g ___g g ___g 3g g g ___6g g ___g g g g ___g g g g g g ___g g ___g :g g g ___%g g ___g G 0  !     ;     &  3     2  r  T      !           N   !       9  HH?"0`  ,$D0 w)Get a reference to the second task button*( 2*b * B  ND?"0 0 H  0@޽h ? ̙33u  % (  r  S ̝h      6'ܘ @` 53 // anonymous inner class to handle enterButton event 54 new ActionListener() { 55 56 // call addRecord when button pressed 57 public void actionPerformed( ActionEvent event ) 58 { 59 addRecord(); 60 } 62 } // end anonymous inner class 64 ); // end call to addActionListener 65 66 // register window listener to handle window closing event 67 addWindowListener( 68 69 // anonymous inner class to handle windowClosing event 70 new WindowAdapter() { 71 72 // add current record in GUI to file, then close file 73 public void windowClosing( WindowEvent event ) 74 { 75 if ( output != null ) 76 addRecord(); 78 closeFile(); 79 }J g ___ g 4g g g ___ g g g g ___g g ___ g %g g g ___ g g g g &g g ___g g ___g g ___ g g ___g g ___ g g g ___g g ___ g g g g ___g g ___g :g g g ___g g ___g g ___ g 6g g g ___ g g g g ___g g ___ g 5g g g ___ g g g g $g g ___g g ___g g g g g g ___g g ___g g ___g g ___ g G x2     &   3     2   g  [  ;      r      `       H  0@޽h ? ̙33  y (  r  S +h   =   6Gܘ p@ W81 } // end anonymous inner class 82 83 ); // end call to addWindowListener 84 85 setSize( 300, 200 ); 86 setVisible( true ); 87 88 } // end CreateSequentialFile constructor 89 90 // allow user to specify file name 91 private void openFile() 92 { 93 // display file dialog, so user can choose file to open 94 JFileChooser fileChooser = new JFileChooser(); 95 fileChooser.setFileSelectionMode( JFileChooser.FILES_ONLY ); 96 97 int result = fileChooser.showSaveDialog( this ); 98 99 // if user clicked Cancel button on dialog, return 100 if ( result == JFileChooser.CANCEL_OPTION ) 101 return; 102 103 File fileName = fileChooser.getSelectedFile(); // get selected file vX g ___ g g g g ___g g ___ g g g g ___g g ___g g g g g g ___g g g g ___g g ___g 'g g g ___g g ___g "g g g ___g g g g g g ___g g ___g 8g g g ___!g g g g ___(g g g g ___g g ___g g &g g g g ___g g ___g 2g g g ___g g g g g g ___ g g g g ___g g ___5g g g ___g G S       #  V  _             (        i   <        " z  V   z ,$D0o  B4<?"V 7Instantiate a JFileChooser and assign it to fileChooserL8( 2b cb c@       B B HD?" Dz p@   ,$D0,  Bȇ?"p  8Constant FILES_ONLY indicates only files can be selected<9( 2 b c&b 9 B  B HD?" 0@   H|?"   !CMethod showSaveDialog causes the JFileChooser titled Save to appearzD( 2bc b cbc b@       B   ND?"p ` H  0@޽h ? ̙33  nf(  r  S L/h   @8 0  0 n  6ܘ 0 105 // display error if invalid 106 if ( fileName == null || fileName.getName().equals( "" ) ) 107 JOptionPane.showMessageDialog( this, "Invalid File Name", 108 "Invalid File Name", JOptionPane.ERROR_MESSAGE ); 109 110 else { 111 112 // open file 113 try { 114 output = new ObjectOutputStream( 115 new FileOutputStream( fileName ) ); 116 117 openButton.setEnabled( false ); 118 enterButton.setEnabled( true ); 119 } 120 121 // process exceptions from opening file 122 catch ( IOException ioException ) { 123 JOptionPane.showMessageDialog( this, "Error Opening File", 124 "Error", JOptionPane.ERROR_MESSAGE ); 125 } 126 127 } // end else 128 129 } // end method openFile h g ___g g g g ___g g g g g g g g ___(g g g g g g ___ g g g g g g ___g g ___g g g g ___g g ___ g g g g ___ g g g g ___g g g g ___g g !g g ___g g ___#g g g g ___$g g g g ___ g g ___g g ___ g 'g g g ___ g g g g ___+g g g g g g ___g g g g g g ___g g ___g g ___g g g g ___g g ___g g g G 8             D   }                   l       <   g     H?"` : `Open selected file( 2b  B B ND?"`PH  0@޽h ? ̙33    (  r  S  h   i8 0@P`  @0P`   68ܘ 0@B` + 131 // close file and terminate application 132 private void closeFile() 133 { 134 // close file 135 try { 136 output.close(); 137 System.exit( 0 ); 138 } 139 140 // process exceptions from closing file 141 catch( IOException ioException ) { 142 JOptionPane.showMessageDialog( this, "Error closing file", 143 "Error", JOptionPane.ERROR_MESSAGE ); 144 System.exit( 1 ); 145 } 146 147 } // end method closeFile 148 149 // add record to file 150 public void addRecord() 151 { 152 int accountNumber = 0; 153 AccountRecord record; 154 String fieldValues[] = userInterface.getFieldValues();  g ___g (g g g ___g g g g g g ___g g ___g g g g ___g g g g ___g g ___g g g g ___g g ___g g ___g (g g g ___g g g g ___(g g g g g g ___ g g g g g g ___g g g g ___g g ___g g ___g g g g ___g g ___g g g g ___g g g g g g ___g g ___g g g g g g ___g g ___<g g ___g G NF          9   ]   9                  <  HD?"T (Method closeFile closes the current file<)( 2b cb&    B  ND?" p  Hh?"p Pt  Get the data in the textfields( 2b&    B  B ND?" pH  0@޽h ? ̙33*    Z(  r  S h   8 ppP  ppP  6 ܘ pp 3U156 // if account field value is not empty 157 if ( ! fieldValues[ BankUI.ACCOUNT ].equals( "" ) ) { 158 159 // output values to file 160 try { 161 accountNumber = Integer.parseInt( 162 fieldValues[ BankUI.ACCOUNT ] ); 163 164 if ( accountNumber > 0 ) { 166 // create new record 167 record = new AccountRecord( accountNumber, 168 fieldValues[ BankUI.FIRSTNAME ], 169 fieldValues[ BankUI.LASTNAME ], 170 Double.parseDouble( fieldValues[ BankUI.BALANCE ] ) ); 172 // output record and flush buffer 173 output.writeObject( record ); 174 output.flush(); 175 } 177 else { 178 JOptionPane.showMessageDialog( this, 179 "Account number must be greater than 0", 180 "Bad account number", JOptionPane.ERROR_MESSAGE ); 181 } V g ___g &g g g ___g g g g g g g g ___g g ___ g g g g ___ g g g g ___.g g ___g g g g ___g g ___ g g g g g g ___g g g g ___g g .g g ___g g g g ___g g g g ___3g g g g ___g !g g g ___-g g ___.g g ___g g ___ g g g g ___/g g g g ___g 'g g g ___g g g g g g ___ g g ___D     n           *   S      (     ;     B        a        w   &   Hh   8 p@P` @pP`   68ܘ p@` _ 25 // get reference to generic task button doTask1 from BankUI 26 openButton = userInterface.getDoTask1Button(); 27 openButton.setText( "Open File" ); 28 29 // register listener to call openFile when button pressed 30 openButton.addActionListener( 31 32 // anonymous inner class to handle openButton event 33 new ActionListener() { 34 35 // close file and terminate application 36 public void actionPerformed( ActionEvent event ) 37 { 38 openFile(); 39 } 41 } // end anonymous inner class 42 43 ); // end call to addActionListener 44 45 // register window listener for window closing event 46 addWindowListener( 47 48 // anonymous inner class to handle windowClosing event 49 new WindowAdapter() {  g ___g ;g g g ___5g g ___g g g g ___g g ___g 9g g g ___$g g ___g g ___ g 3g g g ___ g g g g ___g g ___ g 'g g g ___ g g g g &g g ___g g ___g g ___ g g ___g g ___ g g g g ___g g ___ g g g g ___g g ___g 4g g g ___g g ___g g ___ g 6g g g ___ g g g G A         !     A  !     ;     d     2  p  [  ;         Hl?"pPt v(Get a reference to the first task button)( 2)b ) B B ND?" pH  0@޽h ? ̙33  `(  r  S h   a8 pa pax   6 ܘ pa f51 // close file and terminate application 52 public void windowClosing( WindowEvent event ) 53 { 54 if ( input != null ) 55 closeFile(); 56 57 System.exit( 0 ); 58 } 59 60 } // end anonymous inner class 61 62 ); // end call to addWindowListener 63 64 // get reference to generic task button doTask2 from BankUI 65 nextButton = userInterface.getDoTask2Button(); 66 nextButton.setText( "Next Record" ); 67 nextButton.setEnabled( false ); 68 69 // register listener to call readRecord when button pressed 70 nextButton.addActionListener( 71 72 // anonymous inner class to handle nextRecord event 73 new ActionListener() { 74 g g ___ g 'g g g ___ g g g g $g g ___g g ___g g g g g g ___g g ___g g ___g g g g ___g g ___g g ___ g g g g ___g g ___ g g g g ___g g ___g ;g g g ___5g g ___g g g g ___g g g g ___g g ___g ;g g g ___$g g ___g g ___ g 3g g g ___ g g g g ___g G X      _     I         !           >   !     ;         H?"   w)Get a reference to the second task button*( 2*b * B  ND?"p 4 H  0@޽h ? ̙33  <4p  (   r   S h   8 @  @\    6/( 2bcb / B $ ND?"` $ H?"@ dRetrieve selected file( 2b  B  $ ND?"`@  $ H?"   `Open selected file( 2b  B  $ ND?"  H $ 0@޽h ? ̙33&  (Z(  (r ( S $h   8  (,  ( 6/ܘ  J129 } // end else 130 131 } // end method openFile 132 133 // read record from file 134 public void readRecord() 135 { 136 AccountRecord record; 137 138 // input the values from the file 139 try { 140 record = ( AccountRecord ) input.readObject(); 141 142 // create array of Strings to display in GUI 143 String values[] = { String.valueOf( record.getAccount() ), 144 record.getFirstName(), record.getLastName(), 145 String.valueOf( record.getBalance() ) }; 146 147 // display record contents 148 userInterface.setFieldValues( values ); 149 } 150 151 // display message when end-of-file reached 152 catch ( EOFException endOfFileException ) { 153 nextButton.setEnabled( false ); K g ___g g g g ___g g ___g g g g ___g g ___g g g g ___g g g g g g ___g g ___g g ___g g ___g !g g g ___g g g g ___8g g ___g g ___ g ,g g g ___Dg g ___9g g ___5g g ___g g ___ g g g g ___1g g ___g g ___g g ___g +g g g ___g g 'g g ___ g g g G 7  <      f       n                   E     i           ( HXD?" <Method readObject reads an Object from the ObjectInputStreamj=( 2b c bc bc@      B (B ND?"@H ( 0@޽h ? ̙33  ,$(  ,r , S 8Nh   r8 p@0a ,@p0aR , 63ܘ p@ra 155 JOptionPane.showMessageDialog( this, "No more records in file", 156 "End of File", JOptionPane.ERROR_MESSAGE ); 157 } 159 // display error message if class is not found 160 catch ( ClassNotFoundException classNotFoundException ) { 161 JOptionPane.showMessageDialog( this, "Unable to create object", 162 "Class Not Found", JOptionPane.ERROR_MESSAGE ); 163 } 165 // display error message if cannot read due to problem with file 166 catch ( IOException ioException ) { 167 JOptionPane.showMessageDialog( this, 168 "Error during read from file", 169 "Read Error", JOptionPane.ERROR_MESSAGE ); 170 } 172 } // end method readRecord 173 174 // close file and terminate application 175 private void closeFile() 176 { 177 // close file and exit 178 try { 179 input.close(); 180 System.exit( 0 ); 181 } h g ___(g g g g g g ___ g g g g g g ___g g ___g .g g g ___g g 5g g ___(g g g g g g ___ g g g g g g ___g g ___g @g g g ___g g g g ___(g g g g ___ g g g g ___ g g g g g g ___g g ___g g ___g g g g ___g g ___g 'g g g ___g g g g g g ___g g ___g g g g ___g g g g ___g g ___g g g g ___g G f     C   l -      G   ~       W   8   L    < , H?"P 0D  (Method closeFile closes the current file<)( 2b cb&    B , ND?" P H , 0@޽h ? ̙33g     0 (  0r 0 S h   c 0 6Eܘ 0B  183 // process exception while closing file 184 catch ( IOException ioException ) { 185 JOptionPane.showMessageDialog( this, "Error closing file", 186 "Error", JOptionPane.ERROR_MESSAGE ); 187 188 System.exit( 1 ); 189 } 190 191 } // end method closeFile 192 193 public static void main( String args[] ) 194 { 195 new ReadSequentialFile(); 196 } 197 198 } // end class ReadSequentialFile g ___g 'g g g ___g g g g ___(g g g g g g ___ g g g g g g ___g g ___g g g g ___g g ___g g ___g g g g ___g g ___g g g g g g g g ___g g ___g g g g ___g g ___g g ___g g G F       8   c   /    (    0 C bAJC:\Java5e\powerpoint\ch17\17_10a.png H 0 0@޽h ? ̙33  >64(  4r 4 S h    4 C bAJC:\Java5e\powerpoint\ch17\17_10b.pngP8V  4 C bAJC:\Java5e\powerpoint\ch17\17_10c.png ` hH 4 0@޽h ? ̙33-x} |dspSJ"x À@ REds$7H"-mVj+ZKmmU>;ݜN>gwoA﨨0Vԗm*sXPe[[f*|LꐐTl |Q(888|88@ M`-`0m`p08 FHh`p,0ȺI8` jZ8"hg3p.ZR|.ZסRB]LRM ]TZ͓=Ht2Yd ǖy;\~T _ݒiYsWg}@P=MC t+}]=u|w@fCtBaOmi՛]'RN.8=Q'tUW~t'{?1P)@K.=-~el7-FOl=)I~*ݑZGw1~ p 5*峬$r0HUpX^nB@{3{ngP;b ! )iBI|lu*`{bóM-MWxV(; r'r*,k8pr }( ۅgA|aAk#ySIF8ẴuSq(bD< ?ReAf_oDP}lHH:IW>|o?묳ȇf9&"\\ UZ8&KbIkOű8u\~.8ϊ!17fX7R u :)TLuz")+W8Jqe<9j:zFL2*e5\W=sXCZ'%|E6P\i\KecvH\cYOe_ZO׻p mϱffC|t|ͯGs6\T S( ăqۨ~ql%=\~TncEcTvTQVr6<ݼ˽ZhsKTJ"3S uZwXEg-9gGV?#ø6gF͑U-Ct]㝥ŸZA{|h,'i-Ł:%S3QOMe8B*{&`0&a<atO'g9ɏdv&crZSt2r6K9x](h;ŢŎg:4(w\\CUu'1U LJKh6TI< ՗u.ugpOsr8FcKU^|%,)0UҍoB7MxKy&:Lb%8]uH[5Fb)a*q\#yiI"_ ,)t@ Z_νGG-n#?*b f@|1,lI3a5ܟ)GKjv2S%.y=c%.bE$ҬW$IUƲCCp"o;}!NL2ʚ 5y.#2"mI#c*oڨ6Ԟ]H3bb1똯W'%~/g72.//,7ml[vZvEUBwQֳKs\jb5xTYݣQ크z JYqIvK/,M u~w`:0B9T7]Vۗ`~RQ]%3Jd^u5ARZXO$G`:Rﻹ#J9wc{IFn$nzx UyϺ6f,ysMZ,,25)UZ&{fs-W$En=n %O`)e)Y ?]gټ 7BRED[Gu4 w@3KoiF*4;58V70ʾ {=^>kdoy6Y+WWJ=L7J_j44CMEtn[<0ڮivzBmeUpNe۔.K:M҇OLL| /BKDAђt]3MKOV`9Cm Pu?oRiMlD7+)2L ZX}6ˬL%- C&t>!U;NqTnrx-8JgˤL[`s(*R|jR$ =NK<㕆Gu^RdN ^I1J}D[YjZXak$J-6&Uw~VIVe^݋ԙ$zoDcwƦe\ 9VsiRBd޴fCYfiq݋y?gp9-$iy@#_gҺµ6Wc U>Xsjۦ7ۤ`*ZjB%KYb]bhZ8c#Iڬ]eډ,M4OAҦ5wy. *άW0]֚& =]KmNL yZqC,3gN?$VWODƐߣ"J$mfI҄"# s{:%5\j#9GH:Z1akBhV$5;꧱EtߖMV3֬kz~vigAO5J̞E)؈l#..wita3Bj^S ղasFM"RIH!Zzь15nhtFpkXtdLNIO,nJD/LmXiFH]+װ"-'J[@,}bK=KB$iqbYWV%E+=ϵ#KkTyZ,X`_#"Kke@WFir$k&H*DpM쑕""WֈI3dh٦[$/ɗ'ǐ1vB7%ſJM=+IkIEwgKW%=EbBt$3VÑEj]pafjy=&Yf3m(x˥+cMI⯗eyf&oHMf.%I4"gcR4:"/%\WFi(}}5z}FkIZo9Jiqh(C4Ig=fcHݔyL,"|s}3>-Otfȗ[s[@xӾcZ'ŷ%\|qV?9ZQYv;̼;z7kenVː"vjGX,y^W V[.fZu\Ý;ζtcؚ,Y78{'MVdL^G=C%RF]gjƶZݜ6]wˢm6 T=.h*񏋳qHf)K =9ٕ[Y;O=ce{&, }Wq'}yy3v"TDvC 巛.wusd]T+?mVDuo)b f%sR;Z3>Ɏt1mna'2 =9(Q'=N[d'*EvxmΞRZ@HiY [<̅ķ=#k#ݒ2bbg4q|xOr2SíhM"-WNANա69DN8{uuˆȡh/'SіCCI<Ղ˭ӌȩFv3O䡓(Gjig#>0z4]E#rXJ.T.ʴĈANC'8fQ(&=88''9%\Qe>QYU*D9uŗ#Ek\"~l|ss=ħ ?THp6Wr2GY!+'_oҰ e>GVyVZOr䉓&i4y[sEvK2);d.u{N?~"Q#/Ȏ"U|9x˔*;~=S^F~4qj}ޑyVq7>V$bɳ$+i$'' CC#eO=*CT`GlJXCV|8[y}5~ګs Q%u?Np_%Z72eUzF-3!V$%Ȫ+IB$QLޛ>^KڥWesv%uJ"-$i85&Uc;YJǫ+NHdؗiT@V &ш$D#%ϗ' ҷǐ>knBg[We%Rs 1ϕo n|JR_JNe:d~^OVenso"멧/VmI;YkfX9w9#6Go[n Yӣw^%2wQ\ OvzJt^,6zhCi2}7bHO2$V#k[X* yd~ơ*jVDWn%@$@I-5Fz!MvՎV!ъvn [..ZJ`p) X|X \\\ \\ Ћٮ77ۀN.n=}CVQ61q I)iG79ڽюۈխvdru2\Ln&WP۬խvmruK7\m L&W[ mVj;cr1\mLW&W[0mVjgr%46\m-M&8jkr5\mM&W[ojoru/`ru`ruOaruaruobrubrucrudrudru?erueru_frufrugruhruhru/iruiruOjrujruokrukr3W&W&W&W&W&W&W&W{&W &W{&W&W{&W&W{#&W'&W{,&W0&W{5&W9&W{>&WB&W{G&WK&W{P&WT&W{Y&W]&W{b&Wf&W{k&Wo&8v\\\\\+\=\O\a\s\텚\헚\\\͚\ߚ\\\\'\9\K\]\o\큛\퓛\\\ɛ\ۛ\\ⴶgE;#\=j0zar걆գ#&WPL\=1z\crH걏գ!G&WLC\=2zer걘գ3k&WLә\=3zgrH걡գEKMĹW1Mu\=5zdjrXѫYG&WyM\=.6zlrѴkG&WM\=N7znrXѽ}gL0zygڇ|Zj>|ڳ 2w{~ɹ'i: Lf3a4i>}2˴L0=iS~9LILaz(S/Ø3=i S~F[L36!L`:L1=p#2h0Xaz㙞DctL˘N`:$̴StLg0`:,Lg3t.St0=L3=g1]Ǵi5L똞͔axL1=iFMLL4ȴibK.er1=L/dzӋ2]t%Kbz)L/cwez9+^*W3]^t1:3L&73L71f3w2L2L` Ӈ>t+G>L1}L`$ӧ>4\~&wA9~U$+iݗhIiJ5`'0&\\\ANu0[ Hbn%ОõmpRw?b{U`+s*|%5yg[qh=OX-5` @5\0' @ p!p=Kϖ xtJYGg*}鑑5NE;ɫ>c'6MSsύu5kp#\2Ҵ(Qie);RʳUJ3KzEtq[Wi{*mvc-9 .*rk:t2Ynr90 sve 0|< %*rHjz,>02OOpS>g啖$Rz.o2:uxyN}#6.աAn/sܢ9N9\KA5QJھS[wI'XGIriNx" D+y#Zb#cS9tgZur10p9gJo@L:ƺ'ӝW;sQCi}WGGih ˥#9\ tb.Yh͈.(_t^Y'lQdwY>&X;(mnd^_ dN)ZbM y~bU;iJFވv!M]L{һw+Z [u̳.Xv Ђ,G,A^;'^ #ܸԞWW~N0qMR9>n5:mЕpG2u E𘨳q&Zb̢zz뭎-=-g XEЛjnK,I9u*ζ-Kҟs E'*'-}kL>[ $,-}ϟwON]5j">ٲKp{ Е{hpX{_k 5phA]oWs|Z~tλ=xNSS?n/橪EUxWSxc볭-?̋]WT?bſ44R7UjTzj籗V|kwW>i^W*ōZ͌Y+EI_/}c,Ӂ~keF@I7Nw^ޱyJ5gDӠZF.,0Vi+o9~Z0S]kiso\OS QIw;aF3Pߥ:M^S5DIw]bxPCFXZﯮ}5xoXT5 l#t0RUC-üS"Zan-I6.bjX݌hn#kjkj,@@G]Da9pD[R[hjX BQa"yAY@.ndC36ڳ 2["䣡uձ4-nhЭ^HAS dܓ5 pӁ /8h= J@\j;2 `=HX \ \o=xN#( N\r` PT +u31zP52xda< OLO*Jz,V?Igr}ه=c|U6)'9eMs돡##Pķ3QgҕST4#&dv1~ 1~|!o[5XJS(gyc(csrC}LF;Q9Ѭ̝jwKmPo}wߖn=gO rDO{궃#_F~#/Ҩf/HX~np8-Xzcu#ϿfCQ-yG,Ǿ ʥm:HRR߻ysUZR?asClI1QpcMVU;]uh` 0`=X\\eG}xx>@w//ZkX_vִn,YzbcNӁwd}'ތ/zZݩCm>^mO5DR&WC2ˆȶ+;@d!,^TuzT'~?_}uj_׿ςTOX_TXۭv~_2`0LNʁ)>ӍdoXyWEa趨_;mg{BQ=L͙T3Y@%0NNVg =ɟسG]+a-&/lu~NX ,6nnn6w?Y?|]}^ۡ^zMx8yCI b$< fgKbUS/VCݙaįS#k:lsh  dӛ2`9pp>pAE7.6?vY]bc' c:nR\\ +%*R`5p. X\!<7u1ܳ.>{ຟ֦DT'7XvM6{o gX?_{]?yqO|N㍸MR`f ~<]:sUʧu*fQ p%pp5X\ llnn  ln6[;;[GGۀǀǁ''??~ xx9 KWW^vo~x xx  3}߀>{>  /?s Ke=ho_z* ƣ#yV~בKwҩԀvӎs:Dء\J\tc6@= AM,-M;:|:CMKTe[ΡC*xIm~xZ[Wo kjl׀6BVtQja)/ >QwJtu0 yO kc ^>l)7.+ )Lg*B*B*B*B*B*B*BOBGk/vӰ =@fey-$4ާ%@4ާqMӼ4~]'JN{IxJ'"q=9?moi T}ږ)MTe3yHȋ?S "͘aX!THTHTHTHTHTHTH"?Prj 3x&B0^XG4=?FWmց;2`uny0w(N9G]jo]Z 2C=F GIKF Z&r%.!8;: mSj(`h    jDocumento Word.Document.806Documento di MicrOh+'00L `h   Presentazione di PowerPointSilvano RivoiraSilvano Rivoira221Microsoft PowerPointrPo@P~@С@8]!GK; *  %$& &&#TNPP2OMi & TNPP &&TNPP     $A o(o`Eʦ """)))UUUMMMBBB999|PP3f3333f333ff3fffff3f3f̙f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙33333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffff3fffffff3f̙ffff3ff333f3ff33fff33f3ff̙3f3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3ffffffffff!___wwwmmmmmmmmmmm C쒒  CmmmC 뒒 mmmmmm Cm뒒mmmmmm\⼒⼼m⼼m⼒\dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&⧧⧧--&TNPP &Root EntrydO)U!' Pictures!Current User,ASummaryInformation(`L  !"#$%&'()*+-     )/JCL: Reading from a sequential-access file (9) Caratteri utilizzatiModello strutturaServer OLE incorporatiTitoli diapositive3#_ Luca ArditoLuca Arditoivoira)/JCL: Reading from a sequential-access file (9) Caratteri utilizzatiModello strutturaServer OLE incorporatiTitoli diapositive3'_nSilvano RivoiraSilvano Rivoira  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Root EntrydO)^! Pictures!Current User,MSummaryInformation(`LPowerPoint Document(DocumentSummaryInformation8 osoft Word:/ 0`DTimes New Romana|dv 0|( 0DWingdingsRomana|dv 0|( 0 DSymbolgsRomana|dv 0|( 00DComic Sans MSna|dv 0|( 0B@DArialSans MSna|dv 0|( 0"PDLucida Consolea|dv 0|( 01`DArial Unicode MS|dv 0|( 0pDTimesUnicode MS|dv 0|( 0 b ).o  @n?" dd@  @@`` :323| _6 65    0   ay y^ub  v V   $|     '    (]36"%t7GXeOR8kZ H`    \  %     e@nlp       !f ,kbOwJ uMi  =      b%-    !" #$%&' ( )* +, -./01234:8W"   =+FFF&  ^   $$$$$$b$BjMFs(5mL aF$b$ӟEB_Е7N;F$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$b$\8+΁1Z6$ >$b$é՟oUd J$b$5_^Ol V$b$^e4)>AH2UKd$b$MQr0Ӓ^iX^Cv$b$#>QaM*lܻD$b$OGDh\p$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$2$=ՇƚmJ- A/$b$T{P~(P9p$b$MGIsj^Ps])$b$vmO-j$b$Atu`22@%o$b$h߸}:8ER ?$b$}#WسOQ$b$K?~/¦anm9"Pc$b$0^?LH0:B$ 0e0e     A@  A5% 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||S" 3f3ffܘU@U;ʚ;mNʚ;g4TdTdv 0p2ppp0 <4!d!d` 0,b<4dddd` 0,b <4BdBd 0,___PPT9{`o20}rVC:\Silvano\DIDATTICA\PROGR_OGGETTI\OOP1.htm| 20?  O =0B5#JCL: Input/Output Package (java.io)#~JCL: Files and Streams (1)HJCL: Files and Streams (2)HJCL: Files and Streams (3)HC6JCL: I/O Character Streams" D7JCL: I/O Byte Streams"KTJCL: File Class  Constructors and Methods< ?File An abstract representation of file and directory pathnames.Z;Z;;JCL: File Class - Methods"IJCL: Creating a new directory. FJCL: Reading/Writing charactersV GFileReader and FileWriter can read/write a file one character at a timefH 3 3 3 ~     GJCL: Reading/Writing bytes< MJCL: Data Input/Output Stream"RAn application can use a DataOutputStream to write data that can later be read by a DataInputStream A DataOutputStream lets an application write primitive Java data types to an output stream in a portable way A DataInputStream lets an application read primitive Java data types from an underlying input stream in a machine-independent way|S3+33]3qb+ZqLJCL: Writing data to a StreamVBasic Algorithm Open the file for output by instantiating the appropriate streams Call write methods to transfer data Flush the stream Close the streamPZZ  NJCL: Reading data from a StreamVBasic Algorithm Open the file for input by instantiating the appropriate streams Call read methods to transfer data Close the streamPZuZ u OJCL: Writing text" PJCL: Reading text" QJCL: Object Serialization (1).An object can be converted into a simple stream of bytes in such a way that it can be reconstructed correctly later Once we have such a stream of bytes, we can output it to a file and read it back againZh !   RJCL: Object Serialization (2).import java.io.*; import java.util.*; class Employee implements Serializable { private String name; private double salary; private Date hireDay; public Employee(String n, double s, int year, int month, int day) { name = n; salary = s; GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day); // GregorianCalendar uses 0 for January hireDay = calendar.getTime(); } } class Manager extends Employee { private double bonus; public Manager(String n, double s, int year, int month, int day, double b) { super(n, s, year, month, day); bonus = b; } }2Z                          O  R ( 3f,                    5 \  ?'%"  " 7 SJCL: Object Serialization (3).JCL: File Class (1)JCL: File Class (2)JCL: File Class (3)JCL: File Class (4)JCL: File Class (5),JCL: Writing to a sequential-access file (1)b ,JCL: Writing to a sequential-access file (2)H  ,JCL: Writing to a sequential-access file (3)H  ,JCL: Writing to a sequential-access file (4)H  ,JCL: Writing to a sequential-access file (5)H  ,JCL: Writing to a sequential-access file (6)H  ,JCL: Writing to a sequential-access file (7)H  ,JCL: Writing to a sequential-access file (8)H  ,JCL: Writing to a sequential-access file (9)H  -JCL: Writing to a sequential-access file (10)H  -JCL: Writing to a sequential-access file (11)H  -JCL: Writing to a sequential-access file (12)H  -JCL: Writing to a sequential-access file (13)H  -JCL: Writing to a sequential-access file (14)H  -JCL: Writing to a sequential-access file (15)H  -JCL: Writing to a sequential-access file (16)H  -JCL: Writing to a sequential-access file (17)H  -JCL: Writing to a sequential-access file (18)H  .JCL: Reading from a sequential-access file (1)H  .JCL: Reading from a sequential-access file (2)H  .JCL: Reading from a sequential-access file (3)H  .JCL: Reading from a sequential-access file (4)H  .JCL: Reading from a sequential-access file (5)H   .JCL: Reading from a sequential-access file (6)H   .JCL: Reading from a sequential-access file (7)H   .JCL: Reading from a sequential-access file (8)H   .JCL: Reading from a sequential-access file (9)H         ldH (  H r H S k.h  . J H s *U,$D 0 try { File dir; boolean itWorked; dir = new File(  thisDirectory ); if (dir.exists()) { System.out.println(  File exists! ); } else { itWorked = dir.mkdir(); if (itWorked) { System.out.println(  Directory  +  created. ); } } } catch (IOException e) { System.out.println(  I/O exeception ); }q . '-   +*       /  &         ?         H H 0@޽h ? ̙33  T (  T r T S (h  ( r T S @ (  T s *jUpl,$D 0 ^,try { FileOutputStream fStream; DataOutputStream writingStream; fStream = new FileOutputStream(  oneFile.bin ); writingStream = new DataOutputStream( fStream ); writingStream.writeDouble( 3.14159 ); writingStream.writeInt( 7 ); writingStream.writeChar(  Z ); writingStream.flush(); writingStream.close(); } catch (IOException e) { System.out.println(  I/O exception ); }. R < :+                                                   H T 0@޽h ? ̙33  ~` (  ` r ` S h    ` s * U ,$D 0 > try { double val1; int val2; char val3; FileInputStream fStream; DataInputStream inStream; fStream = new FileInputStream(  oneFile.bin ); inStream = new DataInputStream( fStream ); val1 = inStream.readDouble(); val2 = inStream.readInt(); val3 = inStream.readChar(); inStream.close(); } catch (IOException e) { System.out.println(  I/O exception ); }.  O +                                         ` <   H ` 0@޽h ? ̙33f     d  (  d r d S (h    d s *$!U0 ,$D 0 try { FileOutputStream fStream; PrintWriter myStream; fStream = new FileOutputStream(  threeLines.txt ); myStream = new PrintWriter( fStream ); myStream.println(  This is line #1. ); myStream.println(  This is line #2. ); myStream.print(  This is the start, ); myStream.println(  and this is the end of line #3. ); myStream.flush(); myStream.close(); } catch (IOException e) { System.out.println(  I/O exception ); }N H."1+                              #    ,           Z d 0dG @ NPrintWriter print formatted representations of objects to a text-output stream>O  3C4 >H d 0@޽h ? ̙33   4 , h (  h r h S PSh   f h s *UU,$D 0 Btry { FileReader fReader; BufferedReader reader; String line; fReader = new FileReader(  threeLines.txt ); reader = new BufferedReader( fReader ); line = reader.readLine(); while ( line != null ) { System.out.println( line ); //echoes input to standard out line = reader.readLine(); } reader.close(); } catch (IOException e) { System.out.println(  I/O exception ); }. T < *3f:+D                   3  >  %       h 04l p DBufferedReader read text from a character-input stream, buffering characters so as to provide for the efficient reading of characters, arrays, and lines> 34H h 0@޽h ? ̙33r(oILN0e n_S   !"#$%&'()*+-՜.+,0      A4 (21x29,7 cm)Politecnico di Torinoo3 =Times New Roman WingdingsSymbolComic Sans MSArialLucida ConsoleArial Unicode MSTimesStruttura predefinitaDocumento di Microsoft Word$JCL: Input/Output Package (java.io)JCL: Files and Streams (1)JCL: Files and Streams (2)JCL: Files and Streams (3)JCL: I/O Character StreamsJCL: I/O Byte Streams+JCL: File Class Constructors and MethodsJCL: File Class - MethodsJCL: Creating a new directory JCL: Reading/Writing charactersJCL: Reading/Writing bytesJCL: Data Input/Output StreamJCL: Writing data to a Stream JCL: Reading data from a StreamJCL: Writing textJCL: Reading textJCL: Object Serialization (1)JCL: Object Serialization (2)JCL: Object Serialization (3)JCL: File Class (1)JCL: File Class (2)JCL: File Class (3)JCL: File Class (4)JCL: File Class (5)-JCL: Writing to a sequential-access file (1)-JCL: Writing to a sequential-access file (2)-JCL: Writing to a sequential-access file (3)-JCL: Writing to a sequential-access file (4)-JCL: Writing to a sequential-access file (5)-JCL: Writing to a sequential-access file (6)-JCL: Writing to a sequential-access file (7)-JCL: Writing to a sequential-access file (8)-JCL: Writing to a sequential-access file (9).JCL: Writing to a sequential-access file (10).JCL: Writing to a sequential-access file (11).JCL: Writing to a sequential-access file (12).JCL: Writing to a sequential-access file (13).JCL: Writing to a sequential-access file (14).JCL: Writing to a sequential-access file (15).JCL: Writing to a sequential-access file (16).JCL: Writing to a sequential-access file (17).JCL: Writing to a sequential-access file (18)/JCL: Reading from a sequential-access file (1)/JCL: Reading from a sequential-access file (2)/JCL: Reading from a sequential-access file (3)/JCL: Reading from a sequential-access file (4)/JCL: Reading from a sequential-access file (5)/JCL: Reading from a sequential-access file (6)/JCL: Reading from a sequential-access file (7)/JCL: Reading from a sequential-access file (8