From ad75a0a491a3d9805f645fdf1bced9eeb97e295c Mon Sep 17 00:00:00 2001 From: sronilsson Date: Wed, 7 Aug 2024 14:20:00 -0400 Subject: [PATCH] btns --- simba/SimBA.py | 30 +++++++++--------- simba/assets/icons/feather_green.png | Bin 0 -> 476 bytes simba/assets/icons/join_purple.png | Bin 0 -> 542 bytes simba/assets/icons/join_red.png | Bin 0 -> 539 bytes simba/assets/icons/join_yellow.png | Bin 0 -> 533 bytes simba/assets/icons/line_chart_blue.png | Bin 0 -> 498 bytes simba/assets/icons/seperate_green.png | Bin 0 -> 351 bytes simba/assets/icons/subset_blue.png | Bin 0 -> 510 bytes simba/assets/icons/tile_green.png | Bin 0 -> 534 bytes simba/assets/icons/wand_blue.png | Bin 0 -> 612 bytes .../ui/pop_ups/clf_probability_plot_pop_up.py | 2 +- .../ui/pop_ups/clf_validation_plot_pop_up.py | 11 ++++--- simba/ui/tkinter_functions.py | 3 +- 13 files changed, 24 insertions(+), 22 deletions(-) create mode 100644 simba/assets/icons/feather_green.png create mode 100644 simba/assets/icons/join_purple.png create mode 100644 simba/assets/icons/join_red.png create mode 100644 simba/assets/icons/join_yellow.png create mode 100644 simba/assets/icons/line_chart_blue.png create mode 100644 simba/assets/icons/seperate_green.png create mode 100644 simba/assets/icons/subset_blue.png create mode 100644 simba/assets/icons/tile_green.png create mode 100644 simba/assets/icons/wand_blue.png diff --git a/simba/SimBA.py b/simba/SimBA.py index 072ed3001..628793f6b 100644 --- a/simba/SimBA.py +++ b/simba/SimBA.py @@ -251,14 +251,14 @@ def __init__(self, config_path: str): import_frm.grid(row=0, column=0, sticky=NW) further_methods_frm = CreateLabelFrameWithIcon(parent=import_frm, header="FURTHER METHODS", icon_name=Keys.DOCUMENTATION.value, icon_link=Links.ADDITIONAL_IMPORTS.value) - extract_frm_btn = SimbaButton(parent=further_methods_frm, txt="EXTRACT FRAMES FOR ALL VIDEOS IN SIMBA PROJECT", txt_clr='blue', font=Formats.FONT_REGULAR.value, cmd=extract_frames_from_all_videos_in_directory, cmd_kwargs={'config_path': lambda:self.config_path, 'directory': lambda:self.video_dir}) - import_frm_dir_btn = SimbaButton(parent=further_methods_frm, txt="IMPORT FRAMES DIRECTORY TO SIMBA PROJECT", txt_clr='blue', font=Formats.FONT_REGULAR.value, cmd=ImportFrameDirectoryPopUp, cmd_kwargs={'config_path': lambda:self.config_path}) - add_clf_btn = SimbaButton(parent=further_methods_frm, txt="ADD CLASSIFIER TO SIMBA PROJECT", txt_clr='blue', font=Formats.FONT_REGULAR.value, cmd=AddClfPopUp, cmd_kwargs={'config_path': lambda:self.config_path}) - remove_clf_btn = SimbaButton(parent=further_methods_frm, txt="REMOVE CLASSIFIER FROM SIMBA PROJECT", txt_clr='blue', font=Formats.FONT_REGULAR.value, cmd=RemoveAClassifierPopUp, cmd_kwargs={'config_path': lambda:self.config_path}) - archive_files_btn = SimbaButton(parent=further_methods_frm, txt="ARCHIVE PROCESSED FILES IN SIMBA PROJECT", txt_clr='blue', font=Formats.FONT_REGULAR.value, cmd=ArchiveProcessedFilesPopUp, cmd_kwargs={'config_path': lambda:self.config_path}) - reverse_btn = SimbaButton(parent=further_methods_frm, txt="REVERSE TRACKING IDENTITIES IN SIMBA PROJECT", txt_clr='blue', font=Formats.FONT_REGULAR.value, cmd=None) - interpolate_btn = SimbaButton(parent=further_methods_frm, txt="INTERPOLATE POSE IN SIMBA PROJECT", txt_clr='blue', font=Formats.FONT_REGULAR.value, cmd=InterpolatePopUp, cmd_kwargs={'config_path': lambda:self.config_path}) - smooth_btn = SimbaButton(parent=further_methods_frm, txt="SMOOTH POSE IN SIMBA PROJECT", txt_clr='blue', font=Formats.FONT_REGULAR.value, cmd=SmoothingPopUp, cmd_kwargs={'config_path': lambda:self.config_path}) + extract_frm_btn = SimbaButton(parent=further_methods_frm, txt="EXTRACT FRAMES FOR ALL VIDEOS IN SIMBA PROJECT", txt_clr='blue', compound='right', img='image', font=Formats.FONT_REGULAR.value, cmd=extract_frames_from_all_videos_in_directory, cmd_kwargs={'config_path': lambda:self.config_path, 'directory': lambda:self.video_dir}) + import_frm_dir_btn = SimbaButton(parent=further_methods_frm, txt="IMPORT FRAMES DIRECTORY TO SIMBA PROJECT", txt_clr='blue', compound='right', img='import', font=Formats.FONT_REGULAR.value, cmd=ImportFrameDirectoryPopUp, cmd_kwargs={'config_path': lambda:self.config_path}) + add_clf_btn = SimbaButton(parent=further_methods_frm, txt="ADD CLASSIFIER TO SIMBA PROJECT", txt_clr='blue', compound='right', img='plus', font=Formats.FONT_REGULAR.value, cmd=AddClfPopUp, cmd_kwargs={'config_path': lambda:self.config_path}) + remove_clf_btn = SimbaButton(parent=further_methods_frm, txt="REMOVE CLASSIFIER FROM SIMBA PROJECT", txt_clr='blue', compound='right', img='trash', font=Formats.FONT_REGULAR.value, cmd=RemoveAClassifierPopUp, cmd_kwargs={'config_path': lambda:self.config_path}) + archive_files_btn = SimbaButton(parent=further_methods_frm, txt="ARCHIVE PROCESSED FILES IN SIMBA PROJECT", txt_clr='blue', compound='right', img='archive', font=Formats.FONT_REGULAR.value, cmd=ArchiveProcessedFilesPopUp, cmd_kwargs={'config_path': lambda:self.config_path}) + reverse_btn = SimbaButton(parent=further_methods_frm, txt="REVERSE TRACKING IDENTITIES IN SIMBA PROJECT", txt_clr='blue', compound='right', img='reverse_blue', font=Formats.FONT_REGULAR.value, cmd=None) + interpolate_btn = SimbaButton(parent=further_methods_frm, txt="INTERPOLATE POSE IN SIMBA PROJECT", txt_clr='blue', compound='right', img='line_chart_blue', font=Formats.FONT_REGULAR.value, cmd=InterpolatePopUp, cmd_kwargs={'config_path': lambda:self.config_path}) + smooth_btn = SimbaButton(parent=further_methods_frm, txt="SMOOTH POSE IN SIMBA PROJECT", txt_clr='blue', compound='right', img='wand_blue', font=Formats.FONT_REGULAR.value, cmd=SmoothingPopUp, cmd_kwargs={'config_path': lambda:self.config_path}) label_setscale = CreateLabelFrameWithIcon(parent=tab3, header="VIDEO PARAMETERS (FPS, RESOLUTION, PPX/MM ....)", icon_name=Keys.DOCUMENTATION.value, icon_link=Links.VIDEO_PARAMETERS.value) self.distance_in_mm_eb = Entry_Box(label_setscale, "KNOWN DISTANCE (MILLIMETERS)", "25", validation="numeric") @@ -347,13 +347,13 @@ def activate(box, *args): roi_feature_frm = CreateLabelFrameWithIcon(parent=tab5, header="APPEND ROI FEATURES", icon_name=Keys.DOCUMENTATION.value, icon_link=Links.APPEND_ROI_FEATURES.value) - append_roi_features_by_animal = SimbaButton(parent=roi_feature_frm, txt="APPEND ROI DATA TO FEATURES: BY ANIMAL (CAUTION)", txt_clr='red', font=Formats.FONT_REGULAR.value, cmd=AppendROIFeaturesByAnimalPopUp, cmd_kwargs={'config_path': lambda:self.config_path}, thread=True) - append_roi_features_by_body_part = SimbaButton(parent=roi_feature_frm, txt="APPEND ROI DATA TO FEATURES: BY BODY-PARTS (CAUTION)", txt_clr='orange', font=Formats.FONT_REGULAR.value, cmd=AppendROIFeaturesByBodyPartPopUp, cmd_kwargs={'config_path': lambda:self.config_path}, thread=False) - remove_roi_features_from_feature_set = SimbaButton(parent=roi_feature_frm, txt="REMOVE ROI FEATURES FROM FEATURE SET", txt_clr='darkred', font=Formats.FONT_REGULAR.value, cmd=RemoveROIFeaturesPopUp, cmd_kwargs={'config_path': lambda:self.config_path, 'dataset': lambda:'features_extracted'}, thread=False) + append_roi_features_by_animal = SimbaButton(parent=roi_feature_frm, txt="APPEND ROI DATA TO FEATURES: BY ANIMAL (CAUTION)", txt_clr='red', img='join_red', font=Formats.FONT_REGULAR.value, cmd=AppendROIFeaturesByAnimalPopUp, cmd_kwargs={'config_path': lambda:self.config_path}, thread=True) + append_roi_features_by_body_part = SimbaButton(parent=roi_feature_frm, txt="APPEND ROI DATA TO FEATURES: BY BODY-PARTS (CAUTION)", img='join_yellow', txt_clr='orange', font=Formats.FONT_REGULAR.value, cmd=AppendROIFeaturesByBodyPartPopUp, cmd_kwargs={'config_path': lambda:self.config_path}, thread=False) + remove_roi_features_from_feature_set = SimbaButton(parent=roi_feature_frm, txt="REMOVE ROI FEATURES FROM FEATURE SET", txt_clr='darkred', img='trash', font=Formats.FONT_REGULAR.value, cmd=RemoveROIFeaturesPopUp, cmd_kwargs={'config_path': lambda:self.config_path, 'dataset': lambda:'features_extracted'}, thread=False) feature_tools_frm = LabelFrame(tab5, text="FEATURE TOOLS", pady=5, font=Formats.FONT_HEADER.value) - compute_feature_subset_btn = SimbaButton(parent=feature_tools_frm, txt="CALCULATE FEATURE SUBSETS", txt_clr='blue', font=Formats.FONT_REGULAR.value, cmd=FeatureSubsetExtractorPopUp, cmd_kwargs={'config_path': lambda: self.config_path}, thread=False) + compute_feature_subset_btn = SimbaButton(parent=feature_tools_frm, txt="CALCULATE FEATURE SUBSETS", txt_clr='blue', img='subset_blue', font=Formats.FONT_REGULAR.value, cmd=FeatureSubsetExtractorPopUp, cmd_kwargs={'config_path': lambda: self.config_path}, thread=False) label_behavior_frm = CreateLabelFrameWithIcon(parent=tab7, header="LABEL BEHAVIOR", icon_name=Keys.DOCUMENTATION.value, icon_link=Links.LABEL_BEHAVIOR.value) select_video_btn_new = SimbaButton(parent=label_behavior_frm, txt="Select video (create new video annotation)", img='label_blue', txt_clr='navy', cmd=select_labelling_video, cmd_kwargs={'config_path': lambda :self.config_path, 'threshold_dict': lambda: None, 'setting': lambda: "from_scratch", 'continuing': lambda: False}, thread=False) @@ -426,10 +426,10 @@ def activate(box, *args): button_run_rfmodelsettings = SimbaButton(parent=label_runmachinemodel, txt="MODEL SETTINGS", txt_clr='green', img='settings', cmd=SetMachineModelParameters, cmd_kwargs={'config_path': lambda:config_path}) button_runmachinemodel = SimbaButton(parent=label_runmachinemodel, txt="RUN MODELS", txt_clr='green', img='clf', cmd=self.runrfmodel, thread=True) - kleinberg_button = SimbaButton(parent=label_runmachinemodel, txt="KLEINBERG SMOOTHING", txt_clr='green', cmd=KleinbergPopUp, cmd_kwargs={'config_path': lambda:self.config_path}) - fsttc_button = SimbaButton(parent=label_runmachinemodel, txt="FSTTC", txt_clr='green', cmd=FSTTCPopUp, cmd_kwargs={'config_path': lambda:self.config_path}) + kleinberg_button = SimbaButton(parent=label_runmachinemodel, txt="KLEINBERG SMOOTHING", txt_clr='green', img='feather_green', cmd=KleinbergPopUp, cmd_kwargs={'config_path': lambda:self.config_path}) + fsttc_button = SimbaButton(parent=label_runmachinemodel, txt="FSTTC", txt_clr='green', img='tile_green', cmd=FSTTCPopUp, cmd_kwargs={'config_path': lambda:self.config_path}) - mutual_exclusivity = SimbaButton(parent=label_runmachinemodel, txt="MUTUAL EXCLUSIVITY CORRECTION", txt_clr='green', cmd=MutualExclusivityPupUp, cmd_kwargs={'config_path': lambda:self.config_path}) + mutual_exclusivity = SimbaButton(parent=label_runmachinemodel, txt="MUTUAL EXCLUSIVITY CORRECTION", img='seperate_green', txt_clr='green', cmd=MutualExclusivityPupUp, cmd_kwargs={'config_path': lambda:self.config_path}) label_machineresults = CreateLabelFrameWithIcon( parent=tab9, header="ANALYZE MACHINE RESULTS", icon_name=Keys.DOCUMENTATION.value, icon_link=Links.ANALYZE_ML_RESULTS.value) diff --git a/simba/assets/icons/feather_green.png b/simba/assets/icons/feather_green.png new file mode 100644 index 0000000000000000000000000000000000000000..21fa3947c62af82a070fd82e86b3955550baf6e8 GIT binary patch literal 476 zcmV<20VDp2P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf6951U69E94oEQKA0dYx0K~y+T)sZ_( zV?h{(pE+|T@tUMsK@>#`EwoUBC@foAZ6OGP{s}=VE3vZk!u|_Iw6oI1DjTo~LDpu$ zbrH7MLP8?uoS8Fzxh!I(tuGAo&gGf!GJH&__WVArn<+ttz^CbrkAn90+u9;PsZn;L zQ-b)CYB;0Wq>nrqeo$qN9G}G(sI`$7O{W%d(FL>g%1WbjS1avxvx1AyFlHFfiWE~K zX_S=wm3SJjGx(s0d8!cWITBUH*|KiJ3&{;p_)T0|#-(5n^w=|M{vTO?!;ZTqZ|iuo z%&tA=Je*w{@Qr2W$L86!WDn-=I5_|Tff&K5cL4|*s-Bfmi$o>>RK;TO3 z+bgz-*ytFdVphq-hjQOHpx6JrMM$NyPoQ~xG9t&n<&n5~W|MmkY_aJ-vfvpT&w1GG ST8Vf70000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0kcU&K~y+T)lf}K zTTu`_GtZZuXj|jLfCdert?pdJKrstH`vZhR7lMVBT7=R?aTi<)MG%TE-4q1lABZBN zLe#ZVq>^ANc9B4m?%I%dr!(pEM>w0gbLO16GY1bdD9l(KnofwwXC{oxf9Md5Z3K8t zgp3G8^Pyw+W%K%=WQ4YODKRz^M8i7hk|0|ub%4xiJpvEY8`t~i zlzl!Iss8zWrDKkx#q`1oR@~dsQQxmW{;pqjs<2Thb`R%}3$n;^b+E8SMCnSg>lxRY z^|TUVe(Uc?6WS(R>lxG3?*hu`kAppl`U}IYPZ9SCg1BMq0*>h_mG$yb!w44aNxxy6 zH~AlWYQuBr3tRYlbx^y<7)-zP@ZJwkC!U0TbwX|pdmo=kYVpXS<2LNzT{5FQ#T?x+ z6P*g^PMW-CHyNSocb{qc>3MRjgG$j-s$jVF{Z?d6jVnh7nuWI8i}9%xd6d`Zh2FRe za-QC`U~VgRspQaYywYJwVZ3a+ZDNb1#OzSuf@Kw?AmW+(Ecg}x^SWJHF%rUw-{RHv ga{eZiJ-h(^0dXs@Np8ZMQ2+n{07*qoM6N<$f^=*4od5s; literal 0 HcmV?d00001 diff --git a/simba/assets/icons/join_red.png b/simba/assets/icons/join_red.png new file mode 100644 index 0000000000000000000000000000000000000000..4e5c9d51354ce7d1f50b40feec323803d1244419 GIT binary patch literal 539 zcmV+$0_6RPP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0kBC#K~y+T)ltn# zn^6#*nQKB76h!^d3L26StZ`$aXrQ#aLLWd7Tom*LN*ATCAc(KvrXXlvpl*Z|Y{efC zqevxD>mNx()18%kcX|fDm&k19n{(#ed+zzDHH)K8)$vrCL_d@A8=FCFlFF(|I0x)4 zkt!2!dXc66-P206Lv)u*Plx0;FdSlBBNid`3&fmNr4m#t(0U=7QKB(V?%lxt={A=} zN8`bZ#}h0T`}WH7IKXQ@AFI>DF>dU{awABUv%F3rzNMN=t}t^UNS0qo(D78j{e!V) z^P>sPNnP)!(S}$;vzx4+rC%Fve7lQ(f{Vm0Fkv4Kl2Wbv;G$s*R!nXPc5A)6=f5#D z@PwBUMO`~5_lC6r6TI&RLvS@Y(i8C(%_Rf7n@D7Ea5wB;MikxTGd+fp_t*09mw#fo zZVR85?M=2&`xpC#_D9tf;iD4lRkjQ_-f43g_AidQhPTj(ZgYt#VfUTY($;SX&*A!c zOB;%kN7{n4A)W=6aVqb7Eo~E9RdeYS^7w*(Ii;+Qm5bPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0jfzvK~y+T)lpq5 zL{Svo``j6lkJ3n)8IzFm@#cXk@uvI$MM6w@7NvqK5|Znh zDf1u=UT)p9tutNzgZ*;OS!=Jo*WQQzXRv=#G7)W89xVy+Adwj6R59&qO%r$wF^d2` z)vPu%*_S7yDT|kfFu zj+t`7*z0UMO?qywH`w47Z{eU8PCg#Lo$kX!@=_^Mt{u%XbNu1U=~Qk_DUME&ptk0X z&^QUX#eTSmDW!){ptZdwI$&_ai>DVvq{Uzgb|NfXOz+qqCc%VK5`+EX+IHcd(OD6N zeTvq13-7-e@}z(+jmgPy$mdNs1Z*`C?hvMW%}Oy0|AOcT X_f@h5^&TT-00000NkvXXu0mjfq@e3o literal 0 HcmV?d00001 diff --git a/simba/assets/icons/line_chart_blue.png b/simba/assets/icons/line_chart_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..95a1ec4b61195b7883225cc92b7df0bbdec0217b GIT binary patch literal 498 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGf6951U69E94oEQKA0f$LMK~y+T%~Cx} z13?gdx4AW-m%@*LpyU^bAXwOGW$d&N6bltWtrRZ?ja3j7t7u_iXQ73KND4nn3oRl6 zD_cR(E(mH8h1}lVI=5LBE!0jQEX%x^H#0js_($N$5pa7_Ti?Rax5gBQX>Ad0z_lpB zvae{t24*n&j?Av& z%(+e)NjC-8!i}sU{1l@^9dI@dl%Jq0r|Q9-eh9G#Y*wn=8&ZwrTcN2_lDi3D-_wp? o4$QQtX-QgXInwWo^M?Rl0rTs8dZ(i+jsO4v07*qoM6N<$f{Rwi00000 literal 0 HcmV?d00001 diff --git a/simba/assets/icons/seperate_green.png b/simba/assets/icons/seperate_green.png new file mode 100644 index 0000000000000000000000000000000000000000..87e0973e3041b66eb96b03a8d8a7cb5f9719f40e GIT binary patch literal 351 zcmeAS@N?(olHy`uVBq!ia0vp^{2QL70(Y)*K0-;1^F9#}Etuy_bExm<=V4eXO?)xSO>;8+a3OfRplyO~^Ua=$NZih7g1HnBF4=h_AoqG2t0uVmrM_S=?;(_Hw1*r#<5HZHC&-eETV_T6(8&W6!It0a>EY v=XHKn6kqSZ$*OU2$=&~}q_mAbGxIRS2byVw$*G?L`k%qm)z4*}Q$iB}vy+Zj literal 0 HcmV?d00001 diff --git a/simba/assets/icons/subset_blue.png b/simba/assets/icons/subset_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..114cccca499cac49c1df36480c8f65e71bf09d6c GIT binary patch literal 510 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGf6951U69E94oEQKA0h38YK~y+Tol-k5 z1wj}+pWStFRk)sw{zlY7Aqt_^3W-7`-U_uxB;t8PL`WnO;s?-(s62X+NEAAPMnn{L z?Km^D9@pJMoaCGDn=?7z%-L^T@DQjUK>jL=mX1VKNre2>DR8u;jfNE;NYm~Wxf z0rJCbye{5FIs=L|`YYgiYb=f+YKC;u@>zHWR4@Gby=ea_CcMEkl(S2wE@EP!6r&UV z!j9hM8Lnusisdndb3DH^Tr7l_Z;aDRy0DgDHBwGJHHr;7YeHtXR-) zGNg#HPT!MkaACPPs206iu~OA0TNE=k*kGOw;w=b%JX>&Y@)x9l%L+mjZ$aTvr|4$v zo16t&aI^)P$h9CxdbMKx1DHAHfEL0{JB3dR>H&ebr7Oqm{qq+%4L7Vh*!6q%2I5lC ziV$NwN;9Sr&YtKKE7l0lF5xs@vubAWtN(;}6xAbmZ|7Tk5H?YK`ts`*4gLUTjvR-e zl+S%2c}O9xEj~0S%9Hrz*8Y5&!@I07*qoM6N<$f>6fM AKmY&$ literal 0 HcmV?d00001 diff --git a/simba/assets/icons/tile_green.png b/simba/assets/icons/tile_green.png new file mode 100644 index 0000000000000000000000000000000000000000..67ff5e117a8809e55dea18a518370d2d43ca1cb9 GIT binary patch literal 534 zcmV+x0_pvUP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf6951U69E94oEQKA0jo(wK~y+TrBO{Q zMNt%8``ml!c_<|l29l5$17=FXKOiGzq>PDw;UoXR)IiD~P$n2DB}P0&FBv>M`MCF; zbF6#LdraOlVAZ|nWAAnL+H2!K5cgkcm;+27k6Bn_5U3VdoI@vv2%-tzmt0;IhS9Bf zFLVb%KSc5{>Vazp+TQYZ2|;*{vYcQ$zI1t2tfj>O=aB{o{4u z$)HqYo4977Wq@l5MqVf{@bTKHklCZyJSF!-r9`~)JkH9WK3*FY!=gq0NBPt-E0;Wx zEhssps7{DVJ@|pa2sV=)FKa9+GMT2>BEL5(ID?gInB*t!K%$mjUa)u7PNiiRc1iVMCFZZ)jZtW3pdR@cC!n0- z-^qf6Jr4Vdd_+qRz38C11s_ha+Azx`zyF5K0?83+yai@hPx#1ZP1_K>z@;j|==^1poj532;bRa{vGf6951U69E94oEQKA0r^QpK~y+Tjgr4> z6JZ?2pZCYTX(c_2E+PhrMJOn`h?I&$aS$B*0g8hP-2@vUxh76ZZKtRt4i3^)MFf{F zO6sa;QNcgJq3Gfm@oq4=yZ3zVaw?@M`arn%-g`dZ_j!1O|5Bko0jGW_fBPeuKR3&% z9zbEfoUIdk8L+e28rNMEs{7KF%HD^`PH7177HWDg60wI9T9 z1q91T@Pv~-0^$QKzCk7${r1z;Au`_vEl4PThJ`Nh!~&A!D-%r6*<}2kL@E$T2Vs9@ zNasZhZPyvoCs5)LiAc|J$PEY?a6dpIPr!^!4UZkKb)k=Kr!ho0wg{(pi@WQr(B(jb zsO_=y=OM8vGk>1_E+HyjgcIB$w1d0j{P`Ss7*Tixc+lG%+jwUgkst9MI(QDtet=7; zgQ#_d{bw;^cBR&hu<=f3U^sS@@mzLWM%-Sd>oFqpjE)3h@e_WwzNGfQu&JLTcod<# z1joP2*l!ST>p)e{pkG`8nqA(6hW4-KL=KzUZ}2w3Caipgxb*@in1oPsKu{WhKd#YT zVZzB26HwksNO7ETQg8`Y@x*&C(~kqyMp?O+pU68FubIBgp%wmzz59Sy;`;jA4&&g0)7FrBcoxPrw)t&0000