From ab666368b19abbc503813acfd15d42d3152f8342 Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Wed, 1 Apr 2026 16:23:56 +0200 Subject: [PATCH] documentation --- example1/example.rkt | 124 +++++++------- info.rkt | 18 +- js/boilerplate.css | 3 + js/boilerplate.js | 4 + js/menu.css | 113 +++++++++++++ js/menu.js | 132 +++++++++++++++ main.rkt | 6 + private/lib/linux/x86_64/librktwebview.so | Bin 124032 -> 124344 bytes private/lib/linux/x86_64/rktwebview_prg | Bin 241544 -> 242024 bytes private/menu.rkt | 145 ++++++++-------- private/racket-webview-qt.rkt | 2 +- private/racket-webview-version.rkt | 2 +- private/racket-webview.rkt | 64 +++++-- private/wv-context.rkt | 5 +- private/wv-dialog.rkt | 4 +- private/wv-window.rkt | 13 +- rktwebview_qt/rktutils.cpp | 1 + rktwebview_qt/rktutils.h | 9 + rktwebview_qt/rktwebview_qt.cpp | 1 + scrbl/menu.scrbl | 195 ++++++++++++++++++++++ scrbl/mimetypes.scrbl | 60 +++++++ scrbl/racket-webview-intro.scrbl | 64 +++++++ scrbl/racket-webview.scrbl | 49 +++++- scrbl/rgba.scrbl | 96 +++++++++++ scrbl/wv-context.scrbl | 18 +- scrbl/wv-dialog.scrbl | 83 +++++++++ scrbl/wv-window.scrbl | 33 +++- 27 files changed, 1080 insertions(+), 164 deletions(-) create mode 100644 js/boilerplate.css create mode 100644 js/menu.css create mode 100644 js/menu.js create mode 100644 scrbl/menu.scrbl create mode 100644 scrbl/mimetypes.scrbl create mode 100644 scrbl/racket-webview-intro.scrbl create mode 100644 scrbl/rgba.scrbl create mode 100644 scrbl/wv-dialog.scrbl diff --git a/example1/example.rkt b/example1/example.rkt index beec84b..e467f79 100644 --- a/example1/example.rkt +++ b/example1/example.rkt @@ -23,36 +23,34 @@ (define-runtime-path dialog-html "example-1-dialog.html") (define-runtime-path cur-dir ".") -#| -(define test-menu (menu 'main-menu - (menu-item 'm-file "File" - #:submenu - (menu (menu-item 'm-open "Open File") - (menu-item 'm-close "Close File") - (menu-item 'm-select-dir "Select Folder" #:separator #t) - (menu-item 'm-quit "Quit" #:separator #t))) - (menu-item 'm-edit "Edit" - #:submenu - (menu (menu-item 'm-copy "Copy") - (menu-item 'm-cut "Cut") - (menu-item 'm-paste "Paste") - (menu-item 'm-prefs "Preferences" #:separator #t) - )) - (menu-item 'm-auto "Processes" - #:submenu - (menu (menu-item 'm-start "Start counter") - (menu-item 'm-sub "Submenu" - #:submenu - (menu (menu-item 'm-sub1 "Submenu 1") - (menu-item 'm-sub2 "Submenu 2") - (menu-item 'm-sub3 "Submenu 3") - ) - ) - (menu-item 'm-stop "Stop counter") - ) - ) - )) -|# +(define test-menu (wv-menu 'main-menu + (wv-menu-item 'm-file "File" + #:submenu + (wv-menu (wv-menu-item 'm-open "Open File") + (wv-menu-item 'm-close "Close File") + (wv-menu-item 'm-select-dir "Select Folder" #:separator #t) + (wv-menu-item 'm-quit "Quit" #:separator #t))) + (wv-menu-item 'm-edit "Edit" + #:submenu + (wv-menu (wv-menu-item 'm-copy "Copy") + (wv-menu-item 'm-cut "Cut") + (wv-menu-item 'm-paste "Paste") + (wv-menu-item 'm-prefs "Preferences" #:separator #t) + )) + (wv-menu-item 'm-auto "Processes" + #:submenu + (wv-menu (wv-menu-item 'm-start "Start counter") + (wv-menu-item 'm-sub "Submenu" + #:submenu + (wv-menu (wv-menu-item 'm-sub1 "Submenu 1") + (wv-menu-item 'm-sub2 "Submenu 2") + (wv-menu-item 'm-sub3 "Submenu 3") + ) + ) + (wv-menu-item 'm-stop "Stop counter") + ) + ) + )) (define example-1-dialog% (class wv-dialog% @@ -222,7 +220,7 @@ ) (define/override (page-loaded oke) - (ww-debug (format "HTML LOADED ~a" oke)) + (ww-debug (format "HTML LOADED ~a ~a" oke (current-milliseconds))) (set! has-page oke) (super page-loaded oke) (displayln "super called") @@ -259,11 +257,13 @@ (λ (el evt data) (send this choose-dir*))) ) - (displayln "page-loaded done") - ) - - ;(ww-debug "SETTING MENU") - #|(let* ((div-open (send this element 'div-open)) + + (displayln (format "setting menu ~a" (current-milliseconds))) + (send this set-menu! test-menu) + (send this connect-menu! 'm-quit (λ () + (send this reset-counter) + (send this close))) + (let* ((div-open (send this element 'div-open)) (c-open 0) (div-close (send this element 'div-close)) (c-close 0) @@ -273,39 +273,29 @@ (c-cut 0) (div-paste (send this element 'div-paste)) (c-paste 0) + (mk (λ (item el str count) + (send this connect-menu! item + (λ () + (send el set-innerHTML! (format "~a ~a" str (count)))) + ) + ) + ) ) + (mk 'm-open div-open "Open file" (inc c-open)) + (mk 'm-close div-close "Close file" (inc c-close)) + (mk 'm-copy div-copy "Edit Copy" (inc c-copy)) + (mk 'm-cut div-cut "Edit Cut" (inc c-cut)) + (mk 'm-paste div-paste "Edit Paste" (inc c-paste)) + ) + + (send this connect-menu! 'm-start (λ () (send this start-counter))) + (send this connect-menu! 'm-stop (λ () (send this reset-counter))) + (send this connect-menu! 'm-prefs (λ () (send this prefs))) + (send this connect-menu! 'm-select-dir (λ () (send this choose-dir*))) - (send this set-menu! test-menu) - (send this connect-menu! 'm-quit - (λ () - (send this reset-counter) - (send this close)) - ) - (let ((make-menu-executor (λ (item elem string count) - (send this connect-menu! item - (λ () - (send elem set-inner-html! (format "~a ~a" string (count))))))) - ) - (make-menu-executor 'm-open div-open "Open file" (inc c-open)) - (make-menu-executor 'm-close div-close "Close file" (inc c-close)) - (make-menu-executor 'm-copy div-copy "Edit Copy" (inc c-copy)) - (make-menu-executor 'm-cut div-cut "Edit Cut" (inc c-cut)) - (make-menu-executor 'm-paste div-paste "Edit Paste" (inc c-paste)) - - (send this connect-menu! 'm-start - (λ () (send this start-counter))) - - (send this connect-menu! 'm-stop - (λ () (send this reset-counter))) - - (send this connect-menu! 'm-prefs - (λ () (send this prefs))) - - (send this connect-menu! 'm-select-dir - (λ () (send this choose-dir))) - - ) - )|# + + (displayln "page-loaded done") + ) (begin (displayln "Yes this works!") diff --git a/info.rkt b/info.rkt index b5d76ad..50e33af 100644 --- a/info.rkt +++ b/info.rkt @@ -1,18 +1,23 @@ #lang info (define pkg-authors '(hnmdijkema)) -(define version "0.2.20") +(define version "0.1.1") (define license 'MIT) (define collection "racket-webview") (define pkg-desc "racket-webview - A Web Based GUI library, based on a Qt WebEngine backend") (define scribblings '( - ("scrbl/web-racket.scrbl" () (gui-library) "web-racket") - ("scrbl/web-racket-version.scrbl" () (gui-library) "web-racket-version") - ("scrbl/web-wire.scrbl" () (gui-library) "web-wire") - ("scrbl/webui-wire-download.scrbl" () (gui-library) "webui-wire-download") - ("scrbl/webui-wire-ipc.scrbl" () (gui-library) "webui-wire-ipc") + ("scrbl/racket-webview-qt.scrbl" () (gui-library) "racket-webview-qt") + ("scrbl/racket-webview.scrbl" () (gui-library) "racket-webview") + ("scrbl/wv-context.scrbl" () (gui-library) "wv-context") + ("scrbl/wv-element.scrbl" () (gui-library) "wv-element") + ("scrbl/wv-input.scrbl" () (gui-library) "wv-input") + ("scrbl/wv-settings.scrbl" () (gui-library) "wv-settings") + ("scrbl/wv-window.scrbl" () (gui-library) "wv-window") + ("scrbl/rgba.scrbl" () (gui-library) "rgba") + "scrbl/rktwebview-api.scrbl" + "scrbl/rktwebviewqt-internals.scrbl" ) ) @@ -36,3 +41,4 @@ "scribble-lib" "net-doc" )) + diff --git a/js/boilerplate.css b/js/boilerplate.css new file mode 100644 index 0000000..a326381 --- /dev/null +++ b/js/boilerplate.css @@ -0,0 +1,3 @@ +body { + font-family: sans-serif; +} diff --git a/js/boilerplate.js b/js/boilerplate.js index bc4124b..5b0e7f5 100644 --- a/js/boilerplate.js +++ b/js/boilerplate.js @@ -2,7 +2,11 @@ if (window.rkt_event_queue === undefined) { window.rkt_event_queue = []; } window.rkt_put_evt = function(evt) { + evt.timestamp = Date.now(); window.rkt_event_queue.push(evt); + if (window.rkt_evt_frame_el) { + window.rkt_evt_frame_win.print(); + } }; window.rkt_event_info = function(e, id, evt) { diff --git a/js/menu.css b/js/menu.css new file mode 100644 index 0000000..2f56524 --- /dev/null +++ b/js/menu.css @@ -0,0 +1,113 @@ +div.menubar { + display: flex; + align-items: center; + width: 100%; + top: 0; + left: 0; + height: 2em; + background: #e0e0e0; + border-bottom: 1px solid black; + margin-bottom: 2px; +} + +div.menubar-item { + display: inline-block; + height: 100%; + align-content: center; + padding-left: 0.5em; + padding-right: 0.5em; + cursor: default; +} + +div.menu, div.submenu { + display: flex; + flex-direction: column; + background: #e0e0e0; + border: 1px solid black; + z-index: 9999; + margin-top: 0.4em; + margin-left: -0.5em; + position: absolute; +} + +div.submenu { + position: absolute; + left: calc(100% + 1em); + top: 1em; +} + +div.menu-item { + min-width: 150px; + height: 2em; + padding-left: 0.5em; + align-content: center; + align-items: center; + display: flex; + cursor: default; +} + +div.menu-item span.menu-icon { + width: 2em; + height: 2em; + padding: 0; + margin: 0; + display: flex; + padding-left: 3px; +} + +div.menu-item span.menu-name { + padding-left: 0.25em; + display: inline-block; + padding-right: 0.5em; +} + +div.menu-item span.menu-submenu { + float: right; +} + +span.menu-icon img { + width: 85%; + height: 85%; + align-self: center; +} + +div.menu-item.separator { + border-top: 1px solid black; +} + +div.menubar-item:hover, div.menu-item:hover { + background: #c0c0c0;; +} + +.popup-menu, .popup-submenu { + display: flex; + flex-direction: column; + margin: 5px; + padding: 5px; + position: absolute; + z-index: 9999; + border: 1px solid black; + background: #e0e0e0; + color: black; +} + +.popup-submenu { + display: none; +} + +.menubar .menu-item span.menu-icon, .popup-menu .menu-item span.menu-icon { + min-width: unset; + width: unset; +} + +.menubar .menu-item { + min-width: unset; + width: unset; + color: black; +} + +.menu-item span.menu-name { + text-wrap: nowrap; +} + + diff --git a/js/menu.js b/js/menu.js new file mode 100644 index 0000000..12521b0 --- /dev/null +++ b/js/menu.js @@ -0,0 +1,132 @@ + + +window._web_wire_popup_menu = function(menu, x = -1, y = -1, kind = 'popup') { + if (menu.id == '#f') { menu.id = null; } + let menu_id = (kind == 'popup') ? '@@popup-menu@@' : '@@menubar@@'; + let submenu_els = []; + let triggerMenuItem; + let clearPopupMenu = function() { + if (kind == 'popup') { + let el = document.getElementById(menu_id); + if (el !== null) { + el.innerHTML = ''; + el.style.display = 'none'; + } + if (menu.id !== null) { + // Delay this trigger, because one could have choosen a menu item and we want this + // to be triggered before the clear command is send. + // But if no menu item has been selected, the clear command should + // eventually be send. + setTimeout(function () { + console.log("Sending clear trigger for menu clearance : " + menu.id); + let obj = { evt: 'menu-item-choosen', id: menu.id, menu_item: menu.id }; + window.rkt_put_evt(obj); + }, 250); + } + } else { + // hide all submenus + submenu_els.forEach(function (el) { el.style.display = 'none'; }); + } + }; + triggerMenuItem = function(id) { + console.log("Triggering menu item : " + id); + let obj = { evt: 'menu-item-choosen', id: id, menu_item: id }; + window.rkt_put_evt(obj); + }; + let showSubMenu = function(menu_el, item_el, el, parent_type) { + if (parent_type == 'menu') { + el.style.display = 'flex'; + let rect = item_el.getBoundingClientRect(); + let r = rect.left; + let t = rect.height; + el.style.left = r + 'px'; + el.style.top = t + 'px'; + } else { + el.style.display = "flex"; + let rect = menu_el.getBoundingClientRect(); + let irect =item_el.getBoundingClientRect(); + let r = rect.width + 5; + let t = irect.y - rect.y; + el.style.left = r + "px"; + el.style.top = t + "px"; + } + }; + let hideSubMenu = function(el) { el.style.display = "none"; }; + let makePopupMenu = function(el, menu, visible, type) { + let i; + let N = menu.length; + for(i = 0; i < N; i++) { + let item = menu[i]; + let item_el = document.createElement("div"); + item_el.id = item.id; + item_el.classList.add("menu-item"); + let item_el_icon = document.createElement('span'); + item_el_icon.classList.add("menu-icon"); + if (item.icon) { + let icon_img = document.createElement('img'); + icon_img.setAttribute('src', item.icon); + item_el_icon.appendChild(icon_img); + } + if (item.separator) { + item_el.classList.add("separator"); + } + let item_el_name = document.createElement('span'); + item_el_name.classList.add('menu-name'); + item_el_name.innerHTML = item.name; + let item_el_submenu = document.createElement('span'); + item_el_submenu.classList.add('menu-submenu'); + if (item.submenu) { + if (type == 'submenu' || kind == 'popup') { + item_el_submenu.innerHTML = '>'; + } + item_el.setAttribute('type', 'submenu'); + let submenu_el = document.createElement("div"); + submenu_els.push(submenu_el); + submenu_el.classList.add("submenu"); + submenu_el.classList.add("menu"); + item_el.appendChild(submenu_el); + submenu_el.style.display = 'none'; + makePopupMenu(submenu_el, item.submenu.menu, false, 'submenu'); + item_el.addEventListener('mouseenter', function () { showSubMenu(el, item_el, submenu_el, type); }); + item_el.addEventListener('mouseleave', function () { hideSubMenu(submenu_el); }); + } else { + item_el.setAttribute('type', 'item'); + item_el.addEventListener('click', function() { triggerMenuItem(item.id); }); + } + item_el.appendChild(item_el_icon); + item_el.appendChild(item_el_name); + item_el.appendChild(item_el_submenu); + el.appendChild(item_el); + } + }; + let el = document.getElementById(menu_id); + if (el === null) { + el = document.createElement("div"); + el.id = menu_id; + el.classList.add((kind == 'popup') ? "popup-menu" : "menubar"); + if (kind == 'popup') { + el.classList.add("menu"); + document.body.appendChild(el); + } else { + document.body.prepend(el); + } + } else { + el.innerHTML = ''; + } + makePopupMenu(el, menu.menu, true, 'menu'); + el.style.left = x + "px"; + el.style.top = y + "px"; + el.style.display = "flex"; + let clearer_f = function() { + clearPopupMenu(); + document.body.removeEventListener('click', clearer_f); + document.body.removeEventListener('contextmenu', clearer_f); + }; + document.body.addEventListener('click', clearer_f); + document.body.addEventListener('contextmenu', clearer_f); +}; + +window._web_wire_menu = function(_menubar) { + let menubar = JSON.parse(_menubar); + window._web_wire_popup_menu(menubar, -1, -1, 'menubar'); +}; diff --git a/main.rkt b/main.rkt index 97d324f..bb44d12 100644 --- a/main.rkt +++ b/main.rkt @@ -6,12 +6,18 @@ (require "private/wv-dialog.rkt") (require "private/wv-element.rkt") (require "private/wv-input.rkt") +(require "private/rgba.rkt") +(require "private/mimetypes.rkt") +(require "private/menu.rkt") (provide (all-from-out "private/wv-context.rkt" "private/wv-window.rkt" "private/wv-dialog.rkt" "private/wv-element.rkt" "private/wv-input.rkt" + "private/rgba.rkt" + "private/mimetypes.rkt" + "private/menu.rkt" ) webview-set-loglevel webview-version diff --git a/private/lib/linux/x86_64/librktwebview.so b/private/lib/linux/x86_64/librktwebview.so index 8a3dc763eb3c26f244f85c4c7b3cb06f1134dfb2..68053b383f6995d5227a30646593f2c56515bb44 100755 GIT binary patch delta 42501 zcmb@v30zgh`#*lq5fl*t6=jDDUIaH51;qsgLA@v@=9()i?wF|HZlGX#y;9hy$8t%{ ztUg&;nOT`)F1RmcE}4qva!^Y$Q_JQ4-p|ZjxcL42f4~3l_4=JU&dl>X^UO2vdFGip z=M0d4xYo|2wTdIu_{+CIic@lE6{pY?@O8$P6Ybk(Gf83t9 zU2#YI7-}w@VDNDo9b3XiV>Gz3Vzq^0V&AK+^QanK18@(- zJqY(Jxak@!62ma0!(~1L=}6q8WjPb+7~JD!c>>Zb+*4%Po@6644fk~1xwvQGo@p@T z8D=3v*KFK#anHj&A2(gE;m*gs5I6Plb=(%*OK~s5P1hT^i*YZ<&2ZDT0{1H1Z{vOk z_Zr-Et;M|#_j=s#;@*Jv4I7c!gqyDSaKDdx3+@kbe}tQ^t+==0{(=g)z7h%lcL)C6 ziThjJ-{Jlq_io%JxPQP+*FN0)aUZ~4irao2ibd|IEFD970{1CdK8^H8ng1E-1)0Cd zK6mm@_)V6sBfTN>l-!be9qAq1cX8jt{U>g^{>J@~{p0ktQ^NR%?btTwbf?T!w`1O_ z8Sk=r^gq-8iE!WfWyhNR6jr7*EroOh659r6x%zx!TlE6mR7ZUcDU&vBxgaN*!(L2OwX8OqB8) zYI(EOb$paPyv|*1>PE#!i}@H5POMKIZ|4J^219*n$9Y^`dy5CD7V0K>`0zGZhHJF) zGFuKa3wUcT>~jdz;D-Io_QIsv+UFlB-pt5bqS~dTUCCuv(SAOteMzTtQDqx%a84OG zbE!|xo;9Q$%6e{dqMMIWUvwo#*xQpE(2LWY``X3XDF`m+jim}eIt%e3+`6e;Sw>wS z=QfpqPU9dh<^SGhd+SCyD|T(lB2GQXLfkPh+Q?0cw{sbS07pn!!aIM8kYwB3eUu%n zkGnT3L+&D{d3yLLM>x(uk!0TW0D~da;AY537U8G9NDN7}p%L_L+quseoJC@|;Uehi za$;Oi1w*eX=+SdT`7f#GlGNi#69m_Jkr);>-m3T^58slHLOik$j1SI#<#w;2cEHrr3px;v8KoWXDQm$ASdekc}0J8?>MB z#|6XrwI3D{MA>r8TFV~%1jJBR8pNYDSdFE8ZRnv6lt`bT;7(T?IW#45 zeX=|CqCCmSUoQmh3~x*aYS{RzppO)Z;RB?cK2Z=(U{=u81JjQhKDAGjM~lSpiJX2F zUkieLmfe+3otIxG7%-e)o6vRM0Ie9f{uPO#D@VxP;KQel!C;pkhz6)(PucLtQog;M zu8GqGK>};oD)ny=Lz8E)J00zYIMjUHpDl;r)EXgZAA)U=sAupstllhq!tPuj!2mL}xJ=0Jl~5d# z4dnkU==LG|LHf#zfom=F*Uy8ZidRL2uEHe4PGW$bD4lMwU>ke`1=RT|!k~{tVyKHy zNJEg`N)Qqyy}RsKHf@A(**g{hKIzZLH0J&fE;Rol<^ARK z+aMvmFX?6s4evmyAWV|u;7Wgl?Hk%*kZ51vDZR=L zU8#iHQ~CsaieGc26P0WiWxEggLl192PNI%deyQA#806XpVEEOp4j`oprw$2%Tx`A?BvRzJ>ijLiA!BJRs@DQlZH16BhwB4Z*f}VaavDHcXL2 zW-Jo~yRRIR^lVA5E890r3lfU5Tvn_iP#jXb37M2+78>!V)>1qPvM6$I2n_Km&ZpUO>o( zjuAcog(27}hb+(VLf8qEJ$rHIxkHXw#e2dM`!tJ?aU%K)LC=w6{HyF(wCotv@@s-L zRK}Y;gFWDE1B1r0?5Gf&Dl0UVWB(%5cVrI|WsfIG`CGL_k2fq4gb$=atEGJUenA(T zmOKdCd+?cH*dJ>wcIT29r%I^L!5}g;`-qT-3Vy9e;Ns3mPmH+SrF@9=iBl2@dxv}b zLEagPHnjV)Rgk}`UEQU$uQPr6gmJHSeYt1f*b!RUX~pl$vBoO;1BUXmly~ua^Vg zvV0YSgoj~CCBL?zljLuJe3!=>aCbK_Nz3Ntx`s`%Y{_d1zMJ85S)Tn^%LBpHutySp z`fQT3!BE?9LY6bR0vE#tS)R(vwG6r}=QMo_9_nOxB+C;xzlNcP5!T>R@P=WGA>}I;C{t=fxC|?$t&7{yN}HWx3`^zG|_?En|%WAVFzxy z19ud=1nzeZ-0=?FS*&idx3AbO3z2*W?g*BU?5%8N{gb17F=r~T4eyE>hG8>|W$U2f z^GY6GraExT*l}>}L7jw39JopB8Ms{?>Yj4ozQkIlc&Da2aLXLHRtI{%9AmP|zO(1- z4Z=W= z4qT%H*PHzg?k)#zv;)_N1)9BmcQ|kp9k{-%7r1g$!e!DOxc+QDxb{aUVrMvTPq0tG zm0Mk2H`{?bg%5WBz8pX0w-Rf>|;FYk+souUuhnm|QxE8h! zTv~(eSBV2xW5-jy*;8mdaZ}YegtOlv^B)%2)0+kKgoilrnz3G>rh%I7KyAV1_w@E{>Ck3|1NSfX z3Aj-X+-wK#H|!F)KRIyo9k{=;x@q3NUpjD$9k?+pADX6C$sPC|6XlI2(J7o^sc-FF)w{JTKZiNH40~-czfdkj@UKN^$ zSrNEv9k`wj+(Pz!FK@Q17e>H=n!tWXo!=blL_2URSl~-h%3jv%C2!wE2bpvSnM^hx zT)98sG8qosF6w55(gaE%V!qwIHZiyXMo4%|L0u#dOzLI-Z519v6s1+IO! zNJ8lj+?Uz>KHjNA9qMK{aQiyY$2-s;IMA~l=>5Lj*vG%_7a8|m@+Njr4C5(Qmm441 zY__mbRHh!3d-C#ND!)Nx120d+WBJ%(yIylq!YdFk7dgL7NxR264b4{P*C1nFRFYHM zR^}0$PqO=D3i+m7J}#7!rq5Z@ghom)HfTan(;MyK?zzqTn+p6!TFp!4_a-3g7A!EE1zlr}%#Fc|dWe{D8uZm!v~&ul5(O|wRy^wef6cx>}1 zq_sM&D903^X2~%{m@QZIXqGTBT!~;~CbsD0|HNinRPx%eG;5rW{c)-_Xb-QR{0usa z;yOZq%TdLI^U1`itPHfaTy#|{50h~o89&bLw<}c>=@@q(7 zirI2G&GN6_mAOm`Z#kLFw9Yd{q_umL7rdG1DZ~=+(bhP z8#>9?|JDOCVyo#cx?r~41M6GpHGqGd6;JY2zGVNI)Ti6&zil>4son$n(yX(f&)(Nw zi_rbXsF7x|={+HpYT0kLIGNHc6{!VJJ*Neli(riz4gRR7v81d>Yd!-Iq*-%Jvr>y*8)Qa>zN$$ge1y;h*}s$y#j{cF|gjRw#j=y zZ0jyl39L55`css)D}`CV5C`7%7KFzZ_fHy_G$5&eQop|Dg1Zsu@kKmMnXNwNMHf8^ z`(sS<=k_vq6fOYNdI=0DcwEDyC=GOoZsVfJ&5Gu4pL7qX)ZZZ~XA+yu+@>To?Ja7} zCpeQUYrxB&r&+Fj1HA@)=%1(;&Sp#r&AX1S+<6P4KjB59*&4A2PHWI3p%{(@SWIOE z3*ogCj-uzHrrFwZ3m5KX*o_Ac!?&apFntVBeKXax&c{4Mx66lOVnX*!N8LY?4{+Uw zuHf~AP##IjeT8!D4q(ZAgSDT@2^Qo+Et+?O1XtXE6t@tHvGs$fPnvalVy{IHbNn#4 zdSCR2(mFIqR%cVCNPMM8v=q_r=W!XOQYN}mrmmDZaG#4@j7X)2s7!EFxq(z#xyn2W zT?fG2UAI!_52%uA?W8Xyov{@AFa>D>i&({I#Ly24B4fu!dIT4uroliy-q*a~E*@7g zn-hw-5w$23yVw%b%lnaY4?@G}pOqW)8gVYBU-1s(c$7B$W9<ipV}3MSE~Hv8f1w$3A2s+x4N@bWQ`tig zuKKeI_S&>Yd2ui})mqDJ8N?(1j0#?*uq4-+6dU%S2Ie2A=x?fZ282qvn~V7~4z;NT z%kXF+xvIJ(rmI0nCR9qs3&|`l$r?;=P`3fMp|jaCB2n+oT2F6oydxdzJ@mjM*gzm6 zNa(TLNdkXw&K6AfQ8;cgciE}w4V7{1=Ja6K?x;st*zPlroTe^07?m_@SWA|e z6B_7B;io9eG~R5Ez)s}^c)xuSERU{#rJ)8w zMizzbM|v|>BR2#KV_0sKy7PB7AU9pv!am52Q=-|W++nSMBrho1Zd#3QQ&?O`eH2bY zarv*iRNN)l?e2kc^)8z{qiy(j)JwG-M3vq2h^zZxC^37IJXY3psJ@ULoe`&`F=b|q z`pX>_JF{yGMh#$fnMJL2qs~{g_Vpc6oMq-seaPOQnHo1-rwaW{E_8Rx;hZVE=ivHY90i(y*lANh5|~ZA+L8lD-4{R10<&`^;?btWX>Xx;`t+|2OIb z2KmYFl-g$@0o;_CW`}zzyg5gh@0GI=vqPe?WW_>M)b~I)p~a25qHm)jH>#VI8qPkO z9a{S$@PG@g2xGs@4pSz-H7BOYMO2rgjw4a8jTCQ61xfREOvb_kx{TVT8v3&=03N1&}dXi!6qZRs$B!g zp&Leh6&pA=RQ>4|n>#nO!DqMZy1mt+Jl;+IJ}Zjr2-);$W=g;8%)mq2^$Bys%rNBFu}>Te6aQfyxwi zd0uGyv`Xr=>)^w>e_>Zu6ct+qzEMawTmG^<)91h>*xj17pWjrieTR))5+0V1mL1KG zrar$gENj{4^F#dGlZ|}uspoNA?I@4D!TJ=01ySpW$p86K%;FB!WCB_AYfXa5Ga)io ziaesWDhL09oP%T^!m_Iz*AFg}DI8aNWYuR@Q)D63t8krj zmE*b|bzZ==0}1l!bovV6s<^Yx3!ApSUS=oHxkBw=PYWaLds;_F^}_%F(Vqg?nuQVS zM>n{q8exnhq^GEr7a;A(>J^0fpQXMDMEz+fD_!i_74p>JRm3lf>vmi~dX5IUQs$d0 z9MYGCj4EYVHJRKi98z~7vm37rX(j1hO(y0FhxGA9vV}v+HxP%a3H?HVS3!F8GKcgY z>bwByG7{vFhF;>XI^r_9s#jbk{phdM&=vi+tE~AVUzhO!8xV%Dv_*~8XV)l1B~3-! zjtGX(Fh~R|W6!cns93pt^XH0EY`92uANK2_5T!SJz9`&tG^dFt(fj&^U)iT$__5xv z8(Xg9gU=s{OZ9Xba`X@TJqmw&$wn0Ms7mYj7r(N#ueXbtc>z>=IK(#tgWk1zwE?mk z79D!R?apd0j_f}kwe}>EbSK{PeI5f#JenFjnkGi$HsZ#i4O*+MDW*Y|WEXm_bfMiy zFe$erd-iJgJckob&=3JzvyS&ti+uv-<0ZX*@E1JT47xMGajA6Gi`nOk1O4lRM|d>j zZtS>}4r1kt1LN9PDm+D9gQSjOvhQvk1Bm5`KAG^ghBaYrmqe&=PzuU9Q0zERChDPF zOYBp&n0>M&Bsh{xD2lsWDqL_1lvTNMpI^AU-{w9N_l}flUQMR%FWlX?2$=y=<`zfX z-qhg>+}%eBnfg-Zy=pRxE^v2GJ4+qr?vC$?20fr!W03?$mAeODAa@T)L z^mYqlt2uJAeoM9UP}S2=_7770#f6 zslt8SPwdgMmc}Kh_9E~mK7<7Px2HMq4}K)z`A8rBk(wdih||ac_?a;2zwA2@Hl7hc z*03G!?8D-4wdfp+Srrimqa4G=c53T|uwnd>y|$`J5OuXEZo(b`&%ZRzl`G({r+L`O z6*6H`W=A!d)u(ybh!HYZcMCn!s>$>_&BMm;+@0dqNtwuMGM=Y-*f@8b`pd%xy*$uA zs3!Cc!4GuhHvT`Sc-T0BI@QBQ79S=G8|ul*u#tF*!bYn`mAtJdsI4pdexTzKoM?C< z9{0i^0N9#t05(E7!>+E52!l0_xH{43ynt)=Nf!BblR&b&DDE442&5fB4;s))TwAbu zE1Co!;0_R%D@AHn6VXp_SQiMH7%B4uwO6TT^9c@Xf{^(g@1d!w*Q&{6oZzsAA4Nq0 zD~=i&^hec%Y7-Duu>O0T!y1G-)nVO5gTtfo%f~8VEk4d+9b3tJ%GOqI?0Es!l4I=hnkIo{cTrsJZ$)3(uB521Yls|Uf_ zy_%v|2#6|JdmQDkzKS~4VRa)p4(q1Fm9Ul_;jr#FV&|oSN8XwVL;ee_zhguI>z10# zWmSZ7k|nK=2!o^}tedHw7hv@~!roZlB#1g!6!*&40<+uDRR!y@!#oO%5i$*>%$900 zOAd2fLxjv}eBdVRM^%$aIm~gr#2qEBNXi6NlfhX_daNrwKz-#=z>{#*stJ8Ws8`|o z&LNKLZq%uc>rj&8xZXcliEH#Bj%&?I-dgYo*X=;(zu=mH0RXNKYp|WGBa~zOnJxw9 zI0E~Cl)V6KMkxzg9v1WuAKSQ(@F9{AX-~shIe`OM$l4~sUkQ;hQsg0xbEU}ngB;kY zLMBAYd{Iqi#X$~iOCfU!U!kd~SF6dSALPJ#@1xFgU~vl8px>${^bf&a1?=qu99VbM zsSfN`lH`8igc?c60x5HyO;Yx+*B!}R+G8D zj{`ej$h4F)yUD1^0ot&S13Rt+L;-Al0=8{6MX3Zu6|n91abSm|PIX|P{s1`+>|1*) zfj#vD0UNWWlGhPD^4NYbgn;E=g7{POAnXS&V@Tkz+H+RA0q>+r#XBj8Is&VaK@!-? zhccCQ*x1y#nz~mMXZ}n8djaambot=+?Os;6F(NEo2pOc%^6Em?ShZr%T@u29}R4!KRw;eqwPu|(^blx zr6I4B*}0qhZXY3|NEvdODw&+!+;{5=neRUqZM{@YCVDsb-ACV|qVU}YglK6sp$if_ zx#v3aJ@?%|P^Y@@F5@FZd#=!3mA;$tJ^5~In@ZlX@2IUS`gOqbVo(t8CMRMP0B>W~ zeoIsJpS}DsI2#r@f@`GldEt%EGWPkF2>-@pyLjU>o`$m$vmU!RuD|i2k7GCrMPb8K zO{V59j_bQZrni(SqsA)r{O}#&8Z<=6)R8i4tI52^_IwZ@)paMC!ecG}zTL1|Tj2ym zRY>spj$jSyh&nI4@VP*v!(+k}_UebB>eg=w(gq7F$v)puJ9O&c_=kQjUjckPmA%UD zeb`h^v^HS-@w9kGN;mRoX|if#ZPvID!f@tG z_c@%wi3}QF7b`ChtrzpK-(*vvXpMS*?KZ!7| z;O-EY@}7YGX9)`srB-%)MZvS}+%M3I9nD6BW@>e1g9+{`G<%|mZ+Gn2rU;y&4EeNy zn+qQgik$1eWQm`e)bra3#1LxalkKFPc*$QC4JO1L07cOO(9Z!V9}*7eHUa48 z1gMDv`Z;OmfNmpe0Vu4f`aI5}7B#GW9#{jB<-fDzpNFcGchGX*97JTi;J3jDE>oK^)nK zVuWzFCfn$BZr+`(R70-SK7`IU)vFyL_)ty0&i#&~Nv~h~dk19aMEFr;B&ZaqRr|?k;s{h^)>BS@>7Y-QJ-#@Y&WAXQ0@W`Th;=>GeQLwHyFs z;=SWuw(KikHT+Zd!B^pdyU|jrSz+5o3F7uUq$*&r*R`Uey;E25Zl@B zu+}?b{le_*hx){7>@>DuN0aay(CFv|D+!CyDW+KY{ZzDMV<&dRM;`o$TH=e9FOAfy zYWhB;k*sp#w^{7h&4a#2l@#m&@HWwI)?hy3vMkV>}|Ih@m z>7TP-zYcdVzXf-*;{RERMjXo$f`5AqbcWwzlxrR4WeHS+k?7rY^l1jW-(1Ncd0GP|Sd$G&*zfoS!z) zFK6 z`l$~vch#7SX3KfZ_d$;HUCwcuP(J2%JxX(2^%|&GIn$+$_sA=_u0_yAqq&Z}tujJ9 z%Ki1um8x&y*mJU|Z@gpER>_k!fYn@z9XO6Ov;x#LUy9;R{1>j*f7qOFLhD&p@(@YK zgu3FG(SrZ5PrezX-ujr;`ZiLX`2lPD?Mk(53p;^Q#TNGb+Yr~|K#M*%E&2~@`dyG3 z_909CuBAHTKWr9~S~&mm-4=Dk`>gk_7V6aZ+5BBg^A^1aL(nHreXh(I^{Fx!t&fwr zM17ddrR#lVE<;b1xoo{N&+Rhh({Q(v1v*%(hsnYQD)`94HY(JiLSB(LeyBg+M0V`r zXAt#2Wuc7ZuFFCN70$^5oi5dn$bu&ozLy0f6}HI&`KbP$EYM8RSII&;6)c z=S|GAySaLPBipe%NZq-So!yDD*-RfH_tQ+1r3~@rJrP_nSJqHv`?pJQ&`4#jns?pbMMI7 z$h~9#2J())vl~bmO_T^~0!Mx5q|aM8JI$+CIeD=-H@C=^(;YGK5RQJ%Y-KL0dv+OI zceK+2vvSB*X0~?syyJv_QWa6xieEJL_z2%d5;fY=V`xlku)g)>rnzLNMS-|eU zQossIwVV{kV&C12nniJ|Nxl6b^Ajl0Z>~e9teujq-eB)7;>RzqfdQIm<_3D?5uAdP z==u@J>S60x>fYvYhX6(|%X0vf(-Mc~5D4*lZap29d(9IEf^o_X1%ymvYEidnIwN&N zU->TkXs^F&-oOs-EpPcf_!I*84$yL2uM6CP92y;lb2#|obVZ*C5t@~uo7k^Eq~uk_ z_w-(t6TK{@sg`4@mY>a*zs-nri4=;>)?l+0`;03#PqQ`I(`vAE#nP1=kyP3hvjDNb z)X7At)qrE+IT6@HIP4nC)}Air)z*HBOOoPcO0sn|Se+Ee<=%t}V^UseEun%=u^6l_ z_dPtFf55;N{A0_Bk14?!KC`v2i+S{6YmO^4w5gHe>Xu}yWp#6fMDA}%R`*4RU-Q6+ z@B1Fj=stYkWB6V(R*L%`^-z_phTFJQd8RGH#nC_(w6A$=V;U}gj1C9Eaje`@u9v(` zD7BXEhLdHMeFWO!wcJef~k$F<$gAZ?<+WKLjQAMU%?<8n$DfvHdF4Apf>H zr{QE87CujUU?R_71|LYZVAo{1y!U3!f)gr;-_i_^IgI%F>D$b6e>8>%M;I-CrCOew z;nAL{)^0AT)|VozO$(mca>D6AXlQk~NB?Xdo#W|ZZg+Y5C~FH(h~?f%wGQyKx|)k( z>zE4;dZvv&_`MBRuMXYJ9tA4^d)nx|mR4O#Qw&Z-?_wEhaG`(Pu#OEdnn$_^MQty#1-NmAF{}o>W zS?2?O{k}UZpfux29;32(HO<3Wt@I~r2+{+XbVruZoWut5UtpP|(O}-wf2G+&u_hTO zGi~~DK3S5ZiM3!2`{Y2l8h@6ZJrLaDYgB;LAV}@*0)Y6i=zYjd796CwYf0`W9-eW(R{1v=?4SU;&trRgGuW5I7D_ZIPVy2Bv=GauE^zZr|De^#RZgyp`CaM4(Fr zAVAV>F_*O5He2=ri|9`vEaK3x^3UPr;y``hbZ$c#D#M0G1&{0G)Jw7))K9*{@=AjS zEd7k{6cyIL%@U7>y3awq6iYTdqJw^U z1pPnK93WSZ^X1FlVw;Y(ZqSwwS>+Dg44v%W^hU0c$e=g+O^vx6i-=x^;+?ws zm|~l)u*9SA9g2$hsU|FV9drYU%I-vi=%&B6nq?dd={yPj?1~3L>?S&-SpLv^qAjc= zsn#htCS9s$EvJF7#XK}yZl_uPq?7gE2xLgO(<)YStf3mdik&+)Tpd@)+8%$&`(8eN z9BdOBFL*pO7eV#LbBxfre75#@LXYXZpH8Oo{s@zjRRsAv39^twg=ksGrb1&`$f80c zSs0qn8lMPLQ{H4fPIOg=EoaM5_=gwfVKa5-O@IJr0OWYE`-kQrY5)~Qz-F{tLJSXA!3ZYk5N+FNN9qa{=|vyg~b| zPIvl>A1%1?2Ah4_sP21%tvTJ^bs(6e*yAmB<+Q(l7ubeSjf2EbQt^_wF$@tMOnrkj z{4rj=x19C+WU&bnaOj4gLXRUtayQjZyWjlWgR2MH}=YD$G{Yx5(*}|;wWvuO)rs}ab*{CzE)qz%~orz5x zX%*J_^6q1EV$)A>O*XxoWIg8{;H-jW+!gialJ(mgtj^Dq)SF9TLTC2%&)%+YED>gm zwQw`WE#+n~bi-~&t)<+Itwr37wifpF*_gZ(i!kFU8sK{*yyD=Ruo_6#)hgClX`#Dh z9RzDE-v`qwh%G0+GSwHb!#~DD`i0GF?qcBvMN|oamYCWBd=AX=CtSnajY5_Z37OZZb$8MMT z)tW?{f_bdY)etpf9*ex1rcQf}&AXaX>u44@rE^*7RkM0&KC5@Fm0CWBb-gy#_v{=X z){yVA@kIWiy~%g;*vV@h)vNPZ-QQkn6a%3b!T5e2oBEqihxg_Q7M_>r-SP@v++{ih zMdEbfLMf0zKxP9-kHR;fBJxa}$M*lWtaj=|>Tg`aME1&cqdI*qn|r;#nl_L9cs;i9 zjQMcKc6bx$QJ9H?wh(KIesFZe>!&fZSkoK9jZ5%2)D_UAGlhwW1LESu?^|;wY-8Gv{ zyBVhTpUvLB8E^V-hD1l4K~9@35kdbw3J=o6X*ZkweKW~z3pi;tT4R)lPG((hEmMcj zVyA8;<{8IAW-)0gO7NomT#{?ZF#n;&Va8pVqIEBadO{AY_AqgW_us@hzdbZ z@ea>~$H+7UQA?UB18;KH48(7Ms+Z`8?CT=yITrbe16lh=VQRu;HuBM2HG49<{HV2h zbR28&xVL&ci)B7eP_1LxdngUgVhJvHW|wf{j*8EHW2`Ps%(F4-fKhDqv!1FYlihe0tS%YB zYCdnJZXe0oKaZ}r3_BAt#VF!*gAr`*^R}+-N75W9!(k!K*hp!}PCpOt6AK!7rjfjr zzut4!jgpovytSSzri<^5Di!h4)^9AIakQtX;jx%LtRRFJ^<}9xW8A(GaEIeqb@;CP zwmvIa&~ga z$}5V$x-fI)Qzg9NxZd!^>)clS27|Ns#RB?{;T+}i3~iC31grWGZHuC`QoV+2zbHy{ zy}N1EfSx`?^H-I&uI~(^Ug&nDwW+ES-e(07Uw}Ga(j?SVWl=&simSP$&l%+ibuat~ z0-(OsTPs%;qfcXWs@$7s)&LWQ{}vR5z8|WE)KL6f{{)xH_Mb}b7)j9pOezla?`Y8iZr)aJCIbgIBJ5YP4meS7al|iD_ zK1jtvHgk}6tCkY3Mh?n0n)qtGV_ceY6dAl+J41e%e)} zE#3N6+Cod(Gtvyx;JGv!fAFGgLwQB(<)#FveFtch+yKDxf!aDZ#m~J@m#SGE*F{@e z7Y?;4U?4BKGR1E$~ph)RQTi<^h+P)LYxb^XO#d03z!RF55vYXucpzpXJa6qNTp(R6BdvQ9#=hE)K>YoO*Xt_{)V{s6 zHT9M5U3;Li9DQHs5vQuP!9w#;oA1%JI4oUT8{>bU)-SH z_Bz9RQcez5A6{@AtSBj%sK@ox-fp0@30#+e9zF&cOR|}Nkn>plR4h+R6ScbyfODgs znvWMe^24558!si!Z!grAAH!oYzV!o?0phWzRG-jOTi#HK^7#xuRR=sev=?~DW%UQM zcFYSi=2j1_Rzu~bj^}y^6y)?gB#VTCN1>krtG)uM+!MJM+8Ne^+G$fSs$I1Pc61jF zTuh|~nra;zDPeg>Q>(SIOBN;8pHLBK@erA47KNSgO1-tcfaZA&(CeiUoBZ6H^YB{} zh-VKC_a*Q|)c@{ItrnUpw6aD@ta`|-HS$(WZue1h12@1E_NKA{#JS-OO634}xB3M=jF_OV8$R+EO1x-q`Nie^7QE zPC6kspu2Y7M~QECtQ(e^AX;A%Y4r={k71RMInMf1@JaqbH?6&|V(dT4j-SJhXE(`I zkDDJ8iG!2Wm2&b|O4z{(kT`Q_gS%=;&6QB?v@ar9NDm6{rkCURw2a2IY%8)fLjy#X z&rn00*3%DbX^S2d<^8oHKc!i%I5dVmnx+I`8t&&_8|M})ydqmnL)Jy>6reQMn)oAf ze37Dc^jErf`Y45Zz*j?>f$#95m^5PBwuC6?PrAMyrehKgGUWIR!sJwKufG!F_Y1mQ zp1{4cT4=bRtUdL|ig379H9OLi$c|2GcCz+b08AK{T+M_*yl6Lp7KLs^;U)~lSXVQl zxtW{bwwhzjtxVFQ1C^#KdOIW#jZcgbjmuc{XXnaT)I{~{qFoMDy64sEA}qinL?Ap) zsx*k+!jw}H%^P)_99yIKts?2tu0(QGquxg%Wz+{Il7gz&(jJSl?gAqE2QMYoMPXhz zkw{TO3|W_l-$#WMA2UAV8WRGz&2a`nd`A$+QMD7D@#t3@|Df)}XzE$qFO=|KWi?d@ zUKaEpkU-^7L2OF3i>da}PQ11c5%RdEyaYEYOegNAg8L*Agi)fMmtcl|R^$^Xe?;WZ zkxVD5G+R_UNQ9Ok@Y56eXhC(QDw?RWnI!5|N+b!1R2`=3xk6+iiIjt(n*?_%5zZ5# zfgofMp_B+J{;7P#HtN51((VK+&0QO9Ko7C8a^IjCjo5=->8$lOB5LpLtW7p5$!b6+ z?F*w4SwHPvA(tZ4j_+#sjY_o9l`OH(iHmpY(u1?Tcuc?BN$V1#bT)oW*4W8cs!N^H zi#ll=LliH+nUE^)M{g}*5FKZbuP#P((oTk8huLAh780s>Yp$V6L$xk1nAOo8wMn7M zaCLNob~F^*hYktaU!h96THaCX+8E`%9kt1g6B zso-(Eb~a2|-(hDvVFE-S)%vq>iQ{&RNk^mThbI5PG6;cN5b7Woxij)>K9`1dM4P_-iK|m zT2M13vMYV=rn={mmVZI}#Y(rNAh|aVY}7eLYj(d_QQ)ggcV3{SGa*)64pr*pmD=8B zikHVgS*Mul+-|L1Z>EH|3E}Nt)~bcFO5NT@JJJG=!O5+)J1vw0YF4y{Bg;+Iq-gC@OT}DkcPI?F)>>;3iH)jP zoHj91i3(vccrt7EeA*xMUGsGm@D?x;Zvp8<723#Iu6-K`-Nz!em+=d&)S^gjd6bgq z)tJB4PQ$|v-b~a=vz*Xtx7Kb%DOc3-t+j*E*u_1K)b2+s6IDZ$Hatd&R}V&Nt7DY0 z>htESS}9(6K9TgvveczlyL;2_>HkLYO}hR?G%c`?^drp)hYtGvmiW+u-(gX&hJFqr z7!3VQh>(|RWGgH@StQa@r1HnY@ycnYr@o_w%{GX4Vk=lx?@h-Rn=Owu)=FvPH5%&W zxwX!`&*gnuYL{9m9rCur034n5)ISy(qrORGqV=~$CQ&aInRI=z$YkiRiA=Vh%QJiO zX~-vtJRkmHBENy?eMEj6<-3Y}3FX@%pO;#+hx=Gd!6+j}h{#t^zM;q)X!loJ6h& zzm4*XM81Ubvqk=u2+Syo4oI_2u znsIoIlM8z;;^Si}X%1O@&$oqQXg| z7L}kh?6`ziz`?14QdCI8xdcyrze&`Z$L)QjuQ1Y^nOq!eNWm*0t50gX%el__dXtu) zfHz02L$oysiqUWCLejiX_eCw5d?8IlORp@{eojz&t3F1pNhjq?b$S!+VkhP0pp!v7 zs?cjZmt0r9ER+{>9@5+{2-bRbRzh5}ffSXO1ZgumD~($)Si&cxJ{#iHT8zZ99c-rl zP0bhSgnaElXT|DsH-G?nZk!g!QT?t_Y;Y=%b0*0tdwrkE^{bkM#sU?P?cnJYEmc z9(Pf?sMq|oj>$@gm|S17rCY?E7C1hDqXCI}vOhI6*T_F^l*kvpZ=jci`Rf7NhslaD zSJ|QhvL@{ z;}cLJLKMzeB-|h3Shk%ku+^AZ&+-`WN7FDk@&GOtWakJs2&U&JoJR#iUT%=N)cGgM z;yUQOA2~&z;!W*2m!P1JrhIef?Z}(Ixfr|S+``NL$>vApX3Ht_UcIw<@4xlU$`3d- zwrPODKreNWkHwkfZa4*?=*;xCV&fAPHvFU$A4>@yg?{<^F3O-;|9 z(`~la@@|K8N4nBeahskyYVw%r(?^aQgN3a}AEo)%3;QTzYxrdkk)r^Eh!k3I$f1jn2hf zL)r`JcSzq`ZnFiyWwV`q-)39B`TyUYx$b{2H+G979}U|T|L-dHg#oj_v)Ni~v)N*i zcE_EEJpK4ed!)T^ulvMi^WSf?#p9kL?>R^}!l2;2Kp6Kxl<6LY`wE^0a`WE9KmQl^ zr|e~o+3e${5v0tPA9^NR7Du^dywtCr2S6?rdDo9ztJ z>qzfXxgJhS;?d}OLz^uC=fGnTfwGXEK`{FeX`#Q(b{?rI#AaLVg0!*Cb{%P<$!4R! zDin(aHwWo;EVLy^S6~n5hS!5DuzAdI#ji$AX@!PCFkz!je`VDPd+B~ix3{<1HXzMR zfFVe|65(P9O8dLu_#e`ot~T2#qph?l>55*^hcqSKW_yg()EA-C9q9n* zqx2P?~>9#y%9w4(HsZ$o9 zMCye!4cm==NbjPYi4=ch(vXAH3+W1^5tL50*|L#tMmi7j50Dn3?DQ&z0;w0$tw>Es zA0v%LYOW7?r1?mqs{vHK6`>q+VnQ(rBcyIfxpNe}HrrQd2GrLz;qgC(_JZTb}IuOmG}_2%1b#sH*wHrrE_wjY_=u%>{*C(JJJ;e5cI;&#%=~70%^ZOKu=|)8A$gpf&!$b*KM|6k;Wpe zK$?Qo2`kKgq%Dx1L7Is40n&a*ofg|{0g$(#=TwA>D~IGY^?#$mAd` zLt2P5J`e&cZMJ1d&mc|og(5sDKStS0gP}p_InqH$x35NzD1944hm?L}nkRkOMQTF2 z`5Zccbo+VmQ9tDZyr0_n1qMQI-sX!yAQ+baiXlMibqSV&k%_bf>Em=anu17XTgTU(F360hwYrg#Td)Unwb8*nALdyaH>F~lRA zgImX}9j?U;R|2$p!|{o_<7h2%xYCN|7yr}d#sM}PCMCZT>0dnZWM$fHA5*@IyJr`7 zpCorllaGZ1mR|o&1fO$4F&l zokAa*jsEbrlZT&nGE*^XYep&|b>gw0(4Q!Dy63Ce#wggKk5q!|^z*mb=r15T9rYEm z%|}6YXQ0hSfB(?wJ4u~MRN8*ykHs3CK9A*q2G-F^)0KWu>zOOkzg z{REE`bl)vX5|af{E6G%x>SV`AYHLnSs&l5bBs3OcwIi@d#J2%a>oZDeqTS0>0&C}h zwlmhIQ^wPAEUH)otGfB-O)~DDxI|av5J#xS!XOUBy>@G zW31A}H3e%Y@7Pi8jnPUs%{UH1r&4S-`fGVkUu%)$lpe10y36u=RPN?Zt9nEa%xaQ( zQ~QJLcsdSWmR6+MZ1e|3ou-qvCR+MdkS*w_)G}MAJm6|U>gwLa`m=6_$Z8n-FbVcAU0c|MeI{y>2 zm~&P0_I0&}qHs@5!o-S(ENvS~25Zm9E0K9dY!zByI-qHO(L9X>Edn&`1}bUvSBXt8 z(1wDR0UDgRQZ5^`p`h7qBYm_j83Y;@2!0V3t3k^gVpDDRwYrm)Cdw~-dJZP>GOz-M zR#))=wDF)}pTRGZbHOeq6Ev_YX|&_XaHty#PBdt1M`-^}P+Iwor=5=jpTguk&`yoe zx=mEtxb8%rHawFI+P_mV*)~kXOZy5C$sl{eNlGKXY~9tI$7ybXBqO@*cx6o7%0p&*5*vcnGF|cIfQNvhIXg6 z+NQ}$sGk$IScgVe!Ax%L1KR$v+GV&%%@pKa#%ZpvDxoo1$QMt*0~TcHLL-KJ(C+TR zuAfuj2S`_d=2K#`A-GM!QZW5hrE5*v^A%=kyI)nB_?a+1hp=z7yQ>*>;z2u8qCJ0A z>E>66{4DV8OQaF})u82MX~U-|L4LcCH(-C6jD)UC+^0b6I9XdYMH$s4p0<79_u*V& zC+%SqU&ThrftCSUN6_qc(CFlV7XPZ&K3fURTZ?=#_<)UH)ZcBOEdz~Apo?hxL0b(P z4LDsyI}h3l&?rwArFW%1M;fi&qz^295zh-W=zF=E!Uzyap<^Q*K_delY3Wj-okrkh zf@a2mB#Hr9GhOl2`c72>Yi=XqdD@Jr*x#H--fOS6p7I9lTj%Z54o+2?)r>}d?LO_{ zRHaRwEaW#Fz((8dSA(a)3%7%6KB&!^rgW=q!2WLQA)BqOXzI!|rDg3j(27rC?X0AE zY8|Gd`PE>={-h0`uK0P}Me`IS=uZ+mji{^HMkprjV@P>)g!(gBx9M;FIyL8XOaEcKFuA+}lHmzBX(!_l~XjyRmXQbzfHath^=HY{O;^E}~676d@T1UgQ^Eryq zJqw)c*zB|>4R2~SbCpn!wV*u!Er6t_xM@$O;@nJnuHxhVD>x|=ZMMAt*C|kP%qJrkU};B-N}avDKq zb@QMN{gPdHgGilNb z=1=;=f*JMmIpn_~9FiR{x9e+sJU6~sF5QEOanIWFl@(=O@ z1TuBx*I!{{uLZjZZls1;SO+j4Fdv!eRdE8?C}3DIc%!!2dLS3@uQqO-d1<#p)Zjnr z*lu$_og!Ya_x($XIA9+DFDn1QULwS{Kfb$!zl4$;yV$Mkkb z8W?ss(!i!0f7pPLx&^B0m zA@wA&6E6?h+{=>0Nm~G7)A98e(_^z1%EdAdP6gVet1(#|l@Gwi#5QDCvIr-6VTrpX z$$h~tzDc?iz9>~|Pd#rJU)s~a@O&&|vCOdl4&K5xWi{kVN0=eD!sS-!X-E=pN=$f_ zEwC?19J7U_hy_BjreA8j3XP$sS4A3UyrG&;OGgmj#EYWi0Trvrr(SG_+nfX zm`SzFWLM*dzQ{-#a#C6a_nx5=kg{I_RtL@Dn z;`?i{*e_%rxA5ng|6t)!;5b0Fozu4*6u6#1`H2IhE$f}|C3@h5u3_Ps%nw^KI+nTP z+1~No$UMClhrVCJiko^VVC~Pm&cZ{?J1jiH-0@uRgkNGl#KK#F+tusq+scu7~Z7 zP4pLL=F>$DAJ413buxc&n9U6?(dJM)`;@yLz6Rkxs3z6R`@90zh#&*V5&dCubVDtM zRck$bt+M@X;&q&{b)e3|SqT4wAqcLtP@aHE5`&4j_Cmf$!py_Wap{ZlF>s8h>@fMw z4DvbK2j10upx8rt@e2nCO;M{h!1wB^kEwGTV6JXcnGMooi@v8OG|16|+t-sl9%P~1 zpF-(`uTx7wZ%ZW9jt1BxhK`XQHw7q9!Wsbc?_a6hQ8~5TzmPbd?V(&?y^m%}ah|Yn zz_AR5YrBaI^+FMJ>CBru$Z!kWUjaN5Ry9AW)~KAH>;F4(JhMXiCkKNU>1Z*_orA!2 zaZOhDH^OZ+k5j9_&5a)-yGO|pmqGDjc6J`9s@^28wBT$q%I+*t<4%W=MHf?D&sW-FQ$(aJLmOZ5Y4@cg< zkMIMmeny>zJO%3^HeEBX5;sM)6FBB6%tbJqgT2T0)*Akrc^fxb+_Ish!F~Yaua0YP zPs<%ee5y#qNMW|vH*$b5SFP!g%bABZkiBVwn~+D2%7L;|b!~!9?^KOVaAV_PwSWn? zabe@`5~YB7sGa<{qeXdvIli<8#iZK+919}x4sq@QBF6T@QtWS$y<7O;<<2OD6i$4h z^Cd56=awAkl9;_fC#g+xQTxJ>@AI|gLsK(J4*q6CP&~iO{}(N+)aZNa2Y%dTo)#1 z)D-dp=4Ekh-qT&e>d}{_r(h$i+qu<1r_-{Fxi~`p%b6c!UdZ-~n4i(n$#1n&o&$$6 zn3?Lok=k^v8<-bztV20;3G-+z0emciGLN}+(hEh7rg(x86B`fK_;dl~72sIy+4WR5 zrrP(geVp?S%}h%>a~}_frszIp?u?V2lN|9a#qSoyoPduN_Q;HW9$AK;-d%8Zghdel zl9X4m%>k`F0b1SpILQ>Q#dA7_WVL;Z^my;^kddIdRb0zaRBE+cpq-H`zzP#ew2&H~ zil8(B$5L=|Cezi~Epn*$1V>uUqfd~m#aF5e(v+7+_V)GMa&WP$J zJpV!Y+;CoHm=d20+j|#|CElmu3Ue9$fI@VUBQ{2IQay6F{!CRla8QwxKbUXmL$YaP z(;~xpJcX5lmYF)3tRZJ3IeWAdJOW{`oXxW2C(iHym??2uPrsdj>5e|&x-hFKZqw}j z%%d+6#|K*|Q<;Y>BTtd$B62X*<$a26oVzK^adO1^$lg?s_iNDV{(P7)M=bhAwmUpB z4?lxThfuBpbI68kR78Md*bs*u&N08tyb#{Hjlwr6-r;x>o5;{~%hSxQo&6i)?*Cg~ zB&kRL0gc6@or2s9%7%X`CC4L^xbC-U(P&m zP-ShCBa-XUk4-saJ8RlcQHUAjh&PQz@FTV;jFZZ=u5X!_(Uwz8=8z5_<*k~#TOQx) z-OQa_j}zE_3G;9sWtMiTLVO1t?jh|;$g}}%EDAzFe zH^Ic=#}t z=LU{B4)9#`2**E6a}jx8x{@crwXV#o3fMYyfXrYz(Q+sAXb1U|nO7jk`$&GWCysg( z2aoXOY}?7)`Bws_3nxq*!9G_|SvdER#a0eE3^?9HVkrUqDh5hEbKahsX+TV8UdFTY zV`MHWnKyF}9m>t6S#zO0JEhCJkBzF2Q7E%!YFCXrZ;OrZ2t19xB_Wa#8Ggk7JEbix=^T@o?`4#s+UR5!_6zyW$kIGg@Mrlb-?#$Vx z56-EmD4kh8ue>nFkCu2@IxkjrLVj$E#AP29I4R5E$xq`+ImT^{@{ODAQJ>l)kyM^yB*O$xTElxyjOB>X+YHPL!@NA7w%H z*S!>8ES+Y#2&pW#S9#C;Y{8xyd*6z$qFtLmc&m5FUyHogo+5q@?rylfal7M=_A{vS zMjPB*hQ|7sTUYWnxNcnS7U5QVudA`l2S$S%TcXxgT-dj2!)&TXS9jb!aQDRB3pZW8 zMPlfOw7<*`L^=rf5Lq6IbQtcDvOEguSlkn2*`7>9W)kknxHE8P;+|?SWE-X-L)UcN zGjY$torRmO*|@WL&S02}G#B>*+zWBPi<_=RxEJGo5BE~sbS=ZZ9QR7x8tzrN=~|8Z zecT`5{t)*X(*6-LYjM-H4)@2nH{jlg`xD%BZNj|;_m@<_^|eU&zuWQePTae2@5a3s z_deVQa391?*CE{bxDVq#g4=!_O-8OjmQEo39ycFSq(9<5jhn7>xG(XX!EhPr72H4L zzDhK<-X*XeW$5}%B!=5a@8Z^R-^cwBH(gI~KV^Tp>}ES%)0kV?c$ZIx{xxNXxokH@ z8N$|=i*nWd42DYVoKo4fVW7+{bMsR+gX!zKKEz<~A*Qm2Ev?|Iq_V+oQOZy3iJPx7 zg(Q?)+SgkYU!^ZQhr*{M#N5h9yH2kxb)ia^@=?kfRPma^sy2I4AxhDCufFH9y;v8IDA(-bPJG18aOG|9E2dUtHzD=B zxC^@k7F)RR2@Y5tHmPEi>xN<&3wa|i`M*6$ZkeZ_vY)s4loJ~gL~IbKu*cI^d7mxy z^mTnv+^Yn3*fUD00bZ11X4So-l*Sy?L{gUBCCFe1Gk6%zwiE%Tl1L2yxB+I+qset~ ztr3Y~t)!pbBnUsNBK^3mkk6kX%Fm>p8RZ4txJS^>i^T9p6;97Kth**Cz=&Uk1`?+4Al*uhBw`aj`>|d zGL{fx)Z<5j@LJMO3QG-hq@ff<=^6rWpazU5MOoTu*e^S9Rz@H@LRWzh$>-B#$CWAD zH{5{*#4wx?jBt?{zDKC8Zm427`=RJTw4^^KccO-W5rj~|Htdo^v+WB(e<3XziXM~v zHfiX7sb{(m`p==0kpmNhU-7cXiC0Cri=?+lLmVLqb*7|$?keavC_3RfDiVVt5sH=_ zgHQA8y7Y6c3nZuqORk6tgQcR+kn$dn7KHtn6?C~s=Sn*)%0oqB zNRdz*e300K5{c;fTt3_IK#p;LIlqk=LeVlf622h zv&RYP6R?k8wI$MNABeI*8sk3(5!6bh{G`m0oSQE-DLC%@HbKZYlom}UdN$3=9|WV1NDS`;2`_z|C=A*xA)Sc^cmSy{2$F43WX~S2 z5DM%*6a+EuE6GA0$nz^!c7Wmm_y7Hp@sDiSTULIlj1vVuWYNR!SOC+Zoj7z#3I zogDjMNq^7o?XuxWNpC0P#5(B{EhJqpgZ`7EIkIQ=MP-OwJZ>}+H>KOzH8_pp-!J7=<7vdFiJ$1WXp!(LtXTQIyOkIxAumwRuijVk$j%Wwj*tkPGtO4XxJuud|meJtn689*}x4s zWOL+@HI?)w2=dghL9P*Yr`wB;QG|_@5mqi{*@j4azr`uts=ut>2TLT($|%W zI%aq)8DxwTmfV&NUz20ML=KtVSDMJ7yiq)q5|TnhXx_8dLXn*P22FUWAzC_VL)kzj zOmcFrXlYPqN&i?joF*HvZw3m`0g5iYr1Ki3{D5p(VVfKRySGn<05y<5T1eKA6<)~c zw62vfG*%8lmPBYtx3O7{7j!hRS%8ZLkNNU>VlZDhbw-Z|fZYKw>*@1hE{Rr-02ksyT?r!!5+-VNnbO-KERxjDte}Dsb z;aalRV1O?gHnIN6QHnpygUoPF75{8^8p24Ys1qK;%ZJV-n>rqh4zf^ zvhi(wmG{{EwgZ(+cBgF=Yu?s_8QYCh#BDVJEBIm+1!95k(A zvmtYWZ8iJ)f9KGe-};i)sioF5XzWX4dg$~>pR(|kv z;wlH~S=PT}loHGGz&ilm9tU0{_H9RBf6bw_6As*E>>=trK%FZN)OZ%$$=BchyhK%X z2ku)mtE@w{2i!;>^kZ^aHtdMz-_@QcJ@`i zW#OHp{D(Tom>pz}v+%DC@n?4Nx9Cy9M&Wx_1yvv@APHyz#4jg;k z-!>aHG|Ox`Vzv|()~q+1%(P~iB2$~Z%y88Q zyt3Jntlf>NdEp=b4(YrDChVRJsg~c-Pz+l%)<4kq1sSo$MAOP_`2(zd&}#ty4a*4Pz@`kM&SKF7i0_gkg-zb5^KJ0xB`Z#uTTuUX3RUaSj_YRs&%^QZU zSnlepUy6RY>0hx)OH~luxx#`z)nR3cxwfJSGHWpTW+)qqVUZ zHh01}FRt<}8iiELOEGN2pjV%WhEl98!EFn!+42iu>;ML6dRO%4{#uM^D*CLicuqdfcyWOYPq$Sd-sP=P_G@^H8CvP1qR+< z2GPn~H1ZI<*`RlVVt5?D>UM*`BIo}c1EGI|nr3Ug-=oNqj)sG@E8j;t0oYZD>N}~X zb+$pbLUB<)%vk8&&Bdker{phO_p3s@IuOb`k@DU``MX?tw!zxX2B1t5aT6q5t(b9K9=&$hR^{xj=D82>P>2bha2*fMDLE|-Ui0YybXiWbI zic&1c%{lqrDVDM+1#S6rUDENk-iD5r#z;FV)J{8rbj+VI=gpR%Q!M#ZXAJ*mO>x0KQfGn-`<&Ys39>k$oH?SV0pE9 zmWmpf{NpHC!)4i&%<9T?wjwi1^?SsQXQnBCGT*6j*v@pE+P`5K*_XG|M6Y2f?42hp zN@8*Ahg3Wu*iHU`Bg8yp*QYkFxknBoR$qEX)MR zK42TCwW<3XHGmasI<>ZvI$zRSxd);+-OQVM#i~wEi94-Rg>EJ{pmdN=m@Ma7dH1Q- z0TVrEiIsNNeKu`DX!cG{;&sJ%?u9Dr7C|j(wIQ!h3u9igDPBzAP)X~R$}RDxVqTWX ztnVtq>ZP0K9;Ii2zDfO(`X>!Y8rUD}S;CJX>DBI$dt(D}#LQx5geiMjw;ADqtx<~x zxdWk8Jg;c6o57aPs9B{8YB|H)@*X=gqk7aS>O3l5#5m|)Tq?`NjVja)ROCi|Dy6<; zp)ckd69Y^ zi=G{<9Acejhc*4MnA(biP^hFn;b&3D(d;?Y=TgJ+fK`9Hdf>ZcBi~=@XE?5Ql)t{i4(Ei2Q0oZ0?ia)~wmQj- zXY1aM2rVl_j-MAI?VLnv-C?gk3lIH{95pX)o|Gx$By;CBje69nn`8iYE8k|@=0!Fx`i)E=`g^yip+a2)D)K=> zY^EGx4ZuJE)@Q8GoLcH?onVbH!Xigl&r(yRU~T>zJ3l8p;1VG&a3xJ8Uiq5&%#8?L z!JRO!JNBRyuYRJjE}k%ZZn5=mhlh3%GCopfnUhS$EskqNA@k!Ip{J9RO!O^|t8XEh z!f~a?LcPFA=x0K`1lR9xa$G%8rxdPM66E;B+#p<)0qm=JwHn42lYimu6zaEt%7`WZ z6VWjk03g~rm{rJ$REzF#Pfdq0j*uE@Y)V18h|SFj4~!tQ1)^hVD2w6hc!NAO^mjh) zai9Jups492Q~m~r^kX42M9Ta|jTP%TR>&b8AY?+M%vvXzxrH3kQP;>84k_O)_&GIJ zn}8^RG_a6EIuLbAL3-_12y#g0UFWX))vx5LRpuAd>s+UX3iXD!*a!3d-S*tz5H4j0 z=GRaYexneTbQlIYA~=a!mk1VzsB6$uvVQYNg#Fl6k?O-N^_}WCTsYyKn%+G*O+0Nr z)tg*r^>+lYL+=>tJ>;XzAA1Y*b+Cf^C!ec)$VL?LI7$n-dYySJXcBYxXHf0ousr$Q z3g>E{5{9UTRfjf$8k@SHe)bjAI^;*vi#fzcyn5z))xw!lTA;1Tre2oTZm9_KZnOoN zMG7sgy*oDfH-i&uQyt)G*3bSztSjc6qtl%i(;~dR)EivIqe`#)Jsg)zcm2Ut8;e>P znEf`dTd2Ro{kix_4L0sXJ$p|xz3x|XtnaF?Brb2gxzvyh4PK#%@=;Ah7t25Tk2Dz8 z@K1edv+iR0wi5b=*A8B}!SvL|eq2~dg-=r)zX%16W1CAIl*^AjP(Nn%EY(97ld*Ym zolXevKf}kwF7ov+e1^0aGVW5w>LfG%7d}JE3Yp`0s-VEs&Pk@$FCv(8_l%n-Wy(0o z-1%7q^Pgakm?8M2&7fyF2`wh)D48MIKhq2eJAyjaagIxP5_cks*>^9~{)i>b4^pfC zOp~PY{VUXC;w=S_Jb5)swuZS?!!V>;>;1tdSZk>(uCw9~U$Zg6==uH`V zJjGIutbiZi#puRfVfUFL%wWyXc zp1Wq;tD^$f8RQ`)P4~IXjxLHcKIR@2w@nJgI15#}%nt1eXZ60U67%u`^wQg^?^j^>%v*q_)}8^VLh^76&JuP#Cg z2=7J*v0}1RYe4x%z#lk!RbmsZk?J?UaG;yO3`d}gpyGc3-R%EY#ql9rp&l=SZ8x9iLDe^kdGlKheOH;9hWnP0OoibVIe$z~}NI zB;aeG=fHQnK)`cPtX0fALk$A>%jn{NY*i3U`V&Cb@J3$j3X4=O^RO`tMmZu|g@&(G z*qFoCER6{DC-d{-em*36-UrG`7R2V~dDyr_@aDy>kTTVrWL}-)VPmO~=^|y$Q-j3| z>&|mLY;+Vd6{XB#CzMU7I zp<(iw;;^yqEQO5*Q;T^);1RYa81f%cdh2-(>^mN8;mSySXh$2soe*^db{H8{3fQw} z*hfplLq=2g^5SZJE0Fyh+DZ^v#Fj3P2n`n^cMb@V5l$lJGaT5P+!f;1OPMey8J9C0 z*fm0?zm)lvqhyc$`KLLspZ!3cRevjjC}&LziAAM9qk%R(jr1Lg-Dzf+2tg%>J*1HM#wzbE7Xvil&I-;io^PldrI6^ zDO2A`#`_e9_2mgv6tL1k4*fGHp}hop39O(0z+ruaI?k|;BRLLhrSFSjP5gnwTCJFO z;3TzGs2>G5{{d@9;15_M$}#TQ#kejx!Eqf?%<}+`aIJzi{sY%F z7!u$*)rGD4C{p>6eZ4X=9FmT>b|ZUA;hJB-{#_XnOm^qR(dWOkvb+ynC3s}9^&dur zRuv+bb_$UmP9pII9M*H(3F4MY8S;`6HP4T8So4HTM=5ifV`Ps4+m3TswIiq~VD%wb z+c_!fO`w;++Wt6)busEV!|FkD9ML<^#C0PzR0>z`W9-Y-5y8~EytvWZ1!(tZ2#fvo6zj4!B6PSA36~)m`*6u8o6Ue}z2HWTV4 zxW0dc8RaOEEZ@n?%(*bcM+{(#lj z#@ek9Q;!tzw^;39jw7xwNtwj8_%Ut>+rPe+@f9E2xIJG9M4HfW!gTql7w{c(`8YCs zn-EHuLQiO9bP7wqT$tgAa4Zc{DbHPZh&BeHO~~TB zxWBfDj?RR>5})gLh=ZXg$-)0`-@NQuHKE>P2@A!81ETkR5okKR2dPnqt#e5bSm_r>D?}$!7 zQ3)QOAK6GxlS@84scv;+z;XoZ5A?#PBLK!2-lGPLS~kfdCftx$J$?6 z%T4i7$M%pZe8a^*_0DwCvw%Q{OG;R$?wG^ykq*S%Qzx-1WmWlqLL+_wvWBcoN8qd-bURZ-%o_pS|KS zm-|E9HYpV2EL3T4@#EIZZ%CVb+@g;u^-r8-cM-@i!v2`Mhd*xVs8;%MYZyuLN$DA$1Pv}oLkKMY8Rvc=57|T#Z%Xk*F^Z1|MNZG1EdNWB8vhM}Se-1bSj^k8gL+e_?*}v^ z#3vW5?v{}94R(`y*9uPvPIWsRW=rkJMlit%Pg3(g@!To!ghs;iaS5JWX9=D=3D2Nq zG$;~J8c_#4cd!v#TLi@m0S>6MzG*eqW_a!@3*dLQ(F@?wW4D58M~A=C^>?mTTUL`VfCH(B8EV!Ke~H}x zcyoJw4Lml2Ab0qn(_O#)6|286C~zv(0Y-0g=W~2%yM;~K8JxYCj}>W;m6FXNIidtk zzK`l^o^Q(twwA+LnT(*ES89fD&MPIuWX8Hb9(c{q&kpNLpUXmjJ8w{F(-}=&@egX1YiJngTpa>Pl$h6 zvJ6Lia*nvc=Q8j0#gRt-2`{tl^Nnq^3V(P5ZbJv|%mvtx!A)+V27#IvxA;G}N55e0 z_lNnUXxzK#cuN}`b&A=-X7BH%YFpXm{q@zxn_0O7E7WzH*hdHIQ*!!1b@$om9DSG) zw}t(6AVj^infZTPPmS2Z%t#78W7EF1S8rf<@}pF@4XoPX*7Yl+nbaoFCO^Wl zER*g^CCgnzRlkzY!;1cZT1;bofx;FXHkxQ)>CmTlswLLM&wMtg1~F^CSdaGU%x5x- z{@q>Mgti=-xal*~(b3qz`Zfa)bj7?z~z?bpGfKUvF8 z9;p)-iFzF^|DwH&dN?ZON0Y^b3LUL)d#B{Rov81IaEkS9V@h7zXgWpnz5Zf7t93L` z-SjbQd$g!tFobDM;0wOxo<1JkfFX#T{qdOq&ZZRV-$MmC`Miy+-?3!2?s%=(9MZ}^ zeZXm0oUOGK>4|Gds-d(VXKyS=s8TIRl9HPn*qh^lA;|!Zo?Xn=mPL_h+I}*F%DvXI zMg_*Ef36j9SzS-z?36f?MyF+M`U4tB3nI1U*TcV;%{i@txQ`qr<|L+T{WWY!L3B3G zc%`LS{-pKATF!=`UTC(qb~9T$L|XlG{;_3Lr!&eyC4icTUPx_{;q5l1zct7k0-2A@ z)}G#0_msR?Pjk+3@6@5kv4KS2nzb`~U$c^LmRZR z#QMSFe{C6{v~#nhM!Q(ta}Il3ez@O*4LlLhDb?E3t(_&=-6h$Y?Cp|-lhK)~CB|&+ zjM_1lSZ`jpd@AZDS^7o06hMgDu=wX3@uu#ixp5zH!|)*Fu`?$Ex^?(PfMmua3Gj~n z5P0WJZ=jD|OJE&C#B0BZ!Wx#Nzk!m=2Q*B7=&5iV?v$-@D$S-RaQ|x^O{^y$v4oQ~ z)e}Fn5hp|IwnGJcPTUJp2V0@{9B})(IGHx91cAF(mm zeuZxg#4+QC_(hhICYh4b^g9Rmkv3vK-f2e#E?f2uAE4 z(4_B0?G$UMK53OSVLAvf;fck`gn5vqqtEYt$Z~(Ep$>naZT=x9dl~E+v7{^aVb?a7 zQ3D4vX@G%^**e9nKcSAz>ZYeq^VV6tbZ;OzXI7daqY{eI`qwBT6R%(48Q1c~I?8bJ z6B;83_AR>0N2@^3epM1>SnpFF6&jPhmcqV82j6Gur+kC9{^V#zyuPAXh4llr;gl&m z(@DThZ-Y+EndN85D36xB^=iT-@4iLNQL|+J756i)RDDSF-t{A9{n0vEK4svgI%MhdBULctkT)S$4+X{{nRbU}G6Uh_D}nEDBo58k}iZ z`7=IZ{27MMjO>9*HZY@_`$xify~hV^)tSg>vh99F{ROkxa&fHUeTsPa&IaO7Gd-O| zWpAQE^w1xDz#gBe-tsC;Zi8K=3%JRaNBVxWg#{wTIuR#C3-s5^33Xcx!t%XT%M&^| zT#MVvg}+?Q(#}>@wbg9o*#YXA1+3s~C*O(K&=q}*#&cfv%k)mkx$`dusAn##doH2< zZ@jLHsi?aR%?MUS$lp(ph37daM9acsD%6mL2UMsg3)gbkj&tGa#bxZ5b8Xb?%USjF zfi+zqq0d6^@52{>ICjZ6f-29DU*H{isasdEq32synF>P=MbiLn0RvIRoO75(UkYTG z&JR#i7>m2m*<%%;5i+M4TXLaywaU=VKb1GZz3h9;d^uQs`5qg2`7O^H zG!`?2S=xK7;BqasIb%;RH&ib#W;L(GCZ0nzvd+T0k8Oud@5D9P^j(rQp@jA9J?@M8 z2a?rw8T;VMShdGun9!27``On$WRWoA_eI={%X!?4GQhxY#Wo zGF)yE>v{bz^}##rtzR3cd){I1{QA4H_h#qd&4-~buVTFn>>$k8W&qi3ieABjFG74-o-O&UD%*Oqt=fAYdvViP zO`8W3@F3|;Q`IO=ifGwr#b*j;r;+&d)P-kqe4oVwF-YGsm+Evg`K99McpYpJ zo1FEUSGPO`U5a)X$a`GES!<76cI8&1;0drD){U7=M&eC$(jJ&-peIMY^*gN2Z+q2I z^VsjdH7b`i3C&yQuo|~x)$sYO_w7(Mb`G0)JD}YCbZ{!qVISPCu0GCY2XCjUPvv_kl_Mgkv-)W%Ec$;0iGs%C%+kmVp-$3I*Zj-%9uN*e;_vY$g983AV zQ?^p?zp7Y~?DK#@4c^)y=u3?d-Y0i;*%d#@3Ce#vIt z?k*~Say<1n?%VOK=&n(H_BN}acUKQ&vmttHjo+axwFzDqbMym$c+1ET?=0kzYu8+YC<6 zqWm+Fr$2$9-xc{`l)ozSy(oW1!;90{yMI(ymri3_|M1Ix$-%<1 zsaKpz*3fe|9_$ep-@$0@?8^MtBbY zM^yBHf8pq@H@ym-L2pL=b6&CJ$3CjYO%2)y1IX0vNJYTC!c8jPNo;;xt^ONAgxgV> zH&|@1gDHPy2n&^&?BV0ajU%U^h(H!eAugJLUrBl~;*Q^_xkc(g!za|VCA^Ty`aY>w zZW!Rv*JiT!o&>qil|5`SgMITP-9wXzMCx0ou$ZT{)k)`B|EFPI9nVwi@(ZMCQ`q9C zVeZZOI2Pzt&a-__4)5zkHP(@8A#c`tRXFG>{n=JMn!(;hl9j>EBZz003XAACF^O{%x!F8ONUgJ5T*-ESqlIkx+dsjV>0%`|pzXVDWoIK<*ns z=8ZGC9Z#<7jc*CQc9|N4pq|!U#!!-}Hgd%%rFPW&WB#irm3r`=7-9WOR6?hCPp)=f zaab9y{xn>RRFn?tUn8|lMF~~?hH5JnrGXkdT>D;8qJ2ENiFS-4R&N-hRZx}2?)!$( zM7V*o585_=rK&bqRcdzG2qO8Xk)jlTf90w#k+gK-vvXxJO&p+~Ohvrpn>m`#JK9>5 z@mf&Eh1#t6qKEdgsu<&14~19!h{cERzVGSJP^RzZxwYbum~-BgnHm5{CcjlIk~U1M zUq-2Ix;XN`5ZT+c1co(TwX8DABK2Z-&D}*YC3z0P&guYtr>SUZHG?4;#(go6rh->) zMKA0bt`-&Hv?k`kbxhKwl5-E7RO>LD2pBj}o9Lnhs<%dJi(HhNRqnzjy&HOosA0DJ zgl|ymjkKDIlB)I|rd4$X;L`_cja&iv^1<2|R{%aP%?a=_1GO()0eHY*>WN+qxKb8? zyAZJy;Ex9hngsl&EK0!7QxSdoWw;~Y9dWK2fVb(Y%_yrF{WhRmMZQF{2AOCns7nzk zVUYH9StY=IFjrBi_a3Aj@=*faPXRGfd3%8NcUdK*N)^fXKq_KngF#v+ccq~=u$^EUeP6Akn-Z?h?5kzCDNWTDeYI_FioaT;ul9qR@~K*(zc!`3 zGQ458{)pv+Ml3lF*TOK|_oR<0_~t?{4;DS5rHie`U3zYb)}Qs$D!40ARkrsd`>;Pm zD(vy@Pxdr#w4Ga8K;PXwOIwNU=r_R$=;-+@2NgP6qf)FC`-at{L4U2+@2%y#D`Bd8 zZ|%0b5?kqLAJobFP<$a0t?cZh)vlm4sdBQfX!S5sv8dhct4*t*)Kov}tF5b`)Kf!y zX=f@ZA*!vX_D2OJr|ReEh1qf}*|O2J4c5>?stwc@c%TXz-R7axRx9b)MC zOGTxZI;fvEprR73e$-!EQc(#A?r1I!TJa+5jaeVevj(lc52}9EU;Cq?lBoXJON;ST zY7Fc}=#UGE{l>{&)SWEsF#yUE0;L^w#QCv$BNsX#`8}yd25MNv)>N-bHAshEr>C~V zQ)!}l_tGADDltBH+dBF7+ugNjFQuiL*HfE>v|bje61LF#HeMFtx-=XEcu}@7xSw|2 zO9@hs^w$3I0s=~3t)90M;CZf1$<+R)jTYbokE+;LTk5S0tlgZ33V}Y|Y+Yock0i{N zMW#9EBQR>{P|sJ^Gxwo-f!ZV=B~tC$U3mYr?xdtppV*yyf5Tg36}(Rx?HfIRH2&8?)=jC`65um|>lC)0-*)w=Mv1=dJ>@dOtE zoJNnR|8~{RR#L))J}2o)kWRAHe`@xs{limq;#~~1{%udqr?OH-ZEV(RR)){qe@p9H zS?Q_H>#1$2tOR@RZ(V}W+Sc0T%1U$9(o?HiMX{=jdT<&4kMQak>jW(sIU>uKjFGLh zD^-+cs-=fkwW`uhEz?sQTU9ZIR)CB?9eu{1(r`=3>xu3DOS~e}yQ33$T+<#Km2f{V zgiQqLx{1OC(!_dlq!VH6ueGhNRMM(dQ!1+$(zH6&ly+_Qr2#QG14f^m;R{)mbMr$g z0#BpY!~8M9_P;rS=?j)zn@K2tw%H*JM#E$Iv>yHWi;mHZjq%a`k~13DLN-!yBdtu^uvx6 z<^#3h5T$mxZ_pYxYueIK%tQJsz3{t5jfGpJi+Nb1t#&$8siW-*LFi~;)=q^e?OOPg zm2f`z0Zl=7UKGP1wr{W6i4LXd|H5|6!d`}qKnp*O5pD46dNYD z(-wtdNl0nrWXFwUvZICixUJ@CgbA11I+<{S7wsm{s<4YFyu||;Y$p?}9k>Y|ZYg$= zkTzPrQK_X?ZmZolqVapNqH!6F=C&>lMiJ_gHrj;hO1tc7ZG;7B0)$br2u$dmOm8Zp zdF=e;;2OmrSjd-lC6cci^}`Y=qkg$H=_`3n?KOYg13*Oo;1xx1Lrje2B$Ai#HCdO9 zZzCbaXB(khMZ$;N=D0b6=q`wN8=%?%RMS_t;&rDAsXmnOzuI$?+mkRr&|8Vxrvz~` z)izS?zM}RjB6x8tvJ)0jp$u_b2<|K*JQexVP^9_8phTtWWBbn26kbcTWf_i5Vm7lYj0{Ot;wimfEA6~VX=w~}lqz(VI;+1)(qh7uDgk$4 zVo|s9G(-jZ%(c`Yf01z}NgEiBJ!Xfs+SlQVul9bpQdJG+1+)5FOYNUSrqQF{}i_9V)~hDAOUY}rcd6{N zM*FrVCPdqonqE^0sv6m{xOZ4z^6(g>S8b{JM=DK1-$$2H8=3)_)Fwrj4D>s((mT#ej*FvPam7t~8!gIm&=Gur_%16y2 z6NCv6eVK8q7&>0Opu0;hW+M!wKbfJwY)-Zm>R%;lEo);WC%v!rudT#XZ1FzP@sjAS z-nyCgL2ad{S5p#2gykFC>rFMKj#5W8G}r3aQ6hYKtWP@SM=qR#WCPIc}y)l%vz!Rm-r+NiopOr?gaz{c3tk!g)p+81?|I$nQjfF*+# zMlg#s?M_{#mb>^=vOwR3g}ELu%+a(C^&s2>!qg8QWqQZsWlgBN-Ja-p?aO*f{WgzR ziiUKgMcZk^SnQS*Bx9O@jXHba{-lo`ZKZ(q=^~$JEyiwN^23$#V_0@iB_IT#E>d@mr0x12NdB=EiG($0$+N z%f#W)tjWKVar&c~{%0%{=NwJMD?vK0h$eEEY3&<8cfSVOtp-Yh8r(pu-cU)bvV*_k zPQ}9xUQm=vwVc*xG}1B~DuwEmMp}_7%ZUIf_WS^@5gyk4Nrf@vf@>K6phaXaSgBN@_IfRIX!28B+$w9F9EBe5B7n3)oNVF}1Khx2CD!n=2{|G--zt zm8#9%c!gs)MNohWsW_+Lt;fn*54gQAb(4wS&1B-3Lo!|hS^ZL){F>>idq!&BNqBd( z!=%+oQj7s}b4c?M-GW-wk)>#pS{$9D4Np=!tD9V;a`*jCD0Ap^sBSfN*W zZkg_S8bF~xxbY{=?J_mAtF4sk?l(ZBvR{~1wzX2DZW&m@C!=1(JAOo8FR|QQQ?xdB zu1IIh)w;J01mLv*rMA5lYl)mjPi%CC&VhU%iqKSr%avJz4A zHyD;;D@d`O&b+T5M~l>}w|RT`;~l)c0)4<7Ej?M;qsE45wc9Ao-A9ldqS3+XT6!D2 z!iY6#@3+C5$3Kml-Ud;zAVjO#R*CU<;f>MG!)$?r;>gF%j+R&YkHOlcw%B<5Y0?(9 zRa&W&L$p(Em1Z%n!DLI@$oqBa;9lOWMEytzH8jh}KbpyxFMj_GB`XW{KSQxgKwN&(hP}H|*S*Z45JIsxaHME=U;LDFgG*2^j z4%JLrq*+-x`16!M47MU$)&4=}t=EHwiGArNVbasP2 z_@zI*)j>Y~sn-D4nUzo@FRm4u+otp``T>ZbiDzCRf8+0A;-&dfwh&E--o_Kvuw6d;Qa&AH@H#G=EPJG0~gwCli#)3W+J^~vDvyJZMN8E+l_m| z$2ME7_5XMG>(&2zxqqE>WtRy5?<(F$<34+Awxe5Ywo|)pwnE&#TWz)~n{Br9pxwb8 z_qolsBj08_i@V%maaTgx1pCk3-vVLWe}G5#-?*oJV6#=sUWb4FAMUmv{=doppLA#c zp9KDY@DEW>|D%&3YcT$fj1g=8ThK1^Zz)BKB^o~=rSqHTF)S4TZ6xmDxP1@UY+oZi zjk^MdA{(g}(g@t0arZoonaHOp|HqWblf?IUs@3hK+|HhkM+^Gv*QRnd+j8Wed)aIU zkRJ86*)CEUX*WC#?W}6EJx2Q64~u#^{3-%8XCXBO+H6~p9yQu*XGBg2en}-K}MYa|8jYwVE*lZh-?!=pc$4E2qULqFnUQHdL59!6uaAl-B@siVs zzmKsKuS+v1?Par_KpNZEW*g?34MAi!;YrP?1 z>=2vn0gzcf6xdRaN5Ek4lSjc2q}`CxkKr9fdI0q=B7KE4W3ae=?Row5KMytQATW8!&(sZO5NOO_qB3*@aInpgiHzLhPdKBqJq!*FuNN*#3jr2KEZ$B88i=l?07qgeb zNs#Hb42r>6jx;hDDTAd*hb_0+79x#ZfgVwc2h+z$bI)Ul(6ggRyCJ1Nc=HNr>?QD_ z?=9%ugQu@>7#WSs`#c2il??AzQqUo z4661UMz9!&cAo3p1Q=yHE1t$Ad&iSNHyFsiRMdG~$!1%Ryi1|KRxn5juaI8ZW}~0N zbUETr7FN?L4ptggScIrazpLibIaC`sMKNg;2P+BgX?`{v{qC;INbT1lN_Fk>V5NEm z7c3P$h}h0wYc@g&(1M33p{~Y2n{Bh!Ww;WdjfALcZZOt3Z4H%opzN-P+HCZ5jxJ?L zRjUfAVFyfGXKd&Ns?Uq9`S;YyPG0W5Izm)c!AXiY~bP2J-Yq(E!! z?Gfnkhb=Kfh~LmpD;%O2wfiFgrlFNIzeY*NJn6?>7bV+l^utyzUfRKtN?UE)NHiLc z#gP;L@zoBER8lJ3PQi2}sk^?#C^oEcBh_Z3pZ|0Dfm6e^MWZmU1_1}JM6A_YI%DfW zF0tE}yfAdode7)2&&XDuM$9n#tQrIX;raCQSq3<+eHNQg>;>95xXc?8LKQe4P0cck zRrLjBF<0H9!I}fPi@mgEqm}yEJCRR>9$3IHnuaGpqiKi*yqIu9lHH_-AyLsCo|g~9=cMq;ZISzc9vL`?b>aT^3RT`Cb!ImYlw>DrbWSb)oLyFr(TsNeF7TaI@ ze5?`>kdAzEf13^AnO_u>azQ)WU;A~eQZ0KO@)yAmCoV9~Q3n=>rvu>W;9=DHMRm`D zb{jOZS;$Y|^2B=pp4$MMt$8tTD(BTjIgRY^X|uIJ-sLw$Q9ho2+LUpMzvmn<>A*v0 zVjj`nAEz|%$_FhK9iv~$a$!}pKgKIHw13Ab0ricL@%SV@fC0aFY;9$i|>oWm|D~3V29~gbe055Ic1SKpW6)pQ=%|RW0MdIH< zpj8>B9h{&W;&?-I#FpGa0>Yo*eoIt@ym#RZ-91m zwALbB2?=n)-YgCETMM>f7*g8DEgGXuO;?7rqD?1l4!cM`*|{9FC7@wR;uq02Q613i zcF=@A0NTQ_TEHYFEc-U{H^8@JLv>z(b`3Nn{34nM7Ec{CjBhc`Nc%(3h))-#v7nJY zN17Ql(uag!#OsFw^u6VzFdalv=-5auXr$1QwhA;-Xr~dlTR>Zd0Z9}C(s_{Ltu>si z1ebk9!ZWlUla;WtMtJ0~gWB7aHzR*4U;A{jQoHPQoY}ZTi%TQ+UsLBTVv7Mp(#qe^2JWqf_&pr)F!$|G-OeM^V zww%eJ1(9?+5AEt?oNi8gq|HXZS?v<&A$AVqr^1p&;CN?Z_eOdyXrE72 zB0Td!Yre;3TST`b`i7! zqV?6Lg66dlw2W!ka}%wlhgLWhXEzT_Q>u8iRuo7MH79=w{eZj^g_vHxJ1C;N}7LWj6{zq_C2KcpoZPmDObpFVzEl zod!L|uoCo@N~OE1VUto9Bdb)pqZ)o!0O!9-rQcM;5*67^YNea1VV{~v>PTNjLnniw zQ>}C30 zPRBC+j;CXpe)f_s`@ZFxEMp-Q*C3JDqtPb$K2 z-k$Jlcc?abu~Hvf#`TMp&`NWX1=;Qs#w6`L*kLzX3cAf^n@Bl($bT%$uM&2Ly{EKr zRR(D@mMd$045Nj-{a;VbX9YgBPh6q6`P+X{)6Q#*jDnxEpRNsFp+qU$w52PQfiWj$ z*zpo_Kk&rIkUYnkeqGZ2wCXDr-|T35mT|ZgUi2}HDn+j>=~<=d;ga63R5Rjdn0*X4 zO391gf%P$X%;FWb-76KJ?7E^*Y{o>p5vAz!Bz=f#qz@AG z>|(}g$yisa!c9rPQHoCAPcj&M3_-JbrdUroL?)v5Dn$>F^yN-;v|mp$&N?x$ACq*C zx1Ag4D(U7@^bwMtTZ%qI((_Bv7ZE)hmcA~lG@CSi!^Wd$F&!vX{u7?qa zg4#Sb;TM5V+H6j4*RujqT+(P^vUQvucvRkGO4>BtQfa=~rc1MW9ySlOk@V%IW35f5 zeT7zqihd74(qD6T>AGD&6|u9_1m&hGE?TA{bFod&D_V!N1yriuieIC`on}EheT|@_ z+pKBVD+1n|;3v?m#`mHJ&G~lvT4MMOG0+CzeoJh=gWGqT0KEEP`Z>*RtQI{jaW|31 zfGg<*ir1q|1BA1kzFvvDeaZ)r@A$LDuT_VHudYBL6E1&!#ip3=Dn`{F`B&D|BfwYK|>Cfs})v0et zzGMofc1GhX>-qjF3Zq+R!a3d89|Y$kN2X#Ec~;Xsx=_Pi^P^YIR|)%jV8`GMMJ@f% zvWvIDcx|V^_kul}HnIiremYfN#7~rb$39`XVp>7CtyQ$18PI$L^4{9r0X#Gyg1m=f zN&-)NTJ3<~3+Q%a5v2X6rGG&|p;}#Mte}NHJF0ewoNIpHiRb6}v!5VtK4(ZD;&{th zNQY3`m(a-gtq@zuyd_pffLGF?0^=zZluPwngmW=892I%AeYFzut)6mk68QoZqYFQo zYDG^yZK|KA0cp1l7N3TC$0=dEc<|;X>ePcnNE28SvOgBKHo=@vAOdI*@m6t#$GzL@)yRR|T(Esh8vYuAzQy2=uQCEOh(e9Ho(C10G zIKJT;|Kd_`!{Aa6uv7y)`liIc0(=SZ6j~1oUp28cy^%i~{{)%LQ=;U$%Q2@5o6}(P z@4$nb1mJfKO!_+U{0oy9<8}n$GZve-mqdeKN-)hMoa=gKyOfcuYd#cW`C8uXtEEUF2*#7Fz^-L~?4ANObkt%K{ZNGFLiVnB{sezu6>+&b z!#x6D0k?&@daIRrA2LyyHq|YV`NYax6)(HmUlyRF7fwaJB20ecz*I&!7ljX=(*EAk zeAWuAA}*(%J|d`F53V=WzoQ|egN5$whENpa3RRb-+sKwxo-d`$XD&=@9bPlG^l5D* z17+Y^da};;i^h-ysx;m|-mh=BpN2ondLY?wOhk4;G7UW1B>*i1EM2s^+3}%Vzb>_( zi{jN23R{ZA)zIrA_BmW_Bb+Df%n||I!e%ew>|pACk$27ikHCX33eK;Pn2rO_VBzEj zowUX2zh}?o`icvth|%C{qJ%7|nT&IzDQ=}F+qY5Cu&%Z_iR_enYWeb1v6g8PYi^qz zB%EzzdIfj0XF2fHO_J5SQ3T(Io#=BS?|N(0;hqs-gWv^USWU#t{yo%Yp0`2SVI-GW zAnEWC8`GP`;&xxB#GjTx4aPfj{Q5KgTzmr^!Eot!>=!1#Q)8+E9vzVQRM`AB@WgKf zcUg#-{=M2?*-UIMkD))lp_>7RPl2bmlI-imsvg#2f~?MrmRWP_>HnxOTz zMI}&CRKS)t3qwWMN_>|DYCGYaaOjW#E0FE$OHk^65xgGqbAiW@F*gVrgm7EmSh0k~3spzGm^=G9boLx1x}0$7e+T%9`wqH2e|LcC9VgK^ zOiygvS0P5-a_70Pie~7SqVW;3oCMyH5ZvA#PLF-SeORRgg{_7ew{zPq)NyS!p&wIY zwX~FQ_A!BGI1c!Oz`YBVM+xT%Kw$!K)%R=2r@FKVxkNxda6+25ttj7vt2>Lphv zj~vslAz)}b?@m0U1$d1)1?LOAlrq#lTFbX`jMJD@OB{`aMu%_|L^(Yhzmb3 z&z#YvdG264U1g4)(G_{YY7wJ@?}9Y_RM;JeyD(^$rFBadeFN!aTF=VM+$Z9h`%J-* zt|%Bi_ePg{;k2nAA~|>P@zU*P>yW-9>oVyRp6||4T)5r@hBJJr+=lejw+ zcj5ZvGsC(?>vbk@R+r{Bpne)m-B~>^*Bz@gnnh9)X)>^MgxS7(n6J9B%wosfD&U69AuDYP((yf zq{TuB9YG{C1r$N*T|x;cMOxnPnYp{Ui9Wyo=jHP}*}bRDX>+FTb-^WH{fh4*TiHdc zEb?Eh`mpHh7uQ_pwf-&jxc;rh7wUR_xP{5b54Z5LtgctiD22=!#b04{J)N)anJN{jX>TDUGQ`X9#l(4b7oOxJTdH$!(%46Mf*jdip>#+hJ?QUfq_%|i3Y#$$l z@3;6~Un>jXe|lQ^dUrb;B>6h>#lBV^TGGbmN(qVhc2Tgqnw6)Ow7J{EEtWF;8?7Ak zgjg#-QZkCI;EVCizf=@^&f`jTWR3a#GFF~dDv9-{hPchc#^S}qzaYYnuQ&N1kB;md z|FeXZ=XgwICHNXID`QfpwZzI=lO{aP)6SCkpinD21|2)H<@BA$dL^N0`u44t4NXIP zrb`Li$(|2N+gNppjw&6+5_wlo8)?VxOTuYVvz*d)_K=KYu~PgG#Lg4Fr?Ls;B!1c3 z&JtjWl?{_N_VHQ7D)2$RHqPL%osuTXH;QG;W~)oeS7j?F$$9RcL57cb4ye*e2Ad>x z3iY$G-=)J7{p@U$^v-6$LM8SxzCD+6>dRn8`rBD|8Mbj0HlF2gbD!k&KhO2Iu{GpG zww|*xQ&<)0&_!izY>09#zIjP$5xk5WIg#9)CWCy7bmoa=qu8%#sUGu_&YvVTyIj`B zF7xQ}Hr^F&rUl!0Y`G+sB}0-`&c^a(h&~_=_Z5-OY}g>%s3qHY0PcF+!_UU2mQP}H zq>oSY`{nDoH?8UPOiX}{?I0`JN0O(Uly48R@y!8t_YYiF`d3I|-|&eQ>ahjV)`!w( zxfN`%8b0~JYGX&GbE2#^o)u{0N!BPfhKNK~SIv!Yw6HmMN>T7-*Ge7PF_r(DD=EBjL_@tX|TUitkU8IIh_NvxlI zJ|!Jhm&Eg_K}l?cRPczW4fr@%J`o8!Q%c>I0?I-gkE#Kq~T9j=T-C)9-T4-cTcUw=v)niEi2yBGycAWsjKu?ZlKHKC_P3NXp0~+oFH5j`PPL>|9O-GXcv@<> z1TxF#|7x&Qkp_>N8XWmVU~KWWG%^~PD4$DP+8NKMza9;ZJuKag=j0k6V9+UP86ewB zRTl0>@SGk{7P^}nWR?s6!n+m0$NWp-5+=N6`QE^j&-@pE0tI|5qevknr$sfWxfpWx z!yxvu@T8x_OkzEr$4(M|T^D+P1h`Jr>FL;_otkzgtJt|EAsRX&&eJsP1*y zRQ^%-Js2xq>(P-d;%j6hMmCw>}4IC8>)DY94X2h8m69ei@_)OD7gQRMd_0adRsC0gmC_P@4A7P z4J8&7Lnrbzy$3Q2XML=Jxm%Q?M~)U1y_QD<+b2mu^NV5M;)D9stDn?JVQt5X@}?Q^ zsA6!BL404Ix~Z32DDpnV(EcqIJgFEw%7Bk32H$MJrxt^U7}L20#o$&2=i^_CtC(x> z<`ko`wBko!tDEZIN~v@2 zi@`1H4J(Sl{SEl#V(`%Q{H=aSsMd7Lk5pvWzb(X$}w?g@|OLrftjj#`8Vo-vWTz| zd~AO!3+MCucf`u$I4Gx^D9;)7kSM3~7sap(jKZL>bp}icY-{4xO}uUSt^w8}*kvZ( zw)_sTCr!LhOuQ#~&_FBq9_j6~-o$f~cN%C7oND5+94fSGDxXyhyV=A$m2Uzz5^B@H zO8>HqN==qT@{7f=IVRpn?vqrMH_a#qinnD_JuFSeg2ouEr2Kr7JsQ9zQ z{zv>curp2ANMk%8`7`+oU~Tl(_!niu+IXEo_1F#Ge~>lshLZrFktWa7E-Pc;7_X$3%IWZyId%Ic>rw z@#rB|t`GJOJZOTBF!8M6K0~a5YfRV)ChU*AC9pr5uv1Ogs(dW4RZTXhnXu7(6|m7J z>;e<^E@pKJl-C(*4Gc9&&N5+RdHx3&V7bk1Kmwnn+bcAw;XQ8da>v5jx2_+0%eSe zGRj1`n;!>ux2f$I6Sf9_0c;HuZ>$Mho7Z{68d%$ewVSXdd4FKjOp+HFQzl|aL^gTVwmkdKGmOO|FSXWBldF3W1w}b{1dVgx<{SjItKRn#${D-XGXeCefiLtT)db zWo1+NXQS=~b~Mq%81phL{w#@n(`akpP!rZ}!cOEDfn8w2CYi8{xz8AD;8!N>R1@}F z-V)fIChP(eb{8KD?0yq=nF)JWfOez*3ZU9@aEPg$SQE`~J}cSEXC`~|tmGDKG`|SiF(%pxCff1bCk1ne6mK4t z5)nAbM7797mCVPcSOZf`*enxv8eat&D^t9EHk+Wc_;Emg0yM`2P312DeUA1*C%0hp zdH=~)pSMkN^Lf|FR=#Yqci_7wsO5B_2Qv6BQ0$!S?c;BPF64Iry$xun3A%^}O_>t7 z)Fdgai_6a~d*YnzxVTOrZz1 z@m=8DZsPPeVYB%iV81hALrvK4dC+wD2@<1B&^^4C-N$DEd)S0cG+~eM zP1CJD$4%HIz6NdR(_ya(I)R@A)HcK0=Zp!8P2L&UYoFmA_^S!J$Rz&)A3MVu_?rov zWx`(MtAPE(gxzeyUgpPVSbhF9VRQIiwC6F?JMg**nrq^@$?MFt^4c@KeJ-1zw|M`V z*1$XyPreCzhi3wtZ^By67RKu@z6;pDO;~>u_7T4`^L_S$&zfcRd1<0a$SjyX>F3T$OMly!IzofaVB_{3EqZnjhi#r zXUn2CK5=cDYL*eS=yT*gC@3hX+Kir0(Q}S`u20XjNN{YH&o$|pI+Y_!KEJ}-uB!XW z+-S}6_wc%YA@hK-SnQcC1F^$o&vY+KA5EVm2iP;*Z-B@?KPTC<;Idyx8qw`HK0)tj zPV|kg@E=xH#`gKSRlzm317u05)zdz=<-1_D*we2kd)qTw4v5h#dJQP655=ED?wLGf zb=8(JShKj~Wu$u8=cdM3{N|s0Sx^8ynpM>-`-eOAi|f@r(LVoCa$S4+GayfX!{@9H zXVduF)$Q04?pQ5YGN1Et2%E>(d|VHIPk!7&yIF<%Wi<%iQsw^;w1y{TRbeCfysTN; zU*WvOng%SGH(3)M*yk%|u@7;3%g%BOF55FELc0T@eH|}`^Eqqk*O=27wx=uDeubI* zIv6BP!YJpr@Ui^&HFdRpleqUMkqzwkU>H&CFO>Ipl9P5+e|&SbvvC5R()Wx0wY7?^ zpWOvx`X&AJ!-4|85Ky^%wfL#@)dOs4{!d>;^PEqr;Be~NCv(^dKK#>2?d~1E=+j2! zvhR>M8P@K~t*iLCPh&&R0B+BmVb_n*m-I`09pO-5_#%U-C68Gf8e{VF$__^g`ZV zJmj-xsT|}^)^`-EeyOMk3q5AK2L{6_PEq#s$M%ep1xYqn{d@Kdj>C zJ}Vo1sDWmQ%LtzTTe4UBIVf&};``Af9t0uH-MPoQ(IGYR$*RM22w~AHqu*r&U5L^w zV2QV9H2RHyu+CmX8vCz5u+7uX;<}P=5*k zZhd^|`heLpXGVDFm$}auQ@nT9l{PnreY^OgFPhaI1%MuO(_l)*6WN?iHrp)8WnieD69^i4IVr4DYWJ!Ox8N3&yGTO*i9pzeua`e zV|JAO#WssYeo4X?{Z-D}epRK^+t6GO<9zH_)l;V~qB?O&zkG!_287y?Vg3XdXdn(N zM5GJR!9aYa5dJPiopdGYLy3Uqj|&n*qYLx^*|FP2MCutI7*^9vG&%>FpK9+L*DtPr z+<>@&{r4wiv<$}?O{a_|drFWMvp|l3_V|ohAk3b=FFHs6?izHT2Lz}n%8~l7(r1kt zn5j6Z;xk(78I)aPA{x$p;qLdoSa`8`dVp( zYOE7AW&y@09+eQ~ICLIdQ!Tk|XT;Zt%cq{@{3q z;$qK;(Z57jp!{h7L6lJMefGSd0LJ|We5Z_7N`uBq10TpvNJom3Bj2RQX%WwNB9Wom&{}dmn!cuktGC)5Hgc5y@ zaE9Nm$>eCI|Bk5bK^9o_x6nlp`En$*c}9rRc$|{j-Yj(kNllSbQQKO60^IJ3knp{X z-%LL7n{u%^C~@&lA(fPn2cMW!>rFz!T|!2Y5ZVt>LTc~>--Ozeq>x~x$q(;K`#vxW zdHg4Y>;nQ`P)QhobbuGinDsr$Yi|jy8FdL5^d}ElT=sWLe@TN@MFaW(T@k}HflBeo zTSl^9_~k7PwPl&S!q)oCjmK|oT)Cp(I|IXMhUGIFg%xv(Id*mgbBfG>-`DUJTU%@4 zSNZ*I;r!)R-@u$tsGQ9R_1lrJH++v-9D5{ZKv!OMTPzbie_IuvzRfpqJC?shmwrg! zkO8tritKO}-@L6g^8sD7t#lzxDA9ZwMoI*<wJY`2<;Ln&V8m(?cv2e5sl@fDT^Urs*)+$_< zW_V@$`Xpngz_BMpVxf9=tR^l=WO}x5;Pv?~DH|4$?uzd4D!w^e>Yg2KTk)}rCX{Ht z43@H>`?t{j4=HQaw_cSV0!bR}mN_Ke0cp4*-NyHU^yx)1(_<-xD>Gm&ulrp$R-4cH zE&uVc0%hgmnB0QnoFo*~2i`70qBjeom7a8X$ zK4)Jy?feO;=A(Tz*-{?1zqi&<0aom981mvLDq2GkP>ewnR0JJ>b(((-p&QTd?hn%T z&f-1?dPO*9P>QvS!15!_>|P))M=^17XIKs zH*Lgmslyuw8wN)oqa5l%IdqD0C}6XvM&%sd*XNJmwU1TdzaI?n={p^^?LbL`6Q=T) z2V>c8-uh5Y){&1o)J@AjCgoiMU=#N`+*^B90p=a9$;$Ar5BJxyj!KGpN18?>x|&lZbcf(Al!$#UC6C9CwU z-OlJw;CD_|(Kb%uzZ_}EJDlpHeKnS6ovK&!BBpcs1s;C$&)|zaV`fC+ZVkQQdm4E4 zTtwCJ10ga4kOQZX1N&7DoGyjSr^8Mo2X?C*IE@_GSkM*WH01!~ zLmqPA402!}$@9FqUxwg88vo-=S2l}Bo$Zy{;fG@44*ug3*Q^&Q+b#lg;vBzu&!MZd z;V*n48`PNLsEApmtWl*4vtR-i@Q!C>+&U-&?uBLccD2SGryvt4`Pwq+2Tkbcjee%GFUL7&c> z{SvN~8p#LzQr-WL?y1%punW?Tul^+jR~2{vVoP0$fY~#4MrS-Yw<+siKtj~LE90TjmFI)&luD2(+GpU8VIQA2jch)TG71($?h`XQM0Ml za4xC3E(enTc1X!r9=eC&L|1i*ZfA&2Akp8D=s5?T z0Bc%JK%bs)tA3swRX{zQmdS1r_EZF9{xbj^zEmj)>J0Ml1TF1>Kb72yp;{Bvf)3`W zjPoqwGHSWQ4^kX+(B~Z*eS6`KKmDmE8tqYY?~&k-l@b^;)F|NiMFH#?^CEJgyv#E? zO^|t(Y2i7S0#Yl(!n|b1S5ARWRclj&zEo*U2Fy={ZjSi|t+Sbd&SnhW`M;7adGzP6 zVx$d8&jU`W^CA{u;8l9jT`Q?qAL?4jo<+dyrfHMv#wn;54!UDzHv1h?ayk8(=#=Ty zKZZ1Yg?tr5ikvW^IL3P<>-I zG;w$04S6rAkupVr^BA5T*9fy6esDBK%pG4k9jzEs=N}~eIYS4hOQ|8pJ;E%fKOYuD z=Mylk81Od&I$*Kcm^TPG-Jo>l;ryngPAAeN)g0Z)Qb9w4Q9IHLFyD-n*_`D4Il0zs@!5!rHtmCT#pUBGms02X$Adxlm5`Iy(8C| zCQhYRqZ&9)7w>Ynp=GMfxvQjaVa@GHLjIv4!_*B^i#6;|%~dG|d`8y$8bGJY?TbA( zaxy`^RGE#NC{On)$2+DQ&U3Pt0=c6AJ;AKa18V3kgVGh(VI*f7{fSq?T%}-NF`-+G z=Tv7apA?rBAe}&es31B1DdxTTEy<^D#l-e=N-;uuhjgLe&^W$x@*9}bgt_64{%_ZUB)Oyd2U;ZN?^=lgaCJ=Xya)je;df2KSTqDH%^N6z} zi%`>5{yCaENesumN63$h0jCh~T_@0)_VMJN{v^lT%@T-qpp(`#G`vmZ!&I{_jpjLE zlC` zI7JwO=aRxp4WKg`$BPjSAfnWX^tWcQB>9wp4HUiOT?2{1(iO$)fJqg9C!{ebIdYto z%Fija91oljL$N$OJ6<}0&Tc;MCqSe)y2V*oZ`1&{_*+=K!O3F?`V`NO9R|>8;TP(d4uE5<0d-1RTkLsBvFCZlGxA@x^ff{)TUuu% z!vxb1ol65_rb-6Ka1}cT_5=~bR5dlC-g^oF$8{sJu8y@9Y>sagud8TbIVj`rto4Fe zHyEr=8~!BV#A3jo2zbB%qLJ2Wk{t+$RNtRag$19kzB%Y-ojKdEgGA4H)$j*vq>wu2 zcF+`4t+f5-c{*iT3|Wben!YLb^+3wotgBc05Pm%q1Tc82|O*K9Cvw76fNg@*10!s(~HmPDYOlyWLh&#Rdi z$zNQl^jh*d$K(PCaLd#3lxZ`u%Nw-?p!URq1B9*UXL%lY$ZH^lsFY3)CT#)>J)}~! zF=ez&y#YF+KdR(|ekDC@!hxmquE9%%`Wp@DW0 zHo4_|$c?ru++Tl4A5$?`?GfRhepmPEODmL1`d~@{IKe-m>CI$!{jZG>F!w+d&Aa6u zK4#r-BiOnZNhYgZq(_Jp60)`y6wpbaet1)=g!FZM1ytdQpI=COFeD(E8L7mVuu}t)jex#rJ28R;uB9h`WdeL5v z-@M;>$b%8(C*xEy(!SSGD*oH13$Mn||AzBEH^ykTFGQzOY;c328`O%fA3hJYjb)Cn zQ-X^Mid_ zZ*r-1;Ap@z4 z5V!u_p#+whQsUh&T@ojKB_-~W5VOQhUz#NTCMA|nPEq#jrR;m0_DlIKD)ToUcV?eS zCs@y{Q%?8^pTiHs3z+%f5P+K2LN;)}ygFL`7ra$ov+mozz}h%tl7FYn*|AW+k3Ic_ zeeTWY_U0`gTxFKzM#wI|c_qTJeVH-do6b4r?F=K;-A@CZ5$jEb`v4%s8`t!p-~8M# zek?D@?LJ`CoOd`HFhcq{54~L_?636%FdO>kdXu4-4A)JA>jL=ada$-IkRR6DyVb&? zizM29{@f+8JA#~k5ZjwH)_u5_RSa7xk!I=der}R}PD-~Xzxi)B((3;!-KzDs$>wMs z!Z+Lv_L+@A!Z4u37rbI#MV@olqe2%0YM*;J6xo^!6XLM1|JB`!K_P{xSfH|`bw(2Z zAy&At5y4acBZ~{WHqW^iz&_)@-0OhbszLc-J})t@7%I&DT%0Jug0<6Y`RM$*+NW#z ziu^iS@>+g0Ka{oPdHEx?)8%-t`}Kle27;;JkbTa}G&m>Ozn$L>xB78uPYP0U9dGkb z?$`0|Qx5AuJ5t2)&O^TPdQeciPhIW&_*t>;cbd9ixv|KTV%?7?-3ZX?1n^()wb!2g z#e?%hed>PVlCyQK%sZr95|G$~4W%x-Y`rfA4 z`!8Hh&A~geDyA)0F&HeNGf*!Nhw8%w^;-UQe&FE7PU^XbjMzjh$B2^JfzCGE{4$s0 zoI;=IdL)6r{y?qSjD|lM&pxA3{JYC(9hZ{#i()hX^W>#M;wu z=rPlYUP&RASiKiS(KKTBQiDuy2O8&&a)bLT;j)Zgl?(R8rT40gF>cN4G!m-K9c(s+ zEy31q=IqM$!-op+4_6a1c<1M#rAJ9JD5js`)1G&1|9lnFB>e!5!fW7y`1FG$gri%1K2zpzCc;-`D{7Ndwd<+c-PPaOE_UlI`VfBWMOAi@ z`@alteE|_7T}c4>FG;r<%@G96ohK0)+th9y2y-Oi63L)H=L=s{YgLsh8nh)8wr2H% zi>deB)OQ(vkh9VBLwXRo%ot-sF?J`UKhp) z#19%9S>atjjM&bJ)OXH_gorJ{0zzpsD83*ke$JCL1Si?QgWrzwrQ*__(zwwUeByp@ zR-?okM|o8rkD~h-j_I;QI;Pym5@dEv=2ABnRBn7B+;B^O5rqm}A+``v=#^R$=kIIC zx6i$ohTM8zEOcX^vx=gzJL{&Mc~^$tKlD8nej7fic=PcmtFmVzyd(?P&V3;Mh-YD` z+mRyJ|6b3E?0-AHyG)6J!a>IXaTCdy7@dB-gfk`C@$~01Cz0ng%SRGE)@za|>Xdr! zA|%N(_}?Ys;JAYzb8Ibz8w?$O0gFFxaGrTi$?GcCC+S{#FDxgaTbk&sc+ zY|mC~#_t0i77&FZp^VtQ#5&bgU%=GZX_xpSy(9E*N5 z|4yvml0(X=j;LGY&qnS>BT+^p`$oyOpLL|oze2eUhD%T`GUf^gqj!ihj8;{wS9L1WzS5Y z9{W;%B3k*f>ZOjOCdUssAQJspSFy{Nl`22czSq1OY#)8cFC_btFYChCSE8Oj3s3zL z!W}Pv!6XG&&nR>CABQ6X8IgNvz}9b5$CT3&oRCrE@QH-;80xp zWE0(jVxR3h3#cz7&=?6yzLTNqrQC_bC5ucHnNArkBKBaH z)}r4;Y9Y~fx23~ZOy%h6UKLoa-vxrm>~*P-DdT@jCC8hth`bJ2;7({Sxxwmqi*~qD z-=J`eoe)RSVCwlNw1Yz}ld1O)LGF*Z&$+5wHi($k=m z;*TPI9ib3UC5I}soHQh-`cf_V1CCI&M0F3n4%i%NXQV^U?=(B4fl|iHtju^)rWp`2 z5>AIC>D6Z!3&c8zfA#uMu7>gh=>N50q+plA686m~yNMI{4ahtd2HdzBpZu zMQOF?3-|J@FFPRym1j}4S0jJ&q8*Dd);iv!0T= zz7tIX*i@D)HV3d4THCqeZUAegm6$8)R$z5YPnrp3As|-&N4!yiJz}TC04u9r$xFhG zY5a>BM5JcC`el)2MTvZ44$Uq7TEPi~l5@*4X-jP^O!J*1s@Pam-QUxI!=_)d@i_*c z!-p4c2xN4$738FMw5gwQWG}R_dQ3a9QbbK*4SjII%EMz%Bz1#vX-g}zsw`VntH{DD z{tfq12Ysx+j<)fME|f!LKZwBXb+xWjXi<^cnIeNq(TBLp zAa660BO=t`u4~f>*C+i zkiM8A##Uyp*(T#T?+j)I5q);sAW`isC(RUpR7PA|&J-*NpI#{ybi(ur_RfTQ)iiI8Zno})I)PJ6$FYyzFu zlPDlDkrvy}#o`bas%1>0ejGhQio-=tvaK|9oBN_fa`N04n&13ipc*vIRAP2xnr6|b zO%v{+ESl{QO+r~szi>0ocbb?$xL3s|p)AgKLvv-J$bCA%*qf7cXV?m71k$5fD-Y~7?@~)|6dy!jVl`KMAHiy9uO*A?5v-=qoiQp|4o*T3;cIqLPeEBlQ@pSVN%Baa_r!8dLK{3ow|_YmhX z{Y;Id*0CiJKlkwEl)KagBX@^Fyy}7#k$m#kLL*FuSascNhmc-{ z7bv85BcwcA)T+UPYW2Wx%*jFz{U};W$Q()>H!<5g{59ix|@3PW*zW z^E!lv#L${5QWsE2wnmQ-_*g&qy=4y+86wDmPN973p`Us~IpnD5UXw+SS%$}=fsQc+`duW74D?iUpeq@Ht_|M2GNeZR z9u`ZHqeBn9HIQUnl>T8S>HwGYiz2@!i>y}OOL^KO0a$nz9aqnVSIBgmbo5g_ZM$ey ziv@LwlS>dfiOe4EOz=C~HB@OcjONzIQvL1qn8py+ylsLb%>~P`WhrtCmxfaY}rP!QZBXYj}2rO14)5Y z*$j?m2JkIPw?#eUdW-J0SxB|-J(L#`DSJXy_Dm+1!3#;!3s>}N+eBC$7F7D?2$gQ3 zdVi5qo7L9R#_+Hm0m0-+ON=(jl8Po z45p4<=-+&!b2>R<6-Q6z;+O&s)k!x&EyKUDzat@qDyQ75TvGiF5arb}+!w3s9hG0AD4bBj zD6kX7#wb?3+-ubBU}UWRu|aoJ+=yZ|S!HpuE~}+QjUexZ75Cmpu+;3mc!3}12iNi% z>U3UOQc>q^rZ}10ZIKMU_6~6}Gy#M1-B_q(_FexHCf|h){I~B`Qoa=WZdQ`GUyp@( zT|g%%U+xnM0-I>X|NBR{Gk;qW$z^)8!L1}eM?N>|?nGIQ;4p&G^rA3UM0^S775Ojbad}gCNRSEe3)9g0nYTBLX-V{misPux&teR3p;t3jqGaIcl zODs(ie*r>D%;=7jx<+du6(aKy4Jq=bc)Kx+i5&;QdCl?~p>vYCA$?7$m#AmOsnpXc z05bL9$67>F%9v5neWP-I)Fmmw^qvO8DiPI$Rc-Y-Mq8PJI3`n*jol^TA$`va>=c2) zpT-|d6KM7_11_dKqNJke)cQiiwL(?A-CwaL>Vsd0{RRUqi#{;wsFUN$ddV^1Qx``d zI8@K>0u_zi!|L&{-WnRXs-pIqF>>2oDVGXAsaZ@U`6UU0l!p$9-Z89B>N2ntO$dKe zLcELYR6RP=Ef(YX1lL%E_&r=|&WJ8Fg~)7#1u24#ETVm_40u@Y1%z`q1@o~-diy@) zAlyR2IgeHT@aX^~fj6*<7f1P*FeTOq@P{M>p7+ozwN|km zLe)mbRz`5Gi{NQ1MbO4f;GthNz_kE2ZD3$-5!WlOXIzi&cJV_~7Fe~|CTAT&GqYZ(~tRrR8OB3KFe4+F{j^3l|qsU(wSPb@e!d`a4OD1q#jK-YY`< zRBxe(qh7qOM5lmQWx|)x+sK4a%7hh9rJ3+BmM8f$7+{b7 z;!tx|HzMYrfBEzwbSw1IE&Vew2NqNx{+hD;kDg|ik|Bk}SM(%FTrJEX{zwuV9vxGJ z_NiW3(neqGqXhQ^t#W7vl@vNjGuC`Fo|qiks)xvJ#)2w+jkGd(bP>3fM<4Z&9*sQG zp3Q&oxu74W+77=-NRpf^37JfMQzc+AIUCi|Z{} z<7#Dav$A+aIu0etTh972>l0aD>bL5RCS_;Y*4^oZTWB7?`XwjG`f}kBAudE%p3tp58za#1gsS4giQ zk({f4xkk!sW|X#kG)7fqY7^y^97{FGuLvjM;k25=#O!&9*>TevTa zYn8a~my_(45$mx(I%hxK#+-W_s|eh*yoo~v3})Zqhj6MVT!LFFg}wJFpn7Yjv*B(Yzz8SK>ie8O{KMIh2_9P?;^NtG8qx zepK$e+|=8=;tc3i6ebx^6(5S}ushHW6L%yMjlR|5(f{Zcu?3;cf%&e`t|S-B&}IQj z0h|uGMrh9_l4rFoiSibR=lke7L@`C+l&KYq5ohh#p01uK9@~+^J4IMLtC9Go>@G5v z*>=coZNzc|J@hmlR?)*~<6#jVT&D|H>#Eq*f*9G$XdbK$=^_=0?IIP?g1QLy3bt|A zi-1>HGwt{-72gH0vY5{rEv5K|dCEAwH`Y3Gvc)|0~4aa7)n;--28t#O)KLXTuYuXT1tuRUy9FP6#_| zsjY7(ezCIPs95JF-9qqb;T#+7}LH3~sXOJy;a0R)0O%>!75K|cB z)2~QXHoqcOVVPo4XI5Uby&~3iMrnQJhAOStnx}azN~;H~pn?~JoTPQlw~OVZ*K=A2 zl73UaFDiFoQNI3CSGlYnfqDGvT~KGUWTt@Co_>WgI#jXt|5GmXZ|bkLaXS8ea2v%E z{qnG$dR?lnx>cJvV-!wu^`|{h$}}Czf*>`Flx(9WxaYuAv@n_{xY)i;WRZ;qfk@55 zZdO;Wsz*I0%r)*za1k6b2z>2gb0RK(JQjx_A@%3hXeOgI+;j~pNDCTGUqGuGY*N$S zSRL|SW}|oIDi{0Ia6|Nu`pu3+>^%DjL^gnCB50(KZzZHV^aCIv_wJ0Po1IfU)c%H^ ziDp2%pSFS1AKQ$x&1DAhA`s)yaPcg8XvnsR6)A*4KFq$&OW4kU=) zyA-J4<`+1*9Pk46DXPEd8!F}s@X_yB4(oeslh5RySfqZ&K+hC$-B^d3A6}s}QuiV7 z?mv6_Jskfek~dLojS^_bG0%%k@l7`j3_r9{$<#nx=!S#xZXM_lE6}I{6R6$FM%8gK zU(iPy%+(F%kHxs|tTx*xR&>Yq=KECd%&lF}e;1p(VRvhJoNBCWD_J$P`t3#6vCJAQ z#}ph4T+$23pGA2SByTM*gZHhLl38Tm? zz+gbGeC;wmGj_`Bs4C~JEoi=#20V==N9fbJDgPegr3%e@K&fAif^4y=7mjlewv`8W zpR|=feDX|ftLn@fVqH%RC6VHKPYfm2wxU!oIO+@0uotV*Wgt?@74T1*0}oVZ$N>H4FtXy3UO@^HCsS~xv2z=#NUb(fkqRC%Z4LTY4SJqkvp4f) z)vo=nYL0mVpG6J8wa9R}$DFu8PT>2MX^FOwws!rUrcQ_MqQ35$z<&*C&_=oO%^0I} z#Jb#f51uWY!0WjXqe@3(@oOLKjCcT0v~rlI?@tkE^UjF#q{B6f{|GHozYPmfP8lgX zhU_JFeWQVNGmr^Dx?F!Rm^j=n=}lUTcV5G}?lBF81he$g4>RagK3cS#z&yk!ud}2QUQG(b*os=Up!<}< zQoyeekTC{#FV%)*q+ac`u=hoVtQRSLS@oct7-dTg=<<5lGbcq#${rCB`u5k=ssEk6 z%v0O3RXpj-Ld%ywNc1>gQ|975eEMEdyC3UW_f;A+5LOR6!?lkBy%wB}VTKNA7d51a z_rPFbycWlAlK8qGOo(eCF80H*bA=Ydqd#jAOj;m79yncnLZ_=OBILz$b-0R)BmHr6 z-~*A-pVbc^NI6@=C{js!EHwd(BlVI-0R9k{`m?H@Hp(_+@MhsN02}z%Ma%#eUUgqH zg5K1<0+spQ)O>t@-h16Wg5Vr|m`Q723b^v3x~<%S zD-&JAv=E>3+|29?Git)NMjfGZL}NuF^y_AIhr7+^RznMQ=~YoDm9KR6^#ENPP*y zfi%)E6T z#OT+=$TwKu$|Iuie7Ie$eE8Xtcabh3_5_HueIYKt!G>1W>lGBdVy3vMp9P5Yo+Xk- zu%V+zD2ggB83lSzgW^Rb#Ao!QO`A))r9K|!9_V8_Zl-SN2%wl8*8em<&*RheK3(|> z&MD8pNbh&Wbik6>UdKBg zC9CP-Vh7y>le-JK0$FZ=EsS={5DAdZOP@_p&4a#}WSVIY;-Psh0%zzG9F_ATL*qvU( z)b4|n!gjSjVR9zq-JTo?OA_^3VY1=MHVHB2M$aOEcIIK{T_SWMhT&Y%X(FrcsfSZb zm$2(SYa+(DDPrA3mQ=9<@{;cPshF6q`n?dLZ-VTMh<}q!Dwl-(aSerudRz#mj1x<0 zA?529A`Bh8s|alptL1+Wu{N>fik6dDINK$XCb8Nl@1L)C6+Ydmg()Pof)LH3-O(pI*VDJ@*I}TA$ zJ=k*Qgda%r!VYp3b&lE3`F>@LIo$yG(!sA*M zaqS6rm}JDhG;U4g`^%rPADPrEUX9Z6ysd|5ovq46gn~@QgtGJ;1EBz zMTBLVr(U%ph06`U*$D`|O3uW>a<@D6_#YsO%5|upKi(JYR|9uGC6=P|KJ1}OTpoUr z0Momt{c-M{>{dQMuAmf!M&9TOC5NVXh}>!TVN_X&ll=MU@F0vK`{Fg57#|GkO4p9Y%(lKG9^>Aw7e``fb`4`pdU@4{5U?b;4b^HIN zRdbN(hiuNwKJuqiJ9HF_-XGZi<*AcMp#Soea+I&xQ&vN#ZAOlV>dPzqAD+ro9jCTS z7wM^NK#S?psaC@X)b|JRel-t0@EhR%-Zevey(Vn_mvR*l$A5=0Nt~F*!aKa6{ve%w zHQ@iy?H3|5W-&M+*`Mc?H!QDY-XNTg^+$0K7pJq3zRO&)W*f3<$&9F4G$SSw84?NO zvRo-MJX3)IsDc5yTgluzamFFK%)srPQ{~0X8Eiz0Z;|7#9&T6Nn0u*-uzW{`ym0Ul z(2!;VI~tdFb|aBCgAHwA`@bdpgTyN)VQIM{5)!6@7|q*gZIl>18T=%^nZi`W%IDiDSJUq z^dlTu+5NiYqt<=TfYX_cw_FzzlaHLn6@xr2`V_4qF+asi-p}hFAqBv$-m(84@-ic+ zY#+=x)jRgf^!j2Mx1}qHgK6wo#ht#?Bk*H`{Je(dS*e>%Y?y;8zr$A? znZtrY1n4LOTT8X&VBw*6`$qw51_-ye*aNS(edzh7KHF#MTy|T_2@rSZvI$--cRkj7(r@olI*F|L ztbBIX+pG@L_LRv!@eY25rhQmSI2K^jW{$7$NyoS_&PPP0vp}u8PxhinWUF-6D>1YW30GEN+xuFSXz9P$tv4^EloZAusy?Q`z-dY3-ps-;&>*TQlgJX zfmpMR1&XAFNbV3X@$o{OQ%q*!+(P_fIK!(zto)Mo(Ej!kufNYKdY!WZbtiLf?qC%Glhw-W|3|M<}_WArms;5uVhqQm_(ch^n6n`5 zt|sswa1PW?YvLHkG-YuK@q)8K+PG38X$gC#b#)W{KV%|d!BdDdow{OcBox}Ht&tf_ zdNI_sI^3^EK6_c9SHU0GCe)*wN|U=55xbOSX)B*(Us;NGRA@V%ivCwwHQ~DqzdYLa zLL@9>6>A-OLhZ?|0ebKME150s+tYv1Lr9H+w*Gln@iK)c1o3$)7B6Gvz1|@Pq<-p4 z@%1v6uZ?{!)_lZ%(msAB#xG|dYr8GNe+4_D9e5-ztYFI%zWrMoguR|a|K96)CauMP zM#cGG9@ww12fh9&{5QA5-C)%42ls#{)W&v8G2jZjEtY%>R zV^U9E34VEB*+6};>|f&d)hw{ruLdj+^psl?tYJP$rc@4cQJWp8O(WWJcZ zjx{Lr*FCg|EruvNt-tjpj_mK(VKbRDd-^%MTVvaum$D@FyGftA1J%tu3*LTOH5PPN zl=%Xei{H5?ntZ_~YJcAr8@|9c%7}ZS+6Fex_AND&-qw~!Q-1wvo)Y@Wb+K^+vqdeq zK`}Lk?itq=vit3q7}VrDrsT~n`iVm%@?AfANBq43^W%njV$_$|*ZS*@Sn(z6*{mNq z&(+52TS`oaYXm)4m`1LKY6C;n)-6xe+{jjI2X1E{-N;_oDvkgvevlfsOVz*v)IbX+ zzIx&<(duiw`zGp^81OZ#phY^w^Vh}pttgP&uZ#0rS#ZS<;k?2E*)IJS_{rm$*F>3ZEK_^= zXLi;$OcAsrmsI@uCA3)>|Ayy{__zB*#lOcz<)r7o(C5G7zfZ+~*F_co>X%gfm;A2c z?{P`RzYjIzip}!hl+ZS3Rs16%+!dBeXBF}<5dCNTM_p9$KXXCFpI=n*e-2d(+h}z` ziMer_p#K&BpMatGuf3q+KlFDa{vKfculVPmSMkq1ui}5?oQi+UFDm{Y=c@RRIA_HF z0_-Xt|3d`(@A!WS)c=To)>##Qx6>;AvyQ9yPdlsP-}9`Be#{bL_BmUQptN8!@lXB9^L-hIY_GHsQ(fF*n=wmYxk-62klbv4?L*i|L}l{|5-Tizv6#v`rV5%|*&|0!qt z4@%Bbh5nbEh2JYVrM}G;f3QrZ>D$F`S20@)*(?TLW>dXB`wP9Pu7gyL8t?LdN;b&?Mwn)Ctqc(yb=igN4<;}bJy*Jzw7%nLNqR-wA9L-q% zz{q}?AY%xEk^Qm+AEr$mjOEox2HO02i%7c0hHCm(;?Omgrrp?(ZNJVunfC09?Cv*k zKR~;-UW~fQGPEY^#p9b8$2WZ?=IA(lt+ZKus^d1z_|L^99Ya*p&7!A+jgMZinIyNx zCJz#kmc91FZT&Hl7U<(XH>Lidbt)s9ZW0e2Y`b>ltL%-pSQ)0>+a&hnu|#dv=c3GQ zHbndOQ!)8Ao2@O|C?4HrwS&p}IF(hd8R{6Cp}vUGJ8u-RcQ6g=_@(H52aARS>&1mT z?9Bknr=*jdp$5F8dhzk~V$fYSMf-bW_JzCbch>3`C`8+jm}=q>#+YjE1yH$~EYaW0 z!W?8Q{uo~TBvT1%wod$=k4XKpDtrBXybVH|zf%130HU2xft*_o1yLhRQ&cgOR3o66WOHAi0*zpZv`5?fj{&f&k7>#A@lOm zhzQ|ZzD6v0$X03zA7$5n#M(2>eVJ&sjXk6NJ`-m+TEe8R##7cPg4O!w4d z;`1kLcym9fh{veov@c@EinO%d{Rq~qh$VgH=KeiQ*hqcyO0oVa3mVfKP+EHoT!{eU z;xWBnBl8Ej(f!_ZGPyuM^C86ke{Ed}KvhNepEnQmi7XF<2Pnt`QE@{+R9pkMKv5w# zas`)i7ZnZHhf50Lf}#$oB`%fin0`s+S6Jp!R@Uc2YG!HmEWa;YN-N|2e`jW{;p;!j zJ9B^M%$YO$a_8PlyLirz$%l-K(t%nd(BCshI#jysMj1?`t-^Id-{w$eVDnZzE%7Yu z`4h{^g^TG-K=WXPEuNc80=do$WE-{*#~C5yazAm0umw?aWct}OicBSG!_o3pqO-e<~)n^P9CpRJa#kiAApQZ7p`(OIG z(IULkD~EQ0WBI^M!c>bHa27&6*!InJcG)EQ)|y)MizH>pl($h?sAeNU7U!wOs&4NE zC|`i;mN%ov8fIeq8DGGAM&->P`7&<=LKV-QtP(a7sYJr8qm2+UZw{8JgeAI=uq`Dz zZef!ju53I`O+jNEKU#@B`-g8+6u8kR?HZ(l*q|nzeTy z%9>}#h)ffY<)5xsSyPS7uah-zua{X9u}jyNE|Ti3NnfC{CVGqT;yjH1utmgh9vzaq zSsM9kmSJQ7<;>JADrX*@M>#X>niN73=+=6$wDoZGKB{uG(8l4*A?s8QSe>n8z9A)a z=Y~X_=Vk5$tox^*6~DoZ2kx5_SIrVecp~=+92Mn&(m#VQR!Az<-LP02_^iFETBKuia-m` z4DI|8^@RUJMScz?7=JRQQnrMuwPLA-x3;caErVj?h#tnAUnD9mJdz(+FD_d6EZ%Fq zNN>QC9Qzl%4Yv@E;VV z-8p?a*5aNI?nzmk7pJHK>P>YUOK15w0Ji6FKgtp3d={3{c)Kp>b*hxOtBH<-Ip10< zt^{$Lh;7K@xbJ$A-H<2oJH=vKLq5Rk#bRaIBgNvEhCIgqS32X3tcX*c{|m*UZ6u0g z#WXs363OkwVx~85oHOw;j4?+4+xdnZW6|~gMSH5$C7(ehqy(QLTD(YY39cn;ep;>& z=YFcEi;wm5Mtnit9z-i268(OSiuQx4D%x>tM0+3JnD5C{H~2<9t@7bN%f%ue9vgdA zN4JP{BIUZvT029DO$1E6`LRdyP1nya6X$(+3eQ_78vF8gwx?G~gW{a&u#B>=*z@D} znb_FG6xeFOn%ci#|I!pQq=#Ss(!AOGsM^S_EMfBFO>CVhZ5YUD^c_WYsMyn6tKwf5 ziEn**H{a9C{+7A3TD11#jZODNrj^@xPLUYn$NT#BuOl*ZwWxqd^Y8vmk*f`N3-Xb@ zZ>QY6h*%!HpXRby=Fgi5FDq{vbhO~_Xq-r4`nnz){}SO`}p{Q5JwPBYsJ(_+q%p?%i~y4(;?zO#*h+E8s zi)ByFcdih>G~(_3XRfHzNOPTo7mN0Ryan&PLW~IH-TMDQl>k+L6DVGKK(}GBET9K= zoUTP+p_{X)+aL6}FkaC1RVCRN6rIZ0+di;e_mATX#HB!_al>-q3gkWcxJBZTAlNo! z1-0PDVqOq$!`ChoyMuW1(6b9EQdIk(@%<=|^-Gujw~U&8h<^(Lkw5l#f+=%;T_hUV zc(i{54JWHt^HePoJ#D--&vS^Wpn>_lDb(TU0)$a>+u@7EKH^O2t2pJvp@GsFvPk?u zoOsQtA`Vql=Y@qLIvAY$eN>n$#OX|&9Sg;H;{2vL^q!@6Wcwex5U;iZ=R?i06UUFj z*cXb+#Mz=b$;9bNobMKhun=&%YYy&oYi)ZMh>^s}(wqX~cu<%p7Kk$9r0SHG69<3H z8M8o~3*qT}>QWIM%3Jc3rD7n_kfmZi(O;H`okWi<5hsW~yF}b1nzuy6wg4TlMD%V9 z8nr}B2Q~k`xK@0Vh9Tk{Jotc|-F#rN94mOqVo}?ecj8G)sa%_g%qF}U4_PecH{peR z{i3a5ye-dOBw~psEE1!MdMpxah@M+0Dv9n}D1IQiaG?kc2TflndJ%29P~;M=SskU*A?2uX>+*nknu784o5Bj;kP)8o_h=Xput~z2ntpjKa8g__!5!{+` z4)GX$@*htrzh0sj;WMx}p6qf4kPMpaPsFDcv&-qqRnYmT#E1yq+^-x>7iPalug`H_ z%@@THJjE}gE?Al`E=KSc*7`lDp3?{_tJq=DCXz?-XGX}8tZ64i@nGPbQjPKH?}f|4 zp0d|zkT6FLTQ7@GBYC@s!<3D%Zm6VsXnS&`l6hpl_{GlK`rqpIP^`P>s{zz8Ttyp( zun(dgeEy+mvwMj3k?3FwW{S@udE1Ch^HhATCDrluz@(Lo2%0BCqj<~M!^pBq+Tftl zN|jwRP3`;6Kv*O`SE`#^O-JYNApO(KTtJ|P|mNXiCxh=gm>sF z-i_ux8xNUQ>$-mVFUmGrC0?V-L8)|pEZVi;F+6jQ=+T@H;2v|tn&!Nd?ZzokUZI*NSRB^vK53?o0GNtolO10EkF;8|OUY&KV{5)5TYk?|sb+=g2 zg16_}rigQOsUaxjffroj(2=CFLk&`IIx zL47%Nm!Zh0b9i}<2#n#mUiV-RUDrG**2kbXJwH<%is6w>4nD{>S!~7TW68-_OW^_A zY2tPak4u~afd><53-lpwumezzvZ0fG7%pi{o~oepGsK8iJi56*sRn*h{@ zXNdAv7?}_36d$%ifsA}Y+-b!-@a9j5R;~G1{?Q~+M0C<5fp010^4k-|s5X2^qAzMN zVn+BPlpq$CN%zeAfn=J5LnB7zOy*31UH8KG18`1ZDKtsp527 zjM%$pi2H5%cjISLII5!5CC5u8eWE8*JCYkVlj*If{U=eL{^I-&c|ki!Q^%7DABLoM z`Fh?m3Y;Me&6yzUf;_W}_vxuJygXGT$MPWaQ&TXSg<)TAW-Rye4n#GR0i7dfh?TK? zeAEk*k^S=Rh1NRziX}i*`ua^0miD}pV-U%i<-~=~RBk{9{oIY3O(%_6oIg)QAapz* zk~!dn(T|U2XE>+p6vsGkWh?Dg=e|dchWfe=yb6K!0lT7m`ZOHgbt(Sco`1}L9V?3B z_>%BdPe1|cX2{Q<|7~2DKj(948 z&)}(J#19F4Gf#LzEbhREHb^J6>pWlEBEIUt!x}yX4M@+Z>w`vbP2|l@X3-*%UvKxC zEK$@*jHbWQqg5DZ)MoOS5A_~u<58+H+{zK%JMun`zu$S0F|g>ffknsDicX~!olPzJ zl@4Mg%hf`0L~1ee_Zt^_fZo<(R@4{s@ZK>g$1zQVOF8ZlO|%&ANpa=H(6i@%?+d0D z53r<`6%RF8QcQu-DXzY(*uw<5c|SmfJ;k986{Z}oCpB1Z`B^>RiD7KT@2Nh`j($R zf|Au}8F+5NSkk+)Ep-hPOFQy5iH%TuW&R-FaNqt9JbPDztV=KI@Zd%P>I(HC3m%sl z@65~=Uw7n9!tbEI(4sK4_>t?WSREK|$fN5@5!8uCc3qW2%CWKP8CZ(qSW#uA^O7_@ z=suP>7^8|VANipkUVsho9hz6hpTvH^`f(z+6OTg)VS!$B8#lI7@%RY>00GS<@#R`!@}{ z1H1K0^;@wSS)V@PNKrzs<9(P1;k}ARGYkEArxiPf+fyeb^eRe(>9wvr#NE$Qlpg0% z`KM3#Y+&(l%cDhoygd38LnMVtofpN!cxa3- zO2q3=A=qFb6s8nSkMlSVA&R|dwAH())ryah)OzVf{&!s&mLezmwlV6(vP|sk%o`6K zwNYheYEgZRQqD7DsDb1sI2WOU%Wqb6j76=KP2msZ=H@KbVXYmlN~5T^JQTD9m)NGq znetzpN5%=CB#aM*C8ARjk7z4MWl?Y1uzwFLKqiaExt|m)J63{XD(XE{wlwFGEU_$! z2Zs!;69T(kI>gM;q9O@pd^$$>ci}A^*Pw~&jx69}hs8M;l?lb!!1)JO zL-^2@r%W^+?AeWq^I#9^FEFujbVhC@e53ZDx*&B<`aUG2oQI*NI0gxtK$Ue}$J{8& zhi{60N-a8qobZ7xee)_9IeOg$8|a;SsACz}{;@c##){9n@b)9>%P1q%H?_vAD7(~+ z^0^U+lD@{6Rvh7sG@?8K<%sfZ);fh-=8bxs{6hIYlmr0+Pfpev7eBp`PE+|W8t z&-Dm{)Kv+}2W(*747c!Sk*b1455k`ts=_-zMHQC4 zd*TqIhR}AIgT#wCpdGUku_FXZmI}c6CQV~~Jzk+rVg$NDr!wikDM&x-cqTqFZv_lyF({+lT8!J~ZEAYh-OT-1ne z&gaDEJ$U1g|3Hqi`r*F)`Xzx=QoW<^Wg!1n9F0Nq!B{B2TW3k{au=VtyG$GmyKjvU zlY8=*xY5XypM9K@K}tmxNq5{?_-l+mAF(l$H#(G*!PDzEnKgcDY~GX^lji2- z%*eI(u=mNyn-n{9)>AR9x*c+i;D34eJ>arQ({pks9a=b=ui*})=sC2Pff%_zK(8Bx z4(Mex$2FLj{)O3G6b9Ytn1mldf8@f1um{Sd75sC-JAigth6z+F&a zS{K`1>pHrp*7g1BTG!0ifZ^{+{PlaSHpn#(9k5;27j^m z>x#er_#278OffH;Pjf8A3Un*}R^e|w{!C5G-S%RWtr14F>eyNreI7fhJCx(ugjCQf zy6#cy3ZZLI`dIm7&}7g`&^%B}PoxmE8uT=1%p({aKvO~QgO-8D(S}QMt;03lhq1yG zBnQAg&^*w4p!-1cdm+C;%Rp<059)!3pHG0=L1TK?y1Ijwfo6eP`XGBj^FjB47J?oo zKIm!CeW2GsD?#spp6KJKb$Mg^w;DhV44K>yigBF}nh075nhIJ5IvR8zXf9|a=t|HN zpk<)dps#{DLG8ZKlUnP_0L@B6jsc$xdImHf)CpP!dLOjX0gn|CSA#}_TKdlo0}ph=+DKvO~Q1>oz%S@3u_ zf&ri>5TN=SWFfAdpx$`L#)&H^W6+puXbPZ}PAC9P{V#F~YlF$ZAZI|GHORqMkpC4q zf$){TAqR0CbFbF58P`dmhw1t+S62ZsQ zAa;LTgC;xRNeyzjazV>LOF%0@_kvn%F4tku$)Gm~2Ms~iS%M)CIvF$(hSL*JNiZNE z&#mmk^*+$eWN4Vnbp_N3+7<>ChPzz(pk<)@K<|M%s^Q7PqaYSM{Za{<1ezLw0T46` zvoB*HMzm_(Pul@CUKCkO)A*BMW$ZeKS>4s;VzCI=9R}b!q$i31 z*ZGgQT$Q+~+3Epbpd3ezXh%F!-YSYsHHjqw81G7&`qI(ZTlfNz-!1)wLUA!YF}40i?Z zfuA}X1~!3Q9t;CLG0){X0~+%bat@=TGvDQ!4EaKwr%9!2$0B42Jo}cw5HM0)kFFy_GNjMVG4( zG~^YR>k??pt4L8-D0&SEKzPgRsC1+UbRTF8=wZ+#(9@u)pw~dNK<|NC-h|$+X#Xb; zx?D#)LEv9tfM$W_LUA={8EEQzFbK5peMHz9DFRIdtp-g64XHwrVW&Fg2IcY4 z(6VEw#3T<|Msmkdw?MN%OS&WcNz|Dnw13OTXjYVR&|Cg*5K4=YS z>NluVy^$i&B+x=UvQYtA26~im&}z^Vpf^O(6yDNQAofq;!JhY;W7ra(PT|c=ad>F} z4{jBbSnI-^Lpm#d3-K2SELcGdt(fh=pIyXHT%eOH59B$Hx-kC9R%hnl`6H1fh7z78Bo!^>%-dj zf|UfUt`(KQ65X&sb~upCSTH#(RaX#aTB+AFcuB0t`%XxO2mFru@*B?zd9=V zfK>=Aq7Ie?Y%{Q+I@okz_`>c?-YDo*urSm}M^x5`ElQ)gnKb5g2O}y({Xj`WM zylDKLNx=Lc*En+Z#7w@h;gwFcuGMtiq?7o0CU4%b3YoT)0COkNWERd^Sz-TGg!K4P z^q<9>I?B4CB9Op;(Es)FwWj!n^zn^bVP4PqMc)wAj$Xc&6yG>TB~QCI7OXnlD^4d(~APzS9q*9Z{Sb)hDgNH*VjJK@Po?-_=af?ni-6!!e0!sAO*@iMsyUe zg*^ID%UnLt)bM_Ctt%2^kw?o!;h4>v^N8jmb1~g)n~e>UCQ0Hyvw4rG5=?jE$O2id zC;K8sq{zZB-m@L34drI>`W)V(RT!>M;rcY>GqgM5i&@6_r9X2EsqR|o`$e)2HZ7FdQjGM6{XOm|}q1uNAJ zn+&Xv8@3o&#VO23r4a}NS^})C@XzCq4!Q(y@^_ebYc`3|GH5NP!YDrJD0}6SsQ&+7 z92nSGG+JBr&*FtV+#bn>e=VlYbsJV5u);bRRlq`ED}jYmEV774J?NJ9l0NWAPVpXl zz^el95_r^PSUUB1;Pw4b_D+`?vS3yNreQp#w*~>c>x=j1@qYEXdoz};{e|!!l>S~_ zDdDtyvf!agh|5SRa#~77-}+}OX$zi*5BT+E9rU8>L|lhh{=S}w>r{PBc5KFVzD3xc z;{9T;z<(HVS%8zH`0oI#1ZHGh3^0o?GO3|h^AvC4l?Z$f;`h^Pm;OyJz49Tn1Iq=-G=%qn^>}x`#PSA zWrJfGzk|OgV_E-LmI>eFST;76Jr>Kx#IoVIz8%XRuX}y#fi%J>G05XT-(*}vgGH7g%meXJ~*%Ls>L^}!C52*t>pcDGiZUg2iqdZ ze2*u^?v*^suK-vXutp^JXbcS|Hu2Z9XaM(Ca=YIduqQrW>%z1CGJ=**^NxNYn1JQJ zQ0p2?VIpG0w5NFwzli`>?yGfmA+TYL`15I;Ui$KB-q>#+I0Y|b>y0>O$?52O1K{FU zYh7m429G~Q&sDsiUotv|q>5VCBrUjlHMffct9ZEYT5v|ciEfKHzlh6__Pqiu1_Ob_ zE)v!&fKrx->6i!hQkIj+$Hl7Eyr*vgurlnc&|?@LuZS;K<5UK{SL{q>t?M%7h7h(w zDt`^zVnUaYFXuTaAT?EdwEU06$fw@zsR)^Q{49 z`3U=vWNoqNRm6LGb;nZj(lP9jnMCYrj-%KHcgIkIfYj{WBJb-zh)w;eVNi*eH3vpu&w>wUNVf_#8mXq}D7P6D=nP-p21$ za1LXSsD{j|-$LA8hoe8204~PHPzq(zFU|1=5#C&+u18~tvt#{I4|i2b(Shc|wVp?a zt?PMX-+XYcG{9#8DB9KHz4bi7uM*g4Zo^x5+t#06s87Euv8;# zb+p*I2qVvi5+3R+?-^o~M`{?SG*m<d-W#L22-4h919-*3hty2ESBrPA6&&SDT4% zHsGuqZ9v+)XcdQ=iS{Mv7cK$Z(N*i%(Clw3{Or*fp&!NCmh5}7nb@!!$u8c6Waon8 z9H2SvHRmEYzE$8P4a6%=D9l|ks1%(+i&A8^r8zPM+d*@PfmeW)@~(av!0u(bT#YEB zHbhZ%YAy~Vh~Hjtjt+CVo+RmUQR3%PoZqVk$VRwa6G;5gC=sz4ZLTdUb6Zr_E*5|T znu@ubG0$BI@aRZvvQx1f5Fc;mt^E!IyM#T@W2CZuQ(@kM&{k}0TE?m`WqWjs6yI#& z9UFB=G+AI2jKfwvNt+|Z&MmxMKp!y5z+mHbi1Xs|7T(DVZIZ3ToF{*Rh}z0qI4a<$ z?>fOw=`aScqrl35d1{OZji;A@=VF%%lVRxys{uA0m?2A;M>`Ayzzm&)g#eof4C9D& zgtcwQ+OTYZ-gUra2#yAZJd*ANeuo0f$``k`@?-Vvu^6S6i1!4KZ9EkI)TMt%9t~Lx zhrze-(DcM#z{{B59A%dxOh`B9M;4V6wns zHi%6K;|Oby5fS`E;%3n#c7&YZQi77eI|zNFhzCblIxtrHFqRGM6n5o|I7p86BAvic z#iiSeU)nmpmhE!csBUaWhnC_iIy}R-_^oY&OhU=h;@cx4Tr}LqBOApbL=_nOun{R4 zO(dha-yMK=Cc9kSP)HuZ;o^~P7*3N>a87JZK1(Y6!c~Q?*v9R?o54w(jbf(ygt2fN zkMgA|5jY2XP=s9-zT1J(_U+N9P`${yi=yXt-l9_sO6tlC6M{)5o~%LBEd>#fI$ zI5mfbT+$+Js-b8+J`vlt^H{&Nz^1Qoxw^=D94^jp=Tm$!Ut&kG!HKVDQ6D^L2O>@c zw)bh5s|jIvN!bnr&IMMu3Z1G4uxVj5$Tb&Nb|5)N!RdnnJ4hxK3*Tqan!S*Ao=wm4gl282m{EFiWdUyn{&qkvtikkc`&1C?^grP zK9s+MIPYr?1_EC(?m2Wt$ta=f&3HQ#+3hd_?%_V-_2+og*hDP-tGE0;*QZ*M3hWv% zqj^zn91ZNs7V*b(sEsS(cY=?pw#@6gn@Hv0-KZ0m^c~dlMvI66b^_Q?Z1GZgQ+fTp zXRwN!O(r=))9M}8vpbNjgwCz-)4(it^5%}1P8d6}iCni|=nl*d%$Ee=DDn(oVQ$z& zU|GOW3#B8ud|*R?8AcMe7FY%_%<81;gWqysqqn-a>y~(S4{u?*KwA-kBT3u|R-kxT z#eHDe!2Fa3X_B=wQ~>j?gGB?&suPx~KoYRc+r*l3p3sywg2U?YX-y_~lef8C+nE@< z08dNYDd!;#XiNDLY@Q~L%)@XQzl%3&d=D5IW*C7c!n~p3$~G}}7jN8&_StKo2vZN~ zFb8GHz!q=+XCV`BGD)3n`D~>YyEtJ-1`AWE*XEXcA@l%KM<~74gAx$i=KOU<9b$X<1gMW#*#ly`IqkD zwtDICBYoTU@Lpb<;h((2g$cDkxAaXysa7FTBcU9onyfT128)$iB2zxouCI+xGfqt)zWp@ItYsRpTgKS5KuscD1FAipJ*=%PAva2?~ zt?6t`Q?K!L<#I}4idnv@{=;Q2mNI+>0TNCQAZ5quEg!){6oc$JR`*UXJj&GnD-|!nP}e3AScoKNWpRvO>%;86BOeEl<-?CW^jCxh9l z1fR`=9PD&LKyeQHF~RoL5DKOJn>hOqk`eBRGw?~t%)bQK>>}rz#@&4?E zF19x^+2>t+ss^%6U2VHZv%_8eY9D8px>~;pG@k2>5gud$~uz=AmqDPoGT#*vmZwz8}qw_6#T+$!_=bFUewSk}dlOur*<1?bj7mY{R4d8T;x{ z>q~>!rc}%R!OWGq1n|54yqdJgva&WlsL8Ll@w+yb{kx4PqP*0`@6uTI zbDM}Sv)ReEwwu|kxSjv?Z1!op;E%J}wRR0Z$Y#H^v%ZtfTcC-Ihd#o=)v96SB!HjHLJrTPChhW(iq{J|KusekYf=qUQfof*Y`91#4> z7*;zV__fh&OM2W3qnH>Nym<_JePHma(d?sv9qx=|R|iGFtmT7$^<-)6?oi)X$Fiq~ zVSL&#tl?UiI1JxkVQ&m?hMYb(+;90f_TdQf|1`qy##nYfs~Ph9kE|(-U46V6%vm$i z@5V^>%*aCpukh0P35o4(-_&CZ0+!cfXHB+(dh8`0Q0vLonQiwy*?DsSPUjx*u-)^d z{{J^mR_^)bp>_xO=YIaV&&lzI#c5h8zW7kyx%>S?9?>Y~yc)r)Pbyk=o|o?DK_dAm zx0*6U=20HuZ>fG*CSNQ&$_JaA;tOz1CF15$-afKKtFO?M?NregOr)tEoJjcy4-1w| zFhPH~DEx@qqjJk7hm~l0MN@@htle`UW!Wl|$T-feURU-gxMojj%Ceqf-*G57y<20N zCTkh%UWMoGh3vUTr|l{M_DDr@eK_zQ4YQ5wD7qdda!+z=gDX00hWO$f?_65NE#kyU zUcuS-6mO%`ZyMGqx_6w+F#oJ6DD!8Dd6f;|LB<)r3iNddRSJc`= z(Kt;jG&R&k#`Og(2gw=N zx81HAV4Vjij-TS8jwE&QKzM-L^=P;2nQqrh+^&nLl!YaSB`pYccHG8K&bH?zoREOTn~^_PPb|95?zk2;BlP!6*6 zkn?k1UawWZXO+lsO`p(ozNU(c?q6&?$AcSGJ+FXraq}d00I!@!eXl;plN(&oj2}hh zc{KAHk#e3t+JL>F#BYj?=lS4BtG+Zb3#$OfT&36*FDiOp1+Eg2)%?-cr#0#|PG#Q} zeO;p|+owWV_aQy8{q6dal+*gc{DESZzpQ9;t)@a>S7~}hQ}&9Iv%i8arv-Ym_^)_G zgOUPOr&C4zCp@?`V_A~5Ttmop=|sg>yxPCYEyL_${{`HUsJOr_p+;w_BEZ>ocuXvu z)rc=H;21`(FkR$N@r>ui!izk%|HS82dJX9yc^SwSyWue!FLA@WX?*YV;?_kzKa^ci z`iw;@9e$t{MWtAFi3j&$*K|a>@t)Rfj~7%h!;J4Vp8oQ~_#Ly@b`=K&vfc1{7%(~W zV>Q#1V%l3I_rAvC@)S;6iRAJ<={JzYz51~JV&J3)-zy^lrh~D&TE0NZJ0z2SykwgS zWFfCTtSDULS#Efo#wWYsy*2)-8$Mj))eqr_e~M;UUw=5_#Trj{!#8NW&<)?M@oR4Q zzce29#>4tg5bi+Mjdo*P)B$$5;s4Y4DL34xY4_c5Q+>+UKxW6dR@Vh;d^+&I^B)o| zHRGsTfUX)3+yAhlfxxMZ?R3)z?sLr!mURXRbCYka@wI>BDt@ExJO5@#g*|kDkT)NW zIKzm*4WFR#!v`LgpRe&;H~Auqj6aYSxH0HZ31wZ08~%pI_qyR9X#9>_#Ah{r#!cR- zac{@Lhb{e6Gupc0zH*QVWXW!Lq{fH3;fWfb?uMgtmkC>`@dxEUQZvfk0?g2Or5j$L z@iT6CsmAZP;V)=B@Lvxl*umb`jHHJd@`wx-!B98+8!eyfhTqosW;eXPmr8Mk8{S0X zjzD(GjnQ5QsBy!4Yux*-hf=^sXgtOZpQiC-H{7A|EW#h;Ka4EZjLB{RUetJj8~(1w z_qySqYrM)0zpC+&I+aw$e^)cA-2yahsIqQtodASHX#9qod?)1ASGmPucM~!Owsbe#7}yrO;fr)+ue#yuG+yI|?*vYrSV=Q!oP*Jh zKRF*v42f~2rLww(f**`{(UlLU#u(XB-SEv?k5!HQtdG{y3KLDzpRI9hc*3DTjFBqW zO_4G1>~O>XtreAPMRT-W9k5p}yXQ6!C%_n}4!i03faD#pC_@KmrY$u_u(-D$PH|tk z=^V(?-S8}pPjthlX?(F8z7)6#$F-_)2Sip#+HoiMst!=&7T|r2d%W|oL0@Y8sGI!v zIszx%Vu3UCH-X2*{F$+?Yt2|wDUhZa%d=GgocfW@Au@m95h;Og@vfB$16hU}{+!0M z-S7%h6O6AZ6B%+;OXayqozwVAH{6&hZFa+rV%qx-7w`Unw<;NC9dr|1F5^x44f;*2 z39J4}B~sUWR?lC}bFCK?u4j78rtuJsTSU$U9uXQN;YKXoZ9>b$7eDgg&`w~>_O(l8 zA)RX_=MeEu9-OvCh7Mu(^jcOi@ra!ccAAd4!pYVP`Y+&&1+Y}NwepG5BbH#(&-5GG z6nC!zP>%~V>05;@P(Wq!e?1o{olhjN)-ZRU?!=6T}goYdTmM^tVY zeZ~ci$8}VAtWt~zh?KV62}%vE`N*}0hho9rk-UzUzjWj5=Fd25KMibutneD8t=EDz zzbnB1lORoSmc$F_!y3lpbjqY_gQjt{-e_C4c*i{Ws7mN6U*P z@*;FAR{v7#_ez~nBrlMVqkdzh+pdk)3wIU`oI;(xsBFwsgpDAaV@P>XX_J#Zc)tQ} z#mdsITb4GRUDkSX>6{cCo&F#f)&#l1!bdW19l&V1-N2y47Ti|>=(at%alpx->{rw^ z9StY9Tgzwosmzg!GvLRB>3?XPwK`bMWhGCiVaTQ7E+eU{IjDef8ZXwkT}Oi(@Y3DF zYnzd?O-jFQ5F9!%T-nIFs5p%}I-0nqW%Bne`Fm2_q+nmmV0QG(lr(#=3PyMO$qg#q zj|Q;^T*_HvJHbdug9sI>N>^|rvUa5=&tMb2SL_+=7_Vi@btb%^Gwm7Rl*)`(Rr1nx zDz9ky3|*rPoi{XY>_jFh16i0x?%PT9{`8{kNhgO!9U&2%V|+*CVbk-Q0WR_mln zln&%7MO8w{M{9#TBXy4MRDylAd{5w!+@Bd+F(^&xmP>hk!AfiWy+Zc@qO@AinQZ-_bG|u_{S=AZC|< z%XS^#1U&~?Q2v@y9;xf}7>!pgR(PD&zO>Y2369^Tx%L+nOixLWqmx}!AB=4yql|`> z=Ahh<%3t5oZ_UA>J({a{jomDxP3|PF>0SDbKMNVEd#80f*W(KNMdK_>MXUR57F4<{ zAUL!GW{i{~V|&=>JJN_7zeIB@^iB$$cO!QOIK|~&yRJx`4O%L0m9|7Dm$ehKZ}Z^z z$HA7xxK}9~s|d^0!I-YHgEd}I`fW&X{BxRHp+_{c=2mEJxmw#38b3~7z8B|rS zgl}kreo|7=A_rkYQ_xRSqT((nw$aTOOSb84C3OQ*6tT6JlALl@ z7mLfKYkUQfi`n;a z6(>pj+|DYtn&*`g!$^AiS2kzeUhF!K8!B|5F#UxV8iTonl)_SqoH4KKFWK?)HM?9Z z*{YR14V;o#-c|)WsByE%fmTzLB=KooRB~`zSn`eJ6al9qN_MC+Gn#Cr3SF&2)1fPp zGHxXq4Srx(g~xrZLcgaAeycb_DS8uZD+^=pHSKN1{#J)(^Hs1oZFxhntQNyZ$8IV= zO7xWKUCpM4vt_f=Rl%6-&j%if3HE)rrS1u(?rR;)+F8XmNo54{#K|^PI##9^r-l_a z;Qsh$*R9B^qi-!zT*%k4iX0IBboH?!7ZvC$z96uzB%#B5s7$izxv)Gk31u^t)Cxs* zD)P1@X;*cani6F!9s4I|?}@Z?q_{*~8^0|GM*)>QqU14jNH=K9MssjlF1S>D8E+}B z(Kj9=9974-ZP!qT8t{mczoHAquJKVK(uA4P63wnCQ0k2N*t;4}-mGwMMc5q~%+ohn z_r#_cu?%`l-6RQ}LOAUV9aSY_OsO|0sa=YkmL&Xt5T>NmyrYyGT}?s?GJqO%_#pU5 zBJKkv(MV@qu_2N3CP^UKRy`0HwYgm{Wk{-?xaR9*cLh!wOTK(qV?J=o^jzJ)D=uTt zh}oQ`m5Tf!NqpPhx`b>hl}10)4>&0|?#CL&>=j=?N&E>Nth}4j9->0C>pEEOEroa2 zk@pZA&4_!BBx#%bsFWJ_V~qk1?W-cq$XCI#bxKFt(2Y9c!r*m`fB;_4LwmR8alE~&MNl93R9XQ z(yst9B zn1`J)aJT06r^c_0SMr`(Pe>~1XX3o4+27Ppd;we1W&opFXx!|M(6T=Qr*7cV8aK%CTf(POAVjnHTYzG|4Aj|Nk!OA zjaPI~_S1QHa-U6A=_=7T@v(A}u1UJmlUuC>jiF}(aLR`gy$YJ9<>yJ9iPiN{1n5)h zqdvcBNVa1Y*c72XMd8Lcv5#`w!COOVeX(t|o>L4wl67cez`jKt6*=@y0lUAmdT zsep`w6pb~0Sq94q7_3aH(ew7pnw_n2d$|I7Y1{#v)MdP)0Hc~;(DGFll{9)xgj|HU z*#Oq%WT=dc)5D69-OGVf4p!*aq#F-=Q3X4z*{5})jK+CYb&+FFwE{*S598I2VC zJuNi{xLkCY_9(&k0Z^m1xb5Y64}k*NLLv;`qy+LIJFNO_(mZJZo}2(q6OuSRA!(@b zOfBy|PnryzTAFb(t+|$8N%Atz1BNgBnATx$tCFkRIs3065gIU5S!JBe%hTEhh#YS; zk{OzP`g?`bGt}g^Np{CeM(7qwzpu_HuVG57ao7;!m2|O$OB)}3;2UN52Cmhi3f#Ki zgBmZ_rMOsYtJZjx-WWKl@#e#IF?DMpKALUj>e;4MoANnuYEs6Lryz}|WvL9hQm%k~8eamOCQW5} z&8b@)TdVQ%<0>H`T7J94S?K}pAASOUN^He$m8d{n7_A@IY3MivK3e=_>oF)-YuQQ? z2$>zJf|!&7cEku7{$DLop@$pYFjxyTcC`%e4Ijl`wMQup(7K0_1X5I`XJ3ZpzRkcGjCl2D-Q0ye6po2Bs*y~P!( zGi95Iw4%X(BuV^jEoIjk&`pPKHd<@dy}2<>>m`;^=;@M#?$J`l5!+xL`XeRvnZ>{H_s9AI6=n^QPW-SW4Yd$CmI>re66_6+)7h7)TP7{&EEv9ocjvq~|`v z7ym7MvIXd>X{4j~1clcuR@QFQx+e+$K$_tZ8#TJ>MTHwR+CEW5?LGtUEOsH7X{00_ z*Fq{1rsLeQ437FD-A>>%s;~@&duaT1!YRon>`9UyUy&1pjy`b`bq)T^IJ0SVU^5hZ z1K5-{`}azZo*}T;B-`|*B=HTg%S^dt*SBDep)43Ug|_PaZ>o*yAZ{XV(-1|bNfNpl z!v5G^KCL?`BOBjTQlBdFmlF1SQfZFUQ#~VZ6UDbSbl=%v%X;Cz7(U7;*1pT;e;L#>{`RK zA|)6}enXKJ1Rv$|=@eDC^_4g~N)o{F zg;|NrQG{8<#t`UfDM{!6Oub2p>2>}Z9XeM@2}$BlK+5|6?DC&ALhHSHqu;(SgL(Fx z2GisS|MUaj^MZnfwCzCQhQWlTXhS#62wZ)Hsk0dH?E0*pQS?~-U za+Sh|sT^So#r{xKfL&m#>V7~1p+9JO>!(WI7+0|U(^ytTBJm|NRR&k-xv53lxl`i> zu_|;I9orEV+Dptv=+LlP%BDEIq%dr~qS$veJNq-G#OT;N3A|J{*fdy?3Q5vV|_#aVSzIN!m$-k$Ic1lp7V|Tdk|6^TWDo zG+v;WE=C-lVp$mC=s=`>=;Ap_E1s;7xu@$i+p47AR0Lxrh525RP(D|sD(*353B9I- zTrZIl4yg%>ESE%-hnqt}k0S*2bKTsw^RQ)y5aBnp!t89NaFx=>A~DZZ)pWoE-=qh= z`44P4jcg~5G)3t@K2Nce7brHp|Abt++H6?}HqF5*!d z`AYYm3~l;dY=n}IE$6F@U~XH>oqiH~$cpE4Rsp;#7yWE=$``*OG9yCm81zi4)i+m?tWUl~|&RvBot<63T&eqM(R~va$yuW5G4%gQWc z53}t;rOy2ZZg;T}!AxT$iC?RwGW3eoXfC^fQql`2f+v_T{Q<89xMLG`M9fa!~ zYeqQLi;ju#(Ey*Ct@QY4iK#lI`(d9#Bc$i^hR<;kKB_#%^B9JW9k3!J-8c36(&*No z08Sa{e!%D{jk})%dPd^~W@RJ2q=MWPg$FR>;jYMd#keK*M9k2F4U>h=`9yY||vkDTS1*6nj;u z$vSiea7w#%go>?39A4V>=t6+9>5 z2Mo?#O5d$BlF$yg>TDl3d=2KoN7hyxYSrBQjrmZsR_3=&xZ(D7YxB~;c=l-T z-s2|aPneXOH!d${{Paoj9mME1cu~>jHs&uxep_=)fV)IuobYdrH{MjWHNPv?w=*{~ zC5V5uGxs-PDwt?))UxA0baw3W52#ZI(KXhbgfMes&CN}n#WNt;|1>8l@gG6)?g4j` zl9K)bb&2~Ylpvb6N1UC+i1y}gu)4IpxvMSipJC(U6UEi`=9YN3Yr{D6Q({>gb0e`O z&KzS)_-9JuJH#J)KhE6MB)TS=;|_ICF#DSEnjD1a-_d;YAGsHwaHwl1^JsJ94nro- zz$eU}nAP{ODMRAMJ^26F#L}Er_R{3G9*5rQV&2*)ASrWr&YUSZGxK`K_nnxWnK!PJ zxH-!lSehGEuk?|q@I#J)=0D9*T{7v@3`6m$hJ=I(^XAN%G&67DkVzBf4w*7@!lb^r zvnEUyugo^%v9^Wgz(cz;&9C{D#&r)$itms+XV!#CbLaM*j}UYFcFOEGJ?F`}X@lb9 zG9{EgYgTT2=Zv~SB!Sm`nQe#0Oqn@x)>F`RC~}T@wb`ex z>G@*zW^=PcAIvj%2y7gmFmcwnC+19=G;U%}UQR}Q+?;87(mSs7VCP5?u*Up}Sow_E z>XkHO?l^pVVoqM)Ltm{ie;#hi7ccEIw+~2;QZ2%uc&2br2Dfc}$sFQuJQ`@wHKNr^ z=C}r#Dnxds82^&Fa|3KBlEdSMyK!m7e3M*-ruW44m&^{lOnA!6=JpK=o>klevFl}X z=Ky0X-Jrkj6+gXfj%{c>3<)aU$iTD1Nw1jWc&fjc`ieQ$-#CnG(7ocNSIq7GYo@5q z(4g7kI>8ywE7+j9hg!V~gG^Q8rPshVjszJrQCtVyz*t>f5s|MWjmCZB8j=emwnC)KWFDkH)Nr43~nl1ka84}yN delta 68015 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 TSRLMF`xH39qQLa$tzQ2JAUr1o diff --git a/private/menu.rkt b/private/menu.rkt index f36f55f..f3170d6 100644 --- a/private/menu.rkt +++ b/private/menu.rkt @@ -1,60 +1,72 @@ (module menu racket/base - (require json) + (require json + net/url) - (provide menu - menu-item - is-menu? - menu-set-callback! - menu-set-icon! - menu-set-title! - menu->json - with-menu-item - menu-for-each - ww-menu-item-callback - ww-menu-item-id - ww-menu-id + (provide wv-menu + wv-menu-item + is-wv-menu? + wv-menu-set-callback! + wv-menu-set-icon! + wv-menu-set-title! + wv-menu->json + with-wv-menu-item + wv-menu-for-each + wv-menu-item-callback + wv-menu-item-id + wv-menu-id ) - (define-struct ww-menu-item - (id [title #:mutable] [icon-file #:mutable] [callback #:mutable] [submenu #:mutable] [separator #:mutable]) + + (define-struct ww-menu-item* + (id [title #:mutable] [icon-url #:mutable] [callback #:mutable] [submenu #:mutable] [separator #:mutable]) #:transparent) - (define-struct ww-menu + (define-struct ww-menu* (id [items #:mutable]) #:transparent ) - (define (is-menu? mnu) - (if (ww-menu? mnu) - (if (list? (ww-menu-items mnu)) + + (define (wv-menu-item-callback mi) + (ww-menu-item*-callback mi)) + + (define (wv-menu-item-id mi) + (ww-menu-item*-id mi)) + + (define (wv-menu-id m) + (ww-menu*-id m)) + + (define (is-wv-menu? mnu) + (if (ww-menu*? mnu) + (if (list? (ww-menu*-items mnu)) (letrec ((f (lambda (m) (if (null? m) #t - (if (ww-menu-item? (car m)) - (if (eq? (ww-menu-item-submenu (car m)) #f) + (if (ww-menu-item*? (car m)) + (if (eq? (ww-menu-item*-submenu (car m)) #f) (f (cdr m)) - (and (is-menu? (ww-menu-item-submenu (car m))) + (and (is-wv-menu? (ww-menu-item*-submenu (car m))) (f (cdr m)))) #f) )) )) - (f (ww-menu-items mnu))) + (f (ww-menu*-items mnu))) #f) #f)) - (define (menu . items) + (define (wv-menu . items) (let ((menu-id #f)) (when (symbol? (car items)) (set! menu-id (car items)) (set! items (cdr items))) (when (list? (car items)) (set! items (car items))) - (make-ww-menu menu-id items))) + (make-ww-menu* menu-id items))) - (define (menu-item id title - #:icon-file [icon-file #f] + (define (wv-menu-item id title + #:icon-url [icon-url #f] #:callback [callback (lambda args #t)] #:submenu [submenu #f] #:separator [separator #f]) @@ -62,47 +74,49 @@ (error "menu-item needs an id of symbol?")) (unless (string? title) (error "menu-item needs a title of string?")) - (unless (or (eq? icon-file #f) (string? icon-file) (path? icon-file)) + (unless (or (eq? icon-url #f) (string? icon-url) (url? icon-url)) (error "menu-item's optional argument icon-file must be #f, string? or path?")) - (unless (or (eq? submenu #f) (is-menu? submenu)) + (unless (or (eq? submenu #f) (is-wv-menu? submenu)) (error "menu-item's optional argument submenu must be #f or is-menu?")) (unless (boolean? separator) (error "menu-item's optional argument separator must be boolean?")) - (make-ww-menu-item id title icon-file callback submenu separator)) + (let ((u (if (url? icon-url) (url->string icon-url) icon-url))) + (make-ww-menu-item* id title u callback submenu separator)) + ) - (define (menu->hash menu . for-json) + (define (wv-menu->hash menu . for-json) (let ((fj (if (null? for-json) #f (car for-json)))) - (unless (is-menu? menu) + (unless (is-wv-menu? menu) (error "menu->hash must be called with a menu")) - (let* ((items (ww-menu-items menu)) + (let* ((items (ww-menu*-items menu)) (r (map (λ (item) (let ((h (make-hasheq))) - (hash-set! h 'id (format "~a" (ww-menu-item-id item))) - (hash-set! h 'name (ww-menu-item-title item)) - (unless (eq? (ww-menu-item-icon-file item) #f) - (hash-set! h 'icon (ww-menu-item-icon-file item))) - (unless (eq? (ww-menu-item-submenu item) #f) - (hash-set! h 'submenu (menu->hash (ww-menu-item-submenu item) fj))) - (unless (eq? (ww-menu-item-separator item) #f) + (hash-set! h 'id (format "~a" (ww-menu-item*-id item))) + (hash-set! h 'name (ww-menu-item*-title item)) + (unless (eq? (ww-menu-item*-icon-url item) #f) + (hash-set! h 'icon (ww-menu-item*-icon-url item))) + (unless (eq? (ww-menu-item*-submenu item) #f) + (hash-set! h 'submenu (wv-menu->hash (ww-menu-item*-submenu item) fj))) + (unless (eq? (ww-menu-item*-separator item) #f) (hash-set! h 'separator #t)) h )) items)) ) (let ((h (make-hasheq))) (hash-set! h 'menu r) - (hash-set! h 'id (if fj (format "~a" (ww-menu-id menu)) (ww-menu-id menu))) + (hash-set! h 'id (if fj (format "~a" (ww-menu*-id menu)) (ww-menu*-id menu))) h)))) - (define (menu-for-each menu cb) - (let ((items (ww-menu-items menu))) + (define (wv-menu-for-each menu cb) + (let ((items (ww-menu*-items menu))) (letrec ((f (λ (items) (if (null? items) #t (let ((item (car items))) - (let ((submenu (ww-menu-item-submenu item))) + (let ((submenu (ww-menu-item*-submenu item))) (if (eq? submenu #f) (cb item) - (menu-for-each submenu cb))) + (wv-menu-for-each submenu cb))) (f (cdr items)) ) ) @@ -110,23 +124,23 @@ )) (f items)))) - (define (menu->json menu) + (define (wv-menu->json menu) (let ((o (open-output-string))) - (write-json (menu->hash menu #t) o) + (write-json (wv-menu->hash menu #t) o) (get-output-string o))) - (define (find-menu-item menu id) - (let ((items (ww-menu-items menu))) + (define (find-wv-menu-item menu id) + (let ((items (ww-menu*-items menu))) (letrec ((f (λ (items) (if (null? items) #f (let ((item (car items))) - (if (eq? (ww-menu-item-id item) id) + (if (eq? (ww-menu-item*-id item) id) item - (let ((submenu (ww-menu-item-submenu item))) + (let ((submenu (ww-menu-item*-submenu item))) (if (eq? submenu #f) (f (cdr items)) - (let ((found-item (find-menu-item submenu id))) + (let ((found-item (find-wv-menu-item submenu id))) (if (eq? found-item #f) (f (cdr items)) found-item)) @@ -136,37 +150,38 @@ )) (f items)))) - (define (with-menu-item menu id cb) - (unless (is-menu? menu) + (define (with-wv-menu-item menu id cb) + (unless (is-wv-menu? menu) (error "menu must be of is-menu?")) (unless (symbol? id) (error "id must be of symbol?")) - (let ((item (find-menu-item menu id))) + (let ((item (find-wv-menu-item menu id))) (if (eq? item #f) (error (format "cannot find id'~a in given menu" id)) (cb item))) menu) - (define (menu-set-title! menu id title) + (define (wv-menu-set-title! menu id title) (unless (string? title) (error "title must be of string?")) - (with-menu-item menu id + (with-wv-menu-item menu id (λ (item) - (set-ww-menu-item-title! item title)))) + (set-ww-menu-item*-title! item title)))) - (define (menu-set-icon! menu id icon) - (unless (or (eq? icon #f) (path? icon) (string? icon)) + (define (wv-menu-set-icon! menu id icon-url) + (unless (or (eq? icon-url #f) (url? icon-url) (string? icon-url)) (error "title must be of #f, string? or path?")) - (with-menu-item menu id + (with-wv-menu-item menu id (λ (item) - (set-ww-menu-item-icon-file! item icon)))) + (let ((u (if (url? icon-url) (url->string icon-url) icon-url))) + (set-ww-menu-item*-icon-url! item u))))) - (define (menu-set-callback! menu id cb) + (define (wv-menu-set-callback! menu id cb) (unless (procedure? cb) (error "callback must be of procedure?")) - (with-menu-item menu id + (with-wv-menu-item menu id (λ (item) - (set-ww-menu-item-callback! item cb)))) + (set-ww-menu-item*-callback! item cb)))) ); end of module diff --git a/private/racket-webview-qt.rkt b/private/racket-webview-qt.rkt index b8a6460..3fa84f7 100644 --- a/private/racket-webview-qt.rkt +++ b/private/racket-webview-qt.rkt @@ -590,7 +590,7 @@ ; ))))) (let ((handle (make-rkt-wv wv evt-queue evt-callback #t close-callback))) (thread (λ () - (sleep 1) + (sleep 0.01) (letrec ((f (λ () (let ((r (rkt-process-events handle))) (if (eq? r 'quit) diff --git a/private/racket-webview-version.rkt b/private/racket-webview-version.rkt index adee044..9ded978 100644 --- a/private/racket-webview-version.rkt +++ b/private/racket-webview-version.rkt @@ -7,5 +7,5 @@ (define webview-major 0) (define webview-minor 1) -(define webview-patch 0) +(define webview-patch 1) diff --git a/private/racket-webview.rkt b/private/racket-webview.rkt index f797406..0e4b7e7 100644 --- a/private/racket-webview.rkt +++ b/private/racket-webview.rkt @@ -5,6 +5,7 @@ "utils.rkt" "mimetypes.rkt" "rgba.rkt" + "menu.rkt" finalizer racket/async-channel web-server/http @@ -73,6 +74,8 @@ webview-set-html! webview-base-url + webview-set-menu! + webview-set-innerHTML! webview-set-value! @@ -105,6 +108,7 @@ webview-standard-file-getter webview-default-boilerplate-js + webview-default-boilerplate-css webview-version webview-info @@ -123,16 +127,38 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define-runtime-path js-path "../js") +(define-runtime-path css-path "../js") (define (webview-default-boilerplate-js . custom-js) - (let ((file (build-path js-path "boilerplate.js"))) - (let ((bjs (file->string file))) + (let ((file (build-path js-path "boilerplate.js")) + (menu-js-file (build-path js-path "menu.js"))) + (let ((bjs (file->string file)) + (mjs (file->string menu-js-file)) + ) (let ((js (string-append bjs + mjs (if (null? custom-js) "" ((car custom-js)))))) js)))) +(define (webview-default-boilerplate-css . custom-css) + (let ((file (build-path css-path "boilerplate.css")) + (menu-css-file (build-path css-path "menu.css"))) + (let ((bcss (file->string file)) + (mcss (file->string menu-css-file)) + ) + (let ((css (string-append bcss + mcss + (if (null? custom-css) + "" + ((car custom-css))) + ) + ) + ) + css)))) + + (define-struct wv-context ([context #:mutable] [port #:mutable] @@ -142,6 +168,7 @@ [request-count #:mutable] [sec-token-cache #:mutable] [cert-ou-token #:mutable] + [boilerplate-css #:mutable] ) #:transparent ) @@ -153,16 +180,16 @@ ) #:transparent) +(define re_head #px"[<][/][Hh][eE][aA][dD][>]") + (define (process-html context path out) (let ((html (file->string path))) - (display html out))) -; (boilerplate-js ((wv-context-boilerplate-js wv-win-handle)))) -; (set! html (string-replace html "" -; (string-append "" "\n" -; "" "\n"))) -; (display html out))) + (let ((html* (regexp-replace re_head html + (string-append "\n" + "")))) + (display html* out)))) (define (process-file context ext path out) (let ((content (file->bytes path))) @@ -414,11 +441,13 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define/contract (webview-new-context file-getter - #:boilerplate-js [bj (webview-default-boilerplate-js)]) - (->* (procedure?) (#:boilerplate-js string?) wv-context?) + #:boilerplate-js [bj (webview-default-boilerplate-js)] + #:boilerplate-css [bc (webview-default-boilerplate-css)]) + (->* (procedure?) (#:boilerplate-js string? #:boilerplate-css string?) wv-context?) (let* ((h (make-wv-context 0 0 file-getter #f #f 0 (make-lru 250 #:cmp eq?) (symbol->string (make-security-token)) + bc )) (cert (generate-self-signed-cert 2048 365 '("127.0.0.1" "localhost") "NL" "Dijkema" @@ -497,6 +526,17 @@ ) ) +(define/contract (webview-set-menu! wv menu) + (-> wv-win? is-wv-menu? symbol?) + (let* ((json (wv-menu->json menu)) + (js (string-append "window._web_wire_menu('" + json + "');")) + ) + (webview-run-js wv js) + ) + ) + (define (loglevel? x) (and (symbol? x) (or (eq? x 'error) (eq? x 'info) (eq? x 'debug) (eq? x 'warning)))) diff --git a/private/wv-context.rkt b/private/wv-context.rkt index 47c4f29..b98d11b 100644 --- a/private/wv-context.rkt +++ b/private/wv-context.rkt @@ -13,7 +13,9 @@ base-path [file-getter (webview-standard-file-getter base-path)] [context-js (λ () "")] + [context-css (λ () "")] [boilerplate-js (webview-default-boilerplate-js context-js)] + [boilerplate-css (webview-default-boilerplate-css context-css)] [ini (error "You need to provide a 'ini' file settings interface for settings, e.g. simple-ini/class")] ) @@ -35,7 +37,8 @@ (begin (set! wv-context (webview-new-context file-getter - #:boilerplate-js boilerplate-js)) + #:boilerplate-js boilerplate-js + #:boilerplate-css boilerplate-css)) (set! settings-obj (new wv-settings% [ini ini] [wv-context 'global])) ) ) diff --git a/private/wv-dialog.rkt b/private/wv-dialog.rkt index fde2f6b..33ce322 100644 --- a/private/wv-dialog.rkt +++ b/private/wv-dialog.rkt @@ -38,9 +38,9 @@ (let ((x (inexact->exact (round (exact->inexact (+ px xx))))) (y (inexact->exact (round (exact->inexact (+ py yy))))) ) - (displayln "move") + (displayln (format "move ~a ~a" x y)) (send this move x y) - (displayln "resize") + (displayln (format "resize ~a ~a" x y)) (send this resize dw dh) ) ) diff --git a/private/wv-window.rkt b/private/wv-window.rkt index 77cf0e9..726b841 100644 --- a/private/wv-window.rkt +++ b/private/wv-window.rkt @@ -145,6 +145,7 @@ (define (event-handler wv evt) (let ((event (hash-ref evt 'event 'unknown-event)) ) + (displayln evt) (cond ((eq? event 'resize) (send this resized (hash-ref evt 'w) (hash-ref evt 'h))) @@ -163,7 +164,7 @@ (let* ((je (hash-copy (hash-ref evt 'js-evt))) (e (make-hash))) (hash-set! e 'evt (string->symbol (hash-ref je 'evt))) - (hash-set! e 'id (string->symbol (hash-ref je 'id #f))) + (hash-set! e 'id (string->symbol (hash-ref je 'id "nil"))) (hash-set! e 'data (hash-ref je 'js_evt (make-hash))) (hash-set! e 'event 'js-evt) (when (eq? (send this js-event e) 'wv-unhandled-js-event) @@ -244,7 +245,6 @@ ) ) ) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Commands @@ -257,6 +257,15 @@ (define/public (remove-class! selector-or-id cl) (webview-remove-class! wv selector-or-id cl) this) + + (define/public (set-menu! menu) + (webview-set-menu! wv menu) + this) + + (define/public (connect-menu! id callback) + (send this bind! (string->symbol (format "~a" id)) 'menu-item-choosen + (λ (el evt data) + (callback)))) (define/public (devtools) (webview-devtools wv) diff --git a/rktwebview_qt/rktutils.cpp b/rktwebview_qt/rktutils.cpp index 4ee17f6..7bf54e1 100644 --- a/rktwebview_qt/rktutils.cpp +++ b/rktwebview_qt/rktutils.cpp @@ -27,3 +27,4 @@ QHash mkEvent() } int EventContainer::evt_count = 0; +qint64 EventContainer::ms_start = -1; diff --git a/rktwebview_qt/rktutils.h b/rktwebview_qt/rktutils.h index 402bf34..b1d06fb 100644 --- a/rktwebview_qt/rktutils.h +++ b/rktwebview_qt/rktutils.h @@ -4,15 +4,24 @@ #include #include #include +#include class EventContainer : public QHash { private: static int evt_count; + static qint64 ms_start; public: EventContainer(const QString &evt) { + if (ms_start < 0) { + ms_start = QDateTime::currentMSecsSinceEpoch(); + } this->insert("event", evt); this->insert("evt-id", ++evt_count); + + qint64 ms = QDateTime::currentMSecsSinceEpoch(); + this->insert("timestamp", ms); + this->insert("elaped", static_cast(ms - ms_start) / 1000.0); } }; diff --git a/rktwebview_qt/rktwebview_qt.cpp b/rktwebview_qt/rktwebview_qt.cpp index 64044ac..211cafc 100644 --- a/rktwebview_qt/rktwebview_qt.cpp +++ b/rktwebview_qt/rktwebview_qt.cpp @@ -59,6 +59,7 @@ void Rktwebview_qt::processCommand(Command *cmd) "window.rkt_evt_frame_el = null;\n" "window.rkt_evt_frame_win = null;\n" "window.rkt_send_event = function(obj) {\n" + " obj.timestamp = Date.now();\n" " //console.log('Sending event: ' + obj);\n" " window.rkt_event_queue.push(obj);\n" " if (window.rkt_evt_frame_el) {\n" diff --git a/scrbl/menu.scrbl b/scrbl/menu.scrbl new file mode 100644 index 0000000..aec90bd --- /dev/null +++ b/scrbl/menu.scrbl @@ -0,0 +1,195 @@ +#lang scribble/manual + +@(require racket/base + scribble/core + (for-label racket/base + racket/string + net/url + json + "../private/menu.rkt")) + +@title{menu} +@author[@author+email["Hans Dijkema" "hans@dijkewijk.nl"]] + +@defmodule[menu] + +Menu data structures used by the webview library. + +This module provides constructors, predicates, traversal helpers, mutation +operations, and JSON conversion for menu trees. + +@section{Overview} + +A menu is represented as a tree. A menu consists of menu items, and a menu item +may optionally contain a submenu. + +Menu identifiers are symbols. Menu item titles are strings. Icons are stored as +strings and may be supplied either as @racket[#f], strings, or URL values. + +The module does not display menus itself. It provides the menu data structure +used by higher layers. + +@section{Internal Representation} + +Internally, menus are represented by transparent structure values. These +structure constructors and predicates are not exported directly. The public API +uses constructor procedures and helper functions operating on those internal +values. + +@section{Predicates} + +@defproc[(is-wv-menu? [mnu any/c]) boolean?]{ + +Returns @racket[#t] if @racket[mnu] is a valid menu tree and @racket[#f] +otherwise. + +A value is recognized as a menu if it is an internal menu structure whose item +list is a list of internal menu items, and every submenu recursively also +satisfies @racket[is-wv-menu?]. +} + +@section{Constructors} + +@defproc[(wv-menu [item-or-id any/c] ...) + any/c]{ + +Creates a menu. + +If the first argument is a symbol, it is used as the menu identifier and removed +from the remaining arguments. Otherwise the menu identifier is @racket[#f]. + +If the first remaining argument is itself a list, that list is used as the item +list. Otherwise all remaining arguments are treated as menu items. + +This means the following forms are accepted: + +@racketblock[ +(wv-menu item ...) +(wv-menu 'some-id item ...) +(wv-menu (list item ...)) +(wv-menu 'some-id (list item ...)) +] + +The result is a value satisfying @racket[is-wv-menu?]. +} + +@defproc[(wv-menu-item [id symbol?] + [title string?] + [#:icon-url icon-url (or/c boolean? string? url?) #f] + [#:callback callback procedure? (λ args #t)] + [#:submenu submenu (or/c boolean? any/c) #f] + [#:separator separator boolean? #f]) + any/c]{ + +Creates a menu item. + +@racket[id] must be a symbol and @racket[title] must be a string. + +@racket[icon-url] must be @racket[#f], a string, or a URL value. If it is a URL +value, it is converted to a string using @racket[url->string] before being +stored. + +@racket[submenu] must be @racket[#f] or a value satisfying +@racket[is-wv-menu?]. + +@racket[separator] must be a boolean. + +If any argument does not satisfy these conditions, an exception is raised. +} + +@section{Traversal and Lookup} + +@defproc[(wv-menu-for-each [menu any/c] [cb procedure?]) boolean?]{ + +Traverses @racket[menu] depth-first and calls @racket[cb] for each menu item. + +If a menu item contains a submenu, that submenu is traversed recursively. + +The callback is invoked only for menu items that are reached by the traversal. +The function returns @racket[#t]. +} + +@defproc[(with-wv-menu-item [menu any/c] [id symbol?] [cb procedure?]) any/c]{ + +Finds the menu item identified by @racket[id] and applies @racket[cb] to it. + +If @racket[menu] does not satisfy @racket[is-wv-menu?], an exception is raised. +If @racket[id] is not a symbol, an exception is raised. +If no item with the given id can be found, an exception is raised. + +After the callback has been applied, the original @racket[menu] value is +returned. +} + +@section{Mutation} + +@defproc[(wv-menu-set-title! [menu any/c] [id symbol?] [title string?]) + any/c]{ + +Sets the title of the menu item identified by @racket[id]. + +@racket[title] must be a string. The function returns the original +@racket[menu] value. +} + +@defproc[(wv-menu-set-icon! [menu any/c] [id symbol?] + [icon-url (or/c boolean? string? url?)]) + any/c]{ + +Sets the icon URL of the menu item identified by @racket[id]. + +@racket[icon-url] must be @racket[#f], a string, or a URL value. If it is a URL +value, it is converted to a string using @racket[url->string] before being +stored. + +The function returns the original @racket[menu] value. +} + +@defproc[(wv-menu-set-callback! [menu any/c] [id symbol?] [cb procedure?]) + any/c]{ + +Sets the callback of the menu item identified by @racket[id]. + +@racket[cb] must be a procedure. The function returns the original +@racket[menu] value. +} + +@section{Conversion} + +@defproc[(wv-menu->json [menu any/c]) string?]{ + +Converts @racket[menu] to a JSON string. + +The conversion first builds a hash-based representation of the menu and then +writes that representation with @racket[write-json]. + +In the JSON representation: + +@itemlist[#:style 'compact + @item{the top-level object contains the keys @racket['menu] and @racket['id]} + @item{menu item identifiers are converted to strings} + @item{menu item titles are written under the key @racket['name]} + @item{an icon is written only if it is not @racket[#f]} + @item{a submenu is written recursively only if it is not @racket[#f]} + @item{a separator flag is written only if it is not @racket[#f]}] + +The @racket['id] field of the top-level menu is also converted to a string in +the JSON output. +} + +@section{Accessors} + +@defproc[(wv-menu-id [m any/c]) any/c]{ + +Returns the identifier of @racket[m]. +} + +@defproc[(wv-menu-item-id [mi any/c]) symbol?]{ + +Returns the identifier of the menu item @racket[mi]. +} + +@defproc[(wv-menu-item-callback [mi any/c]) procedure?]{ + +Returns the callback associated with the menu item @racket[mi]. +} \ No newline at end of file diff --git a/scrbl/mimetypes.scrbl b/scrbl/mimetypes.scrbl new file mode 100644 index 0000000..9f19776 --- /dev/null +++ b/scrbl/mimetypes.scrbl @@ -0,0 +1,60 @@ +#lang scribble/manual + +@(require racket/base + scribble/core + (for-label racket/base + racket/string + racket/file)) + +@title{mimetypes} +@author[@author+email["Hans Dijkema" "hans@dijkewijk.nl"]] + +@defmodule[mimetypes] + +MIME type utilities used by the webview library. + +This module provides a mapping from file extensions to MIME types together with +a function to determine the MIME type of a file path. + +@section{Overview} + +The module is used by the local HTTPS server to determine the correct +@tt{Content-Type} header when serving files. + +MIME types are determined based on the file extension. + +@section{Function: path->mimetype} + +@defproc[(path->mimetype [p path-string?]) string?]{ + +Returns the MIME type associated with @racket[p]. + +The file extension of @racket[p] is extracted and used to look up the +corresponding MIME type. + +If the extension is not recognized, a default MIME type is returned. +} + +@section{Mapping} + +The module contains a predefined mapping from file extensions to MIME types. + +Typical mappings include: + +@itemlist[#:style 'compact + @item{@tt{.html} → @tt{text/html}} + @item{@tt{.css} → @tt{text/css}} + @item{@tt{.js} → @tt{application/javascript}} + @item{@tt{.json} → @tt{application/json}} + @item{@tt{.png} → @tt{image/png}} + @item{@tt{.jpg}, @tt{.jpeg} → @tt{image/jpeg}} + @item{@tt{.svg} → @tt{image/svg+xml}}] + +The exact mapping is defined in the source code and can be extended if needed. + +@section{Notes} + +The returned MIME type is always a string suitable for use in HTTP response +headers. + +File extensions are interpreted case-insensitively. diff --git a/scrbl/racket-webview-intro.scrbl b/scrbl/racket-webview-intro.scrbl new file mode 100644 index 0000000..f1235e2 --- /dev/null +++ b/scrbl/racket-webview-intro.scrbl @@ -0,0 +1,64 @@ +#lang scribble/manual + +@(require racket/base + scribble/core + scribble/manual + (for-label racket/base + racket/class + racket/string + racket/file + net/url + "../private/wv-context.rkt" + "../private/wv-window.rkt" + "../private/wv-element.rkt" + "../private/wv-input.rkt" + "../private/wv-dialog.rkt" + "../private/wv-settings.rkt" + "../private/rgba.rkt" + "../private/mimetypes.rkt")) + +@title{Racket Webview} +@author[@author+email["Hans Dijkema" "hans@dijkewijk.nl"]] + +@section{Overview} + +Racket Webview is a class-oriented webview library built on top of a Qt-based +native runtime. + +The library is layered. At the lowest level a native FFI layer is used. On top +of that, @racketmodname[racket-webview] provides a functional API. The +class-oriented API described in this manual is built from smaller modules on top +of that layer. + +@section{Core Concepts} + +The library is structured around two main concepts: + +@itemlist[#:style 'compact + @item{a context, representing an isolated runtime with its own local HTTPS server} + @item{a window, representing a webview instance within such a context}] + +A context manages local file serving, certificates, and settings. A window loads +content, handles events, and provides access to DOM elements. + +@section{Modules} + +The public API is divided into the following modules: + +@itemlist[#:style 'compact + @item{@racketmodname[wv-context] — context creation and settings access} + @item{@racketmodname[wv-window] — window lifecycle, events, navigation, and dialogs} + @item{@racketmodname[wv-element] — DOM element wrapper} + @item{@racketmodname[wv-input] — typed input-element wrappers} + @item{@racketmodname[wv-dialog] — dialog windows} + @item{@racketmodname[wv-settings] — settings wrapper} + @item{@racketmodname[rgba] — RGBA color values} + @item{@racketmodname[mimetypes] — MIME type lookup}] + +@section{Typical Usage} + +A typical application creates a @racket[wv-context%] object and then creates one +or more @racket[wv-window%] objects within that context. DOM elements are +retrieved using @racket[(send window element 'id)], after which their state can +be read or modified using the element and input wrapper classes. Interaction +with the browser is handled through event callbacks and bindings. \ No newline at end of file diff --git a/scrbl/racket-webview.scrbl b/scrbl/racket-webview.scrbl index 1c9606d..6818aa2 100644 --- a/scrbl/racket-webview.scrbl +++ b/scrbl/racket-webview.scrbl @@ -27,25 +27,38 @@ The module builds on the lower-level bindings from A context encapsulates a native webview context together with a local HTTPS server. Windows are created within a context and communicate through events and -JavaScript calls. +JavaScript calls. When an HTML file is +served, the context's CSS boilerplate is injected immediately before the +closing @tt{} tag. @section{Contexts} + @defproc[(webview-new-context [file-getter procedure?] [#:boilerplate-js boilerplate-js string? - (webview-default-boilerplate-js)]) + (webview-default-boilerplate-js)] + [#:boilerplate-css boilerplate-css string? + (webview-default-boilerplate-css)]) wv-context?]{ Creates a new context. +The function: + @itemlist[#:style 'compact @item{starts a local HTTPS server on a dynamically chosen port} @item{generates a self-signed certificate} @item{creates a native context} - @item{installs the provided JavaScript boilerplate}] + @item{installs the provided JavaScript boilerplate in the native context} + @item{stores the provided CSS boilerplate in the context}] -The @racket[file-getter] procedure maps request paths to files. +The @racket[file-getter] procedure maps request paths to files. The +@racket[#:boilerplate-js] argument provides JavaScript support code passed to +the native context constructor. The javascript is injected by the native +QtWebEngine software. The @racket[#:boilerplate-css] argument provides +CSS boilerplate that is stored in the context and injected into served HTML +documents. Certificate files are removed automatically when the context is garbage collected. @@ -58,6 +71,7 @@ Returns the base URL of the context. This URL can be used to construct URLs from relative path information. } + @defproc[(wv-context? [v any/c]) boolean?]{ Recognizes context values. } @@ -147,6 +161,17 @@ Replaces the current document contents. X-expressions are converted to strings before being passed to JavaScript. } +@defproc[(webview-set-menu! [wv wv-win?] [menu is-wv-menu?]) + symbol?]{ + +Installs @racket[menu] in @racket[wv]. + +The menu is converted to JSON using @racket[wv-menu->json] and then passed to +the browser by evaluating JavaScript through @racket[webview-run-js]. + +The result is the symbol returned by @racket[webview-run-js]. +} + @defproc[(webview-set-title! [wv wv-win?] [title string?]) symbol?]{ Sets the window title. } @@ -525,9 +550,23 @@ Recognizes lists of filter entries. @section{Utilities} -@defproc[(webview-default-boilerplate-js [f procedure?] ...) +@defproc[(webview-default-boilerplate-js [custom-js procedure?] ...) string?]{ + Returns the default JavaScript boilerplate. + +The result is constructed by concatenating the contents of @tt{js/*.js}. +If an additional procedure is supplied, its returned string is appended +to that JavaScript. +} + +@defproc[(webview-default-boilerplate-css [custom-css procedure?] ...) + string?]{ + +Returns the default CSS boilerplate. + +The result is constructed by concatenating the contents of @tt{js/*.css}. +If an additional procedure is supplied, its returned string is appended to that CSS. } @defproc[(webview-standard-file-getter diff --git a/scrbl/rgba.scrbl b/scrbl/rgba.scrbl new file mode 100644 index 0000000..995629f --- /dev/null +++ b/scrbl/rgba.scrbl @@ -0,0 +1,96 @@ +#lang scribble/manual + +@(require racket/base + scribble/core + (for-label racket/base + racket/string + racket/contract)) + +@title{rgba} +@author[@author+email["Hans Dijkema" "hans@dijkewijk.nl"]] + +@defmodule[rgba] + +RGBA color support used by the webview library. + +This module exports a transparent @racket[rgba] structure together with +predicates and conversion procedures for working with CSS-style color values. + +@section{Overview} + +An @racket[rgba] value represents a color using red, green, blue, and alpha +components. + +The module provides: + +@itemlist[#:style 'compact + @item{the @racket[rgba] structure type} + @item{predicates for validating component values} + @item{conversion from strings to @racket[rgba] values} + @item{conversion from @racket[rgba] values to CSS color strings}] + +The intended external representation is the CSS form: + +@racketblock[ +"rgba(r,g,b,a)" +] + +@section{Predicates} + +@defproc[(rgba/color? [v any/c]) boolean?]{ + +Recognizes valid red, green, and blue component values. + +A valid color component is an exact integer in the range from @racket[0] to +@racket[255], inclusive. +} + +@defproc[(rgba/alpha? [v any/c]) boolean?]{ + +Recognizes valid alpha component values. + +A valid alpha component is a real number in the range from @racket[0] to +@racket[1], inclusive. +} + +@section{Structure Type} + +@defstruct*[rgba ([r rgba/color?] + [g rgba/color?] + [b rgba/color?] + [a rgba/alpha?])]{ + +Represents one RGBA color value. + +The fields @racket[r], @racket[g], and @racket[b] are the red, green, and blue +components. The field @racket[a] is the alpha component. + +The structure is transparent. +} + +@section{Conversion} + +@defproc[(rgba->string [c rgba?]) string?]{ + +Converts @racket[c] to a CSS color string. + +The result has the form: + +@racketblock[ +"rgba(r,g,b,a)" +] +} + +@defproc[(string->rgba [s string?]) (or/c rgba? #f)]{ + +Attempts to parse @racket[s] as a CSS RGBA color string. + +If parsing succeeds, the result is an @racket[rgba] value. If parsing fails, the +result is @racket[#f]. + +The accepted input format is the one produced by @racket[rgba->string], namely: + +@racketblock[ +"rgba(r,g,b,a)" +] +} \ No newline at end of file diff --git a/scrbl/wv-context.scrbl b/scrbl/wv-context.scrbl index c07e516..87d6083 100644 --- a/scrbl/wv-context.scrbl +++ b/scrbl/wv-context.scrbl @@ -24,6 +24,10 @@ windows. It owns the underlying webview context, provides the base URL used by those windows, and gives access to persistent settings through @racketmodname[wv-settings]. +A context stores both JavaScript and CSS boilerplate. The JavaScript boilerplate +is passed to the native runtime, while the CSS boilerplate is injected into HTML +documents served by the local HTTPS server. + This module exports the @racket[wv-context%] class. @defclass[wv-context% object% ()]{ @@ -40,10 +44,17 @@ to access that value, its base URL, and a settings object. (webview-standard-file-getter base-path)] [context-js procedure? (λ () "")] + [context-css procedure? + (λ () "")] [boilerplate-js string? (webview-default-boilerplate-js context-js)] + [boilerplate-css string? + (webview-default-boilerplate-css context-css)] [ini any/c - (error "You need to provide a 'ini' file settings interface for settings, e.g. simple-ini/class")])]{ + (error + (string-append "You need to provide a 'ini' " + "file settings interface for " + "settings, e.g. simple-ini/class"))])]{ Creates a new context object. @@ -56,9 +67,14 @@ The constructor accepts the following initialization fields. @racket[(webview-standard-file-getter base-path)].} @item{@racket[context-js] is a procedure producing additional JavaScript for the context. Its default value is @racket[(λ () "")].} + @item{@racket[context-css] is a procedure producing additional CSS for the + context. Its default value is @racket[(λ () "")].} @item{@racket[boilerplate-js] is the JavaScript boilerplate installed into the underlying webview context. Its default value is @racket[(webview-default-boilerplate-js context-js)].} + @item{@racket[boilerplate-css] is the CSS boilerplate stored in the context + and injected into HTML documents. Its default value is + @racket[(webview-default-boilerplate-css context-css)].} @item{@racket[ini] is the settings backend used to construct the associated @racket[wv-settings%] object. No default backend is provided; omitting it raises an error.}] diff --git a/scrbl/wv-dialog.scrbl b/scrbl/wv-dialog.scrbl new file mode 100644 index 0000000..d83418d --- /dev/null +++ b/scrbl/wv-dialog.scrbl @@ -0,0 +1,83 @@ +#lang scribble/manual + +@(require racket/base + racket/class + scribble/core + (for-label racket/base + racket/class + "../private/wv-window.rkt")) + +@title{wv-dialog} +@author[@author+email["Hans Dijkema" "hans@dijkewijk.nl"]] + +@defmodule[wv-dialog] + +Dialog-window wrapper built on top of @racket[wv-window%]. + +This module exports the @racket[wv-dialog%] class. It is a specialized window +class whose initial size and position are derived from its parent window. + +@section{Overview} + +A @racket[wv-dialog%] object is a @racket[wv-window%] that initializes itself as +a dialog relative to its parent window. + +The class inherits the window lifecycle, event handling, navigation, and dialog +support from @racket[wv-window%]. Its only specialization in the current source +is the implementation of @racket[init-size]. + +@section{Class: wv-dialog%} + +@defclass[wv-dialog% wv-window% ()]{ + +Represents a dialog window centered relative to its parent window. + +The class inherits the fields @racket[parent], @racket[settings], +@racket[wv-context], @racket[html-path], @racket[x], @racket[y], +@racket[width], and @racket[height] from @racket[wv-window%]. + +@defconstructor[()]{ + +Creates a dialog window. + +The constructor does not define additional initialization arguments of its own. +Construction is delegated to @racket[wv-window%] through @racket[super-new]. +} + +@defmethod[(init-size) any/c]{ + +Initializes the dialog size and position relative to its parent window. + +The method reads the parent window geometry from the inherited @racket[parent] +field: + +@itemlist[#:style 'compact + @item{@racket[x] and @racket[y] of the parent window} + @item{@racket[width] and @racket[height] of the parent window}] + +It then determines the dialog width and height from @racket[settings], using the +keys @racket['width] and @racket['height]. If a stored value is absent, the +constructor fields @racket[width] and @racket[height] are used if present. +Otherwise both dimensions default to @racket[400]. + +The dialog position is then computed so that the dialog is centered within the +parent window: + +@racketblock[ +(let ((xx (/ (- pw dw) 2)) + (yy (/ (- ph dh) 2))) + ...) +] + +The resulting coordinates are rounded, converted to exact integers, and applied +using: + +@racketblock[ +(send this move x y) +(send this resize dw dh) +] + +This method overrides the inherited @racket[init-size] implementation from +@racket[wv-window%]. +} +} \ No newline at end of file diff --git a/scrbl/wv-window.scrbl b/scrbl/wv-window.scrbl index 68f81eb..325e48b 100644 --- a/scrbl/wv-window.scrbl +++ b/scrbl/wv-window.scrbl @@ -83,7 +83,7 @@ If a parent is supplied, the underlying lower-level parent window is passed to @racket[webview-create]. } -@defmethod[(context) any/c]{ +@defmethod[(context) (is-a?/c wv-context%)]{ Returns the window context object supplied at construction. } @@ -268,6 +268,37 @@ internal cache. The returned value is the list produced by @racket[webview-unbind!]. } + @defmethod[(set-menu! [menu is-wv-menu?]) + (is-a?/c wv-window%)]{ + +Installs @racket[menu] in this window and returns this window. + +The accepted argument follows the contract of @racket[webview-set-menu!]. The +method delegates to: + +@racketblock[ +(webview-set-menu! wv menu) +] +} + +@defmethod[(connect-menu! [id symbol?] [callback procedure?]) + (is-a?/c wv-window%)]{ + +Connects @racket[callback] to the menu item identified by @racket[id]. + +The method installs a binding for the @racket['menu-item-choosen] event by +delegating to: + +@racketblock[ +(send this bind! id 'menu-item-choosen + (λ (el evt data) + (callback))) +] + +The callback is invoked without arguments when the corresponding menu item is +chosen. +} + @defmethod[(set-title! [title string?]) any/c]{ Sets the window title.