From f5d5e297c656fb1304cccd72e9ac347c0bddbd09 Mon Sep 17 00:00:00 2001 From: Juan Prieto Date: Mon, 5 Oct 2009 22:44:40 +0000 Subject: [PATCH] Works with visual studio 2009 --- kernel/CMakeLists.txt | 1 + .../bbRegeneratePackageDoc.cpp | 12 +- kernel/cmake/BBTKBuildHtmlDocFromLatex.cmake | 3 + kernel/cmake/BBTKBuildLatexDoc.cmake | 5 +- kernel/doc/bbtkUsersGuide/bbCommand.png | Bin 1295413 -> 5 bytes kernel/doc/bbtkUsersGuide/bbFile0.png | Bin 16029 -> 5 bytes kernel/doc/bbtkUsersGuide/bbFiles.png | Bin 2603680 -> 5 bytes .../doc/bbtkUsersGuide/bbPackageBrowser.png | Bin 5288862 -> 5 bytes kernel/doc/bbtkWebSite/home.html | 29 +- kernel/src/CMakeLists.txt | 2 +- .../wx/treemultictrl/mac_collapse.xpm | 50 +- .../wx/treemultictrl/mac_expand.xpm | 50 +- .../ThirdParty/wx/treemultictrl/tmcimages.h | 84 +- .../wx/treemultictrl/win_checked_icon.xpm | 546 +-- .../wx/treemultictrl/win_tristate_icon.xpm | 546 +-- .../wx/treemultictrl/win_unchecked_icon.xpm | 546 +-- .../wx/treemultictrl/wxTreeMultiCtrl.cpp | 3970 ++++++++--------- .../wx/treemultictrl/wxTreeMultiCtrl.h | 658 +-- kernel/src/bbtkBlackBox.h | 9 +- kernel/src/bbtkComplexBlackBox.cxx | 21 +- kernel/src/bbtkComplexBlackBox.h | 5 +- kernel/src/bbtkFactory.cxx | 297 +- kernel/src/bbtkInterpreter.cxx | 99 +- kernel/src/bbtkUtilities.cxx | 46 +- .../toolsbbtk/bbs/appli/GUICreatePackage.bbs | 1 - packages/wx/src/bbwxSlider.cxx | 6 +- 26 files changed, 3506 insertions(+), 3480 deletions(-) diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index eeae142..3068544 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -30,3 +30,4 @@ SUBDIRS(install) #----------------------------------------------------------------------------- SUBDIRS(data) #----------------------------------------------------------------------------- +SUBDIRS(bin) \ No newline at end of file diff --git a/kernel/appli/bbRegeneratePackageDoc/bbRegeneratePackageDoc.cpp b/kernel/appli/bbRegeneratePackageDoc/bbRegeneratePackageDoc.cpp index cfae87e..b6a492f 100644 --- a/kernel/appli/bbRegeneratePackageDoc/bbRegeneratePackageDoc.cpp +++ b/kernel/appli/bbRegeneratePackageDoc/bbRegeneratePackageDoc.cpp @@ -45,7 +45,6 @@ void Usage() //========================================================================== int main(int argc, char **argv) { - std::string pack("-a"); if (argc==2) { @@ -68,34 +67,37 @@ int main(int argc, char **argv) Usage(); return 0; } - + try { std::string doc_path = bbtk::ConfigurationFile::GetInstance().Get_doc_path(); doc_path += bbtk::ConfigurationFile::GetInstance().Get_file_separator(); doc_path += "bbdoc"; doc_path += bbtk::ConfigurationFile::GetInstance().Get_file_separator(); - bbtk::Interpreter::Pointer I = bbtk::Interpreter::New(); I->SetCommandLine(true); I->SetThrow(false); +//std::cout<<"JCP bbRegeneratePackageDoc.cpp I->InterpretLine( exec freeze_no_error);"<InterpretLine( "exec freeze_no_error"); if (pack != "-a") { + I->InterpretLine( "include "+pack); I->InterpretLine( "include "+pack+"-appli"); bbtk::Package::Pointer p = I->GetExecuter()->GetFactory()->GetPackage(pack); - +//std::cout<<"JCP bbRegeneratePackageDoc.cpp RegenerateDoc(I->GetExecuter()->GetFactory()->GetPackage(pack),doc_path);"<GetExecuter()->GetFactory()->GetPackage(pack),doc_path); } else { -I->InterpretLine( "include *"); +std::cout<<"JCP bbRegeneratePackageDoc.cpp I->InterpretLine( include );"<InterpretLine( "include *"); bbtk::Factory::PackageMapType::const_iterator i; for (i = I->GetExecuter()->GetFactory()->GetPackageMap().begin(); i != I->GetExecuter()->GetFactory()->GetPackageMap().end(); ++i) { +std::cout<<" if (i->second->GetName()==user) continue;"<second->GetName()=="user") continue; RegenerateDoc(i->second,doc_path); } diff --git a/kernel/cmake/BBTKBuildHtmlDocFromLatex.cmake b/kernel/cmake/BBTKBuildHtmlDocFromLatex.cmake index cbbf5f2..d96acb1 100644 --- a/kernel/cmake/BBTKBuildHtmlDocFromLatex.cmake +++ b/kernel/cmake/BBTKBuildHtmlDocFromLatex.cmake @@ -7,6 +7,9 @@ MACRO(BBTK_BUILD_HTML_DOC_FROM_LATEX TEX_FILE OUTPUT_REL_PATH) SET(BUILD_PATH ${BBTK_DOC_BUILD_PATH}/${OUTPUT_REL_PATH}) #------------------------------------------------------------------------- + IF(WIN32) + SET(TTH_EXECUTABLE "${TTH_EXECUTABLE}/tth.exe") + ENDIF(WIN32) ADD_CUSTOM_COMMAND( OUTPUT ${BUILD_PATH}/${TEX_FILE}.html diff --git a/kernel/cmake/BBTKBuildLatexDoc.cmake b/kernel/cmake/BBTKBuildLatexDoc.cmake index bd07c4f..e62d358 100644 --- a/kernel/cmake/BBTKBuildLatexDoc.cmake +++ b/kernel/cmake/BBTKBuildLatexDoc.cmake @@ -1,6 +1,8 @@ MACRO(BBTK_BUILD_LATEX_DOC TEX_FILE OUTPUT_REL_PATH) + + # Need LaTeX SET(USE_LATEX ON CACHE BOOL "" FORCE) # Construct absolute build path @@ -12,6 +14,7 @@ MACRO(BBTK_BUILD_LATEX_DOC TEX_FILE OUTPUT_REL_PATH) ${BUILD_PATH}/${TEX_FILE}.tex COPYONLY ) + CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/../config.tex ${BUILD_PATH}/config.tex @@ -24,7 +27,7 @@ MACRO(BBTK_BUILD_LATEX_DOC TEX_FILE OUTPUT_REL_PATH) ) #--------------------------------------------------------------------------- FILE(TO_NATIVE_PATH ${BUILD_PATH} THE_BUILD_PATH) - +#message("BBTKBUILLATEXDOC;CMAKE LATEX COMPILER + ${LATEX_COMPILER}") # Have to run latex twice to get references, toc, etc. ADD_CUSTOM_COMMAND( OUTPUT ${BUILD_PATH}/${TEX_FILE}.aux diff --git a/kernel/doc/bbtkUsersGuide/bbCommand.png b/kernel/doc/bbtkUsersGuide/bbCommand.png index 63bbb6426bd5f0a3062c1f766f5eb04aed4fdf79..f1ad7558e4917c38d1dafc49f7bccac10219adee 100644 GIT binary patch literal 5 McmeAS@N?$^00ndbc>n+a literal 1295413 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 zX9WNN0002o20ADJ00000;5N`f0RTsv*Sbw<%mn}d0DwY6X9WNN0002ohAxNjn~neg z002UH||9007`N&_MwJ(Cmjg3r;wFF2IzW z$(l0+007|q&|?7r00000x1q!J^8f$<003U8QvL4jojw=9nRJwc?g{_^0002E2Oas~ z7GD4W0002s9(05sOaTBW*2aAKQ)7>w3jhEBUJE~%0ssI2003?SKR*uu00000ZbRGc zhlls>T@G^r000000H6qI>#P6(000006ajQl006*SCHJkkqG;v;Bvab zFFoq=OaK4?0000mU5{=(Q4;_F0002s7IddhpKyzexWL4Jo>){ga{&MV0002MZn~fn zCG6e^000000Kge^zP`AK9smHqV|?s4h!9;5w+5+jRnE&u=k006j{PKW7U z000000N^GtngRd-0N^y&)8Ea)TmXQALT3d400000+=k8(7vIqbG0002MHFP&_qJshe0001XdV1RTFBSD%fGIhX z?aU>316{SMHN2r5000000N@35yLRpHf?@yw0001hH_$!Mv9mXn0|4C3s_Ic67xi2K z0002+D!RGzW_wkE000000KjwUe*SH<=jI*&0002Mac=&7<1fqwa3eaMkB=K=2LJ#7 z004?Joen=g4*&oF003@6=j-e1CRqUh@C+^HraX$d00000&ZkRBNpXHE00000000{3 zZYJN>5DWkS0000yS5Qiy4_z`BU`o#9Le`q@QbJlGqW}N^0001R44ux`-!U-(00000 z02GqW*UztzQ2+pd=SzIKMyN~X0ssI2SfnGu52gSB0001hd(feK0ssI2008bnm!mx= z?T3`0001ZuD8DU@*3s>0DyrmI}204000000Kh%y($X-R z0ssI2008bmr}Oo5kDLH#=hOU^r7oTeFePWQ_WS|>002Ni=>mfz3c4)-00000fJ5m* zA}csFLI3~&05JB|>JGM!a00000_kf?D2LJ#7006gv4hn#~n46d| z3v&Sg0000KI?7R=0{{R3006iYMpFO)005w%rbm2s4RZm&Y0y~#004mhZ|`29tSZX} z0Kc;tMlA@Giz#TLDRNP~bC)zVHIuxSm&!|0+QmB{iZcq{%}Z9M7Tzc=Eeg%*U#l=t z)MfcAf*_ixS)wVwh?#Ob|JqyUI1F=!;WFbsGtaZuEYIxooo~P2-m{kH<$J$x1LQ`c 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 diff --git a/kernel/doc/bbtkUsersGuide/bbFile0.png b/kernel/doc/bbtkUsersGuide/bbFile0.png index 3a67bee634efc8e001bf587809f003ef04ac0a37..f1ad7558e4917c38d1dafc49f7bccac10219adee 100644 GIT binary patch literal 5 McmeAS@N?$^00ndbc>n+a literal 16029 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 diff --git a/kernel/doc/bbtkUsersGuide/bbFiles.png b/kernel/doc/bbtkUsersGuide/bbFiles.png index 392947ab68dd89d7c3e252d573dd2e82db1e8cab..f1ad7558e4917c38d1dafc49f7bccac10219adee 100644 GIT binary patch literal 5 McmeAS@N?$^00ndbc>n+a literal 2603680 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 Z0RRC0)9rOS-=DiG{H|QCi_2nrd;?sgO5y+j diff --git a/kernel/doc/bbtkUsersGuide/bbPackageBrowser.png b/kernel/doc/bbtkUsersGuide/bbPackageBrowser.png index da99e5552d8fb0e1e3e540a6a987ed7892cbfb38..f1ad7558e4917c38d1dafc49f7bccac10219adee 100644 GIT binary patch literal 5 McmeAS@N?$^00ndbc>n+a literal 5288862 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

FlzzgUlg|p@BC@5> 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%0Aa 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

g@6SK~ynOxj*D`+mcvT(*Ztxxf zojZ33ubtj_3YWxC|9nW(WOflqfD7Hp85fuhORSBFP}AQmR@9Q#*7(8{`~okix)2% z$B!R3Vq#*9Ns}hot_wO{Z~5uvdcDPq7kkqB;)^fT@wG0Cii$E)Q&TtFV`Gi9v^2F`m(N=Fn>TOvyk^}O zZ_mNse4UO9d2eelXU-gT%uk;_?W*qmY1`&wESq0kO^)=S1Ji2~@y`HXb zoxZpBtIO%@y}%otw$4k_%f00pjN`2H)OlIYk5D~lK$ltX1L))6)DG;}r3ZR>u#bb& zdGGf4>hhr;+-&2|xoECiH)$U`cFf3=Cy%&x$0Tm}YdT@`Ccwo2s|M<~^#>wO(YFosR z5KBT#39nlpSdMkV`SG6_m*XbexBMQI{Rnn?VO+Oe>o$Ez_XP;&{cu%woC`Vzi+HRS zaCcfaaL@g9*IlQ&S7NZYaJ6K~5;f+4H*dfFw(8RK!3Q76_uqf-SC?Vj+iZrebm*3` zapOigd-kmAl6&slIW^EHx}DBY<79%t$W;K{P*8~dtP_T-+Zmd zh5Uno^E5YgkGA8sZJUpco3zoMe6`z~Z@yWL(Sml0a|<&8wrbT%EeE%G1OnGb4dX?i zD=5yj?c2Beb)L9kJ+HyKEGN%(&FOgfg6_~5g8;`H^$Ec^ez--#4A0TM_RN_xQlLNq z)qNaed?0VkoQH8Wo_OL3HTHrX4B#9{d)L=kr}AjQUeC%~`^7CDxWC@ldqJSQ<#{Ea zGv4^yUi=a4}*~Xvu9y7OTW1IurYGtOcA8wf6?}&(qa=WEJEtC5mcv$Tw zW~44usGwB2`f9nWWee%@bZ2$jW+-UXsG)56W4#nBTGX%N=>6Ni<#&lUO?DJ$dX#%) zX(Lq#l6%RtW^&J>xMaCjj82zZuy(9`M8k(@FM~O zV+dOLTlY@P$Hq`ZKKke*S9t`=+qvduzx-vF zm))|QI@dL)eAOW4cfG6qkaIucr+LgcK7bxYTTG$Ft>Mq zIh9*;yPlP|_M-)wt}ov5490P`vdhbEnX7YVUe%%fbzgx0X5_1WvSNR-inlrmbRV3q z0fD3&$Tn_eW!h$$xfT!+5rwOj%YKleadE2i%CEm~kWr(@%9qo>lKFGL@foAZYWVzj z{=x;x8xtcXOJ45a77Q_Y@&q+K3O^Ymbbdfk63{^H^zGYMUU=aJ)l+iSs#SKYggx{S zLa!kCW1+$asfnn|Vlb^qw%6ILx z*Qzg9D^{#Xm$dmg24KTrpBQWoGcj2oc3<}VWmgB;kuP0_HvI9&AFJ6=z)jt|Y1?+( zr0vvhH3arBaO0O>eyIl0#bBS<7dLr$W7ihl$V{HW;8bVXajtti9(Il#IilJd-f!?D zmsv3Ca_Q2g<|O5(pMFx;F8l}qIL-(V<2?ZF20`00Wy+-6#w^hGj_nY@vX%$WaV^#5 z(X8uP%dNRx&n-9Y!yBG6fxSQ4)tkTV#mp`}H!^#^c{}d|N!QIbZq7x!x^SB|&R6`{ zZie%ah=_>1D_%Ta1uCmlxmxbO?_Qbz?MwunpFZm6WYeMaq=FTIw~pMc)7LV^13Rp>^b_F>=$*O{7%0%V~@l`JU%> z^mdIeRY4a2@T1(>>TZ?Jx8Ke8EKf>KR_p5Zep7J`v_R+i9(Qpkg1-uxZNBu%T?>vt<|sm)}D|EIN}3t%a$!w@5#oE8;3{D zm>>Xv6U7X-P3Oy(PtBOJXU`s)J$tqqA^<%^F>Bb`wQD`oeuJ+%($H%ZK}t*wj2U3o zuU{`?$Bxx6t30tBGfZH1F$8ikV;FiZKKkgRYCSi{Bv4M}(=&{re6g{ya{cw!tEt2% zO`4>#M6V&V56pUj*<^6*A8si}-C|#Ht088f$t-Vmkk$EKsr31QTl0VU$&BoeR#ujCb0KMyL$7t zy_nghhjYnEpy!*@c^}Ai*iBj7oQvM-!s&ehY2&)^^2;x)&qNqf2G@_tlP5b>qb+oH zc>M9lW%cUSDs6DPjEIORoE0osP#$~q5g9Y~0~s-FklK|&Lx#&Yv*yUa{(a@z8r4-m z^2P2wRBWNo>pf-P{{7Oa^E2}N|8& z&oZ}l1Rs3xfl;bdDK&`}CRUp`aiYpw*Ci$j>)W@lng9or`Cwu))UBDD{Pe!*bivIs zr}CXUch2b6t(#G-STUnOfdaLoJJjML*!w-#`HEXH~&#)dQl0({> zU0F2iYu4vrR|k-pd?`I$?>ILiA|i|;MT!{p>eVyedh0E99#}cmy;IxP`I+0S=9IRt zcDrH22BTH0R_eUN1YL1)amGFO++%Frx>YByIOXAuU0bx<7rSMF%!?euf7E_2&H?ELSXS^ntc7j$0$@%b6Unm=Ub znCpGBOV`b^oH~EB|JC9D>dj5t@y0GaH}wGi9tStq05|E{mCvaxPUj`q)rFh#V4~IM zpMT!-`KV2sHpZu)eyXlly1m)4+mFmFBO)SlD<>xl^EGMK7oT5_k?h~I-Prr*R`nTu z-rR4}P0IBCn2|=2B882khxV%1@crP2@4rj8j-E(s_m0g*OrAW(xcA=mEYq*)zq&kA zCV%2thS&6RJz1E3j{Nnu_}jJ1Q%2>=S9zA{_4IanUGwr?+cv6rliRdre>2^a&WG>6 zr@q@B-2bO%na+cM-A&+?)%E0Uf-o7^_t}I9oTZ2;m*_lHB;xY81>;+lmDCe|OY^o5 zNwJdU!y({IA*_G@{%Qs_4BAUXx!09`uGg+zTiUj5tLh;qEn2il4T_$anCNqmF1PCi z%az_f?66LVh=?eZOr1DZ9_a9-q@`UFBkhv9HS+TRY3eV=2GFk|loS~iEm2X?5*ZmK zb7xMMmTm5lMRTV~-q>=|q;bOxyS8HGYPt2+Tjb2ClahS&keokvRtzzuN{!m;-hIpx zW}QU~=6}CXI&^$O_V3v)8#is1yV~5FVT>=^Vwggvt#Q9Id=Fj zojm1`2#JuGeEFqV@zPSD(B<3GmMvQ@PtH4VxkSb#Nu2Pi`ae_S91vMy)*eh#-l$O{ zHNFLc0J!hHSFc{yRf#B!@m&8O1Vb^_4aRE0UlO(t8$4%-h=_x*KDv^CBkL~cm&UDH)xhsS&~bJktQi8j>-N#TO~Rs zMq*;}dEJtMSqds#1V)Y=DP6jBQNLVa5YN|Ne_ajKMnt&>&-MQ)S+b4zSY{Lfiy=|t{yzvJ0c>1X)WcrM+rE9mB)WEXUt5uUcd7@>- zidFK^gZKMP!!7g@Mi5wAxoWjku6&gWEQ8%Fq*f>wW*l9Kv>s^Zd3nXkRq4`ll5!%+ zX%)%_5s?v6s%&LRKJvGet5n@s;&S%PX}NUiLWb%&dNfHcUA!cxPMwn9 zHvA!@MvoOEElqm8_KI2;J!PNo)>V4;?jsj3T$CnF8p)-L7v=X2f5^7&JLI)jyUVK8 zYvkvj*GSW*w@B$yr6l>-G5L1h0;y2GoC=y2C=ek}bb3tQNO)V#^j@!CT{UCa_U$_Y z4%!YKK2qXhW97Q*YRHdEm&y1EpUOJ}`g-=S+<%8sSiE?NG;e-~#N>%l`(hRs7prCk z>+@EBiH(bu>#w_3%|3>-1`q0QUX{XuVMw05F>>Z~isa2-z-x&aq$MIEA|fIpBBCsZ zac85W^2ph=Q?_|EzV!|@TtJ~h1*J-rtEElryQIt0PfC#@g+1%{?D4XcDN|bB|L|k! z{>p0-6&)=#s#lXoI{aI$6B}DZR{gw2KKOWoBqb%Q0BGYz4b`v+dMJW^efvn!qH&V& zR)0Bo=#Z2wSwcEL{-`Gpe+?PfUj_~yCL1?ylKA5B(&vqy(&^DhJjqnPs*=3)LO1F2 zW7S9VMmR<=YTHBM@7xeZ@W%w?VUi%8qG^*7b# zzneSDc7iY&*Z0|kNWC@@5fKp)5fKq((y@E$>|kF2BJvZ1v_wQiL_|bHL_|c{j04aT z5s^QJ9C^MB`vMRV5fKp)ncUX&R!KU%&$NWdKkPkAL_|bHL_|b6Yf~`rGtzRjEJSWaMnp=XB5`tcwdaoe8#$AZ}xAhXxm%x)h}-gx5;88c>#oH%hp zmMvQ*x7>0|wiW+Ms%Ii1A|j$-IF^(st5*IbH`Hk?)k~C?$jGQ*BukX#($X$Ta^fNR z{ns^8w|)~T8ehV{JjeBYHo>n*ZPTVr<>0}C5+5J0a?0)BK*MqWl9G~S@ZiBRd-iPE zvuBS)M@P%`*IzFWKm4$C>C#2==FRJ0DfF>IGzvuIhsu?&mWmZC%KBA{rGArUerzfJb*GJqiILK!OZ$}pWuJZf_Ni`SXbi)K z4U-#gxIxaJKd%C2BS(&un{K+vwi}sY7-~HRa48U*Hf@q(#fqidRR53@ENr8}aiv_t z_wL=RDy&tjR#KvbpFdv)!Ie_aL_|bHM8T4BJXxyM&i>EtM8OhYvW#lS{_<;&8Z>AiJ9g}l_3PKG-hx<$0O+=D+dRAU$tRykty;BI;InAaqSB#52RU}^nCEo_ zPhWiTMKyLrp+beEUAuPj`RAW|>RNm6z4xSg_3G+NfBEv|B_Sa}E?v5$UskME&Lt(rXc*kiJG?OIg^(EBle{(MiFzxn1Hxp?uSx*xbgg$gPU9Ipuz zCV0{}Z@YN$VrkN(iP~S}IePTybnDTTqh!gF>IWPAXrmu_^5juHxzSF0_U!4Yj6eVU zQ(|LdW$f6oKCdBYqmLD7wn_H|!1cx2UY*XXw6ruCIB=j;sZvFi2W3HzO7M04nmKc( z)U8`rwQc-ZQMGDSdH3CSJ^NtCsVsJU<)hD0Tx&JEW$^p&zXx!>OK$h=_=Y zvJ(cM<=6%k&d`1X8AREyAgx*L+O=i+^yz95de33#gBdesm{(CwpFS=B{O3Pa&~o|m z4`rC!5rw+M#* z_S)pC_Q*}9c@?_b(d9$=>(?(u-SAd#4xOZ6_yn)TsYn0*Is)~-g)O8*}i?d+;PVp^8EA9%f}yoEaS$FQ)TVm zy}K%>HBbu}E&;(eY}=<#A9?lFSJk#e8hX%v_St7LeE4wr;fEj8k2USvx0l;)yG@>Z z?m1W25NjKCI+xH6kspGy2ngeR!;c8y?V5!jj_$wze$~@*d zp!wJd_W2iz*EDaOu2Z-co8Oyojq=9rF+}~~x`=BxuK7~CL$ur#Tq1} zEYW=da`A2w5mDGN{;T*CLyY2`hpWfTucjK)CJZx@4)4=1D+?DcG(^NmOiZ+WuIcr* zY}sPeuV3G2(V~Tsl9Hld4jXzutoyro@nX+DeDTE>s!puSqN1XV)YMeZdS)|b%rNrj z&u?73c+p5sPBx;Wqm8Lkr5RjYay>200Xqufuog@OeOW_XzO?Ag;OSFW7V zrArs1OqnvC^9ghs`W(~ra&sHCV?LLTA3tuy#KahrCQY(iRnh61^TT2X?Ffj~_i~oJ>BVwnYpHu_VNl@VfPZ0kM^(Qu86^E0r#GDqeY7r>X!bwbLXmC_j3!3>8j~* z4Xw*C^gv2Vidqd*hog5YZm~rVRt)!W_Uu_XdGe&{EsNW9FpV%}nvS6~ z^tIj});b02vQVgJA|fIpA|lEr%fM9^pl`B`Oa}|S& zBEswIUiLuB;*^iwIi=5iE4y{g%-0G0@5JuY`!8 zhH}j{*T~_+hduj!?X}mc;LVB^D?H1<{QSlnZ&b6>U@%J^1T+7|mwa?fyz8#JWXO;q z>4LwSxm%VUbP+=kY3b6X>0ZWjeQ*D20H!n%P-}_4?mRgzZcA-|LhwPWzG5oXVG#^-M%WL_|bH*(2k0 zQhw00?_hSS)~#Eso^Cq0pdlcMU`WfBEmiN&#*G{6m#zrtS%|>td+)ucX53o8e!ZIQ zODk5am~`sYNzKTGDekYo{(4!wc(J+%9MDS+b&A=NFq_zg3l~(+J_Njw7Vh=M%rk&{ z$1z?4##F%iNDKFRqX+Yd5hG;u=+WuMPcSQ5w5W9M+*!>|hW~5Utf{6NA2Vi*dRXCp zb*zV=F?t?iJcKMW5?Phm80jP)4m7u`ex6bw0JKB%1A$HS=o~zF zuxk5y&}OuM4BYw3E3c@EaeEB`H|Nsu;louASfr1@*1!JsFEzx1W|toVx(J$LNR~>K zDybhq(AykAWN$+WxG9U3Q$Bg~=9MW^rpW5mtJQS?KdkiW)5n^Ol9T73n|%+~HO-Dc z*C}7z>_<*=Q@*UMXCflXyvnCvJ;A;JL_|d7Rs^OF!^$N(4;6{HJY>Q6R%Ipi#NX1q z?L$(mWO=t~Q4sa--(Ll^FotI+S+r=8nh7p3G10Hto`~qm7OK~@+=lf`L_|bHftosT ztUS=+Nl8n)Bu3gLH7~~H|I^f8%#)#CLntXSDq5nVq9rmiO6Ja-E-l;KBa7xvlf1Fz zq)Fq38H%xDX&`eTJB&B;D+cju*zv?(c6t1R!GF-({&30}5O||*&=FXBQ z=N-8Gl5t5AC%mfu&(shH6dag94O7oIYScZ7)xddl|d)hjp|1l_NuNw*BBF4^Yg+bT zJrhxGbIrxLJJ=V1h=_=;R1DIFfVy?-%DQ#yLZBqhnm2E*0s}-u-h|UNEu68QiHL}Z zh={^lre+Bvw_fe_U^DgwAR;0nA|fIpBBG2Kq$MIEA|eV`1saY!#l8SUL_|bkk3m`@ zA|fIpA|fIpqHGq*f!Uc?t?kOb07OJYL_|bHL`0OkjqCetLMTUSiHL}Zh=Qx%Gt0ZN zF8~n{5fOzL25E_ih=_=Yh=_=YGNI_esB1FQ7l1)pA|fIpA|fIp$}y12nDaZ0B z$}F^Bv}1qywZ)=EizFfN6j=>rrTU{GRTVk&x$ldiFN<1&+UDdGHXv}`T}GP zcV*8Rppv1?=t9)|%htF`^ zzd*{nbLUR=#d!4S(dyVXXwbmlHbhsj6DLl{n{U1;wQALpLWK%R-n@C`>Z`Ao#~yo3 zR~kpcwtrbEC+p6i{msd82FtNy$7INmA(D`g;CGTa zwg3JcqfnPqbr`5nE^jE8jfjXSlvS-!Q+94zD~JBx!(Oyknr93B+CKF90t5s-Xwin( zESs;|w7;VL*&rq+MoO11?aw9@;`Z*{t4i3aRVyh`qC|+7mO{ya0|(TX(UK)gdIGh1 z^5l_y`}WD=#fznH-@Y<$-aJ+0P`P#lQjTDqBZgtf`Sa&hAUit+vd?r`xYS*^l+%~- z&6>Vevy~h6Kc|IT9fopwL%D23L`0#iXnYB&Rp(~;ZS@j4b@I5R8EK(h zTp|w)Yfz|2oLp0*rfSE28`t;Q1Vjv!;!g}QigzBa9y7n1YD}9j%t$)CPrs}zT)5B> z5hF1%(OA27t@(({4Zr$qH#R(H87&U9wG-6_6jJUWsNKKsm5*V^dOqm63Ssu_9m7|#{ z`J_3u_iw)W#;8-LjymViwyRXBVvHCuLT_%%Tn^CBv*H}lY0sNCPhA^O#;H@MdX@+C zI^xgu*v>d(D&9 zu3fu~B1MWAW5$f}EOTlP<}~eiJ4Oi!3F|M^e#IRJD%PWuQ> zWp)Ff$6kE#MfG{3K!F0rJ@?#WOrAVB-RBKmCfz>ubAQ{Dn=Xx@WQ=hk^_-D<_Ox;C^hx7P%5me=i6kTCSfX(v>5y?O z@qmgM9X+_mNIbAx{eS%ELE~id5w$JiNr)>UzJ%AU4=i7^bdGWU+!?hl*5`wDklWjU zZu4mWItGh)toHxx-3N3O)!PQ}Hvs~n1xV;kq$|<{>7oKs1#wr$%c zUAlB}yxz5IS5=oYX3UV^fB#(`dE^o4)vK4|b-=ykAAR(Zj2}N<{`~V#`RudL)cP1C z(-V|;;>3w+zbNm^FTbqbf-;-W;l6$Q)beiKy2<3plhu1r<{mwIsPayoI@QyzD4oE7 z)XSDFlYagBNyd!MGx0HSwKGpY{j^-VbV-6cTe8uuG`^l8}g>iuCAlx^zZ)ad#sXE zHk^O`ICkuq)T>udJv49XjEIOREeMeiF_<2kGH-Q!Xt2%&NZFR?HZsIe?cXgOt@SpO z7OdF|nqIzp_im$l_3B2WMvaX4_;~$t(9p-BvorMbn3x#HG0d4WM`c7L0}gUlMU9zA*(rAn1DFQRk|Z4sG3M~)=Twnug?vcdHOS#4l# zXHPx#l<~w9PdI828Cu8?N87d2-u3>sY}w-2h8@;&=;!{pM)bB9FJ7FaXnMJ|&p>@z zm)Y${KyO!H|C)KZ-RoPw$6dWx`E%Q#%jD|#T$R;Mdve9PPyO80zRcxx*N5uun2*J} z%=+9N>$>{6wLPVzjp_4?Y;d#Wd{$X)-n?0r4R@uO>Em!$m!Q`(*Jr#uGVSRteMfFLkGv|BSwr+pP$yxYInzFx164wIdew!t@!LW!)H3$ zgRV2{vFPXCv?04?*4uV<9ogyM^)^s`-8S9TC+PRM+OHknmd&bv|Ncg?V#SQV|NdLO zWVg(;642xR$PzI<7( zU%xI_u3VAx=g+HbSv;>(r;cNrP`7SfHDe0=_SI|}E zTefVeW(LZgJGac5HA|W_X(CZkQS#GIKY48L_uY4&G;G*VT_+Db@PO2;SyN@wVtI1- z^BSpEt(wy!S^EsIF02J6vrK*{kR$liPnf<7!`e22F6+hu$vM z_5{{tcH5Y4JO22rx^UrwDqD^mIq>g_eV2;6%mr{)udY6u-g@gT`S#myWzwWc^4)je zseT4h`q^p+?xcD4*=N;EoH)K|)22zsjva5gyTILX`Kp{ahsY*I_NJNseD}oKcEGw! zw}1aL<{AL_r8yvzISkkW(j*NP!}E%8kSu zE|0>mLE1+jeN<-8p6&M5#bAVC0<4@ZLx3tSE=~oH5Rk%c&iKQB{rdIlOB%k+Xs&Jt z2Lx3CUoxG|(v~x4PW8GguF6J~T%}8wR&5r;d=x2C#Icz|g$k+vA3Ai%vCJ6^O^`i% zcJ)QIZQHhL=no9r0e0Fu+VrYbt5n~DFS!T`zx(dHYFilUz+3*jMlj@wGtTzuY?(Lx zh_AUSk1zOo+pe}}r#*Sg)xON!_36%D)8+IfXXSLZ%$qjmtn8XT25&#B&=&xH*mU+8 z=Wd^_96fqe4F`lFhA_kuel&*UmeCs+rU*ZrV%U~)<;uyyg9oKUhYq)F!rgJ*j&j=J zti3o}hBoAFnO$uM!{+$1f46eAUptapHVol`;5>r#RjO2R?8@6ZBO)TY9T1d_h)_SC zd&O>GHau%~$(z5ZoH=z;E?6lgkFfA?$yewO$rDvTE?>In za$hM5(&Ebx;E!`>FqJzp zfAnwIutAMytKqqJ&pr33>EAK_88U4B30Woh67s_jKRCt&1w1cRs#KB;6iUC4L5@J{ zh!G>y^_?kGCa)?3>p%0%Gb)2NTefVf&0)N1@TR@v%Pt-mgAij+wr}5Fjroji`b%nD zBcA#Z@YElJKg;gVZQDIQXS``ozJxv#KR{?d{`jM#57j@cVLWGiMgq>UnVs|LOP<=8 zKR>I=lqsVEmiUar4?tG#>e3n94T9`dWQ=0mYmE1bjC*8#`m#N^I!9QJfE>ndFI%>( z3fdMdSn!sjx;rjkl~Z4r_;DEH@oH#~zUHekYj*p0eT=A2J(fA(xxfByv0FCy=bwM% z@y8#R*I$2K{a|nA>pCMMA_^8+vSyQ_5#=N-Ed1u*R4(Q)Aqr}Sp^`JNT)8ASZd`MH zC=-Wvj!sc@R?o<@V#Nw+)~uOI71Q53HAE%xO{H<;#wtQvyLN5;Qo2y0L9VJx8MpMPF9ZQA4*` zQWT^uS+b-I7%)Kn!H?861WZ=1UVTfQMn^}h6gdnwiGZ$kFuSx2X|o7KVX9sPY7x}J z7jyi9t>Mc%rulBuri~gj5rb^v3mt-`I&g(xcj3Z?ReB%>w?mpM0=iho*HBJ;(Lve~ zQa|v89m`&N=_Oz9ih>y0HtyXVHENU!g#7vEpX#1Xv{U?$fFKKkIj+>GQA4FS?bxwH zwJ$SI?H$1ed_hLgD>gP(eYwTpg9yO5yLZ@EZud1}rysG~AN#ZH{@k|R<8#JSd-4bL z>-g+LU=AtgNH<5{4frtwV*nvggZtp|xiEO};3S_5DLLNcu+zr;`B{aO`Y*ryQvFR~ z<*qKRkQ$0HPnIuV?ief{KPVyaiyxD)Enl?DUV?Wv9%ZB&UD(Ro~;OK9f^6{GbT{T$3kHRx?jwU~qSLE|5K}Pa+~p@0NWzMRMefOx9quM~@tmTK6}R)l26| z=7_>lr*_R-s&m7}O;WF(f5&bl3RLUXt(O;99KTsS4n4P+qh+ObpFcmhkagduPak!s2{LMf8M0b2yaI+J z!oU86jA3MHGeGMbtWP2$A|kro7^DpVNMIf}Zk!rYAR!?^jZrpm;6OF@ED;e=An^BR z)u2Ix0^u-IEMLBS5*Zn(vRd`{wEnVi;X;3HI$dIY5)qLPRD5da2h0WVfw(hgCnENWDX1SxR)P(TqjRH{jBWUyW#- z09C72l`UJg1VBlMh$tm6j<_CQGOfAYpH;zHm!8glupSo?5fPC;9Xozpnl*n?iWDg% zZw(nF<;#_mYgezz&s%hq--lPPU9%NfrgUiH(9Y4J>F~IT zh{#L7WZA-803sqHA|mp;p1u34DDC2}=S$;84W(GoB2u#Co$^epr)BlZrBdPU@~RB8 z=ggD)AADE}7P(XIEOWPX>fBY%o;{~t+qP|oN}q)?2ejNXo<4YzT?X>|I4q{c238|sr4{}=kO8l z$vsu>Q`@Og=K+~D=L^R+0BO9~cg&ja<>97}N}-}9rQQRL)Vfw}+I3XNKtAibal*HnKSb<$(ZrhkQJ6?&z@bqAwz~x8UFU0a_5~T>E5G{3c3y+*iUV{U;n}K?RTqW;)HQhzI<8v;fM7SJ>>2G3MwM~2S&>`OIOJF zvF}NRyYEtg*xr2xsCC*t`%IE`hra!eD(fA06qmTuXQW}1=CbMkes-h<|NZwrvMOec ze7#^!lJ`;ia%+nxA|fIpA|fIpx(yB-_*0DqfIz1w$fnf_7b+zE`t+2}uXR^hun6Gh z$`zqrj*5zO3_yGF;zjvj!pE}ct1slf>ebZig$fmv0sVSO-vNVV(15;j?%a8qJ$Igb z{Ly%6)bJs-PMc?2$sY#}sP_W0bZ5+(D<6&(s7YQ@^Yr$U1S-WVw9#vV@0+ zJ6@|?siNcm(BZkZ^3p4>$;jbvscc{bh1<4nB_Sapa$wK4B^a>Y41=^pL_|bHL_|TPUZ!`(Fc*M=-Q`Ocp#^tW{!SqFS`zi&>ICUta6W zk|W2>;S&JCHDAdTmMO`mkf9q9kyE}}xL8V;DkX;xACcD2v{dUbV^woDnd&c=3GP@6x0KDBE6xzor_))zR;dkVAhRmd9JP zl2xnMsHp0ne;$%_%kStofMBaUWj9MQvinVU_veZ`NV?1^0l*Q)e_M+ZXmycX z!-o%-r=EH$xo;0B)^lQg9_RwOyn$RcB1*oxQIGauE&x$r!QitQGh~t*iPw`9tVrR) zvUc?fsZzO;3>Z8_YSgMP^&2!%0nlfkX(?5!R#qvr@4q`-zL@`|)U5M>d^UZi4CvcC z$#zQIQC!}5y{im<^KB_pzLGrm{7dR}%q$i?sK0#t$z-Wf>wc;C;KMRu;wO%DR(N;h zF!^8eX40v1SE*6^0a?0yg$(N7SG|@cb7uAL$amhBw$HYbp1u1^wHkHRHb#zkTb^tC zta{xO9Opw1)|berNNM=cgPvBWAct`?klLLgG--;sS%~p(@^{`B-WLhEx#Et5+p1E>802&#%5D;*Z!yjT%X8Y^+2@MLE`UwLI7a+i~dfYPoag zmWLmHSjLYZug+O8(8pkHQ`WXef#Kl6gEC~u5Lvl$rRp2-OJ$1|EoAWE!4eU1a|%s6 zT%C7cx!v2hwpZMjlP6CenJ{63Jo3mRk~wo`H3(8XfymV{ThC)^`s0s3q;%=hGJX1V)vu%N+|KqANOh51XU?2aKa{Lnw@xZnyg6fo zt8*U=tYr_ja}>zs4dk*B5fS;*vM;Adj+~Ja5s|~|-5fn~NNU~RL{=}ICz&G(OC8Hh zTCic`CMlFRyBcgYSnlf|J@x|?0N%OnXRqtTmHH1gmWLZPkb(XCxLSqM5X=CF0fv_^ zT`VuIIDYfUj2jX=_2!QXUS-dQg@s9h0tHl1mIBwVUAyGOi4(GX`EuE@V~4bB*Un{O z5tqkwg{jR`IoS5x`M&etlT$YrVDH|&QoVY0m0ADQS6`_h(#IcvEHN=LQnzkhiI0zW zcK~Ucwe6lheOk_+Kd&-q5v)Z(7T4>wYuBVnlO`%VGPwaaPuEc(3Y0Q?Du?wvrl!M( z53AibZQ4|QCMUPOBv&BSMRHAq(z80h0ireL*d)g()nEK;LJ4cWhczii#Q zRch9(sg~V)@4YH$rA?bQO)6EYq%!7^(b}d>8aN$C^e*L<- zeYR-PqH6m%S5v1>O|ohIUTm*UojU4Rixn#-AAImZlJ&q-S@pKe7A=yhRjaCUB3rRksZug_?ATk%O3BluOBcE4o_l1;k|nA=pe-QC`2F|a%h|JM z<*m2gQX6)5?##>F^(A^ecWq9uV{RMfW$w10oHl~~?2R|xP}eI0tdBqbxC*kGnfL$s z=bt;W*AbLOABqRAWx&`;c&>SB*LvILYX{db*nRJ+RjX7#h3f)++3wxD)%)Gml{305 z?#>VB^{i!PzjKqPdKflrm^5f`b2?Y_?-=I56;Gcx`dqkb1Fq=z>FZ2C5A@GNGYlhw z>s52r-rs!lP4yXQ_2{FIs?TrG$M31_gQx4#4sZJ%&}H=Y9D%1Y>utMhN1pmuy$#)_ zJY5IoV{*4&JG?EM?zgS~nt7@-qM$YL|DwjFZY}^3QR*-Zne^!tx&Oh3rFzYJGX8^) zq-Xc8(!JZOJ}FPxyDH1jx89Kv!{1Uv9S}jr$5Ug-ZH~tvMF?ZDp&=Wt`EUM+@5;i zzyW#n)mK%3Ywp~+>h-Q&yQ)Cfj2SbeLWK(Ii%YLwy^>T9zBJC8H%|>$fOQa5dFiE> z)EBoABSs`y*G%6^jW0ju^V7F)Usa}(B}=O52D^3ZrZOOrU4(!#f++~X!3!_EVBVy> z^2#eRX3QA19=`m&_S$P|8z>KWQ&w|1kPU{Qx2HB`XCL@60Amee`)H>)b_COLiz}tv zKmYtAYu2ohrAwEpAfp+EHbDEIG-;B&|Ni^tmz=WGmw0M(?zq~1a@z=gP(ijZZZ$`c z8rMLN9z9$Z0eu95*98j}RP9d(*!Jw%BjwANR~ejIa<856@Nlo*i#}}P#EFtKXHIF~ zzP-Hs^2_SBZ&!8YiQV&KzTQ!0_B%Iust5cifS|ta8{K`5diuQ4T(tpj10GLAMx9^DTqxR z+Bq7L0VS&Adq&g?qt#>4mvfDIQ%4!6|30E$R#vTAWr&Co8yoBNxu)0Ky?eJ&y?S+{ zQKLpie0;oqIcVtPupVzrOpN0g=FFL+>cqM%Lxv1SLPCOLJ+lQ178v2-;l}mr*NwQi zI3r`mjK}q~GgqJ#WiuE(hp+=sMTT%kAs~b%nON zWy==536rPZdAg9!1u!k9WLdv{y{hXYN0Rmz+Be^Pqh7yw@nVwmsF}|#Sf6Wpxx4nK z*D<#r>oV(eaNk~>J9FlYkttIqWA^OXNmjshXIoi+~oSj^Xv zx9?rMcCFs6I+oDTP)FaTw{NabSM<8>&JXDI%wKP2I}71>%i51?eMm2R{i_;H;NT2X8is4 z-|8j1bw)%)6bzOwm~8y8@@r$;rd3`)@Lt4|5LZHcDfalmTOL@x`G+OO)hn0Ox>%nN z)$l{p%Pk;;~w?Q)unL3}ScPb(cyH#b91(1yWcwjPU^0WtbHR18`y{7tBb4 z^opH3cgp3n7xOC}~N)f`C30AnbS<_{xU%$Ryq~JMHWwD*CS+hD`bGM$iWi^+>E<5|U@4oxg zxErX)2OfApjp=}a8?l^%kGnRPT*+x8xK?n#alLx=lI&JrD=A^8U7N3S^R?scd(kgz zxNjaQVYhBF#?a15y)!Xa9 z)qe3emnYtq%?!8XU~DH`XXrb@SLd11kWN#V7SOo>Y3Q(sh;Fx2e;=1W_wAAk=g&%_ zk$AgzPn0a7A)%5zXD+$3%-s@|zmV74@N1A31GmkdJzL#di2K*m3Je};8GEXtBaBWV|D;$q{G0-R#;xRaA6go zbJkw;Ikd~!HZ*6i+1Y-^j2Q!}jp#Dlz0S?oj<@f1)n6r-vvc5#xy;^jw-0ZRKRM;F zvyas7ckF)NfUnwsv+X!rmRg^O8U}g?{21ZvbJXgQM;=k1p%{+{gR>tzcu#r$(iE&$d+uv7c-#~&T<@wVJn zp4u09vk!cc!UKcc&73(?4ZMkgficq)B_A?~kfA(!^k_BEs`(4^`Sa&hAiQ_2F;pqU#dx z#f*{~o}2n02Y35O>G9h+W^eY9oHk{*9^CQt*^}BlmCqlajar#9WmG^FpQ-vsCUAA` zu^a(8%$$jVfDyFCfYMg}Y?qq8R{YWLSb5XV?XY_-=wtN7bzqm>vH=EQ$82-2zy7-V z(cR3~bw)%)lwSR@XNOd*R!^$jn|2cXDE%l=;!ZV-`qrOfq6tnAKHZj~@jer*31?GE}kN`0?Y_YAG$Noi=4>AIO-+msm`HUZ_wZIeq%H zn!34o@!~q@Oeus}rZ6-IzO44^*H8Tjf!XW&_wTRHQFL^)+5_4X+WFgWzb(Uu4_E7$ zuL1CM-rcpiCb-0%2#Ff_A}U**MTSAmJM38Xrcaoz$~vPPo8w_0-4ypsx$cMr=R5c=bx8Nn>MNQ z?#;5`xBc@1;Xkw1TaHQ^T~PW$Y$&s2Ts2}!P8 zxngwf+SSODCy$XeYgXgYM;|q&PMxaOxp3ivqq;u%KnT;YviWpNbYrD-H!FSRdULPo5q|y%#u@QR?f<9 zcNq~8kuRj?1Yww14BwH6f*IPeb;2`G6NJgcp`D{caMTFt=6&IPk&v6?7EEbcND|H+ zlZMS(NuGSS4lYTy6#A~>y*|kW7&dH}Oqw)FjvhT~Ysa_4>eZ{&EO4>0v5x!IiTsIe zF0kE>^K(1)L4nOzpNAN%7c*)iof4_Fc2urhS(-O*uF7EM%XT?=@?0)_t#qpaj88;+$YH#)b z6peF0zJZx1cJ11w2J6L`5ctA3a^y&Lzc>*QQF`Ie&qIu((5FuyHRj5fUw-MfO7R2a zH{X1t#uCE6{85fM>`n*)FkFK2FcM09C72l`UJgq;9LQp<%;@>I*c{?ZP$}*lx%9xgGnU zz!4~)hyRWQFE&C%L_|as;NJVCL#6bb3qV9fL_`6ML0TdrA|fIp zA|fK9WNH3wwFn>N0!$p*Ihv7LA|fIpA|fIpBBI-jfmtFVA|i5TXUzs5`XCp8h=_=Y zh&*ACmWYUmh=_=Yh=^{JkFw3L$y@*{25E_ih=_=Yh=_=YZZigEiHL}Zd}!anpYLWa z01*)p5fORAt03*_)vF~WBt%Y~I^}jBcGsh{gXf$AoiEy`-EG)i&nmg^OV3zmL_|bH zM3hdH`0bwt%mqlxCJyZ!?Ny}q{`>Ej6DLkcWMrhOm$d#3IoOU*mlx4=JR%|@q;ccM zvUBIowA_v<6`ebGPTqX;O{r9=l4Q@GT{36REO*{{r?hY1UN&vol!_(0m9_s$4(m4b zHRtKqE4!@QCn6#uA|fK9w9Bi&Y*<*B6ev(Y1^p;+?b@|V1<=>5StHl4Uzf)pe>`vt zYhoCNBqSu5mQWx&e*C!Hd+)unYSk(goZY^CyX@b;UuMpnDJ4sml%Ye121N07yYfZ< z<%?~&o}xo)26BHLSz=^&YfG@v}q$}&YW?)e)Z~A>E6A&L`6lZ48#^KTF9(f zvs9g$v+_Rt@IxtEwyX-|6e&_fqNAhb#*G_}?P&S(-caSumMxnK0wb&1%2RoDeSZ7xw~o47xNxC$GZdgYb?PJq3l@|gfBaFN zeDX;Zm@QVUnAE9LN43r6%aC&Z(%$++|z23EJ zS6Q-TiOiTWLn>6Lpn@E|di6?DO}LGG-n@A-e*Ac~4gyy%z4Vd_m?F^R3~oQ4J$ts= zFK#~vJKOP8UIdiC`syp0K7G2}bI(00fP`SMnVtP;ef#!R^@Hro@bGZGm;x9Aoy(Rj zQ|&fmM(5oKhS|`(X%D!*CQh6vIdkSzLnXZY^2@Sr-8!`?Z?(8W=D_wKFQ zF!oieRxLSs@}%t9vnReYP`driN?cTlHs9wFg(Wp@)BR)P}zZ^95aafNx zCML#l40GnpQFUTnmLWq1BOxKdv7Xt21q+Pu@Nnb$_3K7lT%3_HV@6}{+_~mej6Qw( zIO-a8mnBOUW5b3GN!FP$V}=nC5n&`ICaUGSyxFp4QxBZ0a^=by`}glxuiM>@mASlU z&YUqaWy)mCo;^FsYCU@NNOpM_FJ7EvTNL=v7SX`o^Vzd!jj*sVWBT;zj(yo--Ue8oYkIl2eV~3{ zu=F|3=wmR~zuj|Z#lFXbra!%PP3Ho5Se1x~h=|A=OBYNwepvanv2D{TuOE0X;z@`r zA-)uQ{NODQEZ_XY665NXOKM%LuOE2dp+kqfDK1gK(Q#GXuJNyK^JxD%28(#C<~;4q zM=%7!U3cB3GVCzEVp@R=R}I5EfOQ#$9*B>RSCgqB^ADM0n5gUW<;!Yp*eh4A$occ< z<@euzSI==+SH-cyTy`|UTi{=*MHY+gm}1KUBCY_43n9IvfiyH;iMB73)6 zw{9wHuvDp1wzuQ1yvW+c5C`?@)pP6*>esI?W5$e8|M#}MxQ(6ChEG2EL@r&rBpWww zRGF_B-_zUnfIdURa2*(m0N2vKefzw+4&1dXjMa>xMILzI0lh1~@KqmZ?O(vUEH(Qa zXUz3)w+*oGAtE9oB1(O=2UiT&xd5qAn$VC?Nld(TI7gyjf%c1b?6rwQJ4gF9Qv2wm zkE;9ZfBp4WHE3&E5gK}HZ97|rC>6$cXxg-?8V}-~civHvTa5S6v17+11Ie223AaL| z3NW}MW^A*<{orOLN|aFJNnr3_42p|!37R)=ZfiSs%j=G}g! zjf)j2acBCi1PW@W|2d)BvA0qbn8jd$fM9?#n93b9Um^7qK}8JmnBE|57K8AjE{YZ{ zstzB6w`%3fmsbOLZrHFv4P>j~xrRYrF=G;DSVL;9H!zzQX6C`*wU0gan8)pSDlgI- zG2keI%dK0tb`%9OMQJH1F9iprj^hUh41SF38?$V=;;Z)HtL*^VG0KcI^XHy>&Q;Mp z3dBCp(>3hxKF1k5=gw2PebV<7Iv#p5HFE)oh=_=Y$fHu_D$3TMH%P$(`6XY$q7oW< zGxkIj=#V=5&xs@Q%f{7GuEM=u7dJ&gT1?vxD^{$KX3d(ZY$Te`|i6XCMHJBUIfTcM4e*B z9n2<%F$QpN_Vw%6)wVEB0%j0$1?LFCS1x)jsb&eoI3C^vZ3D3n^mGmTyU%gP&bjkcZuUJyL_|ass6H<}b2W1Td?$BgUa3^& zKH0Wutz0;NRuYYycN7x^I*e_QJ!dW{U9O^P$KFa&khWyWk}_bx02Q!n-@d&xXwX1b zuU>si8KR@3RrY0*CQVd8*E;ZOT88XdOcjs8Xc4GIKT9pq0=3~c>so_Hqxb;RL_JMY;VSo2I&UiX^cFN7Zhlq%X zh$!uf%3nx5h|-e~Oc#a&&ilgqA|W@^#-}tbBnjt^NyFx?Bu~Eo#+9VoXV|b|Dm(G$ z(WAF-r$m%)x$bjDy_#5pxd22&L_|dC$+9n}NRFJ55)qNZ>%%^JVr4I4K};k-Gd;(ZUuh4W`_d7UV&F~pFAdv-{r8V||xrHkdo6~}KLqH#lF zr}kF=Pf_+P`35o&F||C#>BVpm$Uq)Ba-{U{-`_VoAR;nhpF>1ML`11>_^4JK7a)Dh z9G+D!#-GF3j+o#meOCshc~>r7Qf=OCTc0?zb2KBh0RS1zfN|s(@U+bkXG@GDu5AL_|bHL=@=a20u9}cya-V zY{`-}n-q;GCt+dXYTQRP<^fS!V;FMd#tpf0<&xaEan0q?F-S{9L_|bHL_|cl&GlmG8ce|h=_=Yh=|f925E_ih=_=YD2-bE?%_tv1t21#ATV)g z=V(T1iHL}Zh=_=Yh=^`824;zZQ-L1+moXQBh=_=Yh=|gZAAVdXk@<_t>A1Mteq7${ z+naTX>|l_Vh=_=Yh=~66xFp=eTmT{>qT9`@Anoeat0g2PL{6PL<+hx5*Q4OYb4--B z@S66o+g-oIhYy#ho_fl0PfBZR zU+>dhS+&ViK9l=u*OvlCN=Svu)n&xHqvXbo8~SBRW4sE?-hco7a^l1ZiHwX?)es1O z!1`0L9iJ{Qg6DWdL_|pA#*Jm?&YeE5CTm*=7JX-3eT}&Q{&D*BY3b9akCZD{PO@al zBH6QNml`!{$oTQ&B_ScfKRY$i?cdW6N936=uJ2$wAG*A0t^Yi8=8U}e-g^=q9qswV zCzGx_UVABHz3y&Dz21&}_>wMfTDwkN2@MUE{{8#QfB^%~G zxNeQ?{%xy#Hf55tRb8&zu5D}i^Us5_>HmIqyzlS7|B+QOYt(CIp2~`V@08D`%ZOn^ zW$WgRGGY7}nK%C{d1vJN=FLzV;#H6~EG$e46eytnIHth0Yu7FnOkcBRja{_jJ{3|};FN6?n+ z(dQ#QU(;!=&zv%4ij*l+Mk-dUXs;2FOMm_Km&@0DAw6Gr-U{aH)Z2E1%y+yeCML$) zYNFKj?7C&$nF~Nf^;X;L^!9x$otT}TXZ<#x9 zffOrNRO-~Ok%cdw)9)22<6N|h=}=FFKTckbNMrcE1_;-p=@dR4l2 z?=DeMQ7Q$oMT-_PYt}4Pr{?se4?p}+%9bswzS$KiQbeUkIm>m=moJ}+sG}S`di0P3 z2M)-E3m5e6JZ{HMd30Uq@*yHTXwV=jTC}JtA5to(PMzx5C+PRATD3}*4fTO~+`W5u zlJzJ!yzYS5xNxC*%~P9p zckOuUgFJ0}(V|5v(u~w!w8c`TO3B!H4v|9qakf+t=4L z?zJ5;VuX||SyD1(%B1=n+&k|Ly-oI+|6K>Ve*M{Je(}W@E`OohzJ0sYsZ&R_dtARC zeDHzOQ|fL#PuHGVNv}_|qOO$myy7%lW=g-Hh2kMKD zz^?D!5^Vus;HgadC07e*JnCd<=F& zh73``4;*uc4jrUbt5%XDM-CO#(aSn@>LlNP|GhfY3>h-0*GiWzt%9VlzWS<4Gt_@@ zckS9$4Ky}m#tf-Yp@RC7)T>voB-Mm3nDge%Q}>Kx9RxF9dg&$gr5C{yXYj}W?Af!` zesRw^*x8P`Jhi8GoUC&JT$RnLTeoiV)mLAsFCYlcApnH5N_gRg7m}=wx|}$1qU6k( zQw8*1e)(ltw{BgMbtteQps-@a3e|@3Golri;rcM^+qbW}CJ^+)7f?Ix(%p6Bu0Qg$ zZTwh-bS0DteHwza_^}1|hr8phJg%6pEmzl*r}CP)yMDacj`e)(*s;UB8|mGEuXH{imyQY~`;$6Q2RU{`#xD`|i8eT`Kr-Wz3i{s-H$s?zPum zQ`aLtTg=?8=kD4wbM?0Xf`a&wH#Rob@%MqVWp=MOSJ%XgFTN3;Ny?&rT!2R5e1XWmoCVuzmH1(A|)hO?tGFl zV-@EjECfkv)2+6eLt2^qlOPjL_|*cYT;rjU8(`CAxHuzY#*D_? zxpU2{7=8Nmanv>HE=!gy#)b_WlB_dh#tb7OBEm>aOjOHtd9!89rXDy~<;s;a_V3@X zUbnLyJLLhrFVu~G56WZKqel;;RH;&qMfyE!*RFLen>~BB5gHomvaTpFp)I0)9XXP; zk8nnx_r;4BJ6^Wa7M(F)JD|6%uTikGZC(B?Tehh8B$u^3R{GlT<@N3A`muA|pzF+h zKFrHemuJtOHNwKejOo*-tJmz(+t%kpKezUeXgk(r>@y9Y^qHGCZ&vlYZ{NNor%j&= zyZyA?_4K*c^nToZ{%_p4(I{KCta0Yd8T~e=%dD)|o8FhJYXX`zYi4xl(7~~(5hF&Z z&n5l2iN2t7=gvl+Jb8?Q1q&M8yLVT0=!)K_-TJY+o~}o|ef?b1%Y9L=dRuxQ`nmO* zjgLCEcI(l2yf8DLytH{$(1Wt<7Mh*52=1;OSL|&2zWeS|L$csH zYudD_3>`XDHgDeSYLgD$mPcP3zP!FM#kXd@e(W5#nfZKJVbDhm&462SeZks4f^`}D zOz}ydsc-kPX0K~@`)RxDx#I5gAKBO#ygFB|T#mOpTW0rqb9GGs?rK@EV1eT^2E!(F z?AXzfwSa3AgZCm^90P1)n3L+&t2@f&irxCLyPjRXs8?64*Cbe%@j6ZUb&AiQapT6x z(W6J@jW^y=MM%-CjyKjh6Y-WkTU#aOVotqx<{ zVw_N&E^lW$?#h!=N$Txi)>{-PuwgbLv=NN4h%u4vz|1(BowjKA+Oe{;ZL~p*U5S1Q zfuM~WH>z90am(qapMGlHq>|k7fV=C-PI=8-T|eG#$9z8g%~_e9En}bQoU6KWM*kp+ zAHJM@Ubt(EW_H(eC8d80cyqnEtDi?6c|-++F}x5y6AvCdsD>%hmMvSRhBbKm?YHH# z&puPb8a(^#v#O7C$8P=DUC*wR)~h?t>e1OUUZ>8vsw*q}T{dUV9Q8PU{J0u!2cJDw z_#q$dM_%9@fWW>9pWarLZ5*ZaKg9r6fc<}Dl z#VlnHJy>6M{k~foKJ=ht`)2OS3jO-@l!65d$j6^dmL9$ON`{OXrCixE(zeYr=FL!$ z2$2x=_j88O3@%HYq985Cg#%YXHDshAK!~hQ1Ot&Bliuvyxl@h5hq}PzS%5KGwesc5 zt8qFvY}la2v(@liyXT&J)YzC9FVmb=YX>qjFkukJuzl>Y$2@MwPI;`5xrDJsfB4}C zl^LwzIVN4on$`8M1QeWbT{mgcM2(||e|2A=;YSB#O}onAv(u(MT|1!nYwm;WY+I{R zrHXoBd_jykiOJ27J(n$8Hoc02o$^@Oxt_c!uRFfl4&a)`q+l3J`?=?ybGKWc^Hk6N zuG3)eGxd)q_`JZ_=T_*K%|W0afBeyDKkaEfXV;!tNoloj z$BwCq`w)=D51P26YVhE}^5m0Gx(vMH8paRp=!>m>`h3YrOD+Hr5mE5MxUrTD+WPm` zlhc16aU7HNIXGJe6)RSd?^b-H{_jkKhaQk$HvboIf!5DFon+NP1Nx|k9q!gWdGc>* z-Rfz_-*{G@$_nkd{N4c|N(H*Tz= zwY6*4PD9n}8UD&fS_Pt|m^Ewb)~)iJ&5jV74L5WP*E-F%3Ajh5M*6vxh4X!vOZQ9ed1FrfYPwgCO zvzWoKL4yV=3Um7OX<4*rk(wFE)h`Qn%422cda_d&cKB*LfcwwUU!h;ZjBYh+)>N~E zVWvWVM{YgUv%l*!*!xU;j$o!njN8$$VZ&RR&RcK2rTS?^_K`-8ej1+-R-V>#b?uqC z`uzXtr=R5c=bx8Nn>IPdIRrZAkoaT3jXrTFDfWyXFGPvV}&3zQkF1nHBx9%HY~GF z4^C+ZzI5V;0u0=Uu{6*wk)De7g8&Q$+;hiMTeNfSxayBQZ5u&I1Zr{5Fs5wB4<87` zAno7PeaUvpx~~9HS01v?Z7VdRrsM8gU4gs zAx{uM!{0a<2L*#XJL9Q-G`s6*{;pSFv2%WK?EKs2CZr$Z^AbON*$L2M0)mw*SE_3n ztk;J(%ZP}G==LakS7jOc);ls{_*-hc10uUZFkKi{&ilgqA|W@&Ett}@kR+TtCJmdn zl05nB4K7K(h5IZK#KkNUfgsSzLln$-J^5as)oE&$2ZOiXamO9%#|Qj~N210pz(DLc zFO+&x>$<4&zvs$$$^}TRvU!5BH}Jzeek5@9!yyq7kv}Z^a*E{087UDFIlSKd(IbbX z*8NRn_0oBgIij%Csa^AyZEV=MNebo7E|qIEkoa?_Z+V?4EjqAgn`-mRmoAnUR~)~2 zh{g?xo!VRdKSe_vkZ&ME2UDkGuwD!Yv3m7t^#^(X{{4Nk11|+yd5D4;uP5INv^ov6 z^5FLJK7IPAEZHx={L=R)Ac(}q#>zL}e4~Z~!oPI;1ln~GXytJQGd^NgSp;SolqDh} zA_{0<=PdY~r(6K9Fi0B!kjy-8+&DEnKte)-y5)M{z=3Kk&D0QR$ceO&(Bw@WUZ zKP!nwVtT9s3PPbFp^`mkF1fSJ-4d1m*4c(VVPG}@RIOT7wrtrF042F8(8@y;%y>Qd zUZB-!pp}RIgJ2vb(}bV$Uh`2dK%iYCfmR+OA|gua%;{M9Y2%Mlp-OEjo40_3hTa^G zlPJ(7Cf<;^*pssT*UeJ3dL79fnb*4_PaN7gnvq%}A|fIpA|fJ6HGk~cAr-6DlPdSt zNVPJM-|c>4<8UA40tBuSCGNaAtNKqdQoT+CuL>IK)!IZvL_|bHL_|bB6n{2Oa^>+d z^^holMCL1~+OfA7m?a`2B1);YSDs#(=5qmvh=_>%4};HgYy%2rXuruBM43TaA|fIp zA|fIpq5w4KuU>nZ3y?lANJ~USL_|bHL_|b%n=vp;L_|cX4(P z?)l<;+uerU^{kTnzVsrk)=yeJE+Qf#A|fJk&#S=f{rBH5Cr+G@$jC^w)wKR)GT4sq zz<~qOvSmxjn>Vjy%$QM~rw1N*K)(I7BT$tUH^nKLOWtYH|EkdWZl^S^7?F7*Sznl)?W`t|Gb_~VbKsLZ#EuAB7e`0?X% z@4ffRs#U90pmzKA?XrLWewjIQrj#sMQicv48W7c@&yg?sFJElK9e-~>So!iCCWqdC zAPa^v5)ly*Q6L-A;B)2z5Tz=wg0$wWu`OG+NTWuLRN;}ii7d#54I4T=m}}RrNxOFK zq+GdjDtH*I^zpA;xl*cCt0q~pWRV&*YN)`})~#EmX3d&v83I>(_wIEZ=Co#V>lOA>I)JX~!EGR$z_@nwU0D;+J#fnLtI(1arT)upHl4`MA zw+Q;89iYA7I@`T_ce1wQsr@D?AT#` z+2gj5!TZ!xPpR#otsu~b>`Hgpytrk4_UzfJu5imd*eSE8I!568tFOM2>C>mnJ@?$B z0$m6Io7vfqX04m_27$?C%a*Bji{Uh!!H+eXH+75a3qLUA%$ZXSmGJV*FUz`h>(r*a z*^c!bS=(>#-n~_Oz`knLswF2+o|HX%_UIyebUXXNK}!$F|Pr z$OW+5ADLO(lc#+H`z0bGA|fIpvTfqf&e6CxQiRl)KSLizmMpb zl~t=&86slD#>P5*uIcr5@7`@xuU_3~)TogWA0Mw@4jTG6tj8M@6XQ6BIdkTyI&%!j!-$B8FcK3J)$%c8#u!<%W;L>B&u-MMTi58>v!}6n^Jd3;>~2RN_u|Ei9q$Fb z9Q9#mTPQEu%a$!$l5EFJZ!=rAZ0dpa%atoKEV+;J{(PEVaWW&0fJx?Q_=t)n_|&O$>&)wN`| zE$Ho7&yik^_Ivj1StBeg%$PoXx?^8s){|c!*0EOg4U4`L(fa(<-kYcrW5fh$|t! z6np&OEe|Z;{KFFC>Xl1sU97Jkc;BHzhtgoJQhK7}s=8g{U)|=>{&fr%@mS4y9-NP0 z9E7{>x=W?pVUWeN0x7Q=#&`hhGK@bEA0Mw~?LsObQm-%z76y&QV5?WIT#@tV&&%(> z|E`|n-f*+Jb?eG|@4crM{r1~$YW;^Fe%QQ<+6T6S6x3X~a;f|HUwrXJb>BJ0J;1=O zqeqXH_uqeCrRUn+j)r^8U9q#R`|i6>jeUV*!OUeCGofkIrfRv>+O=y{N-|QAF*XBI zA2B9^o&Dh0-PJKtk1@_cy?XVM?6!XW`Z8wB7`4pqel&M=lb(I@$tQB@(k0oraidCw z#Q>S!)-C!B4dY*6JOW%x`}Xa#bscE#&Jk__!1y9)m;U6dKG52~fOT1F^f^|Zu6b|U zg1d8QXIq}i1;n%?IqmMqS?pgo!*I(73sA)xL=&j@SI$MUI z6vlTzFtTOKmh#R!@2Eg6#(U`4v7=+~STNrcZiT=UU@%0CXJCc;NsK?;J zgVh5;Vch5M&33?DFx}3!P$w8n6z3m-Qv~bYefM2y+qSKI`st^-$V!P4CDa%g7^E13 z_oBSbn>V+$AG>wzj-BH%b5}R%0mke=o5jpv7z|k}RH%^p@1aA7^dhh8*44EXjOWN# zeW0^Cakk8deNN@`$GYlV0Cg_y^gm`8|H9q%@5}RPXItL%N6wh9c{}@KzeGetL_|bH z-bhi976a`80t3!qDtF9$g{)6}!N-7)=?yYwF(5DMqG-{g>hLirs#d;yc@@mquwjE5 z)KZA5>#OYm z+62msZ0+Zsd(KtSJqpA=(9`wc?>+}yUGu&?hu&<O1nSg}HyHEX6ajm%k{fZ!wo8I2n^R)N~uwQH;8=>;-Gk->$a zBW4N1&;uWR^pWH6^$cT}y(%IiLhio%Zi$JBQ8O6kGpK3>Yv#)qU2iS=IJDZO1Mj3IOFM>N1F(SKFAq6?ax!)vo9hdA|fIpBC}iX)%QZlk|kB(4*@TX!TRKrPda^f zbab@z>(@`3G-;9~D>OYo#w@0aM-UKMYY1k&{r1~Q4t>Ie3DTlP3u)7)jk?8u;lhP7 zeE4v+PL?cL)V~ODj~qEtWu2BSTUIJnswAUEjgo=|3#!*~E-<`7|Ni||a2L;!t%`s- zrY+YzZO0p)wx!2m#BJUP#v-7M@iCD}jR1{1DElwJ{GtN8p7vv>juGTV&>DeWoCnk~ z#^g2gv>!?e^^V~y5O~Lr1IRAKc)_S+{4lV2^JWzU1YgyyueJjiml^F0L1hHgo_OL3 zIePS{dd)6tA2=YP#$=rf5D5LDoomAv{f{$tu76*iPfy#jQyy=4+Mk`eXTL;5L_|bH zL=F>&c8(6gbYWPM_l5UGLT-**Fr{fBNjP^*8a8hwdGh@?&?MbH!-fr0QC)8%M?^%) z!9ItGh=?c<-93J651k7Th~=ZSYT1`lBuCCjiHOMI^&uWTa!6|3-$Yg~ohO+i3QL{Z zHE-F*hK-w~P~PlPxkdwtKX*FG>v&&{22ZJsFQQ;If7)mjS2a7ZXPavC%a<;e7grp= z`I2!%VyE_2|4-342jm+_NyOCh7_1j#LabiBTBXh+HI|6T*VyL}5fKp)5fP<624({Q z5}3!08z-;4@`@xRB&c7A1`Zsk25KZq%O0&bv=MUwQWyIlA|fIpA_^p-A)%6(cq5RC zMC28;U$kRyF-RK#s#dKkTefTofRYeVdcZ!1h=_>NxNqO>*^0RUL_sP?t~_!!E>@(( zok4m8l-`~G=Y(p<-ts=IOGHFOL_|bHMC2o-%2kv>1&7$3IUiYnP z$KGQ0EK#u8a-!sS%mpAKA|fIpqBJOXWL~LMx^%gdv7%^X@P(OKD%zw)HkK7l4R}h=_=YC}3m`&ng$=&xwSD1WcKT{N>7} zORCL_VYu7{gS13ML_|bH$xyt{L!rzCAR+EJLES2pP1OF2+mj ziN7RofueFF@rKL8aE zixep$2?+`E&p-c2$iD-;T)lc#a^=b;BS(%@?{Ox*ooh;-bLY;-N(#YhC!du8D{!bu5{3> zkUAwGBBDTZ{n}OaAWHAN8jLn9EKCX%DBuY8QQ&y!p@&rPb^ZGFjzaC-yH^Em;kVy@ zb1eVqr=R5V<;&_lR=CFiL0x~IYrPK&ZpV)wmwWHMS5~cBC2zj@rflE7UH0$aFEeM( zl#(S&%Fv-h1L6R6d-Fw`_Qf{b@%Q$FfiKUOD|#P9L_|bHL`12{tH3O>mym&Z>eMOO zvSo`J^8oVZ&8wC-Y}nB0u^^+aUAuNtu3S0!>#x6@t`iLO@vmIDQmR#}CRws%ks38> zs9@CAt&a_RuA|Nc*s8Jy@j3!m2#{*ircIMdl`2W*%$X&3?%dL*O&dq>6p-24y?b{x zjzsqC*`-B`7BXwrEJwX-AAb0ulr39U1#*xf8yy|3a;Bkl>C#fPXi-_SW{qB5{l89~ zI#R!W{acpj&!1l^RH)!MzHh(%)=~b23l}<;+d1#<$_2U(t^1(h)~Qn`DOj+e{P^RK z^5m0Gs=#cqV#QROL)%=we0h=swA)S)^u;xV>jl@`?%lhSwH<4F)9ny#8WIx|WyFXP zs@$0}Wm4DF@ZrOg?90l$4S)29=Iw)i?!5m=-9E<|loNg6l`B`&%NQRgG&EG6dg{Mq zsmYTkONkOC9BK^{%uaWM*anLsLx!k80FJpshYr%JRV&GnBZrI~JJzubL96e- z|6Uyu22{ao2%h3L@K;}bRl0QPB6H`?Rj+sL+Etb;St2uL%y0xtd-dv-q&kqDIB(uO z89#o!S_i?ZmtJ~F1;7zp0%Xuy1G5i4_@FA=ci(-dg1>-uu-vR~-@dAh$a)M950@P~ zb~s*kcdqS}OSA5Sf)|3D%a$!u?KWdZ=iP`NQUkncC%C>QPMjz?bLN!x?c2-CFTec% z?A-@=6jj#;@RI;Zs0k^6p-V4PrPmh%0wPLLREiA+^abgiXaq#6fEbb96aoD}K|ukL zDk35sq$o-dG$aBE2{rpY|BJKlW;44xyV)eW$^Z8}d0=N}XYRdoXCP-lCmr(yW;;j(PmGPSQpjT*`2%a`TUsZ;7bBkY|QmfUd-^wevPwWdv*s(?2#^l^>B zH4r6ncI?=pGFCAswr}4qEnBv<{;1vKWpAvVnOoL#f{4g#OkT0Lw3Z9tHH{`BA|fJZ zIF(6j34s}8fk=EHwlMvqOLukYR_Q4l-F$`}OCae^!A4%Vj7v zfUHn|NL{6`HH%+$gV{#&kh|rsO-ZRUwl!0Mw6JBC{w3SRqM5D z*G^^m;mK_iCQOhIKKMWdKcIE%)^hORLAieYx>|++3C17$M1~`(6DK7l$^QNO)08*B zw$R4XrAw>hY01{HHrg(Yy?u~(Ieq%Hnq$ZcxAfR!kEslBWP#%+E-udLd4lr`8R}K4 zR8e0n?A^OpolEYVZ>XO;ckWzu-rV?V;9=FORaJ%^YAWj3c;wtI zug(QPX#fpMJ%IHx1Vj@O5>yr$vH+3ob?n$NRsZ$w-Mi`*U<6Z7oH(IgqZEN9WTYW5 z3kYuDmf^N-+gh%o_JQRHIN{-62(n_o$XY|N74P8|ab)u1SRjClpfG~R2&I7%SPIoeJ zJv7An`U2L=vf`Sf2VV@~OS!k+dP@al@deaxzx}3`p_Bw3IH@=8_Kue=&dx1Y_CZ8M zL_|ax@9f!g(!OJ7savRbRKBBGpY*vPR`rAlS_ zc*PQFP`{p(C|+Dzw`wV0tXnJBu3wjFGiIs5(MwOYTz2Tt5$W>evufRnRcflV+Rojc zN%h&CyLPLnaCpgbQloYQnZIDMdEhO#rLkOQZ~NA4t^3Z@8PcFh+B$GOdc7!p`wvi? z(e`Ptt(pZ3mq`7_EmR6}^;-30@|5YRVo&7R(v?n&)J#BNKo9QcM{NV7ej>n#IsiEh z(q>VN5@UgTso}HFJ~Iyk?&ZckynFWSQAKSvc&&Npp@&qVUp#FMskQbXHC7A6A~2#s z${GsZB8ApEebxxQW9>}4D0@NbIKF&9A!MB2NR70`UGv0U+X1BMqRqJHzIX55wwmsc z-g#juE3Sc=ea*4fxN&0@z(;Kc)Q&*y16+T`jvcGUOD}!a2)(g(=bRuSA|fK9tbzJ) zyLRu9RV$aKNk%DDsGvOGyQeH!wnC!b80WBo)vH&P#S1==7hmo#dv|>+g@c09B!mnZ zK3XQe6)DxLRaNP^BS(#sfV=_HyXXCYu02M!ud%i6jiehgV^}qi5 zTefWbR{n48$J)mgM{Pxrcirb3Wb(u)sZzO;oIZ0_1`QdZZq*(?c2ufuk$Y5(uHG%9 zaskp6q}8&aHf`FZ3aKI!O3UihAV`5f-=cQN;!nZNe9Yde6tAUGd!-r)&(4I4I8PYlD8_?!va+Bz>RW%e~Nv#&YUwDDZA zVug$zJzBkupt!%kzxtwR$&w}3A2Gz%So0c0L_|bH5f!Q->&dQv*9~cVK8ri!yo?(&QvF^| zo-JL0*>dH|$(S)?Wa!YLs@Np5GPiEsnx@AH5Mn~&30DZ>S{GZ*&X6&Sk_IS1i{LDR zSa=!^o}8n>(~9s|`5rxbr~;c25fLi$?4_4pl7N5!wHksuC}HsKyYEWhzJ1krB8ZE1 zENL0D7;gm1G*}l;ZHkSJP4k2>BWxXOqwS*X2Xh-w$eTWWy83e9*I$2Cx13|1B100l zx#NomaMwI>*LGmWj2WtZ2r6H^cu_s+5W!k!*g7w)W#%<7v#&XNa2>*v3Gqdd26JNd z>ecE`SJ)bBcg_hSdNbOmbw=d^5D^g(rInO;UE;4?mfJUz#U%Q7W@n_vjT@%gJOZQ9 z^A;Ei0=o;cgJ16VUwLQJTPkkz(W=$b^O^2xf~xk~dgA0MxpnK7bbYEvs%D|ICYIw# zYgaD)n(95u96sVBegSzUIJB7LD{#L=sVzRHf9n&3y);e4=YGk8h3&)T*0qZg(XqP( z7b#)uvy_1*PMoN+6JugxGH@?MMECKULqtSGM3l3A`RPI_SSUmS0}DDm5HT0dOQYuP zWb4M&;vZOCnpg!tVb9)u@^IZ+5_{9oUzC{hr{%{3Ke@bpJ=#94+k)U}&AJU`_|QR8p?rDi-0f*Oa_|Q!TC|AT zjP^NuZ9Q`Im~?ooi+uUT|4Gpz_n%;IsdVX55?DCx@+@(#+{O|)G#9{xC!b&cM`F&O zlA^`Sh@W48?AoFmggdqAXkf zk#z0+xN2^}g7*W+@p19yAnnOhzohDl-ZLyLAz1uWw=U*Id%xc&Wy_XP<=Wh_eM`35 zg5^D)=`Jfj`b5f?FQR)y+%j%kMy+N745Y&ZN@D5 zX3I8-xp+}le*B3nT(ngF`)XgciaWM%$zEG}^?XJS9X=xK*MFh@uE$u>NojP*hzyV22 zOjJ(+JA3x53eZ}9ZA3)mF1+Rt5fKp)QAWF&oG4f0|5ATyP;fSP?mTiY<*v3!saT=B zZ2kI6DO9MS^m_hfsawB^3?4dCnl^4IUu{^YinIb!MnC-EJvs2xL21~yg(@67Y{;Pd z8~In+GNonk>jPx`8xy2rm73D~g_pIrl&O;^s=#jjhRsy~bNskbsvs=5WBZouwWUPy z;?n9rEhHo~L?T-K$MRz$I|lFQVU-JDuiY?e#88PGH(EaUaDg;v)LfeVr>)G5{!lkH zmoguoq>hBCT)y{f%<5q=S|TDMA|fIpq8!fM#b~d_{VjLy+>$(b{3R%)h`MJ#Jgk7! zYS21M?!VUxyjmBA%}Om=JtA$}w3e}>N2F?oC$^PbbMDk3HRr$D_&E#E5)lzmmaA5{ z`ma{G07OJYM3kKc%DKAEHa1p5Lql!u$mn|H8FKpZ zvhKh2Ys%TYeLi@5`_p5`{_Wc{Cl`Q-h=_=Y>SFSj< zQ*WX54}HW>U|^s;^2j4{?AS4H=|YCl#>QKYz1CjsSZaSh|NQf5=Cw8Lv)rh=|gqUadJk%mr{#K;8lp7+l0*7A+)PjhCQc=Q0q9JV{8A2h==v zmQz7mKR-VyR;-u`%H$-+j~`dT>2JUNR_@-tD^EP}L{92{wxS(NeA$4X*|TS7>by3Y zOmgeit!z1_JU={BPQ7ju5fKp)k@rBYS(Y^*Z-)8nQqAP(sQ!^oMQ62?IiwOEIB-DK zJb#pO;iWDiLqSAHi)|DYchRC^d=Oi&P z(cI+s-g{3fRjQ<-ASFtakjThLxp(iL`Th0l*Gru`btE7lK>YpvrF{AF^6tCun%`f% zc(K&1SyR1NxNu?V(W8g_^Upu#_qB2V`s=Ud;fEhq+iB3Cft)#WMh+f4C=DAnRLju5 zUw-)|&F8jl+a^t#G*Rmy*Lu#JIp%e2anvVkuC~!p-*4Z(ErSLPQgt;76eu8FyLOe8 zD_5%dW|`7zw7uG~#J3FiLE5L*cFXN)9L;k_`_;C+dGluTaay--owoUGK^s$^AI8sl zJ&w)=Z7yxuvPF$Gt|ho0oIH6_Z*yka=d}5)z1F*)D(0`h{whnBERp5Qm&>?u&!4Y?rJ7v1a;cy#-a`QI(4j-}>Z`A6Z=1dO=9?-gc=+&P@%8nU?%lh~;K75{ zXR!>aa((;uHLtJf*RP+98Z}BzpFS<)$B&oc!-va)1q-yd({R)$dz@{fqrMLqFhI>S zjOmFJC*;vbAC+OlhNWskdfMxVy?O4;en*ZRDR001wmJr_TD5YtTd&0P!}vL`$I-c< z!8sNk9j&etxDLGX$}8GiPRVZPDiIM85qYdnw!HYamJ8sqjiiiqGdWSN#{Z@MBqAG3 z{|bF^swwoP8R}>Kr>jh>7fme)WUCSFT*ybmq(%)d%z`ARxfBXV0EgeOkVJxhXI((3FyrqTa*j z4jed;Y8`vlu3c-&n>VlN?%lg;HLV@nwrw+i?BkC=R@=2+mMd2-)2&;#Qhg5Xu{31J z5L5Z`<;{zSn^*tnqmN9! zzP{#jUXS)U>-lVbUV6&8N<>6NL_}F*CnC{PXFMuh#?`CgqTw7pTC*T z9R0y`;^0p8CthRu{v8`kw{Iq?b+NwogU_8me?DtEPUI$9ELEG=_*0wnnEzVb6){*% zZX5Ahw`kL*ja02#RW@wcpfWqX)%NY%rC`B=^4)je$-sdF<;amEs!YMrqetcD&70D; zZQE2`LwN%%M>b*o`t?=mho()NO3Ril)ot#`q{VX0u3fuSCMKRfmYkfdirnJ!*RNk! zB@Z;!t5?_ls>(`$^)l=`AtAy1BsXZ$qJ{cXgV!@>&XlC2B*~XA^ zMf~%ojzJL7|72*8wo|80swBYAKmV-irh2QgWy`8MsHmfhI16lo~qPAe0;nL+CKHvQ|cD@kdP2n3gX2VUsOR6 zOSqlcn%*)ziOQ0XkB{X`yAb37dwsG;uRVIp&_<(ux7U7W+p8VR^m2B;C_j;1X=BRs zLkyksdW@b6VC#Hxmfm*smSxqsN<>6Nl+zs_-18HQTmT}k7Ld1q`XM6Q(iNmd-9)es z3TmRFqEv7bnWhN(HEPsId&_H~?kgS;wR-hxdHnIm)dPD_YZlp^_SCLjTm2vtcg2bo z^4xRJsrs?Vo<*%*j8(~!CDkTA`|LA&n{wKY9XnJ|ShI8IPL&C4oka@|J@k;_KBbqV zzE`PIMRMoPEqnItQ8jlpc&*8d_Ug^^%-F9t;`#AEw$Azd`Sbs8rGGg(7qXh8_Ib*= zN<>6NL_|d7RidN%N2V(}i+jXj)22<*p+g6iCWy3AONcrmy7kB-kEjT3iy?UvqKjBGMckbL#bqsJ{J|2ONd-U-X9;D6U>1eH6x0dkmaEXhHllAM@ ztEZ(QI*Rl|q^%+1izkEOvv}&5JH7SRTk76uL==(EJ9q9})qXuVet4ply*{~%qrL|R z2g~!%KQBXu43WUVK&e)(nrz#)O_nWNrka4%+RSLLt$ChVZ?N<;sK+QWB2a^x z52Z_&R)Jg;bwo-rf{aL;#beo*FJG?G(B{pXCle-2aO=<@D2r`YtXNS6jwer^EPea- zwYd*ReR3BgeMj57cI_%Xdh}5D(XU&#P9{y7q?!;A5TO3d==R#0=NY|UZ+duEE8Cott&K?OOBJxH)cyt&V9`@2S5uf{Y3l_Eyms{5^ zN<_!*5?rK&H};D}Wb4+g>Zxt9v9YS&M0PQ8;zSk9j){rME?uH5kX_FYPr`GRh=_=Y z$a{SG=|U-3C`1AS3p(BCm<#8nQS)}Pb>nLB4=gTC8aGU{jXit!NqATRsnwvhBwUM2 z^*%n=pmjHu+(zWB)-0Z(VyTwSojRoE{8t-4mp+^Ry#JQzp2RL1uKu2`5(h*X4Nq4) ze*Cy9UW`&12&N%hdGzSf8NF){v-s@JVCDjlci?$TL_|bHL`38q25HHoA-Q|jtXa~p zUq88Z>z4W^ZS2^wss=0(c@CbdL_|bh>dT0=?U@TeL`0P37^Ka{A|fJG;KZBNsZ&P| z95~?3T_6vY9nKF=!gG~~h=_=Yh{#FNQT-#+^^`Co&$YAq*#9yYfQX2Qh=_=Yh&&&I zv_wQiL_|bJ$kd}yuh=_4o`= zdF-_4sQ!^Ie2grV3EMq~xd22&L_|bHL_}^-Feq5A#>cv0OGH^C?(a)#9y`maAnn$z zTgAu6N3LACVs}4A*CXRNrnY6bvB_@z@pf5#JhFQK_IO&`#*G^%K|w+4->KcZck4Di zBio#j+xBERwcp;#$a!MP`uJME_9UL%HY3uu|Fx}`FEbZ_h=_8Y@|A1I+2cRT<%{Q; zR!d$5X|$NP`*&?t^VnIro%ulX=FR2OrArbL5~4na|4g=N(?()rV;>!GTg{Su4Tbw<6RwhlFB+Hg9Q`Zsg-zjU>$J3qTZoTcy z6Ov#NzeA}eb(N4t}=R_q*q3?Jtwd}mxzdna+1O!VN$bpeL1vm zyChz}Dk-LvoYZ~tVyJCUpiq!hs9ZzMV`n)PnDz7XlVZh+IlGTEjz06j9p(a%p5w=l zOK@D8;3eDlpWdaLSk*Bo_~$z+n-w{M$2uJz~Q#fvgx#0Yufi6_)A z#^jx{dVY~HfBf->TCsim_7WBrX7fWCc|0?6+ny|^_S+j7Jx?fW@LVDyqMRRzrVlA z?CjB_hy3%;Kjx+)I|TjSvSo|Zty@>E_wd6H%gK``)jDsy@rLTNwN9Nnscl(v_n2z! z`}*szRl5QL0;EBM26E=i898|HpvvsTGPM1dUw$z+$5Fo#gd8+zkjj`YP@sTx?b=mV zu3VX>{Kb3ky(g6_RZ_oblqgX`A|oT^-o3O{zl#(pqJsa(G#x*FylmUHO>W(~rP_1% z?p<{|X33Hz)pjt47A;z2ZYya0)Jkt?uWcO{N8{|M-P-myZ{BPk!*%P{ncJlG2je+q8$UUUbcSydZ|;Vj+%2gr^=TvFYmtlu3Fd8 zF|n4Ck|L8QPnL4!%1NF)dDQ$u=A_1%d4u`Zq)8Liu2Q8+$(%WJw9P2i{QyVD&|Y8l z80r7dKmV+IozXaIleGm47N{>ov~x{^Ig9HA*qeLS^u|eVnX~N#N5^yG#EH_nb!)XQ z&Oeknu*I@X_Qu`WV+fYpwtQ{tT4cG7y?JQ8UCYnmoU_*tYxdT4G|skIw$I-7T^UnH zZL-|A#&Vgx_Gs&6*4U?)k@2&4e(9Yj+8Efoc00@7m^(V2wrK6NcdRUwx^uo`s$2l= z^Y;2_^#3;299<{1ecQVZ=+QoB*=8alqU^>;e8iN(ELqAKkkp4cZ;w+!T1&NR)si)9 z)~H3u7DVZTwQJW}uA@gJtL|wqrrAwz-$5Z9Xl}iPYa7!S9aEA^Zl2>1S zHBEEheDh6-j*eFE`}+FIE3dqw*6Guyj|zxd)>OE^2HKu4EesMc|_^@hU z_wLR|zyH1} zSMckvzsiy&OVs+Pe`gPZcL>1Y7daR>aG(k%VSI5M5J18)unyGfv2|SRjk7cD9yxNP zy#4mua{BaXY1OJ#nkHPkc1=F|=p(66p@Ir#gEQOL*gGE1&ate5FK4=S>!varj~zRv zj^+IM^Hoq3>>U$5!-o%7r6Uli#r(qgi2$p{nR(N%Uq2Z&YLq&T_>utIMgY?mN5{}n zU-cO2zpeQUj@qQ>$tRzbq@*PI^2;yHZ{tgpRjXF1FV(=_+;fF1?F2{16W24#e~)lZ z8ewbPT{(vK*gJL_XXl|MTm8^uZ(T>@Y=o`tyE>-nZIi9`Sjw!iPY)yG=ji-$^*nKw zy)jSk@l4OL(qrWRGkT0(8;zX%L_|b6jep*JawGAYh>!hX6_Mwu_Qj6qRJj07xtW}# z=D(Oswm%mg)j!gyng^D0=gzHCOabXjdc|mw0?@m6Ze@oDL2NHfKK`bf*bXWF%Er=p5Yn>JOeqflbmvSp=Z%a+>5%`$3C z(Y{8F8max@x1?vEeO9HUST57rjHs=>eqX>M|l`NL4|!9}oq{zTSD~ z9eL@cm#jCDiml^EDWkTHZz+)ei^x1UyM2wl{%+04F?7^dJx2O(Yd+&z1fb^}nxHx(G>8I6edvnk78fb)( zvD3RQ7&)G}Ug(|Ej@TM^+!A4LzB&$MHe+XhK4QdP)saQxOQoz0(B?7F53k zAdsmSfH1<9F|~X`l~$P1dKrQcTAS_l8!59$Z^eD#mJoQ>0<%Yt9#!LnCw^JNJ}`a= ztXbZNtOYWW&WF?+1d2f0SBn-cEH|TG&zw0^t)DMnzEtm7vUgncINNU2w9vDC`*wA# zzx(bx6$n3ae)(eup`zK}t18vzQ;C7gTsGD-WQ&C%R*hLN$eye?>* zJ)Z91?qg`{*jYZw%-%fA3>iJnu8gUXHn~GqkG&C&#?RIB>t98>U7YHAE`SS+99w(; zzJtBv=IFE5wD#Ehzl|+Muaicu14KkbIZfVt1thF!N%`l>Wl2s-P{Ays>;|vXtU9N+Y2%yNDU~~s`rGsLWK&Y z>Mw$tcuE+?$uek>UbgyZi?i*v%zU$i>}UkJaJ-S}i;U`y9XmR`eK2x7+&#x!p*J72 z@dRX3p%5Rg1^9(_@7}#KWy%!k*|VprcaW9z+HQ;1Cwp@n^DZO$YHL0lX_GAol%t?D zY6Rd|pk4%Ol7Nx9XGw1ywYGuwcY9;!Dcn6@Z5=yHdgG_jdruorZ{hAS)wpA9^tPeV zd(WL?kJ>(fFM_S%i%US!ct_)>waMA@E2I18ZhGytMQ>egoGj_BXOA=2MkD7w5fM>N z6p$~!lnksaetvoH-<79xcP(WH56}MYbf)G4crKIa-^9fvxp(i5&32|MNUPoAss$vi zp(Fr;RmkwdFAmx*_1*y4v$#baeb8>j{_L~QoNhYC2!UM`PsP)-5Kw#Ifd_1EC#%QQ zQNOEHsiJ;a+_PtoDr&32Yt2IsJ*0l|MDaYWw1YibP}3T+PVkHAjvYJ9#W4Y|@w6#t zGi5C4jkB}uHUh=}PzZSS>ecf2EX_Gs~CNsz08vb8^AmP4!`^^8>(0u>>_o_S)zDUv78b4RhFC*jU3cWdC{JYQD+iQ ziPIos7TM>mTep_*@NiY%6ptmxQvnT4(3Y zTW`IkK7+spvR*N_aJ=*wncGJCs>f*mtr=;PJt%X4r|_Y!G@cxWOg%6<_cV^?fUE6v z_INr=Z`|?pL`U=0-R#XnM`H_m{lJ*((OcJ@kBWupaQUZr91#7lJI2}?zjMyHNd~2_;+vCtXVQ`+BCJ?(KQDD4m#*C4nLx-yR zrrJYhtl@zUcvL#-8(L;rdNO3pB5<*M`Er$EF>l^H6@YRDenCNy8Z}^XOR+s!J*Gzb zjUZOnu3e=^j~?nae%uy~z#M1+9t7v{5HDm#B0H#N&6+ZO`gFUQ!+H=TNA@uu-;9h| zYy->m9^T{(TjT7mc3VQG=ubcWq=G)qZr{l90B7cyyJ%VS_%Z{x>7twoGQd#U0d<1M zj~{Q|6@n57ETBXO0<)+gi&7!Ts@HBWwRKGN%$PAljVl89_$9e>=gtxn6JuW0nR$cx zjNo#`iWSut2$LsIR<(U?adZrg^i_{D{kP_*P4=Mt49+doOGdy}V|4Cm9L)i6wVlo! zPiN_kyQ{}AJ?zaxBV()A4_j=l>#lLu+rFz~>Zncb7@Le5d)$G8GB@~=(w+}L{80TH zhifLTLkK9M)W`=Pd?5e*?|;=tjf|fw=a-T3bA{d<07u8u5qrnVnvuR?dyf7;W6jxX zV|wV#A*0KPh=|B*?H#&hxOFZ7p>_l61E7c^?vM92TeogiPvDD< zjWyS1Aj)i#c}Sn>ZeL`0O6efjA^DOe~(0s{*=Jq$4y&P$`_?PTl5)#4vm zT$(g)m}VP$_U@Br&6=iJPLvbu+O=EyZ2I$lS55aMcF}P4_jIMul4A(^p!h8A?|}X4bC-k^Eh%yF@tNMJ%-(lq?~gp2_ocjf85EZb2?>!obLN-} zvUxisT%#}^Y7gAHbxYm1K6dO_Rs4=JUslX96d|rxubwPkyg2haOhiQF2K@gF5fM?g zFn)C9zjJ&p0RCTd`_3Kl_w&mZ2Q{Z+CT#}8iGs)5BcPdG)TvWP4jecjiHV8oX(ngS zo|Vy~N2{Wwl=-q^j@`a}TNRc@p}DfOuyT)Oa9ZQgFH~;L21>tgPcBd*4$`qot?XOOZ$$UCA?%gsZqOu%wO=oWFl=H z%dA|>Wrq$OkuFc-jxUjlRcfjX-p<{gG4I2g_E~%F`sm};()>SdRhu8ISWWu&A0St+ zUQ?U0wLfjUw%Q5WI@`YePTIEbr26~iSDV#)3l=Vs`i)yiu@YsadaZggdCGM402uOo z49pS{5qYY^Ee|!w@wos*L_|bHB2%W#l<89@$&T&ch_8>Y3?4cn&9Dp^K3ZNM_^RyR zw^N1v(?r8SsF8HxHN0pL@l~;nl;QHKXLMu+IH8cdYG5Ny?gi6^6S?V$dH#x8(v55fKp)Q#B_nO^e5;~iBk0tA!y{qUm< z7&KJwrQEZ*D`(o7$M1jX!w6c#+D}$W(IR1KwqLMd0Vz?cb(-aru}mo`l5qVWi8+5t za{Kv-pI?B@9WqEuL_|bHL_|bnM~kf+|HE7W_ll3bB*jXUli<*zax?jcB;QOFu?o66 zYtP<&@>I7j=8x_DexH;rTSoHc%_{{97F5gQGiJ#*TeeBe z#f!4?<4s#dKcg@b}*`pnt#$AuW#x^25GTD&w>uZkBhu3m53wq4@l z<5ejFSCuYZQha@VWx>KFYJVHQ+$4*ZEK9XHz5N+!rygX-4jk~Rj2bguR(-No?en+a z&dd7GH>f9>Q5G_pB#)n;B;805|GfEZHiUs$BBC7cz2_e5!dw6%A|fIp$~>q$n>%+N zxtDU+Z9APhd7=u!)^FHc1t!Oj8zs;8?y0tq%+e1(cux-ebWj>LZlUVa4jVEk)xOJ? zDJ_FvA0Xr3m>?Ca)Rf*YyqxNNXCPyC+LTH1$(m24VUw1!WZ4QCGje#UP3Y~dXc3N?(4uPzn|bk-)(FWdWQKbK$%+YTiz^ zZd@(?fyJeX)dRc$r3k{q3P`O6t=)3l{f?cxq|1}f%ITAb&E*S-Jk7aNht!<^YUAh9 zXVahen`gQwv5Wo<-bY9Ek92D~Eq)t7c=*bdE1otO>2mh$S(T?=ty(qR?VLMzPM&(| zDG3V;liay;OGrqFv~1Z@HgDdXYW=vlI2kcwgjB9vSpotAq(FfJ(x5>DnLT^9dc+=B zkD>KzqMV|6^X78t(j|31f%R+3xib5@=t`RLkFrAo>4>C>fp_3Co__HFt8`|oAetXWdGZe8_05#8tK=O@LA6*CWq_3NzF z=+g%~F&BVr!`&&k#{2vGr<%vvO-|`&dRSk(tX~rm5fKp)fm7MD>({TBI(6!(%uoE{ zS-yOEdH3CS)rJlnIH2kl0J2DtMH>+jpg~uc<`Xa#KcH+bhOHZMYU%HbO#O`D9=3ejCtLD{raf@?e^{4 zrDMmAQl?B9saUb1Jonsl^5c&`O3j)z&Fd0*gT;#%t9grSLE*xMrALn*slJ%7cfEj= zloXjfd9su%S5ETe$)mpDm^5jUx$D;1a@Mc)INIjjyLV;WxN%alWJwh$K_>g6MT=5x z%INj#z4zXeN|h?9?cmFq$jC^!ckiBgTaNm#$H-?K?N_h;D^{#9-`Suyj(W=+?MM5} zmMvSB~BB!-z-b~{Dy1*I-$B!SE;NW1j4&WEh&p!K1mMvSRGETq#`fC|7WQbP`+=dMs)GvYfg}G?a zqSC2TCsmRlFfdTHADMpmkN)b_t7YiWp{m4zHT7>6KSrkzKoXska>+4`=qHvG;F{k>hL4(YV{&p9cRf z;tNZB;gC0PUO95)i1t=0_Qq+dt2u?hF1{Re7jN#Ty<_0YF$Z41R`dEL zV)vZPi0c;-5fKrQHN#H{+q-wKy0sr!EVvzC4}Oufe)8AVt5>B+ks>Ms_1R~iHGd32 z%$YN1di+zu+P7~nRjO1`ZN;se$aqEI13@Saej!Ijp0BU3`UMj8WV?6oF7@iwQ>$oW zhcXAqva`o}46R=id8$u8{ZxAQ?kx!k3G%}aKj>XAd^VNMohBFH+O=!y8iCAod|r?B zd0_q8nxk!^{0Oc~$e`=htC#uXxGsJ1#TV*JCnMJ`)R4yA0^7E2lg5o3o412(RRr3w zACxgcSrmKMPHWmV!`5dK6B8ZoR~rLl|J%Cu9y)X=%{AL{Y>o5}UrcGA!QBCFllrs}7wyuF{=7`o$_>oIUGGtQxFlY`Dk-KEPaY~FGhZKHDNra#9;{eRLW_o*munn7 zB`j?!rw#S%*Hk3t z^dA8hSFV?iK4WCR?zr9>*-ubVkh$+wt5!At9f4Tf7K}jsFTea^_ZU07A4iNF-+cM< zrP++5aW?{`9gMIwR>&I1+_bE54*2&LfmwS{4#5%v-g>;fpL$$9=D_P0uU}y6oXqU& z7ZJI`YyUKVHBBx65qYV9;$r3dy*s6P?Z#3mteE)v=JL{>P)?JQa!=x8FU#Sd_e-66 zO{8#0m~%rA9o0Y5aHJOZ;-hHS&p-dHe#1dJ&Xg%rq-W2bGJpPj=l1L+P^1!32i(W3 zK}s!_p@6KGE(@qr@aUtDs-N-W$EzPiv51fQ1?AHjrv{Y@|p#9xm z|16=e)^MG4#M%916i4H31fBq8grl+2J2s9WCE5sY@25NQ`o-&)#?d)xi>F+_h=_=? zle4FeNR5Y^N$t7~vQxJxhbUY2LG=KtgWqqHdQDn8)$6psQ9Dq(c5PMg?UPSFkqY#LqkKQUAuNF70U7{LK-YX${CTBd50^s^Y~l9=?7w8hqEjO^D)`w>J2?P*qkSD0!`iAJrv>7vN~oKHr-b2YTeb?)I)ZDBy=@jQTv$B`3{PId-)q#U zp`KVcckW#E14gb_2yEi1P$)Kg=gu8fs{!|@V+?TLHNMz!)PFsWK7%oHv|l6bN5AnD z#|aZA$fQY=)R_3-#y03ynvP<)oP4al2e z{<>5|+4Qf_7pIy+Uz(wQ)_=Onw0hBWQ`}z{w6{%1jvO(yZ{OZjv}jS2udlBuC@9GE z_~Vb8PMtbsUI)gE8Dk0!4aNPfrq-=nt7W%t-7*avIM5Uv9Bj&$FQ4hrM;|pUUAk1Q z6B`?w>hqqWQ>RX*X3d)EHs|Wqt0sScf7AT=^Gz`^F{ZwK`DVra5!ws4;>qTehSc7wgwVo?_m- zdFpx)5D;K$)25AS$&w}JxohNlarf?BQ&d!xsZ^;_rd+vlnTi)LZkjY{lDT`eZ{K#srM?-!=72TjKqp`LX(n?4i1aynj68X!i4!NPyD(y6Vmz~fZjw{_Nv`4bi-?FQ^L+W~ zLMd1%L;?c~I=$1F3+JU#^LDaz<7)8_EG|tNH%zmQJ$v^_cvu0c)u6Q`T#HNfK0eo= zbvJdlHj%elvv`Jzt6DmD>X4fAUv2zc`fU31{#&Md61!-)`n%y02Sh|flriw|&Ev<9 zOQS}ORGn1>quzPv9T`1(bjIv3i{zAk5>d7_ck{k3%mpAKBBG2D9o0XQky;`mqAZ3x zTV~CgCH?yKlUuiLsnmh7W5=oj#Mwzs=_e5p5fKrQ5e&?doGI{qMdkt!QX03sqHA_Ewt zB_bjsA|fIpA|lFU49vRfo1>@3Fc*M`h=_=Yh=_=Y(uqM@A|fIpA`dd~^p!B?0uT`q z5#=z^QT-zssU;#JA|fIpA|fKnWSJM3y|LrnADIh4L_|bHL_|bHM3hSA1!;+hh=_TFzMX6vn*J!AWgH4^v}pTMBXMd&kuXoA6qO_P3>Ky(z|WY_O)fp z7O7jeuDV7({P4qa^5jW#^R#ugZQCYInlw?@(o&^L$(%WJ(yU`y14jECmbtqhL_|bH zL_|bxvZu{AOPCAbBEv!2-+%vIx^?R&?c2APW5Fn>7S8xh`dc^oga>_KStQPM!93#mfn2xO^J?HA+sO zJ}u+NkC)-YhwFX;q$jibK}1AEL_|bH87sHZ&0oBDQSRNlCtbR9QCYK4vSdl~$8+b- zErkmgRRYJ%$YOQYfpx3+1|Z-t4z37ty)QV zc(|-wxl&$x?KRbGBmFb74v{y?tnD^)Y-Q)2ml6 zxqbV#s*9kBjEt1W9(zo^)UJn9r%qLWcO;VmMvSF1DM&-qD6~TfTeo%>Z<=31KgH;`0!!*@y8#tW0#2x z%gpm5Bd-L6R;*Yd&pr2?dPo=^{FN(LF14Cv5CWNG z2pH_%y<47n<{51>vUBH7^WQxYZh2n3c(JM@iMq3vP&XGDwDs!MGt@tC9Rng;vg-V> zcl|L!?;52^@3x(>W5*8Z*|VqlBe)*ofs6U_<%3aRCI7#JR^2&ngM$y544WK7i! zpTEdl03sqHA~L3MNSM^DU0)9E+b)UMuS$x^aiR*5CqP+)0)>L4LggB29y={Ms(+;6 zNbRm&yHvEbb?eruAZuJ)oO=9u>C&ZDbOG>4a@e$KlXU3NK^0#N3JQ`wefr4Ip+hAw zFi@qVA{BS}^5tq>PlY~Qx^zkU_U$XhiWN)MOhi~vj26Xojr7mRIz-+iv(FDB*B>MF zu2D#d$2Up#u5Ir2)?06>;@uBD^pLt9&Ye3~X3w6jc2lE94G9homI)IksKU0mUE%%r z-%r&9Pw58{5fKp)k-LNz4Oc%#%$<26gt-8e-K4!C*9HU{5h&@@sgnxKqQ(JI>NaoQ zY`!nIT)A>GX3Q8BkPQn9Q%@HI1RtJ!@=5jNoGMkS$hvjwWZJZ8HumHhkS^P#Ns}}I zT6p~N$5nydRjXF1*GBqhWE~=Jk=f^mk?W5Ude)J($=-6F?i$|7_ zD$HB}A|fIp$~s?ux=;!h3X#CTf=)Lg=E8Yt)V!T+-MCu(1B*+O#tqYKW6$1w@?fc= zQld;HF^NgU>Y*J(*-diN4T+EaQz}2yK)(9&3+c1z&--08-ILfw!`0snXU`H55fKp) z5fPD>`m|f{Ru9Sr2o8Hd{`mET+)TQW>Y+wN*$HxElWrtP?4{o&tXN68mvYZ$_YBve zB_bjsA|fIpB63yUd<7(|Xi53!%4JDTN?>r7vL%!?@XMQ5iiDSz;Lu_!i`EtfW{HS0 zNkl{h|KpKy+MQhWxCi9|5D^g(5s@PS`SMH2z{=w1msfJ-$|d4szfLESS2CH@^Sf@| zOp<%|?%3`^bX5OHMrw(Oh=_=Yh={Chc)Dm~<^p86yLWD@AEKO&#b}9$h=_=Yh=_=Y zG8qH2L_|4LaK-QQFc*M`h=_=Yh{yvlNJ~USL_|bHL~hb9%(oeH0f>m4#UL#a5fKp) z5fKq(so(#&Ag>M>ES0O*mSQE!O6`XmN#vUos{cv-f1z8v^rw@jZpS$6K) zBOM;=EQyJU8MEUY#AGtbt=qSAP>;PtbX5OHMrw(Oh=_=Yh_cL}jej*^E&!2c*vPR` zrAlS_c*PQFP`{p(C|+Dzw`wV0tXnJBu3wjFGiIq(^-@bMmmNBEM7lirtXj8Xm6|H8 zwsW^yLIbU@$vDID_5>$UT?{5c>E|M za9(*29xEauA|fJk2gHST?cO8*eYLOn`lb$36)IFvp6}gLK3n&>p*FhfhmJ6>mMfR9Oq%e99N52GRxDj8M~@ws;UmYW_g&qerKkyS%lNS)Rezf| zZ7lChogoXCER)F-qvYWJy)t+9Oj*6=GkN=+X_gTa%DwJLJy(q&0bPS$o5`X2g+`gGCCNZUBORj0$xM8XfA}|^~Z-Jp8 zu&XLntYH3VSZIi(q@<_Xd|-McD5Fd-o^O@P@IwQANd zf9%A`Q)=5?pXy;=1}JZUq(nTO?aHNJQ@uyd^AR8M3&<VJ)D?Rrc9BA3m3{CfBYduix!ps z{rk(9af+Isf-hu|)q=>xu z;*0Xe8*fOiT)EWyM$SuDt}EECwr%Yi;I8o^A|fIpqU+!KF-2g~}`{(La zdFq*7^2FmERT%;VYWMx{qYM}{RPLqNt_AB%JM;MEF*gan2gBM=R!Y$#_hWaK3KlFN zB}%onTtqG~rKCv0^?xMh{3*%p=O=!C0XDZ{I57MB@4rj8Zrx<$$dR&U%^H5m^jF2TXUY8@CfXpnsN*=H)Chb+#ozy4Z=3>jjxQJw&`PY{gUuwg^0 zpsWU|kR;{u*{&@5uPT19}SIf|$ zLv{ON@7QT@+_CR+<;tmx;gKUpw6{{R*S`S+2B`5|zI?gLL`Gm|*sx*d&pVo9Im(vX z65%De0LY^DmN{mNqjS%b&v8I77UwuhuOQ3+VY6UmqzN zURL7&z9_{@SF-)#=&1gYh9k8XFJ4r+&Rx26k@DrstF0o1R)feTQaJ&sTu7^gt5>he zf&~j?>C&b0=%bISWr!dk4Rq$rnd-GCI(_=II+GE3wFk8V&_AT1J@(jRYE?vEfBEGX zdFP#X(nM+}O`4>N*#aWiNFPONDefCbIxMz@Xg6Sd>(%?;*@DQf2Jay~ws-H|=AtBe z+7R7YCckgcAwyk4lX~KjF(yCP}%SF0u_3y@w8)}S@GK|z; zK)N5sY3kIe>b0XeMxFx^dvBRndahl&X7_ya^z%9~F;Sg2+qP|!#*G`RE~17B&Qp9N z^7h+rr}|3O)_I9q1+H9IthsBv&>kWpBFZqqe}%_;NiF~pv13Nc z>C!t6#sqL_|cW;;Zf3w^sqe z{rmUZ+^_~U5m4u#S+i!^BBe!(7O7r)EA$Wd_geP{ug{)6tG)`cRJH2=s$L_QjU4lY zganm>j9@Ja$J&Bg1qhVlbNIRh0bT@muV24z>mv&4P#`t;lTSX8wr$(WPe1*njwcH2 z8ujqQ4;xz5R{ykdYSN@hs_mfIug29mMp?sK=9M0#{M$RcQ zq4t9>h!B9rk0o2@CAfNBvE;7tA|fIpBBJaK1!r^T&Lj6y?xyM}o}RV!>o28Hp@P!u z`In_`{U$Pa=tybWxS@QtVV(M&2ax{x;Ro-@fu9aa!^SOC;n-nA?gwo(Wy_S7!LJXH z@o!9!idAY#?-yRy-cqJco~Q!5^&2*qDbr@k_;I7;`QAO%d+yl2GmthrZOSD1WX-42 zut`f#VN7jF*BmR@G3o*40%R#~m}8m2(K%p?tLL~@Kxp&k&ALzRLQNG*w%X_F{?p4= zdx(gLh=?c$K#V}A1_6SRAG|-?;Q+L5)lz=izbDmt&piEPs@LPjj8H#%YSgGM-)#Cq z?=2<0+qcxBc{7Ro>w@K?G|Lbm)`G+uBmHsIPQ86=p6k^^{ZJ;c6Bjd_J*%l*yS6Gc zh)m26Km1S?V8!k0pjQ+FSz8FcA)sh!=gys$FFg)QG_-5iPTfYV7X-yJWW8$r+p%Lu zsy^T~N@DGuA(Pfloc|x~{lu zyoiX1JW;^wp}m+3Ktx1D8O?DD<-d?Ui$H7Z)~zKxJY3@9;$;2$^-{WYX>%a5RH;&G zZ9HiUwMLPB859&GefsoKPpb+H3{+3EK}If~8s+Kc&6}rg$wyfMJTa?UwQ4G;`NI!C zs2aL+=FCyI=;Ntic=8o$zSgKwLp>1k8a0$2M->U_uqd%)#mla|IndBDwzJ{lTWI^4vq<)_BCeA7kPc~ zz!T)2fBt#ZKgx%WY!Cm7;L_|bHL`0O67|xzWAOnH3PMtcbU@QUw$RNdS zwc2g#cxVs;enW>2m9Vfd^)NBOU+zn&c zwQE=D(W8e{u3TBo2|UCI0s;aI%{TH4_UD*q%`02%oqOQP=Qtp%9uFjZ_uY5ZbqWtQ z#C7O_2Od!G8{z6TMvuG3i-?Gbh=?d7Xt(@_1P5ot=80Sr9o0Y5$MkO{)UcPPiTK>F zTD!1)xZJvSQ6f5am*65LT-!R40TU-qR8eOwB2DBDoL59dL|Nz2wU4*casjfg6+}do z9$$XCPzn|bk-)%$PH!gW!g*=byq#>_xLW)Ji%XNn4byC6&)$6!9#%kVHE1mf*W%K= zPm~>jT zW?zT-1DUoz z${9GXh=?d#Xb_$2AaenTh=}CusUuS3;bv01ZUc@6d7ZLlAH4r?tM9i-y(X=lYQNzp zh7l1F5fKp)5fQmt!qs>Q3U)5*kjRsS6nQ|+V`pVXV0KBhHs_fOKtx1DL_|bHM0TO> zEXx{@H^cmOseW>FRR74#h}04h5fKr&SDEPxMlu(Gh=_=YvIz!hiHL}Zh=_=Yh=@d_ zZvIn$W<@RlgS13ML_|dY&)$82M^Sxk06(+@qy$2dUIgh~dO|PK6$A@d>7ekZND+a6 z^d?QQ04fNApn@n(K%|9Gq$3E36cwc-3L<5{=RJIP-7H&XQ+Jd1_dNSRW@l&b+?lz_ zo;`Ce5fKp)Q37LNmWYUmDA_por971wxd22&L_|d734^pmL_|bHL_|bH6mw~cWNyz~ zfLKYiAnm$!>m)^r6msFhg;?!CQuE=5A4=Z5c_n4al+vb68~OeB-=$NhPJX?cJeHK4 z@tXB4rsKnqAwwi{=FIwgV#}5-p5MgJ#B`sDh=_=Yh$xwvIimZpIE~IG#ZROcFJ6=Z z0|rR(;>9Ix+O(1(Lk6i@wW>^;Hcf8cycwsb%-?_iE#13!m$%=3Ti>C*D=zyHd%ZQEq()T#2wBai6wapl)vf7QTm z%a$!QZ43|`w%KfP^%gE+``9l8*kU3mC`fYV%o&rHQULqyx8F1vl_N(Ed!RN=nlyUd ztY5!gMvNFCt5&TF;63z?*Q|Fj86QrcKCK&W(xi!G&z{};o466%u`Q-zvd=_BL_|cC z+=M^Tg}DIaz^6>wWy_XH#flX*qZ9$XB1MYGlqpkmbGvr!l7i_Yf8Z`_WG-#kd z-@0{6`t<1|*|KGm^y$;fGC?bsI;H9Fbzhis}DR;{g5V z_%IMm?cKY#_9e1sDtKd)ZBTB=p6rpI&X(xvjj2OsD@ zp>0{RWRdpm+soz4m-VeZ9bdCO^PX|hALReKcI_&;a^;dun>I=7)~%&*;lg^ogoTC4 zuwlbw<;s=Oc4Eei8G4Q*fQ4EfSm(~2JGzdi^UKq?(|%K;R^uNIsjjene*6Y-gC{GH9GF%t_Wo39y@kS zcJJP89|!Tp+mAo~Xx|lo8xv!4Ef5hA5fKrQ|FRsIJ$34o7DPoh)4_uW^%m6k-+x~N zF;KpId0D)8vHt(ip+g#YU9x0}{)|B4!i5WE?%cT=h-}uZne^@3SD*7&2r?q`Z_uDY zk~;PMNyb=~F=Iw;ey?7=WY(-%GIQok?HBA@j~+el3(msu;lp*ky?gg+0Jck)F1j4S zToa^4#+P}RWk%1QJ++@v{@{lne$c*r_0?C+(>@tEaG;DCGe(XcJu3C;)ss}IQfZ(a zw-+N&i#B3Ez|-+{78m_N{teg1iWMu|ULSxj77Ua@KarD7yme8p0;h>x)t}?+ji~RWnboO?b@}v&iV7_?N434eA$*JO&Z&R z1qJG^^Ispha_Q0~Tk6!QZS&^Mi}p13uSk(1_GPATHf-2nUxq$O znKGsA=FOYB?C{~k+9!@2mznokxNxE4Dz*Uw2H5-3ypQ8Ca9(D9{_@K&qix68k|j%Q z>C&aM-M)QWpE9p=+%`BaH*JiI{viM5?)qrnytyrX`t+}Y&d1gK z>}f1C>zJ{|^rO{r#d&Nq+grbWy*W&_Pd@oX$4%#DsZyn~kIBvwb4-lMwLnBfL`39^ zub0fSZCvw(ZEw_CpC5QFVn~Q3A*OWxx1aBOVEK-XU)lcs=en+o_00pXJ9+Y?h2}n9 zbnIl43t(Y&qC{fis^%QWzvleMwP0efh{qb1Gij?-siGwdP?r_iw5Tz;W5*7!v0!9- zqQpVXnl+=XTf27cXg>!k>>qBub>1KRjEvOl*RMz0wUQ-E+JDCFySNqm+O=!;WuBP# z!Y$;Ea7~eYSAua2|xGTb8_Rx4f*rWKOI-|$h0vb`h)z>d+)uc8Q91w z$3$Al2tRP(fc*2%KhmgCBQ48;(j0goiyV`U;o(k9#vNqxqZCM;I(1xbHX+YZ^Ip7W z@8`={X!_CWxZ*sv8K@<0nEJNP%TRX1jLH5qCdTAiAR;0nA|fI`H*-YyVV0w_xUU}t z10y3NH9Cv??-Bhl_vt4!C^U=vv~lliTtabKXNX|=!twrbXRe+@1lSea(`#J1bV-jZ zitH|5zFdnkBEklyNN9YBi~gX5_wd6HySzSf=gzH#sqwF2&Oa0dMePjpK-3lmKr>~^ zWLCY8Ka4wZagMsWE)7@DnLcxtl&;yh=vQ|f`^k~3_jI)kV{#&li67i~C(`5sXtUk5 z%^$7{A|fIpA|i@g_eTu9s8FGT76n|iXpyGN&7M75Q{@1K`@k{ih%_mDpxm-$i#}&y zW+8uu8O<6uZY&cfOmG>bG-+05|2A&i7;Sg(GiFhH;DHCCEsu>7B}!;tZr!>y+GZSo zHUTd)V;7)!us2u-DUV2v#>`;|!u|2bAJJas>i9ZK$o`TcafWjcGlPBi-FMDUsf0X7dCkU+ggj=3zmAE%Tnj`*L_|a) z1#U0d5G@ygi2T(3Q(?J*`#lk8#T47flDl~EqE0Japg;k8AkxgpgPFFPHf^feOqhnd zQ>RYSuU|h22?^1AN|BL^*@FDtyYIfM_a|dEEzCeus#Gbxe|r1&?egZEZ_4!P)3wGx z$BrF!)~+mBvPjvoWp%pnx88b7A8{!(G*n)E@kO1H41J0AtY5!gXJP|ns%dQ6BIVk2MN_5l(=wxpneG+n6(bUqu}6R zIeq%Ho|8Bq5rD-xg6jvf-65ch41ClE!8wNe*D;F|xH`X($?k33afUGm=P+jOOP4O4 ze(CW0@4xG{@ci@7C+IoKYc_5q#<=2dW1^Mc!9+wvL_|asSS)AHBG`cshAmsR)L<-v zE65GKF64;?zxYdiAg%cms`5HQCv zLeLGtT}SSYud}%75Ats~XZGybqhHn_xQZ-UWX7U!F>WzOfocRM0a@AO#*LFHQ>N&3 zRIXe(y-srF%4Oe4SLc_NamSU(lP7DIKLW-Gu(fK{N`Cp}7yGJlb&fh;pWwWV*KFKy zcg()t-Dr%-1@LvuwaVYd$CzFhL_|bHL`3AjQee6;G%tI{i6SZPl_;3qB)8nW`l~c( z{*;8~$m_qYCpBu+C=IGQ2BC<^fAN|nA|fIp@@sYLZP;&e0sOk5@nywlvn6AutP&EE z(dW1L<;+Q`UaPUJ`}$J}4#^{7HLBgWjjfSUk~@0_DPOg|T)TQP+Vgl_)%tBTL69g= zE&gD###J5tbY!od^DDppQaY{r?cP(iJ92(bfBnDZ5(nfTkhzGd>Z@0;u5~-tty`xV zim$!)ntwEqh@#;&OGHFOL`39S$`mQ(?%g|{S0eIbIDc^-`)uZj?!y?J4KT=fo;r1^ z)>OE8^QL~K^!n?sYk^N9@<0A|%?6LIHa=PB0uT`q5fPDJ%a}P-u3S1VQs^PSZYPmD z7tfv5^VnAm(gv7{6)VcFUAqFT)kMh`uUR4@A|gr#=KRt08|DH~oG4PftnA*oRdVHg zP;%tTCn;0jtI0{^?~q1&?(7-)K60HDFa3zm&1I05h=_=Yh=_=Y5>1w@*`-{CDzZ0f zgZ%a96}fA>n`mtz@&#%eWXP0R9xh&1&tqRPFiS+_%@-eJ=*L_DA|fIpBBBJ5?ZMpo zAWBYRP`;Lkh=_=Yh=^jV(y>!7F&BW6s}zz#YkP@Xw9wdd`c@=6-i(j_5v&(ODvjdnwYq+mpEfL_|bHL`399 zX!cxk`os_N&-K4Gy^ts=Lh9`Gzpu&pv!^6`&U|v`?j5(g$zrrbL_|bHL=+IR-^_iH zxd22-L%IhtNcIQw$>j^b%Z=;T7^tNr3AGJ^(xsCexeG{Www!X~`rmH%lR;V{A|fIp zA|fJ65NRJsFZn`>OHfccNtG%UYaUS2WV6YgJ9p%tf3C}&JGb2KW1}63l}aViGDTvgMGp`I+-(PmMT@M$jFf+<=VAt(e|-cty*&S>{-d0 zHEXoxL`hYAULXE+Jvq0<>~~y@bI#jNNO8FzL_|d7=k}kP@?Fx;1t20K3TSZ}q)n<0 z9Xcex{`#xz*s();_wFrAmMoEq6)VcQbLZ^49268JIdkUJfG$yT5+B!xKV47p*_Qa+ zHW3jK5fKp)`MH@Rx)1XyI=gJyGL1^6O`BGNgM+0=ks>l>$`swrUAuN^-2%v-J-bFJ z8#HL3Ki|4_OZxQbqxB5Zr%x}BKmNF;n+A#;IdW*^wP?|z(ym=QiHwZY>eWMs4z=%s zV>;TbS+gWGG*oWhylHm@8KOvmQ@`SZ*4>C^99$1&yCybjCadOwJWh=_=Y;?wopf5qqKi4u+FAnmDBr=(4r zHqxX?6FGSBpd3GbT;6~GeGLde`SRsu@#4k$f27pmo`0m80@6+wE?g*c=g!ptL$hYh zG+-I1GGxdgUAuObrAwE(+=aGn+sgIp*JZ_u753**85n)=+;h*_mk}jJ@o{}v8ABo> zBIND2-b-gckV1ljvSFU-+a^l`an~nL8GELwk}ap6qnbBl`-V6zy6X56DDXzX^k2+v`djai^9=8d-jwuW5#$L!>n*O&LO+i z)A;DC(W6J(v+fa~#+N(){`;?H1sli=#yA6JOhq5y|K23jeh?865fKr&6ZzdLO-k|P z$GZpQlR;^vTcC?=Zjm>8B*klA!R<2wrmoHz|^$?_O z+_yzkb!#j>Q#NjbUd>n zuD4yXWJ&wm;!Cf)ckkXeOQG|4il1?Z1HL$lskq(`A|fIpA|iKi*I=p24ctD0if5Nq zsXv!)l_yBbl&RcpM*V#9lyvCaU5b_{CpmH#lp@8-NXu4jW&O9`d3;@OeIRfNt5>hqvH&OzfCmD$$BrG7Oqnvp>lhZ-<0Jk+ zapoNCPLU#o^D1_(o-=*qNnGy-5fLRfnVV1ijky3sL=fW~*j==r z=Zx5H+ZP)*Zj81%##HP#zBocq8XPAGL;Y|^{<0rLL_|bHM9wDd?ju=(v&-WTb#Q*_ zKKu3`kl%hgD-*|$kw+?4kX*TPN}1B7q)X=x@3C3n8U_Q~NdT)ZgRa^{y8J9f3N zGjIMUQlV0H`_Il|vJK}9)?2r3%j-i&$iv0UO5TD+<=GcH${&B6i}qIk-nu1&hYZ(s z@)as3FLdZ4i$D9~zD(Fzvp8ZPg=H!E5j$by+8x(~BlfOhld%^G2?U%$TO&YfF}sbacve7#}P zNHK*ttXj27nl^2!#S&4BwNs}~(yw1X2?+_2(xpplDlTU42@nqrzO~Sv3vlk-IlWr1 zUArdVfB(IV8#hi<)82UF4UfBn^jXaM^XH#`>MUYu)28*fK2acw@9V?Lc!J2}z<~p` z@a(Nyw=~rszhQUp-mP^KFawvB@yrTWW8S`f`@D{oaSh`S3V8}EjM>y2`OAI~5fKp)5jooa$9h?PYLU#Tzfn@A@Sb3ZTb*%B;nHQx z<>l^OG*ix#@e|*aN#jRL#*7)I$1A<1Prm`OV)+;PlGk1zCdrY1Sgzv1Lo7goU|})W*d&ULP7E z%fDVJZ_k(_B}*39=Mn+v*O^sVslSz;lhPw@ZiB3kj)D`S`yuEx2z z+O{tch{Y^uMT-{I!1LI#W2I}?dtciI2M5c71q&o9DoTnMFRn8(4jno)+UEUbKZuBu zx6a#|HM8de5D^h2d!HYFU;esvFSutDn@rs^Kx*WAR36Du%TnJIDp){9juDINA?AZCerk*0eIB)(!89982G;Y*T^5)4S zFFe;?I(2+ercS??^n!%N3gyeo<}H!B?JZj)rQI`6YK-iM!$?2Uf`y;zIt?4t({ps;zw;+zLDW zt#@R`)JammULDDuJD1d{T~h`RdR0F7Xr2b0acg+y%pv-kY}vAEtp)si_U!K(A8gUA zi4-bSQ1ax?Ej7c#q($?l_U)53DQy2=lpuS@i6SZP)hU?WB)8nW`l~c({*;8~h}~3q zL_`#K)~#D74I4I;^XJd|!wiH(L_|bHltirfY_?>~lvP4PGWxtnznnQK)oV4Dbzgrf z!6A7htVXr_wy`xbN@~^&w=a*{v_|&lJSdCKOqKH4!{psM-^iA;tK`)!ZRF!dQBo#r zRr|UtKmS0g)of({*_FTk`b#3WZI}HA4$7v@TV-qHHW?8yL|*A}FPR0k0$R6iCqEwA zWB)8=mK{5?UydC+E=^msmVLXUG>~bmUb9x(Ki@%qIeAplrAw!E5U?*RzxqO|hu78M zCu$*7tx`$q)vcq;oVVc&wG@2WhH2-~!~5i?pH4`V=B;G^p6wbCHB39P&hg_v>Au{z z&NpkN{c|039b~&UZuYqS?sx+UnKy6VloLk}Nk~YhXz!ghG*nl^-KtMM^SnfD-yz{) z)uqxS6{SJ_x>B)1d9xXEvU&3s>9p#%drNJ1Z2@)q9o?gob6;*{ck0Ey4>>Jugm4c)gPo{j+$|@mzXu| z#*G^~SBVwHiWb%2BWlVzLPjob<3|=PRH>R`t=*6 zL4$e{lqN_H9{NGHZ{H!cYK2SA2OpG6moLkTRcj<)-aMB3+du8=^G)_d%mpYo;^$$E z)DjU95fKp)5mBN+3N2D;$A8~T%4WU4kgX?}B@8tV-WWYjPM`0x3%Tah(4UG`jsu^Zq9A2ZkEdBB;{nv`v zY-7ym5t1e-jdXwcfAY`Gn_4$vM8xaza<6;QRX}t(?TAs*wR=xpr*^Gy8S>gd>DA{| zNgEuj>!5#f<;p4Vyf;hwzB*7+rA{ryixrh;+dpmJ1@v#9|Miri5hJBX&puMCX1I(V z86n%Y?~r$A&5?^2FKN`bM)hi1GXYUxvW~Na5fKp)C2jfoj=Y}@sjV)B&f^5NW%<>21vH4-TPCHRbCL_|bHL_|bHM6T4R z-Ne;miX;0E9F!wJ9+k?K9?>GQ8#is1sng$7ySUWiEi98*Yn8oE9=tOGHFOL_|bHL`0Op z5-l*hZrwUbks^g$xNsqXcRA^@+NW06OU~Fw6jN5uow#0)?y=gh6hEdsnE40h0uT`q z5fKsjE>45AN$tb2*&hUxogYzAQNH(f3^}(WWy+M2En7Be)25C5^wUp1Z?#sfT5|U6 zS;?9;tNpbXFJ6=Z0|rR(;>9Ix+O(1(Lk6i@wW>^;Hcf8cylG#L$Z$R{9j}puygs}! z?F`f}gj`*(L_|bHL`2ERflmi*VJ-kAd7LrKfXU<4?c(~-xpI;_Tnk1!5m)2?iwr$%cQ>RXq zM;>`ZpC@v~oR^Lg#x&{pz=+C!q-I6|i`e?>y`t<4L@y8$6?9D)tBS#JmWFnYp z9%<5~(Tvl)dGpGkL4)kOa^l1Z2?+_2x8Hu-zHG*f8B(lRF%7U_{b9p~$(=iQ?9bo5 zdsoJe9V>+k7uM}!ozbI5+n+Z~J96d9CDp4}mw^KZ%F&}oM zBwxOKx-ZDIoik^S%Wbb&vqmaas-$f|7VfcQ$7J{J-BPVuHC={auVX;jw8_`keel5t z+CH3*S+Zo2_U+rt<;$1tZ8FjUnkJd&%|cVOLJ}D--Nn8%<*;1 zjCEY*Xi-O)?JH;h|qv7 zN(CT*`{9Ql%Dj2=G}vh%3l`fzpcd;aUAolXukN5E0p1(^j=;Ag1YHq0MgVu{(4o5h zS+iz2u40Ga)~Z#jbp6z+?@y-2vWyus>iWHU_0sLkoHH&%~CP*N5S0T=I5pdK>e+v3ea^UC$G5V@Ptnc4K=CiHL}ZhyvM&4C8-iEUhqKQ!mYufP7PDWI)ex7IXTKw71Nh#t}z0qJ!pmI_y{T+!&>M<0Ep5nAZn zxw9NOazx&I^G*HP-yyx!*wt{PWVHMGLJNuwumueGcnPm@q-s zuU{`UYShqWNR=Hqa-{U^*;B@h86$uG`KP?~)?3;~Pd@piu7iH9T)DFT-;rqt>Kt6Z zeqBnHDy3)QCtJtMOrT)GHc!& z{fPYvQ&k*LGKG)NW#BRkt>7+AOWxwv(fW_eoZ#T9$zz(A!V0Sq{ursZvGj7NAgR zojP^&es!eNV!0x&cUGMUWS%p^nhEj!a)8 z2>HMR4>&$$8QO_^rLAroMQjb!y#VKB=!a|9u0<b#D(*KOXsSyLgA)_vo~4Q(U( z76EU^V^*?cN!=FUiv#o_-W!2s)Hw*`^E0uT^U|G!x;}hi<=Twtm}gkMR;;e)4sKcS zG=?O}Yd7lV_&p{Uz~Xfr+v7<@L_|bH@dvlMma2TOR;D+HcCGig%FicH$;i>;WXqOF zxpMWYWXhOPN|r1x|Lgg()UQ{^<7<;U27eQmkUIl=0)o%d^iu ztMv|&vO9zbSqT)_bA%+)ev?mBX{j;m#O-K9&H^os&y9U~JN_tkIN zvPC*{=%4{$NA9*kvFCVRx)Pt)hpThlTz8(Bbv#|0IA>xr=DBK{D^}M_D6Xy*SIYw7 z+D*>Cw}^;{h{$($x@B8xashmQHN}Mj1qyiG%%NTGS3%NN%T{frWQpRkaKT5CJ6A5b zaPgvS+qPW;wv=%2nepFSw9 zmA?D#JD>XiuSW*m&6_u)y>{cqjnRHaU*o-9WznJ(MdQYewFH9WEM|tub~VS*dE5Be z-L~T!`WdsOp{xOBB76AZhvkny{_yE-&3+}-^E0u<_w`}E=y04d%v^tlt8vN7wP|=7 z^E`3BR@_~OR@ZaK+ZbZbap(6*PSd5?07TKTwcEd)=ov*Mx4ub%2ww(Fp#g6|?wli=3CsLu(y^@daEcoP8sa3a;w&9_o zrKD^3o^s{NRr~6S+Q9k%qN>RZ;>X= zTWPz?R;ViP&-%c=oxOYaYuN`VTB4k;->S_s`m?vb0P`N}zx_@cHEF5uv0~+FS-EPB z)NRm2e?~u7sv0iuyytq7q~y+W_AG8CNARkC{rZwScW#}f3R7g`n++52%b!2L_9teY zYTC4^))dX0IkR-?)JgjF>n9;0A$kitGSVGj<8>8)27wgr%s+cDa)5H z*IW6Kjfa`ScJAD%L8E~K2Wp*J+(wVm5IC`S@7}Gq9b@JyYzH%KpuhSsjCEw%fy_V5iiKOp8#HKO?|%c!aeF_4Pv~pZw#6)E?w~Y7SXh|Ut5;9ki<-6w z_-^06UCU5RpFUknTcExy>g;0MWy_Y8HEY)Bwz2)hfUHdfr;$C3K19F1{r1~FH6-FBX zd-_JcZ6+5W`CZ4cJ)T5FL_|d7|4`BpcPK7hwp?EB-bE7yJsCgoO_?-)w9by++D$wW^i1ChpE%-%EH{4cWSN zn}lY`B9W0%ny`p=pv*#8nCBpEs#Gau^vDQ#=%GS#^5iM$Kk#+wKX9v_wli?h5J{UZtvvs1J1Jedqz z9qG`yyF_mOR;LVPr-r(@| z2yF*4m{FG(ZT1Du=|Da|6Pr0N9VOKD5gZ&W3l=PpmtTHaiWe`g=fKdRL!+Go?#3l= z*QS**&l9WHq1E*~@ivAe*K0Sn$B>AKh=?qhTD^8blM7&BbxK^rZ4rsvfP_$}U;!C9 zVyKKBJ5eT2nJ#5Ym(;Y{R*$!o3gye)*MuR12k7(At!pRg{__9y-u&x-Uzd6F7s`yO zlcaH@hWh*q&$XB1$A6Nk)8E!eEwUCXlrJxvw?t~BcFWdCY4^;NvT)H7`Qh*pDOIwB zY>C_^5kp?P?|mIT{Zw1~k9l(EmO%shN%vQJ>n+WH{q?t|XC+GkQjYOlAxa5Q*Of2kQB zri;#={ayE?MYASSs8B&&hJ7U0QrP~#C_(m)6Gc*_(zRwc$t^dp{wfWcKP90#;;uj` z5fKp)5fKp)`JWY^&6bRrvPwuuMxPt^%bAl>y;fsc_w}a|9Fj-EYE-*#8(Slzq-M=< z`|_wwYjl<{D+Op*e*S?}s~LSZc4wHdCvw|%*?-`mY}&k4wnlD~5fMY=l^*wM5SZDp zemu0tKH-pAcI?Q04SY6j(OUNHj*`52^4K@Odd*sC|9l7e<>XPl4H|V2urDjW`a-IQ z*OgIkL})F9s#PjUy}EUDne#TBZHw9=<0ed&BS(Ie8~^;Hw_c-$%9Xl=cg?a6veY+%Q&Ik3ixQ+bD zXP%d+?K>nqth!Wsq@pyaUsoztDDT`2$;#%4{l)}Xf=Z=#qc~djIhV0(6 zM}9teN^2BUuU17fX^~NjN5KO5qXl`LUA}Tfo_yvx$)7*3Eco~X`EK1RnKXWku6F0{ z9p}|u@?{(57Wnv-CMb=4^T^2kV#z16dc`tnP_M2WJ$g)9Jl=!)8Kc{xwrggow?eds5C16FuV2@)2FNl+LE3ZY&)eV9v?FT!PWv*5-1c9) zyluk~vVI+5JC6Hf${{!gs!bcb^@S&8%aqnx+h)H%Q>IKBCm%0ZsQXRPSuRFPL_|bH zL_|bHt8}Qldn02?|OhhYlTY7y}GsS0ab5M763DW4IMs8LNbSF z9a+q(HG9rSGJf1B`^zzVe5FbiW$}_Pq<62Eb$PL(59=g1Yra`0Gp0?puj@*I0{L|I z^I5Y$lnyVwAp7?pkU1aDwXYfyl1ZLx|BMWcctbK}%qS&F6qD~ZZkA6Me{NsL+cq3c zoIF)BhlJ>CW7rP%XUymk_Ej)}60BdpK^iouCqZd~Ecb;gD7~_BxXCJ9mGhCK_w$O54I75(m z+x8vu?yNa-@!}=Pm@$LYs9sH$ESjGnAR;1> z+O=xR#XrulEBqWYX^Du4h=_=Yh=_<17z48ukQTRl;3{(gh=_=Yh=_=YC@Dy^Anm$! z>m)^r6msFhg{07rL~(-G1qG7Pqen}dHf<8E$#?JGm69b(%2!`~m1u1UL>y;`h&(#i zFn4|C0tBGpwuk_1H4zb!lQ@mkCbdt0W`7V-c78-fMLBh4{Q2pppXA9WpOoy`vrFpK zsU>UHtWu{=9a+74b)3Da+1G@QoL{_nQ3ebcAjOLpm$YfqN`?#>q-xcwGHu#4xq0(u zob4aQJ#)@DUmN&2A+HZ_Ogj_$+>S5)vOkwEUzQ0ICdja1!=ml#&p-bxFTC)AZ`BH)vH&dt>-Kz<6O#=Ddn}-UX#It2aC;SbKWEo5fKp)5s_cxEMXQL zI&?@vLqnsjiQs5LxN+l#24TyTDI;Hh{k7!Hn^(@CKQEg$ZPLJqRduQ?f6bqB0nVH` zBjMrUl0ScbnKWsVlrCLb{{8n~*|u$)Or1Ja9(m*ueV+VVVqPnhcxKO@Ek%nKm9k~a z+8goXk3ULSSeSm%^7-eVOTK*h%HESd?GEy>T%xGWVh|QRXbl#U=ep%M9 zUoQmhWdYG zc_M?(d`P}^>z4HC(?_yp%O>g5rmU4Q3u`(xlPMPXtW| z4H{%tl@ljUNJvPCy#4mu_GL3>%#dQmifJYp)Odfg7V+w{9Ag-LPSUG;iKq3KlG=fgWVu z?cBLj%9SgptKPnSTZRl7qCp;H;~~>_&YU@BGb*NSi0SJ-_}~L=AFhKeS+Zz9Bb(4L z+g-bMt?oD0L*E=eeAuiK@YjWrnAeBtXUEJ~$7PLM<11i3m3Xu zMR^)$AvupTp3Ye!A`ALmxG~0`a{-8mh=>A$QdbsY#P2a`50mIez@Oy#N0D z`XL+;I9$AVvHl;~bO^#OS+Ycb?%lh$et@1kcdiDhnl)=Cef##+=K>kBX+Qq>W0^d8 zvV8mPw;FUq;Iww_+M3M;2+AN}i(B>)!2R&U4`trGc^Y&y`uFdz+d!Ze>nvTm)ZVWM z3M1hC>8GD+5W$sBojPeibjy}4_NUSRD_5@6=VEj0thC=4K76jj|2Su*_uHAs{_#)+`NFcpkT7cj?l_zDiQPE{ue@KD_ZXE_pk*yBHy0vD_0&ZC~5J*E7At0L$nX-V4DFoF%`sgDK$U^7N zo#n`pBl6~(Z|cu}YkkgRZ#m@xAj8wyUw{3ji|W>`t3iq9pMPFjv}mEX?XOs|LZ8Dr zsMCmBZ)?=3q05jZJ96Ym>DjZVj2SaV{`~V#dF!pWw7*bm7SP9)D_7S4BfAzsU}Tbx z8Z}CTP6$XK0BY93`p8y8&=MsB00D8-e?+}nlng-TuCK?@O8XH&Hjw>Wy?S;15dn{O z?b_+SJ1%?fx#zTu!O^2fwQi)zmURc&sW_LAxr+V;1UiwCJ8s-K>DaMjw3qtQ1_X@_ zUtfo8UjzL=V#EkN2hh(5;2PL2ju#*(Yxe*8_3MFqjW|in>%$v&W0aM1+uQi(inrGU z;a`lkOhdNvwQJXO5dxVVI&{#$X-toumG(PA?N|f-0nW=1xHN6F0_P8IJ$61{ z@G~-35#({?{C?oP%vBql*YWnc&6_t%y?XWZ3khWTBH)VpnFzEy!Zh;+zP!L~*4Y1~ za9tRQeSO4)m2*2L*Nv6eB!z3$d@*G*+~b0kan7AgnKJ1YJ*HjGyp6NTd7QCw&Jt1l z_;<>uGn{e(C}0e?MFdP+iHHISZo?~8xq+oe%9Q_QM7i?w$y3syb9X6PqMYQ&T~LY? zDK`DjIIg&QKUd3~r+s&|j;m#O-K9&H^xF!g zJR=Pn_w%F11R~>z0y}cIjie+ouMfu*Zo{0no|tt!U7I*|zK(fTuC+kBR$ak2PJnM6 zP@@1Ie)wVicmMwVF0W}UM=@>Z^jSyV#yNNJ4GGQ#)2{gD>biEdED**SE9Wc`5fKql zd~&=s&z(cN+&v?jA%`Gr$r8n7;ewAOcdlG=;o?Qvwr#syxq8+83lq`rzyBf4AA3S$ zO#@!-Bc)1}lr(8l%dfxwCYv^Il?juk$l`?`Ct?dJp;%6#H7Zo7p!cm~hM4!>drznE z{`>F0_32cv^cYpuDA=-c`))5HGl`B`Ymw7yn zE{>g*_Qw>0-l)xhIuOo*O)x31=KR^XabvW%!q4bWPXV9!g5!(xA1URS4GqDmKmPc` zr?)fvl~k__BfhT>^F@c_jA7>bGh%ygd%AAi@${NNyH;H>U$S6qGmtKh+X7IR#RS0( z1W{4E+{|)lmGd~~4%&e)3tZJW0B_^0xgL}AIOFM@B_bjsBJyYZ_8*Ynemg4@$B&Um zDprtOxpGRG(xs$J=MM5jtHd5?07TKTwcEd)=ov*Omym?cXAsC!3XMTCH2XOS_BAX5GM^(A-i+;Z{aMVWP_W`Anhw5b*@L`ElO#_89u zpUxD6`^k}!hMBSg1!lj&#pww9l{Rf!odxRT$&<2t`EtFtAK7>aKJ47NQ-ekW2M*L? zv#9lepar&rY0Gh6EoP9yb}-`=X1>Cd21EnYii7d3i zg9q#M<)-fe{fvUAsK@a6=bzh~8`EQlpqIDy#|G*`V7hnI3&8u7Dpg7Y&D*zc*Fwe9 zr%%_q8YnW0nTJs9xNO<7vS!U1EhdSAl8FHUAOzKC%$T9a4#yKS!TBO7To*=SULQCg zLPJBfs58!eTsO|g!qvEB<=nP%-8i%Qnn1f&onh856qH4+n+6RU*q_FXc(|q?fBbQs z0T2auaZFx&?KSQ5VZ(;$x+seM(n~K%R8*8+3s%QD=hqo%hjT3yN8ZL+j4jD^oUwY& z68VD%XO}K$asm9IJw!xA+wo&>Coy6^ zl0_mTqcmX=?bxyp<&%#;blX-}ca8eu%rC!a;JDW-J>-K~??_N^ zkeoR2vs}62pP9wUndMAce8|Ozxt1+kYG4)tM`So6C}~a@%=CibAp)`}Mv7UfVA`~4 z8e~Ml&Jra`$kL@tW#Yt%0n_gY9wHOf@v&^#G7T)C%mV_>ruZrXkGSm@K}A4@C1$gl zGG&SsD^^Sc8z>^{nAwVKGt8=m*B}7cs#Pm3n*iuj-1dtg2ik$3u`Yt(ix)4}bqoZf z9)0vtZ3_wp8?iZdR@xs^XfFbsnC%Ru8qhz;;6m^f0UQ)b1O!8o8QiT~H_ezu|6v(s zo=Xe}JRul`?+sbw0 z%<5|b?OJu^>8GF8vD^`^2Yf+=ATGu+^gW7ii`A6 z@x=|=j?_9XVpCOq@Jb9x7T|nzd{#!-kKPJ$v`LZ1Rx7 z12oIF=)*;%Th~sqW9Rqs@2y)Jw4678p^O|pL>f10sM)M9Jl9@2b$n5#PQRC!g+#du z<;%$`XzmD2H`;yk6MIBl^ zE?vIt__R;Xp8Z{8b}f*ZTd1Jq$(>tjhKEUu=1qOtPBJk+&*qMPkqeN*_W$(=vUi*) zlHy*$<=IVg%gw95N`vN4NobC^s}V}^54Qw2Z{A!+jT#mIZ$?Bh7UM<8ASWv&b zLso5KnLmHNei4RQ;LI0>L_|bHMC7{_pUswxnX*bqNJgJu{L7h>QoUAVS@-p)5*(68 z!fI5zZyQ@9qoiidaQpJ8O>1;=Fe`OvSAPD1RIAy@{#sWsgK*@w?Xv&CL9OMwHFBGb zh!`TT^te}k0264nZre_NJhaC?*N|Cu?8tsOcI>z`ZP8lx?T*p_t+9H|T511$2l?gX zQN05iB@nPLE5G_es)yH=QExeUZS?|knphTQt6S3 z(x84_saTy*ISok@Iu<>;Elh&ys&TfBwAIoki&cWUCR8e@ZIX zDoRTX7%(74nd5NXxjLVdC1 z6Is1tnKYlINX95Kj zU%u%fqQt{%m57Llh=?feptix>dGqD5md&L^iQ*CzltvC6IxHi{jF)O34x$Do;PvMg|WZ zuG_3wvAo>Abz9r@&U>@vjR@C?Guxte$oB0!q*kqP$@$=eTG)2Qsx^`?ZywA2K?#F_ zSt24LB4c6NCf_j^fQX2QC?H|RFqAiVWAr#Ved@H_wcXVjvKl|yNCpk)=hHro8#7Xa zwf*|PCKoPT&^wjKjU6e^Kie+acEZDIXmGez%`p4&@EX-+>6c&WzusU5ukY5cmbYfU zC*vo+DJM^z7Tevsk}FqE&BR@|`fJIOIkRr&%}L{B`iz+}X8a`Gzm%y`NwH!N%j5}T z<(a43x_qmUkW8{|`wn?`)*QKb@secBm_ce(uO>?t&1bzhKf_tVh=_=Yh=_=YlDUMQ zB`k8|DoL60-fZ>WAZS^=c4Kd=`L%_8Tkl~m0D-$1!ah>FS7xh=_dhP0-d<%moO1!)+0PzY|16L_|b^i;-F)A|fIpA|fL4E8Dvk?7>_B zN=_K0B_bjsA|fIpA|gs)49pS{5hb|EKRug~xd22&L_|bHbWfrMY1ge=Cn-{-kP8KCSuMi77rm^F1{pWA(AtItA=H;PNzh*7~Q9z2*AZ=3oqx0(3s}d0rA?3=I zlMER$NN{klJoL~*^1=%*NK{mmPY2yq|2+2CV-gk?=5jj-VB`H}&6?%%d0)AD|G04R z;zb!SV1N`aUR=_qO{@J>wQ5zFHf@^Rym>P&-ohiZUkLg;KYTq#{>1E;KYx)C-`7V> zB}U)Xs#QzQo;@pBvu5?!?8InWAo8W3jvqg+0kY}Sr|U7m_~S2p*^jtl^<0b(iLt+) zBvgAYU%o68CQOiF!-jckPBaPCw)hqZ`;nN}1Q8Jt5s@dUJw2J+{r1~$`p0~Z969X4 z*)(a=$eA-|Wc~W}GGfFCS+#0ath%Xl=g!iiMGHA{>C(D<+qP{ob?Q`krJhNJ2wH z&5z1kkc?t3A+C==f@?Kr&YXeN1qu{!T;!2IUl>G0L`0Ol z`IJJtY}qoYSh1p}N#YZ3ks?K8%9JVEgS&R^l7i_ZS7^#d68Z^+KZ{4~jefso~ zY}v9&`t<4L@y8$6G$()8wQE<&l`EHQ+O$bpw{9(k3m4XiBvM|HCbM$o%4oYVW5x_A zR;-wQ0LYs+udZ|F&K+IHUH>4OkS9+bnKNfjv~2;FAxewXUGTJhxO?}mj2$~x+lh!W z+JO5m!QK1A?c2BY9^riX@@djfBJ(DKG5~?T$U_Zq<#DLnwDg^ zYlDG^IwEC`5A=gO-ulzL-=FMrz)%W5;Co?%no&Ks5TtAAgMYHdeR2cI{f1 z{o(0&`HO_OKETts49x8vuEIbS@bJjX@bT!~40y}iclkH4S)qehLA`t|E; zw_prFtphOacOJ8R8Si4U?~dZ)czZieu9$r{=c4)9-FO3L9efLk-*Fi4@C_W&k`1$t z*{f;`X3@8A-)Je&-u6E+e($-mXwf45+s2WnvCC6m#ns=7m&aTHBBF$0IY^641r%9BQ1RfwgL+@-`|rQ6AL5{V`SP-O@nZcy z(i(BU?~)};^k@7byl~+{O%Fv-u358Y`a#T};g9qcD^|#$L4zc9YS&rE2t*sGh4A*< zZ|lANCr+G@4?p}+=FOX@!B244KdDlsk`5g@=(_kr-q^ZztM(PrZNc02p@0AWGI{c3 z4b-9y2%_RcHn@9#=+ewdp%bEY0wd`RxmqsM)LS{OKRpo|$aMvfjms#!uvCwA9I z=(mg+GwSP%;lqdP`|RDjS5l@-DP6jBF;8hKmeF>sgLXJ`Y(u?z^_-u!#7ch} zXfr;9?c29c+x*m1PwAHqXe*W>D+d8f!`E%2-<|uz)A8~L33YvV8+Tl>(s!QDLtl=c zuVULaS7Op$UtZ(y=Rdvxbo||evB{D1c;U-<=j*;Zi|z6DAW}a#T&+S^yAQ> zL-qHH)ml4N_Sb0Jwyj*heqDdh8u(HZe=9uq+;h6f%Kj(x?>$$)b5QREU;H@M*YGxW zdFm@Ge>0f?q6sL1^RlGS$N0PG%P+swzd!K>?8J!^rEcB2(Y_e<*4M7|?AcSt4g8(< z!w)~`-=(j<`l_o{Jzh6f&QUAJlZc3jh>|he|I5~4f-PIe$@*CK*+Sc=b0*m?{&B`U zZQHtat4%~~yLRoeFLSnb?OI*u{Q2|tr!HTjow{PG3*7YZ5f6tux zuMePk^X9hn>C@XE7cN||UAuP8mNso#eT}1e^XAz?LPBhJ@7~qLuKEW~o;+zwnKGsA z^UpuGzx>4)U$m7gS5AMnvi&PpuGoTtf^2i=&b4pDnXC7|bm@{Ub?VgGR!2BKMT!)$ zFEX$F^2;yn%iQ&mE9UhZHf*pzjdKF~ee>o``!YvMmMpQQOP9`e`}S>JY_{Rp1~AJV zkBj-gVb;O9X{A3Mx4VA*db1hZC!c(x=dJUyRH;(we)zg=PyON8W`E=E*vIwtVcy5n zxZ{euzB9|+^}E&M=Ze|3qpXA8FL6QM6q^CJ>e*v&P(Z>k8_p;k76$fKm#7{`se7 zbzsI3u(EyhGj7?#vGE07hg*JeJRF(hgY2dU9(ch16v`6BM#+*T?Jvje$hbZA+O=z1 zGxs76xcOPaZBfAIM&z?WSseO zE_mvXKor;4M@+{ZZ`}2}ugA|5Q<}v1>#x7ee?4;7Hdlp}eLa`K*Vj0o>)^c1pU;2C z@xs^f&UrsQ?YpbvV}-lp9hc{#;qJX0+wSRiL0m(Y?2}JEsikZ%cHbIQ2&i}HYQ~^UnKIeebqA#k z@L~1WUw@UazWPd6L*D`dnGl=p#}(YpZ(uSMlzDLOBTrD)z!?JFmo8n>pg;NmB@_@e z*s^7dmVZD1$dO|k9HA~9Y8`vyYk#_Gv#Vv;kGR-2w&U*->iUSUaVM^hpC>3=5fkp( z=8CW98~FMfSM71N%wNxccjJW>uJ+T_ve;a+?zZRaak9eQdpU9}-Q&#FbEcg!fiHUT zWd=%A;P)L$+n_uUnC<%8?>$${7c%&w&ioA!Ut^cA0=17(V(R0MKbDarN9s9&n*8nB zwbQ>loW-=SU7gRaxVvur=^P~@A|j%|WjQcwRH#rvAE@7lKbkQS6l!o{;xCik;P@dG zSqJ!|89_GuVQpa2Eq{hANqnHegj>jL^)%5`nKET`QY+LyL-vI`uKLGl(V~S074e}I zlZv2bTu4ZWK5b?D=x4O?yYIe}=bwMxY&IHK?{ALJ#*G{8_5J`qV*)tG%vom$f+Eui z*(UhcY~MgY71_6r8Aa|OWA^XA|CSLWM(9Lk@cHMTyIVb0tn_D0#pSk5e>z@I{vx5T z4^QKcD>3ambNpI1J9*sX0(iTwt-!V9N=)17ifOwq?TyK6tcuHR$G)G2+ag>wJT?Ph zOvQ9(;<7`1fnNsZTSCAuZ}ZE+eCvn;sODQS4Can}*9h{T@4x@9GmV+Zt*iIPy`>#HcGUgD|I3ywtJ9ai z_10VZ@CJQ^dj&Cb3i_Z_sZv^RVf*&&x-Xap+*9=0K>92C60>n(KhSrWb5gM_#~ke=;r+;JtQeHWL<&z+dI&6Sw6Hzu#KDlWGj zm;GeKcD##;nC?eh_N6ayUpe{-K_~pK#_xh@)28Vr@cSV&G*r_XM~@z@zh9ikXtA%Eq{740MEB578(KY8+GO>;&-89~oh zty;-1zx-l0@Amx>812xZgHGX%{X@I447C@$!3S~#R4Z4mtkV@^-x18l2YY;g^j56c zKwsm7I)e8&M-TwS{f)lB2QBos;{&P5u2|{Mn2M`ydplneTS8nPR>mDyV$*kVb^P3k zP1{_FNqb}R8mr=J+i~4bMr_8rn261O#8qGV0%JGEUSx#g_a1I3>DslcZUSFYE?BTY z1B1nj7uPT1h7KJXZS%hFZ`G<*_4m&H{rmNIt0OD>pBTUQTtPM`{f%F5qN zxc%hEAAgMY#iXlckW~5@zuWPJKk99vsJ3CHubtsMf8vQJq<#DLdM@MG;fn__Uldqj zxw|>!Ga62UnL@P zi6W2USU5|Yv9UH|3GNvU3|v8?<0Qwa{qBVjeF-M5Xckx^2!ru#aPL`m7^ z&0D0?s^9MIqV0~HpVMFepR!q-mjn+YA|fL49qyzVFkpbscYRReKn5=A+5Ys?Pde-C z?Af#R4yf+kyC+VAh{%()k7R$6xd22&lq{tFX8HVNv7E_LwTDt4?*I(Cq`b0!TL_`TGb?rv?>ch&0g$en-L=@hu^~1~sNOFeTB9h!b zQ8Lt^K?99m5hVu|D^`?UyLKgqT_qwSA|gL$d6qCDA|fIpBJykhTUQ_la{-8mhyoCU zv_wQiL_|bHL_|ahjDcAS9R0JeIKW&0A|fIpA|fIpN@5tKB_bjsBBEq%+qj+L0TdrA|fIpA|fK91jfK@lGnGz>Y>a9NScP*B9i8g5fKp)5fKp)B|nVR5)ly* z5s^>YZF}P#<^m8A5fR0mL<`ccTenV9q(~tbE?kJay`dz}>Um>zJzvGwb}3=R=kbf} zwqyHxPvUdi{$j|GA(AOxOhy@-~-^E9t zS>2}9^@xawh=}4eFq<^~5Dovn#}}@10j^%XDiIM8Qm$M%$&ev~1P2GpLk~S9FTC)A zL`6mUbT+x_tH&ODOv1v#Ty6&eY`ovBS+iU|?<-gDA6sUd2)L(8l}dvoRjO2xkt0XS zwQJX6yZHp=xG&fr$A_=S+Mk&HijOZu;`{oDsrcMycWTwDC1=l`m8@B_x?4phM%x0B zFa31<_;C%8O`kqpk3rR{RsCj{ec6w=V)a~%4~enAo+MOzE?>SZ6DCZMVZ(-bYECo> z)wcMSRQ7|2h=_bUR{~vpI0wzUuHGKTcFbtb44v4a;2(pPFNCde5G5+h3j|puNDx;xH3+z}@B7sEoNI2Ur>CmBs;9fB zyXXIVo_=7et8U$UYw7CKr*4%fYwXyulAoV1mtA&QiRtOUaU9vVZ(pb?UwrX}6ciN5 zwr$&F@#4ku$Rm%)xN+lT{`~o-|1ybfOSo9Uwu&ef$44g7WA%t5j>x1cXN@&$)|j^R z>eWjQJM1vmcG+{5{@9i6*cX!{+CDUT^k`|(qJ^|;*Dg6LuOOoJaky{4{Z@`T>ZtHZ znd9r0#n-y$0ssI2pn?mON&C(_??}gv9i?j3s^*Js^XARvsi&SYU8sS%o;`b-|Ld1z z%{=VUqlfu>|Ni}Q+ikZ=y?XVeMvWSB;e{8P45xHAV88%r(4c|LnKMT&y67Tl)~uNv zdE}8M+f_4UCQqJRq6s5Mj+B-yTbeJ(jT<*M^Bg>Q(9Gl2KN?hM)Toh+88fCtSxTpA zfL611RkZR|adELc{P4r3o*GQnI_NEz%4_}Vz<~qi_TVN>nwYw4usE_lHalkO)Tz>? zOBb^by#4muW_hK7YzNe4=xmaTLpJm&k?XfTIPcN~`wQZO-ZJKoI)XCIYv-?)9S|v-CED81Ji6@>YD^{#1 zu^PW+PoF;BEUy75UB|Lz%S<`ZwtHEn;`mU}&O2`WwE5$YKX&aeD^|a|vD-O(|BaN0 zy19v`zOk0E?Me6j_Q3}qlew?^xT(jcvQ# z7wz9(=Lu!!(H|i7jt;kTtDVP|8@`-Q^V42S?+Vc$_V(`GYbP0l1`R5a{T!?P<@vc6 z?#(yfG}kuaqMf^<^;M#-nX;{qw`|#Bg5js1e!4Vm+BCeYef3$aV?WmZ9WI&IAOHXW zs91alW;Ihm$5him;^&`#Zf+xe@x>QSP)tOQdF4-6gmM8+IN=0&>#es;PiiKj-s(GH z!UXg8z<~qhjW^yfnV}jyI`6#m%onkAre8SUfB${C=bn2cFV8*USOd|P4ukOQv(L)Y zPd_c+eDjUG{PN2tlT^n>R9^j~!vgg0-`~uuU(77cK-Ip|Oj{MJe0ArYcgpbL!%d)8 z>!3kY4PYv-^{ZQNz14h~d+xdC%r@39$v59De=2;i=;l(*?Y@kXqA_)((g^9)zDxj7N}ii;9X&)Iq=D<>uzf zrI%i6e!9o6Ok)FZPsn!)?X?} zzXw&;y19v`zCo5r_x)CX1q}ZH(sM$%$a7YZ^H9*XM=I;~4ziv6h_>HbLC>w>{Iu7) z_~MIY*REaW!`9MYHuZwx$}6ulll-(lu^)c!pGT4VP$V7iMSuMXA73NZxhq;<`MGfN z6IINHKGut)Ns}g-3sU{%^zp|Zmov{iv(&Gee)=rPu^&s&B7sd>|hZSUH(YfDt?{PWLuYSgF^dTrRS!P&ljyHmAlRkKXEapT50 zwQJXQii?ZQWVilNt5>gfa&vQ?i4!M=7Vp=upVPj5d-J!S^0#c+;^gP&J7dR=4V4ke zZT*`zZF2JR@=RUB>Go;fym@GnU3Su>Nug=VP7mMa*1PY%Yqs&uojZN4$E~c$Y4&gJ z+i+g>)q45qKV{1f-@f+$mYpY_a%aw*X^U~jj~{RPCURP(N|l_wd-n#e^Q>93LS^f* zru&nYqr&T)D5*L=?0TY|ciecj*-rQBFTeYW8(X&9u@KH{K0Dp3Zf^Y6*Or~F`)zpp zEITdyoE7wZ7kPZ@XJF(sd(3*V^@!Xr>~yc~?RVR{v1QwJ+P}TlrR+S>&aHMHTW-6c_ z0;grmmS%p-ZCa-GvG(6hH{IkE6cjiOdhOrW#^wSvXy6PSIMDRD8$bQ$=RDxHZ6c@H zzoQ*9%FgF^zXkvxUA#A8lrwwU-<+ijrw4xNvKnX7xRS<~)_?!+QZJpZ^YEe%D&jt% z`@fCBYCP6*&kc2A-29efF8`*|SH^KKtwvP0&mrovxWR_TF1JI-r^^t78l3 zcnUh8t7e1g6GxPv^0l9Ja9G_oLFjUN@1JguaCZA>c2o80)kAOTJ@kHQ-&lUu6NKOT zDnI=fzI|rRnk9!GdT7k*1TD91+qR)H?SPq)({!KFr>kiOV32*PO`A5Mvh`kXz4uqk zN%bJQi9SB!J@3Tg)n7sTJsLYciM32YXmd^Wa_&LkZ zc_{pR7un8eZFk!~et2!~MDB~0*Sf;%9_`$kXqqK^$t9PVCv53C_qEqvlXK2F$Bc>e z;fEi_JO`%B=bk;bYu2n8>Y{khUD_ti7>#w!)U|6@Gl+dSw`rN$$2!)AjxTio{r8&; zX}#UZi=RI8bL%-| z2~s}#=%aGQ6<3(C53EUVZ(;zzpGcTwv$XiOzEJ9dJA5pTD59L zPAWymGte)q-+lL;y!-CE=6&s3r2#ipmhuxtZ^QRX$7#@jVdNJUFX7`xShnqv+~)OS z%kbNOI>?<4oE%Hga&=gPNN&?KxSfcy!-M3Bma5|;S?8TZ^?Nir+(bOQ>gFcsexiad z<5nNHY3aJ(203R%a%-pCw6Yv)UgZVdPJVc;D_pd5tJ{0Fp7GEhdiBQ){ZUds?{r8U z9V1BDa{ZpSlPT6dWPgy+AI9u8K(fwVL1k(m>o`-dzWS;>@W2CRpU{E%b)b74@IG0B z?B8zldP%2!82|tP=_l`%JNpExRfi58%uC1c(u-!zAl0!m_32+WyCM8bs%Gox7nFJP z=9vp?OP{=z&NRDGztHGYw=}ag+Eb#AKmK_0bS52ZPP2=>xb=_KyLWFB4Ad{B`eYFu zGp=^++U9LP&TmjP($1Yb%~-Jd zL^$PVJvM-?eMD}G6(ax=Y&e1{ItDjlF{q1i})~sGb z=(U1=7AimOPnXX<4HjykPOkyG+M7!?sv#(pxj+sb)_Gf2Scb(jR`|T#^sJD!27VfxlwYIw&TcbG3*RjO2xHEY(GC!Xn-GR;QPi+O#3$St?rVs1^;VFq;AfF(aI^-bED;InfirC_b08dKB3KxpZ*JH+Y(OuS08O2E@-(yB(iL` z?XKmQRVt1T&0ddn-fM6`3O zpL2B3_UbM8`mjD7+DCt!wC7nr?Jw`oJxhO3ZQs7VELyb43h zU%uQ9Y-`+m@4ZgFdiBiHGrD*0Zl>vzi*CL3R`cYC>eZ_|=bd++^U5o)n0f3|M$(l& zSwh=%+;PV_)v8rosT~Hs6@42c;N-7UAuPX$z9scU;XM=&hyVd zUt%7&{;^iATIJ;Ab^KHaTFixy^G;liJI5zbE6C+TS2Yt^ddbn4W}DJm*5Pjd<9XFXGG==vD>s*{qDxC94}?5o10kmb*o!E z%ea-}HZ4(QyY-VBw>r2@Q-01vZp-?e=EkiZe#?v1mu@1w-*cB+U-`LavfC@xx!=l$J`VTA7hi<` z>8sED9Q(2MZ`<#&juSgy`1XmlFGnsD`M2^r4FG_6@su#0-eqHi{G0fF!RskuIojD8 z?QQwTH$-xNc?!emUJYgM*6*ap`IkyT{r?WW3IG7I&x{!}q-W2bvVQ&g&^R*{i?eX! zyNSsK*tBVr9DVfBCXH58Yk{CfjT$8*MvO4Gk+=;U4FEtYy#LqHQnOZFsa^ZOPeS!; z-P+aC^|W(j#(RH}DzzI)x0Ab+T6F$`g>vet-s409*=+9Id2-#9?|*5cb5Pcgxzqf= z^ka(v007{dj?r`1U3ZyrdVqLLo;=w+0D+(^003F$pVv%jkeFNmQ~cHOkm^++uZu+f(tH?Zr!@MmZL#yUEiotqg>w)%5D8+Wy`c* zfb75h`t>Vo(Vpx&BZK;Ox~)U_zd^TEIB($sGRp=4 z06_Z6OW&%Mzwf{Q-h9EWU%!4RP+PfjWm&s+t<0P`Q-%&5DpRIRDN{wSzy5mZ-MhCe zU%p&gwQ5zOtg&OqN`8L6Tz1)IC8nnX$8luezI~ypeDTE>QczG3`ny`SYN7w9T4Y^R ztiTz9OU3b#N%UAf;)o+MsmfVn&6+i)Exmg6lEV%=%(Y$ioTWc}Wjpr8S*yLQQ0c?A)zkHdZY?YDB&QAdR)>F1GNll=PEzcxS6s+u)xhTaDNB+MBPes*Uz z=-wC{?RgHD7d_H*YRaJ@u4n(Bj35rDxBc=KuO7S+f{>^yp#! z-oJmp+;-b-QmAibLPyEi!QoInl)=CM;>{k$$Zre znaPtUmuSMskt3yL%a-N~vfgH=^Bg>Q(9Gl2KN?hM)Toh+88fCtSxTpAfL1ejRkZR| zadELc{P4r3o*GQnI_NEz%4_}Vz<~qi_TVN>nwYw4usE_lHmhUm)Tz>?OBb^by#4mu zW_hK7Yz)ef;squKjJr+HP*_eiAL?IT3Yp6Hk3(Eo0l0?)&|N4?ZZ}yLUI; zqQ|}tbD(VfBhOiW&OvtBc-kH=5!*Y~c5-9uZ}&y}x7T?_*?IH_NWHs5Kj-!HPBW4% zJC7|ld^w%wr@fZmA)-I*?cKZAPBI1!8dM_tIad42^K&oUn{U2pu5H3aJ9kCvt3+Kh zWm_L_*|Nn1!%si`bZOeOX{f7TdF2&z?WOGS20#AzW9WU$&#_yK#S-5&q|0Fd2$ z2WB->LB~|nK;q}0e{OCgeeuN?%@;Ry!U-qHTW`H({;%1KdaLh*2@}lU0|yS2H{N)| zWP@tJ>AdsKGhe>anSRN9|NZyno_p?*ygc_LV+}rAIt+r|PWSZFPs=yod?PQv{IZN2 zH_ik+l~?~%s#Hn(_wR4!)h}b#{Q2`uUukx&idDY4^UgbE`0(K-IIDHgz^Q(*R$l8@ zx88cI`2zRcbI+OWs$Yz6zWL@-!C7_p-FM4F4?QF+SFV(^&N|CX3&PL3v`;kPueT~| z8_CeiIplvEubvCcbg{PdY_%ToRQ?%n}EM&tqn*@i*IUC$`usc(>F()}3F9{|HY zhx9xZF7o{4=X_)ZZF{7$Zto!5$q(0KAi|9|-e^7pwI7EJ8Dc(T{0_O}r@hw27hf#9 zcI`5sxt9K@sn-oxUU{XN;X`Z0I*&!`D?isyu>$5Q8~RwUktR)= zWUfW^2iM0Re_YNy^UM-Ii0bf4_J>W)#MPJ18_CbHpR8+%afEqpy1X zA9LzmJKVh9`Rg0bU&cJ)Z2W1hW6hsG-w_dK@#4jHQYq7?PdD?dU%x)|-sa7loywIf zJFma~dT5#&G-yz%dDDq)@7lHh?E`iG`R6+|YSak5Hf-47Y~Q}!samzFSti`LapRoY zwQD=Y#l>c_TmPult5-X@xw+27i4#MM_v_csY2UuR`P)zVTefU*^7HeZv17-E%82B) z{!N=UIeB?`rmo?1`!sLfJT%EJJ89CS&@^SIhxdv8|I07GEb+eX6MokfX~KjFPPJ;) zoC60AlqxfvS6#F|mYqlICaieq5EeR2?67J<-lPZtOOT>@z#vtH1s36K-tTk?V})HJ_dCRW~<&>ubx- z*8M)beU_aTe$MiH4zkNe9^d*I7&*-z^ImLOk^6<6?zO%BZd*6DY`aeTx7WIqoku^n z!i9ep*m-QZ;mg@+Zu5BQ+qbXNr%#{I+f%1bHP;JTmY?>Q*XLfOMT-`hePiXym7%x% zoV(om%I`JPf&~klmMvSF`7O6;ncBzNe>dH9lT%Po;52B^z!^Ajpy_8X%a$!O+aO%{ zG{47wB)``mvBbMS0LUJvzn^=K%>~GwRv`+JBBwCQ`si&S=Vm7@`?a3#fEHNz;yzs&cChcdzf(7QOVVbJ(*=L{0o;`cy z?6c1<(F9Eg(&?IBWAD9nqXVkxvO2baj;F9~+cuLDrcWGEe#+N=)`8e`+XSJ@>Aiot zJ;K@TqbW|+t5*-brT5^wnKf&c8I!=WX}sb5u50exxh8c=)3$f--filq{iyw-;~vBk zSr;#U`ZavJwQburRFoa?GIE-3^X=QWoAk3F`$U^IZ9--1z1n*3u9lN&gXkvu_=xws z6N^`WYuaFt?G}w4pTyFq*!ba9H@AHu=sv81E)%(rtH^2Tyx)hPv;3ZetjKmoYrEU_ z@xyC-Cvso3yw(+7_h_F5iKeNtmt1m*8OKJ??XSJ|nw)daIc7|x4?p}c=CN4bpL>=) zw!;TMjrZK8ZPK*SSl3KlyLL5$*oSkQmZ^QLV{Pd8MEBo+ze$tU)Yh`_d+e9>`ol}S z`vU*~0J2}+;fL4%Pb=3(ZLQwxuY=d={d;=hs)5NzAAMA=xZ(;k-a)oG_Sj?1I0kzE zx(?)OHEh_>{CD;0)pn8zqA4Bd(CvP@TD5A0=JlfE8R!?(@4ov^-hKC7Gn@9U(jc8G zOZkbS_wu{Z!Qga&;j-GaX_E=~YhUPi3K}q&H*cO93qpfGe)z3R(0d3o~>s*^oL&kF+<0x(9b>{<3`5|QnuW5{tUG2 z4>J10n!O%K*10RFOzmSGbL!PsUzGfi}Icw)Dwc=}faD^$U$Y zbxSi_qdjHn_~VZ^Pj}J*#x%Rwi(CI#y?ggIK~DWrs!x*8f#d9xw)~W@{j7ET;DZn3 zs;jQD#g^cC`^iS#E`V_eE%-OQ?vo3vd%FdlTW$4hM=BZ_B;>3w1R_)e~ zc=+kpcqOvzM71}OQhj_xJMXxOx6cx}-Sqfz6K~zz#8cmRmhmf*Whb(qEI;R7myWMc<@-^u0zROEgD08}h_ZrL<$G<#ORH0UF<^}=}L#*HSJ zsJG|aK%Tv=eae(6=Hgnjmh=|!>#n;_ZomC@6Li#DMl~Z>pQe@Wo`3#%bDN>wYIw&T zcbJRoDpjh;nl)?8)6X=(t^KE8T=hvbx7>1zxiwLT8PH(^mMmFfZmZKLvnaRzv0r-i zil(9ZJ!v<~L)~~mfUVH7erhWSV zcJ11k$Cp3z%roYdNPgC(S+Lrt`uJ{bkM^NHi7lL4J8VCypMU<@^nW<*AAK}=I6wUw zuSAv|tG(qV6~~8Wvd22_xQVyV61m;H#9KEv@zgh-W&BEH*@^5Y%g;F|(c*1KBKtB3 zy`^0HNrR;NS*@Q1`Xo%HpAQ8E1tz0$*sx*d^Cjr{Ig;LjuTSsOA#C)=Nqe65)Bbe% z+|wUa+qZ8oixw?1LqVxzUo+_t5Z7FDjVxTa(DZ|Ho2D|kk2Nz{lL7RlPof<^e!NK# z(5J)sy}L&FIrbBA{oy6v{Xvfdx9#e88UO$Q(qFCy!Tbbg^$U<*SpNFgzc#^G4L<5c zvEFiMGjN+VYbN*Jd#?$?YIdEDqpI{voqplcF9)q#w>Gyf>LYm5U6UqF%#aQmjMm_) zeo@sdB5j8To%KtYeo0lD?fJ+fkC;s2mMvSFFKJIa@q{#J&>+-Iul}(#fW2kQ7Sl&M z?pioMGBz< znVmXBgXQPk<<(byuAlUdlNBpgl=wl?ZJNrKKGx56{lQ;{-O};2!|9LH+Rkv1(_$U_ zWw{oaF=K|gF4in_H)Yu$+_tOVX#fBKNPju{80s3;t4sdHLqu|Zc>u%cUJYgM*6*ap z`IkyT{r`@^3IG7Ij|P@{_UtL^*RKx^UjYAf+|r|uKHB`4t(ml_SVoN+B_l?RFn4_T zNqhj3X8hRtf3mp%Nm~ihP?1xZhP6U=c>k}XrDm~Mk^ui&v&3xX~Sq`-YsHr62*0059V z1`i&bIh931g^zIo00004k=x-{-K675q?H2zP*L^h(L)@^VT=O+6-$$UoOC_80000W zP2|1!=Mhq~<{|R?89%2h($00000AiL$B+_j4w-?nXbx3c2-?&wbzlM4U<00000 z0Azr?+}xZDs3rga0D$s$;#KQLkPA>@6*+|!w(S4_q(a`}e|;?fT=bEMG)u+$00000 z0001>!pj|S^B-i{@|6|6Bl=GL`w!#-000000000;xx7!8d}vnM`O&Enn-K1(-2ohUDbr$c7CY z652RqH})HpMKbrFvX))e<)cYv+38~N;K5R-P95{PGH>3zbg7o7WNwpWmJM&ih7FUx zefxUPPzG$%=rXx~GP&*m001bvG6iWPW#h%=)~#Emu&_|tw{I_p9CCR zOqntzY>D8mzy5mZ-MhCeU%p&gwQ5zOfU#r8N`8L6Tz1)IC8nnX$8luezI{ol$`@aJ zAq52mCCZK!{X*)c;`qoUdaNFC#1WZP<*c!0%^K5|UcGwBVTT>&+Ae#}(qF%_9s6Q( zMB9f(j~*>8TC|XM?b;=0v|JN_cnhx2cM-TJ&{{8#q zw%cx#diCl_jT$xN!V51nDNpHcz<>eLpg{wfGiQ!mbkRl9tXVTT^2j4i`m3hQOrAWs zL=#4i94ReZwlrTB8aHli<~exqpqa<3e>AAjs8J&sGiFSQvXoBK0IjC+s%Yh_;^Ja? z_~D05JvErDb!fddE3J;F_zG%c>C?Q&GO;w zeAA~-mlIDs(d;LkI(3p|%a)nhqSeFFptuIR!e81RFR}W?)@j7+&uW;gVMcwchfC;?$EIgl&yc{IV;HdE}piBOT_k$wVmA9w%dKt{_S<1 zQg$Bw0a9=A(DS5z-f4=mW#_TwhA*en{Iu87+eGxoxV?M#+DXQsL4!)9L&s`=I(+V_ zH{X2IT-$_;cJ7MSSBbi2%CC&`m)9|h?wQt&e)oY)R*8hH#_qGK9 z06_Ne{fIElRM3IdG?4iD=bxMVN?&~OMf1f?op8bl^442#ng46{qu%d3VZsFS_rQSz z<&8JqFxj9QpgZrp^URm8bf#Z2-+%vox#ymHBrh+|wW=C?wsb6nXPYqxLDoOwT{ms1kWz3pCf4=D}&8}6k%2#*Zd8Z5?KHLOnwGJ9M z)i2h{YyIlhTW>XA;GTQ#IkR2$i}B4j-&`s`BaKjB|wrKT;ho642v`+dZ|C3KXF?G81(o4+`2KwWIPSflg4K`Xq%hvu& zc6-xBs*aCX=N&hG_A#&hQw7=XL6x;`ZsMtLkY&>SxX~Z|!asZT+!QYIoE7AJ7qsn> z%DTOSY$rdW?f2G=H{NJI_p~2}3>jiRSNx8(JyLRm|pR<F~LylbP#5#9H>nlIkOg8Ws5hVYq&9@(gasl)j#lD{n{jJwXlO|0v z*P{Bv?cE@z&3W~m=ky?E{a(Y8e_<*}Us005B1od2lT|1qcDwZqNpoxi@}{AJ7& z&c>hC+P9tg^XEGv;w)agI5aKN^y$;hJnPr5552W{^Jb@V<;u?MufHCerUnffRBGOI zV%xiR?SK0~oqzuMPK_EhLaz-QHaOe2Z+EIzt!kDDH*VZGr*`eyPH}Oune5g-YW3>X zPHt|lGjZa?(Bl32^>f;{Z*TtgQ~s7MTb%s-d}r*~v7s^|xvhWGrcF*>UY@CIINd(Y zn>P@qWF z&a}li^dIl{!p7v(4R2?67J<-lPZtOO<`=w>4du=bj+ue;VJ93?o zyymmhz3S%1Z+&gq*?QcBx6iWE!p~Vj&v%jM2mK6;oMz7%UTi%g_X|7SYkT|Mwr*_M zcAfTbuXQOqkA7~23;!&z^Vo93m$TE{=JC?EZ(pZRpFW|tr%s(}t{1c{KkYBC&%H>C z7A-RS#>$l|LvQ&xce(YI-)p7?3l=ynTedXwTW-@bwU4#`Zo26vr=Xy~Y0#j7GjQNQ z)6ZTa`_lgHXP>wGu3zP`Z2r$a%NBao3nJ`^uRA&R%1vSOVXIq`tSc;>ZQ|l z9$uN&2VK|A-)M6IGOh0ESzkRCYz$W8v6g#^sEd`)KaLOsC$QfsxVQvf8tXiEO z&6i((X|f+qJ@wQQv*|5rPd@o%iD{YOg%@5h**^;wEHFvuBT-efHTU znxI)hI$g7D>}|JhbSyPpR)-bPp%k`l+h#Ju^ywqYPx;!*Kz2#T8M>xBE zG}Ebi_3ELwbhrXP+O%mCnoVyz*4t3GZ{O}~JlR>ZX33$49vWKSi=Tc8@AtNC+lGp= zV^u~@(`}~p)GV?f+q5k0%_fOHKH@#^#NxHRf^PR{?9e3EjvYJff1~oMo7-5-L5~3y zbeYIwL`6Z=CNTNvqmRlJ zS6pF+I>{H$nGP6?7T5`nXL?*W}Ry$(tPxc2H z{ejP348tiw&c`s%ClzylAM{X@s(zx?vc%>&tjh`Ik4IfX&W3rUv^ z3;+Ot?BF|6Yjx<*!Mt=pKfQ9k`s%CAV4nK)FPq{J{;gHh7xW@_-n@C{>e|vLZ>2L$ zvD9xh`qV8=Z;keps^gD8-aHLU2PM-KV=r#~WA*Oc+e9bzTdF>NLI;kkUAwk<+fVu0 z&sxV1KKMYcy6P%hYzc1bx7%m-?Af6K0G0l&Pk{?hpG_3Edc?y|zr-t%Whbh==_J+1 zN3`>fn|S*?k=tF5A2;#V%}qS@jb|CZ5?OX4`^n0r^IanQG6+5Q+g}NlepcJh0{g3@ z4sdFJP1C{Y!v)!H`kD3H-~QI5&gwOUUMuKlq4LxIbotzC(V~TkV(T@4{)!bY+PTZE zuk1dWsB5N7?c;OLJ=eT6J$d59iDnV2b{ma9+GN_Wpc|Gc@^Q13Uq-FS$3@UW~x*iADYe{>%8M8-ab#{cJ~r*-Q2`e-*}esE0JXPutM#)$pMlts{e)k>Fb>$bh!rU3u|Aib5o8Qp_^0n&@nU;p~oCK#*1 zN4+T4dl2otkIkAjlY8&I*92iTyG{pFRr;k)zi{c7gVwEEn|m4c5xnWHNs}gKTn7zC zYj9P+sA?9GwnKx?`Xx-iq^hAqhsq<5JYq75TefUzzN9_z#1qn>L4!~;z52(}0QQzG zTTCD6;A`Rhls|m` zc-6x??zrPjziHpumu3{Z@zXEyN>tgg+MB6TaeVkW@3<*TpC@X&dnrrZ+{9Dgc$V=i zQDrB(pR9B{-$j$Cz6?SGv3ftbW`yeJp58$+V88%Vg#Ix3`s=StqvKCsZgT-NFxaY9 zEAyk`kRd}#tSaa>?A*Dt`3(B>(@)LkY&buCkuINsn%SviHdubnV_tpb=lW^q&YiMi z#flO?Xu3^P+0w^)ZJ)2a5sCHR-_5X|+Gt4!vW{kT@mu>5|z1^k(01(8Eo%`jx z@4lBWzg!XcwQc*}AgcoKA36HCF#Z2w*FG+i^UG5hM)ztcd$)ckJ&M(_{_i`J761SMrRiNYcinZD$wEeEn>=~4$si{{3jnC7ii;1% z^#Twd-($}L0Dw6C@z{UYA{U^-7(94zw6+#Gh0)$dS_vPo0sw%D$SE${fbRf;AyNwf zKn2&MM-TbWutxv@0LTo_eA)D$NzDZ)E-ucDo&d50L0SL+00000m@y6jqz(hn0szvF zv-h>{l9~$u0000W8mG9}yms%}C67P;gzVV9Jv7a}r_=O3oySfC5FdiH000000H8u> za`*0Hasm9YPYkPEIZrB8%9XqB{-f;Py(=_b|F6^ZJ)OtS4Zo5?;e&lia zL@q$Zk z|2n<_fW#=b?AaMJW|#wd!-frsX$jy1`(4FWdiy_f-?-Bfp9@fWJ;9W9`Dl_^cDfim zc(Bx|Q^$P9%$qkaU8?0NncF0pWy9OBVZ)?v-@e{6lmXi`I{F6yfW*kj$rZ`XmE1~s zrCwF4R5dTR_jDPvEP%ig8l=s}3*)U@w@P7Qp|o$`UJg0r5UEn7iX3yyF>>|QSIfeM z3j=kyTmM{e!3EN-TQ}EoG=Qz^8#QW_>-#~ut-q|2QD(esUG&$y$XC#9l}>EC((wn4 zWFH^#Dvv%p?X=V6haY~Bx^?SDt#*0TEfWRlr?0;H$^^wmj2L0ILFdk$)27Km+L0)J z_r+u=kM>5Bs`_l+yjdQ5>@m6TzWbt8r-W41E!ncA9p#BW1hUj|i8YuB!onKNg~(4j+R%9JTl zN{H?H>#vvIy?e{@<;$g2t5ziz7&~^XD8;39Cp}YuI;ktEdAjt+p#YuN3?xt z^ytyjqD2d7*REZ1R$f6w>*H|We*3K)b<|PelK=of0vy}2jeNRvv9xR7Neb%Klib`& zQA^c_iEY}jK|cLtu^e}Nhp6)ca2F_h_MLa$k&YcZO4X{G&R#{DH*YRaJ@u3+dGX@K z(z9nz^MCzftl5h_dh{@V@87>)ZoBO^saLO_)TmKIF1+wUli`%^1`HS=4H`6%IdkU7 zMHgKp&6+inBab}NWV>pH%;d?FOEh8R$dS^rWlQs=xN+mgW}brwe|hSmSN~`rp;4no zGG@$}5@ji!ra@WF+EvlYSH;D}^6C@%J6HhezR;Ny#WZAN1p`tYiJaFJZvkz&1 z{N^{mk=I^(&Fp89S*03C*8o}gOZ&r1tbVm^pEhlpsh95mnw__5)hb!CWJ#z$wC*cb ztSGS>zh!&1J=%6FN4NEQcu0v{fK(hSD%v^7ji3Je_~VZ~_d6A98@jRkOys^9E)jKe z6Hk3(Eo0jg^%xK-atfGDDN=9_Pti=A-MPGHgcDp40v+1AHfwrnvG@zYN~U79v+8s62V1Ub&5 z9T!0^Mxu##UjP6g)e7p?l~%3W%Cav%m8tK&E$_YaR@9fyqx0%Ax-5X;avaT95Rt>K zeOx5xm!C&Q_i8A6w|*x*&c8Hxi2wiq000DW&Cw0MD3J>QAk)ow?=MoNb|dL_a+gv~ znZID6oOaSrr=0ssI200000B$j7jR)66D zkPy?W{;ejt00000008`lW)K4SFV`TgTlzTw0000WolJcG+Uev10LVPVolxOT`CF+j z2=v4-0000W)$~!(`}giK|Aq@X9RL6TNGAklk+yn$R5+Mi0Jti03SFlI04j!^+cwMA zEgQ_g;et*F0002e36WX=0000L#7%?7^&l4j005*P*THB3004k=QKQzOQf2>s$*Wws zM3sV02LJ#7(ur$ecK(8e=~PGf^uOmVIhI@i00000001DfxCUv};fL4Htd;-(002ma z8I^y3E4csw000T_(@#IUmf{(t&B@7eT>t<80000008lobf!W;L3i9l*R$o{B4Y>gD zR^$|VzX<>U0001h3hJbj&xqObMGHQNIgdr8761SMNUR?gjonBt0000$2I$n~w3xMA zyl_s5d32e`X>R<^r=kRD8Rq~10000006_LxvS_YnqdJ~+s^q%FM(s3xKYaPfzwLan zcm`&3ay-U4*m%+WUgQD*000000077W8d#0SEl#S_I{d1eSxlGz_@nuy{#I_wy73Is zR+zzP0RRAy7LI$Y+C$_50000W)js*xhn}l!e_~hHIH|@?bvb=s*?_GIFVAm`HA;|{ zAr1fl000000A#dRUViV>sJQ^Kh9q!%-%k7N%Qy!B00000006R&23MnT8>YZc zTlwY3B^HhR+s+pYfmr|mP_fkPdejjWDi;6%004lOuah%JvM> z=H%qq@&Et;00000L^0)_#(l^Is5rh}@oC(REpiIom-UR)`pw4$0000000004LtqvF z07Tbw{?P5@0ssI206@|Zqy+!~0000$%DsJX*l=000000D#0JNDBY}001a2^CmYso?HOLp~xwWV<`YgYeZ@R00000 z001Dx2+RUW(&yEGzD_Ox00000003ekNDBY}005cejMe`$k6Zu%0J020S^xk500000 zNHGGlNH2qr>2V*q000000001}KnT(T0002UdY4XrcrUpCh*yzQ81JG00Qg6w761SM z00000QjEZCraSHO{@ut0000000000o7C~A70001`yg%)x=g9>C002l0g0uht00000 z0FYu8G%$PNeNP=A7XSbN00000K>4enL0SL+03ZqGy*H*dxd14WBB!uS%L4#_j76jt z000000000|%x7Ts;=v87k_!L;00000004>RGe`>n001Pxo6~=KiCh2x002~Q1Ze>P z000000A!URAN}jxOv(iyNDBY}0000004YXb761Ss<2-cY+h1i;E&$S1kyDtiRRaJ3 zsCbCf0ssI20000L+`vD4U7uWl@^&co3jhG+fFLaZ00000005*Ifmr|*#|;H_ZX_1~30LG4CcI1l z0000$g+rtk00000fcV_B_qc1w1pok)89`bA00000002la0DCd%=|rh z$}~B%M=w*ZuD?^~Q{>Mtj0%+v0001>0=oC!UXPLs0000oK$(NI)}xOmD_H=%f1yd=*~aNA8x%_7A>43cijF5DIEHsjC*Z-=>2HgwrwLXjry~hWx?Ek z$gebp70%c@mh$%tqEZ2lih zUS6KmsZ-m`R8G74y?XbNQ@VAPPA7Jh9^KD0 z)796@mj)>g0001}xc)w}(U;@`0000aM2_T0e${GHQ11w-en_pTWqJl_ckkLE8-7|R zhc|92bq=jBd3lvZa&kNi%gHT0WP;;3CFakGw!F)G#lxf15B~KK<--S-5bK zEc$4%JU#L`xuow!X1s$FI(K(l3;+NC0000063TIkW&766vTpTq$;;1|{QRn(<$DHZ zH?99cj%eIW3hEs$dv@=V-Me>)LxS$5%UcsB%FVajCc_>mahLY8P5&$)7XSbN00000 zKuYA~=E&gb@N__TKn8dzeTO^-fGZu`S6GNkYUY0%^_vQI)o z8KA;zRJg9F!gm4y000000J7NE%a@vf>*V()$#qk{|D~nQL0LcMPV;}y6j}fP03bPj zb#nElHWwf{YXATM05Siv$1w z00000fQ%I=FgxSDzhrDf0RR9p+?A)CFe5{A0RR91fQqNb`Iq``bf6%u3Q{-#00000 z0DyG%t3DGCkPDD#fsP00000(of?dzj=#X0HA^(NDBY}0000004YXb764E_3a5PX z61e~X000005TpeF00000*`s}p*>{r*fD|io3RApBWGB*T0RR910000W#R$v-K&Gg1 z?vNwM1poj5001EC5TpeF0001>0-LvFV`Xvy0HAykqy+!~00000fD|Jz3n1G~J>wX1 z0RR91002PxB1j7W0000$P%~RpIhR}jl!qdxusl`^AO(oj0ssI20000$iV>Iv5aE_> zW9pC#000000059G1Ze>P0002VcT)BK?~n@s0Dvokv;Y7A00000kYWU8fy5a0r~m6g zE&u=k000000wYKZ00000X=_}Ydv7Ec0Oh90DJ-{j13<+?q!s`G0000008)&=EXvEy zh1*^s7XSbN000006<%IEJ&;=|uEhWV001D#?)mH3=g9>C005aKu4rpP{l=NqN&o-= z00000NRmxIuM1omNDBY}03<=qw7AEdT%j00000q?mhP_KJUe*O*)Y000000000;I`<$g0001x1bJ28uR|^X(m;_@ zmajE000000001_7=c*;0OEFF*jM|=1wdLU zathO`J^%m!0Q@3S3jhEB0059Cc8#6<4!Hn8#Y2!5000000000|jKC}aAcdy38*m1> z00000004v|NDBY}0000o+c8HDZ%!@%fDA^E761SM00000QjEYX0HnW*-l+8zxd2E% zMNVP*RSEzA001%+ky-!%0000gniZGj^(Pkq0MZ6QS^xk500000NHGGl0J72HJ^%iH zW004l*BS;GX00000001dQU=~2gJtJ0rOfCS@ zRFPAdrZocq0000W5s1_R00000l4NI(n=dC9004kk2+{%o0000006>Znm<7t<`Umbl zKrR3P000000Lp?OEdT%j0Hl|%YRepQ0RRA~KnT(T00000002OW5tv2ly*#)5AaVha z&WfDEbgmu%00000$U;PF0RR91WV(-kJhV5t0000WV-chU00000004j#BQTo@p8fNM z*OLnX00000003kqg0uht06+z`@w{>M$OQlZ04RS1X#oHL00000AjPscF#DUWZ4QtN zfV5ZS6sCP00RR910059|SsbYa0000IYhtg0*U1F{002Ou5u^nG000000Du$=3(PvN zHttR?0000000000q*7Rr761SMNP=sMH(p9E00000;E5nD00000004lD(=h+CBeEqI zfFNy_n_SqdD9f7&00000003krqO$-10O{tBw@uB-mRtY;0000n5u^nG0000004jiO zAN}DQaskp4L0SL+0000007x+cvj6}fOYFU8$JOKl00000$UFpT0RR910000ldmbwu zOD+JC?cAdG3yIVM00000002OW5ts!4pu*}}*s&_P0000008rit(gFYg0000WaRxm) zydk*&Kp+HZ0RR910000W#R$v-01!--x1T?mTmS$7002P35TpeF00000D0lz!(Je2L z3xG^h

IFmD3rKS^xk500000NHGGl0DxpWs_FfAkqZC-0001h2ZFQ!00000AOjuv z`^7!T1pts82+{%o0000006>Znm<50|b;9lc_#L?b000000AxRcv;Y7A002}R`JGqS zCl>%2smLkJ$a(|55vc_L000000Du(Bi)VeCeqI;PVgQg-Q^qg7lUx7*00000kZA%3 zX=l9mmrQFT000000P$+rdjB?Z0RR9=SksNWH;u0(GasH(x{ssU5000000F>m2 zW8$mPc#b_=rCN2_xqYihPENGt0c5(#C)c=yTmS$70001hq}a1-mx;BC<9L?u8Kf;Z ztbwfg=1bYLYp03!0ssI20N~dxcYRc!TmWRQBBwBOD-R%@Xd3OVo!e#o58ujRM>LUx z#RomB=Q++nwd#k+VTU)7%^QA{-MhAn6D8aW000000000LosJ!wU#*(dZ+Ns6)H_0U z@7n3vC7yvLMyJoH2e9LXps%-~3 zqH$B{(5b83SM-2v+qOMWrDo5WD|HWVA{#et3bdSG$u1uN000000080NYVmtK^`|C}dJJod26nLA(3?cGOq?AQ@cJy1%+LtptVxc~qF00000K(-4U zq`l+rKS}G>tz`VGFH7f>ekF|?HInXUogsgJdxC7;woM)%{=cTr+%i|gr!8Ijsa$mN zd(^u`kQ3I+<(ZSb?QidetwDN2Hp8bdGP-G zr0sES2gt4e?`E_9{3`kK%{Tv+EnBum zD-Hkv0000001_rpVD{^8{%uyQfl@ce9oJfZ_~A#{y?eLY+a=`X17wav78_3BF9 zf`St7tGjL=DCeBr)BIn9v8z^nB_p2sbF{$hE#v;-l*$G0TGz@|tK{IpgVOuFUedJb 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 diff --git a/kernel/doc/bbtkWebSite/home.html b/kernel/doc/bbtkWebSite/home.html index 15b1f54..c4c90d2 100644 --- a/kernel/doc/bbtkWebSite/home.html +++ b/kernel/doc/bbtkWebSite/home.html @@ -8,32 +8,19 @@

-The Black Box Toolkit Documentation
-bbtk @BBTK_VERSION@ (@BBTK_VERSION_DATE@)
+User Documentation
+@PROJECT_VERSION@ (@PROJECT_VERSION_DATE@)

Follow this link if you need to build bbtk from -sources.
+ href="./install.html">this link if you need to build this application from sources.

-Read the users' guide if you -want to learn how to use bbtk development environnement (bbStudio) and -how to write black box scripts.
+Read the users' guide To find out more about this application.

-Read the package -developers' guide to learn how to create your own black boxes and -packages.
-
-Developers might also be interested in doxygen documentation of the -source code of bbtk library.
-
-The boxes lists contain the boxes of bbtk core packages (std,wx,vtk...) -for current version.
-
-All this documentation is also available from bbStudio.
+The futures developers in this project might be also interested in the doxygen documentation of the +source code.
+

diff --git a/kernel/src/CMakeLists.txt b/kernel/src/CMakeLists.txt index 1978b2d..96ce672 100644 --- a/kernel/src/CMakeLists.txt +++ b/kernel/src/CMakeLists.txt @@ -162,7 +162,7 @@ ENDIF(BBTK_USE_QT) # lib definition ADD_LIBRARY(bbtk SHARED ${SOURCES} ${SOURCES_H}) #----------------------------------------------------------------------------- -TARGET_LINK_LIBRARIES(bbtk ${BBTK_LINK_LIBRARIES} ${BOOST_LIBRARIES}) +TARGET_LINK_LIBRARIES(bbtk ${BBTK_LINK_LIBRARIES} ${BOOST_LIBRARIES} ${crea_LIBRARIES}) #----------------------------------------------------------------------------- IF(UNIX) SET_TARGET_PROPERTIES(bbtk PROPERTIES COMPILE_FLAGS -Wall) diff --git a/kernel/src/ThirdParty/wx/treemultictrl/mac_collapse.xpm b/kernel/src/ThirdParty/wx/treemultictrl/mac_collapse.xpm index d100ef6..8089da7 100644 --- a/kernel/src/ThirdParty/wx/treemultictrl/mac_collapse.xpm +++ b/kernel/src/ThirdParty/wx/treemultictrl/mac_collapse.xpm @@ -1,25 +1,25 @@ -/* XPM */ -static char *collapse_xpm[] = -{ -/* width height ncolors chars_per_pixel */ -"11 11 6 1", -/* colors */ -"A c None", -"B c #CCCCCCCCCCCC", -"C c #EEEEEEEEEEEE", -"D c #DDDDDDDDDDDD", -"E c #BBBBBBBBBBBB", -"F c #AAAAAAAAAAAA", -/* pixels */ -"ACAAAAAAAAA", -"ABEAAAAAAAA", -"AFEEBAAAAAA", -"AEEFEEDAAAA", -"AEFEFEFBCAA", -"AFEFEFEFEBA", -"AEEEFEFBCAA", -"AEFFEEDAAAA", -"AFEEDAAAAAA", -"ABBCAAAAAAA", -"ACAAAAAAAAA", -}; +/* XPM */ +static char *collapse_xpm[] = +{ +/* width height ncolors chars_per_pixel */ +"11 11 6 1", +/* colors */ +"A c None", +"B c #CCCCCCCCCCCC", +"C c #EEEEEEEEEEEE", +"D c #DDDDDDDDDDDD", +"E c #BBBBBBBBBBBB", +"F c #AAAAAAAAAAAA", +/* pixels */ +"ACAAAAAAAAA", +"ABEAAAAAAAA", +"AFEEBAAAAAA", +"AEEFEEDAAAA", +"AEFEFEFBCAA", +"AFEFEFEFEBA", +"AEEEFEFBCAA", +"AEFFEEDAAAA", +"AFEEDAAAAAA", +"ABBCAAAAAAA", +"ACAAAAAAAAA", +}; diff --git a/kernel/src/ThirdParty/wx/treemultictrl/mac_expand.xpm b/kernel/src/ThirdParty/wx/treemultictrl/mac_expand.xpm index d2a09e8..507cd8c 100644 --- a/kernel/src/ThirdParty/wx/treemultictrl/mac_expand.xpm +++ b/kernel/src/ThirdParty/wx/treemultictrl/mac_expand.xpm @@ -1,25 +1,25 @@ -/* XPM */ -static char *expand_xpm[] = -{ -/* width height ncolors chars_per_pixel */ -"11 11 6 1", -/* colors */ -"A c None", -"B c #CCCCCCCCCCCC", -"C c #EEEEEEEEEEEE", -"D c #DDDDDDDDDDDD", -"E c #BBBBBBBBBBBB", -"F c #AAAAAAAAAAAA", -/* pixels */ -"AAAAAAAAAAA", -"CBFEEFEEFBC", -"ABEFEEFEEEA", -"ACEFEFEFEAA", -"AADEFEFEBAA", -"AAAEEFEEAAA", -"AAADFEFDAAA", -"AAAABFBAAAA", -"AAAACECAAAA", -"AAAAABAAAAA", -"AAAAAAAAAAA", -}; +/* XPM */ +static char *expand_xpm[] = +{ +/* width height ncolors chars_per_pixel */ +"11 11 6 1", +/* colors */ +"A c None", +"B c #CCCCCCCCCCCC", +"C c #EEEEEEEEEEEE", +"D c #DDDDDDDDDDDD", +"E c #BBBBBBBBBBBB", +"F c #AAAAAAAAAAAA", +/* pixels */ +"AAAAAAAAAAA", +"CBFEEFEEFBC", +"ABEFEEFEEEA", +"ACEFEFEFEAA", +"AADEFEFEBAA", +"AAAEEFEEAAA", +"AAADFEFDAAA", +"AAAABFBAAAA", +"AAAACECAAAA", +"AAAAABAAAAA", +"AAAAAAAAAAA", +}; diff --git a/kernel/src/ThirdParty/wx/treemultictrl/tmcimages.h b/kernel/src/ThirdParty/wx/treemultictrl/tmcimages.h index ed94b73..23a4e78 100644 --- a/kernel/src/ThirdParty/wx/treemultictrl/tmcimages.h +++ b/kernel/src/ThirdParty/wx/treemultictrl/tmcimages.h @@ -1,42 +1,42 @@ -//--------------------------------------------------------------------------- -// $RCSfile: tmcimages.h,v $ -// $Source: /cvs/creatis/bbtk/kernel/src/ThirdParty/wx/treemultictrl/tmcimages.h,v $ -// $Revision: 1.1 $ -// $Date: 2008/03/28 13:42:19 $ -//--------------------------------------------------------------------------- -// Author: Jorgen Bodde -// Copyright: (c) Jorgen Bodde -// License: wxWidgets License -//--------------------------------------------------------------------------- - -#ifndef _TMCIMAGES_H_ -#define _TMCIMAGES_H_ - -// pics for the expand / collapse buttons -#ifdef __APPLE__ - #include "mac_collapse.xpm" - #include "mac_expand.xpm" -#else - #ifdef LINUX - #include "linux_collapse.xpm" - #include "linux_expand.xpm" - #else - #include "default_collapse.xpm" - #include "default_expand.xpm" - #endif -#endif - -#if(CHECKBOXVIEW) - // icons for checkbox states - #ifdef WINDOWS - #include "win_unchecked_icon.xpm" - #include "win_checked_icon.xpm" - #include "win_tristate_icon.xpm" - #else - #include "default_unchecked_icon.xpm" - #include "default_checked_icon.xpm" - #include "default_tristate_icon.xpm" - #endif // WINDOWS -#endif // #if(CHECKBOXVIEW) - -#endif // _TMCIMAGES_H_ +//--------------------------------------------------------------------------- +// $RCSfile: tmcimages.h,v $ +// $Source: /cvs/creatis/bbtk/kernel/src/ThirdParty/wx/treemultictrl/tmcimages.h,v $ +// $Revision: 1.2 $ +// $Date: 2009/10/05 22:44:50 $ +//--------------------------------------------------------------------------- +// Author: Jorgen Bodde +// Copyright: (c) Jorgen Bodde +// License: wxWidgets License +//--------------------------------------------------------------------------- + +#ifndef _TMCIMAGES_H_ +#define _TMCIMAGES_H_ + +// pics for the expand / collapse buttons +#ifdef __APPLE__ + #include "mac_collapse.xpm" + #include "mac_expand.xpm" +#else + #ifdef LINUX + #include "linux_collapse.xpm" + #include "linux_expand.xpm" + #else + #include "default_collapse.xpm" + #include "default_expand.xpm" + #endif +#endif + +#if(CHECKBOXVIEW) + // icons for checkbox states + #ifdef WINDOWS + #include "win_unchecked_icon.xpm" + #include "win_checked_icon.xpm" + #include "win_tristate_icon.xpm" + #else + #include "default_unchecked_icon.xpm" + #include "default_checked_icon.xpm" + #include "default_tristate_icon.xpm" + #endif // WINDOWS +#endif // #if(CHECKBOXVIEW) + +#endif // _TMCIMAGES_H_ diff --git a/kernel/src/ThirdParty/wx/treemultictrl/win_checked_icon.xpm b/kernel/src/ThirdParty/wx/treemultictrl/win_checked_icon.xpm index f1d550f..87dd66c 100644 --- a/kernel/src/ThirdParty/wx/treemultictrl/win_checked_icon.xpm +++ b/kernel/src/ThirdParty/wx/treemultictrl/win_checked_icon.xpm @@ -1,273 +1,273 @@ -/* XPM */ -static char *checked_icon[] = { -"13 13 256 3", -"000 c #1C5180", -"001 c #21A121", -"002 c #E2E2DD", -"003 c #E3E3DF", -"004 c #E5E5E1", -"005 c #E7E7E3", -"006 c #EAEAE6", -"007 c #ECECE9", -"008 c #EFEFEC", -"009 c #F1F1EF", -"010 c #F3F3F1", -"011 c #F5F5F3", -"012 c #F7F7F6", -"013 c #F9F9F8", -"014 c #FAFAF9", -"015 c #FCFCFB", -"016 c #FDFDFD", -"017 c #FEFEFE", -"018 c gray100", -"019 c black", -"020 c black", -"021 c black", -"022 c black", -"023 c black", -"024 c black", -"025 c black", -"026 c black", -"027 c black", -"028 c black", -"029 c black", -"030 c black", -"031 c black", -"032 c black", -"033 c black", -"034 c black", -"035 c black", -"036 c black", -"037 c black", -"038 c black", -"039 c black", -"040 c black", -"041 c black", -"042 c black", -"043 c black", -"044 c black", -"045 c black", -"046 c black", -"047 c black", -"048 c black", -"049 c black", -"050 c black", -"051 c black", -"052 c black", -"053 c black", -"054 c black", -"055 c black", -"056 c black", -"057 c black", -"058 c black", -"059 c black", -"060 c black", -"061 c black", -"062 c black", -"063 c black", -"064 c black", -"065 c black", -"066 c black", -"067 c black", -"068 c black", -"069 c black", -"070 c black", -"071 c black", -"072 c black", -"073 c black", -"074 c black", -"075 c black", -"076 c black", -"077 c black", -"078 c black", -"079 c black", -"080 c black", -"081 c black", -"082 c black", -"083 c black", -"084 c black", -"085 c black", -"086 c black", -"087 c black", -"088 c black", -"089 c black", -"090 c black", -"091 c black", -"092 c black", -"093 c black", -"094 c black", -"095 c black", -"096 c black", -"097 c black", -"098 c black", -"099 c black", -"100 c black", -"101 c black", -"102 c black", -"103 c black", -"104 c black", -"105 c black", -"106 c black", -"107 c black", -"108 c black", -"109 c black", -"110 c black", -"111 c black", -"112 c black", -"113 c black", -"114 c black", -"115 c black", -"116 c black", -"117 c black", -"118 c black", -"119 c black", -"120 c black", -"121 c black", -"122 c black", -"123 c black", -"124 c black", -"125 c black", -"126 c black", -"127 c black", -"128 c black", -"129 c black", -"130 c black", -"131 c black", -"132 c black", -"133 c black", -"134 c black", -"135 c black", -"136 c black", -"137 c black", -"138 c black", -"139 c black", -"140 c black", -"141 c black", -"142 c black", -"143 c black", -"144 c black", -"145 c black", -"146 c black", -"147 c black", -"148 c black", -"149 c black", -"150 c black", -"151 c black", -"152 c black", -"153 c black", -"154 c black", -"155 c black", -"156 c black", -"157 c black", -"158 c black", -"159 c black", -"160 c black", -"161 c black", -"162 c black", -"163 c black", -"164 c black", -"165 c black", -"166 c black", -"167 c black", -"168 c black", -"169 c black", -"170 c black", -"171 c black", -"172 c black", -"173 c black", -"174 c black", -"175 c black", -"176 c black", -"177 c black", -"178 c black", -"179 c black", -"180 c black", -"181 c black", -"182 c black", -"183 c black", -"184 c black", -"185 c black", -"186 c black", -"187 c black", -"188 c black", -"189 c black", -"190 c black", -"191 c black", -"192 c black", -"193 c black", -"194 c black", -"195 c black", -"196 c black", -"197 c black", -"198 c black", -"199 c black", -"200 c black", -"201 c black", -"202 c black", -"203 c black", -"204 c black", -"205 c black", -"206 c black", -"207 c black", -"208 c black", -"209 c black", -"210 c black", -"211 c black", -"212 c black", -"213 c black", -"214 c black", -"215 c black", -"216 c black", -"217 c black", -"218 c black", -"219 c black", -"220 c black", -"221 c black", -"222 c black", -"223 c black", -"224 c black", -"225 c black", -"226 c black", -"227 c black", -"228 c black", -"229 c black", -"230 c black", -"231 c black", -"232 c black", -"233 c black", -"234 c black", -"235 c black", -"236 c black", -"237 c black", -"238 c black", -"239 c black", -"240 c black", -"241 c black", -"242 c black", -"243 c black", -"244 c black", -"245 c black", -"246 c black", -"247 c black", -"248 c black", -"249 c black", -"250 c black", -"251 c black", -"252 c black", -"253 c black", -"254 c black", -"255 c black", -"000000000000000000000000000000000000000", -"000002002002003004005006007008009010000", -"000002002003004005006007008009010011000", -"000002003004005006007008009001011012000", -"000003004005006007008009001001012013000", -"000004005001007008009001001001013014000", -"000005006001001009001001001013014015000", -"000006007001001001001001013014015016000", -"000007008009001001001013014015016017000", -"000008009010011001013014015016017018000", -"000009010011012013014015016017018018000", -"000010011012013014015016017018018018000", -"000000000000000000000000000000000000000" -}; +/* XPM */ +static char *checked_icon[] = { +"13 13 256 3", +"000 c #1C5180", +"001 c #21A121", +"002 c #E2E2DD", +"003 c #E3E3DF", +"004 c #E5E5E1", +"005 c #E7E7E3", +"006 c #EAEAE6", +"007 c #ECECE9", +"008 c #EFEFEC", +"009 c #F1F1EF", +"010 c #F3F3F1", +"011 c #F5F5F3", +"012 c #F7F7F6", +"013 c #F9F9F8", +"014 c #FAFAF9", +"015 c #FCFCFB", +"016 c #FDFDFD", +"017 c #FEFEFE", +"018 c gray100", +"019 c black", +"020 c black", +"021 c black", +"022 c black", +"023 c black", +"024 c black", +"025 c black", +"026 c black", +"027 c black", +"028 c black", +"029 c black", +"030 c black", +"031 c black", +"032 c black", +"033 c black", +"034 c black", +"035 c black", +"036 c black", +"037 c black", +"038 c black", +"039 c black", +"040 c black", +"041 c black", +"042 c black", +"043 c black", +"044 c black", +"045 c black", +"046 c black", +"047 c black", +"048 c black", +"049 c black", +"050 c black", +"051 c black", +"052 c black", +"053 c black", +"054 c black", +"055 c black", +"056 c black", +"057 c black", +"058 c black", +"059 c black", +"060 c black", +"061 c black", +"062 c black", +"063 c black", +"064 c black", +"065 c black", +"066 c black", +"067 c black", +"068 c black", +"069 c black", +"070 c black", +"071 c black", +"072 c black", +"073 c black", +"074 c black", +"075 c black", +"076 c black", +"077 c black", +"078 c black", +"079 c black", +"080 c black", +"081 c black", +"082 c black", +"083 c black", +"084 c black", +"085 c black", +"086 c black", +"087 c black", +"088 c black", +"089 c black", +"090 c black", +"091 c black", +"092 c black", +"093 c black", +"094 c black", +"095 c black", +"096 c black", +"097 c black", +"098 c black", +"099 c black", +"100 c black", +"101 c black", +"102 c black", +"103 c black", +"104 c black", +"105 c black", +"106 c black", +"107 c black", +"108 c black", +"109 c black", +"110 c black", +"111 c black", +"112 c black", +"113 c black", +"114 c black", +"115 c black", +"116 c black", +"117 c black", +"118 c black", +"119 c black", +"120 c black", +"121 c black", +"122 c black", +"123 c black", +"124 c black", +"125 c black", +"126 c black", +"127 c black", +"128 c black", +"129 c black", +"130 c black", +"131 c black", +"132 c black", +"133 c black", +"134 c black", +"135 c black", +"136 c black", +"137 c black", +"138 c black", +"139 c black", +"140 c black", +"141 c black", +"142 c black", +"143 c black", +"144 c black", +"145 c black", +"146 c black", +"147 c black", +"148 c black", +"149 c black", +"150 c black", +"151 c black", +"152 c black", +"153 c black", +"154 c black", +"155 c black", +"156 c black", +"157 c black", +"158 c black", +"159 c black", +"160 c black", +"161 c black", +"162 c black", +"163 c black", +"164 c black", +"165 c black", +"166 c black", +"167 c black", +"168 c black", +"169 c black", +"170 c black", +"171 c black", +"172 c black", +"173 c black", +"174 c black", +"175 c black", +"176 c black", +"177 c black", +"178 c black", +"179 c black", +"180 c black", +"181 c black", +"182 c black", +"183 c black", +"184 c black", +"185 c black", +"186 c black", +"187 c black", +"188 c black", +"189 c black", +"190 c black", +"191 c black", +"192 c black", +"193 c black", +"194 c black", +"195 c black", +"196 c black", +"197 c black", +"198 c black", +"199 c black", +"200 c black", +"201 c black", +"202 c black", +"203 c black", +"204 c black", +"205 c black", +"206 c black", +"207 c black", +"208 c black", +"209 c black", +"210 c black", +"211 c black", +"212 c black", +"213 c black", +"214 c black", +"215 c black", +"216 c black", +"217 c black", +"218 c black", +"219 c black", +"220 c black", +"221 c black", +"222 c black", +"223 c black", +"224 c black", +"225 c black", +"226 c black", +"227 c black", +"228 c black", +"229 c black", +"230 c black", +"231 c black", +"232 c black", +"233 c black", +"234 c black", +"235 c black", +"236 c black", +"237 c black", +"238 c black", +"239 c black", +"240 c black", +"241 c black", +"242 c black", +"243 c black", +"244 c black", +"245 c black", +"246 c black", +"247 c black", +"248 c black", +"249 c black", +"250 c black", +"251 c black", +"252 c black", +"253 c black", +"254 c black", +"255 c black", +"000000000000000000000000000000000000000", +"000002002002003004005006007008009010000", +"000002002003004005006007008009010011000", +"000002003004005006007008009001011012000", +"000003004005006007008009001001012013000", +"000004005001007008009001001001013014000", +"000005006001001009001001001013014015000", +"000006007001001001001001013014015016000", +"000007008009001001001013014015016017000", +"000008009010011001013014015016017018000", +"000009010011012013014015016017018018000", +"000010011012013014015016017018018018000", +"000000000000000000000000000000000000000" +}; diff --git a/kernel/src/ThirdParty/wx/treemultictrl/win_tristate_icon.xpm b/kernel/src/ThirdParty/wx/treemultictrl/win_tristate_icon.xpm index 1731cb9..4ed4500 100644 --- a/kernel/src/ThirdParty/wx/treemultictrl/win_tristate_icon.xpm +++ b/kernel/src/ThirdParty/wx/treemultictrl/win_tristate_icon.xpm @@ -1,273 +1,273 @@ -/* XPM */ -static char *tristate_icon[] = { -"13 13 256 3", -"000 c #1C5180", -"001 c #6DBB6C", -"002 c #6EBC6C", -"003 c #6FBD6D", -"004 c #70BE6F", -"005 c #71BF70", -"006 c #72C071", -"007 c #73C172", -"008 c #73C273", -"009 c #74C274", -"010 c #75C374", -"011 c #75C475", -"012 c #76C476", -"013 c #76C576", -"014 c #E2E2DD", -"015 c #E3E3DF", -"016 c #E5E5E1", -"017 c #E7E7E3", -"018 c #EAEAE6", -"019 c #ECECE9", -"020 c #EFEFEC", -"021 c #F1F1EF", -"022 c #F3F3F1", -"023 c #F5F5F3", -"024 c #F7F7F6", -"025 c #F9F9F8", -"026 c #FAFAF9", -"027 c #FCFCFB", -"028 c #FDFDFD", -"029 c #FEFEFE", -"030 c gray100", -"031 c black", -"032 c black", -"033 c black", -"034 c black", -"035 c black", -"036 c black", -"037 c black", -"038 c black", -"039 c black", -"040 c black", -"041 c black", -"042 c black", -"043 c black", -"044 c black", -"045 c black", -"046 c black", -"047 c black", -"048 c black", -"049 c black", -"050 c black", -"051 c black", -"052 c black", -"053 c black", -"054 c black", -"055 c black", -"056 c black", -"057 c black", -"058 c black", -"059 c black", -"060 c black", -"061 c black", -"062 c black", -"063 c black", -"064 c black", -"065 c black", -"066 c black", -"067 c black", -"068 c black", -"069 c black", -"070 c black", -"071 c black", -"072 c black", -"073 c black", -"074 c black", -"075 c black", -"076 c black", -"077 c black", -"078 c black", -"079 c black", -"080 c black", -"081 c black", -"082 c black", -"083 c black", -"084 c black", -"085 c black", -"086 c black", -"087 c black", -"088 c black", -"089 c black", -"090 c black", -"091 c black", -"092 c black", -"093 c black", -"094 c black", -"095 c black", -"096 c black", -"097 c black", -"098 c black", -"099 c black", -"100 c black", -"101 c black", -"102 c black", -"103 c black", -"104 c black", -"105 c black", -"106 c black", -"107 c black", -"108 c black", -"109 c black", -"110 c black", -"111 c black", -"112 c black", -"113 c black", -"114 c black", -"115 c black", -"116 c black", -"117 c black", -"118 c black", -"119 c black", -"120 c black", -"121 c black", -"122 c black", -"123 c black", -"124 c black", -"125 c black", -"126 c black", -"127 c black", -"128 c black", -"129 c black", -"130 c black", -"131 c black", -"132 c black", -"133 c black", -"134 c black", -"135 c black", -"136 c black", -"137 c black", -"138 c black", -"139 c black", -"140 c black", -"141 c black", -"142 c black", -"143 c black", -"144 c black", -"145 c black", -"146 c black", -"147 c black", -"148 c black", -"149 c black", -"150 c black", -"151 c black", -"152 c black", -"153 c black", -"154 c black", -"155 c black", -"156 c black", -"157 c black", -"158 c black", -"159 c black", -"160 c black", -"161 c black", -"162 c black", -"163 c black", -"164 c black", -"165 c black", -"166 c black", -"167 c black", -"168 c black", -"169 c black", -"170 c black", -"171 c black", -"172 c black", -"173 c black", -"174 c black", -"175 c black", -"176 c black", -"177 c black", -"178 c black", -"179 c black", -"180 c black", -"181 c black", -"182 c black", -"183 c black", -"184 c black", -"185 c black", -"186 c black", -"187 c black", -"188 c black", -"189 c black", -"190 c black", -"191 c black", -"192 c black", -"193 c black", -"194 c black", -"195 c black", -"196 c black", -"197 c black", -"198 c black", -"199 c black", -"200 c black", -"201 c black", -"202 c black", -"203 c black", -"204 c black", -"205 c black", -"206 c black", -"207 c black", -"208 c black", -"209 c black", -"210 c black", -"211 c black", -"212 c black", -"213 c black", -"214 c black", -"215 c black", -"216 c black", -"217 c black", -"218 c black", -"219 c black", -"220 c black", -"221 c black", -"222 c black", -"223 c black", -"224 c black", -"225 c black", -"226 c black", -"227 c black", -"228 c black", -"229 c black", -"230 c black", -"231 c black", -"232 c black", -"233 c black", -"234 c black", -"235 c black", -"236 c black", -"237 c black", -"238 c black", -"239 c black", -"240 c black", -"241 c black", -"242 c black", -"243 c black", -"244 c black", -"245 c black", -"246 c black", -"247 c black", -"248 c black", -"249 c black", -"250 c black", -"251 c black", -"252 c black", -"253 c black", -"254 c black", -"255 c black", -"000000000000000000000000000000000000000", -"000014014014015016017018019020021022000", -"000014014015016017018019020021022023000", -"000014015001002003004005006007023024000", -"000015016002003004005006007008024025000", -"000016017003004005006007008009025026000", -"000017018004005006007008009010026027000", -"000018019005006007008009010011027028000", -"000019020006007008009010011012028029000", -"000020021007008009010011012013029030000", -"000021022023024025026027028029030030000", -"000022023024025026027028029030030030000", -"000000000000000000000000000000000000000" -}; +/* XPM */ +static char *tristate_icon[] = { +"13 13 256 3", +"000 c #1C5180", +"001 c #6DBB6C", +"002 c #6EBC6C", +"003 c #6FBD6D", +"004 c #70BE6F", +"005 c #71BF70", +"006 c #72C071", +"007 c #73C172", +"008 c #73C273", +"009 c #74C274", +"010 c #75C374", +"011 c #75C475", +"012 c #76C476", +"013 c #76C576", +"014 c #E2E2DD", +"015 c #E3E3DF", +"016 c #E5E5E1", +"017 c #E7E7E3", +"018 c #EAEAE6", +"019 c #ECECE9", +"020 c #EFEFEC", +"021 c #F1F1EF", +"022 c #F3F3F1", +"023 c #F5F5F3", +"024 c #F7F7F6", +"025 c #F9F9F8", +"026 c #FAFAF9", +"027 c #FCFCFB", +"028 c #FDFDFD", +"029 c #FEFEFE", +"030 c gray100", +"031 c black", +"032 c black", +"033 c black", +"034 c black", +"035 c black", +"036 c black", +"037 c black", +"038 c black", +"039 c black", +"040 c black", +"041 c black", +"042 c black", +"043 c black", +"044 c black", +"045 c black", +"046 c black", +"047 c black", +"048 c black", +"049 c black", +"050 c black", +"051 c black", +"052 c black", +"053 c black", +"054 c black", +"055 c black", +"056 c black", +"057 c black", +"058 c black", +"059 c black", +"060 c black", +"061 c black", +"062 c black", +"063 c black", +"064 c black", +"065 c black", +"066 c black", +"067 c black", +"068 c black", +"069 c black", +"070 c black", +"071 c black", +"072 c black", +"073 c black", +"074 c black", +"075 c black", +"076 c black", +"077 c black", +"078 c black", +"079 c black", +"080 c black", +"081 c black", +"082 c black", +"083 c black", +"084 c black", +"085 c black", +"086 c black", +"087 c black", +"088 c black", +"089 c black", +"090 c black", +"091 c black", +"092 c black", +"093 c black", +"094 c black", +"095 c black", +"096 c black", +"097 c black", +"098 c black", +"099 c black", +"100 c black", +"101 c black", +"102 c black", +"103 c black", +"104 c black", +"105 c black", +"106 c black", +"107 c black", +"108 c black", +"109 c black", +"110 c black", +"111 c black", +"112 c black", +"113 c black", +"114 c black", +"115 c black", +"116 c black", +"117 c black", +"118 c black", +"119 c black", +"120 c black", +"121 c black", +"122 c black", +"123 c black", +"124 c black", +"125 c black", +"126 c black", +"127 c black", +"128 c black", +"129 c black", +"130 c black", +"131 c black", +"132 c black", +"133 c black", +"134 c black", +"135 c black", +"136 c black", +"137 c black", +"138 c black", +"139 c black", +"140 c black", +"141 c black", +"142 c black", +"143 c black", +"144 c black", +"145 c black", +"146 c black", +"147 c black", +"148 c black", +"149 c black", +"150 c black", +"151 c black", +"152 c black", +"153 c black", +"154 c black", +"155 c black", +"156 c black", +"157 c black", +"158 c black", +"159 c black", +"160 c black", +"161 c black", +"162 c black", +"163 c black", +"164 c black", +"165 c black", +"166 c black", +"167 c black", +"168 c black", +"169 c black", +"170 c black", +"171 c black", +"172 c black", +"173 c black", +"174 c black", +"175 c black", +"176 c black", +"177 c black", +"178 c black", +"179 c black", +"180 c black", +"181 c black", +"182 c black", +"183 c black", +"184 c black", +"185 c black", +"186 c black", +"187 c black", +"188 c black", +"189 c black", +"190 c black", +"191 c black", +"192 c black", +"193 c black", +"194 c black", +"195 c black", +"196 c black", +"197 c black", +"198 c black", +"199 c black", +"200 c black", +"201 c black", +"202 c black", +"203 c black", +"204 c black", +"205 c black", +"206 c black", +"207 c black", +"208 c black", +"209 c black", +"210 c black", +"211 c black", +"212 c black", +"213 c black", +"214 c black", +"215 c black", +"216 c black", +"217 c black", +"218 c black", +"219 c black", +"220 c black", +"221 c black", +"222 c black", +"223 c black", +"224 c black", +"225 c black", +"226 c black", +"227 c black", +"228 c black", +"229 c black", +"230 c black", +"231 c black", +"232 c black", +"233 c black", +"234 c black", +"235 c black", +"236 c black", +"237 c black", +"238 c black", +"239 c black", +"240 c black", +"241 c black", +"242 c black", +"243 c black", +"244 c black", +"245 c black", +"246 c black", +"247 c black", +"248 c black", +"249 c black", +"250 c black", +"251 c black", +"252 c black", +"253 c black", +"254 c black", +"255 c black", +"000000000000000000000000000000000000000", +"000014014014015016017018019020021022000", +"000014014015016017018019020021022023000", +"000014015001002003004005006007023024000", +"000015016002003004005006007008024025000", +"000016017003004005006007008009025026000", +"000017018004005006007008009010026027000", +"000018019005006007008009010011027028000", +"000019020006007008009010011012028029000", +"000020021007008009010011012013029030000", +"000021022023024025026027028029030030000", +"000022023024025026027028029030030030000", +"000000000000000000000000000000000000000" +}; diff --git a/kernel/src/ThirdParty/wx/treemultictrl/win_unchecked_icon.xpm b/kernel/src/ThirdParty/wx/treemultictrl/win_unchecked_icon.xpm index 4a61e61..5cf3539 100644 --- a/kernel/src/ThirdParty/wx/treemultictrl/win_unchecked_icon.xpm +++ b/kernel/src/ThirdParty/wx/treemultictrl/win_unchecked_icon.xpm @@ -1,273 +1,273 @@ -/* XPM */ -static char *unchecked_icon[] = { -"13 13 256 3", -"000 c #1C5180", -"001 c #DCDCD7", -"002 c #DEDED9", -"003 c #E0E0DB", -"004 c #E2E2DE", -"005 c #E5E5E2", -"006 c #E8E8E5", -"007 c #ECECE9", -"008 c #EFEFEC", -"009 c #F1F1EF", -"010 c #F3F3F1", -"011 c #F5F5F4", -"012 c #F7F7F6", -"013 c #F9F9F8", -"014 c #FBFBFA", -"015 c #FDFDFC", -"016 c #FEFEFE", -"017 c gray100", -"018 c black", -"019 c black", -"020 c black", -"021 c black", -"022 c black", -"023 c black", -"024 c black", -"025 c black", -"026 c black", -"027 c black", -"028 c black", -"029 c black", -"030 c black", -"031 c black", -"032 c black", -"033 c black", -"034 c black", -"035 c black", -"036 c black", -"037 c black", -"038 c black", -"039 c black", -"040 c black", -"041 c black", -"042 c black", -"043 c black", -"044 c black", -"045 c black", -"046 c black", -"047 c black", -"048 c black", -"049 c black", -"050 c black", -"051 c black", -"052 c black", -"053 c black", -"054 c black", -"055 c black", -"056 c black", -"057 c black", -"058 c black", -"059 c black", -"060 c black", -"061 c black", -"062 c black", -"063 c black", -"064 c black", -"065 c black", -"066 c black", -"067 c black", -"068 c black", -"069 c black", -"070 c black", -"071 c black", -"072 c black", -"073 c black", -"074 c black", -"075 c black", -"076 c black", -"077 c black", -"078 c black", -"079 c black", -"080 c black", -"081 c black", -"082 c black", -"083 c black", -"084 c black", -"085 c black", -"086 c black", -"087 c black", -"088 c black", -"089 c black", -"090 c black", -"091 c black", -"092 c black", -"093 c black", -"094 c black", -"095 c black", -"096 c black", -"097 c black", -"098 c black", -"099 c black", -"100 c black", -"101 c black", -"102 c black", -"103 c black", -"104 c black", -"105 c black", -"106 c black", -"107 c black", -"108 c black", -"109 c black", -"110 c black", -"111 c black", -"112 c black", -"113 c black", -"114 c black", -"115 c black", -"116 c black", -"117 c black", -"118 c black", -"119 c black", -"120 c black", -"121 c black", -"122 c black", -"123 c black", -"124 c black", -"125 c black", -"126 c black", -"127 c black", -"128 c black", -"129 c black", -"130 c black", -"131 c black", -"132 c black", -"133 c black", -"134 c black", -"135 c black", -"136 c black", -"137 c black", -"138 c black", -"139 c black", -"140 c black", -"141 c black", -"142 c black", -"143 c black", -"144 c black", -"145 c black", -"146 c black", -"147 c black", -"148 c black", -"149 c black", -"150 c black", -"151 c black", -"152 c black", -"153 c black", -"154 c black", -"155 c black", -"156 c black", -"157 c black", -"158 c black", -"159 c black", -"160 c black", -"161 c black", -"162 c black", -"163 c black", -"164 c black", -"165 c black", -"166 c black", -"167 c black", -"168 c black", -"169 c black", -"170 c black", -"171 c black", -"172 c black", -"173 c black", -"174 c black", -"175 c black", -"176 c black", -"177 c black", -"178 c black", -"179 c black", -"180 c black", -"181 c black", -"182 c black", -"183 c black", -"184 c black", -"185 c black", -"186 c black", -"187 c black", -"188 c black", -"189 c black", -"190 c black", -"191 c black", -"192 c black", -"193 c black", -"194 c black", -"195 c black", -"196 c black", -"197 c black", -"198 c black", -"199 c black", -"200 c black", -"201 c black", -"202 c black", -"203 c black", -"204 c black", -"205 c black", -"206 c black", -"207 c black", -"208 c black", -"209 c black", -"210 c black", -"211 c black", -"212 c black", -"213 c black", -"214 c black", -"215 c black", -"216 c black", -"217 c black", -"218 c black", -"219 c black", -"220 c black", -"221 c black", -"222 c black", -"223 c black", -"224 c black", -"225 c black", -"226 c black", -"227 c black", -"228 c black", -"229 c black", -"230 c black", -"231 c black", -"232 c black", -"233 c black", -"234 c black", -"235 c black", -"236 c black", -"237 c black", -"238 c black", -"239 c black", -"240 c black", -"241 c black", -"242 c black", -"243 c black", -"244 c black", -"245 c black", -"246 c black", -"247 c black", -"248 c black", -"249 c black", -"250 c black", -"251 c black", -"252 c black", -"253 c black", -"254 c black", -"255 c black", -"000000000000000000000000000000000000000", -"000001001001002003004005006007008009000", -"000001001002003004005006007008009010000", -"000001002003004005006007008009010011000", -"000002003004005006007008009010011012000", -"000003004005006007008009010011012013000", -"000004005006007008009010011012013014000", -"000005006007008009010011012013014015000", -"000006007008009010011012013014015016000", -"000007008009010011012013014015016017000", -"000008009010011012013014015016017017000", -"000009010011012013014015016017017017000", -"000000000000000000000000000000000000000" -}; +/* XPM */ +static char *unchecked_icon[] = { +"13 13 256 3", +"000 c #1C5180", +"001 c #DCDCD7", +"002 c #DEDED9", +"003 c #E0E0DB", +"004 c #E2E2DE", +"005 c #E5E5E2", +"006 c #E8E8E5", +"007 c #ECECE9", +"008 c #EFEFEC", +"009 c #F1F1EF", +"010 c #F3F3F1", +"011 c #F5F5F4", +"012 c #F7F7F6", +"013 c #F9F9F8", +"014 c #FBFBFA", +"015 c #FDFDFC", +"016 c #FEFEFE", +"017 c gray100", +"018 c black", +"019 c black", +"020 c black", +"021 c black", +"022 c black", +"023 c black", +"024 c black", +"025 c black", +"026 c black", +"027 c black", +"028 c black", +"029 c black", +"030 c black", +"031 c black", +"032 c black", +"033 c black", +"034 c black", +"035 c black", +"036 c black", +"037 c black", +"038 c black", +"039 c black", +"040 c black", +"041 c black", +"042 c black", +"043 c black", +"044 c black", +"045 c black", +"046 c black", +"047 c black", +"048 c black", +"049 c black", +"050 c black", +"051 c black", +"052 c black", +"053 c black", +"054 c black", +"055 c black", +"056 c black", +"057 c black", +"058 c black", +"059 c black", +"060 c black", +"061 c black", +"062 c black", +"063 c black", +"064 c black", +"065 c black", +"066 c black", +"067 c black", +"068 c black", +"069 c black", +"070 c black", +"071 c black", +"072 c black", +"073 c black", +"074 c black", +"075 c black", +"076 c black", +"077 c black", +"078 c black", +"079 c black", +"080 c black", +"081 c black", +"082 c black", +"083 c black", +"084 c black", +"085 c black", +"086 c black", +"087 c black", +"088 c black", +"089 c black", +"090 c black", +"091 c black", +"092 c black", +"093 c black", +"094 c black", +"095 c black", +"096 c black", +"097 c black", +"098 c black", +"099 c black", +"100 c black", +"101 c black", +"102 c black", +"103 c black", +"104 c black", +"105 c black", +"106 c black", +"107 c black", +"108 c black", +"109 c black", +"110 c black", +"111 c black", +"112 c black", +"113 c black", +"114 c black", +"115 c black", +"116 c black", +"117 c black", +"118 c black", +"119 c black", +"120 c black", +"121 c black", +"122 c black", +"123 c black", +"124 c black", +"125 c black", +"126 c black", +"127 c black", +"128 c black", +"129 c black", +"130 c black", +"131 c black", +"132 c black", +"133 c black", +"134 c black", +"135 c black", +"136 c black", +"137 c black", +"138 c black", +"139 c black", +"140 c black", +"141 c black", +"142 c black", +"143 c black", +"144 c black", +"145 c black", +"146 c black", +"147 c black", +"148 c black", +"149 c black", +"150 c black", +"151 c black", +"152 c black", +"153 c black", +"154 c black", +"155 c black", +"156 c black", +"157 c black", +"158 c black", +"159 c black", +"160 c black", +"161 c black", +"162 c black", +"163 c black", +"164 c black", +"165 c black", +"166 c black", +"167 c black", +"168 c black", +"169 c black", +"170 c black", +"171 c black", +"172 c black", +"173 c black", +"174 c black", +"175 c black", +"176 c black", +"177 c black", +"178 c black", +"179 c black", +"180 c black", +"181 c black", +"182 c black", +"183 c black", +"184 c black", +"185 c black", +"186 c black", +"187 c black", +"188 c black", +"189 c black", +"190 c black", +"191 c black", +"192 c black", +"193 c black", +"194 c black", +"195 c black", +"196 c black", +"197 c black", +"198 c black", +"199 c black", +"200 c black", +"201 c black", +"202 c black", +"203 c black", +"204 c black", +"205 c black", +"206 c black", +"207 c black", +"208 c black", +"209 c black", +"210 c black", +"211 c black", +"212 c black", +"213 c black", +"214 c black", +"215 c black", +"216 c black", +"217 c black", +"218 c black", +"219 c black", +"220 c black", +"221 c black", +"222 c black", +"223 c black", +"224 c black", +"225 c black", +"226 c black", +"227 c black", +"228 c black", +"229 c black", +"230 c black", +"231 c black", +"232 c black", +"233 c black", +"234 c black", +"235 c black", +"236 c black", +"237 c black", +"238 c black", +"239 c black", +"240 c black", +"241 c black", +"242 c black", +"243 c black", +"244 c black", +"245 c black", +"246 c black", +"247 c black", +"248 c black", +"249 c black", +"250 c black", +"251 c black", +"252 c black", +"253 c black", +"254 c black", +"255 c black", +"000000000000000000000000000000000000000", +"000001001001002003004005006007008009000", +"000001001002003004005006007008009010000", +"000001002003004005006007008009010011000", +"000002003004005006007008009010011012000", +"000003004005006007008009010011012013000", +"000004005006007008009010011012013014000", +"000005006007008009010011012013014015000", +"000006007008009010011012013014015016000", +"000007008009010011012013014015016017000", +"000008009010011012013014015016017017000", +"000009010011012013014015016017017017000", +"000000000000000000000000000000000000000" +}; diff --git a/kernel/src/ThirdParty/wx/treemultictrl/wxTreeMultiCtrl.cpp b/kernel/src/ThirdParty/wx/treemultictrl/wxTreeMultiCtrl.cpp index 00cb190..6a5c157 100644 --- a/kernel/src/ThirdParty/wx/treemultictrl/wxTreeMultiCtrl.cpp +++ b/kernel/src/ThirdParty/wx/treemultictrl/wxTreeMultiCtrl.cpp @@ -1,1985 +1,1985 @@ -//--------------------------------------------------------------------------- -// $RCSfile: wxTreeMultiCtrl.cpp,v $ -// $Source: /cvs/creatis/bbtk/kernel/src/ThirdParty/wx/treemultictrl/wxTreeMultiCtrl.cpp,v $ -// $Revision: 1.1 $ -// $Date: 2008/03/28 13:42:19 $ -//--------------------------------------------------------------------------- -// Author: Jorgen Bodde -// Copyright: (c) Jorgen Bodde -// License: wxWidgets License -//--------------------------------------------------------------------------- - -#ifdef __GNUG__ - #pragma implementation "wxTreeMultiCtrl.h" -#endif - -// For compilers that support precompilation, includes "wx/wx.h". -#include "wx/wxprec.h" -#include "wx/treebase.h" - -#ifdef __BORLANDC__ - #pragma hdrstop -#endif - -#include "wx/arrimpl.cpp" - -#include "wx/treemultictrl/wxTreeMultiCtrl.h" -#include "wx/treemultictrl/wxTreeMultiEvent.h" -#include "tmcimages.h" - - - -//---------------------------------------------------------------------------- -// wxTreeMultiItem -//---------------------------------------------------------------------------- - -WX_DEFINE_OBJARRAY(wxArrayTreeMultiItem); - -//---------------------------------------------------------------------------- -// wxTreeMultiCtrl -//---------------------------------------------------------------------------- - -IMPLEMENT_DYNAMIC_CLASS(wxTreeMultiCtrl, wxScrolledWindow) - -// WDR: event table for wxTreeMultiCtrl -BEGIN_EVENT_TABLE(wxTreeMultiCtrl, wxScrolledWindow) - EVT_LEFT_DOWN (wxTreeMultiCtrl::OnMouseClick) - EVT_LEFT_DCLICK(wxTreeMultiCtrl::OnMouseClick) - EVT_RIGHT_DOWN (wxTreeMultiCtrl::OnRightMouseClick) - EVT_PAINT(wxTreeMultiCtrl::OnPaint) - EVT_SIZE(wxTreeMultiCtrl::OnSize) -// EVT_KEY_UP(wxTreeMultiCtrl::OnKey) -END_EVENT_TABLE() - -bool wxTreeMultiCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, - const wxSize& size, long style, const wxValidator & WXUNUSED(validator), - const wxString& name ) -{ - wxScrolledWindow::Create( parent, id, pos, size, style | wxTAB_TRAVERSAL, name); - - _create_called = true; - - // do the init - Init(); - - return TRUE; -} - -void wxTreeMultiCtrl::Init() -{ - _root.Clear(); - - _expandBmp = 0; - _collBmp = 0; - -#if(CHECKBOXVIEW) - _checkBmp = 0; - _uncheckBmp = 0; - _tristateBmp = 0; - - _checkHeight = 11; - _checkWidth = 11; - - _checkboxView = false; -#endif - - _gutterWidth = WXTMC_GUTTER_DEFAULT; - _iconWidth = 11; - _iconHeight = 11; - _maxHeight = 1;; - _iconDeltaY = 2; - _spacingY = WXTMC_YSPACING_DEFAULT; - _captionHeight = 13; - - // create two bitmap nodes for drawing - - _expandBmp = new wxBitmap(expand_xpm); - _collBmp = new wxBitmap(collapse_xpm); - - // calculate average font height for bitmap centering - - _iconWidth = _expandBmp->GetWidth(); - _iconHeight = _expandBmp->GetHeight(); - -#if(CHECKBOXVIEW) - // create bitmaps for checkboxes - _checkBmp = new wxBitmap(checked_icon); - _uncheckBmp = new wxBitmap(unchecked_icon); - _tristateBmp = new wxBitmap(tristate_icon); - - // adjust the height if the checkboxes are higher - // so that everything is alligned properly - _checkHeight = _checkBmp->GetHeight(); - _checkWidth = _checkBmp->GetWidth(); -#endif - - // remember the highest of the two bitmaps so there is - // always enough room - _maxHeight = _iconHeight; - -#if(CHECKBOXVIEW) - if(_maxHeight < _checkHeight) - _maxHeight = _checkHeight; -#endif - - // set standard highlighting brush - this->m_HilightBrush = new wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT),wxSOLID); - - // set standard DC font - _captionFont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); - - // adjust bitmap icon y position so they are centered - AdjustIconsDeltaY(); - - // set virtual size to this window size - if (_create_called) { - wxSize wndsize = GetSize(); - SetVirtualSize(wndsize.GetWidth(), wndsize.GetWidth()); - } -} - -void wxTreeMultiCtrl::SetCaptionFont(const wxFont &font) -{ - _captionFont = font; - - // adjust the icons so that they are in the middle - AdjustIconsDeltaY(); - - RedrawFromNode(0); -}; - -void wxTreeMultiCtrl::AdjustIconsDeltaY() -{ - int x = 0, y = 0; - - if(_captionFont.Ok()) - GetTextExtent(wxT("jG"), &x, &y, 0, 0, &_captionFont); - _captionHeight = y; - - if(_maxHeight < _captionHeight) - _maxHeight = _captionHeight; - - // determine the center pos for the [+] - _iconDeltaY = abs(_maxHeight - _iconHeight) / 2 + 1; - if(_iconDeltaY < 1) - _iconDeltaY = 1; - -#if(CHECKBOXVIEW) - // determine the center pos for the checkbox - _checkDeltaY = abs(_maxHeight - _checkHeight) / 2 + 1; - if(_checkDeltaY < 1) - _checkDeltaY = 1; -#endif -} - -wxTreeMultiCtrl::~wxTreeMultiCtrl() -{ - // delete the bitmap resources - delete _expandBmp; - delete _collBmp; - -#if(CHECKBOXVIEW) - delete _checkBmp; - delete _uncheckBmp; - delete _tristateBmp; -#endif -} - -wxTreeMultiItem wxTreeMultiCtrl::AddRoot(const wxString &caption, const wxString &name) -{ - wxTreeMultiItem result((TreeMultiItemBase *)&_root); - result = AppendNode(result, caption, name); - - return result; -} - -wxTreeMultiItem wxTreeMultiCtrl::AppendWindow(const wxTreeMultiItem &ParentItem, wxWindow *window, const wxString &name, const wxTreeMultiWindowInfo &info, int flags) -{ - // add window only if the parent item is valid and... - wxCHECK(ParentItem.IsOk(), wxTreeMultiItem(0)); - - TreeMultiItemNode* parent = ParentItem.GetItem()->IsTreeMultiItemNode(); // also roots are nodes - - // ... is a node - wxCHECK(parent != NULL, wxTreeMultiItem(0)); - - // now, append node to the tree control: - wxTreeMultiItem NewWindowItem(this->InsertWindow(parent,wx_static_cast(size_t,parent->GetNodeCount()),window,name,info,flags)); - // redraw the stucture: - this->RedrawFromNode(parent); - // return the new window - return NewWindowItem; -} - -wxTreeMultiItem wxTreeMultiCtrl::InsertWindow(wxTreeMultiItem const& ParentItem, size_t Position, wxWindow *window, wxString const& name, wxTreeMultiWindowInfo const& info, int flags) -{ - // add window only if the parent item is valid and... - wxCHECK(ParentItem.IsOk(), wxTreeMultiItem(0)); - - TreeMultiItemNode* parent = ParentItem.GetItem()->IsTreeMultiItemNode(); // also roots are nodes - - // ... is a node - wxCHECK(parent != NULL, wxTreeMultiItem(0)); - - // now, append node to the tree control: - wxTreeMultiItem NewWindowItem(this->InsertWindow(parent,Position,window,name,info,flags)); - // redraw the stucture: - this->RedrawFromNode(parent); - // return the new window - return NewWindowItem; -} /* wxTreeMultiCtrl::InsertWindow(wxTreeMultiItem const&, size_t, wxWindow*, wxString const&, wxTreeMultiWindowInfo const&, int) */ - -wxTreeMultiItem wxTreeMultiCtrl::PrependWindow(wxTreeMultiItem const& ParentItem, wxWindow *window, const wxString &name, wxTreeMultiWindowInfo const& info, int flags) -{ - // add window only if the parent item is valid and... - wxCHECK(ParentItem.IsOk(), wxTreeMultiItem(0)); - - TreeMultiItemNode* parent = ParentItem.GetItem()->IsTreeMultiItemNode(); // also roots are nodes - - // ... is a node - wxCHECK(parent != NULL, wxTreeMultiItem(0)); - - // now, append node to the tree control: - wxTreeMultiItem NewWindowItem(this->InsertWindow(parent,0,window,name,info,flags)); - // redraw the stucture: - this->RedrawFromNode(parent); - // return the new window - return NewWindowItem; -} /* wxTreeMultiCtrl::PrependWindow(wxTreeMultiItem const&, wxWindow*, const wxString &, wxTreeMultiWindowInfo const&, int) */ - -wxTreeMultiItem wxTreeMultiCtrl::AppendNode(wxTreeMultiItem const& ParentItem, const wxString &caption, const wxString &name) -{ - // add window only if the parent item is valid and... - wxCHECK(ParentItem.IsOk(), wxTreeMultiItem(0)); - - TreeMultiItemNode* parent = ParentItem.GetItem()->IsTreeMultiItemNode(); // also roots are nodes - - // ... is a node - wxCHECK(parent != NULL, wxTreeMultiItem(0)); - - // now, append node to the tree control: - wxTreeMultiItem NewNodeItem(this->InsertNode(parent,wx_static_cast(size_t,parent->GetNodeCount()),caption,name)); - // redraw the structure: - this->RedrawFromNode(parent); - // return the new node: - return NewNodeItem; -} /* wxTreeMultiCtrl::AppendNode(wxTreeMultiItem const&, const wxString &, const wxString&) */ - -wxTreeMultiItem wxTreeMultiCtrl::InsertNode(wxTreeMultiItem const& ParentItem, size_t Position, wxString const& caption, wxString const& name) -{ - // add window only if the parent item is valid and... - wxCHECK(ParentItem.IsOk(), wxTreeMultiItem(0)); - - TreeMultiItemNode* parent = ParentItem.GetItem()->IsTreeMultiItemNode(); // also roots are nodes - - // ... is a node - wxCHECK(parent != NULL, wxTreeMultiItem(0)); - - // now, append node to the tree control: - wxTreeMultiItem NewNodeItem(this->InsertNode(parent,Position,caption,name)); - // redraw the structure: - this->RedrawFromNode(parent); - // return the new node: - return NewNodeItem; -} /* wxTreeMultiCtrl::InsertNode(wxTreeMultiItem const&, size_t, wxString const&, wxString const&) */ - -wxTreeMultiItem wxTreeMultiCtrl::PrependNode(wxTreeMultiItem const& ParentItem, wxString const& caption, wxString const& name) -{ - // add window only if the parent item is valid and... - wxCHECK(ParentItem.IsOk(), wxTreeMultiItem(0)); - - TreeMultiItemNode* parent = ParentItem.GetItem()->IsTreeMultiItemNode(); // also roots are nodes - - // ... is a node - wxCHECK(parent != NULL, wxTreeMultiItem(0)); - - // now, append node to the tree control: - wxTreeMultiItem NewNodeItem(this->InsertNode(parent,0,caption,name)); - // redraw the structure: - this->RedrawFromNode(parent); - // return the new node: - return NewNodeItem; -} /* wxTreeMultiCtrl::PrependNode(wxTreeMultiItem const&, wxString const&, wxString const&) */ - -bool wxTreeMultiCtrl::Delete(wxTreeMultiItem &item) -{ - bool redraw = true; - wxCHECK(item.IsOk(), false); - - wxTreeMultiItem nullItem(0); - - - // if item has been selected, remove it from the selected list: - size_t ItemIndex(this->GetSelectedItemIndex(item)); - - if (ItemIndex != this->GetSelectedItemCount()) - this->m_SelectedItems.RemoveAt(ItemIndex); - - // get parent, to delete item from - TreeMultiItemNode *p = item.GetItem()->GetParent(); - - // first check if it was visible, if so from the parent off - // it needs redrawing - redraw = item.GetItem()->IsVisible(); - if(p) - p->DeleteNode(item.GetItem()); - else - _root.DeleteNode(item.GetItem()); - - item = nullItem; - - // do redraw when node was visible - if(redraw) - RedrawFromNode(p); - - return true; -} - -void wxTreeMultiCtrl::DeleteChildren(const wxTreeMultiItem &item) -{ - if(item.IsNodeItem()) - { - TreeMultiItemNode *n = (TreeMultiItemNode *)item.GetItem(); - - // remove all children from the selected item list: - if (n->GetNodeCount() > 0) - { - // variable definitions and initializations: - int Cookie; - wxTreeMultiItem FirstItemIterator(this->GetFirstChild(item,Cookie)), LastItemIterator(this->GetLastChild(item)); - - for (;;) - { - size_t ItemIndex(this->GetSelectedItemIndex(item)); // variable definition and initialization - - if (ItemIndex != this->GetSelectedItemCount()) - this->m_SelectedItems.RemoveAt(ItemIndex); - if (FirstItemIterator == LastItemIterator) - break; // all children checked - else - FirstItemIterator = this->GetNext(FirstItemIterator); - } /* for */ - } /* if */ - // delete children: - n->Clear(); - // redraw: - RedrawFromNode(n); - } -} - -void wxTreeMultiCtrl::Expand(const wxTreeMultiItem &item, bool recursive) -{ - if(item.IsOk()) - { - TreeMultiItemNode *n = item.GetItem()->IsTreeMultiItemNode(); - if(!n) - n = item.GetItem()->GetParent(); - DoFold(n, true, recursive); - RedrawFromNode(item.GetItem()->IsTreeMultiItemNode()); - } -} - -void wxTreeMultiCtrl::Collapse(const wxTreeMultiItem &item, bool recursive) -{ - if(item.IsOk()) - { - TreeMultiItemNode *n = item.GetItem()->IsTreeMultiItemNode(); - if(!n) - n = item.GetItem()->GetParent(); - DoFold(n, false, recursive); - RedrawFromNode(item.GetItem()->IsTreeMultiItemNode()); - } -} - - -void wxTreeMultiCtrl::ExpandNodes(bool recursive) -{ - // go through all children and call DoFold recursively - for(int i = 0; i < _root.GetNodeCount(); i++) - DoFold(_root.GetNode(i), true, recursive); - RedrawFromNode(0); -} - -void wxTreeMultiCtrl::CollapseNodes(bool recursive) -{ - // go through all children and call DoFold recursively - for(int i = 0; i < _root.GetNodeCount(); i++) - DoFold(_root.GetNode(i), false, recursive); - RedrawFromNode(0); -} - -void wxTreeMultiCtrl::CollapseAndReset(const wxTreeMultiItem &item) -{ - if(item.IsNodeItem()) - { - TreeMultiItemNode *n = (TreeMultiItemNode *)item.GetItem(); - - // delete all kids - n->Clear(); - Collapse(item, false); - } -} - -// Selection manipulation -wxTreeMultiItem wxTreeMultiCtrl::GetFirstSelectedItem(void) const -{ - if (this->GetSelectedItemCount() > 0) - return this->m_SelectedItems[0]; - else - return wxTreeMultiItem(); -} /* wxTreeMultiCtrl::GetFirstSelectedItem(void) const */ - -wxTreeMultiItem wxTreeMultiCtrl::GetLastSelectedItem(void) const -{ - if (this->GetSelectedItemCount() > 0) - return this->m_SelectedItems[this->GetSelectedItemCount()-1]; - else - return wxTreeMultiItem(); -} /* wxTreeMultiCtrl::GetLastSelectedItem(void) const */ - -wxTreeMultiItem wxTreeMultiCtrl::GetSelectedItem(size_t Index) const -{ - if (Index < this->GetSelectedItemCount()) - return this->m_SelectedItems[Index]; - else - return wxTreeMultiItem(); -} /* wxTreeMultiCtrl::GetSelectedItem(size_t Index) const */ - -size_t wxTreeMultiCtrl::GetSelectedItemIndex(wxTreeMultiItem const& Item) const -{ - // attention: the function wxArray::Index() can NOT be used in a save manner as it only checks the address of an item - // element but it is not guaranteed that Item may not be a copy of the originally inserted item - const size_t NoOfSelectedItems = this->GetSelectedItemCount(); - - size_t Index(0); - - - while ((Index < NoOfSelectedItems) && (this->m_SelectedItems[Index] != Item)) - ++Index; - return Index; -} /* wxTreeMultiCtrl::GetSelectedItemIndex(wxTreeMultiItem const&) const */ - -void wxTreeMultiCtrl::SelectItem(wxTreeMultiItem const& Item, bool UnselectOthers, bool ExpandSelection) -{ - TreeMultiItemNode* NodePtr(Item.GetItem()->IsTreeMultiItemNode()); - - - // only nodes can be selected and they can only be selected if they are not already selected: - if ((NodePtr == NULL) || NodePtr->IsSelected()) - return; - - // inform that we are about to change: - wxTreeMultiEvent Event(wxEVT_COMMAND_TREE_MULTI_SEL_CHANGING,Item); // variable definition and initialization - - if (this->m_SelectedItems.GetCount() > 0) // the last item in the array is always the latest inserted item - Event.SetOldItem(this->m_SelectedItems.Last()); - Event.SetEventObject(this); - if (this->GetEventHandler()->ProcessEvent(Event) && !(Event.IsAllowed())) - return; // vetoed - - // make sure that the to be selected item can be seen: - this->Include(Item); - - // variable definition and initialization: - wxTreeMultiItem ExcludedParent(this->GetExcludedParent(Item)); - - while (ExcludedParent.IsOk()) - { - this->Include(ExcludedParent); - ExcludedParent = this->GetExcludedParent(Item); - } /* while */ - - // unselect items if necessary: - if (UnselectOthers) - this->UnselectAll(); - // expand selection if necessary: - if (ExpandSelection) - { - // variable definition: - wxTreeMultiItem FirstItemIterator, LastItemIterator; - wxTreeMultiItem LastSelectedItem; - - // determine the last selected item or the first item in case nothing has been selected before: - if (this->m_SelectedItems.GetCount() > 0) - LastSelectedItem = this->m_SelectedItems.Last(); - else - LastSelectedItem = this->GetFirstRoot(); - // determine the item from which to start and the one with which to end the selection: - if (Item.GetItem()->GetY() > LastSelectedItem.GetItem()->GetY()) - { - FirstItemIterator = LastSelectedItem; - LastItemIterator = Item; - } /* if */ - else - { - FirstItemIterator = Item; - LastItemIterator = LastSelectedItem; - } /* if */ - // select all items that are a node and are placed between the two limiting iterators (included the limits): - for (;;) - { - if (!(FirstItemIterator.IsSelected()) && FirstItemIterator.IsNodeItem()) - { - FirstItemIterator.GetItem()->Select(); - this->m_SelectedItems.Add(FirstItemIterator); - this->RefreshRect(wxRect(FirstItemIterator.GetItem()->GetX(), FirstItemIterator.GetItem()->GetY(), - FirstItemIterator.GetItem()->GetWidth(),FirstItemIterator.GetItem()->GetHeight())); - } /* if */ - if (FirstItemIterator == LastItemIterator) - break; // done - // continue iterating: - FirstItemIterator = this->GetNext(FirstItemIterator); - } /* for */ - } /* if */ - else // select passed item only - { - NodePtr->Select(); - this->m_SelectedItems.Add(NodePtr); - this->RefreshRect(wxRect(NodePtr->GetX(),NodePtr->GetY(),NodePtr->GetWidth(),NodePtr->GetHeight())); - } /* if */ - - // inform that we have selected the item: - Event.SetEventType(wxEVT_COMMAND_TREE_MULTI_SEL_CHANGED); - this->GetEventHandler()->ProcessEvent(Event); -} /* wxTreeMultiCtrl::SelectItem(wxTreeMultiItem const&, bool, bool) */ - -void wxTreeMultiCtrl::UnselectAll(void) -{ - const size_t NoOfSelectedItems = this->m_SelectedItems.GetCount(); - - - for (size_t i=0; iRefreshRect(wxRect(this->m_SelectedItems[i].GetItem()->GetX(), this->m_SelectedItems[i].GetItem()->GetY(), - this->m_SelectedItems[i].GetItem()->GetWidth(),this->m_SelectedItems[i].GetItem()->GetHeight())); - this->m_SelectedItems[i].GetItem()->Unselect(); - } /* for */ - this->m_SelectedItems.Clear(); -} /* wxTreeMultiCtrl::UnselectAll(void) */ - -void wxTreeMultiCtrl::Unselect(wxTreeMultiItem const& Item) -{ - size_t ItemIndex(this->GetSelectedItemIndex(Item)); - - - if (ItemIndex != this->GetSelectedItemCount()) - { - Item.GetItem()->Unselect(); - this->m_SelectedItems.RemoveAt(ItemIndex); - this->RefreshRect(wxRect(Item.GetItem()->GetX(),Item.GetItem()->GetY(),Item.GetItem()->GetWidth(),Item.GetItem()->GetHeight())); - } /* if */ -} /* wxTreeMultiCtrl::Unselect(wxTreeMultiItem const&) */ - -void wxTreeMultiCtrl::DoFold(TreeMultiItemBase *item, bool expand, bool recursive) -{ - - // go through all node objects on this level, and expand or - // collapse them - - if(item == 0) - return; - - // if this is a node, use it to go through all the subnodes (if needed) - // if not, then just exit. - - TreeMultiItemNode *node = item->IsTreeMultiItemNode(); - if(node) - { - node->Fold(expand); - - // go recursive - if(recursive) - { - TreeMultiItemNode *p; - for(int i = 0; i < node->GetNodeCount(); i++) - { - // get node, and if a real node, then call fold - p = node->GetNode(i)->IsTreeMultiItemNode(); - if(p) - p->Fold(expand); - - // go recursive for every node - DoFold(p, expand, recursive); - } - } - } -} - -void wxTreeMultiCtrl::Exclude(const wxTreeMultiItem &item) -{ - wxCHECK2(item.IsOk(), return); - - // exclude the item, and refresh - // if already excluded, skip - - if(!item.GetItem()->IsExcluded()) - { - item.GetItem()->SetExcluded(true); - RedrawFromParentNode(item.GetItem()); - } -} - -void wxTreeMultiCtrl::Include(const wxTreeMultiItem &item) -{ - wxCHECK2(item.IsOk(), return); - - // include the item, and refresh. If not - // excluded, do nothing - - if(item.GetItem()->IsExcluded()) - { - item.GetItem()->SetExcluded(false); - RedrawFromParentNode(item.GetItem()); - } -} - -wxTreeMultiItem wxTreeMultiCtrl::GetExcludedParent(const wxTreeMultiItem &item) -{ - wxCHECK(item.IsOk(), wxTreeMultiItem(0)); - - // go find the parent (including this one) that - // can be the excluded one - - TreeMultiItemNode *n = item.GetItem()->IsTreeMultiItemNode(); - if(n && n->IsExcluded()) - return wxTreeMultiItem(n); - - n = item.GetItem()->GetParent(); - while(n) - { - if(n->IsExcluded()) - return wxTreeMultiItem(n); - else - n = n->GetParent(); - } - - return wxTreeMultiItem(0); -} - -void wxTreeMultiCtrl::OnSize(wxSizeEvent &WXUNUSED(event)) -{ - RecalculateSpanSizes(); -} - -void wxTreeMultiCtrl::OnPaint(wxPaintEvent& WXUNUSED(event) ) -{ - wxPaintDC dc(this); - - PrepareDC(dc); - - // go recursive and draw the whole visible tree. - dc.SetFont(_captionFont); - for(int i = 0; i < _root.GetNodeCount(); i++) - DrawNode(_root.GetNode(i), dc); -} - -void wxTreeMultiCtrl::DrawNode(TreeMultiItemBase *b, wxDC &dc) -{ - // go through this item .. if it is a node, draw - // the caption, else reposition the window. - - if(!b) - return; - - // forget it if this node is not visible - if(b->IsVisible()) - { - int bmpOffsetX = b->GetX() - (_gutterWidth + _iconWidth); - -#if(CHECKBOXVIEW) - // now draw the checkbox if there is any, in the proper state - if(b->GetCheckbox()) - { - DrawCheckbox(b, dc); - - // adjust the bmpOffset because we also have a checkbox - bmpOffsetX -= _checkWidth; - } -#endif - - if(b->IsTreeMultiItemNode()) - { - // draw the node icon and the caption - TreeMultiItemNode *n = (TreeMultiItemNode *)b; - - // set background of caption item - if (n->IsSelected()) - { - dc.SetBrush(*(this->m_HilightBrush)); - dc.SetPen(wxPen(this->m_HilightBrush->GetColour(),1,wxSOLID)); - } /* if */ - else - { - dc.SetBrush(wxBrush(*wxWHITE,wxSOLID)); - dc.SetPen(wxPen(*wxWHITE,1,wxSOLID)); - } /* if */ - dc.DrawRectangle(n->GetX(),n->GetY(),n->GetWidth(),n->GetHeight()); - // draw caption - dc.DrawText(n->GetCaption(), n->GetX(), n->GetY()); - - // draw the bitmap for the state - if(n->IsExpanded()) - dc.DrawBitmap(*_expandBmp, bmpOffsetX, n->GetY() + _iconDeltaY, true); - else - dc.DrawBitmap(*_collBmp, bmpOffsetX, n->GetY() + _iconDeltaY, true); - - // now go through all the subnodes - for(int i = 0; i < n->GetNodeCount(); i++) - DrawNode(n->GetNode(i), dc); - - } - } -} - -#if(CHECKBOXVIEW) - -void wxTreeMultiCtrl::DrawCheckbox(TreeMultiItemBase *b, wxDC &dc, bool convertScrolled) -{ - wxCHECK2(b, return); - - wxBitmap *bmp; - int bmpOffsetX = b->GetX() - (_gutterWidth + _iconWidth); - - switch(b->GetCheckboxState()) - { - case 0: - bmp = _uncheckBmp; - break; - case 1: - bmp = _checkBmp; - break; - default: - bmp = _tristateBmp; - break; - } - - int x, xx, y, yy; - - if(b->IsTreeMultiItemWindow()) - { - xx = x = bmpOffsetX - ((TreeMultiItemWindow *)b)->GetFrontSpacing() + _checkWidth; - yy = y = b->GetY() + _checkDeltaY; - } - else - { - xx = x = bmpOffsetX; - yy = y = b->GetY() + _checkDeltaY; - } - - if(convertScrolled) - CalcScrolledPosition(x, y, &xx, &yy); - - dc.DrawBitmap(*bmp, xx, yy, true); -} - -#endif // #if(CHECKBOXVIEW) - -void wxTreeMultiCtrl::OnKey(wxKeyEvent &event) -{ - // check if we need to traverse to upper or lower - // control in the list - if(event.GetKeyCode() == WXK_TAB) - { - wxTreeMultiItem item = GetFocus(); - if(item.IsOk()) - { - // traverse down direction - if(!event.ShiftDown()) - item = FindNextVisibleWindowItem(item.GetItem()); - //else // traverse in up direction - // item = FindPreviousVisibleWindowItem(item); - - if(item.IsOk()) - { - TreeMultiItemWindow *w = item.GetItem()->IsTreeMultiItemWindow(); - if(w) - { - wxWindow *wnd = w->GetWindow(); - wnd->SetFocus(); - } - } - } - } - else - event.Skip(); -} - -void wxTreeMultiCtrl::OnMouseClick( wxMouseEvent &event ) -{ - // react on double click and left mouse down - if(event.LeftDown() || event.LeftDClick()) - { - // get translation point - wxPoint pt( event.GetPosition() ); - - int x = 0, y = 0; - CalcUnscrolledPosition( pt.x, pt.y, &x, &y ); - - // go check if we clicked a treenode - int flags; - wxPoint p(x,y); - wxTreeMultiItem id = HitTest(p, flags); - -#if(CHECKBOXVIEW) - if(flags == wxTMC_HITTEST_CHECKBOX) - { - // toggle the checkbox, and redraw - if(id.IsOk()) - { - TreeMultiItemBase *b = id.GetItem(); - b->SetCheckboxState((b->GetCheckboxState()+1) & 0x1); - - TreeMultiItemWindow *w = b->IsTreeMultiItemWindow(); - if(w) - { - // try to force a focus on the window. This could - // be extended by searching for the first edit control - // class but for now, just a focus is tried. - w->GetWindow()->Enable(b->GetCheckboxState() == 1); - w->GetWindow()->SetFocus(); - - // draw the checkbox in the state needed - wxClientDC dc(this); - DrawCheckbox(b, dc, true); - - // TODO: determine if the upper parents should be - // tristated or not - - ScanTristateCheckstates(b); - - } - else if(b->IsTreeMultiItemNode()) - { - // descend to all the children and set the state of the parent - SetRecursiveCheckState((TreeMultiItemNode *)b, b->GetCheckboxState() == 1); - RedrawFromNode((TreeMultiItemNode *)b); - } - } - } - else -#endif // #if(CHECKBOXVIEW) - { - // react on left mouse button, to fold and on - // right for caption doubleclick - int area = -1; - -// adjust behaviour for Linux (single click = always fold) -#ifndef LINUX - if(event.LeftDClick()) - area = wxTMC_HITTEST_CAPTION; - else - area = wxTMC_HITTEST_GUTTER; -#else - area = flags; -#endif - -// Linux (single or double click -> always fold - if (id.IsOk()) - { -#ifdef LINUX - // we have a valid item, if it is a node, then fold - TreeMultiItemNode *n = id.GetItem()->IsTreeMultiItemNode(); - if(n) - { - this->SelectItem(id); - Fold(n, !n->IsExpanded()); - } /* if */ -#else - if (event.LeftDown()) - if (flags == wxTMC_HITTEST_GUTTER) - { - TreeMultiItemNode *n = id.GetItem()->IsTreeMultiItemNode(); // for some reasons also windows may have set the flag - - if (n != NULL) - Fold(n, !n->IsExpanded()); - } /* if */ - else if (flags == wxTMC_HITTEST_CAPTION) - { - TreeMultiItemNode *n = id.GetItem()->IsTreeMultiItemNode(); // for some reasons also windows may have set the flag - - if (n != NULL) - { - this->SelectItem(id); - this->RedrawFromNode(n); - } /* if */ - } /* if */ -#endif - } /* if */ - else - this->UnselectAll(); - } - } -} - -void wxTreeMultiCtrl::OnRightMouseClick(wxMouseEvent& Event) -{ - if (Event.RightDown()) - if (Event.Dragging()) - this->UnselectAll(); - else - { - // variable definitions: - int Flags; - wxPoint Point; - - // translate mouse coordinates: - CalcUnscrolledPosition(Event.GetPosition().x,Event.GetPosition().y,&(Point.x),&(Point.y)); - // check if the mouse is above the caption of an item: - wxTreeMultiItem Item(this->HitTest(Point,Flags)); // variable definition and initialization - - if (Item.IsOk() && (Flags == wxTMC_HITTEST_CAPTION)) - { - this->SelectItem(Item); - this->RedrawFromNode(Item.GetItem()->IsTreeMultiItemNode()); - Event.Skip(); // window will convert right mouse click to a context menu event or proceed with - // a right mouse click event if the context menu event cannot be processed - } /* if */ - else - this->UnselectAll(); - } /* if */ - else - this->UnselectAll(); -} /* wxTreeMultiCtrl::OnRightMouseClick(wxMouseEvent&) */ - -wxTreeMultiItem wxTreeMultiCtrl::HitTest(wxPoint const& pt, int &flags) -{ - // scan all nodes to see which one matches - TreeMultiItemBase *b = 0; - for(int i = 0; i < _root.GetNodeCount() && !b; i++) - b = FindNodeByPoint(_root.GetNode(i), pt, flags); - - if(!b) - { - // none found, reset - flags = 0; - return wxTreeMultiItem(0); - } - - // return an item - return wxTreeMultiItem(b); -} - -TreeMultiItemBase *wxTreeMultiCtrl::FindNodeByPoint(TreeMultiItemBase *b, wxPoint const& pt, int &area) -{ - wxCHECK(b, 0); - - // if this layer is not visible, return with nothing. - if(!b->IsVisible()) - return 0; - - area = 0; - - // now see if our y is matching the mouse - if(pt.y >= b->GetY() && pt.y < (b->GetY() + b->GetHeight())) - { -#if(CHECKBOXVIEW) - // if we are checkboxed, calculate the checkbox position - if(b->GetCheckbox()) - { - int extraSpacing = 0, extraWidth = 0; - - // now for a windows item, this is minus the gutter. For a normal node it is X minus checkbox - if(b->IsTreeMultiItemWindow()) - { - extraWidth = _checkWidth; - extraSpacing = ((TreeMultiItemWindow *)b)->GetFrontSpacing(); - } - else - extraSpacing = 4; - - if(pt.x > (b->GetX() - extraSpacing - _checkWidth) && pt.x < (b->GetX() - extraSpacing + extraWidth)) - { - area = wxTMC_HITTEST_CHECKBOX; - return b; - } - } -#endif - - // allrighty we have something, now where and what is it (look with x) - if(pt.x < b->GetX()) - area = wxTMC_HITTEST_GUTTER; - - /** \todo Match only the real part of the caption, window (we assume x > GetX() which is the rest) - HOWEVER the window probably doesn't propagate the click event back to the parent, so we might - leave it like this so the use can click behind a window so it will be selected. - */ - else - { - // inside area, return proper flag - if(b->IsTreeMultiItemNode()) - area = wxTMC_HITTEST_CAPTION; - else - area = wxTMC_HITTEST_WINDOW; - } - - return b; - } - else - { - // not found, let's try our children if we have some - TreeMultiItemNode *n = b->IsTreeMultiItemNode(); - if(n) - { - TreeMultiItemBase *bb = 0; - for(int i = 0; i < n->GetNodeCount() && !bb; i++) - bb = FindNodeByPoint(n->GetNode(i), pt, area); - - // keep returning result to caller - return bb; - } - } - - return 0; -} - -wxTreeMultiItem wxTreeMultiCtrl::GetFocus() -{ - wxWindow *wnd = wxWindow::FindFocus(); - - // now find window that holds this item. if not - // visible it cannot have focus (should not have) - - wxTreeMultiItem item = FindWindowNode(wnd); - if(item.IsOk() && item.GetItem()->IsVisible()) - return item; - - return wxTreeMultiItem(0); -} - -#if(CHECKBOXVIEW) - -void wxTreeMultiCtrl::SetRecursiveCheckState(TreeMultiItemNode *n, bool check) -{ - int state = 0; - if(check) - state++; - - // go check all kids on this level - for(int i = 0; i < n->GetNodeCount(); i++) - { - // check all the nodes, and go deeper - n->GetNode(i)->SetCheckboxState(state); - if(n->GetNode(i)->IsTreeMultiItemNode()) - SetRecursiveCheckState((TreeMultiItemNode *)n->GetNode(i), check); - } -} - -void wxTreeMultiCtrl::ScanTristateCheckstates(TreeMultiItemBase *b) -{ - // check from the parent on, all node entries and see if they are - // checked or cleared or scattered - TreeMultiItemNode *p = b->GetParent(); - - if(p && p->GetCheckbox()) - { - bool foundcheck = false, foundclear = false; - for(size_t i = 0; i < (size_t)p->GetNodeCount(); ++i) - { - // only evaluate when checkboxed - if(p->GetNode(i)->IsTreeMultiItemWindow() && p->GetNode(i)->GetCheckbox()) - { - // record instance of a cleared checkbox - if(!p->GetNode(i)->GetCheckboxState()) - foundclear = true; - // record instance of checked checkbox - if(p->GetNode(i)->GetCheckboxState() == 1) - foundcheck = true; - } - } - - // if we have both check and clear, go tristate - // if all clear, clear parent and if all set, then set parent - if(foundclear && !foundcheck) - p->SetCheckboxState(0); - else if(!foundclear && foundcheck) - p->SetCheckboxState(1); - else if(foundclear && foundcheck) - p->SetCheckboxState(2); - - //wxClientDC dc; - //DrawCheckbox(p, dc, false); - RedrawFromNode(p); - } -} - -#endif // #if(CHECKBOXVIEW) - -wxTreeMultiItem wxTreeMultiCtrl::InsertNode(TreeMultiItemNode* ParentPtr, size_t Position, wxString const& Caption, wxString const& Name) -{ - int extX, extY; - - TreeMultiItemNode* NodePtr(new TreeMultiItemNode(ParentPtr,Caption,Name)); // generate new node pointer - - - // continue with initializing the new node: -#if(CHECKBOXVIEW) - // if checkbox view is desired, tag this item as a checkbox - // and set the state as 'false' - NodePtr->SetCheckbox(_checkboxView); - NodePtr->SetCheckboxState(0); -#endif - // calculate the height and width - this->GetTextExtent(Caption,&extX,&extY,0,0,&(this->_captionFont)); - NodePtr->SetHeight(extY); - NodePtr->SetWidth(extX); - // finally, insert node: - if (Position < (size_t)ParentPtr->GetNodeCount()) - ParentPtr->InsertNode(NodePtr,Position); - else - ParentPtr->AddNode(NodePtr); - // return the newly created node: - return wxTreeMultiItem(NodePtr); -} /* wxTreeMultiCtrl::InsertNode(TreeMultiItemNode*, size_t, wxString const&, wxString const&) */ - -wxTreeMultiItem wxTreeMultiCtrl::InsertWindow(TreeMultiItemNode* ParentPtr, size_t Position, wxWindow* WindowPtr, wxString const& Name, wxTreeMultiWindowInfo const& Info, int Flags) -{ - int WindowFlags; - - TreeMultiItemWindow* NewWindowPtr = new TreeMultiItemWindow(ParentPtr,Name); // generate new window pointer - - - // get flags from passed variable "Flags"; in case this variable does not contain any flags use the window's information flags: - if (Flags != 0) - WindowFlags = Flags; - else - WindowFlags = Info.GetFlags(); - - // continue with initializing the new window: -#if(CHECKBOXVIEW) - // if checkbox view is desired, tag this item as a checkbox - // and set the state as 'false' - NewWindowPtr->SetCheckbox(_checkboxView); -#endif - // if style wants us to change background, set it to our background - if (WindowFlags & wxTMC_BG_ADJUST_ALL) - { - // go through all children of this window, and set the - // background of it (recursively) - this->SetWindowBackgroundColour(WindowPtr,this->GetBackgroundColour(),WindowFlags); - } /* if */ - - // set the spacing: - NewWindowPtr->SetTopSpacing(Info.GetTopSpacing()); -#if(CHECKBOXVIEW) - // make sure that the checkboxes are at least indented enough - if (this->_checkboxView) - NewWindowPtr->SetFrontSpacing(Info.GetFrontSpacing() + this->_checkWidth); - else -#endif - NewWindowPtr->SetFrontSpacing(Info.GetFrontSpacing()); - // assign finally the window: - NewWindowPtr->AssignWindow(WindowPtr); - -#if(CHECKBOXVIEW) - // set the checkbox state after the window is assigned - NewWindowPtr->SetCheckboxState(Info.GetDefaultCheckState()); -#endif - - // if the window is not visible, set hide flag - this->ShowTreeMultiWindow(NewWindowPtr,NewWindowPtr->IsVisible()); - - // finally, insert the newly constructed window: - if (Position < (size_t)ParentPtr->GetNodeCount()) - ParentPtr->InsertNode(NewWindowPtr,Position); - else - ParentPtr->AddNode(NewWindowPtr); - // return the newly created window: - return wxTreeMultiItem(NewWindowPtr); -} /* wxTreeMultiCtrl::InsertWindow(TreeMultiItemNode*, size_t, wxWindow*, wxString const&, wxTreeMultiWindowInfo const&, int) */ - -void wxTreeMultiCtrl::RedrawFromParentNode(TreeMultiItemBase *n) -{ - TreeMultiItemNode *p = 0; - if(n) - p = n->GetParent(); - - RedrawFromNode(p); -} - -void wxTreeMultiCtrl::RedrawFromNode(TreeMultiItemNode *n) -{ - static int recalcMutex = 0; - bool visible = true; - - if(recalcMutex > 0) - return; - - recalcMutex ++; - - // when node is not visible or excluded - // then don't redraw. - - if(n) - visible = n->IsVisible(); - - if(visible) - { - int h, h1,w, w1; - GetVirtualSize(&w, &h); - - UpdateAllWindowVisibility(); - RecalculateNodePositions(); - RecalculateVirtualSize(); - - // why is this needed? Because folding or collapsing can change - // the state. When the virtual area gets smaller, we need to keep - // the largest one and the other way atound. And since we do not - // know here we are folding or collapsing, we remember the biggest - GetVirtualSize(&w1, &h1); - - if(h1 > h) - h = h1; - - // only refresh the part from x,y down - if(n) - { - int x, y; - CalcScrolledPosition(n->GetX(), n->GetY(), &x, &y); - if(h - y > 0) - { - wxRect rect(0, y, w, h - y); - RefreshRect(rect); - } - else - Refresh(); - } - else - Refresh(); // do a full refresh - } - - recalcMutex --; -} - -void wxTreeMultiCtrl::RecalculateNodePositions() -{ - int currentY = _spacingY; - // go recursive on every node, and store the information in the node - - for(int i = 0; i < _root.GetNodeCount(); i++) - currentY += CalculateNodeDimensions(_root.GetNode(i), currentY, 0); -} - -int wxTreeMultiCtrl::CalculateNodeDimensions(TreeMultiItemBase *b, int currentY, int level) -{ - int gutter = (_gutterWidth * 2) + _iconWidth; - int y = 0, topSpacing = 0; - - // return same if no proper object - wxCHECK(b, 0); - -#if(CHECKBOXVIEW) - if(b->GetCheckbox()) - gutter += _checkWidth; -#endif - - // if we are not visible, skip recalculation and descending - if(b->IsVisible()) - { - b->SetY(currentY); - - // if level is 0, calculate with front gutter, else without - y = currentY + b->GetHeight(); - if(b->IsTreeMultiItemNode()) - { - TreeMultiItemNode *n = (TreeMultiItemNode *)b; - - if(level == 0) - b->SetX(gutter); - else - b->SetX(gutter + (level * (_gutterWidth + _iconWidth))); - - // now do children of this node - - for(int i = 0; i < n->GetNodeCount(); i++) - y += CalculateNodeDimensions(n->GetNode(i), y + _spacingY, level+1); - } - else if(b->IsTreeMultiItemWindow()) - { - TreeMultiItemWindow *w = (TreeMultiItemWindow *)b; - - if(level == 0) - b->SetX(gutter + w->GetFrontSpacing()); - else - b->SetX(_gutterWidth + (level * (_gutterWidth + _iconWidth)) + w->GetFrontSpacing()); - - topSpacing = w->GetTopSpacing(); - - // reposition the window - - wxWindow *wnd = w->GetWindow(); - if(wnd) - { - int x = 0, y = 0; - CalcScrolledPosition(w->GetX(), w->GetY(), &x, &y); - wnd->SetSize(x, y, w->GetWidth(), w->GetHeight()); - } - } - - if(y > 0) - return (y - currentY) + _spacingY + topSpacing; // return delta - else - return 0; - } - - return 0; // not visible, thus we skip calculations -} - -void wxTreeMultiCtrl::RecalculateSpanSizes() -{ - for(int i = 0; i < _root.GetNodeCount(); i++) - CalculateNodeSpanning(_root.GetNode(i)); -} - -void wxTreeMultiCtrl::CalculateNodeSpanning(TreeMultiItemBase *b) -{ - // return same if no proper object - wxCHECK2(b, return); - - if(b->IsTreeMultiItemNode()) - { - TreeMultiItemNode *n = (TreeMultiItemNode *)b; - - // now do children of this node - - for(int i = 0; i < n->GetNodeCount(); i++) - CalculateNodeSpanning(n->GetNode(i)); - } - else if(b->IsTreeMultiItemWindow()) - { - TreeMultiItemWindow *w = (TreeMultiItemWindow *)b; - wxWindow *wnd = w->GetWindow(); - if(wnd) - { - // if the window is spanning, we adjust the width to the max width of the control - if(w->GetHorizontalSpan()) - { - wxSize tmcsize = GetClientSize(); - int maxwidth = tmcsize.GetWidth() - w->GetX() - 8; // extract 3 for border - - wxSizer *sz = wnd->GetSizer(); - if(sz) - { - if(maxwidth < sz->GetMinSize().GetWidth()) - maxwidth = sz->GetMinSize().GetWidth(); - } - - // prevent a size of 0 - if(maxwidth < 1) - maxwidth = 1; - - // set the size - w->SetWidth(maxwidth); - wnd->SetSize(w->GetWidth(), w->GetHeight()); - - // layout by sizer (not sure if this is needed) - if(wnd->GetSizer()) - wnd->GetSizer()->Layout(); - } - } - } -} - -void wxTreeMultiCtrl::RecalculateVirtualSize() -{ - // go through all the nodes, and store the largest x and largest y - - int x = 0, y = 0; - RecalculateVirtualSizeFromNode(&_root, x, y); - - // now adjust virtual size - SetVirtualSize(x, y); - AdjustScrollbars(x, y); -} - -void wxTreeMultiCtrl::AdjustScrollbars(int x, int y) -{ - // adjust scrollbars - // courtesy of treectrlg.cpp - - y += WXTMC_PIXELS_PER_UNIT+2; // one more scrollbar unit + 2 pixels - x += WXTMC_PIXELS_PER_UNIT+2; // one more scrollbar unit + 2 pixels - int x_pos = GetScrollPos( wxHORIZONTAL ); - int y_pos = GetScrollPos( wxVERTICAL ); - SetScrollbars( WXTMC_PIXELS_PER_UNIT, WXTMC_PIXELS_PER_UNIT, x/WXTMC_PIXELS_PER_UNIT, - y/WXTMC_PIXELS_PER_UNIT, x_pos, y_pos, true ); -} - -void wxTreeMultiCtrl::RecalculateVirtualSizeFromNode(const TreeMultiItemNode *node, int &x, int &y) -{ - if(node->IsExcluded()) - return; - - // if calulate this node's dimensions - if(x < (node->GetWidth() + node->GetX())) - x = node->GetWidth() + node->GetX(); - - y = node->GetY() + node->GetHeight(); - - // if this node is collapsed, no subnodes are visible, else - // go through all subnodes as well, node needs to be included as well - if(node->IsExpanded()) - { - TreeMultiItemBase *b; - for(int i = 0; i < node->GetNodeCount(); i++) - { - b = node->GetNode(i); - - // calculate x and y - if(x < (b->GetWidth() + b->GetX())) - x = b->GetWidth() + b->GetX(); - - y = b->GetY() + b->GetHeight(); - - if(b->IsTreeMultiItemNode()) - RecalculateVirtualSizeFromNode((TreeMultiItemNode *)b, x, y); - } - } -} - -void wxTreeMultiCtrl::SetWindowBackgroundColour(wxWindow *wnd, const wxColour &col, int flags) -{ - if(wnd) - { - // if we cannot change a button, make sure all button - // classes are not changed - - wxButton *btn = wxDynamicCast(wnd, wxButton); - if(!btn || ((flags & wxTMC_BG_ADJUST_BTN) != 0)) - wnd->SetBackgroundColour(col); - - // get every window, and make the background equal to the given one - wxWindowListNode *node = wnd->GetChildren().GetFirst(); - while (node) - { - SetWindowBackgroundColour(node->GetData(), col, flags); - node = node->GetNext(); - } - } -} - -void wxTreeMultiCtrl::ShowTreeMultiWindow(TreeMultiItemWindow *window, bool show) -{ - // show or hide window - if(window && window->GetWindow()) - window->GetWindow()->Show(show); -} - -void wxTreeMultiCtrl::UpdateAllWindowVisibility() -{ - // all roots are visible, but what lies beneath ... who knows - for(int i = 0; i < _root.GetNodeCount(); i++) - UpdateTreeMultiWindowVisibility(_root.GetNode(i), true); -} - -void wxTreeMultiCtrl::UpdateTreeMultiWindowVisibility(TreeMultiItemBase *b, bool show) -{ - if(b) - { - // this is done for performance issues. IsVisible can go all - // the way up the tree to check. However if show is already - // false, there is no need to check (some higher one is collapsed) - bool showMe = show; - - if(showMe) - showMe = b->IsVisible(); - - if(b->IsTreeMultiItemWindow()) - { - // if this level must be hidden, hide - ShowTreeMultiWindow((TreeMultiItemWindow*)b, showMe); - } - else if(b->IsTreeMultiItemNode()) - { - TreeMultiItemNode *node = (TreeMultiItemNode *)b; - - // if hidden, descend and hide all windows - for(int i = 0; i < node->GetNodeCount(); i++) - UpdateTreeMultiWindowVisibility(node->GetNode(i), showMe); - } - } -} - -wxTreeMultiItem wxTreeMultiCtrl::FindItem(const wxTreeMultiItem &item, const wxString &name, bool ignoreCase, bool skipFirst) -{ - if(item.IsOk()) - { - TreeMultiItemBase *b = item.GetItem(); - - // check this item first (or not) - - if(!skipFirst) - { - if(b->GetName().IsSameAs(name, !ignoreCase)) - return wxTreeMultiItem(b); - } - - if(b->IsTreeMultiItemNode()) - { - // now check whether we are a node, then go check children - - TreeMultiItemNode *n = (TreeMultiItemNode *)b; - wxTreeMultiItem result(0); - for(int i = 0; i < n->GetNodeCount() && !result.IsOk(); i++) - result = FindItem(wxTreeMultiItem(n->GetNode(i)), name, ignoreCase, false); - - return result; - } - } - - return wxTreeMultiItem(0); -} - -wxTreeMultiItem wxTreeMultiCtrl::FindWindowNode(wxWindow *wnd, TreeMultiItemNode *n) -{ - wxCHECK(wnd, wxTreeMultiItem(0)); - - // take root node if not assigned one - - if(!n) - n = (TreeMultiItemNode *)&_root; - - // check on this level for the wxWindow pointer - - TreeMultiItemWindow *w; - wxTreeMultiItem result(0); - for(int i = 0; i < n->GetNodeCount() && !result.IsOk(); i++) - { - // if window node - w = n->GetNode(i)->IsTreeMultiItemWindow(); - if(w && w->GetWindow() == wnd) - return wxTreeMultiItem(n); - - // if node, go deeper - if(n->GetNode(i)->IsTreeMultiItemNode()) - result = FindWindowNode(wnd, (TreeMultiItemNode*)n->GetNode(i)); - } - - return result; -} - -TreeMultiItemWindow *wxTreeMultiCtrl::FindNextVisibleWindowItem(TreeMultiItemBase *b, int index) -{ - wxCHECK(b, 0); - - // check on this level, go deeper with every node we got. When a node is not - // visible anymore, skip the node. - - TreeMultiItemWindow *value = 0; - if(b->IsVisible()) - { - // if we are already searching on a node with an index - - TreeMultiItemBase *bn = 0; - TreeMultiItemNode *n = b->IsTreeMultiItemNode(); - if(n) - { - for(int i = index + 1; i < n->GetNodeCount() && !value; i++) - { - bn = n->GetNode(i); - value = bn->IsTreeMultiItemWindow(); - - // assume a node, root when not a a window - if(!value) - value = FindNextVisibleWindowItem(bn, -1); - } - - } - else - { - if(b->IsTreeMultiItemWindow()) - { - // get parent first, and locate child as ptr - TreeMultiItemNode *p = b->GetParent(); - wxCHECK(p, 0); - - // go scan the parent from the given index, if - // the index is valid else there is no child with that index - - int idx = p->Index(b); - wxCHECK(idx >= 0, 0); - - value = FindNextVisibleWindowItem(p, idx); - } - } - } - - return value; - -} - -bool wxTreeMultiCtrl::GetBooleanValue(int wndId) -{ - wxWindow *wnd = wxWindow::FindWindow(wndId); - wxCHECK(wnd, false); - - // try a radio button - wxRadioButton *b = wxDynamicCast(wnd, wxRadioButton); - if(b) - return b->GetValue(); - - // try a check box - wxCheckBox *c = wxDynamicCast(wnd, wxCheckBox); - if(c) - return c->GetValue(); - - /** \todo For custom controls we should put something in wxMultiTreeItemData class - which can be overridden to retrieve the boolean value. It will also be passed - the pointer to the window, so the derived class can figure out how to get a boolean - value. - */ - - // generate assert or just return with false - wxCHECK(0, false); -} - -void wxTreeMultiCtrl::SetBooleanValue(int wndId, bool value) -{ - wxWindow *wnd = wxWindow::FindWindow(wndId); - wxCHECK2(wnd, return); - - // try a radio button - wxRadioButton *b = wxDynamicCast(wnd, wxRadioButton); - if(b) - { - b->SetValue(value); - return; - } - - // try a check box - wxCheckBox *c = wxDynamicCast(wnd, wxCheckBox); - if(c) - { - c->SetValue(value); - return; - } - - /** \todo For custom controls we should put something in wxMultiTreeItemData class - which can be overridden to retrieve the boolean value. It will also be passed - the pointer to the window, so the derived class can figure out how to get a boolean - value. - */ - - // generate assert - wxCHECK2(0, return); -} - -void wxTreeMultiCtrl::SetTextValue(int wndId, const wxString &value) -{ - wxWindow *wnd = wxWindow::FindWindow(wndId); - wxCHECK2(wnd, return); - - // try a radio button - wxTextCtrl *t = wxDynamicCast(wnd, wxTextCtrl); - if(t) - { - t->SetValue(value); - return; - } - - /** \todo For custom controls we should put something in wxMultiTreeItemData class - which can be overridden to retrieve the boolean value. It will also be passed - the pointer to the window, so the derived class can figure out how to get a boolean - value. - */ - - // generate assert - wxCHECK2(0, return); -} - -wxString wxTreeMultiCtrl::GetTextValue(int wndId) -{ - wxWindow *wnd = wxWindow::FindWindow(wndId); - wxCHECK(wnd, wxEmptyString); - - // try a radio button - wxTextCtrl *t = wxDynamicCast(wnd, wxTextCtrl); - if(t) - return t->GetValue(); - - // try a choice box - wxChoice *c1 = wxDynamicCast(wnd, wxChoice); - if(c1) - return c1->GetStringSelection(); - - // try a combo box - wxComboBox *c2 = wxDynamicCast(wnd, wxComboBox); - if(c2) - return c2->GetStringSelection(); - - // try a listbox - wxListBox *l = wxDynamicCast(wnd, wxListBox); - if(l) - return l->GetStringSelection(); - - /** \todo For custom controls we should put something in wxMultiTreeItemData class - which can be overridden to retrieve the boolean value. It will also be passed - the pointer to the window, so the derived class can figure out how to get a boolean - value. - */ - - // generate assert or just return with string - wxCHECK(0, wxEmptyString); -} - -int wxTreeMultiCtrl::GetSelectionValue(int wndId) -{ - wxWindow *wnd = wxWindow::FindWindow(wndId); - wxCHECK(wnd, -1); - - // try a choice box - wxChoice *c1 = wxDynamicCast(wnd, wxChoice); - if(c1) - return c1->GetSelection(); - - // try a combo box - wxComboBox *c2 = wxDynamicCast(wnd, wxComboBox); - if(c2) - return c2->GetSelection(); - - // try a listbox - wxListBox *l = wxDynamicCast(wnd, wxListBox); - if(l) - return l->GetSelection(); - - /** \todo For custom controls we should put something in wxMultiTreeItemData class - which can be overridden to retrieve the boolean value. It will also be passed - the pointer to the window, so the derived class can figure out how to get a boolean - value. - */ - - // generate assert or just return with string - wxCHECK(0, -1); -} - -void wxTreeMultiCtrl::GetSelectionValues(int wndId, wxArrayInt &sels) -{ - sels.Clear(); - - wxWindow *wnd = wxWindow::FindWindow(wndId); - wxCHECK2(wnd, return); - - // try a listbox - wxListBox *l = wxDynamicCast(wnd, wxListBox); - if(l) - { - l->GetSelections(sels); - return; - } - - /** \todo For custom controls we should put something in wxMultiTreeItemData class - which can be overridden to retrieve the boolean value. It will also be passed - the pointer to the window, so the derived class can figure out how to get a boolean - value. - */ - - // generate assert or just return with string - wxCHECK2(0, return); -} - -void wxTreeMultiCtrl::SetSelectionValue(int wndId, int sel) -{ - wxWindow *wnd = wxWindow::FindWindow(wndId); - wxCHECK2(wnd, return); - - // try a choice box - wxChoice *c1 = wxDynamicCast(wnd, wxChoice); - if(c1) - { - c1->SetSelection(sel); - return; - } - - // try a combo box - wxComboBox *c2 = wxDynamicCast(wnd, wxComboBox); - if(c2) - { - c2->SetSelection(sel); - return; - } - - // try a listbox - wxListBox *l = wxDynamicCast(wnd, wxListBox); - if(l) - { - l->SetSelection(sel); - return; - } - - /** \todo For custom controls we should put something in wxMultiTreeItemData class - which can be overridden to retrieve the boolean value. It will also be passed - the pointer to the window, so the derived class can figure out how to get a boolean - value. - */ - - // generate assert or just return with string - wxCHECK2(0, return); -} - - -wxTreeMultiItem wxTreeMultiCtrl::GetParent(wxTreeMultiItem const& item) const -{ - // check if valid or root item has been passed, both do not have parents: - if (!(item.IsOk()) || item.GetItem()->IsTreeMultiItemRoot()) - return wxTreeMultiItem(); - else - return wxTreeMultiItem(item.GetItem()->GetParent()); // GetParent() returns a valid pointer in case of a root item!! - // therefore, the check if the passed item is a root item is necessary -} /* wxTreeMultiCtrl::GetParent(wxTreeMultiItem const& item) const */ - -wxTreeMultiItem wxTreeMultiCtrl::GetFirstChild(const wxTreeMultiItem &item, int &cookie) const -{ - if(item.IsNodeItem()) - { - TreeMultiItemNode *n = (TreeMultiItemNode *)item.GetItem(); - - if(n->GetNodeCount() > 0) - { - cookie = 0; - return wxTreeMultiItem(n->GetNode(0)); - } - } - - // no children or no valid node - cookie = -1; - return wxTreeMultiItem(0); -} - -wxTreeMultiItem wxTreeMultiCtrl::GetNextChild(const wxTreeMultiItem &item, int &cookie) const -{ - if(item.IsNodeItem()) - { - TreeMultiItemNode *n = (TreeMultiItemNode *)item.GetItem(); - - if(cookie >= 0 && cookie < (n->GetNodeCount()-1)) - { - // increment cookie, return node - cookie ++; - return wxTreeMultiItem(n->GetNode(cookie)); - } - } - - // end of query, or no valid node - cookie = -1; - return wxTreeMultiItem(0); -} - -wxTreeMultiItem wxTreeMultiCtrl::GetLastChild(const wxTreeMultiItem &item) const -{ - if(item.IsNodeItem()) - { - TreeMultiItemNode *n = (TreeMultiItemNode *)item.GetItem(); - - if(n->GetNodeCount() > 0) - return wxTreeMultiItem(n->GetNode(n->GetNodeCount()-1)); - } - - return wxTreeMultiItem(0); -} - -wxTreeMultiItem wxTreeMultiCtrl::GetNextSibling(wxTreeMultiItem const& item) const -{ - // check if a valid item has been passed: - if (!(item.IsOk())) - return wxTreeMultiItem(); - - TreeMultiItemNode* ParentPtr(item.GetItem()->GetParent()); - - - if (ParentPtr != NULL) // the parent pointer is only null if the passed item is the root - { - // find the current item in the parent's list; the next sibling has an index that is one higher than the one of the current item: - int NextItemIndex(ParentPtr->Index(item.GetItem())+1); // variable definition and initialization - - if (NextItemIndex < ParentPtr->GetNodeCount()) - return ParentPtr->GetNode(NextItemIndex); - else - return wxTreeMultiItem(); - } /* if */ - else - return wxTreeMultiItem(); -} /* wxTreeMultiCtrl::GetNextSibling(wxTreeMultiItem const&) const */ - -wxTreeMultiItem wxTreeMultiCtrl::GetPrevSibling(wxTreeMultiItem const& item) const -{ - // check if a valid item has been passed: - if (!(item.IsOk())) - return wxTreeMultiItem(); - - TreeMultiItemNode* ParentPtr(item.GetItem()->GetParent()); - - - if (ParentPtr != NULL) - { - // find the current item in the parent's list; the next sibling has an index that is one higher than the one of the current item: - int PrevItemIndex(ParentPtr->Index(item.GetItem())-1); // variable definition and initialization - - if (PrevItemIndex >= 0) - return ParentPtr->GetNode(PrevItemIndex); - else - return wxTreeMultiItem(); - } /* if */ - else - return wxTreeMultiItem(); -} /* wxTreeMultiCtrl::GetPrevSibling(wxTreeMultiItem const&) const */ - -wxTreeMultiItem wxTreeMultiCtrl::GetNext(wxTreeMultiItem const& item) const -{ - // check if a valid item has been passed: - if (!(item.IsOk())) - return wxTreeMultiItem(); - - TreeMultiItemNode* NodePtr(item.GetItem()->IsTreeMultiItemNode()); // variable definition and initialization - - if ((NodePtr != NULL) && (NodePtr->GetNodeCount() > 0)) - return wxTreeMultiItem(NodePtr->First()); - else - { - // variable definitions and initializations: - wxTreeMultiItem Parent(item); - wxTreeMultiItem Sibling; - - do - { - Sibling = this->GetNextSibling(Parent); // try to find next sibling - Parent = this->GetParent(Parent); // get next ancestor - } while (!(Sibling.IsOk()) && Parent.IsOk()); - // in case the loop ended with Sibling.IsOk() "Sibling" contains a valid sibling otherwise an invalid - return Sibling; - } /* if */ -} /* wxTreeMultiCtrl::GetNextSibling(wxTreeMultiItem const&) const */ - -wxTreeMultiItem wxTreeMultiCtrl::GetPrevious(wxTreeMultiItem const& item) const -{ - // check if a valid item has been passed: - if (!(item.IsOk())) - return wxTreeMultiItem(); - - TreeMultiItemNode* NodePtr(item.GetItem()->IsTreeMultiItemNode()); // variable definition and initialization - - if ((NodePtr != NULL) && (NodePtr->GetNodeCount() > 0)) - return wxTreeMultiItem(NodePtr->Last()); - else - { - // variable definitions and initializations: - wxTreeMultiItem Parent(item); - wxTreeMultiItem Sibling; - - do - { - Sibling = this->GetPrevSibling(Parent); // try to find next sibling - Parent = this->GetParent(Parent); // get next ancestor - } while (!(Sibling.IsOk()) && Parent.IsOk()); - // in case the loop ended with Sibling.IsOk() "Sibling" contains a valid sibling otherwise an invalid - return Sibling; - } /* if */ -} /* wxTreeMultiCtrl::GetPrevious(wxTreeMultiItem const&) const */ - -// WDR: handler implementations for wxTreeMultiCtrl - -void wxTreeMultiCtrl::OnDraw(wxDC& dc) -{ - // go recursive and draw the whole visible tree. - dc.SetFont(_captionFont); - for(int i = 0; i < _root.GetNodeCount(); i++) - DrawNode(_root.GetNode(i), dc); -} /* */ +//--------------------------------------------------------------------------- +// $RCSfile: wxTreeMultiCtrl.cpp,v $ +// $Source: /cvs/creatis/bbtk/kernel/src/ThirdParty/wx/treemultictrl/wxTreeMultiCtrl.cpp,v $ +// $Revision: 1.2 $ +// $Date: 2009/10/05 22:44:50 $ +//--------------------------------------------------------------------------- +// Author: Jorgen Bodde +// Copyright: (c) Jorgen Bodde +// License: wxWidgets License +//--------------------------------------------------------------------------- + +#ifdef __GNUG__ + #pragma implementation "wxTreeMultiCtrl.h" +#endif + +// For compilers that support precompilation, includes "wx/wx.h". +#include "wx/wxprec.h" +#include "wx/treebase.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/arrimpl.cpp" + +#include "wx/treemultictrl/wxTreeMultiCtrl.h" +#include "wx/treemultictrl/wxTreeMultiEvent.h" +#include "tmcimages.h" + + + +//---------------------------------------------------------------------------- +// wxTreeMultiItem +//---------------------------------------------------------------------------- + +WX_DEFINE_OBJARRAY(wxArrayTreeMultiItem); + +//---------------------------------------------------------------------------- +// wxTreeMultiCtrl +//---------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxTreeMultiCtrl, wxScrolledWindow) + +// WDR: event table for wxTreeMultiCtrl +BEGIN_EVENT_TABLE(wxTreeMultiCtrl, wxScrolledWindow) + EVT_LEFT_DOWN (wxTreeMultiCtrl::OnMouseClick) + EVT_LEFT_DCLICK(wxTreeMultiCtrl::OnMouseClick) + EVT_RIGHT_DOWN (wxTreeMultiCtrl::OnRightMouseClick) + EVT_PAINT(wxTreeMultiCtrl::OnPaint) + EVT_SIZE(wxTreeMultiCtrl::OnSize) +// EVT_KEY_UP(wxTreeMultiCtrl::OnKey) +END_EVENT_TABLE() + +bool wxTreeMultiCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, + const wxSize& size, long style, const wxValidator & WXUNUSED(validator), + const wxString& name ) +{ + wxScrolledWindow::Create( parent, id, pos, size, style | wxTAB_TRAVERSAL, name); + + _create_called = true; + + // do the init + Init(); + + return TRUE; +} + +void wxTreeMultiCtrl::Init() +{ + _root.Clear(); + + _expandBmp = 0; + _collBmp = 0; + +#if(CHECKBOXVIEW) + _checkBmp = 0; + _uncheckBmp = 0; + _tristateBmp = 0; + + _checkHeight = 11; + _checkWidth = 11; + + _checkboxView = false; +#endif + + _gutterWidth = WXTMC_GUTTER_DEFAULT; + _iconWidth = 11; + _iconHeight = 11; + _maxHeight = 1;; + _iconDeltaY = 2; + _spacingY = WXTMC_YSPACING_DEFAULT; + _captionHeight = 13; + + // create two bitmap nodes for drawing + + _expandBmp = new wxBitmap(expand_xpm); + _collBmp = new wxBitmap(collapse_xpm); + + // calculate average font height for bitmap centering + + _iconWidth = _expandBmp->GetWidth(); + _iconHeight = _expandBmp->GetHeight(); + +#if(CHECKBOXVIEW) + // create bitmaps for checkboxes + _checkBmp = new wxBitmap(checked_icon); + _uncheckBmp = new wxBitmap(unchecked_icon); + _tristateBmp = new wxBitmap(tristate_icon); + + // adjust the height if the checkboxes are higher + // so that everything is alligned properly + _checkHeight = _checkBmp->GetHeight(); + _checkWidth = _checkBmp->GetWidth(); +#endif + + // remember the highest of the two bitmaps so there is + // always enough room + _maxHeight = _iconHeight; + +#if(CHECKBOXVIEW) + if(_maxHeight < _checkHeight) + _maxHeight = _checkHeight; +#endif + + // set standard highlighting brush + this->m_HilightBrush = new wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT),wxSOLID); + + // set standard DC font + _captionFont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); + + // adjust bitmap icon y position so they are centered + AdjustIconsDeltaY(); + + // set virtual size to this window size + if (_create_called) { + wxSize wndsize = GetSize(); + SetVirtualSize(wndsize.GetWidth(), wndsize.GetWidth()); + } +} + +void wxTreeMultiCtrl::SetCaptionFont(const wxFont &font) +{ + _captionFont = font; + + // adjust the icons so that they are in the middle + AdjustIconsDeltaY(); + + RedrawFromNode(0); +}; + +void wxTreeMultiCtrl::AdjustIconsDeltaY() +{ + int x = 0, y = 0; + + if(_captionFont.Ok()) + GetTextExtent(wxT("jG"), &x, &y, 0, 0, &_captionFont); + _captionHeight = y; + + if(_maxHeight < _captionHeight) + _maxHeight = _captionHeight; + + // determine the center pos for the [+] + _iconDeltaY = abs(_maxHeight - _iconHeight) / 2 + 1; + if(_iconDeltaY < 1) + _iconDeltaY = 1; + +#if(CHECKBOXVIEW) + // determine the center pos for the checkbox + _checkDeltaY = abs(_maxHeight - _checkHeight) / 2 + 1; + if(_checkDeltaY < 1) + _checkDeltaY = 1; +#endif +} + +wxTreeMultiCtrl::~wxTreeMultiCtrl() +{ + // delete the bitmap resources + delete _expandBmp; + delete _collBmp; + +#if(CHECKBOXVIEW) + delete _checkBmp; + delete _uncheckBmp; + delete _tristateBmp; +#endif +} + +wxTreeMultiItem wxTreeMultiCtrl::AddRoot(const wxString &caption, const wxString &name) +{ + wxTreeMultiItem result((TreeMultiItemBase *)&_root); + result = AppendNode(result, caption, name); + + return result; +} + +wxTreeMultiItem wxTreeMultiCtrl::AppendWindow(const wxTreeMultiItem &ParentItem, wxWindow *window, const wxString &name, const wxTreeMultiWindowInfo &info, int flags) +{ + // add window only if the parent item is valid and... + wxCHECK(ParentItem.IsOk(), wxTreeMultiItem(0)); + + TreeMultiItemNode* parent = ParentItem.GetItem()->IsTreeMultiItemNode(); // also roots are nodes + + // ... is a node + wxCHECK(parent != NULL, wxTreeMultiItem(0)); + + // now, append node to the tree control: + wxTreeMultiItem NewWindowItem(this->InsertWindow(parent,wx_static_cast(size_t,parent->GetNodeCount()),window,name,info,flags)); + // redraw the stucture: + this->RedrawFromNode(parent); + // return the new window + return NewWindowItem; +} + +wxTreeMultiItem wxTreeMultiCtrl::InsertWindow(wxTreeMultiItem const& ParentItem, size_t Position, wxWindow *window, wxString const& name, wxTreeMultiWindowInfo const& info, int flags) +{ + // add window only if the parent item is valid and... + wxCHECK(ParentItem.IsOk(), wxTreeMultiItem(0)); + + TreeMultiItemNode* parent = ParentItem.GetItem()->IsTreeMultiItemNode(); // also roots are nodes + + // ... is a node + wxCHECK(parent != NULL, wxTreeMultiItem(0)); + + // now, append node to the tree control: + wxTreeMultiItem NewWindowItem(this->InsertWindow(parent,Position,window,name,info,flags)); + // redraw the stucture: + this->RedrawFromNode(parent); + // return the new window + return NewWindowItem; +} /* wxTreeMultiCtrl::InsertWindow(wxTreeMultiItem const&, size_t, wxWindow*, wxString const&, wxTreeMultiWindowInfo const&, int) */ + +wxTreeMultiItem wxTreeMultiCtrl::PrependWindow(wxTreeMultiItem const& ParentItem, wxWindow *window, const wxString &name, wxTreeMultiWindowInfo const& info, int flags) +{ + // add window only if the parent item is valid and... + wxCHECK(ParentItem.IsOk(), wxTreeMultiItem(0)); + + TreeMultiItemNode* parent = ParentItem.GetItem()->IsTreeMultiItemNode(); // also roots are nodes + + // ... is a node + wxCHECK(parent != NULL, wxTreeMultiItem(0)); + + // now, append node to the tree control: + wxTreeMultiItem NewWindowItem(this->InsertWindow(parent,0,window,name,info,flags)); + // redraw the stucture: + this->RedrawFromNode(parent); + // return the new window + return NewWindowItem; +} /* wxTreeMultiCtrl::PrependWindow(wxTreeMultiItem const&, wxWindow*, const wxString &, wxTreeMultiWindowInfo const&, int) */ + +wxTreeMultiItem wxTreeMultiCtrl::AppendNode(wxTreeMultiItem const& ParentItem, const wxString &caption, const wxString &name) +{ + // add window only if the parent item is valid and... + wxCHECK(ParentItem.IsOk(), wxTreeMultiItem(0)); + + TreeMultiItemNode* parent = ParentItem.GetItem()->IsTreeMultiItemNode(); // also roots are nodes + + // ... is a node + wxCHECK(parent != NULL, wxTreeMultiItem(0)); + + // now, append node to the tree control: + wxTreeMultiItem NewNodeItem(this->InsertNode(parent,wx_static_cast(size_t,parent->GetNodeCount()),caption,name)); + // redraw the structure: + this->RedrawFromNode(parent); + // return the new node: + return NewNodeItem; +} /* wxTreeMultiCtrl::AppendNode(wxTreeMultiItem const&, const wxString &, const wxString&) */ + +wxTreeMultiItem wxTreeMultiCtrl::InsertNode(wxTreeMultiItem const& ParentItem, size_t Position, wxString const& caption, wxString const& name) +{ + // add window only if the parent item is valid and... + wxCHECK(ParentItem.IsOk(), wxTreeMultiItem(0)); + + TreeMultiItemNode* parent = ParentItem.GetItem()->IsTreeMultiItemNode(); // also roots are nodes + + // ... is a node + wxCHECK(parent != NULL, wxTreeMultiItem(0)); + + // now, append node to the tree control: + wxTreeMultiItem NewNodeItem(this->InsertNode(parent,Position,caption,name)); + // redraw the structure: + this->RedrawFromNode(parent); + // return the new node: + return NewNodeItem; +} /* wxTreeMultiCtrl::InsertNode(wxTreeMultiItem const&, size_t, wxString const&, wxString const&) */ + +wxTreeMultiItem wxTreeMultiCtrl::PrependNode(wxTreeMultiItem const& ParentItem, wxString const& caption, wxString const& name) +{ + // add window only if the parent item is valid and... + wxCHECK(ParentItem.IsOk(), wxTreeMultiItem(0)); + + TreeMultiItemNode* parent = ParentItem.GetItem()->IsTreeMultiItemNode(); // also roots are nodes + + // ... is a node + wxCHECK(parent != NULL, wxTreeMultiItem(0)); + + // now, append node to the tree control: + wxTreeMultiItem NewNodeItem(this->InsertNode(parent,0,caption,name)); + // redraw the structure: + this->RedrawFromNode(parent); + // return the new node: + return NewNodeItem; +} /* wxTreeMultiCtrl::PrependNode(wxTreeMultiItem const&, wxString const&, wxString const&) */ + +bool wxTreeMultiCtrl::Delete(wxTreeMultiItem &item) +{ + bool redraw = true; + wxCHECK(item.IsOk(), false); + + wxTreeMultiItem nullItem(0); + + + // if item has been selected, remove it from the selected list: + size_t ItemIndex(this->GetSelectedItemIndex(item)); + + if (ItemIndex != this->GetSelectedItemCount()) + this->m_SelectedItems.RemoveAt(ItemIndex); + + // get parent, to delete item from + TreeMultiItemNode *p = item.GetItem()->GetParent(); + + // first check if it was visible, if so from the parent off + // it needs redrawing + redraw = item.GetItem()->IsVisible(); + if(p) + p->DeleteNode(item.GetItem()); + else + _root.DeleteNode(item.GetItem()); + + item = nullItem; + + // do redraw when node was visible + if(redraw) + RedrawFromNode(p); + + return true; +} + +void wxTreeMultiCtrl::DeleteChildren(const wxTreeMultiItem &item) +{ + if(item.IsNodeItem()) + { + TreeMultiItemNode *n = (TreeMultiItemNode *)item.GetItem(); + + // remove all children from the selected item list: + if (n->GetNodeCount() > 0) + { + // variable definitions and initializations: + int Cookie; + wxTreeMultiItem FirstItemIterator(this->GetFirstChild(item,Cookie)), LastItemIterator(this->GetLastChild(item)); + + for (;;) + { + size_t ItemIndex(this->GetSelectedItemIndex(item)); // variable definition and initialization + + if (ItemIndex != this->GetSelectedItemCount()) + this->m_SelectedItems.RemoveAt(ItemIndex); + if (FirstItemIterator == LastItemIterator) + break; // all children checked + else + FirstItemIterator = this->GetNext(FirstItemIterator); + } /* for */ + } /* if */ + // delete children: + n->Clear(); + // redraw: + RedrawFromNode(n); + } +} + +void wxTreeMultiCtrl::Expand(const wxTreeMultiItem &item, bool recursive) +{ + if(item.IsOk()) + { + TreeMultiItemNode *n = item.GetItem()->IsTreeMultiItemNode(); + if(!n) + n = item.GetItem()->GetParent(); + DoFold(n, true, recursive); + RedrawFromNode(item.GetItem()->IsTreeMultiItemNode()); + } +} + +void wxTreeMultiCtrl::Collapse(const wxTreeMultiItem &item, bool recursive) +{ + if(item.IsOk()) + { + TreeMultiItemNode *n = item.GetItem()->IsTreeMultiItemNode(); + if(!n) + n = item.GetItem()->GetParent(); + DoFold(n, false, recursive); + RedrawFromNode(item.GetItem()->IsTreeMultiItemNode()); + } +} + + +void wxTreeMultiCtrl::ExpandNodes(bool recursive) +{ + // go through all children and call DoFold recursively + for(int i = 0; i < _root.GetNodeCount(); i++) + DoFold(_root.GetNode(i), true, recursive); + RedrawFromNode(0); +} + +void wxTreeMultiCtrl::CollapseNodes(bool recursive) +{ + // go through all children and call DoFold recursively + for(int i = 0; i < _root.GetNodeCount(); i++) + DoFold(_root.GetNode(i), false, recursive); + RedrawFromNode(0); +} + +void wxTreeMultiCtrl::CollapseAndReset(const wxTreeMultiItem &item) +{ + if(item.IsNodeItem()) + { + TreeMultiItemNode *n = (TreeMultiItemNode *)item.GetItem(); + + // delete all kids + n->Clear(); + Collapse(item, false); + } +} + +// Selection manipulation +wxTreeMultiItem wxTreeMultiCtrl::GetFirstSelectedItem(void) const +{ + if (this->GetSelectedItemCount() > 0) + return this->m_SelectedItems[0]; + else + return wxTreeMultiItem(); +} /* wxTreeMultiCtrl::GetFirstSelectedItem(void) const */ + +wxTreeMultiItem wxTreeMultiCtrl::GetLastSelectedItem(void) const +{ + if (this->GetSelectedItemCount() > 0) + return this->m_SelectedItems[this->GetSelectedItemCount()-1]; + else + return wxTreeMultiItem(); +} /* wxTreeMultiCtrl::GetLastSelectedItem(void) const */ + +wxTreeMultiItem wxTreeMultiCtrl::GetSelectedItem(size_t Index) const +{ + if (Index < this->GetSelectedItemCount()) + return this->m_SelectedItems[Index]; + else + return wxTreeMultiItem(); +} /* wxTreeMultiCtrl::GetSelectedItem(size_t Index) const */ + +size_t wxTreeMultiCtrl::GetSelectedItemIndex(wxTreeMultiItem const& Item) const +{ + // attention: the function wxArray::Index() can NOT be used in a save manner as it only checks the address of an item + // element but it is not guaranteed that Item may not be a copy of the originally inserted item + const size_t NoOfSelectedItems = this->GetSelectedItemCount(); + + size_t Index(0); + + + while ((Index < NoOfSelectedItems) && (this->m_SelectedItems[Index] != Item)) + ++Index; + return Index; +} /* wxTreeMultiCtrl::GetSelectedItemIndex(wxTreeMultiItem const&) const */ + +void wxTreeMultiCtrl::SelectItem(wxTreeMultiItem const& Item, bool UnselectOthers, bool ExpandSelection) +{ + TreeMultiItemNode* NodePtr(Item.GetItem()->IsTreeMultiItemNode()); + + + // only nodes can be selected and they can only be selected if they are not already selected: + if ((NodePtr == NULL) || NodePtr->IsSelected()) + return; + + // inform that we are about to change: + wxTreeMultiEvent Event(wxEVT_COMMAND_TREE_MULTI_SEL_CHANGING,Item); // variable definition and initialization + + if (this->m_SelectedItems.GetCount() > 0) // the last item in the array is always the latest inserted item + Event.SetOldItem(this->m_SelectedItems.Last()); + Event.SetEventObject(this); + if (this->GetEventHandler()->ProcessEvent(Event) && !(Event.IsAllowed())) + return; // vetoed + + // make sure that the to be selected item can be seen: + this->Include(Item); + + // variable definition and initialization: + wxTreeMultiItem ExcludedParent(this->GetExcludedParent(Item)); + + while (ExcludedParent.IsOk()) + { + this->Include(ExcludedParent); + ExcludedParent = this->GetExcludedParent(Item); + } /* while */ + + // unselect items if necessary: + if (UnselectOthers) + this->UnselectAll(); + // expand selection if necessary: + if (ExpandSelection) + { + // variable definition: + wxTreeMultiItem FirstItemIterator, LastItemIterator; + wxTreeMultiItem LastSelectedItem; + + // determine the last selected item or the first item in case nothing has been selected before: + if (this->m_SelectedItems.GetCount() > 0) + LastSelectedItem = this->m_SelectedItems.Last(); + else + LastSelectedItem = this->GetFirstRoot(); + // determine the item from which to start and the one with which to end the selection: + if (Item.GetItem()->GetY() > LastSelectedItem.GetItem()->GetY()) + { + FirstItemIterator = LastSelectedItem; + LastItemIterator = Item; + } /* if */ + else + { + FirstItemIterator = Item; + LastItemIterator = LastSelectedItem; + } /* if */ + // select all items that are a node and are placed between the two limiting iterators (included the limits): + for (;;) + { + if (!(FirstItemIterator.IsSelected()) && FirstItemIterator.IsNodeItem()) + { + FirstItemIterator.GetItem()->Select(); + this->m_SelectedItems.Add(FirstItemIterator); + this->RefreshRect(wxRect(FirstItemIterator.GetItem()->GetX(), FirstItemIterator.GetItem()->GetY(), + FirstItemIterator.GetItem()->GetWidth(),FirstItemIterator.GetItem()->GetHeight())); + } /* if */ + if (FirstItemIterator == LastItemIterator) + break; // done + // continue iterating: + FirstItemIterator = this->GetNext(FirstItemIterator); + } /* for */ + } /* if */ + else // select passed item only + { + NodePtr->Select(); + this->m_SelectedItems.Add(NodePtr); + this->RefreshRect(wxRect(NodePtr->GetX(),NodePtr->GetY(),NodePtr->GetWidth(),NodePtr->GetHeight())); + } /* if */ + + // inform that we have selected the item: + Event.SetEventType(wxEVT_COMMAND_TREE_MULTI_SEL_CHANGED); + this->GetEventHandler()->ProcessEvent(Event); +} /* wxTreeMultiCtrl::SelectItem(wxTreeMultiItem const&, bool, bool) */ + +void wxTreeMultiCtrl::UnselectAll(void) +{ + const size_t NoOfSelectedItems = this->m_SelectedItems.GetCount(); + + + for (size_t i=0; iRefreshRect(wxRect(this->m_SelectedItems[i].GetItem()->GetX(), this->m_SelectedItems[i].GetItem()->GetY(), + this->m_SelectedItems[i].GetItem()->GetWidth(),this->m_SelectedItems[i].GetItem()->GetHeight())); + this->m_SelectedItems[i].GetItem()->Unselect(); + } /* for */ + this->m_SelectedItems.Clear(); +} /* wxTreeMultiCtrl::UnselectAll(void) */ + +void wxTreeMultiCtrl::Unselect(wxTreeMultiItem const& Item) +{ + size_t ItemIndex(this->GetSelectedItemIndex(Item)); + + + if (ItemIndex != this->GetSelectedItemCount()) + { + Item.GetItem()->Unselect(); + this->m_SelectedItems.RemoveAt(ItemIndex); + this->RefreshRect(wxRect(Item.GetItem()->GetX(),Item.GetItem()->GetY(),Item.GetItem()->GetWidth(),Item.GetItem()->GetHeight())); + } /* if */ +} /* wxTreeMultiCtrl::Unselect(wxTreeMultiItem const&) */ + +void wxTreeMultiCtrl::DoFold(TreeMultiItemBase *item, bool expand, bool recursive) +{ + + // go through all node objects on this level, and expand or + // collapse them + + if(item == 0) + return; + + // if this is a node, use it to go through all the subnodes (if needed) + // if not, then just exit. + + TreeMultiItemNode *node = item->IsTreeMultiItemNode(); + if(node) + { + node->Fold(expand); + + // go recursive + if(recursive) + { + TreeMultiItemNode *p; + for(int i = 0; i < node->GetNodeCount(); i++) + { + // get node, and if a real node, then call fold + p = node->GetNode(i)->IsTreeMultiItemNode(); + if(p) + p->Fold(expand); + + // go recursive for every node + DoFold(p, expand, recursive); + } + } + } +} + +void wxTreeMultiCtrl::Exclude(const wxTreeMultiItem &item) +{ + wxCHECK2(item.IsOk(), return); + + // exclude the item, and refresh + // if already excluded, skip + + if(!item.GetItem()->IsExcluded()) + { + item.GetItem()->SetExcluded(true); + RedrawFromParentNode(item.GetItem()); + } +} + +void wxTreeMultiCtrl::Include(const wxTreeMultiItem &item) +{ + wxCHECK2(item.IsOk(), return); + + // include the item, and refresh. If not + // excluded, do nothing + + if(item.GetItem()->IsExcluded()) + { + item.GetItem()->SetExcluded(false); + RedrawFromParentNode(item.GetItem()); + } +} + +wxTreeMultiItem wxTreeMultiCtrl::GetExcludedParent(const wxTreeMultiItem &item) +{ + wxCHECK(item.IsOk(), wxTreeMultiItem(0)); + + // go find the parent (including this one) that + // can be the excluded one + + TreeMultiItemNode *n = item.GetItem()->IsTreeMultiItemNode(); + if(n && n->IsExcluded()) + return wxTreeMultiItem(n); + + n = item.GetItem()->GetParent(); + while(n) + { + if(n->IsExcluded()) + return wxTreeMultiItem(n); + else + n = n->GetParent(); + } + + return wxTreeMultiItem(0); +} + +void wxTreeMultiCtrl::OnSize(wxSizeEvent &WXUNUSED(event)) +{ + RecalculateSpanSizes(); +} + +void wxTreeMultiCtrl::OnPaint(wxPaintEvent& WXUNUSED(event) ) +{ + wxPaintDC dc(this); + + PrepareDC(dc); + + // go recursive and draw the whole visible tree. + dc.SetFont(_captionFont); + for(int i = 0; i < _root.GetNodeCount(); i++) + DrawNode(_root.GetNode(i), dc); +} + +void wxTreeMultiCtrl::DrawNode(TreeMultiItemBase *b, wxDC &dc) +{ + // go through this item .. if it is a node, draw + // the caption, else reposition the window. + + if(!b) + return; + + // forget it if this node is not visible + if(b->IsVisible()) + { + int bmpOffsetX = b->GetX() - (_gutterWidth + _iconWidth); + +#if(CHECKBOXVIEW) + // now draw the checkbox if there is any, in the proper state + if(b->GetCheckbox()) + { + DrawCheckbox(b, dc); + + // adjust the bmpOffset because we also have a checkbox + bmpOffsetX -= _checkWidth; + } +#endif + + if(b->IsTreeMultiItemNode()) + { + // draw the node icon and the caption + TreeMultiItemNode *n = (TreeMultiItemNode *)b; + + // set background of caption item + if (n->IsSelected()) + { + dc.SetBrush(*(this->m_HilightBrush)); + dc.SetPen(wxPen(this->m_HilightBrush->GetColour(),1,wxSOLID)); + } /* if */ + else + { + dc.SetBrush(wxBrush(*wxWHITE,wxSOLID)); + dc.SetPen(wxPen(*wxWHITE,1,wxSOLID)); + } /* if */ + dc.DrawRectangle(n->GetX(),n->GetY(),n->GetWidth(),n->GetHeight()); + // draw caption + dc.DrawText(n->GetCaption(), n->GetX(), n->GetY()); + + // draw the bitmap for the state + if(n->IsExpanded()) + dc.DrawBitmap(*_expandBmp, bmpOffsetX, n->GetY() + _iconDeltaY, true); + else + dc.DrawBitmap(*_collBmp, bmpOffsetX, n->GetY() + _iconDeltaY, true); + + // now go through all the subnodes + for(int i = 0; i < n->GetNodeCount(); i++) + DrawNode(n->GetNode(i), dc); + + } + } +} + +#if(CHECKBOXVIEW) + +void wxTreeMultiCtrl::DrawCheckbox(TreeMultiItemBase *b, wxDC &dc, bool convertScrolled) +{ + wxCHECK2(b, return); + + wxBitmap *bmp; + int bmpOffsetX = b->GetX() - (_gutterWidth + _iconWidth); + + switch(b->GetCheckboxState()) + { + case 0: + bmp = _uncheckBmp; + break; + case 1: + bmp = _checkBmp; + break; + default: + bmp = _tristateBmp; + break; + } + + int x, xx, y, yy; + + if(b->IsTreeMultiItemWindow()) + { + xx = x = bmpOffsetX - ((TreeMultiItemWindow *)b)->GetFrontSpacing() + _checkWidth; + yy = y = b->GetY() + _checkDeltaY; + } + else + { + xx = x = bmpOffsetX; + yy = y = b->GetY() + _checkDeltaY; + } + + if(convertScrolled) + CalcScrolledPosition(x, y, &xx, &yy); + + dc.DrawBitmap(*bmp, xx, yy, true); +} + +#endif // #if(CHECKBOXVIEW) + +void wxTreeMultiCtrl::OnKey(wxKeyEvent &event) +{ + // check if we need to traverse to upper or lower + // control in the list + if(event.GetKeyCode() == WXK_TAB) + { + wxTreeMultiItem item = GetFocus(); + if(item.IsOk()) + { + // traverse down direction + if(!event.ShiftDown()) + item = FindNextVisibleWindowItem(item.GetItem()); + //else // traverse in up direction + // item = FindPreviousVisibleWindowItem(item); + + if(item.IsOk()) + { + TreeMultiItemWindow *w = item.GetItem()->IsTreeMultiItemWindow(); + if(w) + { + wxWindow *wnd = w->GetWindow(); + wnd->SetFocus(); + } + } + } + } + else + event.Skip(); +} + +void wxTreeMultiCtrl::OnMouseClick( wxMouseEvent &event ) +{ + // react on double click and left mouse down + if(event.LeftDown() || event.LeftDClick()) + { + // get translation point + wxPoint pt( event.GetPosition() ); + + int x = 0, y = 0; + CalcUnscrolledPosition( pt.x, pt.y, &x, &y ); + + // go check if we clicked a treenode + int flags; + wxPoint p(x,y); + wxTreeMultiItem id = HitTest(p, flags); + +#if(CHECKBOXVIEW) + if(flags == wxTMC_HITTEST_CHECKBOX) + { + // toggle the checkbox, and redraw + if(id.IsOk()) + { + TreeMultiItemBase *b = id.GetItem(); + b->SetCheckboxState((b->GetCheckboxState()+1) & 0x1); + + TreeMultiItemWindow *w = b->IsTreeMultiItemWindow(); + if(w) + { + // try to force a focus on the window. This could + // be extended by searching for the first edit control + // class but for now, just a focus is tried. + w->GetWindow()->Enable(b->GetCheckboxState() == 1); + w->GetWindow()->SetFocus(); + + // draw the checkbox in the state needed + wxClientDC dc(this); + DrawCheckbox(b, dc, true); + + // TODO: determine if the upper parents should be + // tristated or not + + ScanTristateCheckstates(b); + + } + else if(b->IsTreeMultiItemNode()) + { + // descend to all the children and set the state of the parent + SetRecursiveCheckState((TreeMultiItemNode *)b, b->GetCheckboxState() == 1); + RedrawFromNode((TreeMultiItemNode *)b); + } + } + } + else +#endif // #if(CHECKBOXVIEW) + { + // react on left mouse button, to fold and on + // right for caption doubleclick + int area = -1; + +// adjust behaviour for Linux (single click = always fold) +#ifndef LINUX + if(event.LeftDClick()) + area = wxTMC_HITTEST_CAPTION; + else + area = wxTMC_HITTEST_GUTTER; +#else + area = flags; +#endif + +// Linux (single or double click -> always fold + if (id.IsOk()) + { +#ifdef LINUX + // we have a valid item, if it is a node, then fold + TreeMultiItemNode *n = id.GetItem()->IsTreeMultiItemNode(); + if(n) + { + this->SelectItem(id); + Fold(n, !n->IsExpanded()); + } /* if */ +#else + if (event.LeftDown()) + if (flags == wxTMC_HITTEST_GUTTER) + { + TreeMultiItemNode *n = id.GetItem()->IsTreeMultiItemNode(); // for some reasons also windows may have set the flag + + if (n != NULL) + Fold(n, !n->IsExpanded()); + } /* if */ + else if (flags == wxTMC_HITTEST_CAPTION) + { + TreeMultiItemNode *n = id.GetItem()->IsTreeMultiItemNode(); // for some reasons also windows may have set the flag + + if (n != NULL) + { + this->SelectItem(id); + this->RedrawFromNode(n); + } /* if */ + } /* if */ +#endif + } /* if */ + else + this->UnselectAll(); + } + } +} + +void wxTreeMultiCtrl::OnRightMouseClick(wxMouseEvent& Event) +{ + if (Event.RightDown()) + if (Event.Dragging()) + this->UnselectAll(); + else + { + // variable definitions: + int Flags; + wxPoint Point; + + // translate mouse coordinates: + CalcUnscrolledPosition(Event.GetPosition().x,Event.GetPosition().y,&(Point.x),&(Point.y)); + // check if the mouse is above the caption of an item: + wxTreeMultiItem Item(this->HitTest(Point,Flags)); // variable definition and initialization + + if (Item.IsOk() && (Flags == wxTMC_HITTEST_CAPTION)) + { + this->SelectItem(Item); + this->RedrawFromNode(Item.GetItem()->IsTreeMultiItemNode()); + Event.Skip(); // window will convert right mouse click to a context menu event or proceed with + // a right mouse click event if the context menu event cannot be processed + } /* if */ + else + this->UnselectAll(); + } /* if */ + else + this->UnselectAll(); +} /* wxTreeMultiCtrl::OnRightMouseClick(wxMouseEvent&) */ + +wxTreeMultiItem wxTreeMultiCtrl::HitTest(wxPoint const& pt, int &flags) +{ + // scan all nodes to see which one matches + TreeMultiItemBase *b = 0; + for(int i = 0; i < _root.GetNodeCount() && !b; i++) + b = FindNodeByPoint(_root.GetNode(i), pt, flags); + + if(!b) + { + // none found, reset + flags = 0; + return wxTreeMultiItem(0); + } + + // return an item + return wxTreeMultiItem(b); +} + +TreeMultiItemBase *wxTreeMultiCtrl::FindNodeByPoint(TreeMultiItemBase *b, wxPoint const& pt, int &area) +{ + wxCHECK(b, 0); + + // if this layer is not visible, return with nothing. + if(!b->IsVisible()) + return 0; + + area = 0; + + // now see if our y is matching the mouse + if(pt.y >= b->GetY() && pt.y < (b->GetY() + b->GetHeight())) + { +#if(CHECKBOXVIEW) + // if we are checkboxed, calculate the checkbox position + if(b->GetCheckbox()) + { + int extraSpacing = 0, extraWidth = 0; + + // now for a windows item, this is minus the gutter. For a normal node it is X minus checkbox + if(b->IsTreeMultiItemWindow()) + { + extraWidth = _checkWidth; + extraSpacing = ((TreeMultiItemWindow *)b)->GetFrontSpacing(); + } + else + extraSpacing = 4; + + if(pt.x > (b->GetX() - extraSpacing - _checkWidth) && pt.x < (b->GetX() - extraSpacing + extraWidth)) + { + area = wxTMC_HITTEST_CHECKBOX; + return b; + } + } +#endif + + // allrighty we have something, now where and what is it (look with x) + if(pt.x < b->GetX()) + area = wxTMC_HITTEST_GUTTER; + + /** \todo Match only the real part of the caption, window (we assume x > GetX() which is the rest) + HOWEVER the window probably doesn't propagate the click event back to the parent, so we might + leave it like this so the use can click behind a window so it will be selected. + */ + else + { + // inside area, return proper flag + if(b->IsTreeMultiItemNode()) + area = wxTMC_HITTEST_CAPTION; + else + area = wxTMC_HITTEST_WINDOW; + } + + return b; + } + else + { + // not found, let's try our children if we have some + TreeMultiItemNode *n = b->IsTreeMultiItemNode(); + if(n) + { + TreeMultiItemBase *bb = 0; + for(int i = 0; i < n->GetNodeCount() && !bb; i++) + bb = FindNodeByPoint(n->GetNode(i), pt, area); + + // keep returning result to caller + return bb; + } + } + + return 0; +} + +wxTreeMultiItem wxTreeMultiCtrl::GetFocus() +{ + wxWindow *wnd = wxWindow::FindFocus(); + + // now find window that holds this item. if not + // visible it cannot have focus (should not have) + + wxTreeMultiItem item = FindWindowNode(wnd); + if(item.IsOk() && item.GetItem()->IsVisible()) + return item; + + return wxTreeMultiItem(0); +} + +#if(CHECKBOXVIEW) + +void wxTreeMultiCtrl::SetRecursiveCheckState(TreeMultiItemNode *n, bool check) +{ + int state = 0; + if(check) + state++; + + // go check all kids on this level + for(int i = 0; i < n->GetNodeCount(); i++) + { + // check all the nodes, and go deeper + n->GetNode(i)->SetCheckboxState(state); + if(n->GetNode(i)->IsTreeMultiItemNode()) + SetRecursiveCheckState((TreeMultiItemNode *)n->GetNode(i), check); + } +} + +void wxTreeMultiCtrl::ScanTristateCheckstates(TreeMultiItemBase *b) +{ + // check from the parent on, all node entries and see if they are + // checked or cleared or scattered + TreeMultiItemNode *p = b->GetParent(); + + if(p && p->GetCheckbox()) + { + bool foundcheck = false, foundclear = false; + for(size_t i = 0; i < (size_t)p->GetNodeCount(); ++i) + { + // only evaluate when checkboxed + if(p->GetNode(i)->IsTreeMultiItemWindow() && p->GetNode(i)->GetCheckbox()) + { + // record instance of a cleared checkbox + if(!p->GetNode(i)->GetCheckboxState()) + foundclear = true; + // record instance of checked checkbox + if(p->GetNode(i)->GetCheckboxState() == 1) + foundcheck = true; + } + } + + // if we have both check and clear, go tristate + // if all clear, clear parent and if all set, then set parent + if(foundclear && !foundcheck) + p->SetCheckboxState(0); + else if(!foundclear && foundcheck) + p->SetCheckboxState(1); + else if(foundclear && foundcheck) + p->SetCheckboxState(2); + + //wxClientDC dc; + //DrawCheckbox(p, dc, false); + RedrawFromNode(p); + } +} + +#endif // #if(CHECKBOXVIEW) + +wxTreeMultiItem wxTreeMultiCtrl::InsertNode(TreeMultiItemNode* ParentPtr, size_t Position, wxString const& Caption, wxString const& Name) +{ + int extX, extY; + + TreeMultiItemNode* NodePtr(new TreeMultiItemNode(ParentPtr,Caption,Name)); // generate new node pointer + + + // continue with initializing the new node: +#if(CHECKBOXVIEW) + // if checkbox view is desired, tag this item as a checkbox + // and set the state as 'false' + NodePtr->SetCheckbox(_checkboxView); + NodePtr->SetCheckboxState(0); +#endif + // calculate the height and width + this->GetTextExtent(Caption,&extX,&extY,0,0,&(this->_captionFont)); + NodePtr->SetHeight(extY); + NodePtr->SetWidth(extX); + // finally, insert node: + if (Position < (size_t)ParentPtr->GetNodeCount()) + ParentPtr->InsertNode(NodePtr,Position); + else + ParentPtr->AddNode(NodePtr); + // return the newly created node: + return wxTreeMultiItem(NodePtr); +} /* wxTreeMultiCtrl::InsertNode(TreeMultiItemNode*, size_t, wxString const&, wxString const&) */ + +wxTreeMultiItem wxTreeMultiCtrl::InsertWindow(TreeMultiItemNode* ParentPtr, size_t Position, wxWindow* WindowPtr, wxString const& Name, wxTreeMultiWindowInfo const& Info, int Flags) +{ + int WindowFlags; + + TreeMultiItemWindow* NewWindowPtr = new TreeMultiItemWindow(ParentPtr,Name); // generate new window pointer + + + // get flags from passed variable "Flags"; in case this variable does not contain any flags use the window's information flags: + if (Flags != 0) + WindowFlags = Flags; + else + WindowFlags = Info.GetFlags(); + + // continue with initializing the new window: +#if(CHECKBOXVIEW) + // if checkbox view is desired, tag this item as a checkbox + // and set the state as 'false' + NewWindowPtr->SetCheckbox(_checkboxView); +#endif + // if style wants us to change background, set it to our background + if (WindowFlags & wxTMC_BG_ADJUST_ALL) + { + // go through all children of this window, and set the + // background of it (recursively) + this->SetWindowBackgroundColour(WindowPtr,this->GetBackgroundColour(),WindowFlags); + } /* if */ + + // set the spacing: + NewWindowPtr->SetTopSpacing(Info.GetTopSpacing()); +#if(CHECKBOXVIEW) + // make sure that the checkboxes are at least indented enough + if (this->_checkboxView) + NewWindowPtr->SetFrontSpacing(Info.GetFrontSpacing() + this->_checkWidth); + else +#endif + NewWindowPtr->SetFrontSpacing(Info.GetFrontSpacing()); + // assign finally the window: + NewWindowPtr->AssignWindow(WindowPtr); + +#if(CHECKBOXVIEW) + // set the checkbox state after the window is assigned + NewWindowPtr->SetCheckboxState(Info.GetDefaultCheckState()); +#endif + + // if the window is not visible, set hide flag + this->ShowTreeMultiWindow(NewWindowPtr,NewWindowPtr->IsVisible()); + + // finally, insert the newly constructed window: + if (Position < (size_t)ParentPtr->GetNodeCount()) + ParentPtr->InsertNode(NewWindowPtr,Position); + else + ParentPtr->AddNode(NewWindowPtr); + // return the newly created window: + return wxTreeMultiItem(NewWindowPtr); +} /* wxTreeMultiCtrl::InsertWindow(TreeMultiItemNode*, size_t, wxWindow*, wxString const&, wxTreeMultiWindowInfo const&, int) */ + +void wxTreeMultiCtrl::RedrawFromParentNode(TreeMultiItemBase *n) +{ + TreeMultiItemNode *p = 0; + if(n) + p = n->GetParent(); + + RedrawFromNode(p); +} + +void wxTreeMultiCtrl::RedrawFromNode(TreeMultiItemNode *n) +{ + static int recalcMutex = 0; + bool visible = true; + + if(recalcMutex > 0) + return; + + recalcMutex ++; + + // when node is not visible or excluded + // then don't redraw. + + if(n) + visible = n->IsVisible(); + + if(visible) + { + int h, h1,w, w1; + GetVirtualSize(&w, &h); + + UpdateAllWindowVisibility(); + RecalculateNodePositions(); + RecalculateVirtualSize(); + + // why is this needed? Because folding or collapsing can change + // the state. When the virtual area gets smaller, we need to keep + // the largest one and the other way atound. And since we do not + // know here we are folding or collapsing, we remember the biggest + GetVirtualSize(&w1, &h1); + + if(h1 > h) + h = h1; + + // only refresh the part from x,y down + if(n) + { + int x, y; + CalcScrolledPosition(n->GetX(), n->GetY(), &x, &y); + if(h - y > 0) + { + wxRect rect(0, y, w, h - y); + RefreshRect(rect); + } + else + Refresh(); + } + else + Refresh(); // do a full refresh + } + + recalcMutex --; +} + +void wxTreeMultiCtrl::RecalculateNodePositions() +{ + int currentY = _spacingY; + // go recursive on every node, and store the information in the node + + for(int i = 0; i < _root.GetNodeCount(); i++) + currentY += CalculateNodeDimensions(_root.GetNode(i), currentY, 0); +} + +int wxTreeMultiCtrl::CalculateNodeDimensions(TreeMultiItemBase *b, int currentY, int level) +{ + int gutter = (_gutterWidth * 2) + _iconWidth; + int y = 0, topSpacing = 0; + + // return same if no proper object + wxCHECK(b, 0); + +#if(CHECKBOXVIEW) + if(b->GetCheckbox()) + gutter += _checkWidth; +#endif + + // if we are not visible, skip recalculation and descending + if(b->IsVisible()) + { + b->SetY(currentY); + + // if level is 0, calculate with front gutter, else without + y = currentY + b->GetHeight(); + if(b->IsTreeMultiItemNode()) + { + TreeMultiItemNode *n = (TreeMultiItemNode *)b; + + if(level == 0) + b->SetX(gutter); + else + b->SetX(gutter + (level * (_gutterWidth + _iconWidth))); + + // now do children of this node + + for(int i = 0; i < n->GetNodeCount(); i++) + y += CalculateNodeDimensions(n->GetNode(i), y + _spacingY, level+1); + } + else if(b->IsTreeMultiItemWindow()) + { + TreeMultiItemWindow *w = (TreeMultiItemWindow *)b; + + if(level == 0) + b->SetX(gutter + w->GetFrontSpacing()); + else + b->SetX(_gutterWidth + (level * (_gutterWidth + _iconWidth)) + w->GetFrontSpacing()); + + topSpacing = w->GetTopSpacing(); + + // reposition the window + + wxWindow *wnd = w->GetWindow(); + if(wnd) + { + int x = 0, y = 0; + CalcScrolledPosition(w->GetX(), w->GetY(), &x, &y); + wnd->SetSize(x, y, w->GetWidth(), w->GetHeight()); + } + } + + if(y > 0) + return (y - currentY) + _spacingY + topSpacing; // return delta + else + return 0; + } + + return 0; // not visible, thus we skip calculations +} + +void wxTreeMultiCtrl::RecalculateSpanSizes() +{ + for(int i = 0; i < _root.GetNodeCount(); i++) + CalculateNodeSpanning(_root.GetNode(i)); +} + +void wxTreeMultiCtrl::CalculateNodeSpanning(TreeMultiItemBase *b) +{ + // return same if no proper object + wxCHECK2(b, return); + + if(b->IsTreeMultiItemNode()) + { + TreeMultiItemNode *n = (TreeMultiItemNode *)b; + + // now do children of this node + + for(int i = 0; i < n->GetNodeCount(); i++) + CalculateNodeSpanning(n->GetNode(i)); + } + else if(b->IsTreeMultiItemWindow()) + { + TreeMultiItemWindow *w = (TreeMultiItemWindow *)b; + wxWindow *wnd = w->GetWindow(); + if(wnd) + { + // if the window is spanning, we adjust the width to the max width of the control + if(w->GetHorizontalSpan()) + { + wxSize tmcsize = GetClientSize(); + int maxwidth = tmcsize.GetWidth() - w->GetX() - 8; // extract 3 for border + + wxSizer *sz = wnd->GetSizer(); + if(sz) + { + if(maxwidth < sz->GetMinSize().GetWidth()) + maxwidth = sz->GetMinSize().GetWidth(); + } + + // prevent a size of 0 + if(maxwidth < 1) + maxwidth = 1; + + // set the size + w->SetWidth(maxwidth); + wnd->SetSize(w->GetWidth(), w->GetHeight()); + + // layout by sizer (not sure if this is needed) + if(wnd->GetSizer()) + wnd->GetSizer()->Layout(); + } + } + } +} + +void wxTreeMultiCtrl::RecalculateVirtualSize() +{ + // go through all the nodes, and store the largest x and largest y + + int x = 0, y = 0; + RecalculateVirtualSizeFromNode(&_root, x, y); + + // now adjust virtual size + SetVirtualSize(x, y); + AdjustScrollbars(x, y); +} + +void wxTreeMultiCtrl::AdjustScrollbars(int x, int y) +{ + // adjust scrollbars + // courtesy of treectrlg.cpp + + y += WXTMC_PIXELS_PER_UNIT+2; // one more scrollbar unit + 2 pixels + x += WXTMC_PIXELS_PER_UNIT+2; // one more scrollbar unit + 2 pixels + int x_pos = GetScrollPos( wxHORIZONTAL ); + int y_pos = GetScrollPos( wxVERTICAL ); + SetScrollbars( WXTMC_PIXELS_PER_UNIT, WXTMC_PIXELS_PER_UNIT, x/WXTMC_PIXELS_PER_UNIT, + y/WXTMC_PIXELS_PER_UNIT, x_pos, y_pos, true ); +} + +void wxTreeMultiCtrl::RecalculateVirtualSizeFromNode(const TreeMultiItemNode *node, int &x, int &y) +{ + if(node->IsExcluded()) + return; + + // if calulate this node's dimensions + if(x < (node->GetWidth() + node->GetX())) + x = node->GetWidth() + node->GetX(); + + y = node->GetY() + node->GetHeight(); + + // if this node is collapsed, no subnodes are visible, else + // go through all subnodes as well, node needs to be included as well + if(node->IsExpanded()) + { + TreeMultiItemBase *b; + for(int i = 0; i < node->GetNodeCount(); i++) + { + b = node->GetNode(i); + + // calculate x and y + if(x < (b->GetWidth() + b->GetX())) + x = b->GetWidth() + b->GetX(); + + y = b->GetY() + b->GetHeight(); + + if(b->IsTreeMultiItemNode()) + RecalculateVirtualSizeFromNode((TreeMultiItemNode *)b, x, y); + } + } +} + +void wxTreeMultiCtrl::SetWindowBackgroundColour(wxWindow *wnd, const wxColour &col, int flags) +{ + if(wnd) + { + // if we cannot change a button, make sure all button + // classes are not changed + + wxButton *btn = wxDynamicCast(wnd, wxButton); + if(!btn || ((flags & wxTMC_BG_ADJUST_BTN) != 0)) + wnd->SetBackgroundColour(col); + + // get every window, and make the background equal to the given one + wxWindowListNode *node = wnd->GetChildren().GetFirst(); + while (node) + { + SetWindowBackgroundColour(node->GetData(), col, flags); + node = node->GetNext(); + } + } +} + +void wxTreeMultiCtrl::ShowTreeMultiWindow(TreeMultiItemWindow *window, bool show) +{ + // show or hide window + if(window && window->GetWindow()) + window->GetWindow()->Show(show); +} + +void wxTreeMultiCtrl::UpdateAllWindowVisibility() +{ + // all roots are visible, but what lies beneath ... who knows + for(int i = 0; i < _root.GetNodeCount(); i++) + UpdateTreeMultiWindowVisibility(_root.GetNode(i), true); +} + +void wxTreeMultiCtrl::UpdateTreeMultiWindowVisibility(TreeMultiItemBase *b, bool show) +{ + if(b) + { + // this is done for performance issues. IsVisible can go all + // the way up the tree to check. However if show is already + // false, there is no need to check (some higher one is collapsed) + bool showMe = show; + + if(showMe) + showMe = b->IsVisible(); + + if(b->IsTreeMultiItemWindow()) + { + // if this level must be hidden, hide + ShowTreeMultiWindow((TreeMultiItemWindow*)b, showMe); + } + else if(b->IsTreeMultiItemNode()) + { + TreeMultiItemNode *node = (TreeMultiItemNode *)b; + + // if hidden, descend and hide all windows + for(int i = 0; i < node->GetNodeCount(); i++) + UpdateTreeMultiWindowVisibility(node->GetNode(i), showMe); + } + } +} + +wxTreeMultiItem wxTreeMultiCtrl::FindItem(const wxTreeMultiItem &item, const wxString &name, bool ignoreCase, bool skipFirst) +{ + if(item.IsOk()) + { + TreeMultiItemBase *b = item.GetItem(); + + // check this item first (or not) + + if(!skipFirst) + { + if(b->GetName().IsSameAs(name, !ignoreCase)) + return wxTreeMultiItem(b); + } + + if(b->IsTreeMultiItemNode()) + { + // now check whether we are a node, then go check children + + TreeMultiItemNode *n = (TreeMultiItemNode *)b; + wxTreeMultiItem result(0); + for(int i = 0; i < n->GetNodeCount() && !result.IsOk(); i++) + result = FindItem(wxTreeMultiItem(n->GetNode(i)), name, ignoreCase, false); + + return result; + } + } + + return wxTreeMultiItem(0); +} + +wxTreeMultiItem wxTreeMultiCtrl::FindWindowNode(wxWindow *wnd, TreeMultiItemNode *n) +{ + wxCHECK(wnd, wxTreeMultiItem(0)); + + // take root node if not assigned one + + if(!n) + n = (TreeMultiItemNode *)&_root; + + // check on this level for the wxWindow pointer + + TreeMultiItemWindow *w; + wxTreeMultiItem result(0); + for(int i = 0; i < n->GetNodeCount() && !result.IsOk(); i++) + { + // if window node + w = n->GetNode(i)->IsTreeMultiItemWindow(); + if(w && w->GetWindow() == wnd) + return wxTreeMultiItem(n); + + // if node, go deeper + if(n->GetNode(i)->IsTreeMultiItemNode()) + result = FindWindowNode(wnd, (TreeMultiItemNode*)n->GetNode(i)); + } + + return result; +} + +TreeMultiItemWindow *wxTreeMultiCtrl::FindNextVisibleWindowItem(TreeMultiItemBase *b, int index) +{ + wxCHECK(b, 0); + + // check on this level, go deeper with every node we got. When a node is not + // visible anymore, skip the node. + + TreeMultiItemWindow *value = 0; + if(b->IsVisible()) + { + // if we are already searching on a node with an index + + TreeMultiItemBase *bn = 0; + TreeMultiItemNode *n = b->IsTreeMultiItemNode(); + if(n) + { + for(int i = index + 1; i < n->GetNodeCount() && !value; i++) + { + bn = n->GetNode(i); + value = bn->IsTreeMultiItemWindow(); + + // assume a node, root when not a a window + if(!value) + value = FindNextVisibleWindowItem(bn, -1); + } + + } + else + { + if(b->IsTreeMultiItemWindow()) + { + // get parent first, and locate child as ptr + TreeMultiItemNode *p = b->GetParent(); + wxCHECK(p, 0); + + // go scan the parent from the given index, if + // the index is valid else there is no child with that index + + int idx = p->Index(b); + wxCHECK(idx >= 0, 0); + + value = FindNextVisibleWindowItem(p, idx); + } + } + } + + return value; + +} + +bool wxTreeMultiCtrl::GetBooleanValue(int wndId) +{ + wxWindow *wnd = wxWindow::FindWindow(wndId); + wxCHECK(wnd, false); + + // try a radio button + wxRadioButton *b = wxDynamicCast(wnd, wxRadioButton); + if(b) + return b->GetValue(); + + // try a check box + wxCheckBox *c = wxDynamicCast(wnd, wxCheckBox); + if(c) + return c->GetValue(); + + /** \todo For custom controls we should put something in wxMultiTreeItemData class + which can be overridden to retrieve the boolean value. It will also be passed + the pointer to the window, so the derived class can figure out how to get a boolean + value. + */ + + // generate assert or just return with false + wxCHECK(0, false); +} + +void wxTreeMultiCtrl::SetBooleanValue(int wndId, bool value) +{ + wxWindow *wnd = wxWindow::FindWindow(wndId); + wxCHECK2(wnd, return); + + // try a radio button + wxRadioButton *b = wxDynamicCast(wnd, wxRadioButton); + if(b) + { + b->SetValue(value); + return; + } + + // try a check box + wxCheckBox *c = wxDynamicCast(wnd, wxCheckBox); + if(c) + { + c->SetValue(value); + return; + } + + /** \todo For custom controls we should put something in wxMultiTreeItemData class + which can be overridden to retrieve the boolean value. It will also be passed + the pointer to the window, so the derived class can figure out how to get a boolean + value. + */ + + // generate assert + wxCHECK2(0, return); +} + +void wxTreeMultiCtrl::SetTextValue(int wndId, const wxString &value) +{ + wxWindow *wnd = wxWindow::FindWindow(wndId); + wxCHECK2(wnd, return); + + // try a radio button + wxTextCtrl *t = wxDynamicCast(wnd, wxTextCtrl); + if(t) + { + t->SetValue(value); + return; + } + + /** \todo For custom controls we should put something in wxMultiTreeItemData class + which can be overridden to retrieve the boolean value. It will also be passed + the pointer to the window, so the derived class can figure out how to get a boolean + value. + */ + + // generate assert + wxCHECK2(0, return); +} + +wxString wxTreeMultiCtrl::GetTextValue(int wndId) +{ + wxWindow *wnd = wxWindow::FindWindow(wndId); + wxCHECK(wnd, wxEmptyString); + + // try a radio button + wxTextCtrl *t = wxDynamicCast(wnd, wxTextCtrl); + if(t) + return t->GetValue(); + + // try a choice box + wxChoice *c1 = wxDynamicCast(wnd, wxChoice); + if(c1) + return c1->GetStringSelection(); + + // try a combo box + wxComboBox *c2 = wxDynamicCast(wnd, wxComboBox); + if(c2) + return c2->GetStringSelection(); + + // try a listbox + wxListBox *l = wxDynamicCast(wnd, wxListBox); + if(l) + return l->GetStringSelection(); + + /** \todo For custom controls we should put something in wxMultiTreeItemData class + which can be overridden to retrieve the boolean value. It will also be passed + the pointer to the window, so the derived class can figure out how to get a boolean + value. + */ + + // generate assert or just return with string + wxCHECK(0, wxEmptyString); +} + +int wxTreeMultiCtrl::GetSelectionValue(int wndId) +{ + wxWindow *wnd = wxWindow::FindWindow(wndId); + wxCHECK(wnd, -1); + + // try a choice box + wxChoice *c1 = wxDynamicCast(wnd, wxChoice); + if(c1) + return c1->GetSelection(); + + // try a combo box + wxComboBox *c2 = wxDynamicCast(wnd, wxComboBox); + if(c2) + return c2->GetSelection(); + + // try a listbox + wxListBox *l = wxDynamicCast(wnd, wxListBox); + if(l) + return l->GetSelection(); + + /** \todo For custom controls we should put something in wxMultiTreeItemData class + which can be overridden to retrieve the boolean value. It will also be passed + the pointer to the window, so the derived class can figure out how to get a boolean + value. + */ + + // generate assert or just return with string + wxCHECK(0, -1); +} + +void wxTreeMultiCtrl::GetSelectionValues(int wndId, wxArrayInt &sels) +{ + sels.Clear(); + + wxWindow *wnd = wxWindow::FindWindow(wndId); + wxCHECK2(wnd, return); + + // try a listbox + wxListBox *l = wxDynamicCast(wnd, wxListBox); + if(l) + { + l->GetSelections(sels); + return; + } + + /** \todo For custom controls we should put something in wxMultiTreeItemData class + which can be overridden to retrieve the boolean value. It will also be passed + the pointer to the window, so the derived class can figure out how to get a boolean + value. + */ + + // generate assert or just return with string + wxCHECK2(0, return); +} + +void wxTreeMultiCtrl::SetSelectionValue(int wndId, int sel) +{ + wxWindow *wnd = wxWindow::FindWindow(wndId); + wxCHECK2(wnd, return); + + // try a choice box + wxChoice *c1 = wxDynamicCast(wnd, wxChoice); + if(c1) + { + c1->SetSelection(sel); + return; + } + + // try a combo box + wxComboBox *c2 = wxDynamicCast(wnd, wxComboBox); + if(c2) + { + c2->SetSelection(sel); + return; + } + + // try a listbox + wxListBox *l = wxDynamicCast(wnd, wxListBox); + if(l) + { + l->SetSelection(sel); + return; + } + + /** \todo For custom controls we should put something in wxMultiTreeItemData class + which can be overridden to retrieve the boolean value. It will also be passed + the pointer to the window, so the derived class can figure out how to get a boolean + value. + */ + + // generate assert or just return with string + wxCHECK2(0, return); +} + + +wxTreeMultiItem wxTreeMultiCtrl::GetParent(wxTreeMultiItem const& item) const +{ + // check if valid or root item has been passed, both do not have parents: + if (!(item.IsOk()) || item.GetItem()->IsTreeMultiItemRoot()) + return wxTreeMultiItem(); + else + return wxTreeMultiItem(item.GetItem()->GetParent()); // GetParent() returns a valid pointer in case of a root item!! + // therefore, the check if the passed item is a root item is necessary +} /* wxTreeMultiCtrl::GetParent(wxTreeMultiItem const& item) const */ + +wxTreeMultiItem wxTreeMultiCtrl::GetFirstChild(const wxTreeMultiItem &item, int &cookie) const +{ + if(item.IsNodeItem()) + { + TreeMultiItemNode *n = (TreeMultiItemNode *)item.GetItem(); + + if(n->GetNodeCount() > 0) + { + cookie = 0; + return wxTreeMultiItem(n->GetNode(0)); + } + } + + // no children or no valid node + cookie = -1; + return wxTreeMultiItem(0); +} + +wxTreeMultiItem wxTreeMultiCtrl::GetNextChild(const wxTreeMultiItem &item, int &cookie) const +{ + if(item.IsNodeItem()) + { + TreeMultiItemNode *n = (TreeMultiItemNode *)item.GetItem(); + + if(cookie >= 0 && cookie < (n->GetNodeCount()-1)) + { + // increment cookie, return node + cookie ++; + return wxTreeMultiItem(n->GetNode(cookie)); + } + } + + // end of query, or no valid node + cookie = -1; + return wxTreeMultiItem(0); +} + +wxTreeMultiItem wxTreeMultiCtrl::GetLastChild(const wxTreeMultiItem &item) const +{ + if(item.IsNodeItem()) + { + TreeMultiItemNode *n = (TreeMultiItemNode *)item.GetItem(); + + if(n->GetNodeCount() > 0) + return wxTreeMultiItem(n->GetNode(n->GetNodeCount()-1)); + } + + return wxTreeMultiItem(0); +} + +wxTreeMultiItem wxTreeMultiCtrl::GetNextSibling(wxTreeMultiItem const& item) const +{ + // check if a valid item has been passed: + if (!(item.IsOk())) + return wxTreeMultiItem(); + + TreeMultiItemNode* ParentPtr(item.GetItem()->GetParent()); + + + if (ParentPtr != NULL) // the parent pointer is only null if the passed item is the root + { + // find the current item in the parent's list; the next sibling has an index that is one higher than the one of the current item: + int NextItemIndex(ParentPtr->Index(item.GetItem())+1); // variable definition and initialization + + if (NextItemIndex < ParentPtr->GetNodeCount()) + return ParentPtr->GetNode(NextItemIndex); + else + return wxTreeMultiItem(); + } /* if */ + else + return wxTreeMultiItem(); +} /* wxTreeMultiCtrl::GetNextSibling(wxTreeMultiItem const&) const */ + +wxTreeMultiItem wxTreeMultiCtrl::GetPrevSibling(wxTreeMultiItem const& item) const +{ + // check if a valid item has been passed: + if (!(item.IsOk())) + return wxTreeMultiItem(); + + TreeMultiItemNode* ParentPtr(item.GetItem()->GetParent()); + + + if (ParentPtr != NULL) + { + // find the current item in the parent's list; the next sibling has an index that is one higher than the one of the current item: + int PrevItemIndex(ParentPtr->Index(item.GetItem())-1); // variable definition and initialization + + if (PrevItemIndex >= 0) + return ParentPtr->GetNode(PrevItemIndex); + else + return wxTreeMultiItem(); + } /* if */ + else + return wxTreeMultiItem(); +} /* wxTreeMultiCtrl::GetPrevSibling(wxTreeMultiItem const&) const */ + +wxTreeMultiItem wxTreeMultiCtrl::GetNext(wxTreeMultiItem const& item) const +{ + // check if a valid item has been passed: + if (!(item.IsOk())) + return wxTreeMultiItem(); + + TreeMultiItemNode* NodePtr(item.GetItem()->IsTreeMultiItemNode()); // variable definition and initialization + + if ((NodePtr != NULL) && (NodePtr->GetNodeCount() > 0)) + return wxTreeMultiItem(NodePtr->First()); + else + { + // variable definitions and initializations: + wxTreeMultiItem Parent(item); + wxTreeMultiItem Sibling; + + do + { + Sibling = this->GetNextSibling(Parent); // try to find next sibling + Parent = this->GetParent(Parent); // get next ancestor + } while (!(Sibling.IsOk()) && Parent.IsOk()); + // in case the loop ended with Sibling.IsOk() "Sibling" contains a valid sibling otherwise an invalid + return Sibling; + } /* if */ +} /* wxTreeMultiCtrl::GetNextSibling(wxTreeMultiItem const&) const */ + +wxTreeMultiItem wxTreeMultiCtrl::GetPrevious(wxTreeMultiItem const& item) const +{ + // check if a valid item has been passed: + if (!(item.IsOk())) + return wxTreeMultiItem(); + + TreeMultiItemNode* NodePtr(item.GetItem()->IsTreeMultiItemNode()); // variable definition and initialization + + if ((NodePtr != NULL) && (NodePtr->GetNodeCount() > 0)) + return wxTreeMultiItem(NodePtr->Last()); + else + { + // variable definitions and initializations: + wxTreeMultiItem Parent(item); + wxTreeMultiItem Sibling; + + do + { + Sibling = this->GetPrevSibling(Parent); // try to find next sibling + Parent = this->GetParent(Parent); // get next ancestor + } while (!(Sibling.IsOk()) && Parent.IsOk()); + // in case the loop ended with Sibling.IsOk() "Sibling" contains a valid sibling otherwise an invalid + return Sibling; + } /* if */ +} /* wxTreeMultiCtrl::GetPrevious(wxTreeMultiItem const&) const */ + +// WDR: handler implementations for wxTreeMultiCtrl + +void wxTreeMultiCtrl::OnDraw(wxDC& dc) +{ + // go recursive and draw the whole visible tree. + dc.SetFont(_captionFont); + for(int i = 0; i < _root.GetNodeCount(); i++) + DrawNode(_root.GetNode(i), dc); +} /* */ diff --git a/kernel/src/ThirdParty/wx/treemultictrl/wxTreeMultiCtrl.h b/kernel/src/ThirdParty/wx/treemultictrl/wxTreeMultiCtrl.h index d997e3e..e2c2123 100644 --- a/kernel/src/ThirdParty/wx/treemultictrl/wxTreeMultiCtrl.h +++ b/kernel/src/ThirdParty/wx/treemultictrl/wxTreeMultiCtrl.h @@ -1,11 +1,11 @@ -//--------------------------------------------------------------------------- -// $RCSfile: wxTreeMultiCtrl.h,v $ -// $Source: /cvs/creatis/bbtk/kernel/src/ThirdParty/wx/treemultictrl/wxTreeMultiCtrl.h,v $ -// $Revision: 1.1 $ -// $Date: 2008/03/28 13:42:19 $ -//--------------------------------------------------------------------------- -// Author: Jorgen Bodde -// Copyright: (c) Jorgen Bodde +//--------------------------------------------------------------------------- +// $RCSfile: wxTreeMultiCtrl.h,v $ +// $Source: /cvs/creatis/bbtk/kernel/src/ThirdParty/wx/treemultictrl/wxTreeMultiCtrl.h,v $ +// $Revision: 1.2 $ +// $Date: 2009/10/05 22:44:50 $ +//--------------------------------------------------------------------------- +// Author: Jorgen Bodde +// Copyright: (c) Jorgen Bodde // License: wxWidgets License //--------------------------------------------------------------------------- @@ -184,13 +184,13 @@ public: wxTreeMultiItem(TreeMultiItemBase *ptr) { _item = ptr; - }; - - // Returns the TreeMultiItemBase class. This shoult *NOT* be - // used if you don't know what you are doing! This means never use it. */ - TreeMultiItemBase *GetItem() const { - return _item; - }; + }; + + // Returns the TreeMultiItemBase class. This shoult *NOT* be + // used if you don't know what you are doing! This means never use it. */ + TreeMultiItemBase *GetItem() const { + return _item; + }; #endif // _NO_DOXYGEN_ @@ -198,21 +198,21 @@ public: classes from the wxTreeMultiCtrl. */ void operator=(const wxTreeMultiItem &item) { - _item = item._item; - }; - - /** Equality operator. It returns true if the items are identical or if both items are invalid. */ - bool operator==(wxTreeMultiItem const& item) const {return (this->GetItem() == item.GetItem());} - - /** Inequality operator. It returns true if the items are different or one of them is invalid. */ - bool operator!=(wxTreeMultiItem const& item) const {return (this->GetItem() != item.GetItem());} - - /** Returns the parent of the current wxTreeMultiItem. This means the wxTreeMultiNode is returned. It can - be useful to check or clear the checkbox at this level. */ - wxTreeMultiItem GetParent() const{ - wxCHECK(IsOk(), wxTreeMultiItem(0)); - return wxTreeMultiItem(_item->GetParent()); - }; + _item = item._item; + }; + + /** Equality operator. It returns true if the items are identical or if both items are invalid. */ + bool operator==(wxTreeMultiItem const& item) const {return (this->GetItem() == item.GetItem());} + + /** Inequality operator. It returns true if the items are different or one of them is invalid. */ + bool operator!=(wxTreeMultiItem const& item) const {return (this->GetItem() != item.GetItem());} + + /** Returns the parent of the current wxTreeMultiItem. This means the wxTreeMultiNode is returned. It can + be useful to check or clear the checkbox at this level. */ + wxTreeMultiItem GetParent() const{ + wxCHECK(IsOk(), wxTreeMultiItem(0)); + return wxTreeMultiItem(_item->GetParent()); + }; /** Validates if the wxTreeMultiItem is a valid instance to use in the wxTreeMultiCtrl. Returns TRUE when there is a member value is associated with it, or FALSE when not. This value can also be checked when this class is returned from a wxTreeMultiCtrl operation. For example: @@ -288,32 +288,32 @@ public: Use wxTreeMultiCtrl::GetExcludedParent() to get the node that hides this one. */ bool IsExcluded() { wxCHECK(_item, false); - return _item->IsExcluded(); - } - - /** Returns true if the item is selected. - Please note that currently only nodes can be selected. - */ - bool IsSelected(void) const - { - wxCHECK(this->GetItem(),false); - return this->GetItem()->IsSelected(); - } - /** Returns true if this node is visible. Please note that when this node is a child node of a collapsed - node, it is not visible. Also if this node is a child node of an excluded node, it is also not visible. - It does NOT return false when it's drawn somewhere outside of the visible area. */ + return _item->IsExcluded(); + } + + /** Returns true if the item is selected. + Please note that currently only nodes can be selected. + */ + bool IsSelected(void) const + { + wxCHECK(this->GetItem(),false); + return this->GetItem()->IsSelected(); + } + /** Returns true if this node is visible. Please note that when this node is a child node of a collapsed + node, it is not visible. Also if this node is a child node of an excluded node, it is also not visible. + It does NOT return false when it's drawn somewhere outside of the visible area. */ bool IsVisible() { wxCHECK(_item, false); return _item->IsVisible(); } - -}; - -WX_DECLARE_OBJARRAY(wxTreeMultiItem,wxArrayTreeMultiItem); - -/** \class wxTreeMultiWindowInfo - \ingroup classes - \brief This class contains information for every Window node to be added. + +}; + +WX_DECLARE_OBJARRAY(wxTreeMultiItem,wxArrayTreeMultiItem); + +/** \class wxTreeMultiWindowInfo + \ingroup classes + \brief This class contains information for every Window node to be added. This class can be used to modify the behaviour of the Window node to be added, and can be reused to pass along upon every wxTreeMultiCtrl::AppendWindow call. For example: @@ -362,25 +362,25 @@ private: #if(CHECKBOXVIEW) /** Checkstate for checkboxed property sheets */ bool _checkState; -#endif - -public: -#if(CHECKBOXVIEW) - wxTreeMultiWindowInfo(int flags, int frontSpacing, int topSpacing, bool checkState = false) - : _flags(flags) - , _frontSpacing(frontSpacing) - , _frontSpacingOrg(frontSpacing) - , _topSpacing(topSpacing) - , _checkState(checkState) -#else - wxTreeMultiWindowInfo(int flags, int frontSpacing, int topSpacing) - : _flags(flags) - , _frontSpacing(frontSpacing) - , _frontSpacingOrg(frontSpacing) - , _topSpacing(topSpacing) -#endif - { - // constructor +#endif + +public: +#if(CHECKBOXVIEW) + wxTreeMultiWindowInfo(int flags, int frontSpacing, int topSpacing, bool checkState = false) + : _flags(flags) + , _frontSpacing(frontSpacing) + , _frontSpacingOrg(frontSpacing) + , _topSpacing(topSpacing) + , _checkState(checkState) +#else + wxTreeMultiWindowInfo(int flags, int frontSpacing, int topSpacing) + : _flags(flags) + , _frontSpacing(frontSpacing) + , _frontSpacingOrg(frontSpacing) + , _topSpacing(topSpacing) +#endif + { + // constructor } /** Adds indent to original front spacing and increments it with that value (quick extra indent). The original value of FrontSpacing (see SetFrontSpacing() gets indented by multiplying @@ -574,22 +574,22 @@ private: bool _checkboxView; /** Height and weight for checkbox */ - int _checkHeight, _checkWidth; -#endif - - /** brush for highlighting nodes */ - wxBrush* m_HilightBrush; - - /** This captionFont is made equal to the font of the wxScrolledWindow. As extra the bold face - is set on it when this is wanted by the user (see flags) */ - wxFont _captionFont; - - /** list of selected items */ - wxArrayTreeMultiItem m_SelectedItems; - - /** Does the actual collapsing / expanding. So that Expand and Collapse aren't using the same code twice */ - void DoFold(TreeMultiItemBase *item, bool expand, bool recursive); - + int _checkHeight, _checkWidth; +#endif + + /** brush for highlighting nodes */ + wxBrush* m_HilightBrush; + + /** This captionFont is made equal to the font of the wxScrolledWindow. As extra the bold face + is set on it when this is wanted by the user (see flags) */ + wxFont _captionFont; + + /** list of selected items */ + wxArrayTreeMultiItem m_SelectedItems; + + /** Does the actual collapsing / expanding. So that Expand and Collapse aren't using the same code twice */ + void DoFold(TreeMultiItemBase *item, bool expand, bool recursive); + /** Redraws and recalculates the nodes from the current node. It will also clear all 'dirty' flags when they are recalculated */ void RedrawFromNode(TreeMultiItemNode *n); @@ -632,31 +632,31 @@ private: /** Recalculates totally needed virtual size of the wxTreeMultiCtrl. It will scan for the largest window, with the biggest size, and report that back */ - void RecalculateVirtualSize(); - - /** Adjusts scrollbars in window, usually done after virtual size (x,y) is recalculated */ - using wxScrolledWindow::AdjustScrollbars; - virtual void AdjustScrollbars(int x, int y); - - /** Recalculates and accumulates largest x and y */ + void RecalculateVirtualSize(); + + /** Adjusts scrollbars in window, usually done after virtual size (x,y) is recalculated */ + using wxScrolledWindow::AdjustScrollbars; + virtual void AdjustScrollbars(int x, int y); + + /** Recalculates and accumulates largest x and y */ void RecalculateVirtualSizeFromNode(const TreeMultiItemNode *node, int &x, int &y); - - /** Scans for TreeMultiItemBase node that contains x,y and in area returns a hittest constant to - indicate what matched */ - TreeMultiItemBase *FindNodeByPoint(TreeMultiItemBase *b, wxPoint const& pt, int &area); - - /** Scans for TreeMultiItemWindow that holds the wxWindow pointer. Does not scan in panels or does - a deep search. Reason, this function is used to advance to next TreeMultiItemWindow for focus + + /** Scans for TreeMultiItemBase node that contains x,y and in area returns a hittest constant to + indicate what matched */ + TreeMultiItemBase *FindNodeByPoint(TreeMultiItemBase *b, wxPoint const& pt, int &area); + + /** Scans for TreeMultiItemWindow that holds the wxWindow pointer. Does not scan in panels or does + a deep search. Reason, this function is used to advance to next TreeMultiItemWindow for focus on this wxScrolledWindow. If a sub window is found, it will skip other windows on that same level */ wxTreeMultiItem FindWindowNode(wxWindow *wnd, TreeMultiItemNode *n = 0); /** Finds next visible window item in chain. If not found use FindFirstVisibleItem to start from the - beginning */ - TreeMultiItemWindow *FindNextVisibleWindowItem(TreeMultiItemBase *b, int index = -1); - - /** Adjust the centering of the bitmap icons (collapse / expand) when the caption font changes. They need to - be centered in the middle of the font, so a bit of deltaY adjustment is needed */ - void AdjustIconsDeltaY(); + beginning */ + TreeMultiItemWindow *FindNextVisibleWindowItem(TreeMultiItemBase *b, int index = -1); + + /** Adjust the centering of the bitmap icons (collapse / expand) when the caption font changes. They need to + be centered in the middle of the font, so a bit of deltaY adjustment is needed */ + void AdjustIconsDeltaY(); /** Calculate the spanning of the individual nodes */ void CalculateNodeSpanning(TreeMultiItemBase *b); @@ -669,47 +669,47 @@ private: will get tristate if the checked items are scattered (some are some aren't). If all nodes in this node are checked, the parent node gets checked all the way up to the last one that matches criteria. If all are cleared, parent node gets cleared */ - void ScanTristateCheckstates(TreeMultiItemBase *b); -#endif - - /** \name Private add and delete methods - @{ - */ - - /** Inserts a node into the parent's node at the specified position. - As this is a private method error checking is limited. Therefore, it has to be guaranteed that this method - is only called with a valid parent node pointer. - The position is zero based. In case the position is equal or larger than the current number of - parent's elements the new node is appended. - The newly inserted node is being returned. - */ - wxTreeMultiItem InsertNode(TreeMultiItemNode* ParentPtr, size_t Position, wxString const& Caption, wxString const& Name); - - /** Inserts a window into the parent's node at the specified position. - As this is a private method error checking is limited. Therefore, it has to be guaranteed that this method - is only called with a valid parent node and window pointer. - The position is zero based. In case the position is equal or larger than the current number of - parent's elements the new node is appended. - The newly inserted window is being returned. - */ - wxTreeMultiItem InsertWindow(TreeMultiItemNode* ParentPtr, size_t Position, wxWindow* WindowPtr, wxString const& Name, - wxTreeMultiWindowInfo const& Info, int Flags); - - /** @} - */ -private: - void Init(); - + void ScanTristateCheckstates(TreeMultiItemBase *b); +#endif + + /** \name Private add and delete methods + @{ + */ + + /** Inserts a node into the parent's node at the specified position. + As this is a private method error checking is limited. Therefore, it has to be guaranteed that this method + is only called with a valid parent node pointer. + The position is zero based. In case the position is equal or larger than the current number of + parent's elements the new node is appended. + The newly inserted node is being returned. + */ + wxTreeMultiItem InsertNode(TreeMultiItemNode* ParentPtr, size_t Position, wxString const& Caption, wxString const& Name); + + /** Inserts a window into the parent's node at the specified position. + As this is a private method error checking is limited. Therefore, it has to be guaranteed that this method + is only called with a valid parent node and window pointer. + The position is zero based. In case the position is equal or larger than the current number of + parent's elements the new node is appended. + The newly inserted window is being returned. + */ + wxTreeMultiItem InsertWindow(TreeMultiItemNode* ParentPtr, size_t Position, wxWindow* WindowPtr, wxString const& Name, + wxTreeMultiWindowInfo const& Info, int Flags); + + /** @} + */ +private: + void Init(); + // handlers //--------- - //virtual void OnDraw(wxDC& dc); - void OnPaint(wxPaintEvent &event); - void OnMouseClick (wxMouseEvent& event); - void OnRightMouseClick(wxMouseEvent& Event); - void OnKey(wxKeyEvent &event); - void OnSize(wxSizeEvent &event); - + //virtual void OnDraw(wxDC& dc); + void OnPaint(wxPaintEvent &event); + void OnMouseClick (wxMouseEvent& event); + void OnRightMouseClick(wxMouseEvent& Event); + void OnKey(wxKeyEvent &event); + void OnSize(wxSizeEvent &event); + /** Recalculates the spanning controls */ void RecalculateSpanSizes(); @@ -765,66 +765,66 @@ public: */ /** Adds a root node to the wxTreeMultiItem. There can be many root nodes. Use this wxTreeMultiNode pointer to add - more subnodes to it. */ - wxTreeMultiItem AddRoot(const wxString &caption, const wxString &name = wxEmptyString); - - /** Adds a window to the tree control. Use this wxTreeMultiItem method to add a window class to the - current wxTreeMultiItem. The wxTreeMultiItem must point to a Node class. If this is not the case - an empty wxTreeMultiItem is returned. The mask is used to override the mask settings of the - wxTreeMultiWindowInfo class. This can be handy to set or clear extra flags only needed for certain - situations */ - wxTreeMultiItem AppendWindow(const wxTreeMultiItem &ParentItem, wxWindow *window = NULL, const wxString &name = wxEmptyString, - wxTreeMultiWindowInfo const& info = wxTreeMultiWindowInfoDefault, int flags = 0); - - /** Adds a window to the tree control. Use this method to add a window class at the specified position - of the parent's wxTreeMultiItem. In case the position is smaller than the current number of children all elements - are shifted upwards, otherwise the new window is appended to the parent's wxTreeMultiItem. - The parent wxTreeMultiItem must point to a Node class. If this is not the case an - empty wxTreeMultiItem is returned. - */ - wxTreeMultiItem InsertWindow(wxTreeMultiItem const& ParentItem, size_t Position, wxWindow *window = NULL, wxString const& Name = wxEmptyString, - wxTreeMultiWindowInfo const& info = wxTreeMultiWindowInfoDefault, int flags = 0); - - /** Adds a window to the tree control. Use this method to add a window class as the first element - of the parent's wxTreeMultiItem. The parent wxTreeMultiItem must point to a Node class. If this is not the case an - empty wxTreeMultiItem is returned. - */ - wxTreeMultiItem PrependWindow(wxTreeMultiItem const& ParentItem, wxWindow *window = NULL, const wxString &name = wxEmptyString, - wxTreeMultiWindowInfo const& info = wxTreeMultiWindowInfoDefault, int flags = 0); - - /** Adds a node to the tree control. Use this wxTreeMultiItem method to add a recursive subnode class as the last element - of the parent's wxTreeMultiItem. The parent wxTreeMultiItem must point to a Node class. If this is not the case - an empty wxTreeMultiItem is returned. A node can contain multiple nodes or window classes */ - wxTreeMultiItem AppendNode(wxTreeMultiItem const& ParentItem, const wxString &caption = wxEmptyString, - const wxString &name = wxEmptyString); - - /** Adds a node to the tree control. Use this method to add a recursive subnode class at the specified position - of the parent's wxTreeMultiItem. In case the position is smaller than the current number of nodes all elements - are shifted upwards, otherwise the new node is appended to the parent's wxTreeMultiItem. - The parent wxTreeMultiItem must point to a Node class. If this is not the case an - empty wxTreeMultiItem is returned. A node can contain multiple nodes or window classes. - */ - wxTreeMultiItem InsertNode(wxTreeMultiItem const& ParentItem, size_t Position, wxString const& caption, wxString const& name); - - /** Adds a node to the tree control. Use this method to add a recursive subnode class as the first element - of the parent's wxTreeMultiItem. The parent wxTreeMultiItem must point to a Node class. If this is not the case an - empty wxTreeMultiItem is returned. A node can contain multiple nodes or window classes. - */ - wxTreeMultiItem PrependNode(wxTreeMultiItem const& ParentItem, wxString const& caption = wxEmptyString, - wxString const& name = wxEmptyString); - - /** Delete item from the tree control. Whenever it is present, delete it. If not, return false. After - deletion the wxTreeMultiItem is 0, thus IsOk will return false */ - bool Delete(wxTreeMultiItem &item); - - /** Deletes all the items from the wxTreeMultiCtrl. */ - void DeleteAllItems(void) - { - this->_root.Clear(); - this->m_SelectedItems.Clear(); - Refresh(); - }; - + more subnodes to it. */ + wxTreeMultiItem AddRoot(const wxString &caption, const wxString &name = wxEmptyString); + + /** Adds a window to the tree control. Use this wxTreeMultiItem method to add a window class to the + current wxTreeMultiItem. The wxTreeMultiItem must point to a Node class. If this is not the case + an empty wxTreeMultiItem is returned. The mask is used to override the mask settings of the + wxTreeMultiWindowInfo class. This can be handy to set or clear extra flags only needed for certain + situations */ + wxTreeMultiItem AppendWindow(const wxTreeMultiItem &ParentItem, wxWindow *window = NULL, const wxString &name = wxEmptyString, + wxTreeMultiWindowInfo const& info = wxTreeMultiWindowInfoDefault, int flags = 0); + + /** Adds a window to the tree control. Use this method to add a window class at the specified position + of the parent's wxTreeMultiItem. In case the position is smaller than the current number of children all elements + are shifted upwards, otherwise the new window is appended to the parent's wxTreeMultiItem. + The parent wxTreeMultiItem must point to a Node class. If this is not the case an + empty wxTreeMultiItem is returned. + */ + wxTreeMultiItem InsertWindow(wxTreeMultiItem const& ParentItem, size_t Position, wxWindow *window = NULL, wxString const& Name = wxEmptyString, + wxTreeMultiWindowInfo const& info = wxTreeMultiWindowInfoDefault, int flags = 0); + + /** Adds a window to the tree control. Use this method to add a window class as the first element + of the parent's wxTreeMultiItem. The parent wxTreeMultiItem must point to a Node class. If this is not the case an + empty wxTreeMultiItem is returned. + */ + wxTreeMultiItem PrependWindow(wxTreeMultiItem const& ParentItem, wxWindow *window = NULL, const wxString &name = wxEmptyString, + wxTreeMultiWindowInfo const& info = wxTreeMultiWindowInfoDefault, int flags = 0); + + /** Adds a node to the tree control. Use this wxTreeMultiItem method to add a recursive subnode class as the last element + of the parent's wxTreeMultiItem. The parent wxTreeMultiItem must point to a Node class. If this is not the case + an empty wxTreeMultiItem is returned. A node can contain multiple nodes or window classes */ + wxTreeMultiItem AppendNode(wxTreeMultiItem const& ParentItem, const wxString &caption = wxEmptyString, + const wxString &name = wxEmptyString); + + /** Adds a node to the tree control. Use this method to add a recursive subnode class at the specified position + of the parent's wxTreeMultiItem. In case the position is smaller than the current number of nodes all elements + are shifted upwards, otherwise the new node is appended to the parent's wxTreeMultiItem. + The parent wxTreeMultiItem must point to a Node class. If this is not the case an + empty wxTreeMultiItem is returned. A node can contain multiple nodes or window classes. + */ + wxTreeMultiItem InsertNode(wxTreeMultiItem const& ParentItem, size_t Position, wxString const& caption, wxString const& name); + + /** Adds a node to the tree control. Use this method to add a recursive subnode class as the first element + of the parent's wxTreeMultiItem. The parent wxTreeMultiItem must point to a Node class. If this is not the case an + empty wxTreeMultiItem is returned. A node can contain multiple nodes or window classes. + */ + wxTreeMultiItem PrependNode(wxTreeMultiItem const& ParentItem, wxString const& caption = wxEmptyString, + wxString const& name = wxEmptyString); + + /** Delete item from the tree control. Whenever it is present, delete it. If not, return false. After + deletion the wxTreeMultiItem is 0, thus IsOk will return false */ + bool Delete(wxTreeMultiItem &item); + + /** Deletes all the items from the wxTreeMultiCtrl. */ + void DeleteAllItems(void) + { + this->_root.Clear(); + this->m_SelectedItems.Clear(); + Refresh(); + }; + /** Deletes all children of the current node. The wxTreeMultiItem needs to be of type Node to do this. Call GetParentNode to get the parent wxTreeMultiItem which is always a node. */ void DeleteChildren(const wxTreeMultiItem &item); @@ -863,61 +863,61 @@ public: Collapse(item, false); }; - /** @} - */ - - /** @name Selection manipulation - These methods allow you to select, unselect or test wxTreeMultiItems on selection. - Currently only items of type Node can be manipulated. - @{ - */ - - /** Returns the number of selected items. */ - size_t GetSelectedItemCount(void) const {return this->m_SelectedItems.GetCount();} - - /** Returns the first selected item. - If there is no selected item an invalid tree multi item is returned. - */ - wxTreeMultiItem GetFirstSelectedItem(void) const; - - /** Returns the last selected item. - If there is no selected item an invalid tree multi item is returned. - */ - wxTreeMultiItem GetLastSelectedItem(void) const; - - /** Returns a selected item with the specified index. - If there is no selected item with the passed index an invalide tree multi item is returned. - */ - wxTreeMultiItem GetSelectedItem(size_t Index) const; - - /** Returns the index of the selected item. - In case the item is not selected "GetSelectedItemCount()" - which is an invalid index - is returned. - */ - size_t GetSelectedItemIndex(wxTreeMultiItem const& Item) const; - - /** Selects the specified item AND in case - - UnselectOthers is set all other selected items are going to be unselected; - - ExpandSelection is set all items between the last selected item and the passed item - are selected, too (in case there this is the first selection all items between the first root - and the passed item are selected). - If the passed item is already selected the other parameters are ignored. - Please not that currently only nodes can be selected, therefore, if any other item is passed nothing will happen. - */ - void SelectItem(wxTreeMultiItem const& Item, bool UnselectOthers=true, bool ExpandSelection=false); - - /** Unselect all selected items. */ - void UnselectAll(void); - - /** Unselect specified item */ - void Unselect(wxTreeMultiItem const& Item); - - /** @} - */ - - - /** \name Visibility manipulation - These methods allow you to manipulate a certain wxTreeMultiItem to temporarily exclude or to include - the node from drawing. Whenever it is excluded, all operations can still be performed, however + /** @} + */ + + /** @name Selection manipulation + These methods allow you to select, unselect or test wxTreeMultiItems on selection. + Currently only items of type Node can be manipulated. + @{ + */ + + /** Returns the number of selected items. */ + size_t GetSelectedItemCount(void) const {return this->m_SelectedItems.GetCount();} + + /** Returns the first selected item. + If there is no selected item an invalid tree multi item is returned. + */ + wxTreeMultiItem GetFirstSelectedItem(void) const; + + /** Returns the last selected item. + If there is no selected item an invalid tree multi item is returned. + */ + wxTreeMultiItem GetLastSelectedItem(void) const; + + /** Returns a selected item with the specified index. + If there is no selected item with the passed index an invalide tree multi item is returned. + */ + wxTreeMultiItem GetSelectedItem(size_t Index) const; + + /** Returns the index of the selected item. + In case the item is not selected "GetSelectedItemCount()" - which is an invalid index - is returned. + */ + size_t GetSelectedItemIndex(wxTreeMultiItem const& Item) const; + + /** Selects the specified item AND in case + - UnselectOthers is set all other selected items are going to be unselected; + - ExpandSelection is set all items between the last selected item and the passed item + are selected, too (in case there this is the first selection all items between the first root + and the passed item are selected). + If the passed item is already selected the other parameters are ignored. + Please not that currently only nodes can be selected, therefore, if any other item is passed nothing will happen. + */ + void SelectItem(wxTreeMultiItem const& Item, bool UnselectOthers=true, bool ExpandSelection=false); + + /** Unselect all selected items. */ + void UnselectAll(void); + + /** Unselect specified item */ + void Unselect(wxTreeMultiItem const& Item); + + /** @} + */ + + + /** \name Visibility manipulation + These methods allow you to manipulate a certain wxTreeMultiItem to temporarily exclude or to include + the node from drawing. Whenever it is excluded, all operations can still be performed, however the node may not be visible. @{ */ @@ -943,13 +943,13 @@ public: \li wxTMC_HITTEST_GUTTER If the front part of the item is clicked (where the node is) \li wxTMC_HITTEST_WINDOW If located in the window area \li wxTMC_HITTEST_CAPTION If located on the caption of the MultiTreeItemNode - - Returned is the item which is located under the mouse, or none (IsOk = false) if - no item under the mouse */ - wxTreeMultiItem HitTest(wxPoint const& pt, int &flags); - - /** @name Find methods - These methods are used for finding a node in the wxTreeMultiCtrl. + + Returned is the item which is located under the mouse, or none (IsOk = false) if + no item under the mouse */ + wxTreeMultiItem HitTest(wxPoint const& pt, int &flags); + + /** @name Find methods + These methods are used for finding a node in the wxTreeMultiCtrl. @{ */ @@ -1065,13 +1065,13 @@ public: #if(CHECKBOXVIEW) /** Gets the checkbox state of the wxTreeMultiItem pointed out by "item". If the item does not have a checkbox - associated (or the item is not ok), it will return -1. If the checkbox is checked it will return 1, - unchecked is 0, and tri-state (usually only for caption nodes) it will return 2. This needs USE_CHECKBOXVIEW - set to YES, or CHECKBOXVIEW=1 during compile*/ - int GetCheckboxState(const wxTreeMultiItem &item, bool WXUNUSED(recursive)) { - wxCHECK(item.IsOk(), -1); - - // return the checkbox state + associated (or the item is not ok), it will return -1. If the checkbox is checked it will return 1, + unchecked is 0, and tri-state (usually only for caption nodes) it will return 2. This needs USE_CHECKBOXVIEW + set to YES, or CHECKBOXVIEW=1 during compile*/ + int GetCheckboxState(const wxTreeMultiItem &item, bool WXUNUSED(recursive)) { + wxCHECK(item.IsOk(), -1); + + // return the checkbox state TreeMultiItemBase *b = item.GetItem(); if(b->GetCheckbox()) return b->GetCheckboxState(); @@ -1135,26 +1135,26 @@ public: #endif /** @} - */ - - /** @name Iteration methods - Allows the user to iterate through a wxTreeMultiCtrl node, and get all the children or siblings. - To start an iteration from the lowest level the functions GetFirstRoot and GetLastRoot are provided. - @{ - */ - - /** Returns the first root. */ - wxTreeMultiItem GetFirstRoot(void) const {return wxTreeMultiItem(this->_root.First());} - - /** Returns the last root. */ - wxTreeMultiItem GetLastRoot(void) const {return wxTreeMultiItem(this->_root.Last());} - - /** Returns the items parent. */ - wxTreeMultiItem GetParent(wxTreeMultiItem const& item) const; - - /** Returns the first child of this node. The type of wxTreeMultiItem needs to be of Node. Whenever not succesful, - the item returned is not ok (IsOk = false). Upon success, a valid child is returned. The cookie variable doesn't - need to be initialized */ + */ + + /** @name Iteration methods + Allows the user to iterate through a wxTreeMultiCtrl node, and get all the children or siblings. + To start an iteration from the lowest level the functions GetFirstRoot and GetLastRoot are provided. + @{ + */ + + /** Returns the first root. */ + wxTreeMultiItem GetFirstRoot(void) const {return wxTreeMultiItem(this->_root.First());} + + /** Returns the last root. */ + wxTreeMultiItem GetLastRoot(void) const {return wxTreeMultiItem(this->_root.Last());} + + /** Returns the items parent. */ + wxTreeMultiItem GetParent(wxTreeMultiItem const& item) const; + + /** Returns the first child of this node. The type of wxTreeMultiItem needs to be of Node. Whenever not succesful, + the item returned is not ok (IsOk = false). Upon success, a valid child is returned. The cookie variable doesn't + need to be initialized */ wxTreeMultiItem GetFirstChild(const wxTreeMultiItem &item, int &cookie) const; /** Returns the next child in the iteration on the level of 'item'. Make sure you called GetFirstChild first @@ -1162,33 +1162,33 @@ public: wxTreeMultiItem GetNextChild(const wxTreeMultiItem &item, int &cookie) const; /** Returns the last child of this node. The type of 'item' needs to be of Node. Whenever not succesful, - the item returned is not ok (IsOk = false). Upon success, a valid last child is returned. */ - wxTreeMultiItem GetLastChild(const wxTreeMultiItem &item) const; - - /** Returns the next sibling of the passed item. */ - wxTreeMultiItem GetNextSibling(wxTreeMultiItem const& item) const; - - /** Returns the previous sibling of the passed item. */ - wxTreeMultiItem GetPrevSibling(wxTreeMultiItem const& item) const; - - /** Returns the next item. "Next" is defined by the following order: - - in case the current item has a child it is the first child of the current item; - - in case the current item has a next sibling as the next sibling; - - as the parent's (or one of its ancestor's) next sibling. - */ - wxTreeMultiItem GetNext(wxTreeMultiItem const& item) const; - - /** Returns the previous item. "Previous" is defined by the following order: - - in case the current item has a child it is the last child of the current item; - - in case the current item has a previous sibling it is the previous sibling; - - as the parent's (or one of its ancestor's) previous sibling. - */ - wxTreeMultiItem GetPrevious(wxTreeMultiItem const& item) const; - - - /** @} - */ - + the item returned is not ok (IsOk = false). Upon success, a valid last child is returned. */ + wxTreeMultiItem GetLastChild(const wxTreeMultiItem &item) const; + + /** Returns the next sibling of the passed item. */ + wxTreeMultiItem GetNextSibling(wxTreeMultiItem const& item) const; + + /** Returns the previous sibling of the passed item. */ + wxTreeMultiItem GetPrevSibling(wxTreeMultiItem const& item) const; + + /** Returns the next item. "Next" is defined by the following order: + - in case the current item has a child it is the first child of the current item; + - in case the current item has a next sibling as the next sibling; + - as the parent's (or one of its ancestor's) next sibling. + */ + wxTreeMultiItem GetNext(wxTreeMultiItem const& item) const; + + /** Returns the previous item. "Previous" is defined by the following order: + - in case the current item has a child it is the last child of the current item; + - in case the current item has a previous sibling it is the previous sibling; + - as the parent's (or one of its ancestor's) previous sibling. + */ + wxTreeMultiItem GetPrevious(wxTreeMultiItem const& item) const; + + + /** @} + */ + /** @name Get and set methods These methods allow you to set or get certain properties of the wxTreeMultiCtrl. @{ @@ -1206,13 +1206,13 @@ public: beginning. */ void SetCaptionFont(const wxFont &font); - /** @} - */ - - void OnDraw(wxDC& dc); - -private: - DECLARE_EVENT_TABLE() -}; + /** @} + */ + + void OnDraw(wxDC& dc); + +private: + DECLARE_EVENT_TABLE() +}; #endif diff --git a/kernel/src/bbtkBlackBox.h b/kernel/src/bbtkBlackBox.h index 83c27b3..7969728 100644 --- a/kernel/src/bbtkBlackBox.h +++ b/kernel/src/bbtkBlackBox.h @@ -2,8 +2,8 @@ Program: bbtk Module: $RCSfile: bbtkBlackBox.h,v $ Language: C++ - Date: $Date: 2009/06/11 09:51:42 $ - Version: $Revision: 1.28 $ + Date: $Date: 2009/10/05 22:44:48 $ + Version: $Revision: 1.29 $ =========================================================================*/ /* --------------------------------------------------------------------- @@ -639,7 +639,10 @@ namespace bbtk /// The default implementation is to issue 'delete this' /// but it can be redefined in inherited classes to handle special deletion mechanisms (e.g. ref counting, private destructors, such as vtk objects deletion with method Delete, etc.). /// \return The number of remaining references on the object after the call (if meaningfull...): used by bbtk to warn a user if another smart pointing system is still holding the object... - virtual int bbDelete() { delete this; return 0; } + +//JCP 21-09-20 09 delete this throws and exception change due to compiler version changing and boost version + virtual int bbDelete() {// delete this; + return 0; } //================================================================== diff --git a/kernel/src/bbtkComplexBlackBox.cxx b/kernel/src/bbtkComplexBlackBox.cxx index 05d6923..0c65247 100644 --- a/kernel/src/bbtkComplexBlackBox.cxx +++ b/kernel/src/bbtkComplexBlackBox.cxx @@ -2,8 +2,8 @@ Program: bbtk Module: $RCSfile: bbtkComplexBlackBox.cxx,v $ Language: C++ - Date: $Date: 2009/07/30 15:01:05 $ - Version: $Revision: 1.28 $ + Date: $Date: 2009/10/05 22:44:48 $ + Version: $Revision: 1.29 $ =========================================================================*/ /* --------------------------------------------------------------------- @@ -692,16 +692,25 @@ namespace bbtk #ifdef WIN32 - std::string command1 ("dot -Tpng -o " + + std::string currentexecpath( crea::System::GetDllAppPath("bbtk") +"\\dot_embedded\\"); + std::string command1 (currentexecpath + "dot -Tpng -o " + filename_png2 + " " + filename_dot2 ); + + std::string command1a(currentexecpath + "dot -T cmap -o " + + filename_cmap2 + " " + filename_dot2 ); + #else std::string command1 ("dot -Tpng:quartz -o " + filename_png2 + " " + filename_dot2 ); -#endif - - std::string command1a("dot -T cmap -o " + std::string command1a("dot -T cmap -o " + filename_cmap2 + " " + filename_dot2 ); +#endif + + + + // 1. Generating .dot file FILE *ff; ff = fopen(filename_dot.c_str(),"w"); diff --git a/kernel/src/bbtkComplexBlackBox.h b/kernel/src/bbtkComplexBlackBox.h index 7236a60..d70f8a0 100644 --- a/kernel/src/bbtkComplexBlackBox.h +++ b/kernel/src/bbtkComplexBlackBox.h @@ -2,8 +2,8 @@ Program: bbtk Module: $RCSfile: bbtkComplexBlackBox.h,v $ Language: C++ - Date: $Date: 2008/12/11 09:50:35 $ - Version: $Revision: 1.7 $ + Date: $Date: 2009/10/05 22:44:48 $ + Version: $Revision: 1.8 $ =========================================================================*/ /* --------------------------------------------------------------------- @@ -47,6 +47,7 @@ #include "bbtkComplexBlackBoxDescriptor.h" //#include "bbtkComplexBlackBoxInputDescriptor.h" //#include "bbtkComplexBlackBoxOutputDescriptor.h" +#include "creaSystem.h" #include namespace bbtk diff --git a/kernel/src/bbtkFactory.cxx b/kernel/src/bbtkFactory.cxx index 37563de..627bc80 100644 --- a/kernel/src/bbtkFactory.cxx +++ b/kernel/src/bbtkFactory.cxx @@ -2,8 +2,8 @@ Program: bbtk Module: $RCSfile: bbtkFactory.cxx,v $ Language: C++ - Date: $Date: 2009/06/08 14:50:03 $ - Version: $Revision: 1.45 $ + Date: $Date: 2009/10/05 22:44:48 $ + Version: $Revision: 1.46 $ =========================================================================*/ /* --------------------------------------------------------------------- @@ -148,153 +148,158 @@ namespace bbtk // same for Windows, with c:, d: ... // // lastname : string before the last / (if any), or user supplied name + + if(name != ""){ + bbtkDebugMessageInc("kernel",7,"Factory::LoadPackage(\""< package_paths; + std::string libname; // full path library name + std::string pkgname; // e.g. libbb.so + + std::string upath; + pkgname = Utilities::ExtractPackageName(name,upath); + bbtkMessage("debug",1,"Package name ["<0) // ------------------------------------- check user supplied location + { + if (name[0] != '.' && name[0] != '/' && name[1]!= ':') + { + bbtkError("Use absolute or relative path name! ["<::iterator i; + for (i=package_paths.begin();i!=package_paths.end();++i) + { + foundFile = false; + path = *i; +//std::cout<<"JCP bbtkFactory.cxx void Factory::LoadPackage = path "< Trying to load [" << libname << "]" < package_paths; - std::string libname; // full path library name - std::string pkgname; // e.g. libbb.so - - std::string upath; - pkgname = Utilities::ExtractPackageName(name,upath); - - bbtkMessage("debug",1,"Package name ["<0) // ------------------------------------- check user supplied location - { - if (name[0] != '.' && name[0] != '/' && name[1]!= ':') - { - bbtkError("Use absolute or relative path name! ["<::iterator i; - for (i=package_paths.begin();i!=package_paths.end();++i) - { - foundFile = false; - path = *i; - - // we *really* want '.' to be the current working directory - if (path == ".") - { - char buf[2048]; // for getcwd - char * currentDir = getcwd(buf, 2048); - std::string cwd(currentDir); - path = currentDir; - } - - libname = Utilities::MakeLibnameFromPath(path, pkgname); - - bbtkMessage("debug",2,"-> Trying to load [" << libname << "]" <getline(buf,500); std::string str(buf); - + //size 0 JCP 21-09-2009 int size=str.length(); - if ( str[ size-1 ]==13 ) + if(size != 0){ + if ( str[ size-1 ]==13 ) { str.erase(size-1,1); } - try - { - DoInterpretLine(str); - } - CATCH_MACRO; + try + { + DoInterpretLine(str); + } + CATCH_MACRO; + } + } CloseCurrentFile(); } @@ -718,6 +721,7 @@ namespace bbtk { mStatus = Interpreter_OK; mInsideComment = false; +//std::cout<<"JCP bbtkInterpreter.cxx Interpreter::InterpretLine("< Interpreter::DoInterpretLine(\"" < words; SplitLine(line,words); @@ -786,7 +789,7 @@ namespace bbtk // Command CommandInfoType command; InterpretCommand(words,command); - +//std::cout<<"JCP bbtkInterpreter command.keyword ="<(mFile.back()); @@ -844,7 +848,7 @@ namespace bbtk } return; } - +//std::cout<<" mVirtualExecuter->Create(words[1],words[2]); "<=4 + if(tfullPathScriptName.size()>=4){ + if (tfullPathScriptName.substr(tfullPathScriptName.size()-4, 3)==".bb") { - // The following is *NOT* a debug time message : - // It's a user intended message. - // Please don't remove it. - bbtkMessage("interpreter",2, - " [" <& words,"<second; bbtkDebugMessage("interpreter",9,"<== Interpreter::InterpretCommand(...)"<0){ + char c = path[path.size()-1]; #if defined(__GNUC__) if (c != '/') libname += "/libbb"; @@ -286,6 +287,8 @@ namespace bbtk libname += pkgname; libname += ".dll"; #endif + } + return libname; } @@ -294,23 +297,26 @@ namespace bbtk std::string Utilities::MakePkgnameFromPath(std::string path, std::string pkgname, bool addExt) { std::string libname = path; - char c = path[path.size()-1]; - if (c != '/' && c != '\\') - { - libname += ConfigurationFile::GetInstance().Get_file_separator (); - } - libname += pkgname; - if (addExt) - { - int l = libname.size(); - if (l>4) - { - if (libname.substr(l-4, 4) != ".bbs") - { - libname = libname + ".bbs"; - } - } - } + if(path.size()>0){ + char c = path[path.size()-1]; + if (c != '/' && c != '\\') + { + libname += ConfigurationFile::GetInstance().Get_file_separator (); + } + libname += pkgname; + if (addExt) + { + int l = libname.size(); + if (l>4) + { + if (libname.substr(l-4, 4) != ".bbs") + { + libname = libname + ".bbs"; + } + } + } + } + return libname; } // ======================================================================= diff --git a/packages/toolsbbtk/bbs/appli/GUICreatePackage.bbs b/packages/toolsbbtk/bbs/appli/GUICreatePackage.bbs index 9253935..7acc43d 100644 --- a/packages/toolsbbtk/bbs/appli/GUICreatePackage.bbs +++ b/packages/toolsbbtk/bbs/appli/GUICreatePackage.bbs @@ -114,7 +114,6 @@ new ConcatStrings concatStr connect descriptionStr.Out concatStr.In6 connect dquote.Out concatStr.In7 - new ExecSystemCommand command connect concatStr.Out command.In diff --git a/packages/wx/src/bbwxSlider.cxx b/packages/wx/src/bbwxSlider.cxx index 1b3db85..0b4e7b3 100644 --- a/packages/wx/src/bbwxSlider.cxx +++ b/packages/wx/src/bbwxSlider.cxx @@ -2,8 +2,8 @@ Program: bbtk Module: $RCSfile: bbwxSlider.cxx,v $ Language: C++ - Date: $Date: 2009/05/15 14:58:03 $ - Version: $Revision: 1.24 $ + Date: $Date: 2009/10/05 22:44:52 $ + Version: $Revision: 1.25 $ =========================================================================*/ /* --------------------------------------------------------------------- @@ -303,7 +303,7 @@ namespace bbwx void SliderWidget::OnResolutionOfSlider(wxScrollEvent& event) { int value = mwxSlider->GetValue(); - int delta = (int) (pow( 4 , mResolutionOfSlider->GetValue() )); + int delta = (int) (pow((double) 4 ,(double) mResolutionOfSlider->GetValue() )); int minTmp = value - delta/2; int maxTmp = value + delta/2; if (minTmp