; $Id: cw_bbselector.pro,v 1.6 1993/12/22 23:34:09 kirk Exp $ ; Copyright (c) 1993, Research Systems, Inc. All rights reserved. ; Unauthorized reproduction prohibited. ;+ ; NAME: ; CW_BBSELECTOR ; ; PURPOSE: ; CW_BBSELECTOR is a compound widget that appears as a pull-down ; menu whose label shows the widget's current value. When the button ; is pressed, the menu appears and the newly selected value becomes ; the new title of the pull-down menu. ; ; CATEGORY: ; Compound widgets. ; ; CALLING SEQUENCE: ; widget = CW_BBSELECTOR(Parent, Names) ; ; To get or set the value of a CW_BBSELECTOR, use the GET_VALUE and ; SET_VALUE keywords to WIDGET_CONTROL. The value of a CW_BBSELECTOR ; is the index of the selected item. ; ; INPUTS: ; Parent: The ID of the parent widget. ; Names: A string array, containing one string per button, ; giving the name of each button. ; ; KEYWORD PARAMETERS: ; EVENT_FUNCT: The name of an optional user-supplied event function ; for buttons. This function is called with the return ; value structure whenever a button is pressed, and ; follows the conventions for user-written event ; functions. ; FONT: The name of the font to be used for the button ; titles. If this keyword is not specified, the default ; font is used. ; FRAME: Specifies the width of the frame to be drawn around ; the base. ; IDS: A named variable into which the button IDs will be ; stored, as a longword vector. ; LABEL_LEFT: Creates a text label to the left of the buttons. ; LABEL_TOP: Creates a text label above the buttons. ; MAP: If set, the base will be mapped when the widget ; is realized (the default). ; RETURN_ID: If set, the VALUE field of returned events will be ; the widget ID of the button. ; RETURN_INDEX: If set, the VALUE field of returned events will be ; the zero-based index of the button within the base. ; THIS IS THE DEFAULT. ; RETURN_NAME: If set, the VALUE field of returned events will be ; the name of the button within the base -- ; N.B. this is ignored if the button has a ; bitmap label. ; RETURN_UVALUE: An array of user values to be associated with ; each button. Selecting the button sets the uvalue ; of the CW_BBSELECTOR to the button's uvalue and ; returns the uvalue in the value field of the event ; structure. If this keyword isn't specified, the ; CW_BBSELECTOR's uvalue remains unchanged. ; SET_VALUE: The initial value of the buttons. This keyword is ; set to the index of the Names array element desired. ; So if it is desired that the initial value be the ; second element of the Names array, SET_VALUE would ; be set equal to 1. This is equivalent to the later ; statement: ; ; WIDGET_CONTROL, widget, set_value=value ; ; TRACKING_EVENTS: Return tracking events ; UVALUE: The user value to be associated with the widget. ; XOFFSET: The X offset of the widget relative to its parent. ; YOFFSET: The Y offset of the widget relative to its ; parent. ; X_BITMAP_EXTRA Number of bits at the end of each row of a ; bitmap label to ignore, only used for bitmap ; buttons. ; ; ; OUTPUTS: ; The ID of the created widget is returned. ; ; SIDE EFFECTS: ; This widget generates event structures with the following definition: ; ; event = { ID:0L, TOP:0L, HANDLER:0L, INDEX:0, VALUE:0 } ; ; The INDEX field is the index (0 based) of the menu choice. VALUE is ; either the INDEX, ID, NAME, or BUTTON_UVALUE of the button, ; depending on how the widget was created. ; ; RESTRICTIONS: ; Bitmap restriction removed, but return_name and bitmap are ; still incompatible. ; ; MODIFICATION HISTORY: ; 1 April 1993, DMS, Adapted from CW_BGROUP. ; 22 Dec. 1993, KDB, Corrected documentation for keyword SET_VALUE. ; Sept 95, SJT (U. of B'ham) Modify to allow bitmap buttons ; (rename CW_BBSELECTOR to avoid potential confusion) ; 4/12/95; SJT: Add the tracking_events keyword. ;- pro Cw_bbselector_setv, id, value ON_ERROR, 2 ;return to caller stash = WIDGET_INFO(id, /CHILD) ;Get state from 1st child WIDGET_CONTROL, stash, GET_UVALUE = s, /NO_COPY if value lt 0 or value ge n_elements(s.ids) then $ MESSAGE, 'Button value must be from 0 to n_buttons -1.', /INFO $ ELSE BEGIN if (s.bits) then $ WIDGET_CONTROL, s.menu, SET_VALUE = s.names(*, *, value), $ x_bitmap_extra = s.x_bm_ex $ ;Set menu label else WIDGET_CONTROL, s.menu, SET_VALUE = s.names(value) s.select = value ;save button that's selected ENDELSE WIDGET_CONTROL, stash, SET_UVALUE = s, /NO_COPY end function Cw_bbselector_getv, id ON_ERROR, 2 ;return to caller stash = WIDGET_INFO(id, /CHILD) ;Get state from 1st child WIDGET_CONTROL, stash, GET_UVALUE = s, /NO_COPY ret = s.select WIDGET_CONTROL, stash, SET_UVALUE = s, /NO_COPY return, ret end function Cw_bbselector_event, ev base = ev.handler stash = WIDGET_INFO(base, /CHILD) ;Get state from 1st child WIDGET_CONTROL, stash, GET_UVALUE = s, /NO_COPY if (ev.id eq s.menu) then begin st = ev st.id = base st.handler = 0l efun = s.efun WIDGET_CONTROL, stash, SET_UVALUE = s, /NO_COPY if efun ne '' then return, CALL_FUNCTION(efun, st) $ else return, st endif WIDGET_CONTROL, ev.id, get_uvalue = uvalue ;The button index s.select = uvalue ;Save the selected index rvalue = s.ret_arr(uvalue) if (s.bits) then WIDGET_CONTROL, s.menu, SET_VALUE = $ s.names(*, *, uvalue), x_bitmap_extra = s.x_bm_ex $ ;Copy button's label to menu else WIDGET_CONTROL, s.menu, SET_VALUE = s.names(uvalue) efun = s.efun WIDGET_CONTROL, stash, SET_UVALUE = s, /NO_COPY st = { ID:base, TOP:ev.top, HANDLER:0L, INDEX: uvalue, $ ;Return value Value: rvalue } if efun ne '' then return, CALL_FUNCTION(efun, st) $ else return, st end function Cw_bbselector, parent, names, EVENT_FUNCT=efun, $ RETURN_UVALUE=return_uvalue, $ FONT=font, FRAME=frame, IDS=ids, $ LABEL_TOP=label_top, LABEL_LEFT=label_left, $ MAP=map, RETURN_ID=return_id, $ RETURN_NAME=return_name, $ RETURN_INDEX=return_index, SET_VALUE=sval, $ UVALUE=uvalue, $ XOFFSET=xoffset, XSIZE=xsize, $ YOFFSET=yoffset, YSIZE=ysize, $ x_bitmap_extra=xbme, $ tracking_events=tracking_events ON_ERROR, 2 ;return to caller ; Set default values for the keywords version = WIDGET_INFO(/version) if (version.toolkit eq 'OLIT') then def_space_pad = 4 else def_space_pad = 3 IF (N_ELEMENTS(frame) eq 0) then framet = 0 $ else framet = frame IF (N_ELEMENTS(map) eq 0) then map = 1 IF (N_ELEMENTS(uvalue) eq 0) then uvalue = 0 IF (N_ELEMENTS(xoffset) eq 0) then xoffset = 0 IF (N_ELEMENTS(xsize) eq 0) then xsize = 0 IF (N_ELEMENTS(yoffset) eq 0) then yoffset = 0 IF (N_ELEMENTS(ysize) eq 0) then ysize = 0 if (n_elements(xbme) eq 0) then xbme = 0 top_base = 0L next_base = parent if (n_elements(label_top) ne 0) then begin next_base = WIDGET_BASE(next_base, XOFFSET = xoffset, YOFFSET = $ yoffset, FRAME = framet, /COLUMN) top_base = next_base framet = 0 ;Only one frame junk = WIDGET_LABEL(next_base, value = label_top) endif else next_base = parent if (n_elements(label_left) ne 0) then begin next_base = WIDGET_BASE(next_base, XOFFSET = xoffset, YOFFSET = $ yoffset, FRAME = framet, /ROW) junk = WIDGET_LABEL(next_base, value = label_left) framet = 0 ;Only one frame if (top_base eq 0L) then top_base = next_base endif ; We need some kind of outer base to ; hold the users UVALUE if (top_base eq 0L) then begin top_base = WIDGET_BASE(next_base, XOFFSET = xoffset, YOFFSET = $ yoffset, FRAME = framet) next_base = top_base endif ; Set top level base attributes WIDGET_CONTROL, top_base, MAP = map, EVENT_FUNC = $ 'CW_BBSELECTOR_EVENT', FUNC_GET_VALUE = 'CW_BBSELECTOR_GETV', $ PRO_SET_VALUE = 'CW_BBSELECTOR_SETV', SET_UVALUE = uvalue if n_elements(sval) le 0 then sval = 0 ;Default selection index s = size(names) n = s(s(0)) if (s(s(0)+1) eq 1) then begin ; Bitmap buttons i = names(*, *, sval) menu = WIDGET_BUTTON(next_base, /MENU, value = i, x_bitmap_extra = $ xbme, tracking_events = $ keyword_set(tracking_events)) ids = lonarr(n) for i = 0, n-1 do $ ids(i) = WIDGET_BUTTON(menu, value = names(*, *, i), UVALUE = i, $ x_bitmap_extra = xbme) bitflag = 1b endif else if (s(s(0)+1) eq 7) then begin len = max(strlen(names), i) ;Longest string = 1st value len1 = strlen(names(sval)) ;Initial string length if len gt len1 then $ i = names(sval) + string(replicate(32B, len-len1+2)) $ ;+ slop else i = names(sval) if (n_elements(font) eq 0) then $ menu = WIDGET_BUTTON(next_base, /MENU, value = i, tracking_events $ = keyword_set(tracking_events)) $ else menu = WIDGET_BUTTON(next_base, /MENU, value = i, tracking_events $ = keyword_set(tracking_events), font = font) ids = lonarr(n) for i = 0, n-1 do begin if (n_elements(font) eq 0) then begin ids(i) = WIDGET_BUTTON(menu, value = names(i), UVALUE = i) endif else begin ids(i) = WIDGET_BUTTON(menu, value = names(i), FONT = $ font, UVALUE = i) endelse endfor bitflag = 0b endif else message, "Illegal type for names array." ;Make returned value array return_uvals = 0 if KEYWORD_SET(RETURN_ID) then ret_arr = ids $ else if KEYWORD_SET(RETURN_NAME) and not bitflag then ret_arr = names $ else if KEYWORD_SET(RETURN_UVALUE) then begin ret_arr = return_uvalue return_uvals = 1 endif else ret_arr = indgen(n) stash = WIDGET_INFO(top_base, /CHILD) ;Affix state to 1st child if n_elements(efun) le 0 then efun = '' WIDGET_CONTROL, stash, $ SET_UVALUE = { $ Menu: menu, $ Efun: efun, $ ; Name of event fcn Ret_arr: ret_arr, $ ; Vector of event values Select: sval, $ Uvret: return_uvals, $ Names:names, $ ; Button names must be stored as there ; is no way to get_value a bitmap ; button Bits:bitflag, $ ; Is it a bitmap array? X_bm_ex: xbme, $ ; pad bits for bitmap labels. Ids:ids } ; Ids of buttons return, top_base END krwvwwgwwrwwgwfrwvwwgwwrwwgwvgrwvwwgwwrwwgwvwrwvwwgwwrwwgwwwrwvwwgwwvwwgvvfrwvwwgwwvwwgwggrwvwwgwwrwwgwggrwvwwgwwrwwgwwwrwvwwgwwrwwgwwwrwvwwgwwrwwgwwwrwvwwgwwvwwgwwwrwvwwgwwvwwgwwwrwvwwgwgbwwgwwwrwvwwgwg{wwgwwwbvvww'ggkwwgfvgkfbwv&ffkfwffbfkf"wv"&+bwb"&"+""wr""++wf"""+"wrwb!!+""wr++wb"""k+wvb"+&wf"&&k+Ewvff"vwgfffbvww'ggkwwgffgrvww'wgbwwgvwgrw+wwgwwvwwgwwwrwkwwgwwvwwgwwwrwfww**H++Y,c,- --, -,N,P++T*)(( (}' '&%&%$Y$####"]"!!!! O '0Jp?fY'mh:VZ"c-`l(U5"UH[WG5hjnZR$ "9+<++,,o--G.--'--_,+**)N)(((&&&%%|$V$###'#k"""!R!M! & k b kJw@I2:O1&QN]#s\ffR]?F?* *&+0,Y-o-(.V..w.'.[-8-B,,**) )(&('&G&B&%;%$k$C$#p#"""!!_!! S h u,p2V<my?=^y0D5c'6a ~}(xdF]1^62l%&"z$'(...*//g.L.-b,,g+**])H)(('&&%%%$$w$#|#j#""!!;! ! T IfbkE9- NMMJ.`!Ag[%~rz{=x<.6wC a!B"h#2&-//N//.-,"-+4+**))(I('&b&d&%$<%$###{##"$""t!F! k > g*Q*jD9fE[~.%%pJrHt n'm9eES1>s w"%a.z0n0/f/.R.-,~,,+*))])('9'"'&R&%%G%$_$x##t# #"9""!H!! wxE6_-"(C2pol)>5UcaC>Y]He{c !!&00000/.e.T-*2,++**)@) (D'e'&&X&4&%)%%j$9$9$#%#""!!!E! o  a !0W^.L{EKj I_^M1s+Z*es&r@b#?$!}-'1z111;1X0/..-,,++*u**=)(s('d'&&%%{%$$$-$A$""""!!! } K W  WF"zY[|C)IS 1T[M17#aYrTm8v OCrl*O7" !(#!#&3e'/0 2211o1/l/.\.--,+++**j))>(('4'&&3&%W%g%$1$#3# #="D"7"!!d!p! E Ybg`n(aK$$ePcOg ?=aO:Y!%\*#$Sa[^$v,3[32K21F10/[/.--,,+*+*)d)O)(('j''&%%%%}$A$##]#"""""!=! ! F # =ZN|dl$  h,B-g*\ .  u%(a!# ac#/3/43f32210/E/R.--,E,+3+*A*))(k((1'''w&4&%\%l$$$$#b#'#"""!!W!!! W \f x_ wt U(Pe<9'I{=Ae^|,>e  J  E %&d!vq"X1 5I54332210//.-o-,,,++R*))(((=(s'&&&&4%%$$B$$#v#"]""D""!!\! o ! fE*\86TC Ib:/+ ")MyHN3iu.@kIrT $ U  f P e x(%H=7t"155-54\4f33^21w0>0/..-`-e,,+>+**((H)|(('V'&&x&%!%%$$%$###F#!#"\"!!1! y w   mTd&}S0Oc4Y2"Ws}g-N}E|Lb4 - 5 M K U U&$r[!m/6G6s65'5q4+42k21:10///).-d-,+++*n*))i)(''l'&I&%%%%$$I$$#N#"";" "!!>!'! s  q>S\daaa6s64h/UPQ: \ ~ s | (s#'oo(877?7S665433t2 2q10//8/.--x-_,',+W+*0*)P)1)r(''&&o&%%q%&%'$q$###H#"""!x!!! k V8='nY3O>'*15\GpD1@vW M D'#k*88r8R76I654332W2R1100x/.+.---W,+|+**0*)l)((=('''&k&%%%%$%*$'$#?##""9""!!!=! : P|;5]50P/A0/6io|_kyB,(v# K *Q"z?)984997[7d655a43 3292,10/)0/6..--,,+++*&*))(1((''&&V&%%y%1%$D$W$##2#"=""!!!D!A! p4<?;FIQr=]k_{>H\MR ("})v k)XQ&8T:k;98,876c66o4q433>21e10///.>.-U--Y,+@+**`*)A)((*('^'&&I&&%%$%$######m""!!!/! { + < > HN*mhZf,U_"'6>&x} t : } !! 3&w)1uJI#4U;:u:9H988z765544731c1y131E1s0//q.E.--,V,0,C+ +*m* *T)(c(b('>'u'&&%k%$$$G$###'#""`""!!F!"! ^ V nAN.IR{C,F p x !>!!#%C&[rt q[ !p.Q<;;::98(87654C443 312K211g10/z/.-.;-,o,+z+$+*[*)H);)((x'~'}'&&&%2%$$f$##$#>#"R"=":"!!! l  v j0[C_LtZ<'EHQQ Y { Q !!R!f!i!!S#+%@gC U ,;!=;(u>o>=K=~<;;:":\98 8^765 6-5r43k3221U10N0//.a. .}-,,>,, +**)*)(<('''&&(&%%%L%$b$!$#]#A#""O"0"!S! !!v r H   *?QA%_"4)z] x "!|!R!!!!C"""0"h('%Ba!9@?@?>=7=D M s !M!!!!:" "<"w"c") $H %*+{JW1@A@@p?P?>==3='<;:9}99g8 8K7n655t4Y43=3}2w2Q1E1$1%00/.p.-t-,L,+G+*M***)')(l('''&&@&%x%_%%$$5$$#R#""]"!!a!(!E! : 0[p F Mnu]   U!!O==e<;2;:9*9#9'8.76*55o544g32B2110S0///.-!-u,f,++x+**))((P('U'h'&e&%%%Y%$$r$$#9#""""!=!@! |1 e S G g' #  S  K J p 5 K!1!!!!"""""#$*#@#=CbCBB|BAA[@B@?^>==s>;n;x:9`997666A6x54q44;32211|0T0n/...+.`-,Y,,,++*P*)))(]((''&w&T&%%]%$n$##P#*#"j"D"!!! 3 m 3!E!! N { r p  t H!&!?!!"!!"0"""""#+$WyX R X5'E%EDDCCBAA@4@}?>1>><<;:L:z9N8&8776664{43'4221]11/P/./.--;-,z,+h+*C**)((o('h'Y'&&&&%/%$$$#r##"h"<"1"!!!!Z!!!!^! ! H! ! S!!!!"B"G"""{""7##u#)%a,%pa_>RQ\,E+FFEdEDDCCACA@h@?,?>N>=i<;;:998877665404$42252161@0//.-~-$-, ,,++**)((s('('o''&&&%%$L$##y# #"C"P"7"""!!l!u!+!i!h! !e!T! K!!c!!!!"O"3"D"0""###M##l#*v("`FT9D,k2#+=KGGFGGEMEDLDiCBJB{A@3@?>>=.<; ;f;:R9987 7664,5$4322110P0/U/.4.i-@-,,,+**L*))((t(p'j'q'&S&%%$j$Z$###t# #""j"!"c"""!!!!!~!!J!!p!!!!!6"+"`"@"""""5#d#####Y+&=hoKSY,EIHHHGGGEgEDDmCB B;A@?>P>==a<;::Q:29977#7c6b5E543s32?2^1810/..n.-m-C-,+Y+5+*R*&*%))K([(']'&M&%i%%$$[$$ $s#U#4#""U""i"z""+"4".""!&"!!!("#"Z"a"h"""'#######$$$#)2'9~v 8R)GKJJ6JIIxIHHGFFEDCCCAg@@Q?>5>==< >t=/=<;J;998 8m76654x44"3^21!10?0/...H-,,E,W+,+*4*)8)((!(')'&h&%%I%$$l$$$$###@#j#t###;#"" #n"""""#C##U#####D$$$$% *#Kz`uN-VLNNNNMiMLKKJ>IzHG$GgFE5D;DC7CrBsAA??>==-=;;:98876Q65,5C43F32B2.1L090/P/.--,1,,+*j**)(y( ('p''&%%% %%$$$y$$`$##=##;#w#;##l#Y#:#r###}#####$#^$$$$$P'8((n0/9X_$O$HPQEPPO{O=OFN;MLKJJIHG GFEBE2DCBB@AS@ ?> >=+=_<;;:98 8!7636c554k3211r0(0//.- -,,q+***)?)(((('&.&&&%%%U%$$$$$$H$# $$2$#&$$}$Y$q$$v$$$3%$J%k%%G(,/# ! f 6%|ETTTiTvSR|RQFQPO?O;NMLK#KNJIHGFFED0DBuBA@i?>>=<<";0;9X9s8 7626&5440321X100/..-O-,R,N+,+*E*$))(<(('%'&&&B&%%%%%>%$d$$P$x$=$$$$d$$$$$O%$%D%9%%%P%~(*! c _ Z c3`Y1VWVVUU.UT"T!SCRTQVPONN"MLK2K JIHOHGFEDCxBA@E@v?p>=c=g<;c:997o766|553b321N11@09/.-.g-,,++***)(('H(''a'"'&&K&6&&%%M%%\%\%B%$%'%%D%%$t%%}%%&%%%%) #qT* f#RX$IyYX{XxXWwWLWgV VUSS`QQQPONN_MLLJnJHrH_GjFaEDCBAA@??==<;U:98i8D7]665433l210h0/6/..!-d,U,+6+*@*)N)_)((H((''5''&&]&%?&t%%M%%{%%%%%%%&%%&&&Q&&'B(OX"xEt0t A b Wk+ :Zh[:[%Z><<;:9876^6d543N3-2c1I1S0//X.-b-,,h,+* +*Q**)()("((F('''''&&'%'`'&^'''''s'{'W)(#`@j5 _ E n 3"O<_faAbyaaa6`_ _^]>][ZZaY$XWVUTSxRQ POOeN-M LJ~IHGFEDCBA~@V?>=<7<8;:97775 54322"20C0/..:.,,L,U,+I+**^*))'))) )H((''\'''''''''|''A('(*-&V xv oO\M$?}cYd7ddccmcaa;a:`_]\\Z4ZBYXWlVTTbRQ^PGO%N,MLJIIGZFE[DC_BXA#@v?>=<9;d:98k87U6O544G3221J0//..-w-$-,,+K+8+**i*))i),)(((<(s(l(4('(K((K(w(4(H(((): +H0 +  XR\^e0_dffBgf:feXe&eFcb*b&a_[_X^k]\z[ZXX W4UT S!R6QORNKMLJKJHGRF!ED@CkB=A @>>=<);9}98086B6 54@42_210R0/..7.-7--P,(,+++***s*s))!)()(((((((((($)D)L) +-$%cbe%P( k !3Asq#X?V^jjijhhg>gedccbb0a`^\T\oZ~YXcWVTSSRPPNMLKI'IG;FaEDBA A?>=<;5;:887z6525 43631100//..-e-l-,k,++z+@+**))p))*)>)x))c)d)v)`)D)")5,T(M(|x B e p6T]!8k1mZmljjj3kihffeOedcb`T_]\V[YWXWU]TS7RQQONMKwJI5HFE ECvBA+@??>4=e0~/N/..#.o--,,_,+s+**5**)?*\**&**))))) *`)#b< `ue F W ) t \`md68%Zooonojnn.mhl?kj;jhagQf ewd c`_L^E\[ZXVV%UGTRQOONMK?JHRGFE.D+CA@?>>=;}:99876544321T1!100t/:/.--*->-,,++++ +**C+Z+***U*@**l+)"#AFP$e( ` C T Y Zd5Ikrrr=r6rzqonmAlmlkjxhbgeccaY`_\ \Z)YWV3USQPOMFLJIHG FECBA*@?>= <;:99766Q543@3 3111T0<0G/..G.---,,S,++++++9++**"+*+L&ljn $d"   E f $ EW$KoFH Zl!5!\&vuptrs6srqfo_opnm&lkigfdca.`^]5\tZXW VTRKQPN`MLJ I!HFoEiD~CB\A@+?R>=;:987d7)6%6N5543E32 2110//2/.--v-o-,,-Y,,,@,++++++I&&u@X=%S~C g  B % Lt<G {3gt xDywxx9wvuu|usRr8qo.nlykigfdcba^][YXVUSRPpO}N+M^KIHGFWECBB??C>=b<>>9=<;d:9X8K8Y77"655]4L43J353|21110E0/*%E"^>\[{ mh2U9 Y ' 5Gs3F(My#ʼn?.]% ~|xw)u9smqomkige_d~bc`^\Z Y]WUSRtPNMKIdHzGEsDB A@??>=<;o:99d87b7655)5*4(4332f21d1/|)"q/ON &V%5 J 7fo`  i o n tRPH{#[EVt`' cXL}n{AyZwuJspoamkHi:gebTa^\[ YWVT-RXPTOMKLJH1GECBBA@?>r=<;::9887776 6|5 5<44=3'3D2/'4 &Rr6ClNz7 j |va|co W eHNLq_Cx*{*hߎ :e~o}Yzx;wts1p9nkiLg,ecaJ_]ZYVX9VTRPN*MKJHrG=EzDDB'A@@>y=<*>1=J=<;;e:988H872z*e$><kg~Q z@ &WX}^`_ T | B.'["0[K(~{+yvtqnl:jhedbp`]ZY XUDTPRPNMLJIlGMGED^CB}A8@c?W>L=<<;M:984,%mhB1gmfO r\\=Y{arrq7 $ / ('njYoK "2=^ӔƑԎ؋ep|{yDwtmro@k*eeedas_]4[:YWUVSHRaP+OMLJIH GsEDACB@o@?>><;; 5+ %"CQ_I-  gj`SJWsgr T pT~|;vB?p $M8k 才}>|yvt4renj1igtfc a_U]}ZX+WUSQPN<6,&"i*HZ   gPIQGWLeKgYbsr^g D ; [ X-'6 "(RK%rcԄ~l|yvutrnljgyecka$_'\ZXMW.U@T3RPOMK`JHGF]E^D,CAH?9/(%!1caB^)>]^m&  ~o`LUGFh\Heyy/ ' : +Q\ f3vzZY!% 1RWSpņQ~{xvsqLoliZgpecF`]\ZX)WUSRP]NLKJQIFC3l1z,&$}#f!T@uONGQht`y!; m m AnkoRiqY\YEljvCd~w/ n y ] %_OI0{7w!#,0/CJT^f[GaWgka/dVc`[a[HXS3PAE807+P)n&f$!Ng[dNle[_F=Vf&O 5hoeWb:q7NTa7X`Fd}R J <&QQ/`9EE 0U!$"#|%P&'**-13-+);'%$# < !qG4y(%X_ZPQ> frTbjbOLZ1TEAVjjUsY D   Q T5gry\;-8Xr,x=dFd {-CMjs:EtcO6.18Mq$5R gvbhK`GqM8UXj^{froxa u c \ %{A$~Y6T$%T+-IwOS9/\ GzqG=c0uG\<1r2ksWj0ik F 'vxQ`N>KLHAP\SHb\dUL|} * }& \$8PL8 %2CAL3@U_!Z@Y%xd(]T#lX73&#xL bnceVT[T|2E#FLI`wZ]oxE" 8 3bbRw6z$6[:,WHECvGpQ,4g& g0ok z gSggciORGULg\XHqVhCfuzzm } \ #PXv>g3~nP]sffHu7;  ]<\}g/ ? !kh~lnXbYNDQVCHBFHgQc^tlpuv~f 3D<EW,KC)mc}g `nL*YP!qI$ _$[7F<RqNM 8 E gttdjjm[m;XiM|-HcEI]dd]jzetX L ] 6 N9g,KL) !GX|3 pgT3l;VqGGS `e(B  + pszn]]rv^RAShSWO;75Vka\UJ\ruf HaI!=HWF)E5+pK_g1u4'QO Z\I&dm \ nE)t{hm|sUc]`FhAQ4F>3l[ilZuR|np`zr2 v {  emL6t q(~V  A6=#Gs>Z @\om{X  tj[\Fb_ncWVh|ZWE6L(X%@Xxl\L^s\R`ocz"?  ' !| Q}nw0\'/6d3f n ?#n-'PjLu^ 2 "Sts}YqtVe]Vi_IV^=P;B/45iUSmQiKm\dy{  W$ @\}/ *Ic'3L(x4Txd`_, vq v ( C)6yp[~kscmZQSdCQXFLSHK6>bL4pWrcqym\uw|}^W Y ] < T8gN5UD'/,Npx?xj1j ' clkvy=ybUGW[OQ@`8;J%<0'`]^_dasopqZke}{~ [  c /H>J_m_ij?J V@!aziD,4B-=M  T ' ZZ~dyhfhmPhGOEfqbH=^EAT/B<