From 75adac3e89861d4a662adb3588c3c3c7b792a395 Mon Sep 17 00:00:00 2001 From: eccles Date: Sun, 28 Sep 2003 15:24:55 +0000 Subject: [PATCH] - Initial keyboard focus set to first (tab-able) field. - Multi-line text boxes now wrap long lines unless horizontal scroll bar is enabled. git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@2979 212acab6-be3b-0410-9dea-997c60f758d6 --- Contrib/InstallOptions/InstallerOptions.cpp | 82 +++++++++++--------- Plugins/InstallOptions.dll | Bin 13312 -> 13312 bytes 2 files changed, 47 insertions(+), 35 deletions(-) diff --git a/Contrib/InstallOptions/InstallerOptions.cpp b/Contrib/InstallOptions/InstallerOptions.cpp index d6177eb6..38f64e00 100644 --- a/Contrib/InstallOptions/InstallerOptions.cpp +++ b/Contrib/InstallOptions/InstallerOptions.cpp @@ -161,6 +161,7 @@ HWND hMainWindow = NULL; HWND hCancelButton = NULL; HWND hNextButton = NULL; HWND hBackButton = NULL; +HWND hInitialFocus = NULL; HINSTANCE m_hInstance = NULL; @@ -407,7 +408,7 @@ bool SaveSettings(void) { GetWindowText(hwnd, pszBuffer+1, nBufLen-1); pszBuffer[nLength+1]='"'; pszBuffer[nLength+2]='\0'; - + if ( pFields[nIdx].nType == FIELD_TEXT && pFields[nIdx].nFlags & FLAG_MULTILINE ) { char *pszBuf2 = (char*)MALLOC(nBufLen*2); // double the size, consider the worst case, all chars are \r\n @@ -433,7 +434,7 @@ bool SaveSettings(void) { FREE(pszBuffer); pszBuffer=pszBuf2; } - + break; } } @@ -449,7 +450,7 @@ bool SaveSettings(void) { #define BROWSE_WIDTH 15 #define BUFFER_SIZE 8192 // 8kb of mem is max char count in multiedit -static char szResult[BUFFER_SIZE]; +static char szResult[BUFFER_SIZE]; DWORD WINAPI myGetProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName) { @@ -466,6 +467,11 @@ char * WINAPI myGetProfileStringDup(LPCTSTR lpAppName, LPCTSTR lpKeyName) return NULL; } +UINT WINAPI myGetProfileInt(LPCTSTR lpAppName, LPCTSTR lpKeyName, INT nDefault) +{ + return GetPrivateProfileInt(lpAppName, lpKeyName, nDefault, pszFilename); +} + int ReadSettings(void) { static char szField[25]; int nIdx, nCtrlIdx; @@ -475,16 +481,16 @@ int ReadSettings(void) { pszNextButtonText = myGetProfileStringDup("Settings", "NextButtonText"); pszBackButtonText = myGetProfileStringDup("Settings", "BackButtonText"); - nNumFields = GetPrivateProfileInt("Settings", "NumFields", 0, pszFilename); + nNumFields = myGetProfileInt("Settings", "NumFields", 0); - nRectId = GetPrivateProfileInt("Settings", "Rect", DEFAULT_RECT, pszFilename); + nRectId = myGetProfileInt("Settings", "Rect", DEFAULT_RECT); - bBackEnabled = GetPrivateProfileInt("Settings", "BackEnabled", 0xFFFF0000, pszFilename); + bBackEnabled = myGetProfileInt("Settings", "BackEnabled", -1); // by ORTIM: 13-August-2002 - bCancelEnabled = GetPrivateProfileInt("Settings", "CancelEnabled", 0xFFFF0000, pszFilename); - bCancelShow = GetPrivateProfileInt("Settings", "CancelShow", 0xFFFF0000, pszFilename); + bCancelEnabled = myGetProfileInt("Settings", "CancelEnabled", -1); + bCancelShow = myGetProfileInt("Settings", "CancelShow", -1); - bRTL = GetPrivateProfileInt("Settings", "RTL", 0, pszFilename); + bRTL = myGetProfileInt("Settings", "RTL", 0); if (nNumFields > 0) { // make this twice as large for the worst case that every control is a browse button. @@ -554,9 +560,9 @@ int ReadSettings(void) { pFields[nIdx].nFlags |= LookupToken(FlagTable, szResult); pFields[nIdx].pszText = myGetProfileStringDup(szField, "TEXT"); - + // Label Text - convert newline - + if (pFields[nIdx].nType == FIELD_LABEL) { ConvertNewLines(pFields[nIdx].pszText); } @@ -577,13 +583,13 @@ int ReadSettings(void) { pFields[nIdx].pszListItems[nResult + 1] = '\0'; } } - pFields[nIdx].nMaxLength = GetPrivateProfileInt(szField, "MaxLen", 0, pszFilename); - pFields[nIdx].nMinLength = GetPrivateProfileInt(szField, "MinLen", 0, pszFilename); + pFields[nIdx].nMaxLength = myGetProfileInt(szField, "MaxLen", 0); + pFields[nIdx].nMinLength = myGetProfileInt(szField, "MinLen", 0); pFields[nIdx].pszValidateText = myGetProfileStringDup(szField, "ValidateText"); - + // ValidateText - convert newline - + if (pFields[nIdx].pszValidateText) { ConvertNewLines(pFields[nIdx].pszValidateText); } @@ -602,10 +608,10 @@ int ReadSettings(void) { } } - pFields[nIdx].rect.left = GetPrivateProfileInt(szField, "LEFT", 0, pszFilename); - pFields[nIdx].rect.right = GetPrivateProfileInt(szField, "RIGHT", 0, pszFilename); - pFields[nIdx].rect.top = GetPrivateProfileInt(szField, "TOP", 0, pszFilename); - pFields[nIdx].rect.bottom = GetPrivateProfileInt(szField, "BOTTOM", 0, pszFilename); + pFields[nIdx].rect.left = myGetProfileInt(szField, "LEFT", 0); + pFields[nIdx].rect.right = myGetProfileInt(szField, "RIGHT", 0); + pFields[nIdx].rect.top = myGetProfileInt(szField, "TOP", 0); + pFields[nIdx].rect.bottom = myGetProfileInt(szField, "BOTTOM", 0); if (myGetProfileString(szField, "Flags")) { // append the | to make parsing a bit easier @@ -636,7 +642,7 @@ int ReadSettings(void) { // Text color for LINK control, default is pure blue //if (pFields[nIdx].nType == FIELD_LINK) - pFields[nIdx].hImage = (HANDLE)GetPrivateProfileInt(szField, "TxtColor", RGB(0,0,255), pszFilename); + pFields[nIdx].hImage = (HANDLE)myGetProfileInt(szField, "TxtColor", RGB(0,0,255)); pFields[nIdx].nControlID = 1200 + nIdx; if (pFields[nIdx].nType == FIELD_FILEREQUEST || pFields[nIdx].nType == FIELD_DIRREQUEST) @@ -748,22 +754,22 @@ BOOL CALLBACK cfgDlgProc(HWND hwndDlg, if ( ( lpdis->itemState & ODS_FOCUS && lpdis->itemAction & ODA_DRAWENTIRE) || (lpdis->itemAction & ODA_FOCUS) || (lpdis->itemAction & ODA_SELECT)) DrawFocusRect(lpdis->hDC, &pFields[nIdx].rect); - + SetTextColor(lpdis->hDC, (COLORREF)pFields[nIdx].hImage); - + pFields[nIdx].rect = lpdis->rcItem; // Calculate needed size of the control DrawText(lpdis->hDC, pFields[nIdx].pszText, -1, &pFields[nIdx].rect, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_CALCRECT); pFields[nIdx].rect.right += 4; pFields[nIdx].rect.bottom = lpdis->rcItem.bottom; // Resize but don't move - SetWindowPos(lpdis->hwndItem, NULL, 0, 0, pFields[nIdx].rect.right - pFields[nIdx].rect.left, + SetWindowPos(lpdis->hwndItem, NULL, 0, 0, pFields[nIdx].rect.right - pFields[nIdx].rect.left, pFields[nIdx].rect.bottom - pFields[nIdx].rect.top, SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE); // Draw the text lpdis->rcItem = pFields[nIdx].rect; // Add little margin to avoid focus rect over text lpdis->rcItem.right += 2; lpdis->rcItem.left += 2; - + DrawText(lpdis->hDC, pFields[nIdx].pszText, -1, &lpdis->rcItem, DT_LEFT | DT_VCENTER | DT_SINGLELINE ); #ifdef IO_LINK_UNDERLINED DeleteObject(SelectObject(lpdis->hDC, OldFont)); @@ -777,7 +783,7 @@ BOOL CALLBACK cfgDlgProc(HWND hwndDlg, case WM_CTLCOLORLISTBOX: { ctlcolors *c = (ctlcolors *)GetWindowLong((HWND)lParam, GWL_USERDATA); - + if (c) { SetBkMode((HDC)wParam, c->bkmode); if (c->flags & CC_BK) @@ -861,16 +867,16 @@ int createCfgDlg() } hCancelButton = GetDlgItem(hMainWindow,IDCANCEL); - hNextButton = GetDlgItem(hMainWindow,IDOK); + hInitialFocus = hNextButton = GetDlgItem(hMainWindow,IDOK); hBackButton = GetDlgItem(hMainWindow,3); if (pszCancelButtonText) SetWindowText(hCancelButton,pszCancelButtonText); if (pszNextButtonText) SetWindowText(hNextButton,pszNextButtonText); if (pszBackButtonText) SetWindowText(hBackButton,pszBackButtonText); - if (bBackEnabled!=0xFFFF0000) EnableWindow(hBackButton,bBackEnabled); - if (bCancelEnabled!=0xFFFF0000) EnableWindow(hCancelButton,bCancelEnabled); - if (bCancelShow!=0xFFFF0000) old_cancel_visible=ShowWindow(hCancelButton,bCancelShow?SW_SHOWNA:SW_HIDE); + if (bBackEnabled!=-1) EnableWindow(hBackButton,bBackEnabled); + if (bCancelEnabled!=-1) EnableWindow(hCancelButton,bCancelEnabled); + if (bCancelShow!=-1) old_cancel_visible=ShowWindow(hCancelButton,bCancelShow?SW_SHOWNA:SW_HIDE); HFONT hFont = (HFONT)SendMessage(hMainWindow, WM_GETFONT, 0, 0); @@ -910,7 +916,7 @@ int createCfgDlg() TEXTMETRIC tm; GetTextMetrics(memDC, &tm); int baseUnitY = tm.tmHeight; - + SIZE size; GetTextExtentPoint32(memDC,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", 52, &size); int baseUnitX = (size.cx / 26 + 1) / 2; @@ -1051,10 +1057,13 @@ int createCfgDlg() dwStyle |= ES_NUMBER; if (pFields[nIdx].nFlags & FLAG_MULTILINE) { - dwStyle |= ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL; + dwStyle |= ES_MULTILINE | ES_AUTOVSCROLL; + // Enable word-wrap unless we have a horizontal scroll bar + if (!(pFields[nIdx].nFlags & FLAG_HSCROLL)) + dwStyle &= ~ES_AUTOHSCROLL; ConvertNewLines(pFields[nIdx].pszState); } - if ( pFields[nIdx].nFlags & FLAG_WANTRETURN ) + if (pFields[nIdx].nFlags & FLAG_WANTRETURN) dwStyle |= ES_WANTRETURN; if (pFields[nIdx].nFlags & FLAG_VSCROLL) dwStyle |= WS_VSCROLL; @@ -1098,6 +1107,9 @@ int createCfgDlg() if (hwCtrl) { // Sets the font of IO window to be the same as the main window SendMessage(hwCtrl, WM_SETFONT, (WPARAM)hFont, TRUE); + // Set initial focus to the first appropriate field + if ((hInitialFocus == hNextButton) && (dwStyle & WS_TABSTOP)) + hInitialFocus = hwCtrl; // make sure we created the window, then set additional attributes //if (pFields[nIdx].nMaxLength > 0) { switch (nType) { @@ -1196,7 +1208,7 @@ int createCfgDlg() } #ifdef IO_ENABLE_LINK else if (nType == FIELD_LINK) { - pFields[nIdx].nParentIdx = SetWindowLong(hwCtrl, GWL_WNDPROC, (long)StaticLINKWindowProc); + pFields[nIdx].nParentIdx = SetWindowLong(hwCtrl, GWL_WNDPROC, (long)StaticLINKWindowProc); } #endif } @@ -1219,7 +1231,7 @@ void showCfgDlg() // Tell NSIS to remove old inner dialog and pass handle of the new inner dialog SendMessage(hMainWindow, WM_NOTIFY_CUSTOM_READY, (WPARAM)hConfigWindow, 0); ShowWindow(hConfigWindow, SW_SHOWNA); - SetFocus(hNextButton); + SetFocus(hInitialFocus); g_done=0; @@ -1239,7 +1251,7 @@ void showCfgDlg() DestroyWindow(hConfigWindow); // by ORTIM: 13-August-2002 - if (bCancelShow!=0xFFFF0000) ShowWindow(hCancelButton,old_cancel_visible?SW_SHOWNA:SW_HIDE); + if (bCancelShow!=-1) ShowWindow(hCancelButton,old_cancel_visible?SW_SHOWNA:SW_HIDE); FREE(pFilenameStackEntry); FREE(pszTitle); diff --git a/Plugins/InstallOptions.dll b/Plugins/InstallOptions.dll index f3c20bca4d950c041d49f385206bbaca6b5e7e78..82b12499185b95c7d126e04e09157f4515f65438 100644 GIT binary patch delta 4778 zcmds4k9Skm9e=M)lN8b>#e}A%r75OR1oXAZ`;q1+n9zzvGW#c)^wR5pJ_3q>7HL`BZpqj2PG4_jSzth89U``(up-M_H(e3S3} z-0zQj@At>Ojqx#l$LZWX-*@dCEGHN3oY<5T$`yC!Si~2|1>}(U5xI(7CsyXHBImty zf6i{w=cfo=e>`GV5TO|;WL6+UBSx~U7g I)M-hV8o9M4R}^CbgUY-LMiF)bN|kgv$lri5N$Ou0{rpII1v` z=fwQHn)&Tu4u#YXWWf5#Oiyt-Ie8f&e~{$YD+mIG!PJo0kyit5cI7Q0y<#R$uf=LX zghEPnTN^TX#4q#e$&KP7<@}0H*-S{+i$&T%0!*I+EbY4ho9GZbl}oO{duZ!f0qY0G zg3=0Yyj!n|EC~|uSBN@6We8O8{*Eat$qwFA62l3s*6!fXT~Fxv%sSBi3}&{gmcdRwQrRIg1!@<$SZq|6 z!uMV3YXI4$z8bz?QP;|cA~c%yX$2eW$RP$i0H-s>41)NAQG+Ab8C3cgmYF8zI6*WT+NTr+kLX(4-n`%i%@O!&mHq(f!Jo!#9|ua(lX(2DJa*u58jlalV-Frb0%Hs6^8(+- z@0U%;BA0SuMf+sAC_YfB8w7)h-y=h-F|t03Y>|-$j5KGFh>SF1WEmiBe76kvF;D|Q zUo&vM*sA?l&#b#MdmvDL$v6Rt-6w}XV{_u!RK%>-Zr>e+r8Koz#@>)1RIlMv8qTpG zk6(^o3q-gY$svs&(eRz%sYQAOvbBjPKVe*^;9BCQ7-S+!_NQ7EhB4nR(lko}Z20m1<})Gd+@dy^g>pO!zS zF!OjB;7%c#u9)FhPl0Ob^B+KVJc&Z?bbXFrGJ)#U5}QCtBRhjK(PS$;Dvt%PQZt}X zMXn5DcXA{Y2j47jc?g@FDxNmJamv+V>BtqFcT9oR(zYugxTB^mQubpZm0zmBTg#@L zoR>}FR!u>)8uAV1UGWSon7{Zx3(gicELfLa@U%hQaDHqe63&g82+vk^;=S;?;w#VF&@C~sAgnhh=@$-`)jto|i zPG(>~Q9>714S1CtIa~^bsK*&2r;hX|ElwLDVm1W=^M zsGL>TU0F4pd;_!t+|eK-^A18|1;~>aWRv=o*{u^^;@HGZZ# zRd1Ds|ASCUB`X8~Hl^xK@yxfWdgJu@n^X1XX}&B~UnbNWv)`M-Ym&Q?ds4x!K zN1@~t)7l#HxcHW~Vd3*2C5$G=w22MS&QX^hg+W&h=-6_jBBViGY8g?8ly2F=$$vvm zoDL)hwc8M6KyVl<7_g0GCRFH8FE8_>E@-PG;uE@(CHOdD?P;&tn1#21;D*6Q`N-g! z%59K^2|%I2pVjGEIRKC7bNkZ`#-G7mN1=znT1FNCW5L;JZ>}j$D6*$4)K{mxGa&-v z;-Yfpk*t|jMRTWbN^35g-8qr4i6orS_!wl^3F+VcIfVE^i!_T$|Bae<8!gXL7w3TD&*0xmn>(D|| zH&w!QqIFgm8Ch!e34Ncj@cMyh3 zE{acIRm$QgMN?C-W@@>gHSv$nnO=O#cOtkB(TlMY!yXWXGtk38oA^o`y~5tr&K zqh&CG!Y72$R%9>&pH4PHw)am#Mp36ix(iY#0RC^9ZBgyOCWp6*TV~VnG<$QleKjr?Xl4$16T)hxBRQB_ zvtOH74R5|6384v6P4K?M$!5>PITY56`7V`?D{T^I#z(Qdc zKtW{d9oLFnrGh$DKw%GRAwLC86=!DJm*9usngPrBi3>yV#gdyyzj(Q%v8dsSW??HR z7#hV}OH0W@v8%Ki9=1=H8dP#U!W;Uv(qPWa5pltsxzSNjiaT-9ppc>W3^b36r{`qi zXVlXb`Z1#MDy01qWIc_SEA`4OE@kO)ne|{+kXc;3QVdx6Qi&hY+mC7!kK&9O6~-aM z<%5cU(}=7}DIlRJ95!e`wko6>vDVZ`BRPLE(n;6-WTciVr$=C4ezN6;^HFC5GMMlY zU=uQ$Glfckt_uGW(RfBW_fLduOBBEcLMm~2*&H$<-d^UOxA4AvhxlCUL$_B+Hl7yeh+}0K?}O;rET#tbqUU)VY1Qv4m8Z zC*Wd~1BeWx;%(*gNUQjZ@*Z&qsoynMK_8|GVgTqQ(C0v7Kx&2{j6l}{;g8+|7*I1% z0}v%Hom*^srWW4tFnRz8e;x;E3Fsuy>p=T}@aJJGL2LxN8E7AnSxn8XnC$^>Ek?oL zdZ34aw$S2Q(`?&uFqi>42=o-tHXtiZTS0so{BDKc$AMk}!k-X0>HumG3o7FOUmMzM z+ATUNjWb@!-S}YWfjjQ$y!)k_E8oe*|MZK+Rh2VtsV0c$fkvxeT2}RrI%k9wmDeVs zBy$yGVyYO5VHgjyobfZQ%^$ab?a_A&N3_5k}P+s}T&T`*!7de%!z*cUXXS3VtZ8zDPZC$pAEpFRu8?c?Uow0pm z%de}fW9wGbwbre#d$3NZ+f(;?9cfqDS-aD|-hRLRA$#1OvY)g|_DlAejwZ)CN7S*y zvB&XS$L}2($0^64<15FQL+>nca?a(>HO^l-pL71j8U3sCjPo1k1?Oy6rHgZUT+3Z8 zuG?IjTu-|CTrarZavgVl>Kb&NbA9Fdm+PWy(nY#8?yKB$-BoVN&AOfL8{B^PYWE%P zE_cNJsC%<}r+csaY4`8k2i>o_-*=yI|K0r$H(??O6V#%bDx~I6S5pfqigHjZsI}C( zDAhwHsK=-`sbka!)Th)Sb(XqJ71fw)=$cT?g4*4+`)iNXeo*^y?NIHdTEbFjxz^HZ z8L^aFpSS+e`l@xpimWr~IrKcbmTscg(s$GM(IGlQZ=rY4yXix8Km8f~1wBH4N9Qmq zM#q#eHpa!=z^rBNWHvHkCK_QjGigR-o?!Zz7nm2BmzjR%Z_F3WD1#u*1#AgBpS>31 zT*oeB{cJmX2YWC3b2hW)7O0`n>hUm z6|A)1Z{OS9w+|A0f`6?q$MM<5*RPh5-0QUyzmLpm>p7O#VPDS1cwS zho4crK?WT*Lf?~Yvnq+`1QfL@k+BhTvSC?f;0{G84>Dr=&P;nzx^v_|2!$gg|CEv-Pz+oRimP+&u*}ZfIb=x8A8!0~RQn4;r^cv%1QRU7ZbB z%_Kn(sesj@+u>Kpn4zmtT&*rPeu2%FdiXCE5PClIBv@Yo$qw~=*vUn;8#0qe`AEMQ zqDtU<9W@g;JE;ozK1$7#4@C%B4QVBlSgjy>{p2*TzE7>6VS|O6`O6Qy8UwHpf=B=? z$$-@m5&&`ME*D?dSf*p`#Pnl9LQn97g&=s0@~h>|SWS>&6Eb?lPc<{*$(x3TrsgFl zZU;c&CVVwZy-)>wA4a&8dN-^+nu_I=Bb6Z+pl)=~FTkT&ppzLgOA?tskO_8nfG%xn7&F9f_M{`oAg zI}B78Ud(-_ebUpJJ&>ueR5T2g-7V)oUR#YmG57`Ho$u^aN&~>Z=m+64Y(ZDA_ z6<3KwX4OMh6Mq^~*rXw)HQ-Fhi(|W#GGDgO>4mx^p#yA^1{=ufZj!WkS!wfKtdG^t zDy=+@2i8?eX4ws9^UFt>l=PST2z6#)Wm7be%qYTA2^fz?+W=--c{yknZ9LoPGA)Eu zS|}n@uaauZt|Wx=wTZPPNn}$PA^1kT2DyuR)yJg4QaL#~142Ufx>ccbvJ(364&A6S)e5z*BNwk`I32;F^hv+w(HegyQ9k(G}@ zKB<_xH=tt4fho|k23%9Pn&h&Q-qpz!7_yo*B+i;2d`0hp+#s9-9N$i+*qhntd1x_$ zAHn&hxX*VzFZ+nHZ3m#P3UB(GPcY8}!? zUn7)K%la+Awxnt;$;?-&TGLpLt*Kh;7;aA0nuS`^Xj#eEL{iFu1uZBScO%?l`ed(s zhmE3el>uM3eE}S=+|CuNR<2l3Oi#qtz>!c=GX&9@X=!U*p9z6;@pyj4gzykl z&VV&6EfjC$mysJpN;kEr2g(V>3`6e5}PHFCiZ8TsBm7}#Lo*R!%X|Spu8jl3UC^`!pL|U(CUnTU_Y#|_2wbb zHfc)uT{S_#jh2ABw?7DY7X>T0dvqPMfDj0bl>?T{DBV5Xc*y8F3V?=nTfs#ao@4Hws3we@Wo8Cjpahvp1&^hJ2f`5tZ-ecFNRLIq1Cf%wEq8{S{d;Gfx_CDgJc5h{ z5V*>4o26Ft>2|yiWhKP=fjb2Q}uUs+qZx$Ijqmq{WOY;Pn$aVxgzNe zi@!HaYnlyiB1#lHl4=@B)!#;~CiF=}nF?M5mh22}Z40odRPYNFJ2u8LXIaMjsg#W5&vO20AM_tkUiHm5gZG7bb@%L@SfS6Lp>YfF;y9hR!IX%0&Hr zYUqqY*YPUWs~@5IU(QOmeopwIV*Z#o*`Kee9}()5srtcz4cP9aKdJ;(OUL=2V0+8Z z88VuOS^*z9Ej2+EwRAz@R~1&P-@@((c8hBYon)1`r_f!CTLEq`kGvsaxysXdHML?y z*HH^E!Uzdzir5;^mE@MY>Znd=x|_VGZm&$<)3j>`EGRYzjiLoH>~wBXC9JWeC`7Ik z_Z2Nr72JdyuTlK6Xb!MTO= zn+JU&m#qA>mOJzzflB4g#;a3;CIuHNF4lB#8-ER^46OPEtO}&~cJU(8A%0mLDhLBd zHWl)l!NAxkK3Y;jE)btAsVc*rA(XuZ-;q&Q=o93W8xbDfzbuI;?hS~ArBm__g34Ae z?kwm)(N|i+;25Mm5`Kc>Xr;7_;s%#ql2P2*(vM{nx3shY(5~g;tEGkVL`(iFgd8d< zh`BhUP^?Oc8AoZQ8RICuR635Lq`WZ-CX@Vr%ZX`FYaRT12yYiVl(~vg?g8K~j=hYW zSfY?Fh!2@7$*tldGgtaBJd|2`q{H$=iw%XP=P;xHefSoiFjr5y1%t4q=WOn^CkZ`d zlIUM1ercX#KO(bH9%lDf;m20Ms)P|q<#glAB&x zAHV@%b%-aX6i(j`tGo?x2p|LS2Y{m>#-G)&QXN24%$u70zu)6t%NrAq=4^N_`s@!k zwm$u^IJdm`aASEU2mkMYSTwzS!lo)n1b}kJ;rY`~Q3^sKs=n6|SJPU$h%Tcm={Yn* zd+9oQ5#2;Dqu0_;)6dau^vm>idKdk3`W^Zg^au12`Z#@xK1W}m|3nYaw`e7!Vf0KX zQ^Cw-JWP;zg4x8hF&)fa=6&YZ%qiw9)6d*u?lTJ3z*ev`*=p9y2H1M`adr*6o=vbq zoPCXbgMFX<4f}icH2WF*PxjyJFiW^JuF0+vSA}bi%i;36=DU`;*10yhqORSpw_M$> z<_j~Sx?qlu~ zZndY(GuPwyZ1eowbHsDT^GDBB&vj4yYtKZl-aFMh%ln9Tk$0o_Mek1UdG9svzrBRd z=&SI}@IB^h_HFdVd@uT5@%_wq$al%t=liSgwvXf{aC)woo61#kvpGBG;TCX?8woSG++iSKrY=>+|ZD(zRwqYBxsqK08$#$E4fxX$j&itadJNu66#%`GPay>~yA`d!1d*1I{zf%TCET z=)CXDp(oRE6J1Wvq#vah(@)SpqGR+H$atFGL%&V$qYpy9e@kcRUivcq89hjokn2Kb z3Nw>o7!I=i7}LzGWi~KBW?o{_%pT@l=0oN@bA|Z_0o#4{Die1xOGhDRm5!X`JO4ruI6YZZX{tGVX BfCm5o