From 65503f2ce13d5d084bf36093ded2f2e8e7d01c1d Mon Sep 17 00:00:00 2001 From: ycf-anon Date: Tue, 21 Jul 2026 00:45:30 +0000 Subject: [PATCH] feat: add mawaqit plugin (#53) * feat: add mawaqit plugin * Address review feedback * Address validator errors --- mawaqit/OFL.txt | 93 ++++++++ mawaqit/README.md | 119 ++++++++++ mawaqit/ReemKufi.ttf | Bin 0 -> 127152 bytes mawaqit/bar_widget.luau | 289 +++++++++++++++++++++++++ mawaqit/panel.luau | 319 +++++++++++++++++++++++++++ mawaqit/plugin.toml | 247 +++++++++++++++++++++ mawaqit/service.luau | 408 +++++++++++++++++++++++++++++++++++ mawaqit/thumbnail.webp | Bin 0 -> 52022 bytes mawaqit/translations/en.json | 135 ++++++++++++ 9 files changed, 1610 insertions(+) create mode 100644 mawaqit/OFL.txt create mode 100644 mawaqit/README.md create mode 100644 mawaqit/ReemKufi.ttf create mode 100644 mawaqit/bar_widget.luau create mode 100644 mawaqit/panel.luau create mode 100644 mawaqit/plugin.toml create mode 100644 mawaqit/service.luau create mode 100644 mawaqit/thumbnail.webp create mode 100644 mawaqit/translations/en.json diff --git a/mawaqit/OFL.txt b/mawaqit/OFL.txt new file mode 100644 index 0000000..55f55c9 --- /dev/null +++ b/mawaqit/OFL.txt @@ -0,0 +1,93 @@ +Copyright 2015-2022 The Reem Kufi Project Authors (https://github.com/aliftype/reem-kufi), with Reserved Font Name "Josefin Sans". + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. \ No newline at end of file diff --git a/mawaqit/README.md b/mawaqit/README.md new file mode 100644 index 0000000..704fc13 --- /dev/null +++ b/mawaqit/README.md @@ -0,0 +1,119 @@ +# Mawaqit + +Prayer times for Noctalia, with a bar widget and panel: live countdown to the next +prayer, notifications, optional azan playback, Hijri date, and per-prayer time +offsets. + +## Plugin + +| Field | Value | +| ------- | ------------------------------------------------------------ | +| ID | `ycf/mawaqit` | +| Entries | Bar widget: `bar`; panel: `panel`; service: `fetcher` | + +## Requirements + +Install `paplay` (PipeWire/PulseAudio) **or** `pw-cat` on `PATH` — only one is +required, used for azan playback. If neither is installed, azan is skipped (a +line is logged) and everything else — countdown, panel, notifications — works +normally. + +Also requires `pkill` (part of `procps`, present on virtually every distro by +default) — used to stop azan playback, since neither player exposes its own +stop control. + +Azan audio is **not bundled**. To enable it: + +1. Get your own azan `.mp3` file(s) from wherever you like. +2. Copy them into this plugin's `assets/` folder, named exactly `azan1.mp3`, + `azan2.mp3`, and/or `azan3.mp3` (only the ones you want to use — you don't + need all three). +3. In Settings → Plugins → Mawaqit, turn on **Play Azan** and pick which of + the three slots to play from **Azan audio**. + +If the selected file isn't present, azan is silently skipped and a line is +logged — nothing else is affected. + +## Usage + +- **Left click** the bar widget → open the prayer times panel. +- **Right click** the bar widget → cycle its display mode: live countdown → + static time → prayer name only. + +Toggle the panel directly: + +```sh +noctalia msg panel-toggle ycf/mawaqit:panel +``` + +The panel shows all five daily prayers plus Sunrise and, during Ramadan, Imsak, +with a live countdown banner to whichever is next, the Gregorian and Hijri +date, and a refresh button. If azan is playing, a stop button appears next to +it. + +## Settings + +Plugin-level (Settings → Plugins → Mawaqit): + +| Setting | Type | Default | Description | +| -------------------- | -------- | ------- | -------------------------------------------------------------------------- | +| `city` | `string` | `London` | Your city name in English. | +| `country` | `string` | `UK` | Country name or 2-letter code. | +| `method` | `select` | `3` (MWL) | Calculation authority followed in your region. | +| `school` | `select` | `0` (Shafi/Maliki/Hanbali) | Asr convention — Hanafi uses a later shadow factor. | +| `hijriDayOffset` | `select` | `0` | Shift the displayed Hijri day by −1/0/+1 if it doesn't match local moon sighting. | +| `twelveHourFormat` | `bool` | `false` | Show prayer times as 12-hour (e.g. `5:23 AM`) instead of 24-hour. | +| `showNotifications` | `bool` | `true` | Show a system notification when each prayer time begins. | +| `playAzan` | `bool` | `false` | Play an azan audio file when each prayer time begins. | +| `azanFile` | `select` | `azan1.mp3` | Which bundled azan track to play (see Requirements for setup). | +| `tune` | `bool` | `false` | Enable the per-prayer minute offsets below. | +| `tuneFajr` | `int` | `0` | Fajr offset, in minutes (−60 to 60). | +| `tuneDhuhr` | `int` | `0` | Dhuhr offset, in minutes. | +| `tuneAsr` | `int` | `0` | Asr offset, in minutes. | +| `tuneMaghrib` | `int` | `0` | Maghrib offset, in minutes. | +| `tuneIsha` | `int` | `0` | Isha offset, in minutes. | + +Bar widget settings (from the widget's own settings menu): + +| Setting | Type | Default | Description | +| ------------------- | -------- | ------------------- | ------------------------------------------------------------------ | +| `showCountdown` | `bool` | `true` | Show a live countdown to the next prayer instead of the static time. | +| `showElapsed` | `bool` | `false` | After a prayer begins, count up (`+`) for up to 1 hour. | +| `hidePrayerName` | `bool` | `false` | Show only the time or countdown, without the prayer name. | +| `widgetIcon` | `glyph` | `building-mosque` | Bar icon. | +| `dynamicIcon` | `bool` | `false` | Show a sun/moon icon matching the current prayer instead of the fixed icon. | +| `textColor` | `color` | `on_surface` | Bar text color. | +| `iconColor` | `color` | `on_surface` | Bar icon color. | +| `activeColor` | `color` | `primary` | Color used when a prayer is happening now or during elapsed mode. | + +## IPC + +Force an immediate refetch (both the service and the bar widget respond): + +```sh +noctalia msg plugin ycf/mawaqit:fetcher all refresh +``` + +Set the bar widget's display mode directly: + +```sh +noctalia msg plugin ycf/mawaqit:bar all mode countdown|static|name +``` + +## Notes + +- The background service fetches prayer times once daily from + `api.aladhan.com`, sending the configured city/country/method/school as + query parameters, plus a second request for the next day's Fajr time (used + for the countdown after Isha). +- Azan playback runs `paplay` or `pw-cat` against a file **you supply** (see + Requirements) — no audio is bundled with this plugin. Playback is stopped + by matching the exact file path being played (via `pkill -f`), not a + generic pattern — this is the only termination method available since the + plugin API doesn't currently expose a PID or stop handle for spawned + processes. Stopping happens when the plugin exits or is disabled, or + manually from the panel while azan is playing. +- The Arabic Hijri date and prayer-time banner are rendered with the bundled + Reem Kufi font (`ReemKufi.ttf`), licensed under the SIL Open Font License — + see `OFL.txt`. +- No compositor-specific behavior — works anywhere Noctalia's bar and panels do. diff --git a/mawaqit/ReemKufi.ttf b/mawaqit/ReemKufi.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ad1a769f41ed4a2b87e3afe4289c9115acb9cc97 GIT binary patch literal 127152 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

ul@o)@Q8m+pyYb*u>aW*i5mxX)AB5VQXk>WgBKY z-;T*n+)mrh+|J(4$1c(?&92#Qq1^*}IeUG32YXNZF#9C?T>B>b>Gl^LcpP*bd>v99 zN*!i99CtYH=;1iqal4bIQ=8Kbr$5db&Zf@p&XLYV&U>6sIRABVbm?=s@2cvW>RRYp z>$=$WwVRBayIX_Y{1p8({S5sq{T%%~{Q~`B{WARu z{VM$${W|?7`pxuP=(p1Ex<9KwufM3jg};NpkAH-Jk$;c>LjNuP$Nlg6Kl6X@|094m zKr}!$Ks7)&z%;-vz&#)!ATl5=peJBa!1{na0Ve`(2Rsh=7AO#C7HAjf6<8fOJ8((h zn!p`_M*=Sd-U)mX_#ucTNF+!j$Rx-mC?F^$C?}{Qs3E8)XhzVQpe;cMg3bip2znFr zC72^vAXp|?CD<5z|K(-!H~ibcC=kW)|35@0 z^E4(k2GG16JJStDenu_0_%XQnU53ewrZ91qLa4Yp6Ih%9q>qn@6(s*Zk!b-lOrJW_ zHHPOk@!m$H;&=)caefr%R~zZ^q;FT-BO!*KbT81lOq3K?}_^33O;^6X5v z7&;gYVd5-OP;qspTMWI7u3&d}F|Gs2gWV0&hj2HlegzEu*BL|@w}AA6{bh(Dzn3wY z(HAa114Di%LoJg7OrCiOT>d&kJ);E!JJWSWAw~d4ro#`q=JEILq9OQ1M&v0>Y zc!R`2?qQw-7r)N1ktB49uX^%v{BEm4TZ< zh(U~jfl*OZQPfyeSyWL}QJ9U5ol%*Q*;rJO@g8H}zuSNRG8+F&;b&rJ`nRZ(@$!fN z{~j`3O}(6YIh84%OM>a|QKqZ^^nyWdxftewlfq}`4 z=_-RTgA8aKjnPO?) z!}V`pvNUnFh{>}K(s5BqXSx~{YaMF9Y{6t0Ze#9eD9&{C-!VrWGo!2jj+vNi=!slq zU}UiR|DCCp=`Mo;1A{6ble!+Wsfitvv5}ZKyPBG^5*wSSh?tnMk(oJDt)P9VQD|Gd zk!eD+pHq&imTahrOR=kciJwKNv^lrD7$c)qYO_~RXR3vYc#?>UN0pCnm79{-|Njs> zn7bL&7(ne=P;Rwjl!uG2fs5Z^*v%*b7MB3K38wxb!!>a1g5An|7_R;n!*)hBu=?*z zwagW8@oS6<4F4IJz#+Pu=_&&cg9HPEv7oULG$_@Ljm*qUP4t+QmD5k=OpDXDOl|UL zDe$jy*Y%1qsAan9nA_qM*c@Y+YEu&IlI*DP|3Abm=GhEt3@YGQyTg#o$o~I7XmpP0 zFw<3#I0pj*8`G6{AfE{`Ffi?Ay2=Dm&Bk=)nLGm{*o**hdSVa;r6nj%XT1Hdm(ly* zR>sDE;!IalFQ#5ih1wXv+`*&<9`OW)8Y80&Tzn^7{4PT)qXt}jC0zUtLmi_iT>JoB z{1!tMqcT)Hi-iX&4l0wH7)?Owk+Ftx0Z9ITB2xe}OdqIBdI&B{VfrN)7?=WBgpl-C zGa7=*3kmRcv^%&Thb~0o!fl>h|KLjvO zhs$4QC}h+Ina{|=s14K4TnUv2l}S~M`f%}5xcD`O#|(c!;voNk;{-H<%+7R;;o;vf zkT}R6%zbe6*BKTwD#67;WdcO~UWN?}x8dRo;pz`Dq%yL=#e?AD4;ZF`Rw*!~|5sxw zMY8u1qaQdmL;SZ9s-BH$SE?%mBZJ=mzf2F9?t)SoBP_itsi~`qvzmi5BB%%eXH0f= zJ0`}8z}9$U%amsChLv(m{^EbXC`x7rIORLL6+5f=I*XggMI`} z-DNn#C1OMnPpkML}gjV?jkhrq!AMdNVQ@iH%cZ})kzmtsS43LtB*^lWe z12Y3ZBn(xN^rbUB|0~Hf8K&9Z?+LPYXv$g5yqQ6b!3FHkTMU~S#USorI1e_JLD*PO zIXxo-WHTsa(is>St-)o3J6OjJ248U5z{J47Xvz#K8zAC$|6c%=4WM~nMh9?ShKS$# ze-u;({6EXUz$gaJV<2&LrtAOrK=K%aKRAyuGB7aeg7X+io}KCH|D)hMmdL=saE%$1 z#~|X@81%q-EdGBY!xeB^hl%Te@)&p=|2#O4LBy~Be+SNEz6=Zuzrgh_M11f6-=IA9 z{~rSbqaiaWk3qx_{oer2W1!?J!VJn|5b+29A26CRFfs7{S7Z1Mt~Ojlk?%)nSqoq7FV z?f?J(|7KudbY=$SO^`ioOuIIK@+R~DEJhxts|;KW462~2+0@L;RM41_$ECv8Eh@7; zvd)<~jU^(E$@~9*29Vl1aEOP3W9SwGGovyjPMIb!U1i{9U=U_EXEbJHRAyusRu(kA z$jrwm*YWQPqgCs_f0m3{S&Z9NL>Tq{9s8Hc7-|0R9@AA&O8Kt_(#@pC0GeH6XFA2O z>;EUHsn$$aL32aG#)68Xis>1QIsbH+uKt|>&Pkvg4oNSOVAtGW@B*h7usFE(f{42@ zhC|Ax|7uLu;CO_HL+oJ!jY)yT8JIycfQ;g->JZx)+eQDii$;R&WV{kw6~tHrvKUEIfMQf*z> z{$65Z68tL!4yWf#51Ff()EMF+{$=!F1kEOaO#_!45b-+3}LwJGR1C}k%={uO&8gj1pgx2#K6R0_5TO6 zJkwnUVFqOe24Qf!4%z}z(ql4*H0x|LOWyN^#>nq`h#g_mcUn|ryZ zSGg-=mUmmawRL)%w{KgTrDaOHuUD0aN0qmCwTEXl$X8&ym>U_?z;n9nOg9)~!L1L7 z_(r(+U51B@p!O6*d?#G|7Q;1giUfUdD~!o({zROced<;8w{o zCQy$AEYCavE`OcjETamzRg%D{0yCev2r3V1m0Sgtz>v6Leh3v;XS&L8l~IF%o#_F? zN5-RYeRtvV*BI>?zCz^>g5?vzaS01wu)o3LKbYm2+oAeE{`}7<4Hw@57vIas!*B&I zt_v4G%6N$35L_G??FntJl?CwCwUuP7>;vR%Ns=HP}-Gz|f#c+VZ z4(`4lxcm)aVmQd~7cTA%7YBv6J~(fvfx}ai!HR)_RY{Kt z(vSh=4>mS-J|rprboQFSGlWO1&3uyyB{nYc@+f7DH`f2$bhRIb0ZCV0XY$gG>85z|X842WMrZ0b2I59>3ZHGAxYmR1G``6iq zY2UvFn2WGvY;gE}V3ucYWKv^jfR>~&NckETU+hdM@x+2iCtz_%I%X1NU}A9m|AToW z(_IER(0UL?HDx7GP|Goa!&(_04PxTz(9RL4v(5NcM$RnWLsQc;(OgzWPFK&TJ=Mx8 zwcSU;Kunu)@4xkon*Xjd#{V;A%4gH^Otb)nAX@^DWm=mr$aCy$tV!3BucbiRX-vA{ z9-$-y1Gt9`?pcHS)^<#g9-$zkZbgTbWvp{{#wAU2d0t+56ZL$is}(ugA+DPL{xDtr zH&t3oPe?>pUGm>AXxooTmkBiYBn3884ANZ}RTeY`_0%B+tg;}Zqj#o-gjuw6UQSMm zk*&0htwAc2ziFx$$lN-n3yuG#YS_suTC0Lg1;zUhW_zZ);CR+8RUf7Li*9hwZ&(lCp1Pf$?~O?RL)2Wl1Mf!ipO44@X5kr>oZf}ntcb)5ypg_W5Z zb$rU4r7YuJvokJQ*h=upo2cbK-cz-o=_=S~E}H*-gF;N(R$4??Q}W+0yMI?0wLtX+ z*bZsd?Et_Qyw#@mk1J9 zXS&W10BylO2De}#=7Cz0AbC)^;LOMZ?q~gA;$ynWpv%C(2p;JG4RnY@vcIyDnmST% z3p^-dW@c_ACeHXkEke`MNyklHH^j^;+uN;HS6?|zPsu@B%~n~--CET=$=)MJlgUR! z##mQgPl;c^Fv!(1&RkbMSXx8eNK?r`iI-Pi&)L8_%!o-@^8bGZz5hR$_`vzA50bwa zE`#$IL>%O9i1;0b07hQ0dO?u8nba6S;%rP0Q+|R)L8gG({UA}$xT6m^H1+<=BdG?p z7iax{4Qem`|G_N8^b6FlVnz2X6R7bF9{>^+R2DQbGcz_4gAEBm0*VSgSc$i~NQtghZU^l#>WRTcQIW}{X2oF0FWARAveADvBvDY9%?7uzWB&hOYG%3$nuHaGwVecw1x47{ z!2MuB0Y(IzO|m2jLdr8Iy&BZjF=@=m5pd0}b2jz%~ zkQ@P8OY;9eR30>L0+I){P-cSrbTR)ELH=V>V}OWXV`K#N-Jt40<0BC9>kNm%eK&|b zpz#ri_+Ew!puQVOJu^4c9|o8?N15yxCPM6G=4S4IimNk$#lbZ=%>Ri<`VjI+?qKF- z?!(ZJayy>PPgog6di>$wFJQ_>YpAwm8n_;+epY-t3rCR za3Af1`iPzB9>Y0CFSt0UcMEYbI0P6N8PxyZV*-tPurV+Q3#$toGcqoDZF8sQ-@bqQ zn6Cca%EM&;my_u`sLoUWe~-%TV^!e|57AD@mpne!wKe*J}2r2a#SA)|uL>!a{AmX1_q{iOjkiYTvbM6VRm6-Mp0!(wSQk4FDqVb z`1djMJ>#=~B}|Nc|D@i7@-tXHGiYvPJJc`I;87}wI4JZX;;*;@&4N< zqAr=pC&;+&Ul1GPUS5Z&th~%9J6>6SSz#|;A=bamyr6MwP-!~_-1j~J4G%GJ-y0%6 zn@NoUB7TQqGNcq{U|^cU3>t-lh+kv)!SIfOi9!4SHzo$g%?x6o(MEBQvmo`5IJ>#A zpt7krAG5lVnYk&r@@4~7O8=}AEUXhPZTv*pxMEYeSfsS9IgMPoc{~kNY*bY3xQr4# z+)~Yrlm$Zm#brry$jOTZo9cyWnkn0BYB;F={|~Vdw8oDCwDu6xCfUcp0T-Xlqy`pe zW4fEg1QTV}gNmwwL_wt)!zOTlO8b8X69W@Wk2=#ahMf$c`2l3TI%s;YGfZSS05{ne zO?EHCbcRg0tOJ_tPKH?UOd2@Um=-~0*_dvnutN3tGu?!WsxjS4X9T&GF_9q`EDLfg zOb^1XV7>qUg5rVcK0u-v|I=?YlGJQbEC4G1C?c9wnfOs{|5J@ z{TZIZWSOeqve$k2K>cWj2Mm00*$AjC8`IS!h-d~VO+ZE2A)yLa4KoYW3+_WQWhz|# zUWT^+8{z7Eq2g>z2lJl8MM1Nup!jEFdQdCMz{H^UUyaF}aWjJkgE@F?5j406X%Cqj z3nCTV(2k-wyQw%I6I#;zYZ+%@6>p|(tIfwAr)MrBtR}B2@-I$QR{>I<+Zid_3-R$)O9*PqV@i-Cs1KuttZQDLNv%BrpknMH(Z5ocpNAL?%ypraoyDJW;6s$`_0A>$~h zEuRvope?9jCvL0|=V0uw*XEI7VV~s~k}v#kwFIM(D36J*g}aZHw2_#ef-kqXxu%tz zoVb;^n2dsql8mTzx`xVCTNO1vHEBmBLj?zYxqlxmQyuJ5Z4x8OtWx+C^nGm{{DcL( zMM3RtuYx>U}Et9|BXqTnUg^TG*$*~6N5T%g6d}As0KB5A>Dt7cSXg- z7=x@rq_|R3nI)sGEMhEdlLFN3lvQlijl6hx-MREtWz(5C|JkZ4XqYCsxTl(hsyb+B z*r}RmM`)RYY8mbS-xyagt^xJ0RG}?Mlu!njXrPH##-%d;8ZMbucBxh-{<21bCJHLn zO3L;cQo4fb;!Y&ugelN!SVh%Xu185kik&bXeb z3o6dWbjS1?SX2t+7P#m`4QTnsxPl2(UW3eFW4fjL53KeZ;|eBF?FAAA&7w{E{|{PP zv%|s@jYP;VVJk0s2mZqCSQ zn`&bbXQkzAAj6`{q~;uB;boKVtD|5SX=v%`X{lF{v>?MDMu6V*53?Hi3xVvWL|s zT1>Z~YSox-IWd7s6-FC|Ja7uhU_|Hv)h08+H6K{-|Lgz1F}`McfY598A5@zhD*@~L z#w5b@5g}&>GIuYdC*Wd@&Cc7Cx z?M<*=rbwvCY)n^e5u$ZaQBYc5!T|AK1}Jvm;>Q?ff@eh_roilAW4fM+Fa=b{fNW-C z+M5WiVHjUCfod3t=s{0t4a4}F2~@*CL?48Ug2y7%7~e8(2JLc!^%VG+z@18Hk$_Q< z@-ZWdR7Q6zH#OA^PBjf)Xi~`&{1*#4Hi ziGrOl9~VC-JoQ*6^C;>;i%EWQNhK*6c`;ElDP=@D0=3T|Zr-WS&%nr_{Qn)}BgQqL z6f6uL9|9L*>hO7L&`K30@D#}}xT_dLB>ue<M0d~HERwU-!Zcn;KaVytB5WDp0f-cU9*HZ=hi#?X~1qM)TXf<^A`p+RD%qS~C| z+{&6QEsP#ft0R+n`8>JU4Xsv2{o4WRt!V!@VB%%m%%H?z2+8}<(H(PBaj>glH9ELu zDZ<9a4C$T0N-IWb0}o3n8+m7K7cWM3p=f8T1S{JVON&TRR<2l^oGYsK>ZV@2ygtV2 z_No`e)x=%plpM@*g|#fLQtTa5t+W&cz5hj9#+oxO({NBV*ACM*RRN7?gIxv6hoIv? z7}%KZCPVU}0TVCNL?$(;=$#bMC^kgxBDm%7SWY>Pl>)qW;NDVqrGcK8&f1Dr%z(-If36L2JnVgBC74V1C2^6TkI;B_pW6@5R8tu%9WPNsW;UTs~bB z{|0dj!xqLxpxt($Id}imRK`XB;z0Sp5;Rv0YB@mF-{AT6|NsA23=E92Of7Iz?(X>f z|NsA+pm}qqDR9wSo4)`5|9=ew1H)IQ9H^)o)AiY)9>H}zkn7(tFfd9mc|qman67RB z*@?xC|Nk?1{m(#hxf&D5G~azIiP)+mzmn(rtiJ7`2YX^ z??7wXnCju82ls&bkL(N#4F8yv;i3;tu`@9L|My>w;SEz7gD`_QsD%WbV;4uCV`m0u zQBe`lKt}~=zTI0y&s#`gbQaHQ`9v?3&24|Kb=IZTfH+mgd0rgV%ZZ zr>24|1KYvCz^Kf;n@Nokx^j-el+pkHf3Sj|BMe9H!+AXAnZltevmCJB9Vyv zpUSu>kx$nQp8q3UL6Hv)l?P0@3~G#!HF`G~7J^&7pg4KJ)CCo1W4hx9YW0HR4`eG$ z^(lr4pksj;ME{$EUBd~g+d#o!3K|Y!gNF#R%L1%rQR}(3P4Z-g2V&k10!Q=8F_Fym>SI?8VU*)X6H=s@&ZNy z1x-e9Xas|T2hu8M{KdGLfgjY*Fo(1zz{^TOtqbT107y;Erfrku;+k%0mG0)0X`7~G ztpaV{UbP3!wb|RJTAQUhtJ|wW8nckr8sjfe`;rl~6C5;JG6&wi{KYhxNewK{#&p*M zQm=hu`~_-BLPc*mL0Vehm~=to5@1m^rdzI{@q-(T_ONjYBt4*(OW2sM=OFBw3RTUyFcI>Vg*pjDBeaVms9g#0lExEq)_;h_POM{)}jClkyq2-&?U8yQ$Yy&NV^ zrbq^925kmQ1}6pvMkO_Ma0gmkSq+k&!D|{#jm6m581be~b0afzV?HKjMmHH%elAg7 zK@mn>CSeU3aV0(;FP^%vi3u;U^GC*;AgOM4LmO$-%aB5*=I_Lvy=l=q=^P!>- zqM;*6jDHw6GpK^jHeiMH`#>!=P-cXVv4Aos@@xPzN{^H=R?bw>P(zJRPs};f#wHV- zVGUIbAgd0XbD>#Q$@-R*shYZjFs~4(SDIpNm1=L3sw{1wA}I}8!`sh7^WN5IxLn;93hjBEj$qTpxo* zbj+Ew88;)1=z!L7f(mr-NR`2Q8;%2aV`>>V-p zGStmM_CZ^-pm>EYAOU9puzenSp`uJFsoXMgme#Rm)~O)t)NEBv+<7@c)~WovzvbxnI!3q4;QOK{n4&cqJ$AIgY}DR`9~*nhA-3}}4(yLqgIO{%p;h$MGf zDvM-{go!sNkGrV~c*Mmt+1WMKLQhRL{cj(mfrf%+fTgaFo`ssdhPu5fsCHstU<_y6 z3|avwEUs?HWX!I{25thZTW+t1$tmUS$ixJ#n1J%9Z;Ft!j z^<-nZ;Q)$f5e5dv45nr#HAaZ&op1*uhIx_%zq zY6i9E7?i+rpcX7hj*aQyhnozH44VJHGv+dGWY7eUUP3#2ppi;-*su?HE*sRh5D^m- z2d!>kV>_W2BC9QBDJiQXt0QS*uIOT<<0hvrWGEu7A)_mwFU0p>6k|v*10#4H zg)dViXq~38F}Q24EU0X1T%J}?kmlvZ6uHCy-#W%1P}^0Wfq~H%G#0}c19Z%y6X*c4McPj6GSx|(;a6}j6p;f!PVY! z1+{tXKyGBJf{Lm!UDpMbX4e@GfZG=kJrPh@Hm0jipc2ske+JlJ5c5GTgk|6s0z@^; zEHhRcqXTdE5n2$4% z^daPrF~HrxU3Ctf~;3lgv-N*)o)D1>9aLo(x zdoNTk8`D8QP|XVwHH3>khy~TW{{PjOKxd{2gUSTh7#nimRUK<;VO(P5p|4@CqHPSF zdw-9fd_etJdm(l~QP?!iNxbQ)8}6=q8K4;&h-+c~XJguF!pFeKAoTwW<737}pp`D- z%-~sd=D)AYXWR7_Jmg_q_ir~dqtm}2u)60=lNc9)=HMAY^VHlR#pddaiKW6h$@|-? z41wVqjoAh3E$hn;Wx>D}$!f zmCZjTrY_uE_3uzkWOnKTMy?qT4>B(L_ie^)1||lf|K?zygL|stjK+-S%*MjSjKZ=1 zKCzuFTz--%`|s3aj7$IZf!$-y_!yjaYM}1#g1R3hK7~Pz5hTvWbjtwZdXT6WT=Xhv z)CF!IL@hhhF-GP8p!HN>cQEC^RbL11R)vVR!$tQ7Erz>887}(36SOZ3q85~oA+Fe| z0P0~&GcYhNXFLTuOG{Wu4cxI5Ggf2RM3SOIe9cUejGq-%VZJUEd|rUsq8{M@LCXhsj3AMMJ|yN83ds$W__UP+8f~5VRhj zfr0ToqZ)%KXy2W=DWnr2CJt^=ftonR#^S8zitO_km8{h@4W(GvHDn}oWz+=}8UM|; zVVq^7=VlV1C#@>LDx|C;EyHc5my!b7!^b#*@jcTvCU(Yd1_s6n42%qt|9>*vVO9X; zEOS04H8oQ~bI_6MBgT#Qqux@iTIOVpsD2H%3cl1qL4Q zUP_oQGe%1hw*U{l6vI#t1$Ay=BTc4dVt-x46+xS87$pDyU|htk0BTpM@-f5oh?y}i z684OY^3hANh)7SB)|F!yvovIyB=$E#R*nTUXTb3P2g5Xo3r&s0KpRoa1x5In)R+W> z_);X*v{WRS*d(RE&XZOZWflOt4>bPBtN6-S?sS%3drva zDGasD3ZM~Cb9F)U+LV+OBc>A2ek4go9hi(TM21nvh;fY=XpCKwfq~hQQHOyU6lTWe zilU(LdUMd~I73MrriO}&6cLe>l$1?k|6cQOF@ky>ARQaQI@m$^LDAG$R1rlV)73kF zGLZBl>1KlLXaeizWneG{=`}Srh1i#J=ieGM>zJYHix@y9iy%aYx~aJ+JCd$DDR&^+ zE_I15xCD193s~I&nW0)CE+!_%TGM zS;lk*anM*C*avn@#)_hfO5imlVrJ%SY-+5G%Ie09-eNMm%C-iKJpaD%DoUzb+e^p< z1~Ll#`=@KPoRN2xpoNB%xxQ=)zr2)&o-i}Jh!77u=DqUB%2-+lPJ`we>Z~tvGiZG zf@Yw-w6C|}39v(*!0y*lHgx4?l6L@y4aihW24>Jcdsb$1VJv2T3Hgl8JdnfC&HMlS zzXjuL#&pO&HDyypQFd^^iZCv6gE}oG1>zJ2P)Y==2HDQezyMawY%UB^`z7QvNFB%u zkh&WT3``u%S`5sf6=|S!s%UDg$7E)1ZlTELCT4C1>Q1t;v$KJdCF72OzZY(B zDT(r{mM946Do1H)2x^LYWh$%52`H9|F=_=^*4d<_q;ME`#hNYEj}a5(R&HZuW9E{P zRftN}U!maTtd+vR0M3C-Qy7&%c}v;U7&N^HHeckRs4kC%a(KMK7n>9w6X9(0FhjU{ z8D=d|4X;eVjUoiyN62-cx|rFQaS3Sr-q>8xOifwQT%29eNRCMav~C7e{!d|4w)p#_ zh0BC-ot?KjpNL3`men2hLM1B?UlmYwzz8;D4dW6}O@L~KxUs0D4O2Cvvc*3^kO5Qe zywv#^E1(8gx~ruyF#cctUl&|L@iH*5i`g-Ot7|qkHMLMnPYwPQT@QcPY5XiQTB3|G zV*h5CI?FT3gW_}be_cigaES=55m=G+uAB5P8?HSi1;YT)?m!D>Uq&4UUeMZfRbx|g zQCJnE$PV7hVrFJ8#>Otk#IB~s4$0-Ubpq@~gq4I@g~fO{*qNBEWYrusbc4;` ziT%4`5pBxA#vu9Mg83+89Jr?AW&n-+J25b*nu{u{LL3Nkq$n$?u4Q_8=gz-^6cG3q zLzKglm{Rt2i7kMjDAIfZN%0pLCxCX2g6kZxtBnQC1&u{TK-QQ3sTUkn})8+YqWtL$%y25?)7g&XR2ZqN)H*zJPmg6yWCHY0kFGJ72Ulacb8Q8*qg z>{3#U7(K-PEiy_;K?xmjJBN8P)CMUA26LQd7h^LQhpFK5=_a^U%ns_$fJ|itw^q?z zyffwB9~(xNVl?*}G2IaRD}?S^7Ld6tflzZ%!UMbM%yYN=$-r&{sF{w<4%YwY7#LW% z;dbzYMomGX4#Mh!=7KnEidp~r@Omy>cHy#(<^K@|2Ik3d+vGqss<9~U@Un>yz-0&a zFk@s8{;$Va#Ha&W9|UgUn3=1ofe)<#^#oxBEo!4stwq~WMo3PSN7YhEQd^l@%t%yH zMOsUw#U=>UI<$7S6&AE~aX!K4VXmqtBe#ipuaodN2QV z8UKM(8E7vtXn&qEE2vcpZqp$*M}@_e&4t;S6`9o;*8~OqyP@qMsA8_hDE};kq=1^J@>aT12s@<}Seew+)&Ko8Vl4aDWyHYDAo*XH@etz#1_=fk zczYPrW_5FMc0qH&7Hn2JTy(l0i`_0p#>dg0-NCsFR7-+ZraS=ql$U`4G*ZC`_mK$W zmw!Brp2)6e3`TM&1M~mu3=E7#VBO&L5TMqTI@DbvjBTgDu1HDIL$VQE_A~xtGzYZ> z!L1!Lb2}!`Ar91$D?g9B5@3Y?1~tBQ7c;CTYVMC&%cJ zA|jHj>7ofn8X7K|qO!80qO!6nDJcye;O^`+4OdMq(0GNGrmIE@SW;9}mVp(NyO}qF z?FRMM6hUL$pj-#(=Mv)rNFSJhD+sv*TdCWM0 z@el(igCwZktW1=xBDihDALgLEp$YE6DKi*@>PB%$O%7^^nTd(3vBAm*BQr=BmDwCm z0{CVbVkV`h!oig8U%XAKQ!SdzG|Zttb!l&K)B zEX>F+!_3UisV}MKsNo&#;*la?@8zO%9eYXv)#;i{IpDUaI)gcbGpJ5i6ou?d2R9-~ zcROPkqu9SL5WrdlZ0wRY%nG1pP*)0* z5TqUSx8I4;hmD^Vxgx*k%;>(9n-O&R7RWT_L~xBF2CdH_W+OGdLQ@vlFs%R?3vXSW zU~&@sy8^ZC1nFliXEtZhV_<-~(2m8>4Ag-GHPNAcI8ZUe#*W;DabtP{GJLnBlZ&M? z52KKvh=rVhI}wFn~-V zrr%4Tm!!e;NbJu8V*0wEvfhHp6l_1JC&U0sg`gHKF|O!dbq9Z^Cnbe=mq11{9l$Pu zjAn`|nu2<(B5Z7iNaN8=%f$YC2Mu_D+6Mn&VFy}Ms}5QdWNdCM3f_Qe44EG>7GYyE z7Zeu+t>{KtAOu=S0&kB5;Z4ct)Cgj7%Pwu*);xRL@jP?+|J z{q6a;2zylo8Es-X0huRIhWi3C-V65tsK&BjbY)gx;0K>Cq|d-$45~;;aXCR(6YXYj zKMK_~;A)+!t~r6^9L6tV|3YvDA!sao*1zwN*%?*%aFnu=+CN`KIrbDqBS~S^rL1!L zvW(xv{_)t@i-Xo4OENGp`7p*ZurWx0PX99ooj_qMZU_og&_Fb3ED5uL8p5R^blOJK zMMKp=ja7id$sW-b=@Ai0(Qwt&aMEHD5#iKKwFE^yylu+-|J;8=MkmHt1|G;+EbK<0 zL3?q~h@BcZ>~LCY#3UgjnxbZDeHyF1TiJ!>C4N~QP%@BYJBix?klK%N7Go>}JEUc3 zY--1BO31^Cs{G7TvD(YUp`xw93u=nv@G>aRF)%P4WQ=2AW8h-oV^D&$0>s3Ojl~sB zjl~UN+0Vqx930%xr9p^=Ga_P=kP!d({e+|AiGSZUT{LX;xFy*+q`7phP{STHRHoso zY3$F(EG{P}&cf$!gc1WR;27A>7{|cFAi$u)V8FnD5(h*$1`!i@+=3DxDWD{Q(@6~A ze8j}h7zaMfSsv8GhQL+GBZiYa+#>vn8csab#}!Zi&nB%H}F)JHPhzF(5sHHNC2%BeP_>Yl| zff?5Oh4yL)xq>lg(!cvexFjWoShsM1+N_MX7{4&^G6*urGJxt_M+OhjZVGU%YhrE; z2>^9dV^MS1%3DzpF~lq}a;&q1#(Tian8idz*v-|AjLgi;86m|sqpPN~hUkB8E)AEx zN`=r$*bp?WnFr-$a&c=ogDPn;v8lXTy6Rm2>_J6Kl$D07rmm`>j;N-qM#!Bz{IC)` zIc1yJzvnz$jQ?OF(t_%u&=^_>J2Id#d#+&nv4B={BJVY`eis;6yQDxqYGmc z0~>=FX!KE)unQPna9chNuWg{(gn@B0xGl!czz6P)YJ&Dwf?8Lg`Eq7bLSn7s(b+mF zgn}a_<-`e6f&@G=#JHI;3S83gL26)_`=BWaU;M0fJUUm033mvA+=D-qIRC%-Z^8H* z>H^R_5va5`VsK*c1NDrJMOjUaMb%A>#l=mHMcJW^5M#*dQk3$D2-kjfJo+z%uknOq zrVh5Wv|N=Y#~aROAaLsL7_7~3y=Nr4OMN6^d;X!H@*QZ-|61KmOh3U76F zQ*%bD`m``P`QKGCJ^Mi+OYEN=1wQ5k*PXu^zc4T}2!dBhsWRv@STlGs1VCaHwVVSr zdMGICK=JwuUe5hHcfxTBk!2mY2>>hQQc_4P=NK5cApT?m&Be2W{RtY`1&#OlGK4^U z%B*f`4#`5WQk`<&7A7Z8CDXr*T?$!Zf3G1G?xcI01Du|_;CU9*Hqry%0L1{xrBuqT z@nj`lO7bbBEb4;K67Vx1l|`!5&7q84Wam$cb0-Hl)pkMKAEFG34B8Cl46Y15(7rRg z{XuC;B`b|mlr$M2B~KSPM`DybjMUDHpjad?CsH9Ff>w+&Fo4>TOl*u#z_;Oo`tIKF zQWp`g!3+$F@SYQ_9HOAag|#jt9XI|%l)R+2Fi}ch63bp#8xu7CV-IfA@iK@&davT3 z)ia=Ff1s5&jD(wb>hRSyjGVZe04?B!J6psKfS2tsn&GSPK|TEc_KZuwC8QvO1cL^H z38Xdvuk0bgZEKB={%a=6eJLp`70tXkLi35+(k#ATBL^d&rDsd}&rI_2PCK5m5lY-4JQVa~Z{9iqj)!=3wH}p{MR8SVFsY+QN+eT*&ENHqK*ACuDJkGMVSw1eq6xJ{oPhy7oWQo2DvB~+2a9KqUne8{;$31(x7i(18KuH}Gmp5yp@d(E2TgEey{X9TixCX~tQgnYt7{HMM_f3{0SPi;NGLBEX{p48ow5)S%U7;I-?F zg64uo(^3LJ>-1t$7|=@m-^r^48o2?F$ik-pKqZ1QXa&EiI4I^#O_i0{M2*#r?3m0!wE}2d0W>Q; zRYYWpk&&pZk*MskDZH9`YFtJdu9_zxy{HqKt{RM7JQtp)$cp}w6`jV&DJsms2pMMcesnkU8NrT_P|urQOU{@-m3%nUjV42&n3BEY>~ZUzQLW^-Zi zxtyS^kuWP^(Z7@hNwX}XnCztfu3(Cg`g@4URalsT2^zxb41$mqV<@Ngh=~d^!)HT` zjm#KBxD`e0k}QlP&CP-hQjAo!jol4JmA)}D>jqnyh8pSxn*Q@;jEdA$HCEBlU}0cl zaARO#TnF|u=vEGJ{DbCgKyjb)3>5PRQW)b>8pIxhMqd^|Vx1YDYCwBYWEmKQVX=d{ z8^u(S9c0cPMH@A=4Jp$Y*NOe}N@0vb-jgEB1=^DWOIi%fV7Fa{x=oOQfl=L5+1%Jb zOiWZ%-5hK(qgP6lT!n~;;4IdE6)B9dVhyQGoV5_fdAR#8`lE{oC@ zW79|x^iNF#?MyOdU;w2DCN?I}jpUFpodZoD491|;p~}v_EMZ>MN=A0pkDzq%Pe(6R zi-Czj`Tt)gU#8g%pjJNvY@Aix3_21A+Pn!lV~`EB!H3Zzu-4tRHaM`>-Mu!*(py#4 z+tR{IRn?0*U|MF;6i-IRfN7aI(|l8HvRz#>tgJI#U9v#g6O>*Vo-$2lU}XTGu_CB! zx*^k@Y4YD(COrm5&<$IRznNx(=UwbTsR^_v9Au$5JLqNr*dQP1IyOa7GrQ6lGbM9* zEn^80VMhriA+szWhd5KG6cc?$S^Kj5EJICGNhL#ZMH69beoK2v^LQKU1WU)73LE}Z z21W+s|34VdGED}JgE2Czn;DzQF@f_l{2XpbVg{W)qio8!V~wqpf~uQ^qC=L0L882= zkdvy3kAsD*ngGi*g*Qx-|2>i8VHDQ$wRB4}*H8!(Q+BsCci>=SdB>N^zyw+^&iI{a zHUk%E9j&=3qp=|9{yJq-VRm(6Qy#{tjG>{KY_s?m&t+u%`!6V9?p#LU6Rej(rKs)y zAB^XjCNn6a?V(myVq;epR1{SfMLHVsi)o6Sxrno(iLfuqwOO;L3Lr5SbfW6 z4h`8LFV{Vsc<@^3FV zUD)!cGB7hp{r|!EnQ1nI9D_cn6at;0Vh%3aVGG9C;nAmN3O!K;w6P7eBY;g*7&4D* z0!mJzQfk(+GHQAOMn?YnYO-?H>h{?#&e^uvO4iCMwkk^2D#|vh=K8X-x;k=ldKZnn zjCn=OwRK$8)t$8TEkyW?yo@Z9ZEce+SyXIPRc%yMtW_8pm2K1*m1MQFWEHiwL5ChQ zsQmxL_=jmCgCuC)1YB!Cw)cTg@CV%)23kl58pSpRUm74PBKFEC+R`c8#wEwzDxt*6 zEx5{!MOHRg(ZYjK*;3ie%ln#Hysby3g-xc5e?w-3ny+STycVOCZKRWth?0ephmEx> zDE~uqF_Rh-=-z5}CRK)qjG+323lz;v>p}H2=&B$6Ielq8z?i1DuV7FQWi94 zS7&Pbml?-6{U7V>I9sM?|IRU)%}lMg}cLDTbp=QxTmo0)+p3Hg}VLH#_?3??|T*&PIZwd{Pf99^aOPXBu;VQwg|ASvED((_uA*g9!ETyI>0V>)VOc*s7&6w7KN(Ny_XQZg#)GJ;|pY~f-(k29TkmBgjZR8$-pHRJ`Xx#Srcm6TKz*jPAQ1UH zXO1y~+fn9xOycSg2f{lsTjZ43Ic0e@6_q5VhiGgG0RCxE68e#idfo7 zf$p0Ho3fvQ8&PNNb9Ssfp`D-L+d?!%#&?G0aIX!irH|Us6Df#e+wUOG?E?Urtw9 zP*~em-*z|5t)SSDXJBCHWhey22D0D7MU|CBMU<4}B_$LUB_!n;7#SG;w=t|_hyd*l zH)msGS2i;oL zGYY}%`S%XSVqp6J>38Jv2)fPDx)K~53L9gw4wA?`zFGwuU9OhifP1UML!m5+mIL~y{&htVLPt1&P# zEMfWqy^GISP#JPo9mI6As3-#&6;)|zWo4!xe~<2gYh+?j`>)Nggh?5qPuy5g*<1VArm&QSuDrgK zjJ~v*sF{(1c8Hy!qk))^ilK)3E+ikw{5NIX$0P-D2_vXcfmrNnW-bo9u+a>(p4!yZ z9Nf8r1UI9Ow1$|xuAIJWoJFH=q+bl|g(^-UVSZGjk9hl#f9eqz*=d`~u=Lva@ls zC$RFe#<20Qr7*EDr7^QHr7*EErLyv{MzeCW#4-@fN{H!*>&NQDkvLRP%rMU2-%ANY2?;|9P`C>I zf6Lg$^a@ngFtRbRE1Lvcy`$jD&Eu$JKiBk1%}24Q1SWwTwo7+E9!|A&jSF`0qJ2pG~BRx(aw zWCXPvKzHS)F&g~4z{nWEz{rrwu#zbeA(P7Z=N}71CXIoC@izmgcgbL`D5{voIQ3t4 zLlj5bVP7z7v?Ku1TJnm{&Rf-=|C0ILvn2lW7L9|HrQW!f&6yJKh9=;-Qp zZ%9qu*v-Jmp!h$N(TeE{xYrBXDuP1?Hr5zL}yCi7)2 zR2jn=RV`$f>KlnLgZ*sxKa(*GVmssr9MFO;sEx|Xrr_I(G>o#Wthj{&BV^+#=!8m>i>TRh5s8E#Ton<)WIUPpmV<&D*x7k$`&R^ zMp>r&4C+j-49(z^F6U%1!yga^_3jz( zF*JkKGeA@~GcqxTLzIBZuG9Y`8RMBbL2X0OIVI+zY;54ur9t;@g6?<)U1prp>zYZOJe&Fvl=m1&yF9!Y)&nV-g3o z0ze%_J|@OJo|CJ*owSXDtmVC`CUbd~%#1co2{cf(uof4$woo+) zOfij~S>pNsKLgZUCN?HN@F}I*|5cdpGIcX}f^LF^tf&In0U9-doE>g14xvE}5>N|7 z+}xO%4Rn<|xOb|o1Uf<-bnhOhVZbD4WM*y-K1Bu82H~Zy)`fhVeXp2FO0 zPDWZT8ZLMA6DB0uwb!TF#xG2<%?&YBchl3CG*;3Nw{|ab2H$b9XV4&zGt7N1sq$DF|3OULOm`UU8T=R+RMkOg1w6`$e0m)yJ(-z7hNQsz9l^a7a4S_z9CU*Lo4T1A zXyAdJO-xMOj)}2UUC&F`GR4ucLd!%uM9aWk%|=Pl*+SVgNSnjNQBKm>-`p})O;5#D z$BRaT3MWnQ(VnT%POW>T1|qLNl#f$LyC(@Oas)L_xt~u znVo4dgA9WKg98Ht=-vx>1cFcG0}W$?M@-Bi`>#Qs1ce0nJ{4%Xh3unevJ>+*FbOd< z47U{4)#B3-P!-WKHPI2%7EJZ1OE5D_sPpisOEfc0sPpnHb9F8A^elIEDmyNw%48B| zY#Cw1!O!c<$8D#jWg{f?@3~2At*3Wgtg&%yowsLgtVxhdnYT~5i%YqWcbN-lJ)In* zGUHXI%iu9eEe2!IO)&7-MXZTJaUnCL!=bD!stjF9s4NOP1^TB=vW-o$jV*|@)%DQQ z^3c@*kxCJ28Y*hamOg^Ke0-vA8V*W~$`(m>_K6l2iS~9$78Y6_dU_y*Ad*o)RY^wI zt5kr8SI|l>JPeeAv>7ilaWma#-~o?Ji?geniz*9>E1L@{GeQRalo?M+MaN3owsEyP z{!83q>1@GND^yn}u!@my_UwP37@4h4oM2#LP-48m@R?~o13!3t13r2LPK|2f;NB1< zo|I$^Wo7kbWb|ZZ4P~-KWMo7{WMr5uWc8(`^<`!CWn}b4z(OJ-GN6(%`oAc{cBW(C z7M-!6a&$}#)3HCGBc~ah|BEop1Iw^OMrTEh1(ltnqobplj{Tea=HFZfCI&eMW=38n z(1{*kHKNL(OQ7W5zxRrXVZ0jo`tKYDW(FY!W=2`48g9rv?4Z^MNTm=X_rI?K@7{Su zM>Fb1GBSd7urQ?mf6mIx^akALlLz%4R24-P*^%y<2Gs|k(i7Bl0}W_ENBAH^v~0}r zj9vfA8j-G|4#sgJ>Z{0AsFzeTN!sH$SJ~=+6H_g-F_Ri-w4Q;TDT0xUAs2k!=N`rt zj87rAn+b#Zr;sRt7Vx05KpCmzduwmM1Lw^#j8Few&&Gax4EWC3V@x}kCBd^a8sO1U zMsr4GMqxfCbx;um%9XI}3aTzZm5Mo&#J^)Pj8=dC9gktOQV_HcH41HuH!@9V_H)Wn z)shW0aVd7SFY&Vom1dUsvyM54@y}Z3;JK^b3$Ka9y9C*-sL>a{G#1|2Dm#7QlR%OPPe>uAUQkf<5^VIs#Mx3)xnv^5ja<07 z-Sw5Nm6ffTF1r8S>)v6W=Hi-cs;#WRX#Tf3SxQwe6zQ@aP`PjQ|2xw*@Ljg-pmBas ze@sagH|jYbY5&t~F;jXEX*4KC^=^pjT#+{QG6x8t(G!|3`PqnG5i?gaTinFRSMKZB4 z#mtDw$l!F(v}QKZ{MV_;=%x9uOOw%2KuIX3z>w+c-!N+#XDbom`3@Hy7y}&6JAmq; z^#6aE`k3uOYcCiW7>xy$g-yU2gAH`-EUY>aRA%&zj=rJit8eHJzcH2B{?9?i3;JF< zI$rw!bQ!M&lsP$-1^m+jg(Ls}=gel{k{Ub;2};e%il&N;NM$wSHpYg34I=+?87DK^ z{Jp5al*PiNA<2}rf_rtx-m{@c^u-rhbPi`72vHty~=?wvTSX93#|y7L-z@*UWpps^89 zj~vJS*Zho%|L%YO%qWLx*`8QN)>y`KIILn|W=LjWVEn^$l|hO@4m^tiNyH|4Ov<2x zAC%R>Z6!V?Wns`V0aHcMJ`R+81ipEc=^_I& z0~hGLAy6p+I(-#%$td{5Rz^qW+CR-wsF$HK9`|4j!nh9=G|LDtaX{xpfXf_E326>G zFjd%?QBZjqW68fBMo^hpkGP1GQ9sB&_$lMke_NRu{r*M&yTHK6Aj9y6;Sl2_P|p~7 z4Nbn1p`ntpfx#OvsjOrO8XbX-?lG}3nSjUKA{a~4lu(EUFAjnGa$*I$}CH z7#DO!bajD7;DQ+zF&<#}1!~EG(o!&E?!U>uz++CC3=E8i7$ZO}M^)qjSI~$od|X!D zoKajtS3+1-SWHh$Tvswc+(2ARPaJfKte$wh|4)#dhOn5vxR}1ApSYg5n4Xxhny|R8 zL|g!7PR0&2mG3NZ6!Z=A> zQBhn{UjE-F2?YfSNqPC}kqk@>X$*NxX^h?Ak{TQXqM$KECI-;$cK;X{yCZTzBa5m3 zKQN^+DS+1si83%S^0Bb1+p(ClLa(c5@>dB@NC;OkQHe-Mh*0_G3D^HoE3Kd~O-oNJ zt)L)7YbwYzMuzDBpP0lLKY->L&CS(KSy`ih{bJnx&oyDxf_oVLZa*%)kvQQIOLI$S!Ca=>UZywFW=S(uSsh^kSpj}Q z4n})6NkhhsN`kz?`YO7f+6sdF;$j+-2A&!Wj0{c;xs2-=^*|vj3_e)Oi7_YR-ycT3 zgE0(@3`LC37*m<%f@B%h*_F-38C9*U>?^AnpZWW5-wsM;GZ`3|jxi-Ms55|X3$U8m64W~k(FWGt`8E`hlt9`$VyAg%E)&73rS&I&B(9oXKd`J3nAC( zo15z!8yWol1K~qRu&9x-A>*9ClbD!t7}!CsW>H6RwKr(|ixQXP^BL*BN`m`X(J=$& zV>0~uw+Rvi5E2#;3_J{a|GzNFFn$7;exMmgYX&!lK!zBG42BYhdWLQW234eaRme%_ zkbwwwByr>!QDku>^^6GR*hSfps~02#k3kwPf2?`4bi3kXZhzJRYWY9g38~$Ns8wOq z6%h~?5)u{=krIJu63Kz+Rt*#t5E2#^5&)ed52_?VC)NspMpz8Zjn&j(^C%*0hM=95 z5|0?!#XI}t6?hm0?id*fiW^C5>I$(li7@hW{(Hdyn!7*7P{LpZs$r3WjLizVYQPG< zBH;gj28RD&wM=YGo#33xTUuBeG zSim3vYBw008k-=8E2|mgpe8mpHN8EY;&T>(L-*eoaaJP{8A)&$Yv>BGGpjMniFR;I zkd|a;0gW~>{5N1+#_%81MiDh<6lG*wdclBkK4^rNfq{X+mEk35-Ip=wUJP?lQEo2R z+3XywE-yi?B8LA`46Y2!Ozce47(i?$kOoFRh82)Abh)CI+vxmZ|4g;_)dm^C?#jKExqfz}6sCaAy*Izh)2iz`Y@k#iLi5|mSL7Zw!WA~=noUxbUBTT@h+ zlZ#u+zJ;whOi)-}!A($DSV7)BLoQ5Cj$2z;gqxd7TSORidpE=X_lzP8C%`UQ&&0+w zmjRrD85|fsF+2c;E65Fkf)529MB7=Y3$gBQawMj>$d%K)+o*5m}OsWSl$zKe>8C23e$ zX=qwoYsjdn%F3vzd0A^}T7$5%nv9GZBcq0lj2bA!{$FLZW(WYEMIp+-Ac{!o=Afn2 zpw5%II3%5G?h#hz;Ac?-rE&`n2T&?kH!?Ef;BW$$D(4t}Fw`)xF))}y7M$xx%f{$e z`|8KDry10N(^(J04{$4SF~dHP%?!Q_PZ@>4ZCybI29R~26a-lx$j2mq?3lc~yeyld zlevI`psnwFWo2!Cd;V?8Y#KJoe5$VC-h(IOO~z6tF9tTItKd7QJ(*G&OPQ`Qurpm{ z;AQCf|DVB_iJM^sQzZi%(=~7jrpn~OFpFs$i2up<|9=KS#%B!2nQ}n)|AOTOnQR%3 zGaUx=K_ycx<11`JP|oCJ(qK5nw2py|>Bb!=(9KVbPZ--lw=^)__y=0OcY|Rj z_@*3f9OCMX?-{F^<}$D`-2&T(&gWx%#+bx3g@KLf&I^!zYK+eqs~~)^dLzdBjHyf$ z8Q7TaV&#W3?qQT*Dq&z_x+e_M@4|SMk(H?z#AlFXU}SJ)Jj2+<1nwQ-Xz@ZCy!wh- zLfjI3!eWf3%wqZqQfdNxQhXu;jApE2T8w981-ON@6x1D5WdwLdw3W2%!7E_AnI14s zX3hbXpm@!;P|z0Sk>C>+MKjx!RaBelp^N~xkftJ%*-9XPXfa-8RAiE2U}Jjl7R0w@ z(qS}VDhBZx!WkGDf|&Fe{xdxR)r!JqprKCCB4NbxVD_0J5&{AOqMWLN#xhb$f_e%} zzI@U`0>T1(5(@HSDx%5;BLDxxOkrYU+6xZdG{$F)>%p;mJroqX*BM^m7H42&Fk<|| zn98(_0knqSNK9NAJOTh(9(UT&m&b)&Q%y~S&6V4aX<1B|zMY+ZL=*!fgCFB-#zv;O zn0lT$`ti83YpAQKv%7HnGR;NOW5oE5VH?wQ@R|T|Ha2l}H8Zm&6A2NvC>B0drs>L} z-fE084%Q5e49-k57+x|Pf>lEAuXEPahFnF*bQN;J9LU|*7|t?fBdapfRAlpJ*L2Wk z5>Yj>cL3eJVDmqNVZr}n;Fbfd$Wc~Ovr!Nhl9v|}R>%~Uk`fh_k_N?(@&81I75~pO zfbRTY_#5{BKZEE0M8?wpmmqobZ^!@t4A%eC8PosY0Eztn|F@5Uk-_x83B%6+_dxCd zt#nZr7h_|~FcueKi(=(hJ)+|NjhH|C1RN z|F2?TXL|7e?O)LSFIxW-7#067hl+sK+h{XNF}gEWfXX+}c#Jlq%)cj$6>*^bBaAm0 zGnl*}rM56q_?aWIZImIS1zJ`Ww@O zw>}Jv46rf`G;0QKq$sO5N6W^OIJ<5flzCK+((7>g>~e*exSK(UpM{G&3d+ zb|a*B3aPt5+ZDy26Lspj+=`--n$pSwD!hWOex737vV3N)8uqH{CW6zs`NhNpq&Zj& z?3qI)Sy>nvb#;_<#KggOq*(q}V^nA0Vh{rNwLxt?Ko~e*b?m{AUK;BGwB|4~zaE0jodr|0lx>=1*|- zQ~sX;iG$9#0pG;J#yACJAA{t712A6=#Aje<>SRp#p9ON)zgbA)>LBrdS3s?G#%=$z z!0I?5>cBU<9AJRx2dUe}*anej1f^H-`MOMDNb(6xG7xjHsH=dgV`u7M_{Hc0atFwK zrYxv9$ovE*1F-oC5cB^-?)^|>oDcSYC&Tjp8$kO0T?3!Zm00knp{li}Zg0kFLx z|CfREGc5nV45SXKpADoR#%I!FK$sW9_yr`+zyQ9*fQ@k#B-}uJu)0+cdl@Sc>X@D| zsDacmurqZq$};YN>1R3u6$kmFlBo;qp7V@fK<;5w0_lg}Rlvr$24oMIe*tU{=zef^ zrcMU1dqCohN?>~+;vN6Lf$aIe`d!tNz5?5O1mZr%0;szV!|lHb zD#I9$LDYl%jfJlUk_Xw#(1)b&5(7+pD#K#N%OLxq`eEXoF!ldtflt|mh=bDEen`G$ z5{2g53`o9(o-fJ9coE{B{}xQF%r_a-KzvZTVdQ0wh1df*caZTWRGkUqX2w$tYK)H{ z;mELtaRNx)e~>sE0~<&j#%F4PtLtEJV+;X_|LZ~04@!q?7$-1*diyp1K&^Jrd0?Bt z=>}vzSe{7@6d#OCV0E1gp%D8(yN1E(=qbcqAU?R90PP}XXPUvF&Ugr9A4r@?b)d7q zz-Klf=~H8T3W-k!JFt^&&D+4E~sXf1c`!crElQWu$W;9(-N>N z&`ob=dcx$-pvL$e>icc~v%#r++rNYV|HF5&voZbxy9T_gomq}S4a5i4f((XCWgv4w zu?adU47^tyH1s0P=*7Uyz{tW0+8+eITM)!%WDsK50u^Us;9~%-D*}l#GpI3Kfr_&r zsbOW10?$~1)UYuKFp5Cca56|RszBLXOf8HyP&N;P8S?=so0n0E`5TnY$6&@P0c8s_ zw6OX?*o+JeJgk?XY(@qi)_YJk6N3QjD=3?pfrAw^YsSdJ$;g6mGb1aKUN#01HYTWg zb_OmsF({h@Nj)c$`CLfmb0eA0!yv>4y2A}*7cT=Bn-POELq0vzI&rk%lO_w1XYMUm59u_x%T$RpH%84BIVn}2tW`LLou|E~;_8f*v zG`$)Oz6_-d#b7sp!dsI;fgzV6pCN@Il_7_rm_dg@fguST;tJsKDgnm^NM#8_3DkxX zhJ3IqAaUr%kjPNNkjaqCkO}q?%%32arh`)g$e)P}d0^RcXk3A80mUdNu0djX4CxFC z3~6B7K7OgM9(=GiHc@(hw-kA-fOc>tb+P%>##Y zK0_Lk&p>8^{0s^qQ22t_MGOiI5LJ#0MGT1yNer0`AfG0K;}n$QKz>eSC}79{hrKUD zJ~*s%8FCpC!6D$tki?JzPF)HNfnc#r29T-c;4}^i^)iM`hBA0)XD~qg2uh8h9FYl5 zVKD!I@)wA$08R^e3?&Su3`JnOVPOsnLr9K*r4v{P7lGZ93Jzh=3=io!3zVB7E_4H@ zevli3!J$;bP!3Lqpm2w%0EG}J&4R)kl3q)}DFc*yKq(uNrh*wf8GINN82rIG7nGk6 zCi{RxJe2`r0w}$r=RHFPJq8ellrz}uRe*r5-2r7!V{G5+!!1g z0vQy*Y21oI0i*0GW=IC7@dAbta0r4@Qx1b3IMt>z=ri~;xH0&Ur;E*y&5O;IL4nPZ z&4taAL4i%3&4ta0&4JBL4i$!&5O+qDy{()2k||iVwP+UY%U-Z7!(*3*p%6H z*<2VD*o@g6*_;^^*!0<4*}NDO*c`zm$ZTac6E=4?L#S?DHbXX7hH!>daQ*#T1$;iaW%*evX%E-pZ&TyQOgOQVwi;I(!w*JHMlD8d(5*m>x{P`ZIt*tR z^%>4G8Zew=_{C_*aGueK(U{SM(Uj4QL6^~-L66abL7&l*(TdTU;Ss17WVB(lWwc|o zXGmjoU@&61!05&|yV+O-D#!SX6#%#tM#$3ic#(c&C#zMv-#$v`2#!?1L z1}nxg#&X6A#!3cj1{;Rgj8zP~8LJs<7;72p80#5q85gGj=d`GIlX`Gxjj{GUPD!F=R3JGfrTf$T*21k8v_XF2e%GDGaU*ZVdkz85r^z zr!r1saA%y($jI=D!GocIaR%c|h9bsUjI$Z%FwSM1$2gy%m~jE)LWV-dMU0CXmoP46 zT*kPZ!IQy@;V0t?#+8h#7*{iRGp=D=%izPfj-iBcJwqAe28MFRjf|TZN*OmZZeiTY zxQ%f;gD>L_#+?j)jJp_jGx#&^Vcg5OkKr*x07D?-e#Qfg2N@4BR4^W92x6#YJi<`T zc$D!N<8j6lj3*gSG1M@gW<0}qmZ6IA9OHS$3yc>TFEL(byux^u@fzcG#v2R^8E-Pw zGTvg?$Pmo%jv<60l<_v>9mczi_ZaUpgfTu~c*^jH@gd_QhE9fX#>b3L7@smeV~Aj= zV|>o|f}w%&B|{_QD~5W;*Nkr%-!i^qe9!oS@gw6W#?Opj7{4-pWBkq#$q>c(gYhTh zFUH>t(F`#RZy5hD>|*@O_>b{F69W??Lo5>$!*eEPhPe#$m{^!tnb?@vnK+m@nYfs^ znRu9ZnfRFanFN>wnS_{xnM9aGnZ%gHnIxDbnWUJcnPiw`ndF${nG~25nUt86nN*lm znbernnKYO*nY5U+nRJ+Rne>?SnGBc=nT(i>nM{~Wnar5XnJkzrnXH(snQWMBne3SC znH-oLnVguMnOvA$ncSG%nLL<0nY@_1nS7Xhnf#dinF5#snSz*tnL?OCnZlUDnIf1X znWC7YnPQk?nc|q@nG%>1nUa{2nNpZinbMfjnKGC%nX;I&nR1wNnev$OnF^Q+nTnW- znM#;SnaY^TnJSnnnW~tonQEA7nd+G8nHrcHnVOiInOc}ync5hH8AKRF8N?XG86+4a z8KfAb8DyB+8TK%IVff1Mjo~B1Cx*{V9Za1}T}<6fJq&{2TMOkFRx_|LEM`z*Sj2Fc zsh6pbp`C%3fsH|k!Ja{Ysh?pJ!)69225tr(hB$@<20I1^h9e9|8MZKNW!T2BooNEo zM239~`x#gnxEPi(O=6nNpv=I@(818g(9O`r(8JKo5YO;}p^4!T(-fwu3@uF481^!- zGfiij!SJ1FCetjY*-Ueo<}%G=n$NU=X(7`hhE}G<4AYpFFfC=^V|dT-fnf)O0z*H8 zB7;1`RE8-GlNpvXBr+^vaAaD>w48y1;TY2jrj<;qm{v2bVOqgj%XE+FKGOrHhfI%{9y2{* zddl>S={eI2rk6~wm|iozVS3B-j_Ezq2d0lqpO`)~ePQ~_(8q9x!I`0#;XcC+rf&=n z8E!M&Ww^<3i{T!_1E%jxKbU?p{bKsf^oQv$(?6#F%nZzo%uLM8%q+~T%xui;%pA;| z%v{Xe%skAz%zVuJ%mU1U%tFk<%p%O9%wo*q%o5C!%u>wK%reZf%yP`~%nHnk%u3A4 z%qq;P%xcW)%o@y^%v#La%sR}v%zDiF%m&Pc%tp+{%qGmH%x28y%ofa+%vQ|S%r?xn z%y!K7%nrba#Ab6<_IGRzzjoH1U69wNfF#wWL03ZIUQ4ya=_|29bras zIl|TRIcDaSr52T>rhq-e?wFgHT$G>3?wFsRpO>1=bwQOJtG?iE2&1a~j8 zDv1AFVgBQCg*%25!~{nHmn&Q=pDU_YU7=oeg?N?C6>J`BaB@a@BAYwd;oR;Bhx526 z=jY}oLVU~R4!4WNBPp?n+XJDH%@gc*PEVM_I6Yy0wo>13#LS5qtb`7@| z!dxD2BnPnhfCG}v2kcHBA7m*%h?E~h$`473(+^~SPHI{Svuj>Dn?Km00{#d)z&eGI z1Yj;lRs@M1Bt;-Y!HF7K71;fp{;)vc_fN@8ElMrUEQWYgz#krh5CKk*03^=*;Rdq$ zXXF>CSPf?=%udcwcxZ&ez0Vp7 z4mU6fb^|Y%iLA0H4-#%*3AjcsFc<7^-cXcq3q|o7dnhDW*h3-V#u^GLDA+>5I@!X( zc5;U!{LL8-i+;9nu)W-oNRp8-hp|P1CAlKu4q}glSi}|yF**utG*=Wn^{^#^!-X3{ zfo1t1Y?z@?DX_`>5GlCvP&u&K0*MGGfz1&{5`Y=z`tEo|p=zxswr&Y5`eh|SrNozNQ&SNMOFpzSSrk8T&ZwZaDteSyqpTx%9o1j$5f~vQz3q2O9h+9 zS`03K)4>ksPDePLCmks>aHYfTV#xrNzZnRH9GNNkB{`|Z#cY}2K;X=TyAUJ;DZn{F zOo$6J5iZO`bzvsdg_%$nW`bSFkp(rMI}2ecPd1Y4c(T)rQd9GC67y0rli6~>LC%%~ z_7P7Gk~+3Lh*Ta#Di2ADGY{k{a7mq-m(G?C_K83~!a}f4VI%=~JR*rf;t@#zWGJMh zMiK=3iZdS;O8oh-tP1hIKt4RIAp)Er0Z7>8!wqE32bVZt66`i!Fcan~E-(-59zHM= zt`Q;wb^~udN{N$?8XNf#+u8FWvB8~>R8r@I^+Ob}6@l$%D}sb-5pt*&!92-Vgkm^b zF<1|GF(QC@ijg$3lz@uo60nIJC9vYT1W5&3DL9JQO2KM4OJNpqmcoOe6z*r%QgC2_ zNwCGdU?#FkSn&*&fNSIebHSeFEky~eQWXENmqNmVy%Z8ytfim=gsl{;ldT+VCwDo* zvz+CyIA<#dM-q1>l4K>!VQiIPNv=w`gV-w}7O_=AjIIJ3%~b_YG8`F+xmAg}iA6ja zndupDPGU}Knr>o|US@HA4j(c{&k&VsgvvGMfhkVQ%u5tN=IHq(<_e(;=otznrDnK5 z3Iv#iXhI;9(1dbRQ!>R-HG+inKz@+HA+A@RnUX4tPqGM`ksw_XSagBJi_n~vnU`52 zhN>1Mr00>Cfo3#V7-R%@Mq&oc-~32yy~Lanm>ehoc%gD2ww@tOC773(QzD2go0wCg zX9&{^3Kp1N5L?d>g=Yj)2XYWh2E^7g;!a7-fw>IE2HD45lnQq-j13a!DNaqzgK20foXxUK{{Y;kOmkVtiA*hTHH`JSUr>tRu5%^)hA}cox}}ggVggP zvGojLG9cYB84w#G12Rh}4Ktyl3V}>UQw1^xO$cmOVPYD3qDK`1nZ=!*2+xGPNNhbr z6rK@G9Y_yM2E<0F1M}eOK#qc`1F`ksG9b6XWI$|$31FTPcTQq1Jief8kl8SCkZA%? zaS&V2F()+*CJ8bECJADLC551>;R1Sw{K!Hci5Wb(si|;V`H(q!hNxU4xKfa#;Bp`i zl2R}ip%mm!xKa>D&k$}5$W=ml`T2S28Krr7pkfkSBBBX_4CKi`;l-m}e}O0ZPh=$r*{o z8M&#cuo%T6400QHd15(C35*RA=Y@)c*m{P-prYM3F}t|52p&$NSi~?@g7l-S1c~Vx z3Rb3qT8~8tC!&ggRB*>m@Nj@lmZ&&Ni9lE(aXtC&T)1Ok;X2pmz-Ff%2k}7 zR+3R!kdd0ln_ilklard8S^{d$^1*pUpdjGSNKGuObjnFg&h|)6EGiL2m8eW`W7Zzux=dq;Z=cTixmKNo+r`R!aAT9%KO>hlH#4~?pC={1q$D-PIkPA^ClypvfLqnN ziACI?mJeuv56T9&lR<%-l3xM|K;6V5@se^-8@d=Y@|KyLm;=)+jYAw%S)=QL87v9a zlaXJPS(Tqxf-ntJ2Bt?8oK92nONvwS%kyBO!f?^j0+@?;;;v7)w7fMe| zD^4r|We2!IP*z0Yz;y9~8+|Y-2oEO5ot9XVkyw%lPH`!Txw$ZQc4Bc6l+6KF14^i1 z1t11kRyVPTvp6F$1)Lu_ic7OgL8frzLPa>sU{-RL!L7?k%z%lqgasR#@xYqB$@#fS zg2)_jD&_@6CU|%gBrk-*11sPJw}(NJd~g;-0^AM;OTbxR2?69*J4jv>T>z|%57GPv zDH2BIf|YQBdm12FJ~#^^0q%)_CEzTu1P3TGLE^kH23VN01T+W@66b@nz!F@LwmnFO zAHf7m@xprmAXy<49#{bntOEp+7ewZOr3Jw*gY{WJYQ!)^zzRjcrBg|1QC?~aIO;%Z zIY8Yf5Q7)S0ILOMN^n$zqy%A|77zz44Ub>A8ZlUm!$rUf`N4KV1`0sBA#OnM!HT#+ zg;7pUB1nM%5*sYZ1?hHyQMq6x(7=YP5rG6goDWe{TvC*uom!lc zUj*uhCJCfv78RG2*BCdr1bkW5AvQ;j^Wbg8B(;kZu8c6{Km+UIgLu6s2Z_!5q$(1+fU) zQ{X7hfOHwyAl(4A6mV~V4bp&Ts{*(6*&yceCuZh_fNF10sR$}#(la0uY-wOK*~-8a zFG`D?7o|X!4$GXTd3@ycB5`$5if{_w;wr*KwMDe1EPa6^U`$_i$peh_5`c z94S-;$`i{`tYOUuwVYVN?I-Xc0HX27Rtb&_fl4%&^Hip0z{82VGBv|3v8XsxH?fEX zWE4m?DX|FBLKA~G{ZK6hxAs8$Pe5n4LDrKjU|?XZV_;$sXJBLi?V++|NMc}QNMT4} zU}Q*RsAFJcXkeJkz{oI_VGRQ#!#ePu)K?6@85kMHPy1;aqfrEjOL4c`~ zsfVc-Y}PcU8Q}S9&}{Vr&|EdsVy2}Gj0{{%T}*vonUA=Mp&fWVD9zJ^flG{`&pr@4x?yOw25-Z0sDIT--doeEb4}Lc$`VV&W2#QqnTA za`Fm_O3Es#YU&!ATG~3gdin;2M#d(lX6Dv5ws!VT&Tj4=fx%&sF%UZ$xESOZEEt$w z+*b)TU8Z&3Odl>P^y8JVCo8m@QP%P1_oA!0EPetMouff6%35rF3w5}j2uP02@H%JGx$$1FmgQOy1>B5 zIfI{vfssRlLyv)x!-PYHfsx}C*E0r2&VStJ7#KN}IF^8Aix?O=mT)mJFmiJ6>|t{WH_+5d5aT;eA9h=GxVfdOo#B78@gjIxMgi?fZAkg-L&^!nWL5j^_V3aukPBC4= z$As%hgj!lJgzpIb073m%LT@y^RI-HL2wNydiDZDpNXNnxgx-jl2)n`IB4H*N6nX=L z!k>hBWcY+bgp*LA(gRBo^$kLAOcPYH4EG3c(djZblYb-PC-g?>6ATKA2`h+jSba0@ z6KNA^6E1*2(LWFxnbflokz-);dj(1r{&fLz3?iTt<-w&7nD~D!2ecao!v2!B3B>sS zG5gp5Q%MmZHVFT}lvVWqYpxBL{Rtrs;=}O&&zYdJykJ}~jaBSh3TW3H!~d^YMKHVn zzfWQM|A>L%|AMR{kjDQ9auWV8N^=6SLHPeJKhSNbASMO|>BSHvLI7kx5z25X`9C#< z2^>zd5a9<>{C|6{42Xu||1(kfFmVw5|8veF5DmirA7>@~f1R@j%zl)s^Z!(C5Qq)J z|DS}d0MW$a|9^542&w%)E!PL^{sR!T|K~t-{0HqZgD}D5|3|qxU|NqBRKs6Y{|8p=E5E^DKgom5_{}GZdaI3&B^Z$NM6m}WXMUlh#|2sr_ z28sViOZWfJq;2~DC2bQdeEvVl03hYLs!8~%SSK@FQYF=EK+hZyzf zYW}~<0ks?9!vF82LE0stxJG6drzF7@K^gyhQzrbsn8NgbcN#bi|6dPL^M4a+S_P#u zs1}C*n;~fh#Q*;SdpQD9Ud)G&HK0kt@pdO;-PTu@ExeGbHCnhIub1G7Qx zW(MyKpf(BPTyR^9iK(0E3WyI{840G3Fdb!J@?PT&>Ju=5*B&!5FnBjHFnF(EVDawo z?(pvO?gO3P;yn*625OT}2epWi+QT3nQy3V$=P@ucurMBDJjr;55#$;crVgelOf#4k zfn38lAKZ!uwZ1{^_{E@Bl6M^ggLe@FgLef3BLf>!s~gnXW@7ARoXo%g?p3g3X~{D( z&H>e!-fj#G-VO{5UKbb`yxkZ$yq9@z@V4^aOF9P`4Qf6-YMQ$-UZ%e44|`}5H0_iOiMtg+jwG2Xxj~M?jh=D`Okb%eR zhSwvnH(uYo8N9i?MZD#_HN1_yZM@wWn3x3qe~K1j68!%S<3h$o z3}TE+8UHd!fK4g{wavk+twq7BtmTMYBzm4;VDS0`agWzO1_qFuytx<{yagB- zyu}z8yg_EOGfrW=&cML8lF7w_5!VF9d0t`%`o0%Cj z7_1p28Qd8{7<9p|v9I5qh2wE{J$O5#T5JhQ^W(N zxc}$Fo-rl-zmt50De3>aq(@At|DX68Fr|aVGr(#x|No5YV#@!2Eo>cwk++$*gV!T( zFRvG1_|EH{*B9>)uV3B_AnYCIo#9>NUE|H>-R9lq&Ew7Ey~BGQ6i)D-;H~1V;tiug zAveo=miH2GA#XWv32!-XEpILFb>0RHObmhyDxg!X7+e_K7+4rUvB(Y%A0BY{s4`4t zn8~0Cjz2v{HbxExLvSpbfWyQR9E(AWQH*g6VT|(`=QBiub4U#1QpS}Gao|u&28U7# z13#0%|JRX6m<0cS3g5*f^#6S50VZLvh{*pZK3q)VV7A2nYoQ%XAz+bMFc}9{84qSB z{J$5y1Qc#QTukX;k$jK{=r$CuY0%WXih;pv3j>4KJ_ZIaP#(O*z~FUP-#@JaGX^0xD~^Lpj=&ASas ze(;{)^}*|#_XKZ9N?PZ=1f1Gjyj{Hhc%K1ba1I5fwL{*Ad~&>*yg9)5jHeJos`n%B zN8UHQA9;WCe&hYkhXD?`e8`0&J}@Zf1A-bpAZX+Rfi^yFWWxX-DD*z#lj4)&ljnWO z{fPS=_d7mO-p3eWZs_6&^Q_{h0^ z@@DX!;XT89kvE&$4|f4~0q;}Zr@SwCU+})>ea-uh_Z@Jkyz_qN{lfc&_dD-*J{8_y ze42c;e0scpfkSAT&om!4A2zpt?p*FBV3Nz7#of-G#huID&WFc`$0x*Rfsc^S0v`z< zIUf}tEgvnPRX$oiTYUEU82FsGIL?nF2Oh3zT|%%zWng*!Vbs@e0oppG_WX zJl1&Dd3JbC@|@$j%yWa!9*<2v$2@m=?C?C|dBkI%$3D+*15;8|3lGZtP#<(qUTLPoqE!-`9(|pss zxO|Fy>U=7E>fBbjt@17KX>r@YQ0X%T4p;c#hx2?85LM+KA56H(2LTbX$9zEWf)51V z@_9!9KJh_7RJA{RpwO2G3uN*|KxBC_pFRdg2I>Ewg0vVI8UFqM5%G_Kk+J&!rywZ? zMusE*-v{pj(;q{E!1Sje(8jaU|DOVXF_wWy1||mS|MT2z7^D8bi+;zz#Bk*Q)8Gz< zfB!!P-UIVK1zup({{JZubeFs9|7-pe7-s!{ALGNY{r{2}9|mRy>HoV!e=r>Q|HSnl zlhFSU(Mn*kYyKIGod4fN&tYu+zd6_iEOyBE5<}?!*TEAQIsbnNeZauXSo;5cunc1v zn5+hoV6l(E%NWc4e+lMbtOk(`%nV2Ve~nCG`1k*3&=)4v|5s!97+4sX{$CGvV37WQ zGNOoK`~SP%77PdezYca_U5lu>JpG zZx*mTXe@NY|C13C3>*KS_j|;!2~2JVlUu;#RxruV!1RAfG|2vCUPl;0|9=YD#&G0+ zZ_qoi-vk(={{M*1VvPU4CIHkoxepqzW^4uTj@|bEE(3_q1SbE3#qKjOFqVQ@px*og zFbgCW4BjgX5(DV~sbyw>@)+a6a!_$bR~V1c>;D|a(*H*om>K#Q7(jM_L>QPsEQbFK z3}9EVz0dp7&iZ(!?5N59EPp`=P`~NhchQam!HJ=3x zX<(7||93sEFiib_JfH@Y8zN&EHvFIK@eGtFB4Zf-|Nj;!#aR0Pc4Q1=+5eZJ>lpYL zHvWGQDa5b|Ol}5~TfpR2FuDEz(?}+U9sj?FO=8#yCU=3!-C%MLnA{5{_kqd%V3MD) z^#8wzHH>9ovK&lSfXPZQSp_C*z+^3$tOJwvV6p*BHiF3}FxdNENItB(t(ESX)kTeL6$r=U*##-=P9|L1O0|R3N0|R3t0|R3d0|R3- z0|R3VIJbaKU6x{CV31{yV~_;5gQXd480;A28A2IC8I%~p8NwNq86p`X8B`e37@8SW z8Cn@S7@QgU82T988KyGKV(?(tz_6dekKsPUeTF!OR}8Nh;u-!k{AWl2?J8$TWK?EU zW=LlAWb|Z6Vf1D6Wk_W#Wo%(cV^U>OWhi5iWMKM#FJJ-#GnixnldNEp4NS6wNe(c{ z2`0I~BsZAk0h7F7k`GMsgGm7}DF`Noz@#vk6akZ>U{VZBii1fBFewQprNAV}U7vjT z7?}TqNER^33MSdWBs-Yo0F#_xk_$|7gGnAR$qOd=z$8DI6abTgU{VN73WG@zFewTq z#lWOEn3MpMl3-E_Oe!!i{eK_Ez`zV9S->PKm}CQ!>|l}uOmc!rE-=XrCV9XlFPP*5 zll)*(089#kNg*&P3?@auq$rpa1C!!lQUXj$f=MYbDgFPoZv(@D|DU|e7|Z_u^i^Oi z2a^?GvJy;Ifk+0B4|e(dVPO6bB3ZyBE0|;hlk8xU159#)NiHzS4JLWOBrllc1C#t< zQUFW}f=MATDGVk>z@#Xc6a$muU{V51N`gr#Fe&|ix8Fa8?f+i}P5{-)_AH=UIYfg= z_5UKTElg@)QWHcnC^9hp-|Ibxff-D)fJs&`$p$9b!6XNmQ7|b6CdI*|1elZrlTu((`u}Y2KMbM&uY3PtIP(9DpAW7|6PWX|92Tm|KDXO`+t|A{Qq5s zivM>RD*xYQsQQ1Gq5A(_hMNC(8EXIEWvKgqm!bauU52LrcNv=h-(_g|f0v>C|6Nec z1*(-8m_WG)JQ@Y7aWojD8EhHs7!(*>7+lb5oOp(K233YMhI$4yh9-t)1_y>#hBgK# zh7N|w3@+f>CxBrC!v=;hhHVT77{VEjFdSh>Vz|X{iy@ieF2h}h6o&f@4;WIxwNg66 ze?|s|3`RCaHij%lZboi~Y;X;g!>Gcj&XC8b$*9Rt#Hh`v%}~tf%IL~a0_ zTfyY^|7$!hFqkkf{Xg!O#~}Uxn$si(x&M#+;~3<@qym^!1d~c&QW;Fzfk}HX=>R4j z!K4$IbOw`YU@{#{W`M~|Fqs7=v%zEzn9K!}d0;XhOcsF2LNHkbCX2yj379MelVxDC z986Y#$x1L;1tzP(WDS_C1(S7PvK~w}fyrht*#aip!Q_$u)BJaUdUt-u7)$>jum{zY zYyCSwJw3NPCe{Bt{WX}>z@#RKWQYdk8iu0`3=GE@7#NN-Ffg28U|=}Oz`$^dfq~&P z0|NtSR_iPS0|RI-@;n0r!vzKghKmdg43`)f7%np~FkE3^V7LliF~z`eoq>S?bl&kz z1_p*(3=9mn85kJuKzce1pq|r11_lPu4EbXQ1_sb9H0aDm&^eIL85lt4f-}5gU|@L7 zz`*c^fq~&I0|Uc51_p-r3=9k(7#J8nGB7ZFVqjnZotOB9fq~&G0|Nu-G{f%<3=BUQ z7#MysFfjaLU|{&oz`*c_fq~&KXh|CA-b)4sMkWRZMrH;EM$n}atPBi{+6)YgIt&bq zx(p1AdJGJV`V0(=1`G_0pu7EyK=<7-Fff`hFff`jFff`iFff`kFfdv$Ffdv&Ffdv% zFfdv(fL16mFxoOOFxoLNFgh?WFgh|YFgh_XFgkN!6YA;HqT#&oRjTKWyH{AP*)Lz@#FWR05OAVA2ju+Ji|4FzE;; zoxr3sm`nqc>0mMgOlE?~EHIf3CUd}KE||;%llfq>08AEw$s#aW3?@s!WGR>|1C!-o zvI0z2g2^f{Sq&y@z+^3$tOJwvV6q8JHiO9)Fxd_!`~E-m;9xlNf3b%XWAOi#_8OoO zVfO~c`2U++q8QSKb1njp0D^~T2Twf?>SZtzGxn7}oMQ&GqN-JAM6!*1_okU8{qlfVI8A* z+k%6&)I^U>BJw3lsX7{?=rhm*+)oC#{;}m#B4QStM@xrusXJ2gC@3aT@@e^KtTHe# zBCiyoM?M9uG(sO~C#Fs%BCn#vZpCQq4nXXZ6SE|=mPTWk5i}b%kS!+~=3k5wI)dTo z|DPHj49CFaaWHuTOr8Xjr@-WCFnI<{o&}TVz~p%_c>zpb1e2G*+_`4~(-0h3R`O#TItj0|9s5lk|H zNoFv~0w!6(q&Aq;0h795QV&e(gGmE0X$U5bz@#ylGy#*QVA2dsnuAFTFlh-Ut-z!; zn6v?twqVi@Ogex`M=CeMJ$vtaTZm^=?AFM!F5VDb`}ybLCnEVVTzktcFVDcN7{0=66fXSa=@)wx=4JQA9$-iLo-~S)l8H@}dHX|dLWCD}S zV3Gw)vVuu%FsTD3b-|<_nA8W824K<fwNoz1^ z114?3q#c-a0F#bj(g{pDgGm=K=?*46z@#Ub^Z}C{vK~-q2chis5+kZg>? zA`p~K1Cv#;V+G4TYyBt0sF& z_KNHaFuW)GLiUp!8wkq&kzoQGh+RLoI$0fTbOdWmgXI~CvxxPdE|b`Gs*MFcgc&%E68if+sT{A z+sS*#2gxVN=g61IH^_I%Pm!M|ze0YK{2uvZT5MWk@)zW9$v@E&lYb}wLxD+wN1;kV zOhG|GOTk3JPQgQ=N+C!gMj=h1Kmp{BKCt^2DQpA#VH?;V_Y_VkfPC^ou}m>X;gced z!XHH*MKMJMMJ+`WMLR_g#URBp#Tdmdki24zzmz1DSd{pbB$SktbTr>6nJKwxzEKL$e4~`2l%f;`CRZsfP|8!PP-;@@QJSW- zN@W&i z?oghjJV$wr@*WirJLCrHAv;2$_tfGsyr%xRC!dzR25XU zR83UvR6SIKRAW@rR0~wAR9jU0RJW18bTUY8ZsJc8de$x8de%EaJWaKLBmfYLL*5dN25$* zk4Bfq6b+CVgmq10p2iA|O&WVNj%i%ec%bo0e*c@|8b1C!^$q<`2b8l1e1@zufgOSF!>ftz5|o*!Q=-p`4LQh z0+XM?0)?O#T9szro}mF!>imGBSWkMli_)CYiw`3z%dDliFZX z2TbaMNj)&B4<-%3q#>9z0+YsI(gaMJf=M$lX$~eWz@#OZv;vdXVA2Lm+JZ?tFzEm$ z9l@j%m~;k{E@09fOnQJxPcZ2NCTsqGRY_s21(S7PvK~w}fXPNM*#st=!DI`FWN2lO z`~P00hd~}pDu78vFsTG4mBFMPn6w9z4q(y|Oge!{XE2!tCey)W2AIqQlUZOg8%*Ya z$y_j*2PX5uWC55g1d~NzvKUO3fXPxYSq3J{!DI!PtOS!)V6qxa)_}=cFj)sC>%n9b zm}~}!K5~r)B%&aU{ViE>VruG zFlh)TjliTam^1;CreM+xOqzp93ovO3Cau7vHJG#kleS>e4oo_LNk=g01SXxqqzjmI z2a_IP(i2SjfJsPt1Fh7BI;QCbhw&4w%#hlX_rM zA50p6NkcGc1SXBaqzRZb1(RlA(i}`$fJsX*X$2;&!K4kCv;~uPVA26hI)X_jFzE~? zUBIL}nDhXXo?y}kOqTw?CbEIC?Ee#PBgS$tSpg<1!DJPftO2X31(S7PvK~w}fXPNM z*#st=!DI`FWME+6YG7bsVvvBI>LSY^3*EUX#bC=|%OJ<#%HYZ%58k<{0N%N&2;M=X z1l~bo1KvSn2i`&Bz%Z3z4ucQFJcg|dAq?9Y_A}%#{A2jfPzv4=Qx4t{Q_ZN&Xva{) z=)ma8FoDsX(Suv$9Fo%JeVIISJ24?WC9zlkU3|kpE!7gKE z_{Z=MbowmAe+D72`?$dF;{v;n5$rxju=^On?qdYIPZ;bz7O?wR7??nN4;iEwm>J|4 zlo^;9>=>LGn80Df#L&dh!obAP&d|=lgyb3)uxnVruHk{YW*fsc241k6K>MoiFfcMa zfS!^2mw}OyfsvJgkx`jZoq-+fK6beKTo^#^^8}xl>%#zXA3Jz=5g%hbV>|;pV<}@P z11n=0V-*7zV>M$n13%c^tf2d88Mv7=nKT)=85qI)Iv5$+LCY=~tU$Zh|0gqCkjVn^ z8OsKMt8UH!!&SsHG)JK*}(43XJ8QD z0Aopk&N^lW?cb3C?eb@4=wM)w0`2MnvG}Btq>31r8D{+dC$&xT9RoANOa=xi&?%G5 z3_BSZq(EmRGc!D3@)9$WN@8GUc*1l|OhZb6ftewPsZy#-Y8?YJLjuz_sVh=@7?>F< zm~upJNSc9JH-%nFc7XC8Q;t-RBq-#vnO;kFNtH1$GdyF;k>Zi$V_;@@$y6<}ObT=+ z#YLvMf?5*47?>HZF)f!Yk_6@3-Ar?()FhrUFf&|dIwBb-xr2e3;WX1k$#r1Aono3M zktEr|z|3%vsYFUo%7lTLVG+}0p>L7`49pC#nc}4^q(E`^hPhr!PZDIxGA0?J7ZRXz zad$J#6gVS!gMpc00n=MaJ1G_hW`-3^uO(AJCNoMg;s#p6uN zBz?qUz$UL_njtZXftjI{X^YSd$wLf`|8xG&V_;;o_`i&Sk)aoyHuL_0&dK}m?+ODW zqf$@mjYE&-D}KqSM5|5*&ojH>^aNt_b^g*!(JA+ZU}`oeffVugeg12e-q#vS4yA3#_j_kdW3#2rBD7!8@!BtSWonc)HB zBH<+xap2VGAUsPPlzwv zRx&P}3$kg0tipm>IS+K4xGL6JcOx zj05f66WheV%vc0wtzckgn9cY_tPK>`OiviUh=NXGWoBw+{32Ed5@YOSjunHHWYd^q zg;>C1!pyOvp#6o+48It^h$V^s0jHubqM*Ht%nVx?zleg>{X5H~$G{*8Dp3wFei17G z>1Ei*_(eoTw1a_}F`Ds<80ZvpX2wXyFCqfq80lmDA_h7`mzkjll#WFcz^V6(DCqon zW>C0@g7zdbGe&||!-|4Z?{p?LQBb`GDlOGSK|2$f8A6%VM7Mx!V_M7q#&>3S3i1f!K_jK_o*SNQB7`#Ab{Hkxbz7 zj!7KEX1oX@84iQgFsui$8CQZxhVNjJ>tHekB*Mr7BLC-rNJa?|$?yzJeg%{F!7A5* z*$=_w2apKkD-g*r4IG+L|FeX5fy2D#f0i($W(0|KfW;2~`y|2#VllG*`y>Lc0YEMi zhQ#5o|5+j&U|E)bpM*j2#mu<#f0hX7v{zp)fNV{?8Hyolnfnu2yn{l#3xz##O8ftisH%=!e%wM=S4 z;MN4w6DBpmRUq@2TA9>@K>LcB8KyDY@kM~d7=@Ybgupe`zXQy6Lg1Xjc!Ehy=$8uJN zFsTWpfmsik)P%q#2*WzYFM{A$W7xu^Ch!lO%Wg9MWngAXW4g*=BACa(%*4l3Ez~3= z#=y+@pV?WEK~R8!nW>A(OQ3{9jDeY{hFM5(iQp{;W+o@bMS>}UptjKm#zlf@f=?Kj z8NM?v5|jYRGUhO}3F>h_VPIxl1eOJr*x`(e1b+zbVPIxl$f3GflCnFQe=6@Xew}reHrMqe6Z{IK(1o|ou|#n zxE36ys{dbs+6bVKWsLiu$iu@}11{YectHMRW)f#$5Co}b2JM{|fUu_hmthZJ1C{;l z3=I6BHY_vfG$B4vPk@;*;D4fk5u+IcGh+Y)gMbFeMU27!b@&tbZh*=_1_lAJ4;ecd z7&v7>vJA8TC-O5ff?9C185sCLd&8MQJG1#A=}z>&4u2fq90q1a(f>LEQhbvbm_d8C z`4vEV880$0@PJbcW5s_R{y%)6a&{>L13#obSo1%T+lpZosB~pu;0C8V#=i^ESF7w5Q~9n#ReaQ}^Q3IhWlxYh^l^XGwtyEX#@59oveW`>&o&U|?+_ZXNNIvE&Pz_G{h^xtou zGkgXN%nWD#|KyQk0hdDmZTKR1elRdIEM;Ke1@~nc-57uJRq=vq;(h;_xT1JZFfcPr z|L@GRilq;nrsBEpfnxyFI02^#ZgBntwQBf;z`hA$VBi6#HinlB47}hHl5x`i2;M1R zeZt_FoAm!DZwvE024>K?2t1&34nQ@qHjfJns0IC$fq@gW4~7}!PZn?sno;ThPu^L~ zISkBI7vaI91!aI+FnK736G=~fC7Y1fV4VGT!4BmAN%#5il>zI3ZT|lxdYdF++7cek0 zu4iH6HQ+G;<#*;A96~%?49tuI%)fbbxItpGSqyo>tp>&nmigS1ctI&ppLq!b0}lsS zM;rSCUQl_j$-Ie~h5H->Gh-U_Wo8X-E3oW-_Cq|^z^qpG9Xz16OdQh(_H{hqwj=XJ z_9bjZ49tx4Shnyg@O%KPyTm?$=L7>Y(?q7nTyi|K7?_zZG9Tl)!3)YowoF%fbhxWP zVa0rc=M*<6M^9qD!_dS9N?ElSd#D}f@3F_fj8djb#0d`0HzEMDB85-5)h^Jy*_W{|IEFz@BE;ReOe4CZt$BW?!< zX2wpYtIYejJU}Hb(^YO4E|B{=nfEfU0?9JmVLr;$#0BcZ%wpch*~Ym5)DB=i#aY7z z>doXZPv(<&D;ALE?G`30DNYS8HU?(K6j1zd zf^yDH=A)c%xb#3{7)+0u8Mr_t#6_m7Y|A(s7?>HaGw7a2cPS7aUbmnag3?Lsdu4dlG>c+*uz|8oU`6E{VIHpv=F|~&IFsly77I12N#_7fY z%KtA}WVqBA+!&Y{H?kCPZsP*=Cu*4|Ffec!fNBlqB9>o_ptivp7Iu~oT%fvf4GS~N zGp;lSX2x>nxeQz!ppsl3Z2lYOeOy7Dpq9@XraLT$I6$Xz_A<}qOyB^;$QI`P3|t(b zI#Ld-`XTdd1}+Xz4pRp6*D$YU>Ei^|n`@X0Sz0(jIb|)#e;iE=%#5#@_i?gufYRw2 z=DjRw%%F6-h9#IKhVuo;r%YGbKX61bFf)oUU1e?K2w-4l+`@E~(~1M+vwY^G92Yo1 zxzU*UCi^CKkgPt_V|F)AkSPqz(>dZeKsiN^c@xJmjtT~5#w6x_3|t&Wppz!SZc}Hz z$gzL}lwy^b4|6f(Fk=q_ojl5XlhKat8K?$i zKEsQHvu4ELO?E#|{eD4a`TGe{g`xi~^>|?7uibC7Ctz680Q+P)%0B ze2iU!9aQ5lWnRo7!3GMQ0_IKZm)I{cFf-;eSFopWyaStegnb{o7nHSy9aOetGF@eV z#_qVlHQ&!vRvA#q^MU64-^N%!?R&ICwxkV&)@k zXV^fwHH*27y@dS@SjQpuEO5xAGF@f8#0Dypmoo2Q;9>{0**Kx*pJrPEc9SufpT?Zd zmIC&R4pRx+B34lND=_P^GO&We-;`-GYYQu=bl_yxVHaWB#lXyH&K$<_hz(Q{crd%O zGq8iwa2wN6Miw@Ze@vMcu?B(Sgy99#E;cJRP^cF%ePG|lx(!@ny0Ce%gT^+6n5x*a z*b2ZUW(2DO*sZ3F8(78I{(;6jnW|Xo*g$ct#x#%h2ph-+rcAvoKiDi7m>JEO4B76m zfzp}<<07^SHc)CZW9nu*!TODXnNf$?pY;|iD30x!a#=0dLH*vDjEh*euz}L#1g12$ zS*)Pi`zuo}%Lf*aFFBYdv#POz%8q|bvsrmq*cg}@{xOxaGO>Zm4tAyz)-E>C$cg~d zWR@~EPzXse&1RKj1?8DUreh3Ttf1P~2OORPOp928SV1M+A*S7|r&vM$_htIXwv7ek ze-UOEwtZ~N7?>H}GF7u?v4Z?Bz!b@%zzT{h0j4?@F*XfQ4avBHg@;WAG$zDU&0N9? zDq|U$=CSNz0o6(ZOufwSSV8_5U@~NW!U`(UrI_+qeAqxEDTf#ru?n!JFfcRfF->OK z$9xPFXH2tLLRdiQS&wNE%PLk-j@4t_z_NgK0s}LnE>j(|9h(>fGebQy3ri2kUkvrk zZ&;c@Z7POl#zo90SV1FNRZM9t+gLzjxXny0%v+d2J-}wBDa@;wK_h7iOgSuXm_a?j zW+pG@X)F;8%nZ#;`OG~mpz*U1rW_U-W(Njlh7zU;3|uUreuo+;#2A{H>X|c`L8HaZ zOv=o0ARjU`GNmzxuy!#pGxRdWvwUCyjTQAUcV*!nS^)O9g)?wCR zU}pHsxQHc>B@cA=F!K)vE*8*i13%dO7G_ZvHYU*MTQ{>P(?2FqJS<>b#3aW8Dlz$) za#?klK;?iU(`05ZW>Eh@ktvOtfdw>%BEh(lrHBcXs<@a+nBFjga+xsGWac0yP|T$; z9c8v)2Gyd%OpBQ9m_INuGaO~w#lXM}Y6Ar@ePB@m*~=)w?82PDa)^PM;R90@ixM-a zjUmhw!OX)9$_XM&H<{CzLGdrb^p80P)Rtr9V#;8uV*$+{JYlM0;9>@~G7Uh!VPs*N z$H2u58WB(d^Mx5VFdbn&1+M$6n0_&XMo@*BdYLvbgL0z?lOZz~^BM+bMs~(U%nZza z;FO)lBn0-8EK@F{8w;qslVy6xXv3nzz|1&>aS`(>W;IYgVqC;{ff-b$YBMfkJjN`< zz|63YDUITPYGs`f5+5;CDS27DRg8aFWaS>Aj6DSnKm?kqcF$#ct`Lh`+ zz&;XVTEvjY1WE;;n5vk1m_Vg~C{qN}H6~Dr%ga>4_=O>WftlesQx)SGCMl4AndUJC zF@Z+9f|;tARxp8bvM5t8(-KBdY>F`%GRQGa0olR0fkA|+3&djTX5a$#(iqIaAuG?6 z%kT;my9~b=7cu292{AA;1~D#TsAA$^U}p4WN@L(+1dS4zfmH`FO<_o20F^p{OkNBx z7(w-IFJG={x7CGP#^1p?KcIJ(qPgbOuB%{U@++fCjG#q zHJB6tlZs%{9ZU*>NqaD92qtsDWICA41(R7|G676Rf=PBTDGnwB!K5CT)BuxSVA2Xq z+JQ-4FqsM_MZhHJ$YTbE6fip*OlE?~ATa3$Ce^{DFPQWIlMZ0g0!)Ih9%T>$v$?@! z7?_L$lc8YJ5llva$#5_k4JH%8q$rqV0+X>|k_}9Hg2^Z_nFc0Vz+?uPi~*C$U@`W$25cK9n&JFHH?3lwlV%;VqxN85@C{IQeo0zGGRKvWW(gbI4}i&IVDb!@yaXn1p22Zbmw*Lgce zDKOXh`uiv_M+Eu%DlkWcfMn}Jg1i-&LAT&CFfg*c0Np;tz{m``3jlOX;UCaFNDPe3 z*FZO2F)*^rL1-4x4Lcz9pc{=qvEeCWr69XfQ2~?i~l$L|iG7PMs`%IZ3_g#X_ z1@l=z_r!wiV}k0JfT(Bs0ijtzH{XKfDfo{rTU}T1x$D9P=Go69TuYl6a7#Kl!pfZ6*$-%dwGS6aQ zgo>?$vz~$O{sOB*uETDEC$Q?|~i-Vqm@m_+(oq215p81_lNe237_Y1~mrIxG3n>SS|)0a81I>AjBZd zAj2TXpa{MVmLF^)Xr>#agN*@n7cT7nTVVzfuo?j@YPcDQQN>G?D#VSu_-y1N$}AqD zRB@uHVq^i$r!lhBfKm?&DE~3C@qyW(_A4U`sIAV(5&;rnYXOlgZVc=Uj4TFVwiYO* zvGg$TF)*@$R<1Cz2r+OmfJjCbI|fEj{$R0TU}UjkU}WK7U}OpU|DS=8#qIxJ21b?y z&`obF84OHJEKIx%j4WvkOe``i3Ji=aDGW?3ek@W9Oe{4F%uHNhc_tQ6t8otFa>lC+ zOe`@BOpLP`XEHFc1Tio%&SIRwz{pa?z`|n2;>2RbV#mP5Qo+E&IG1rg;|j(b3`{I# z3@i+j8D=s@Fvc-3v6L{dFm^I_fiMFT3#ctMn{g&1XmkXWSC=p_f?UA>x*wStbgvyt z2n%SWTabZ~K@gOSSb`WBnL+dIj0_A6;tUWq9?YQgSS1-486?4K>=+oCL8BHRHQ*e_ z>cPOs3TnrKMAX4*%orG1LF2$M5e5cERuu+DHXCqm*956y(_&y`1&xq`)PO}mVaf~| zu?2~MR&Fpd|6pKb2910oL_RPuGJ(cWK_aq{vXp5O10yTwc0C3LRfq`lCI&`U(8>ph z2&fcf1eNBXaZmaI#Ue;BeYHcjXZ-~(Z|5doWbnJoB>v=%)rDV$H2|l&$yg%CF2Rk(~M^sFEHL_ zyvO*O@jU}0s}zGM^EBon<|5`Y<|^ho<|gJg<~HV8%w5cV%+r`BG0$V3#ypLA7K;q? zJQgJeMwVB^sb~JdJdgPw10%}|25A-z79AD?784c=78@1^78e!|79W-XmJpT-mI#&@ zmIRg>mK2r@mIjs_mI9U%mI{^@mKv4@1}3%u1`Tiu1f|PPMghhyQ0j!Fb|wiXStdCq zc_sxW1Ev*BtC-d>tz+82w25g8(>A6ZOuLx&FzsVHz;uY|DARGKlT4?X&N7{6y2x~y zfsxIR!Hs1C%MF%$EKgWou}oq4!19gd4=WQZ2P+?|2&)v!3|0k}Ijm}|I;=)43s@~! z?O0t{y;zp82C%GP4P#lu8pE=IHHkHYHIKD~Wedv=)+$B=)&|x#)*jYLEPGgIupD5W z$8v;q3F{|D6V_F%t5{C3ZeTgXx{Y-Y>mk+?tmhalSg)|&Vtv5+jO7CB8y3)AmW)i` z@`Oo`fsqwdA2KrafXWU=PA~~tkH*9}k?|_1G+>;_c$tBTNuSApfr<46E2!3GWQb>A zWIe#Z$a;!_k#zxB)l}7n(_!d+eG4V4&@(U9qC!+)d6Ke@8 zsBB|m;${Nf1<%BI8DbX`Ka(H>BjYg!unCOc7?>Czfl?s@6XP_-=^!(iIH7u&8Rs&t z1mDle$OLKuFfy(L$%E7}g4W-$F!L}=FiSIoZZu+HoWr<~aVgji7KVuoGZ@1dV?p%5q0k5`WVw?k(X9B4N`{)@XXdN39^cGM?@QtBNpxcZVdis9LFG2nSi8C=yWdwyfXm*kbe6J)ZSA*^i zoxn7a33MkZD^mv(=nl{spt~>`L>YS-CowK$T+FzXaW~^$@cp6Z7_TwjWW2+8pYbW< zb5O`LeqsE^_=ACwaRmb-$SsUp85kLNGB7gkXJBMJ%)kipFXKZ7M#i@cpnE|XLHCb> zawy|c21dpW42+Ch7#KmTtr+(*FoIXofYwvqXJBM}$-oG5E#nymM#k3+j0|E-%b8X( zt!7%ww4P}r(`KfvOxu}uGVNyC%e0^AAkz`1V@xNQPBEQfI>&T@=@J7Y12I zU{{}EJO_3)IHfSoVVcOm#5jj(0w~78>}lW>CC;Qzq87(sb}@dpDF<705D6(g;jU=U@T!Z@FC0pmKxO^n+ZcQGDdJi>U4 z@gn0*#z%}#89y?9WBiVks-+owq3TyLuEDA2Ge{TXFUCIzos7Kz{vQBfsyee10&;S21dqT z42+C_7?>D)nPz~=nP74en4H4E#5jei3rvFIatc#Fm^}$hc7Vwq1}4V&Ox+Ajj0?bV zJfEqPfr)Vylmw|+#RO8n1}w6M2_&+HX$b=p;~KE|Ixx8jEV~U%?gESK0<#Z5NstLg zK(;gUfJB&in5Hr?F&+c48IOVOy~wl}T*82Ce+0JWDcDC(nLsZ54ART^8La*@So||s z{b#UU-@s|~8%Ug43oQPfsgHq)@fQ!hC(~pG(5ghxn(B!RGZ>CAax!Xz${k1v z#>B_O556Z>h{Tl5#K6Y%gqfRxftikAaa9)F*?G3=Fyq zj0};WvK>q^FzA6>-=M3NK_kqdH3%R!s5D~$->%94Zuh5wbuc(EI504PX5ASX7#3Z- zdH?a#7oR?V`TFhq?>~PT7@3$^SlQS)IJvlac=`AR1cih}M8(7gu|>TFPLcWu~R3g8_7PbZm5Wb#=9Ljg5?uJfNwmrKzW$P0dEjNDE|`uC5^%sDL>J`uYa?U;uHxzP`SpzP=&I z)e?4wMo?gDYirBHFCbuUZf-7s1z;6a77%b$1}jz-5D*XoAyxqaR+4 zrk<*(VQ6QV#4wj(1;a*$T?~gA&M;hMxX18};XT7IMrKAO zMs3DO#wNyY#wm=m8J94wWjxDxjqw5FOU9o}pq8o#lPr@4lQEMWlP6OMQ#?}!Qz26o zQ!`T!(^RH;Ov{+oGu>f&%`CyJ$gIU|%xuH#${fa=#azr>%iPA?&pd;9G4mSct<3wF zk27CjzRCQEg^`7eMV3X4#fHU|C6FbGC5a`QrG{lP%W{?tEIU~au{>aT$;!^E&1%AG z%j(7&$Qr|%&RWD;%i6};&pL~BDeF4c?W_k_PqJQNz0dlJ^(z|#8#kK>n=D&ATL;?& zwwY{8*v_+kWEWw#V2@)@XD?u{WN%^bWk1Azn*9pS64oH=|rLOEhN(m0wq zdN`(X%;Q+jv58|h#}SUR9M?GRbG+jC%E`dV%_+vI$f?C?%$dfS&so9Q&N+v3Dd#%Q z?VJZVFLOTOe9QTb^FJ2{mmrrEmok?QmmgO+R{~ci*L1E0Tr0V@aP8wd$#sS6KGzGb z&s=}GIk<(n<+wGujkvA2owoudF^=Jc>{POc~f}vcq@5Zc>8&0@h;|F!@GrdFYhtl^Sn3s#Q5a--1t)X z=J74(+rYPz?-xHazdXMNzahUBzYD)Fe;9u}e+GX6eeYR{yF?h`7iR{6fIz%JufQsS%>sJ_jtIOK_#!AKXd~z<=qDI1m?W4ZST5Kk z*ef_gaG~I8!EJ*31dj_|5WFe)MDU&9Pazhe0HJ816ro(9l|q+=?g%{<`XKZ}SVcHM zxJG!g@EqZ#!fS=M3GWyFApBE=NrYQOL_}63L?l%tPo!L=L8L=usmMB!?IH(6PKsO+ zxhwKi>Mw0H5agsTbHIlO>Pe|UD zd?zI;WiJ&aRV39dwM^=;)B|ZQX50-Cr7uf=mJyV3k*SoKDzirBzRX`) zFPY}rM!i)44m9+15y`%R8XPG8PaE=8_iZob@cxv%oF@}BZl@(bmU%fD0LRxnbC zQCO;QL*cigp<nfKi*D9Y>{-a{3lBLq7vOs00$_16zs!Xb! zs)DMrs_LpXssXBbsxwqqsP0rfq54+!znX%YsamvJv|6Ux1hqM8$JIWnv#IN=$E)Y5 zZ&ZJ%{!0Cu27`v2hK7cTMubMQ#&nH^8v8V!Y07FEXj*GVY36HA*Ic2wOY@VKmX?v0 zm6nrMq*kxiRjsF5U$q&u8ML{z#k3W)Ewlr*+q8FUpVYpteP8>f_DAiXI$S!^I^H_f zI@5JF>m1ZMqw@v?b-i`Fbm!=P(X-X7)SITaL2tL-NxiFj&-7*VRrUS!>-Bf(e>2c9 zh%`ts$Tes;IAHL|kjYTa(A}`iaK7Ow!{0{2Mmk3JMs7yoMoC6(M)Qr<8l5(}Vf4)C zyD^8cjIo-rw{f^}s_`u2-Nye-;wgq{Cb=fLCZ#5&CN(C_Cfz1eOy+{&5)%kqZL-Pa zs>u(N|E6rFN~TJtnx+P(uBK6@S*BH{9i}r)7nrUv-C%ma^nmGc({rX*P4AdKHhpFK z$@G^Qvze@!p_#3jr&+LBvRRH%%)`)NoO!Bwj(G`ISZ$69o6MWcJK=Dm`3&><=F802VL}In2GG0$Xcay0 zhrj=M?tbJK7kd4Rh2c+Q10xq#Birdm48MNey44I($Hu_G#K_3R`1cQ^AgajwKa7$P z5ztzw2IlvF!A3}mLUlq!KfecyUX(-;eSaA&Dk+RA`T-&;h${LTB8u)Jwm*zw$o6ya zfz|N|py>Y01{S?2h9b&w94yMmhbk%r5&elO3h@Eoe-zP8@4#xgxS*o2aQgg*Q2^p9 zB$11#BA5R#@}r7;_`}GHD#G=Lkp)$R`46KEL!d7rx!fcZL!}uMd0uuJJ zkQn(chvvrDe;BVq)Pd$vBsj#x3=Bj?4GhG@I5;@iI5dB8C~bi9y1QKR)~yk(Za3l@t;B@q?f7 z+qZ9Q!itIltY5!={ma3tsK_AR$j8mi!O8IJFN2tbxF8QZQ?oF)gakLkhbK>-NT{hv z^0NN;`0=9})HcvKw-OgWFU#NGKS1Ey*Ka=<*jT^)`tyqobViUQ=RZb<-waHROl<5d zjnd%G89Ns@H#avs`-A&Wo;-Q?pMy_UU0q#U3u+=P+`cn2azNY<6JcV8g+40-149!7 zb0Z|AL9<36UIPO!ni=ny89zYGFlS(3koxh1n@>bkOiWBfn4d?Ho$1?~H*a3OXO>cA z;A?E);O6G$;$&rFWNhMAS67$gW94N0^z`Y|W|Y_z=4WJtmD&djF3Akx^ta1YI1 zDL%$~5LNsP4D4)-Oklt!tSF=?{DYf?`-#Ly^+ptPIYHMYqKN$FW)y;$0rS5IHzPZ$ zh!8g{T|?5Apa27RV*?{MEd4`7{|kXdFQVo_iA!KnJ`SkcA!w_y-uH1Rgz|77g@aNZmCWh~gDqNuP10GH`7G`E%l{E~`lYHG3qoXj5|KYsk= z*>esKPFOheGBB{QLSmU!NKr`f2PZT46UmQ_5PJg|7#P%rM1*+Qm>GWk`0?Y{@BjZ< zd3hO`nV4C*#Fdnkr1@DH-oJeL{ksqYXCpHgCmVB<-2eX!9K3v>G|Bbk(ZffN9=-q1 z!XvAxsi~sy`LmQ1YO4Io$;bn-3+8KHPFOmHiEwkmVg)AhiIedcs;*z0jBg<#0?6rB z{=4E2#qZ(`tRES;CAk?ODnu9 zS(5QHs_9IU=;`nghOYmT=;=^W5p~xWG$f~TQ z#m)V@k@4Y|Mn(+Xe??&_f|G%Pg&7n_%!>R!1Q@y1p=lWwlH3BYc!K0RCk9cpeD_-b zW|jm40|U2+EW`I7ii-UFKNv(C*`@yc5a;GrSBLsqm4Sgl@W+oIf((+9k{>>NW@D3( zmuC=cY+w}>eD_&Uu#t89!aaKyZfyaVkl7u%D~&m^!w=cMm9k~ z&p>YO-)Ld-pBGkdz+BJ8i=I1v^TJ#UTA?h?!z(5A;lrmlPagB~N=Zoxvc7x&;ll?8 z)<&k^N47T#Kj7-8m{`_ZPX88Z>r_#5lH*Y@q$|0%rTbPZT zn~Q~!fsutxU5@qd+b2)n{e!px=Ig(I&}-E980{i9c$)`OAFx82pd9Q_A3{W7?KfC` z3lZgowBNW{QPgq@f!kypA5cVjzko&I?LtsZ(ZCFDzqO&d`tu)H?t|F!nHj8;O#{We zFA&iWuyzT|&!7LG=kLpK^I&Q|{9$B9we#;E#%~Z2h@F2SZMJWyb>-jBV3&Nmh~kpJ zk0GLLsG^Wo^fy>t2{jkeivD&6MeU9MU=x^O;Rtgl*B@9Kg^4i#ft8Kb3=9l5|Ni{? z`QyirpTGY6`_I6{%*@Qp%F4knEG#T2z%MK>!_UL`<;$0suS9s+7(nUf=KWXS|8Ynv zDJe;EGW=<56kudwWo6^w0#!O3Y^=;ojE$=Q8Q^6UsNDMb>lZgG1Gshc@6*f2j~~DN z$Hp(G4yla{7#PIG7(i(hGtG+e^L+Y-CE1F7`zgSSGv%^?1}Q;9acC*|^&iGF$nobszK}m?e3EnRMOGW(biO!Q&jx%Lr#pFm6@5D zQ%F)uQISCj)HMI|{p-7zPoF+*MTGO|Ud6C+ipL6hX=A z$FJYtzkL1iJ%)AN;3Q~gHpvEXKFBdZd!{5e6Ic9DxbrlsAIWZv~b`~Z^CN>Ts z&~%63pFcl-{NRvilmgGCNJvV{{QLXu+c#D|5g8>F6(u=wAzoHU9m>PNz{K-c2| zZ-29}a6bXvNsZz=4i;E12Ie~+7FfLrsrA_zSkP+y?<}yGH3Y4hl97=V;9~vz^XE@R zMMY@=F4o^)zI>5k5N+h;l~7h!S67zc<>uz)W^H0&<>uw)hLj^P+c-thQ_^oySa}Ci zBO;2PwuD4sEg(qR+V_h=6kFQ*FN)qe{4a`LSKP-?^G6g`8^K&4r_A^Ol5!yS$#F6$ zH#RUnfVIq^qW>YHsC9+heTXP0G!H@5{(*?1)*y1Kf_!lCW@Xi z1w>&jRL~kXT>(~5PvjpbKNlC%4^X6_MwO_DxVX5usIaiOlDsge#rEmbZ)RpD2BBto zHXcx%A)=3qjhXR311r3qfVvOn5=~J?XdfIV@?8|xwgt`ga%hSDdkQLx`5M`{T|BwD z8DJr&2x`Ip)Z}3PC&<8MBq97lM1+C2k%x;bG{T;Zfr~39hKmc5nqelh@}jqJ_;}IB zaDMZm$KY+ah%9I=;169Bh96AA+LEm1x(qs?R&o=Yz!L^}P{R_OKfvwTA79mlI6kQ= zDEwfMYGnV$%`GXx&HWA9o`tzbNDAF{X({v+%prxI%9*6l)8PvYHLOzTK9!JS6o;fk zP+O{rL8`HV0hZdVLAB2BPcNUnc=h__gKIa11i4vRSwXYATB7#0+}sQtjSUi?U%veK zn}y}i`zKGHym<4LhliV;o10rjT^%)ynK{r~(|jDTQUT`gUmUQ0BxvkOor&S^@87@w z{Qb@F_1m|fa&q6l|MHGKZth~Z9N=izyBA}tCfB*h6aq@~tNJz+Qs0#}> zihTX>V$=$ zW_nA`Fs^=7_kLR@M*} zW?*827b&2^hmncl?~iXEe*7bl8u-OwB_AY2`1!yg@)y>2g1MX-?%&0rdYPHw_wU~f z9K2i{tPD&-;*zSWsi%><)mfgKtsIZJS?Cw**`2iqKXO%s^Sb% zjV%BEeR=z?QHF;{MMp_OLPA`Khm+}_yu6eUF9*Y~U%xnn88~5mSw{v226-`2UT&6u zzkmP!&&tLtD$dHm%_RuVt-}1E(JbM{M(Kb5{{3g+;ujGW6%`ct{^je}ufJKj1SDi- zWu+uh-TY4&mR4ZCU=wB(fs|P=5iw!(Ru_*jdhY%q%=iPM3*`3(m4APJ|Ni}#iH+gg z_us!26@UN!{rw+53#c*3&MzVhDO;o(`TqT5VB--GlaP>5)m7o)X%zbS?%O|kdCor~ zT)%$(`p3>IC<*gB%ry#XusRbaA|eHA6M@dyG2{RT&Y%B`Y}`DYtY5z~aB#D$sw&Ha z76wTOa5I1T@`agO2oz#6f)=7&x(s5C`v3khutFl5pXtkc22S=r-+l>;NJxo`2yrw2 zla&?X2BnsN9H5f!*Ks?qaYs_ zgG{3wmUM)Yj36Ng^ADd4dJV-c!zhfZMob1)v%qx8$e^~dBqbPR8XFkVN;p;-2ARf2 z1_4MafaFHS+hCQLB^+2kY6+*r305m5gI>ac)MA!!GO!#0b0voi;~$7mAY~pagA96^ z2iF5B^JE$u7|>f%EO5WV%$1aZ&8!qLFff?>2344^-bqOb^CC(GWhEu4f8YPGg9`<5 zJ}wq!A%0F!Uy6D{zeAbM$=E9elajIGjOmm{zHj1Nlp&NU%wEs_U9iX3mYd7 z4-cOZ!_QC9(15vy8SV#g3K5WyS5#D#5#eY3_4_xIoSKrj5a;jTzghT&C8fA{1wko9 zR8*LkgO%a$-@hCZynlFjgruaTc-dIKeEIU@mxLHBy%{qwFf=m${o5qOC#7Ius;Z(O zuL50D#-QKWAo}^Us3_BaPEJl%h9}QozI^$KK~(hfXGmKCbefJBKg;hw3}Sp7{D1%b z{rmeb3o{ca?fz?&Vg!}6Dk>@xyh=*4q5^E+|Ni~MAs{NN#30*f_~pyb-`@nKL`6k8 zn8Bs}KSnk#K2VE5QAdLmg(4xDu@O1rrfdg83IF!Ym0J z;ewCGEBusX5JsDo!Wj8xl0+{r#Np%Rpgh#TyypjlWFvG850dYg7$nj19l~}Zn4ONMs z3JO1e|7PbEmXnhc=4JoQAk`=eZeDaEBySaU}nrA&Y;)G{6k7uxRFU% zn6HrmHam_I$2=Huj5gyU%n!>!5Z@x=PlSPifm2oW&!0ca%6}L%8d*g?zZc-)f%bZW z85kG@WaX7q<>cfQRaDfK z8ITPKiA z0*~GO{{4@QM@UjyT3Sk&hwa~QB_$a_M5}{AtWg%y(h%Y2W(QR=4B-9~qKyGH3l<{m zVz9OrC@(jG2IUxFy%v}nQ88Fq0;$o31VPHs>wYFt2C>FQ29(~7)D^Hww7OqR9xRI1 zyOCl9i=y>zc6|ej!s~v7D`7nqP!^V7+gM*$V7ncX3ES!xQ9+24)42;SCHNkh}|3`2?a8=3c1iPgK!9P>UPwvHDkvx@h>D7d3gJ&3!otG5pqAy|zfgZcT>B1WYy%@3dcXHCJY~SbQcw(* z=RjwCHkkbS_~y-<=P#bT`^U=xn#}yq!6zauD=W*-%Eryj&B?*eEiS^w%L*E@b>G5nHclM(yD@Iwr`It1oIL0QHt zsP(X{ENq1$OpSyrtj`aLHAZ->8G^>?xc)<%QbPP}O&sd#%nbj2Gl3cqfByVu5*8K` zla>YT>k$@iWPbPc`yWVq0cJLjJVuzw!&)~mHF65DHH$D2DS6a7?!X@g`NjrDc)bHt z$0iS}DHqp;g5TBu!<;?I9fVo>-9+qY!K_f%5LaeN;Ow3a1pou6Y1qBs-9R&ug zF{Rk33~pe94wGO)EO{X&_W0ys=^N$>CV1$Hf!d`C^oV)3kz#$2@At! z*g@-Gc;va5Ukh-t{Qn`x{qK7t14kpTu%m;p@PC&7!ooJTs<8EJpwgiUGzg9{;>pJW z^ED)fe=%@CV;I7}3+IE|;xc?D8dlstG(_coure4oGAjrRvw+&-UqDSENIn3&`v-@n zEb9*yC6K$n3k!c|6c&b!IKzA@pae@>FcCR;3l?HGC%nB1Qz4}U3onR@w{R5@J` z{};5HQOF40?b1fDk{M<*uMw=r1gfKXK7af5>(`I3pFcc$^yF!y$df0Jp1%3?@AJba zPo94H%PuZ1&cX1#QIUm(fsLJmi;GJ@LXv}nmG#Hhzbq_LQe6KzK}#F{aqz=NdBHOt zzkdDt`=1fC4uYBK|DRvt;++4!K701;>pw1WhQE!HoS>Bsphce?tRTQ4C?_W;$ieU# zHi`jSGb;J!&D&4E8JIYm9&|#9hK7O&M-#gS7%*rwHgf&@$H*=6ok4_`l@X#2w8D!8qK*xw ztcin(l~?3DgN7UrwC(_@V%1O(Q66SEL0aGD2+4Envt0|Mw3%Y7g=^ zNKbDASPv)ypdoJr3Nx`UFJHZU_vOn!22Oq+Mn=#!LJ<)GE|!i4f&XmcEKK|&QsTm* zTAHB5(ZtBY+6%GM5;Q_5fu>iGpO=@1iSftRUoCv-T0v_0ek zUsT;}Al>phusJl)_#!LBl16@ze$Yx6X&E^Vwr?N4w=jY1VdsU~+{EWyZlxmefaOn2ezaQSee*gXR$8Yx@{P_EejYm*KSU^Bh;N6yP2F7M^rjXar zFtyO&{{H>Ly_>hs9v9>M_y0fBpP%oZK79CINY4zO??7WkjU1P6zkmDv=bz7yS{t}D zG&H5;O^kIl;A%j3$}|#TFR^xlX4M;bC2rifaf3lZLgL1g&%gh7HZW;uNJ5Jh1rd%; zaDE20${Y9)D(^i1^!slsL@6gIEkZCfB@2Vf2G-AyZ{N6aqpN|9nU$4|OI`zFk~k=p z!{tEv4OQM0q?Zv=tW4+o_xUp;H#fHs$Gb;2Z``=i!44{7KzK6Ow>NJ-zkPQ9&;Nh_ zTN&jw+QIGwt?LGr8=xEp!c90$V${%R0%c7Q=91T702vCxmtes9tMCaR@}0I>cY- zn&iP1A*u#&Xla5yF6<{5@3=9md*mQuDz zjV)a4+NXZWEa$yZs2otWcd5n(UI@;RW;C>YS7A1bQ4-IOb`N<57^A0)D21u3h!m z6crd4*+5d!mJ=F$jvP(%Eu=vDk{YG{rg){QHD=%-+p4? z7Zv6I@s2@Qw3YeWw{PEC8AKX++4w}1G?Ya6*wlGod)aIm7?czln3zE3f@}e;KL;(O z1@V#WX_O~qPXmJn!X_RpHi2sL25xX2^IsEO1h%rth?|?6nVU63Y8q&<*UI);%$%E> z2f9WOR5x)-NH{n!fc3(QPloSJC4O~!)i7k$}Vw{G2H`upPQnd`3*;1LLXWaZ)F z6%um0_3Z0kum_o#7?>I%4p97lbMJ=zcM#zJ|NjjC|9yY^`oYaRkd`*2Oa`@RT5$OV zRN^4J49!2FQn4AEhd}z!Jq6A~pb;MvHZ~?E2GacnG8F6>y7&$3(x*?KK7GuvckkZ4 zPamA#v3}QC1UL!;S6;k-`{CiZquhgX$$lM}rOa=9ATR}Z(WhoJU*5($5?@cVAKGr{I-&Y^9|9}~^Uj{TM55r7M zOe_sN5)!X&U%7Jg&dr<8o_=j&{q^C|)kl9DL^U)t*hHiil+=`s4K+cfAcKYog9tc= zKx-GgnG5r3|@{diFpY6x%AHoe1pn6h+L4%D?L{eQ-%TQBGosSI> z238CVap!!26IG85yBwH$#I+l7YR6S3pcqR7ylfTUCaSkx#RModp^u zjY7C=&|zSZ5C>IbOiU~o?rz0mrWgy42u}BEGcbsWg6elnv#@$!1gqB}Ia?Q;ofuD~FH8VG`zC&rX@M$ox zNos&AV{jBe+yUx2Ff&QW^0zVkYY}8&<>cq)=H~hR;OwbuH*Y`t@S%nA+n44>rZ;yU zw=(=~6#4r4?b~-BJ~J_V`^C!2`sKx^*AMPKXlDEZU0nh0IS@1sRPZ(tVI;(b(F_c_ zI-ryW3LX#!HPBdCm_Q8^CKk|UPe#y&PjJEkw^WdJz^ia}Axg4|?ek!57m)YOvY0#TZx(#o1BrKzT@u7IS8 zsez8vcLrs!;aFlugMmR<2-H7hL^WCni+Ms=41t86BLjniJm_>>s8c}{hI1QbH9-!= z>D~r84F)1ytj)k6Dgv?#(*hxFOjkDuYcOEC8yv#E3=HaOpqvKURE6SwW=yjguU~Iw zfh2W)NCTbW&8J^zO?FicE;$AbF1bJaa&i(}EPuYqaed>GGcvWb5l}WV(vg!8;4+fq zk^|cw!oZ-d1!|#!iVPxL(8O}%1_LpU(A3b7mnY64kk|`_xP%$0kc8ByIMRP3>+?HT zumAtw#Q5t|Bg@sRPj5VJWVq4D_4LM5hU-_a-g*A%R}(WRa2mKY7!b)`MuP!Q!Uu;* z3DR}D(k>_qA(|Ql>kvJCXOe0W28~9fP$Qup zfo3F7^#yhwN;+nd73F7V1eMJy@{*V(sAdBbryx(GxQGZF6PBVB5<3nI4DxaepavD# zDp0c@qYRZ3VZduq1B(U&$R;toHf1m{Fo-G3L1w&IwY7D1bv2a5Kmcz8SFEvt_3uAW zngtDvH7PSOGiYcqym|BKHv>BlpAf&itSF?jA;Q7%OjQ6mFm8~649 zat3mmOt)UVc=4i<6|_U~)vM+%=3R%siZrr-hmxTbBt?L32j~=nXaWsXOZ@o<(c6Ms z59l5MkX`H$ZQs5%q1glKkwNT&_V_^K2%UToRvAJxeTBw z%}@9El$h`FDSZO#0-r|n=8cF*a|3+T4m8rw_vX!;FN}PmA|ed`IYdCxJa4`;f;Q~k zxN+m=gEx?{2F+A9vVyeVxB>1i^S==RO;L(`XLthwu>LY=go8BxctDqc9|kTF5s^m5Z?BpgIIms1apT7Qmv27(YU26z@eRYjM<9V`Z+8X8Ru z-$8?|&CEC6eEQwQ_2<>K2lwvXd-#Qs6+G3!bORPYpcoef84Nlr7K9o8gCe!Lfr<0R zjW!ky*)K4apw*)dvj2a5dhzJR+xH*8GYATEu`w}&4i4mH_{H_}9~&22bAv1s6T{!X z3~aoDA|fK+-+y@X=G_klc0o~LiC3>#WnpvepqU?bk+-k;d8H*qnj2WT8Q!XELFcwX zeHSJscGf0o7FMQz|5;dA{{3b8{o>ZGTQ7byaY}1xX-RW3ur$guG5z|*EGWRr%F4sb z{NpE+hK8aL>-VSk?%jL(jYUvV0}`K*)DLQ2iM;;H!_2~P7m_c1L3N4BU(kX{W?o(i z1tldVWhE|F(8eVuUQsC}H8nMJ-w;PBDF%hcMxOtFfBty$;O^bKFTel!+bHzv<)=Tt ze>1SKurU7l!^khE4BPPt8qHS`P!r*2WoBk!V`Bp))o)+9*qIsL-nnz<_4jXo|NX!B zf|;3txsjWNftQn$lZ%U;iQ#{fFe9_7hPt}C5bLjZ@7{g<{Q1G%yDShNh%qp5aY9BI zL2Uxge*#Fhzbe{@^f>sGegUc zaL^4^T&({TO%atMHSR+B3@n|PUc2F6%`>)hS#rOe`exg=a*H1_zg5~&LO7qvo=byilf}HGJ>`XtUr1<_Z{(S%H z)vMo3oUptATiwFM!uSPZBj_ej{m4}qWp!sxh zeSL23H{#--Kff_G<>8hvG7=P&R8?Tm1nK7CW@5T`@4*B9-@loalp2};Ff#H(N58=4 z@yIAKxHL90NJC--kzb^~z2{ie^x#zDJc;iHa31q$uD0%zJLGm z1-@kY7-tF5^J3)63s{H%; z^~>MCzkYrKrS&i0fBgRS?(4U2qT>G(|qF?>~S3^y&TU7Z2`0O$D!{QdRx)n?p&7k&#nWfI+yC`|HDpFF81# zJ$v;0`B$hq*sg{KMma^$Tt4UoMbJKh22l=9#y`9gQX(QEoDBcJy?OKI`@e4t0*&nd z+4uzbj{q8xQ~LAe#fukT{;&uL2(U2VFr`rhG>)eM8q#AB zmQqqtGSZS35#eoO`^P4tqNAn=bscEbyNQ{Fo&8&r7N@WXpMZ>tqLKr60Ek;eT0=ua zML|(XRYOBVi0j|Ke_TRRYHDgy3=WNrO25B;{K&w;z$GLiA|ffyBP76j=hN4(Aa8tQ zVC5Cy=jUc^=775al5#+E&<#AlK79D_i-A=@K!BBjxv`OhLqJ?XK|x%A16l&`g4fIm z3kiMs^5rW7Q)4%{?Es#Am-zkR!-wAtYytuTYz)Y3#zt;#ZeeL9ZEbBOX<=?;L&3U5 z85p>^KqVS8=rj^WCay1Eg@wL;?GBPoNXVpQi z0Y)YSQngAgYhE7wN`fuA2CHo|IMW@gZIA5;k=`~ROpEMHilr|W_DalU^2`qhhP zj~+aD@ZtwEn}CGmubQ1o%0a zf4zM0;K9RZuYP_1`Ja`Qm6L~q=|97NhTq?QaDDvvlYw18K!Ba$C+vJikbQbmQc^Oq z^2%yzYI1zc|G&L`%frjh%l7Xdc=z^I{`{FkKuStVfP>-Nw{MLMyp8(b{{8#@ z;lqdTf7wBiDkm+*#>vk3`}d#kUw`}u6{W149N+l)*%^L*`0(K;13Ro-0Ill-mBkF7 zA!Pzi{x^uc1SmeiqX^)ln3;>|_2b8{nZy+o#F@Dszh>f+RFvdmdd&a{;W!2c2Ho$! z8QEC=|M~IZ?Z+Q~{xh>N{rdhLe8l5_5RXepRFD%S{~vUo0QdK1p?4p?e*ewF$;QO+ z@8|d5teo8Zf{kJ_&A&On211Tc`0kdXZT{o6N5 zNhv8VP7XG42`MRVPIfjiaS4g9U%!446%!Nx^5ygAe+-Pw-@bnN{I8LZ>D#xjUq!_w zB!7JW`h|hHQHq6~Pe_Q5odryD{rvdxC#Qe_`}g;eLuAbBpZ zdayc9cr1eEBA8WGKxHr^6N7vs6Du=QBNG$+%qEaLr@Xv^BIraW1|({S&d4+_8czGFE z8X5onZ{%hK)sVk`GcYo7z*hT$`b$CrZ{NLm@#6K{w*mqJf`Wnq0u0QJ0{=KTm>3!U z{r=4Y8op)t58FuwI)_I_TN`}SfQF`)h9;P$t*xpmAfB*je{_*A4?;l^k2nzCYakGFHVY0G5hL)co zoAlnn!N(6!=9e#^g%#rB;^NXW5)v}fAQosX<(DrEl8rhF3bN8N4F5qHg5lSP=P#c< ze*73@E*lHWzdx+}{GUJnV`F9j&l>$xfZBv~77m{R-w!Sp)`v>}p<$0C_xt5etA<4xRH1y(x<{^mLPGok zU%q_*%fQ*l!NtMF!o==tb*gqm+#+&g!s4^xEeYB{0Ft8S^mLxOM}}q5ANK5 z@%hicU%wcb7+E-37?~J;{rdUkI|H|fn2?Z!l%$NJjHHx=kPriNqdL>Se=I!0!u;<( zfB*T1iG!PmU-Sz$F=+UJ%~#jfkQd?R;N@j!Wn=lr!p6$Z%gZMu!2aj+hp%7XzkT=m z+3R<2-+%o|hWVhoKSZ&)pW$1hFdlb-^RHMXyRxTc%XHP!<5f%OL zL4ci^SyNk9=)(t5*k0`V<|NH+>MO9TvLXh?U|Nm^fJluT3lCrY03X+QQlHy`wswy%fLfl_}{Q1o;C?>C_ zrY6lG+bHzw*YAJqe8Q44va+(WlEQ+#>`YDa%&e^6e*FUhCJykSD&T`P#3ez;UkM9x zGdIaGGO=;<^9q2rg^7wX{`>t4e$vWcc3u%#NV+a%U|_ITkr!b2`jvy736yV{IE59I zczO8*K(mLMnp(^pphJblxtagIe9p+g{P)k#Z{NQC{L94hf}8CH15abC@Y}bafByq_ zS$==MaTj!O+>bwvvj4t*{l&}!J|96!lo_%?k&{ON)bJ7Ef}S2B2W?*b& zVN_*SQD9|eVPR!>3_X={87O?Ye}gL+E)F(+ZUzxaUY4H^9z1yd={sl_=dWMCe|`V* z?)}%VUq65O#lXqQ_4Dh07JdZ<1sNeO4mJ?r6}bQ4`8NguB}GMXmaiY5-D6;Dv}Y0& z5$5G$`Th0l*Vo@9ge4>-c$t2G`S{_(htFTX{P^+Z^W$f4Kfe3;lYxbW`S16e4<0;t z@c!E$W;PB^4t6#cHfFv*pI<+F^!O74C!e6GC_ikKb_Zykn3}RE7YB2bB_kWJfViAI zKfiz=C^)5rghWO8*uKAh^5n_u?`(Wxss`rf=K9Jad_tn2BbkKwxY=1*S-JQbWE$B$!|Zb$CH73(%w`tkb3}!TOt3LdVX- zPDfqeSYKU4KtxpC(8R<bUHz>Qw|CMH9`3DsRmj@tGCKllj!XFq}SeO`Ka)=%j&lkb>%zST!A0W3q zLDd`+o4`BH4}7oxurWUZ$wN&|0-adLFC)V*B8oVvl$Di(Ura_xRaI3*R!o3{RYyln zT9o(Szkj@nRyHZFc4At8P)Hl{zIt|$W=H#ilt{r~*= z^H11b7g(?J6BBH=3V8H@NnD(X;0Z2_qN2_C4{?FC^ddl`2LcTD-l+(GWF+RqZ!W3# z@1-Q)zn3KToL zVPX37_3PI^OdS0D{2UBSjYdB?K&O-a|NHmPub&(|TpS!6+`Jq=|NRARu;%#r{VV7= zy&qq{@ba=T{QCU)^DhQASicXnGu8CPi=RLF`TzYR?S#SR2Jyd~JUoBjGLUi3U^Hk= z8l$9Si|UW>ptX44fB*ab=G})6Vq)*#e|YGl+ zN~%$rk552MMiI1>)YR65jZHv+=^s0vzP==niWC9u{F&G|Js%$k3kZlQYG|2TO3SNiX=$2RfPtlzrLLkV4-b#NzP_S5KfeG!zkmRPTqBFA zkdUcLqoRtCkd%Ugf~+L#pKsrO{`|?rz^kaGrwv|&tEMb1!^hUds;;iCCB+ z(E(vdn1k91(ti~c{{H>T$jL7vqoAPh}_Kxl~h5@rNAf7#i@ArCMTaZ{M!N4Fb1u_wA8fdr@G&+YcRZ5;io}Yn}ffLhYwFb#&49}i1JY&FV zI$rmRGFUQTnyMtm@{sE}P7{3?7#LJuym)r&+^JKiF5Y_Z;KhqCUtZsQ_2tW#FQ4DP zdb;n(mv?X8ynDxRzfs^R4-XIg7*o)N3XS}Kp=X>jy!*iLnwR%Av}OeDcGR}D1>M3W zrl_H9ZYiUntYu;e0%m4Liej+TCm;YxeTt0=vfsYRB2peW-6<$aDJiL|t7A)bpk7-u z|4;OT4h4jSe*WY_IqVRUyEGUW7=$?_B{?{xq&QH{A>`-bdHYsa`0H0zZf*??Zf;g+ z?-?{Y#LLa}RJiRF$N;SvdHGM5W~!{(k%X?Jom|xSX_zAgc;A+@(SFJIHiqMi$6X z0)Kx~HQ`AMo zMFn|z_<#TS`Im{gk&%T3j2T!OMSp^ttY3d}v9WXW^Kl6Zf;K+CgPm+E$iTqB{&mgQ zuiw8iJZ@ysV!Fx91Q~S$-9O9z!r;Y=XD=9THnQGi)M8+S)ybfK8z&nF8`}{!Hfd?L zW==+i|C;}<3kbY_5A`8f1uHWvs~;<~pdfQI=YIyq>kOJmD$vf@hsFW}GY7NKN5+pr zTrZ)%1NA(aIXM}=HZs11^$J0AS8{?pY@oRdW^Uf^U%&t7w%q;y5Iqj^nMOoQd8UOzM%goOD_xC?0 zhW|gme*VGmtC9H^0~=e5rlNwp7}xJNFJ8WU`RwISE-86M5kYP?RxUvqSz#_NE+G+a zHYR3Hej!EB&IU!u8eR*KO?-d8{s5gT13q#GzEAxBA0`HcMwUN+*!ek{xKX!?e*kS2 zhvcU^1_lP(A0J=6eEIU##~%!A92^|%3|w6QetdrZ{Q2h}|F~pCctK}Oh{&jDfewFG z(bH3u5#!?G5|dHXvuAxE$spNiAucYXqON6VW@cunrLH0)t`55LP*+`9Mn*>Q+qd7$ zY@7n3qM`zvY|OvEv4Ka$*_eO-{>^CG$Y2Uh58FY#7)sn>uCJjksjjY}Z*K4E?(Xht z@9Ak{Zm6oNYG`ib$zVo_BV|nSc>+@Nu`n<&Fnn%?mL{k?&^$H+Uo*p1s9!;{E%4pe zARfa7m`<=-m1YLmIiH~2*^Eq@%?%7pP~Dg!U=t)@CV+Wwk$Ei)&!KujCvZy(@N;u< z@$&PDOLDNWa|;Oyi--sb@UyXrNk|AcOS7@Du`+}12;t!10BxZV1r0Px$p{Gva>I7o zgG~_?7U1I-5)qb`<>BJy7ZVkikPs6Q=Hil;m62$cc5-rdaK?En#OP~Vi3lZQuunVE-Q6m+$yut2kjgqSesz-Ivg zVM#gA`GyjbqJlzDeV|gDk=3yok~>g&3ZV0C`9vgSm>IeG1f?Yy*f^S*I5{~RS^j+d z`0-C8BNyx>VzA23KmRbic=rDDxBq{iyn5RV8cyWoWc~H)7b_{G3~G%K6+3 z@703&jLi(N5*O?ip}&8A|B{jx7jEYG#>~vl%F6QZ2Q=(JrZK1@#|IkkBZ?dfuZ00t z@`6lhfzSMdMgSRvn;n>nAh`tWCgEn#Dg$s&64qAcc*$r1S$7WZ*)o78Mp?kCwOE*W zzI|g86=hjV^)7USU+l@;av3n8I30C>*q#}5`R0cmMz0WOvw3<8bZN?JxnMp{ZT z!otF^lUBg9k-U}$QVc4M%q%SMRwr0oRrv2O2Bk)37G`GHNCgL^eb1ooz;J{SI*$Vi zMb4+6ey~3N@`a7zQzQGYXD@#JVqy6O4MkAyWD;gzZDiO26#?sD{qgx3`?qgT7``;J z^D4>n@-j2S`e2~_W&C^`tPGOUf_&VJEHdIE3^I*O-@pH8WMSdw=VxhTg!lWw>!`tL zf{6t@i_FBx#CQ4fi;o{4J$wA<{{2UfpIzgVQ`J%x7nD^{kd>2`mV<^7*j=C_Iv8N* z>%vU9+W literal 0 HcmV?d00001 diff --git a/mawaqit/bar_widget.luau b/mawaqit/bar_widget.luau new file mode 100644 index 0000000..07fd0f1 --- /dev/null +++ b/mawaqit/bar_widget.luau @@ -0,0 +1,289 @@ +--!nonstrict +-- bar_widget.luau — Mawaqit bar widget +-- Left click → toggle panel +-- Right click → cycle display mode: countdown → static time → prayer name only + +-- ── Config ──────────────────────────────────────────────────────────────────── + +local showCountdown = noctalia.getConfig("showCountdown") +local showElapsed = noctalia.getConfig("showElapsed") +local hidePrayerName = noctalia.getConfig("hidePrayerName") +local widgetIcon = noctalia.getConfig("widgetIcon") or "building-mosque" +local dynamicIcon = noctalia.getConfig("dynamicIcon") +local textColor = noctalia.getConfig("textColor") or "on_surface" +local iconColor = noctalia.getConfig("iconColor") or "on_surface" +local activeColor = noctalia.getConfig("activeColor") or "primary" + +showCountdown = (showCountdown ~= false and showCountdown ~= "false") +showElapsed = (showElapsed == true or showElapsed == "true") +hidePrayerName = (hidePrayerName == true or hidePrayerName == "true") +dynamicIcon = (dynamicIcon == true or dynamicIcon == "true") + +-- ── Constants ───────────────────────────────────────────────────────────────── + +local PRAYER_ICONS = { + Fajr = "moon-stars", + Sunrise = "sunrise", + Dhuhr = "sun-high", + Asr = "sun-low", + Maghrib = "sunset", + Isha = "moon", +} + +local MODE_COUNTDOWN = 1 +local MODE_STATIC = 2 +local MODE_NAME_ONLY = 3 + +-- ── State ───────────────────────────────────────────────────────────────────── + +local prayers = {} +local tomorrowFajr = nil +local displayMode = MODE_COUNTDOWN +local hasData = false +local errorMsg = "" +local isJumuah = false + +-- ── Helpers ─────────────────────────────────────────────────────────────────── + +local function nowSeconds() + local t = os.date("*t") + return t.hour * 3600 + t.min * 60 + t.sec +end + +local function formatCountdown(secs) + if secs < 0 then secs = 0 end + local h = math.floor(secs / 3600) + local m = math.floor((secs % 3600) / 60) + local s = secs % 60 + if h > 0 then return string.format("%d:%02d:%02d", h, m, s) end + return string.format("%d:%02d", m, s) +end + +local function formatCountdownShort(secs) + if secs < 0 then secs = 0 end + local h = math.floor(secs / 3600) + local m = math.floor((secs % 3600) / 60) + if h > 0 then return string.format("%dh %dm", h, m) end + if m > 0 then return string.format("%dm", m) end + return "soon" +end + +local function getIcon(prayerName) + if dynamicIcon and prayerName and PRAYER_ICONS[prayerName] then + return PRAYER_ICONS[prayerName] + end + return widgetIcon ~= "" and widgetIcon or "building-mosque" +end + +local function setColors(isActive) + if isActive then + barWidget.setColor(activeColor ~= "" and activeColor or "primary") + barWidget.setGlyphColor(activeColor ~= "" and activeColor or "primary") + else + barWidget.setColor(textColor ~= "" and textColor or "on_surface") + barWidget.setGlyphColor(iconColor ~= "" and iconColor or "on_surface") + end +end + +local function prayerLabel(name) + if name == "Dhuhr" and isJumuah then return "Jumu'ah" end + return name +end + +-- ── Prayer logic ────────────────────────────────────────────────────────────── + +local function findCurrentPrayer() + if #prayers == 0 then return nil, nil, nil, nil end + local now = nowSeconds() + local currentIdx = nil + for i, p in ipairs(prayers) do + if now >= p.seconds then currentIdx = i end + end + + local nextIdx, secondsToNext, secondsElapsed + + if currentIdx == nil then + nextIdx = 1 + secondsToNext = prayers[1].seconds - now + secondsElapsed = nil + elseif currentIdx == #prayers then + nextIdx = nil + secondsElapsed = now - prayers[currentIdx].seconds + secondsToNext = tomorrowFajr and (tomorrowFajr + 86400 - now) or nil + else + nextIdx = currentIdx + 1 + secondsToNext = prayers[nextIdx].seconds - now + secondsElapsed = now - prayers[currentIdx].seconds + end + + return currentIdx, nextIdx, secondsToNext, secondsElapsed +end + +-- ── Display ─────────────────────────────────────────────────────────────────── + +local function updateDisplay() + if not hasData then + barWidget.setGlyph(widgetIcon ~= "" and widgetIcon or "building-mosque") + barWidget.setText(errorMsg ~= "" and "!" or "...") + barWidget.setColor("on_surface") + barWidget.setGlyphColor("on_surface") + barWidget.setTooltip(errorMsg ~= "" and errorMsg or noctalia.tr("panel.tooltip.no_data")) + return + end + + local currentIdx, nextIdx, secondsToNext, secondsElapsed = findCurrentPrayer() + local displayPrayer, isActive, timeStr = nil, false, "" + + local showingElapsed = false + if showElapsed and currentIdx ~= nil and secondsElapsed ~= nil then + local cap = math.min(3600, secondsToNext or 3600) + if secondsElapsed >= 0 and secondsElapsed <= cap then + showingElapsed = true + end + end + + if nextIdx ~= nil then + displayPrayer = prayers[nextIdx].name + if showingElapsed and currentIdx ~= nil then + displayPrayer = prayers[currentIdx].name + isActive = true + if displayMode == MODE_COUNTDOWN then + timeStr = "+" .. formatCountdown(secondsElapsed) + elseif displayMode == MODE_STATIC then + timeStr = prayers[currentIdx].time + end + elseif secondsToNext ~= nil and secondsToNext <= 60 then + isActive = true + if displayMode ~= MODE_NAME_ONLY then timeStr = "now" end + else + if displayMode == MODE_COUNTDOWN and showCountdown and secondsToNext then + timeStr = formatCountdown(secondsToNext) + elseif displayMode == MODE_STATIC then + timeStr = prayers[nextIdx].time + end + end + else + displayPrayer = "Fajr" + if showingElapsed and currentIdx ~= nil then + isActive = true + displayPrayer = prayers[currentIdx].name + if displayMode == MODE_COUNTDOWN then + timeStr = "+" .. formatCountdown(secondsElapsed) + elseif displayMode == MODE_STATIC then + timeStr = prayers[currentIdx].time + end + elseif secondsToNext ~= nil then + if displayMode == MODE_COUNTDOWN and showCountdown then + timeStr = formatCountdown(secondsToNext) + elseif displayMode == MODE_STATIC then + timeStr = tomorrowFajr and prayers[1] and prayers[1].time or "?" + end + end + end + + local nameLabel = prayerLabel(displayPrayer or "") + local label + if displayMode == MODE_NAME_ONLY then + label = nameLabel + elseif hidePrayerName then + label = timeStr + else + label = timeStr ~= "" and (nameLabel .. " " .. timeStr) or nameLabel + end + + barWidget.setGlyph(getIcon(displayPrayer)) + barWidget.setText(label) + setColors(isActive) + + if nextIdx ~= nil and secondsToNext ~= nil then + barWidget.setTooltip({ + { key = noctalia.tr("panel.tooltip.next"), value = prayerLabel(prayers[nextIdx].name) }, + { key = noctalia.tr("panel.tooltip.time"), value = prayers[nextIdx].time }, + { key = noctalia.tr("panel.tooltip.in"), value = formatCountdownShort(secondsToNext) }, + }) + elseif tomorrowFajr ~= nil and secondsToNext ~= nil then + barWidget.setTooltip({ + { key = noctalia.tr("panel.tooltip.next"), value = noctalia.tr("panel.tooltip.tomorrow_fajr") }, + { key = noctalia.tr("panel.tooltip.in"), value = formatCountdownShort(secondsToNext) }, + }) + end +end + +-- ── State watchers ──────────────────────────────────────────────────────────── + +noctalia.state.watch("prayers", function(val) + if type(val) == "table" and #val > 0 then + prayers = val + hasData = true + errorMsg = "" + end + updateDisplay() +end) + +noctalia.state.watch("tomorrowFajr", function(val) + tomorrowFajr = tonumber(val) +end) + +noctalia.state.watch("isJumuah", function(val) + isJumuah = (val == true) +end) + +noctalia.state.watch("error", function(val) + if type(val) == "string" and val ~= "" then + errorMsg = val + if not hasData then updateDisplay() end + end +end) + +-- ── Lifecycle ───────────────────────────────────────────────────────────────── + +noctalia.setUpdateInterval(1000) + +function update() updateDisplay() end + +function onClick() + noctalia.togglePanel("ycf/mawaqit:panel") +end + +function onRightClick() + if displayMode == MODE_COUNTDOWN then + displayMode = MODE_STATIC + elseif displayMode == MODE_STATIC then + displayMode = MODE_NAME_ONLY + else + displayMode = MODE_COUNTDOWN + end + updateDisplay() +end + +function onIpc(event, payload) + if event == "refresh" then + noctalia.state.set("command", { action = "refresh" }) + elseif event == "mode" then + if payload == "countdown" then displayMode = MODE_COUNTDOWN + elseif payload == "static" then displayMode = MODE_STATIC + elseif payload == "name" then displayMode = MODE_NAME_ONLY + end + updateDisplay() + end +end + +-- ── Init ────────────────────────────────────────────────────────────────────── + +barWidget.setGlyph(widgetIcon ~= "" and widgetIcon or "building-mosque") +barWidget.setText("...") +barWidget.setColor("on_surface") +barWidget.setGlyphColor("on_surface") +barWidget.setTooltip(noctalia.tr("plugin_name")) + +local existing = noctalia.state.get("prayers") +if type(existing) == "table" and #existing > 0 then + prayers = existing + hasData = true +end +local existingTomorrow = noctalia.state.get("tomorrowFajr") +if existingTomorrow then tomorrowFajr = tonumber(existingTomorrow) end +local existingJumuah = noctalia.state.get("isJumuah") +if existingJumuah ~= nil then isJumuah = (existingJumuah == true) end + +updateDisplay() diff --git a/mawaqit/panel.luau b/mawaqit/panel.luau new file mode 100644 index 0000000..b175fac --- /dev/null +++ b/mawaqit/panel.luau @@ -0,0 +1,319 @@ +--!nonstrict +-- panel.luau — Mawaqit prayer times panel (clean, no azan controls beyond stop) + +-- ── State ───────────────────────────────────────────────────────────────────── + +local prayers = {} +local tomorrowFajr = nil +local hijriDate = "" +local hijriDateAr = "" +local gregorianDate = "" +local errorMsg = "" +local hasData = false +local hijriMonth = 0 +local isJumuah = false +local sunriseTime = "" +local imsakTime = "" +local azanPlaying = false + +local decoFont = noctalia.loadFont("ReemKufi.ttf") + +local PRAYER_ICONS = { + Fajr = "moon-stars", + Sunrise = "sunrise", + Dhuhr = "sun-high", + Asr = "sun-low", + Maghrib = "sunset", + Isha = "moon", + Imsak = "moon-off", +} + +local ARABIC_NAMES = { + Fajr = "الفجر", + Dhuhr = "الظهر", + Asr = "العصر", + Maghrib = "المغرب", + Isha = "العشاء", + Imsak = "الإمساك", +} + +-- ── Helpers ─────────────────────────────────────────────────────────────────── + +local function nowSeconds() + local t = os.date("*t") + return t.hour * 3600 + t.min * 60 + t.sec +end + +local function formatCountdown(secs) + if secs < 0 then secs = 0 end + local h = math.floor(secs / 3600) + local m = math.floor((secs % 3600) / 60) + local s = secs % 60 + if h > 0 then return string.format("%dh %02dm %02ds", h, m, s) end + if m > 0 then return string.format("%dm %02ds", m, s) end + return string.format("%ds", s) +end + +local function findNext() + if #prayers == 0 then return nil, nil end + local now = nowSeconds() + for _, p in ipairs(prayers) do + if p.seconds > now then return p, p.seconds - now end + end + if tomorrowFajr then + return { name = "Fajr", time = prayers[1] and prayers[1].time or "?", seconds = tomorrowFajr }, + (86400 - now) + tomorrowFajr + end + return prayers[1], nil +end + +local function prayerLabel(name) + if name == "Dhuhr" and isJumuah then return "Jumu'ah" end + return name +end + +local function accentFor(name) + if hijriMonth == 9 then + if name == "Imsak" then return "secondary" end + if name == "Maghrib" then return "tertiary" end + end + return "primary" +end + +-- ── Render ──────────────────────────────────────────────────────────────────── + +local function render() + local nextPrayer, secondsToNext = findNext() + + -- ── Header ──────────────────────────────────────────────────────────────── + local header = ui.row({ align = "center", justify = "space_between" }, { + ui.row({ align = "center", gap = 8 }, { + ui.glyph({ name = "building-mosque", size = 18, color = "primary" }), + ui.label({ text = noctalia.tr("panel.title"), fontSize = 15, fontWeight = "semibold", color = "on_surface" }), + }), + ui.row({ align = "center", gap = 4 }, { + azanPlaying and ui.button({ + glyph = "player-stop-filled", + variant = "destructive", + onClick = "onStopAzan", + }) or ui.spacer({ width = 0 }), + ui.button({ glyph = "refresh", variant = "ghost", onClick = "onRefresh" }), + ui.button({ glyph = "x", variant = "ghost", onClick = "onClose" }), + }), + }) + + -- ── Date row ────────────────────────────────────────────────────────────── + local dateRow = nil + if gregorianDate ~= "" or hijriDate ~= "" then + local hijriLabel + if decoFont and decoFont ~= "" and hijriDateAr ~= "" then + hijriLabel = ui.label({ + text = hijriDateAr, + fontSize = 26, + fontFamily = decoFont, + color = hijriMonth == 9 and "primary" or "secondary", + }) + else + hijriLabel = ui.label({ + text = hijriDate, + fontSize = 13, + fontWeight = "semibold", + color = hijriMonth == 9 and "primary" or "secondary", + }) + end + dateRow = ui.row({ align = "center", justify = "space_between" }, { + ui.label({ text = gregorianDate, fontSize = 12, color = "on_surface_variant" }), + hijriLabel, + }) + end + + -- ── Countdown banner — plain text, no card ──────────────────────────────── + local banner = nil + if nextPrayer and secondsToNext then + local isNow = secondsToNext <= 60 + local aColor = accentFor(nextPrayer.name) + local label = prayerLabel(nextPrayer.name) + + if isNow then + local arName = ARABIC_NAMES[nextPrayer.name] or nextPrayer.name + local bannerChildren = {} + if decoFont and decoFont ~= "" then + bannerChildren[#bannerChildren+1] = ui.label({ + text = "حان الآن موعد صلاة " .. arName, + fontSize = 20, + fontFamily = decoFont, + color = aColor, + }) + end + bannerChildren[#bannerChildren+1] = ui.label({ + text = label .. " — " .. noctalia.tr("panel.now"), + fontSize = 12, + color = "on_surface_variant", + }) + banner = ui.column({ align = "center", gap = 4, paddingV = 6 }, bannerChildren) + else + banner = ui.column({ align = "center", gap = 2, paddingV = 6 }, { + ui.label({ text = label .. " " .. noctalia.tr("panel.in"), fontSize = 12, color = "on_surface_variant" }), + ui.label({ text = formatCountdown(secondsToNext), fontSize = 26, + fontWeight = "bold", color = aColor }), + }) + end + elseif not hasData then + banner = ui.column({ align = "center", paddingV = 6 }, { + ui.label({ + text = errorMsg ~= "" and errorMsg or noctalia.tr("panel.loading"), + fontSize = 13, + color = errorMsg ~= "" and "error" or "on_surface_variant", + }), + }) + end + + -- ── Prayer rows ─────────────────────────────────────────────────────────── + local rows = {} + + -- Imsak (Ramadan only) + if hijriMonth == 9 and imsakTime ~= "" then + rows[#rows+1] = ui.row({ + key = "Imsak", align = "center", justify = "space_between", + paddingH = 12, paddingV = 8, + fill = "secondary/0.15", radius = 8, + }, { + ui.row({ align = "center", gap = 10 }, { + ui.glyph({ name = "moon-off", size = 14, color = "secondary" }), + ui.label({ text = "Imsak", fontSize = 14, color = "secondary" }), + }), + ui.label({ text = imsakTime, fontSize = 14, color = "secondary" }), + }) + end + + for _, p in ipairs(prayers) do + local isNext = nextPrayer and p.name == nextPrayer.name + local aColor = accentFor(p.name) + local nameClr = isNext and aColor or "on_surface" + local timeClr = isNext and aColor or "on_surface_variant" + local weight = isNext and "semibold" or "normal" + local icon = PRAYER_ICONS[p.name] or "sun" + local label = prayerLabel(p.name) + + rows[#rows+1] = ui.row({ + key = p.name, + align = "center", justify = "space_between", + paddingH = 12, + paddingV = isNext and 10 or 8, + fill = isNext and "surface_variant" or nil, + radius = isNext and 10 or nil, + }, { + ui.row({ align = "center", gap = 10 }, { + ui.glyph({ name = icon, size = 14, color = nameClr }), + ui.label({ text = label, fontSize = 14, fontWeight = weight, color = nameClr }), + }), + ui.label({ text = p.time, fontSize = 14, fontWeight = weight, color = timeClr }), + }) + + -- Sunrise between Fajr and Dhuhr + if p.name == "Fajr" and sunriseTime ~= "" then + rows[#rows+1] = ui.row({ + key = "Sunrise", align = "center", justify = "space_between", + paddingH = 12, paddingV = 8, + }, { + ui.row({ align = "center", gap = 10 }, { + ui.glyph({ name = "sunrise", size = 14, color = "on_surface_variant" }), + ui.label({ text = noctalia.tr("panel.sunrise"), fontSize = 14, color = "on_surface_variant" }), + }), + ui.label({ text = sunriseTime, fontSize = 14, color = "on_surface_variant" }), + }) + end + end + + -- ── Assemble ────────────────────────────────────────────────────────────── + local children = { header } + if dateRow then children[#children+1] = dateRow end + children[#children+1] = ui.separator({ spacing = 4, color = "outline", opacity = 0.2 }) + if banner then children[#children+1] = banner end + children[#children+1] = ui.separator({ spacing = 4, color = "outline", opacity = 0.15 }) + if #rows > 0 then children[#children+1] = ui.column({ gap = 1 }, rows) end + + panel.render(ui.column({ flexGrow = 1, gap = 8 }, children)) +end + +-- ── State watchers ──────────────────────────────────────────────────────────── + +noctalia.state.watch("prayers", function(val) + if type(val) == "table" then prayers = val; hasData = #val > 0 end + render() +end) +noctalia.state.watch("tomorrowFajr", function(val) + tomorrowFajr = tonumber(val); render() +end) +noctalia.state.watch("hijriDate", function(val) + if type(val) == "string" then hijriDate = val end; render() +end) +noctalia.state.watch("hijriDateAr", function(val) + if type(val) == "string" then hijriDateAr = val end; render() +end) +noctalia.state.watch("gregorianDate", function(val) + if type(val) == "string" then gregorianDate = val end; render() +end) +noctalia.state.watch("hijriMonth", function(val) + hijriMonth = tonumber(val) or 0; render() +end) +noctalia.state.watch("isJumuah", function(val) + isJumuah = (val == true); render() +end) +noctalia.state.watch("sunriseTime", function(val) + if type(val) == "string" then sunriseTime = val end; render() +end) +noctalia.state.watch("imsakTime", function(val) + if type(val) == "string" then imsakTime = val end; render() +end) +noctalia.state.watch("azanPlaying", function(val) + azanPlaying = (val == true); render() +end) +noctalia.state.watch("error", function(val) + if type(val) == "string" then errorMsg = val end + if not hasData then render() end +end) + +-- ── Callbacks ───────────────────────────────────────────────────────────────── + +function onOpen(_context) + panel.setWantsSecondTicks(true) + local p = noctalia.state.get("prayers") + if type(p) == "table" then prayers = p; hasData = #p > 0 end + local tf = noctalia.state.get("tomorrowFajr") + if tf then tomorrowFajr = tonumber(tf) end + local hd = noctalia.state.get("hijriDate") + if type(hd) == "string" then hijriDate = hd end + local hdar = noctalia.state.get("hijriDateAr") + if type(hdar) == "string" then hijriDateAr = hdar end + local gd = noctalia.state.get("gregorianDate") + if type(gd) == "string" then gregorianDate = gd end + local hm = noctalia.state.get("hijriMonth") + if hm then hijriMonth = tonumber(hm) or 0 end + local jm = noctalia.state.get("isJumuah") + if jm ~= nil then isJumuah = (jm == true) end + local sr = noctalia.state.get("sunriseTime") + if type(sr) == "string" then sunriseTime = sr end + local im = noctalia.state.get("imsakTime") + if type(im) == "string" then imsakTime = im end + local ap = noctalia.state.get("azanPlaying") + if ap ~= nil then azanPlaying = (ap == true) end + render() +end + +function onClose() panel.close() end +function onRefresh() + noctalia.state.set("command", { action = "refresh" }) +end + +function onStopAzan() + noctalia.state.set("command", { action = "stopAzan" }) + azanPlaying = false + noctalia.state.set("azanPlaying", false) + render() +end + +-- update() is called every second when panel is open (via panel.setWantsSecondTicks) +function update() + if hasData then render() end +end diff --git a/mawaqit/plugin.toml b/mawaqit/plugin.toml new file mode 100644 index 0000000..36c3ffc --- /dev/null +++ b/mawaqit/plugin.toml @@ -0,0 +1,247 @@ +id = "ycf/mawaqit" +name = "Mawaqit" +version = "1.0.0" +plugin_api = 3 +author = "ycf-anon" +license = "MIT" # Applies to the plugin code. Bundled font (ReemKufi.ttf) is + # SIL Open Font License — see OFL.txt. +tags = ["bar", "panel", "service", "time", "utility"] +icon = "building-mosque" +description = "Prayer times with live countdown, notifications, and azan." +dependencies = ["paplay", "pw-cat", "pkill"] + +# ── Plugin-level settings ───────────────────────────────────────────────────── + +[[setting]] +key = "city" +type = "string" +label_key = "settings.city.label" +description_key = "settings.city.description" +default = "London" + +[[setting]] +key = "country" +type = "string" +label_key = "settings.country.label" +description_key = "settings.country.description" +default = "UK" + +[[setting]] +key = "method" +type = "select" +label_key = "settings.method.label" +description_key = "settings.method.description" +default = "3" +options = [ + { value = "1", label_key = "settings.method.karachi" }, + { value = "2", label_key = "settings.method.isna" }, + { value = "3", label_key = "settings.method.mwl" }, + { value = "4", label_key = "settings.method.makkah" }, + { value = "5", label_key = "settings.method.egypt" }, + { value = "7", label_key = "settings.method.tehran" }, + { value = "8", label_key = "settings.method.gulf" }, + { value = "9", label_key = "settings.method.kuwait" }, + { value = "10", label_key = "settings.method.qatar" }, + { value = "11", label_key = "settings.method.singapore" }, + { value = "12", label_key = "settings.method.france" }, + { value = "13", label_key = "settings.method.turkey" }, + { value = "14", label_key = "settings.method.russia" }, + { value = "15", label_key = "settings.method.moonsighting" }, + { value = "16", label_key = "settings.method.dubai" }, + { value = "17", label_key = "settings.method.malaysia" }, + { value = "18", label_key = "settings.method.tunisia" }, + { value = "19", label_key = "settings.method.algeria" }, + { value = "20", label_key = "settings.method.indonesia" }, + { value = "21", label_key = "settings.method.morocco" }, + { value = "22", label_key = "settings.method.portugal" }, + { value = "23", label_key = "settings.method.jordan" }, +] + +[[setting]] +key = "school" +type = "select" +label_key = "settings.school.label" +description_key = "settings.school.description" +default = "0" +options = [ + { value = "0", label_key = "settings.school.shafi" }, + { value = "1", label_key = "settings.school.hanafi" }, +] + +[[setting]] +key = "hijriDayOffset" +type = "select" +label_key = "settings.hijri_day_offset.label" +description_key = "settings.hijri_day_offset.description" +default = "0" +options = [ + { value = "-1", label_key = "settings.hijri_day_offset.minus1" }, + { value = "0", label_key = "settings.hijri_day_offset.default" }, + { value = "1", label_key = "settings.hijri_day_offset.plus1" }, +] + +[[setting]] +key = "twelveHourFormat" +type = "bool" +label_key = "settings.twelve_hour_format.label" +description_key = "settings.twelve_hour_format.description" +default = false + +[[setting]] +key = "showNotifications" +type = "bool" +label_key = "settings.show_notifications.label" +description_key = "settings.show_notifications.description" +default = true + +[[setting]] +key = "playAzan" +type = "bool" +label_key = "settings.play_azan.label" +description_key = "settings.play_azan.description" +default = false + +[[setting]] +key = "azanFile" +type = "select" +label_key = "settings.azan_file.label" +description_key = "settings.azan_file.description" +default = "azan1.mp3" +options = [ + { value = "azan1.mp3", label_key = "settings.azan_file.azan1" }, + { value = "azan2.mp3", label_key = "settings.azan_file.azan2" }, + { value = "azan3.mp3", label_key = "settings.azan_file.azan3" }, +] + +[[setting]] +key = "tune" +type = "bool" +label_key = "settings.tune.label" +description_key = "settings.tune.description" +default = false + +[[setting]] +key = "tuneFajr" +type = "int" +label_key = "settings.tune_fajr.label" +default = 0 +min = -60 +max = 60 +advanced = true +visible_when = { key = "tune", values = ["true"] } + +[[setting]] +key = "tuneDhuhr" +type = "int" +label_key = "settings.tune_dhuhr.label" +default = 0 +min = -60 +max = 60 +advanced = true +visible_when = { key = "tune", values = ["true"] } + +[[setting]] +key = "tuneAsr" +type = "int" +label_key = "settings.tune_asr.label" +default = 0 +min = -60 +max = 60 +advanced = true +visible_when = { key = "tune", values = ["true"] } + +[[setting]] +key = "tuneMaghrib" +type = "int" +label_key = "settings.tune_maghrib.label" +default = 0 +min = -60 +max = 60 +advanced = true +visible_when = { key = "tune", values = ["true"] } + +[[setting]] +key = "tuneIsha" +type = "int" +label_key = "settings.tune_isha.label" +default = 0 +min = -60 +max = 60 +advanced = true +visible_when = { key = "tune", values = ["true"] } + +# ── Background service ──────────────────────────────────────────────────────── + +[[service]] +id = "fetcher" +entry = "service.luau" + +# ── Panel ───────────────────────────────────────────────────────────────────── + +[[panel]] +id = "panel" +entry = "panel.luau" +width = 380 +height = 510 +placement = "floating" +position = "auto" +open_near_click = true + +# ── Bar widget ──────────────────────────────────────────────────────────────── + +[[widget]] +id = "bar" +entry = "bar_widget.luau" + + [[widget.setting]] + key = "showCountdown" + type = "bool" + label_key = "settings.show_countdown.label" + description_key = "settings.show_countdown.description" + default = true + + [[widget.setting]] + key = "showElapsed" + type = "bool" + label_key = "settings.show_elapsed.label" + description_key = "settings.show_elapsed.description" + default = false + + [[widget.setting]] + key = "hidePrayerName" + type = "bool" + label_key = "settings.hide_prayer_name.label" + description_key = "settings.hide_prayer_name.description" + default = false + + [[widget.setting]] + key = "widgetIcon" + type = "glyph" + label_key = "settings.widget_icon.label" + default = "building-mosque" + + [[widget.setting]] + key = "dynamicIcon" + type = "bool" + label_key = "settings.dynamic_icon.label" + description_key = "settings.dynamic_icon.description" + default = false + + [[widget.setting]] + key = "textColor" + type = "color" + label_key = "settings.text_color.label" + default = "on_surface" + + [[widget.setting]] + key = "iconColor" + type = "color" + label_key = "settings.icon_color.label" + default = "on_surface" + + [[widget.setting]] + key = "activeColor" + type = "color" + label_key = "settings.active_color.label" + description_key = "settings.active_color.description" + default = "primary" diff --git a/mawaqit/service.luau b/mawaqit/service.luau new file mode 100644 index 0000000..ffc34c2 --- /dev/null +++ b/mawaqit/service.luau @@ -0,0 +1,408 @@ +--!nonstrict +-- service.luau — Mawaqit background fetcher + +noctalia.setUpdateInterval(5000) + +-- ── Config ──────────────────────────────────────────────────────────────────── + +local city, country, method, school, hijriDayOffset +local tune, tuneFajr, tuneDhuhr, tuneAsr, tuneMaghrib, tuneIsha +local showNotifications, playAzan, azanFile, twelveHourFormat + +-- Safely quotes strings for shell execution to prevent injection. +local function shellQuote(s) + return "'" .. tostring(s):gsub("'", "'\\''") .. "'" +end + +-- Escapes POSIX ERE metacharacters so a path can be used as a `pkill -f` +-- pattern without accidentally behaving as a regex. +local function ereEscape(s) + return (s:gsub("([%.%*%+%?%(%)%[%]%^%$|\\{}])", "\\%1")) +end + +local function reloadConfig() + local c_city = noctalia.getConfig("city") + local c_country = noctalia.getConfig("country") + local c_method = noctalia.getConfig("method") + local c_school = noctalia.getConfig("school") + local c_hijriDayOffset = noctalia.getConfig("hijriDayOffset") + local c_tune = noctalia.getConfig("tune") + local c_tuneFajr = noctalia.getConfig("tuneFajr") + local c_tuneDhuhr = noctalia.getConfig("tuneDhuhr") + local c_tuneAsr = noctalia.getConfig("tuneAsr") + local c_tuneMaghrib = noctalia.getConfig("tuneMaghrib") + local c_tuneIsha = noctalia.getConfig("tuneIsha") + local c_showNotifications = noctalia.getConfig("showNotifications") + local c_playAzan = noctalia.getConfig("playAzan") + local c_azanFile = noctalia.getConfig("azanFile") + local c_twelveHourFormat = noctalia.getConfig("twelveHourFormat") + + city = (type(c_city) == "string" and c_city ~= "") and c_city or "London" + country = (type(c_country) == "string" and c_country ~= "") and c_country or "UK" + method = (type(c_method) == "string" and c_method ~= "") and c_method or "3" + school = (type(c_school) == "string" and c_school ~= "") and c_school or "0" + hijriDayOffset = tonumber(c_hijriDayOffset) or 0 + tune = (c_tune == true or c_tune == "true") + tuneFajr = tonumber(c_tuneFajr) or 0 + tuneDhuhr = tonumber(c_tuneDhuhr) or 0 + tuneAsr = tonumber(c_tuneAsr) or 0 + tuneMaghrib = tonumber(c_tuneMaghrib) or 0 + tuneIsha = tonumber(c_tuneIsha) or 0 + showNotifications = (c_showNotifications ~= false and c_showNotifications ~= "false") + playAzan = (c_playAzan == true or c_playAzan == "true") + azanFile = (type(c_azanFile) == "string" and c_azanFile ~= "") and c_azanFile or "azan1.mp3" + twelveHourFormat = (c_twelveHourFormat == true or c_twelveHourFormat == "true") +end + +reloadConfig() +noctalia.log("Mawaqit: city=" .. city .. " country=" .. country .. " method=" .. method) + +-- Check azan player availability at startup +local paplayAvailable = noctalia.commandExists("paplay") +local pwcatAvailable = noctalia.commandExists("pw-cat") +if playAzan and not paplayAvailable and not pwcatAvailable then + noctalia.log("Mawaqit: azan enabled but neither paplay nor pw-cat found") +end + +-- ── State ───────────────────────────────────────────────────────────────────── + +-- Prayers for countdown (no Sunrise — not a salah) +local PRAYER_NAMES = { "Fajr", "Dhuhr", "Asr", "Maghrib", "Isha" } +local AZAN_PRAYERS = { true, true, true, true, true } + +local loadedDate = "" +local fetchPending = false +local retryCount = 0 +local MAX_RETRIES = 5 +local retryTicks = 0 +local tomorrowFetched = false +local lastNotified = "" +local lastAzanPlayed = "" +local playingAzanPath = "" -- absolute path of the azan file currently playing, if any + +-- ── Helpers ─────────────────────────────────────────────────────────────────── + +local function parseTime(str) + if not str then return nil end + local h, m = str:match("^(%d+):(%d+)") + if not h then return nil end + return tonumber(h) * 3600 + tonumber(m) * 60 +end + +local function todayStr() + return os.date("%Y-%m-%d") +end + +-- Converts a 24-hour "HH:MM" string to 12-hour display, when the setting is on. +-- Returns the input unchanged (24-hour) otherwise, or if it doesn't parse. +local function formatDisplayTime(clean) + if not twelveHourFormat then return clean end + local h, m = clean:match("^(%d+):(%d+)") + if not h then return clean end + local hourNum = tonumber(h) + local period = hourNum < 12 and "AM" or "PM" + local displayHour = hourNum % 12 + if displayHour == 0 then displayHour = 12 end + return string.format("%d:%s %s", displayHour, m, period) +end + +local function nowSeconds() + local t = os.date("*t") + return t.hour * 3600 + t.min * 60 + t.sec +end + +local function isJumuah() + return os.date("*t").wday == 6 +end + +local function dateParam(offsetDays) + local t = os.time() + (offsetDays * 86400) + local d = os.date("*t", t) + return string.format("%02d-%02d-%04d", d.day, d.month, d.year) +end + +local function applyTune(name, secs) + if not tune then return secs end + local offset = 0 + if name == "Fajr" then offset = tuneFajr + elseif name == "Dhuhr" then offset = tuneDhuhr + elseif name == "Asr" then offset = tuneAsr + elseif name == "Maghrib" then offset = tuneMaghrib + elseif name == "Isha" then offset = tuneIsha + end + return secs + offset * 60 +end + +local function buildUrl(offsetDays) + local dateStr = dateParam(offsetDays or 0) + return string.format( + "https://api.aladhan.com/v1/timingsByCity/%s?city=%s&country=%s&method=%s&school=%s", + dateStr, + noctalia.string.urlEncode(city), + noctalia.string.urlEncode(country), + method, school + ) +end + +-- Resolves the bundled azan file's absolute path from this plugin's own +-- install directory (works for git-source and path-source installs alike). +local function azanPath() + local pluginDir = noctalia.pluginDir() + if type(pluginDir) ~= "string" or pluginDir == "" then + noctalia.log("Mawaqit: could not resolve plugin directory for azan playback") + return "" + end + local safe = azanFile:match("^[%w%.%-_]+$") and azanFile or "azan1.mp3" + return pluginDir .. "/assets/" .. safe +end + +-- ── Fetch ───────────────────────────────────────────────────────────────────── + +local function publishError(msg) + noctalia.state.set("error", msg) +end + +local function processPrayerData(data) + if not data or data.code ~= 200 then + publishError("API error: " .. tostring(data and data.status or "unknown")) + return false + end + local timings = data.data and data.data.timings + if not timings then + publishError("Parse error: no timings in response") + return false + end + + local prayers = {} + for i, name in ipairs(PRAYER_NAMES) do + local raw = timings[name] + if raw then + local clean = raw:match("^(%d+:%d+)") or raw + local secs = parseTime(clean) + if secs then + secs = applyTune(name, secs) + prayers[#prayers+1] = { + name = name, + time = formatDisplayTime(clean), + seconds = secs, + azanPrayer = AZAN_PRAYERS[i], + } + end + end + end + + -- Imsak (Ramadan only) + local imsakRaw = timings["Imsak"] + local imsakTime = imsakRaw and formatDisplayTime(imsakRaw:match("^(%d+:%d+)") or imsakRaw) or "" + + -- Sunrise (display only, not a prayer) + local sunriseRaw = timings["Sunrise"] + local sunriseTime = sunriseRaw and formatDisplayTime(sunriseRaw:match("^(%d+:%d+)") or sunriseRaw) or "" + + -- Hijri date + local hijri = data.data.date and data.data.date.hijri + local greg = (data.data.date and data.data.date.readable) or "" + local hijriDay = 0 + local hijriMonth = 0 + local hijriYear = 0 + local hijriDateStr = "" + local hijriDateAr = "" + + if hijri then + hijriDay = math.max(1, math.min(30, (tonumber(hijri.day) or 0) + hijriDayOffset)) + hijriMonth = (hijri.month and hijri.month.number) or 0 + hijriYear = tonumber(hijri.year) or 0 + local monthEn = (hijri.month and hijri.month.en) or "" + local monthAr = (hijri.month and hijri.month.ar) or "" + hijriDateStr = string.format("%d %s %d AH", hijriDay, monthEn, hijriYear) + + local function toArabicNumerals(n) + local arabic = {"٠","١","٢","٣","٤","٥","٦","٧","٨","٩"} + return tostring(n):gsub("%d", function(d) + return arabic[tonumber(d) + 1] + end) + end + hijriDateAr = toArabicNumerals(hijriDay) .. " " .. monthAr .. " " .. toArabicNumerals(hijriYear) + end + + noctalia.state.set("prayers", prayers) + noctalia.state.set("sunriseTime", sunriseTime) + noctalia.state.set("imsakTime", imsakTime) + noctalia.state.set("hijriDate", hijriDateStr) + noctalia.state.set("hijriDateAr", hijriDateAr) + noctalia.state.set("gregorianDate", greg) + noctalia.state.set("hijriDay", hijriDay) + noctalia.state.set("hijriMonth", hijriMonth) + noctalia.state.set("hijriYear", hijriYear) + noctalia.state.set("isJumuah", isJumuah()) + noctalia.state.set("error", "") + + loadedDate = todayStr() + lastNotified = "" + lastAzanPlayed = "" + retryCount = 0 + + noctalia.log("Mawaqit: loaded " .. #prayers .. " prayers for " .. city .. ", " .. country + .. " hijriMonth=" .. hijriMonth) + return true +end + +local function fetchTimes() + if fetchPending then return end + reloadConfig() + fetchPending = true + local url = buildUrl(0) + noctalia.log("Mawaqit: fetching " .. url) + noctalia.http({ url = url, follow_redirects = true }, function(res) + fetchPending = false + if not res.ok or res.body == "" then + retryCount += 1 + publishError("Network error (status=" .. tostring(res.status) .. ")") + return + end + local ok, data = pcall(function() return noctalia.json.decode(res.body) end) + if not ok or not data then + retryCount += 1 + publishError("Parse error") + return + end + processPrayerData(data) + end) +end + +local function fetchTomorrowFajr() + local url = buildUrl(1) + noctalia.http({ url = url, follow_redirects = true }, function(res) + if not res.ok or res.body == "" then return end + local ok, data = pcall(function() return noctalia.json.decode(res.body) end) + if not ok or not data or data.code ~= 200 then return end + local timings = data.data and data.data.timings + if not timings then return end + local raw = timings["Fajr"] + if raw then + local clean = raw:match("^(%d+:%d+)") or raw + local secs = parseTime(clean) + if secs then + secs = applyTune("Fajr", secs) + noctalia.state.set("tomorrowFajr", secs) + end + end + end) +end + +-- ── Azan playback ───────────────────────────────────────────────────────────── + +-- Kills azan playback in progress. Matches on the exact absolute path this +-- plugin passed to paplay/pw-cat (tracked in playingAzanPath), not a generic +-- substring — so it can't touch an unrelated process that happens to share +-- part of that path. This is an interim measure: runAsync doesn't return a +-- PID, so command-line matching is the only way to terminate a detached +-- process with the current API. +local function stopAzan() + if playingAzanPath ~= "" then + local pattern = shellQuote(ereEscape(playingAzanPath)) + noctalia.runAsync("pkill -f -- " .. pattern .. " 2>/dev/null || true") + playingAzanPath = "" + end + noctalia.state.set("azanPlaying", false) +end + +-- ── Prayer events ───────────────────────────────────────────────────────────── + +local cachedPrayers = {} + +local function checkPrayerEvents() + if #cachedPrayers == 0 then return end + local now = nowSeconds() + for _, p in ipairs(cachedPrayers) do + if now >= p.seconds and now < p.seconds + 30 and p.azanPrayer then + local key = loadedDate .. "_" .. p.name + local title = (p.name == "Dhuhr" and isJumuah()) and "Jumu'ah" or p.name + + if showNotifications and lastNotified ~= key then + lastNotified = key + noctalia.notify(title .. " prayer time", "It is time for " .. title) + end + + if playAzan and lastAzanPlayed ~= key then + lastAzanPlayed = key + local path = azanPath() + if path ~= "" and noctalia.fileExists(path) then + noctalia.state.set("azanPlaying", true) + playingAzanPath = path + local cmd + if paplayAvailable then + cmd = "paplay " .. shellQuote(path) .. " 2>/dev/null" + elseif pwcatAvailable then + cmd = "pw-cat -p " .. shellQuote(path) .. " 2>/dev/null" + else + noctalia.log("Mawaqit: no azan player available (install paplay or pw-cat)") + noctalia.state.set("azanPlaying", false) + return + end + noctalia.runAsync(cmd, function(_res) + playingAzanPath = "" + noctalia.state.set("azanPlaying", false) + end) + elseif path ~= "" then + noctalia.log("Mawaqit: azan file not found: " .. path) + end + end + end + end +end + +noctalia.state.watch("prayers", function(val) + if type(val) == "table" then cachedPrayers = val end +end) + +-- Listen to panel commands via state (cleaner than shell IPC) +noctalia.state.watch("command", function(cmd) + if type(cmd) ~= "table" then return end + if cmd.action == "refresh" then onConfigChanged() + elseif cmd.action == "stopAzan" then stopAzan() + end +end) + +-- ── Main tick ───────────────────────────────────────────────────────────────── + +function update() + local today = todayStr() + if loadedDate ~= today then + tomorrowFetched = false + fetchTimes() + end + if loadedDate == today and not tomorrowFetched then + tomorrowFetched = true + fetchTomorrowFajr() + end + if retryCount > 0 and retryCount <= MAX_RETRIES then + retryTicks += 1 + if retryTicks >= 6 then + retryTicks = 0 + fetchTimes() + end + end + checkPrayerEvents() +end + +function onConfigChanged() + noctalia.log("Mawaqit: settings changed, reloading config and refreshing") + reloadConfig() + loadedDate = "" + retryCount = 0 + cachedPrayers = {} + noctalia.state.set("prayers", {}) + fetchTimes() +end + +function onIpc(event, _payload) + if event == "refresh" then + onConfigChanged() + end +end + +function onExit() + -- Clean up: stop any playing azan when plugin is disabled or noctalia exits + stopAzan() +end diff --git a/mawaqit/thumbnail.webp b/mawaqit/thumbnail.webp new file mode 100644 index 0000000000000000000000000000000000000000..b0e194d7597a1c5d3fcf3527a0c086cd979a550b GIT binary patch literal 52022 zcmWIYbaT@?&A<@u>J$(bV4`1jSh{53=9I(rky%rJb6C% z?BC{(-u5{MYER$!$o23<>reOJ?`D2sZ_{$p()^dcf(_SG`R4lSf9Kz^KNG(oulA$y z^LdGXp?|;ESFfKx_y5`Fm(TBi{r^DS+y52+|9?&XxBk!iFZZA9fAPQe*Z05ne~$mL z{~XV_f7SmN`w#rPQQ!an;pdb8z5kXU^8XnB`TvXmwf}iPSpPi#ZT^q>kL^qA((7;4 zU-~cm`}Jq@-{C*}f7n0Tf4ru#-t^z*f1huC|2O^b|5E>V@o(ziRkzgJ{CoSK{qy2y z_W#2F&Hq;aVgIjM-XGm|3B5QslQeK=>Lr0_1~xel>Qz1@BIV$^Z(cXU-;AZXZAPopX#6XzmD&z ze_;Qve&(;Ylb$XAfA6cvH}4nsZ~xy@KmWhwnFE^?%g=uUFmg@!$O4^*`ai{{PtjsQ%ag1AjUGS^jzad;53!PxD{=-}(R7|MKtU zZ=}DS{$IXx{;TW1-k-I<|BKJ|2& z#I*74zhAR|D_`61c|t7;7ahKwyV>7X61<1GYIenoOhK1~W4+%Bwyn)~^NZW=9W>)Z zo67A|-yJ(lb{-R5)m3=WdMzjW@{@bxYtG1gXm&P=^L#P4tGmI#$FOhHo*lD9{>=Ej zOrFtgf#YxACsStp;ym{7@1Aas>A&19K6(8LI9i_fR{5Iny645~oL61D?OXKxMbJ+z zOV^Jfr$Sm;1k&Dn>F?r=zGu6L@ep6mHm*8L8Ri9PN_Q={>I z9icaIdK2Au7~ElX?A=+Ncj5n+GLd^eijmRbN)CB{rmlE#ZNc={d{TFXl{tm3WK=HZ zYu&&*(?IIvd7q`aCQJOAzGx)3Og7C=pLgj?=dZ?3@z<_^6=h-#?wz+H!=i7Er&q}*q_l4%vqzNl~ZCYFFufD7DmaRTg zl&8k{sKfhU+6$#goA-5yZ+I)v9Imc&NvZYlLx=0Xzudch?|0V99-m|9U&}8z!zg^O zCL=k?^9=99!#&ew-yV^?60u_T{-x^}|LUC(XVcS`*u^*LhML`%Y@yDH!3MkQJx;sY ze!1FTHqT}G>hdo$6V8k3f6WOjWXzlwlivSap{Y4|E|XBg>5$9(`gc1fJ$<%AY}d@~ z9@kH-Kf`VG%y8Rb!}<3bdqg`Tx2dd`e&hS`_56K5qMH=;YPv4XEAs2JRuTDmYsv34 zhL`1h{Z&uWp8lL;RU2TouKmQXlC-2NfiJih9j`vpGGG4B<;!y&r+V@oc=p?A{=21f zeLd4BnWbpPdT6k#)6{PdQnYJ*>aTJg@y?{&>fP zv)|=SzgeFC_@Bw(^^;qs7v6T(Lut2Fc7vQVDSMKh*rKaBW&{NJXDmrr^9oZzaJe)Si( z@vP+8o!$Hfj6CHNr_QtveXp`m??kTE&C{&k0yOw#7yt7+@#na6&#dh|1qr76@0j=- z$)w-;*CerVPCeful{bs)SALY`bJOZ^y6t{)p@q|eV%}>J&ti-Zyn0o;Xwx@k-?@wX zY`s38n7BOdcd+M~UwO=ZKh$PENeg}=^ZwnB6aHIPsx$0ZGs$Rc!qUknUW=FhI8uH* zd{*x!TMpfOS`USja*|2}OQgS?GY$*0zY?vcGMzD9M0t&J_OgTK>zXFb+j+iKtv6{X~CXM6SbiBsjuQ~eeC|5co1coyM5ZKYYc z)`1>1`#Y}+dX5xzPk%d&+0x?3f0yk+EKhI0_~h;N((l28M-$KatiIB<_U(tVv-xjM z$7HZfIaE+^!Zk2!?T3WPyF6-o<_pZo%agqAA}h}JQ&I6uX8nqD3!`%vPp;Y$%bWX} z_pLJPG>x3cwn-OTzjZV0S-jQkyn(kwjPBZ(3-3nhGvD^&YkI8{=DeKeSSX*rmR*h5 z<|%8v&URkk$2Vb;@>kx1S|@Sd3BEI?TvRUSSn_)DFUz`j=aN&7Z(-A1J5jc5)ef40@Pzb9pMZuBZAa27n+Way+3@>F~FoJg&8m2(Kln@2v#NSfgF_2_C5)kAjA{%);!w(W@gr}T#{Q%ssR^S>}Rm1MY?juBaG4?*{5?4UdY-$r)*KPQOd8PCdN;pEy@cvEWDs1rLg|< ziMjdxDI%PK{H;4b9eVsJbKg|Pu+p$eDSU-nbT(y0>T9+9)%aa=W6#r_mvg%WtP`{x zmK%QmxaZsQ8#3L}U+){Sb*6EJny1cv z_0!bb{3GpipdP=gdv(~BH|w=D`Of;f?)e+@cXiy(m^E|uueh7%y-glI>s$F^%uTKmuGiG7%?y<%``O()3myGRpa=Rc+th0%O_m2lvS{h-f@4f1*h;2 zqkm!@^Yx`yybXEzyS}Q~jb3B)5@m$)W|8{Qlmo?d@(sQC~&3@%hJL7mX zW@*9Gdu}K8aLhNCdtPk4CCgk$Vhewg)AhIy^Zyw5v1YNKw2b(4E^T^(N28%$T-O;V zlfH%*D#lS$;(tt6J9y=Uq<_To*pF(lTCLA^%kMS%wo{jRVb#$IO4eNUPU4)L8c(@9 z|At3?wX|IQ=!Cu2 zz(mWn8k`qrFL`La(L>F$^rH+*Si-aeFI|$Od~T>0ZhXyt!#RJaK+jT+$%|bQ5AjZ8 zlD@U0g0-phTc}vV3UPmXi=15>;>9-oE8M*Ko%Ua^%|cgIQ%>&rFS%pior%*+qV>6I z_GrDYs0?7KF020jT=WNj+rNafhgvG_THZ&PUf$Y&w0OeS=hm}lO3Yra()Zd@<9t*4 zN)EpF^{jk1N-jw4Qne6tnzeAzAHh|YiwhDLhVK5mgm0;J#sR&HU!`(X*5@p^e*NDy zsY;Hp{a+_BNpmiGpY-UmO3C#A?&)(3Px*0u{PVMao8B>v%;OrF+qTX>wnKKV_s)&e zF9v;P+`#CoSb3>|_h@AAl-UQ5yjsDb`$xy*<;!z=j}G)%-qf0My*qoIlyzA8Reny* zRk=+;s8X{CF^GOOL*%Ur4A$otAG zSl#z=gKj#{*&D&rW|%(ncWr9t-+xGu;ZtPr{=+ZBCh6Qfm0ByRdil^@tIFm3J#PQ2 ze&umEXWs3HOpg8M|1FudJT@d_%FH{H?-l4r70Cx~4(i?S*2`TZ{_IrIk?(rn)~HPV zZuFz0ykhFj*r&+<;;b&!zcE$E_U)`gjO+a7 zdK4`4Q~JKQYvSzk8?&eXRxq(@ium0=RYEte=giB{;FoXsU%&T$$J)a9LCB+E$+GDp z*;YG$NoYzk%Coch*s%o#R*GC;zP8jiXFA){88RzZT?(~ZGow3dk!#g|(WPg5TkH?; zlqWowNh_P2{d0Bs&fN);tQXwYGwOYjHTy5_Q_+|6WFz0+xe5#aEXd!)VYZq-FX3|e zv(+rN;<1ZY_Zn3Qy|kAR>y?fX`}qI3`Q`l8y+J|ml0Cj(dC=;ub(87kxS7V|BwKGJx7{RMaT zS9AB5t7qh_7s#?oN}T>6E3ZV(cC+PXU#nXt+b+twFAA&bk~*pu7Igcxq355AYw`~< z8)<$uTO)FL(M|tZ4~1{OPu4SKH(MiPH|PG>MRQ{Qe7*jQGxpS`s!RTl-@TQ}oXNB) z_!4_^@AKlVtsif<{C{GdJUio#>4CFuA{iGswjWv=yp1hkLb-91;~6O}S8l>Gg~u!{wrFbnVc%MAWV>ANSm6H?##`QYR#d%(T< zU)X*vP3`3Lm^Ds8X5TmLKU+O3#;r>b>- z_T{^*jh2l6b|X|);(xTojF~msQ;H>8|J~l3D7SByN$!FBCPE8$e`UDVa%eV-ir$~Q zW?N^U+;WET`%Jlig}EO~Gj`THZn3!gU$Bnv+VcOR_bL;vS1wRk5qx(vyt8&NCKSdy3sIu1@mX+^8c#o4ZthZCV{*Dr}fOah7&wA>+B` z(ziB^6HjXXP2JXX!qvur#VYl_`C_-dlJA$!fBx*1;ihVx#B+<%Z)7|RnPzf2yXVle zlGQs6c5MFGH7{N2;G&}{Q-5Urknpp&=28-Pm8^e9{rcwY6?(>RRD(*QK3lm9p9nI{ ze*0CFPlhqv{&LFK>^sc{Z|yrZ3j;T#3Mj9>sQ3FhyIGR)H+~83qrdbgf6J>}!Z%@~ z_RVsm*>croy#ICT16pMxl3Fgd@$HEExWfGZL@9QmIe(R=G}+9qvn#6DUcTmRy?f!Y zRm@Adn_NW`G8eDB`)y;}EqfiF2-!!XD$CT*?x^hAsS>{XvQz)oPo}yu26B?mi;srb z)v4Hu&kk8R%TaH8-J5V1?<UsC@tE^CV4o@!edCk!tpW zpObCRo9vtUtp1GpOvU8I3rg;{)nEIt*x;b7%Blj37^Wi=g@jKj*m*_2Z~rBfz<4(4 zL8tNLDd*m-xpno4fYU#VXuBEQ5q}pPU$^Udh=*U3HrJ|GPd6uP&DnOM)ZoLZ8Ridy z>%UuHd0g>-&$aFAd=4MwfBEak7 z^>5$q^f>MlF1dJrkMRnvi5G<)%+%%BwXI9Ro1f#8#}3A+uU)jJJ0H8vda|EI+~&@z z&^+O@=Z+a@yKG*!Wv#=no3EEg#Z)B6gs$(OS#kAjb$9;KgjTQEb#m7db^90ZmpV~9 z?T=K;!(Hnvt)s8jUormJbR%?=aPKLt31@@u-b#M|rsBvQO_CuNJ?U$3!v z!y;QNtf`;G<9|@>$PP)JdrLFboH*+B6gul`JIeza%gXh36nD>AykGudQPb4N#SNK< zy7%~~&%N_&SN*JWtPC5ruB+PnW7koVWDm7G&Nx z-Sv8{t=W^r{`peN1sN8;l{K??J@x0(YH!=-6VfJ*lK0{_*eO4DkTT)8EPwQ(s?dYE zHaE}D@RDrbzHm*Y{Gu0Y-pUlH6+M#k&1HJAiGLN(k!c)ihrPpo@#t;8-*f4?j<9lv zCBMSTfJM)q9A&bfUMib-OzL`Ur);Ss|M4i*P1Dt%s(x(X;IhuKyKw(`!s(Z>4^wxE zva||b+H@u~#>nu+ng%~ty9XyW$(Yx01ua~iy5w@!+r`KBJUVbdIP7A}QAd&ACm5w% zWny+Jh+C~+cEa`a8<9hAJ+n8rWOcMkK35aXp1*cO_FpaG**njE6}XeYlkX$5dF>K; z&c_E@p7bxVdb%X%McLnw3yUw9?Nw6|j{fmLFGu&>vgEs)w(hd8wb5}>y?LY9fy>xN zKeE7L&*K)O2@7?)N={jMH6QigG~KkjA$0ex_NQO7R1eLuE#>(7n9Hu}=Qj3dYaSQL z@!t^EPgprmv2>1*?D?hP0c$N)1DzKfv4~z6Y<181!1*21vN*kMb{NO; zoY{!N% z)PDIhsmLbvugpxHL_Q)eo3oLw6cr3 zt2kG$aF^sw8LPEgPF15kW&MxmnU^~a|Ieck0vY zKRcpty9%s&vT?ev*OaY}f$Qy*C4{>LjvT8Ft+CCy*id{Z^z^b1Y7rTyzD|q&JNd?> z2w}OC;m_|ToQQ6iTOHYXx#C9o*?>)QD@=Z_(zC1D+N*S2f<;NOVu=C6zyEuy1cPVR zNu(6%-eT2?nd5h!FXPshh0kU=>&y5SBq_z~PyKV**l z%9~N(`Hw$c!`)vp%{pdMW_Xi)t$oGq;zyI?qY{=BA4w~C^{jg7RWqUZjJ&L0SKD%8 z8KPbGx_;MNtyaz5(jqI;IQL5Z){S3!jPRa4kx^_+E zWn@a=d(|6BXMQiQ>iur9aP8-ftJJ4_SIe2QwN~JTUAB*Y5W^PUW%W%%BJzn`_T4I z=hw=~N6KYbJCiD}hU z)swEpZ67b+n55WpYD(&&UyEC_-B=h}m*NxPOWd)v3T z8?c9M-gjCukn4DG>Y3M@FIVI|pZN91=M4SRZ|-?a-B&Yn-E^VaOK&)W*XT|%tPyjV zI%~O~&b7BQ%3C9!2mI;seP*7*D)b^IkT%nJ5#5wU(wpnvdUM&iIt&@ zaofRl{i!Q9yWYM3InN~K-sxQ)+y5IjP1$JJoL!)COgM-Xk{9G1 zzcKG{X1V8!u;GIXEY67+VflaQcLJAR^NkfpMU3AtAE|#_1oYk|Ja?nPS+3pi88%? z=wzJ0(FaB5^H(1Iz1`67?VRlIlK;I98brGosb?DTeN-xwcWx+c-&^==+FkF1%w6s* zwavB;Q(QjWadHc9C}ovld|d6iWO2)31`%^-wh4CfKiw&P zb=!v*70S1;e0<2Tw)?$$&Ll@aOTJ|3;5@aLcO*D&R;Vkx2j6K3+5I@jsc-qoma|2S zPwc;mexJE!mc;oZOE=EvRjKEWT@}N&a;8bGw&QL)|MRz8q+jQ+F^@6tHT?3;@=DkJ zh~?LLZ+&n4Yx<_*#(6^}rKr8z+&B)hMk_T&=R0~N9^6o?7R^`PoVr_Jc~kM$@BjY! z={;x8TXpp9Jf2;Z_kDKuuKOR%SD60wr-@YHvG6nJ84D-Oi&fX!T(sFJq5XL5`4v(p zy%TTqd&YgsRgv1cy{*-`GE;Zv4daqfpYDfJ&4TmYzcC7I{UH@uYa9FMMA)P+_Q6w} zi*d}C#< z=;kRpF@C?hCf9!uiC%psfM3UZ!-gIG#sxF?3j}(9D`!}D^^*hdBexYlnIyX`tPV+S z_-whMxN%=d-3-=)>-5eRxxEpal6XL+UTt@E@^ATNA}(_OMLHW^?tJ)Lx%1HeE5F1( z$2!l`wm24k@#GHAClT4t0{?Ke$DFAyshDIOd#Eo$bi0(|wY>0(&PDw4Tmb=6sh_{h z`1(&gem-lOnp?DTv}4KM-Y4z;I+7>9=mahHc*eD)V%16`qi5eIoR9e?^oFhP9Z)j zV&Aao{tLl7k;~U#4p*90%=>UrRb%}Ve*L^@=@;iXYlswdOvpN5z&UrT;b!6Py@E5{ z*cfJ-vKuUVD&@qb+Vk4vtb6hHA8&TCPMI96GW#Nv&$^SGbIp$3oba2+_f6u3N<&@M zI~m{hYD#~Z!DQ&-KG(sgVCUJLZ+RML$hxndrzNWW%PhF=<950A3$6v~tz?+kd&GNt z>l_`OO9z@V4urn{Ai_RB_mgM0SN^7}KFqN}U!J_=wfwU2ghzAIan192a?(3GIy`Tt zGJTfWu~99qDKJhvTdn?P!*MS~zUMr8(>gd$AG*n>b^OWB8kY=i??PoR5nb^=`Nevt zCI3AB&-KSEYI@GbdrQNEjA!&r{J|br!_YflUcdQAUWM)+iR`|Q+8tGmFGQBPDisHa z=9YPEu-a+mVaHKbdS*%C{N4On+j*b2{`}Gl##Z=!9y{303K99e3wkc~u>BOni+b=Us;1HD0Qa`RRKYv5qBFU5c z3paI65o2jS{Nj9g$BK0&jcY{>7%U~&^5>+?oOSv6f5YF$uf%`k@XSh!W&C+C$!=HG zj$eFp-G1F~_x~_;!PZippFTL{@>V{N zX^Z^i6Z2M7I3CWMwEF+D&o{EP7kq1IyZXH#Wd1h8=aa?z<-VUkk$6gA%3O!tyHoRJ z8O%4;Np5L7yKMdI2VYaAicaeVr+C|6oFDKmzutJouZ@*P?>Fl@Ji71sdTMLL;nOz* zCtR&t%>F0u$%-ze#SM=<&*f|k+hhFbT5!mmmIKEUE;1OI*x}rTLUxI|Iy^@4aD+LNCW;VrG{Eq$$DjboNz#-3A8J{p9rogV74K(vVC zZ{dsmi}w0(UDOL-AtPAvV`~M!<$OiQ;01}VoK_zR>nr*Z_MlK-C4~F$r>j2V_tzv% zRg#-3*>0D4exbsytydJkTQR=kuJ`v?>UN?3T;P`vtasN4ZR2g-FZpO$k^{4UZ*@~z zly2sn-}m<4DcbCFO}38dou+FihlAASzt8UdpPhe=dB+F!4-WE~VcHwhj|!Y>zk2;+ z&H01n(=JS%{nK?v-TXNVLQ}4ZeDwRd+&C&p;lvB}AitaI@0GksTyl{8{fkJR>ltD* z1J}o-wM)qAC|CcgpU*DH-ls16vq+L%&ZR8>GJD8{Oq>1)V-)(F(FsgJMnr1y7&e>Xg zYxO=S=HD`FR%WyZ9@RVkzR4iSQFxl*u>y^Icgp`Te!F{S`{^1%?UU(#0$XOr#MJn& zK30?xbojR9@8yOm@2~xyZ_WMpy7-B=c_AHBO{PtF)Ns!=Q)7z3B9@O_n=V#+m${4c zxpO>7IAR}I^Y7`Ne-S(HWNha9zDr$U|LJRDb3NzJGw-fBud;vow>RlV8}jytcJ%Dq zKf(KU*@xUUK8vKwTbC!ZmaorF3g0K&5*%|iGOl?%ePH~WpR;i)%t}|u|JmoNqX^8@WQU- z4`-$%@C5GB3i4+-Au*xUSxvrQPw>?jhM?sISAP6_wB%BU@|5!Do4f@w_vz30f9#G% z?5w{wy(N=wHpow2S=h{(xHczzR^90$$MACTXS})`leMm$+RvF+Gj;3Izhb-ej$WKr z>?D||bZ1II(u}*)=6$H!@KLx*h(YbGSR1eLnl13`LQ}$aov|-gAaQym@2J4=cQfj?QlKIk7@bDxLVCOrFF$h<=N9z zw-tZ->$&p&i<8Bt-Jgkuy{h^*TW1o&c*u1i5&rxAGiNJDfutVR^TXm1Jehm z1);&U8NZ$#4=e~dUAq0H@Ch#85}TK?9{Re45uql&{c9xme{pvbKDFoQ@>_9B&kB9a zTQ4u3e7o#(iS~H|-M0JJJN?BEPITO7c5g;*ySn8bYwMlN&+aw+FKgJ{eEQ?G_Wt@~ z#VeXOK6HIue3mEk&4#;Wf9zG*L{GBpeH&>Y^1IJIQ~3p>-)7r&EyrCqxhsi(-+Z=y zo!i}fMIVmjzJ(j5ou6Cw zZ?sbpGPP*-=Ly^@+1$*W1?ixljmPfkY3q4`j-12Q7GvlU9HyNMmUSpZ7GO7F6 zhnpeszuh|?+r8$yd))7>1iSU&gQ=}Ml31UrT{?S4cJiBB{xM7m+k5K{WpX>73=dT( z)_pb2a&v*%jA>n*Ar}pI=zN}bw3Q=2&g|9Q5~jYpyFLrC8*F;&&$HOY!eXia9_JT3 z>X|k-i2YpqPkLMJf(ezo{?AT&-*dF*W$z->6@F7Dyi-&+7BWt;vg}!??)Ovj@vT)! z+eA(MPalr`p`UxL>gRmXt!4%#PIs2DZnr#tedjE-zCedp4YnSJFU~IVGo0J@xn;}g zW9z0pvb}q2Tj1w~{~FF*xN@0$Ywx0)r~mt{IwrbQ#Nugn=Ib3#`yV%#$$M_R_Pvt5 z=tR%H9CO#ZN7v`y=UiFa7V9RlC8TcdHOWKlX9PYx=1SIBdsMpbvFvx>D~n6+OkWu5 zw>#>jOrPa5rhqrSQ|>5mgs$i2_cHM8QC^s96jtg8yTS@a{( z?D(zU#{}1Hixy(twX7wfYe|yDis)d&d%j1-7e9Pb7bWxN>jUjN2SNL^Rm<)v^!B$e z570L0`**!+ckbb;_lCaPe}B8Z>RE8BgkqQa;e732FvX6g%_K;5h3!lWImu%c)sOZp!~$l#jJsyOb3ASd^jq@2dH` zZ@Jc__tr^S@HFsnIiI-WwEDn;z8i(wveF6VUyr@b@6d|8y@Q+8=fYJtp~vAH#D91g z?5h^~BB^7VEcqb*_T{|4p6QRCCkDl5#zcwk*4>n|VPE?cHp>svEf+%>ntpK~-`)GO zPGaivO&hrWJX5abz2DTk_ME87k+Z&7p;UdiR&;JQ9h;z|3{b6-Dy+&jzNL~`PMwuvh>&rW^&u&j1o&6Xwmk83WrnsEDF zsInoW-&NTI=XP=M%B-O(8yQ1b0{Zl4!gLR!k=wb8E?rR>$Ia?$IbI#c$ec)xI z$l4W?gY5;JWnO%Dw_Ue(YRreTZ`1bHw)o#(YPaY1an&CZbF07W`Iuk+IQ`etD>Z^W zUW+C!GG)(B`nxtDhGDPAaG#?6;bRJ?vX ze~RjT(PM329xN9R-7IG!@PHv|#$ijTs|!!=Pjp$ZeQm8sq-b=&*ZftN9!g%BW+~U1 z%P}c7YvSEo{708esxU9eQL)m0AYOmP`sTj5_7gnjDi!{CeEp=Gc*sSKoXg*IqaLl7 zl*#|PfoV>#TK&&b3e29F0$1vzI5%z zxPMjuL`DhH?7ActUmm7<1E$tMo9%P)^5Fj)%)Mt ztJiN{ITLgxD@bk<%hZ;jR|n>F?KnKss3G{Yqxg%5)@4ef52igj#djct>Be-2fXYQ` zO_y3!?z*3MUClC`=RD_=5TX4WzWCUAiOkeoI)T;9y+^kHT7=E?YsyvW|C@jGR{A-* z&)PKE`bzD(D`kswH`|zq+dlsm@P32nS2tZhK41Hc6Z`eu?_3T@_^S4d>sw+(itNmt zpWM1OObfoR%5yu&QgOxg1+pbYQae^CTJzsvTvgQK;i9&5>6=RjZw4>h^?K4WVZKYw z49y2vzS+DwcisEIwkgkNbP1+S64#71F-$IJf|+tGQT$;#c_Nx`aV>#sXcST>`{-FS*3}WLA%I{ z^GS*G<^F`^->fs?{KNi{n@_&*paE-C&gGA3#b#N1w*Qo9>*k$M)R8w!K|TKW={Wb` zJ3FWN>?~B(b-bZ?@1NBaCHGBPRc@z*1KHAg_Dx#2V}JRP`>z^!mhJo|*JQQ$%SMhx z{{@65CGbbA<5}>8Pd)SNpx)gzQ#j^yGF7ha@ZtD0L*^@sntf+w zbjzh(^`^Vl92F?2LdaxI=K9?|cH!cWj#@qGwOY$v^;@39SYi*u zj0p#CwO!oQ{Ccd%FuNDm`dh(EMAqLto;L5Qbk(t% zvNH*m5zY*&`GY_8uQ{f9q5F%dLD1Hil}!#yCa6#F5@_sd(q#M6IP1!TYs?3(d1yy$ zy?TE7k+td8Ss`DJc<|*(p5qJFySX5Pzj4ABotNP!N@q^|`&YH$#X?R&^E~cj*1BJ8 z>;jC6k8x_V|0zxoc)QnqUex-Dhqrp%4Xylsr<2*OZ1(RdU(@6dBpNneb>1uHJmXMh ziqnU_3H#0jzx!KM&y%`~A!+5a>#k-kiBF9qs&2+L$T#o=A6i`kz^+SDkvqYPr&)^jG*z?XN1=IG%pXc9A^# z#hLa0a^d?O%PlTU-}ZN-fDNFY$gK zFHVFS&YwTU~6)2*KD*`9D?VWQTDH=iVS?9@KlGh3zEZ-ds>cafJ>rET=%Hu`l< zo>d}QIdgyG%Jwc_3*U-6a#sv=SdMdi|8wq%&KfSy^$}%BU)W-P>g)Nc{{iw0(rerKvuUwyX#LV))cTbDHEW2gh)-N8ZpEq%yqO(h#kpK0n$Tww{Yt`14 z2j=~jcDg(*a^*W#6|0gLzM0|5r?oN`uUN0Oc+!#8zVC&d*YhYVm`EDr_PvVep809c z=k1Hv9GkJ}hKTE=nNxY(Gmdq+6cw00Fj^};QvqO^V{`N`6OpAY3!C1I)_o1?Hrds<~-hQBQ?EaitO?&rn`4)7o|DW@e zr@KC4-Q%T`?^q=2>%Tp8Wp!G?yFhzm7IDv#pippvX@t0_1mvmo;5qvbsu}Z zmO_TWtD5Ep{U`dV?i;rju-e7Ej9T~M6la$6Oq-TZ{RLjFL86`dTI<|b#dOd6YP+NP zuAlFuHtS8@d+QVRp4@$-Yw2_S@R^B!w)qt_yZgz^K=+{}PVr!SG|IAF8 z{`uqkMuqcp-ubd>TC_fT{5VCeEb}YZs;g!3DqsDkzv7rD=wFQ)ZexZSRiEaonzx;wkl zI5v{!$L~L`b>TUiqZ3#4cYxt)x)m ziO#nZsVDzt2Wwx~=)JP9OF+b`%5!WR)_d{ zmrqo`@YM9v&665o=T~zCz1rHi>X75LY+FO&^QSjmS$jLl;TylF=xJu-vRD4rQ#Whb z9?)%i_F*sg>#!VOuGWlI8kfwuOM2%vzj%0ahF_`4*%f;?-!nLPqc_1e!Ad+Xvy$0QhjZ|a=qd9fRn$-LI%UWkN~!C7^o{JPEMX^e>vpN2Ul`2OA- zeo6d>l;hpTQ^tGv-d;WDcX#R6Ez5H@R2<)vyT;jH^9^qw%SP?>N4$)lNvqVnb8miJyM;oZr5JY3lmxIu5>(M+1yqGZgP!)SI`o>L2U2v+v%Q zJg~_2wc36p*ShcLH$%Twm-@;~s(5(A)L3MaV)3@Y9ulPfDD-L^7|H zZ1wi!N_hH8b*%)4lg_G{nwGm(9pYXdHMvnW(PjW9hFwM#}bh(bAh{jKEKN;2B;|2@ozRxp^N>Vdi z_$csWUWKv0-$gN(gI|ucsF*x2oU(H|SM)Bw@=OCUH|OcXw#RoEABpfgb}=Jzi+HUS zx6q>dHBxR|r;ciC*R%CW9932BSS5c!&`wvvD#0)JhIoeG!}p4Q*Dtf$7qreaTX=%E z-}pv^)&1+!I*y*1?a$A&!_lT(m+M1tl6Aml=jlxGd#--zb3OFvYBtZ0nHe_k=O`=K zmlv+Qcw(9ZQ^Gj`kGxyj73<}>c&46A{krbjjCm@dP70elAI}$BXd4y%N#n2<2~@T+zYP_L48w zPJl=I^-Nn+DWzkr5@K_&2`d@QdXnzp%_?B{WjYV%lW(=Ng&tS*-N~wUy%cGy)WW{) z)5CXXG|TF(`_k9A??*RSz9ZPf6p+8}kQ zkL%mS`64l8O()jmH{bu_5Vksf68k}c9<588&AmUav^I`O*3@{wm$hrbp@75NBP#b~ z^ck+(oRs6qyzj;Xz4yz%sXMvanr@su@5})w?S&qJ%pxl0(+g&|^jLSFoz13_T+;dd zj{8}}ccBs}f%vyW@`!oWcVz0Utl#68qHTLa$a@OWt*mm>y$5p;gR}>^xv~9f1@%nFa{N&TKn^yO( zYBBd+*Wt7ES(vc6;XKQ+k_8o zo&J$2T9b~fid|g4W~EuSw)h*n!y5mSkGN+|i`n$VlKV#HL(%G~%2PJH*nPfe58tiI znBEmBCs!%{mtE2y_mi#j%#xcyfJmobKX$r|NE16*^gb!hSj7&RPG?G0arumd^~4d;-+x6$pPVWlf-?({|dy|b` z$*~n%_FbE7w4YJw36q+;4eO%xiDE_4B?9$qEo{#~<)P`44`wVgFFgM+bz(HrTl+)TwN`09T9jfVX5SF3 z=Bl*Gx&EZ?rsbMzUECJ-_N6WQAGsypUwZ6XcvA1$HJh~bK5ER2 zkUt)$?Rz^%ypEw#_f&o4u46w~f}V!4$hUI0>0Gt^cY56@Iqul%dEy zA)~yf_S~b5LAv(5vkYHMecybEUzaIUq527Xqa zM=l&@pFM4n%d?XQPf1QPn5O)SQTk$?;c1&+8EduI>m>zG33J$`ex+M9EoD{m%U7ig ztP_qb*>Uma7j8Yf%7~p3cGm;KBp0p-QP<5&>G-hmeeU*GMLQ1f+_myxOJuQK!<2^ zrI#hAs@Sw&{uh6;Y)1anj?Px@shM{#Ss0$J<=w%dXmIzAx|sLkv(q{4yi}d`*8R^i zW9K<<-m+lh{DY2%c79=O>%PGz5PrGv;gVNxr|)ks{5-`y&N!vv==re!|MIu$=*t9F zeKE-VDQfJQ)P9^#mhaP~B+i}3d<9C^y_$Hs`0tv{pI&t4K7Ula*vCmAZ(nUya)WeK zAEW8I2?pGO3cOZ%x!r!AC%#tM_vj>=#ofu1U;aXJk?qP;qV=Db)Yh~nT7Hb{nG~>Z zQmM}c3F%dT{VqIl{9&gi^(%6ZTZHMNr{#=~qqo1*I9BE^(mpj*Q1t4wpJ5(09()Ye zdXb0hzW)5OX@?2#y|Sy5lW$#nwBl^wOyMf2DeJDyuikfs*Dqxj_vwe)9#d^PPBB|p z6_!ZHESxpLDN^vwzE@Y@6`u}C=gVBK?z&m*=qZ*hQ|Gnc*wv@8v|#m-{&~AB7cnZO z`jpJxW0QV}`(&kh&EHM4ZY7Db7_8-Xd^&5LMdoFO^&h=|m5H8?eB-aJx9yDa>%5$( zORE=LS4<0g^5Ww1MElGH!R#Xih0L#SW^CFjW>WX_{&f%i``^-+OEfcoF1Fv2+IYbH zi}K@tOFz{enENPt-m{N;*S>aeY+CX3@g%dmF}5zpOLCj1JbqHpwCBhc>#Qe>=3n*` zdl=s4X)VUHa5a4u*)U#fZ9k2ya5 z4hDihABXCHuu)OS@!Ni!>!Eh&pP*BFxI?}(7(Mz%l<-HoniaAb%|~^za^|$ zB$+mBZ!z4V>8W~*FKd#q{>irv3^IIW@3uYHSu47{+OduM-omdhZ*G3X&sf1%RVw#W z)2*kzFiTgk(BJC`KsTxXhcaS zzsr_+V3KkCgwdI#|IhOCyB}wyU)&Jqy}dSnSLVbw2Dk6m&707)`uOS=u`S<&vbH^Q z{q5@S9PpiU-qz=HU6(M)KE2ec_vCsQ@0oq<>y}L2Iiu)+qrJ_Ab{~OT#ql$xw=H&E z`m1qs-s6S|%Z`}-ow>52-0R#ip>{nU%SV&tx~nZ0+A;r{afV~}tXKXFo1Kpq%v;W} zV7v4hm)%QW9Qb(Z;;riGI_&}y@7-KZ2M2V0D^Po<_vZDz9j7x3TobP>EB4H|l)oTD zb;qp^p$hXW7rwXOR%AH*;E&OdC!14kUG-g#C%%kkU1533fO{#+*P^A}Y9vl1q(PHj?IF`m9Mt~$I^|8?N?23E-$#dzM*Hkru_4qjEgKaoY`-OFbUDy$7Pk4#tY+9)7j*R^uy znolM5Lb-lni^EFxSDh%gym_})Nt?fV#$V-4n{?NFob9bXRjBsTs{ZpEj$P^T`YP3a zWmn54k(das`h}l+?@xTW(0*@&@s9Vp9CCWUJFm>$<>`NC&gUm3tdetr6NHv+G< z{fEpdOWnMRw>ka_EKGV!GMRFh=d3l{ohx)xXuAJnjxD8z4T52J)*6~}i@dCRJaxV8 z(uudqmjCXStj_L9U#zKk(A)Y&*rj*1%3E_c{^&j1RIAXFZ7$62<7g|Ma9@gT%_&O* z{bP0do!^c*DouKjEPi6X56AjszG;T9nzpLkKDg3wMtQixelt1c@PPB#f}!?eYTK7@ zIS@3rezp9>g@2yxWBA)L>#@&H?mE*y<*DD>%0td%?)o+R*n#az%NHz`SRl~9xV3Y} zr^m+MlahTuNwf2)vD{K@EI$+O7Ou0_t)kYmP&r6xe=YB6i@t^Kg4#W&?;8~}q?XL> zdMILPt+wQ}pQ^(Bf2X!aF1YdM76StVlR^Hq6|PVAa((}Lz-xKq)_3YV?rDfzn{>!U zcDp?H-pP;FO`Gqy)Z4ddfs4e_V6%?(+LHQZZ&+5tjm*3N6Zu3*xz zpP!}DF0J>;mT*s{Bk3!Stm-=PtFE-=vg@NNukL=kiuoFgw!P8e+O;vYPVwlz@cjy> z=dEto_;?@7RH>MRNx|N3OoBzLas#CgW>kEAGQ0G^s`+0O6lYyFu)M~2;X03(^8Bnw zQ~%%jOFFeI*xyA9GCcY$)gr#}n9R;KG4m$OWoNnF{ZGfR*Jqt;zRQ)fTpSl{GjeCG zzI}XN`i;eAK@2mD+#S;;_nUS0HkWxV-Qp)Ny;;1`Ch>^+-)-}z&noN8Re3GJFElDs+c7I{A9MHkvAiRH$;QtLH+a}q`sz#w@rqHzJ%z+Wt^d!9i#MeN%@g6A`t7lc(7D(W zRRyz&x|$*@cRj6%b%^h&YW%uL+vCSf!@AkA3g(kM4O-(e#BXNpxqK=2PHpSlf=V{l za*e(EN^!#3UU`Nu9i5LxC+?kn%G-O_9+x`S%9Y6pEG**2hf+T+(~2v)e?g@G+oJl9 zUz*Qz)OjjPo4ZY^ch`>KckmNg?DuSnw3T44$K_Am;eN|jaPD*xOcGXVRejOS^FqqO z_rBUk4xhHO_l|phDcE{$durx3#o3#-{qW`U;=AemYRmeB+tL}Q93KU9dnPVFUB8{b zf`Mt>am^7DCKqMI50r<^qx;uQL~;CJh<80#-C_k14)YnHWd zXPAGPHL)o1TC9nWmxGbttg_=bB!aZ>oQ(RoZf)`FR3(9w@~6wJ|VUcl+@4?Zm7AwI=0{R*w%eteE^i=7iScuPXVGE9R{?*XJ?cdH7a>vCog= z;gJts`myrt^OWwsu;2St|I30Dzq6uV3Q_`Gd*1Bn_i);IyR$BE>tf{|`P#-tqz?}I)CPYV%r%5+2$h*S6CRL z4(L8lpXfK0=~Q$^hu|CbbdlMLw(X|#ezTj@39nr1q}RNjk&oR@VatTY2j;PD=Z=5V z*EqAiLZ$d^lgD}U!1>Ov-^PbAHL!Vo*`01#^^b8Tf8Dc54X=LMU+v0^GvMBROy<@9 zHLS<>w!L1XlCZG8`HTb8qr1Et!aW+5!woKZPrRGFflF`6w=D<0uM^&>Jbi~+o_OT` zdH3Z?@BNQlRD9G)YiIVf`xZ$)XN`7ft4_4%+%j)_!kw+x(*6nM$v3B;pE7y>>Lcml zyKkaQAr}d~D0ja~1pcu=XwU3HstM^=0GR zuOdG_?=RV4D@Q zxXapHv~KGB$2}k1(ogYD_%Qc_u4{hwYmr;5FBTSC-tbzi#jtPfjgT2`vRjW>^%i`T z5Hy%ockN-e)vLFy5k;>ry;wH+)~_RtYgSsm-D8y($Y5sU(yd~1U*T-U>|38Y=D+)J zXp7KM{+2h_j;?ZC;s5J0N2}uer)OUM_#`5r7O{E>cLmS<4{uYMdKF*Wq)w06TB`JZ zYS@l%b0yjD9Y_c(jyn85?VpR*|A?c4DvZ7}=7=ROD?BOAx>8^h%U9;EIV&{z9vg1k zz$0Cgzrkq9)}5L?pQ;vhr#B>VzLLN7^zp*8PmVvGZtr%1SH*AEy@w&^iaqt3KJQhz zT(xt`8rx^=uAy4{B?50I%$uYV6>+fnoU>V;%$j#!3fEm|*|vR}{KliL?|ubuG+l4R zddxJb$z<05V;_CCZvA|#Vdc$|m0w=X_h(^q*v#jd_WaSMe~TBoGd&l*d|TI8K}-4! zGjG?;%WA3D7B8A`DRfb`+=ZZ!*%sCJ*rzO6$p2S|ub?&m*LBsqEZ1Hp8)bxhorpXc zXC?5-I#;vpNdKl8f5gj~+p7PoChhv^czapNc8;t)>1+aWkHT1{929)B=asTz^yevD zELWxXtn)3-RJy!}!&sOp#n|mnZNjgBKW0mv4jMA?_{Kh+{66@EV1B@FABk3m?9&y{$z^wGy{MNp(@WxZ^6R^5=U;@s$nJXm^w`zV8FiaJ z3M}UEc{Y!M8=Uz%-hKUYX-S!*U6v{tm*_|)^MB8n;^CR5il zPWbhn;s22d=ga-?)_B-B_rx_Gm#^LSaif`J%|)O1hky4*{r~!Lb>gez%~AIstXo}i z`kc8xi{2cY%vbd#r3sA7ikE3Qp0lh``hyBL%A!_2@k?Gu1?O(DfYHcZ`u}MoM)gRcX!#{Wd9#5 z&Nd6c)7rShiE|xUq`tW86Q#0>WqY{5<)t^GDTLO>1 z$at8))PK&Fur?m4M;6DLmKX1cIJm=d{*>F3U$k`Q_4;p85U9Ocp}AgjKP%6IZie*3 z51KQZna|AXv+DG^PYr=KiBfyJ1;r%$It3Fj6eT8%H42w(S7GI^}QHvcEFAg;ip2*6J?wZdP)2&B%IjA}z4t#>v;~ zeKRV#SY{m7`eS^OZOLkH)gA7-j1whmM4TsSUA!c%a6i#+)il}Xj@y^Xnm>K{F>zt- zmBT;JO079B(x)vESn#oWl3$1V`b#a(y%tn={e8{k7_S@^<0AS`_+HJ&V)w`88s;mO zZ8TbbVf(q`-!$TH%IrG1@ZT#xfn2TVm==+54ay>6Kh{UBJMrVLrlxz0V9&XPR-GN( zYjhJ*C~^xi~TsTMQ;DTmQvVb+0GJ`WEz< zFWnd@8t^~+(DZXolC$c)d|y1b)7GBQ{$2I{6yB5HG$MRig#I(+?y6~1W7++Gzr`w( z4{X%}tHOQqj4U3W{CM9bq0(B7W1{-&BXuv6KA4|Ab*?yAdfLP<&X-Rg6J+1K`O!S? zyN^pFOXE4kRycBSyqTO{!7larFSB$~qwC$P+v7Wrer?TivQ|-Qf4_zqB`>D6k@S>eO$0i?jyH_WAm&Qc=Oj+F>&0JnwVy3=I zvvc9=6>l^6_{&h6 za9xGB*VFEAgnrDe zFKxG;A2A6(uMI92|5xjxpI)GLLaO}l$_GMc?y&W@yQgga zYUK9%NBX352@;_(legLFtNqf%B`jA2-yP{~7;YbkRO&PwwplHXJ2P zFZSLzq01^O`Nfy%JL5KsIozdY(zWqy50soc(oH+-L+`JQpEogI`{@eZ*M1vxdnX9T zRx{i>In}0d&fnWd{I@S_y})}S{Q&b4eGY}~PjVj2fByON-#bD|>YMCUUUeG1%d6LT z)|Ij^Z;i~EaD@jJ?*t#8dJ=W$`-$>EH^VcWSDcP1%AJ?goF&A({>e-EB?l&kZGLs` zNye-fvwpQNC~YWOx;6fn=zP=ky?()QoR6|gxDMI8W{=(FoFBPJ#6i5mWP9VMgsPY= zv$&7VNsqEzWvW_t=x26M$&S>7U*7_DnAr8#_W2jNDu>N$nQ-(BzlQT%zu%wy4=!vI zSo@_ZUU%Dye`fzT6wMXgsL!xYf8qbR+*e<%D(R|v<0rU6g(tjl^*fGJHQR1RNL_5S za&WuIz$l$4$~BK04hh(8H)Vg5d^ z{EGh33vwsl`dI%hGuXdT_GXWWnZd=j**w=bH6J|Yqsl+U>rMJ*_cA4&Mq$2*_ZL2q z%HD3@eD20&)f4xoALOpt5U`fx*~iz{U#u!Go%>Ab-eJzrMG9e6M`l0lU*W{{f{lsm z;LmV2Td$2@-fP~O{xEnpBiF;Xg}X%TH1e0ol>{ulv+#blgwF=EwU*3#N-K8p{Il39 z^RaSUSI@k6yYI6td>Q0=~~?!WTd@lMwJ;09yu zrkh_J-$mE$Gub}*yx#T1iL3L9EC0Qka(h)_Hi37{<%9N;p)Qwu{m3e-yfM2uyvWh)HJcxjcZ)8A6^LX^IkjkL+rVX z9lZw?e}u2#nZqr~{(hUB*6j@)T}INDQgg4o++%k_+Xc~i8*{$cAn+?kIN+d8jCn)EpY!A z_0jvnbAR^8TG4CJJ(lYyTC+7*I-6Ykb3;ez?ZQ9% z4N{BlD@ZT#G1|74>Eqnx2FG_?bh2*AYm4Fwy&1hJp}tXeSC(}{cBb8dBbV>5by$;X z&U61yQcEm*T>9?gRe|lE{Cd%y_d@!Vef8y3PX#WV?bz8{XlnOXI>EADkZ)>KUDoFZ z+ZAV?eyRPEW9QF_(|7)f|MzIZ-vB0y?^-V{^QusySJAAqtxF{m#3fS|K78BU+|_~Nd`JfFYay* zJQ=rqdPjd(rQH2T1vRBn&CB=syekN8^6z#laAT2J#y<6F%?YioBEmQS>D-CkCVydS z$B!=e{R?i~bB>+=e*2ee(y_b=b9GK!D0yhH-XuIe#ruV6xt8?#`BP=@ZL{0if7XAu z%Zl1*?xJtvm%nXgT;NdGzBKCjBcpfEO#Pf%q)VLp;&{VXe~~_FBzNVgOTdK}H_l6T zbAC8?bk3jWyCoUef4`bhWZz@_H8yd&%FBQSce@TAxOi1_&B=Z1UKHzoyp^a|Qz^T7 z&yI)N|5y|@nY>iLE4BN*(k@$#4;ud~lixJl->O*s?p{qZ--!uZ?rBF`-%{>8tM0HY zod5bAUUUAf;cXO=Q-F}AEG*;1O?(uZSUlvOi&R%uv z&2sS<;wAcu6Sh=sc64C=8zjAb_0+$%w zS$v)~OI79ls!%qc4Y5j(8jj^ny1{cq>ASn~+vMx37T%EdJ1Um4WxufC(tuoddG%K- zL)UotsMyVI{xwd8x09=YO1@vEA;TO3VAYN5bb1 zTSTmWYZd7j@Aj;w@nihjGt>L-znoTXd~3h1p753M*U_uxJ%1K_5l>l?tkx^7CunFL zxj`|rXaBdi%htu3T;;D^>@`2<#Ea6G%EAAH+oNX9yLI;S)gp#N_Z19Fo_gRZ)Qm!04ao>gy`l5(#F zUWxg+{=ub&*$ixxf;Y%$Kdt4T^F7h_P~H6g=`w}yPcPG6ID3-Wry{2Q0$cy|(;+3R zLb&6Cl_Y;YnC5JKWBKb02fdTE`UsT`k|rr}OMks&cnRfx&K@mp5Kb z;=4S9Vdln}C5nf38J~YP=TXDs!kaHVDw!_EB`$iV+PPH7;ZD()El;+tv8r=mtG%sl zyZcYG;>=Sa&7;q2#OQva+*IoP7AD zGZ`5{H!qM~jCThWAsbkg<0Crj6TmfZNsVEdkj%lBRrXI*eZuRAK`yWKih9qrcr z31{Rlb~?=sn6F%U>1o2%lzM@Em2Wm|YLk<{^SPoV-Qw!@>;s#t0|QzLU-TVjl}s>s zwn+T5p3lwj;KcOku2iD7oA{=uz){{&}bB&#$+IlOEax#RwMdnlARHjsN$tm3+3hyOq|; z9GPrM%cj;EOFX}QF7wxfhqrSl?csFh=~*e?R`)_gVAf5?XHWmtyF1)kFW~sv2zsukD^aEqRlyAVbP#v){{|Etgt~>^#e%rXTJ7ZNE*VV~FBK{Yi^rJT3`zM^2k7BqeRN`_ONTeuj(p@??&SO%1qx zFo~t~#nJ*6p&PBd>&=2PcwXJmx-xCY#4_m(_X?A;zXr_slsqR)z}Lb?ta(AouLYL3 z<>D7+D!#KeWh}K?S6J8jiS)8g*`H?tJ}&l9-(^zK_r&eg^fX8t^J;w<(&xIDWj8T7wl%L6p1ctJ-D&`<}1fye?x~4=k`8) z+r$5EMb5G_&XHaH+r5GwRwyd=Zed+7Epl|~ORhI_GoPkS{9JXTW1;$wiKUuXmkKUA zWgl^vdC~v>OnZa+l$q{r6k6CUT=_shw3jH!!nj{ZK3rRM%T8|J@_P zv|6)#!NcjxCg|nzSuTRB>wT{KZ|@$OZU~} zJht8H4xaUK-nK`b5C1<3+H{F2W9G;G*^1gn?sHDn=I?Gix=OdYWYS)*ORAQsg5Zt^7c=WZ{)3LY*-;))p~oXn#y@d9rbJ$dOl-3b)T~eAz3I zBPO!y%kh(%Kjn5EcaKzm=yPXhX-O0dKcg`3o%xPdmly5s<$c-VZ54WtO?FqO1aH)L z-mn=@*&8+fbqMya3QTpVpRCF{bBX9)4k5!2H}+O6Q~1oXFqyMqgAe1rIHh{0sbA-} z7uNrsxocs=Tr-l+?|h$o<#DqeJe_OtbXtf2V;GL?JW2EhC;k21Kam6eNcCE?^eg)l&Slo+$SgL zORsuy%ylceVA}IHOxn7eu@y1@W zeFyJMvf-GP#Xe=q*2SlvU))n(cm z_9a2-mC=V+@6Gg)t(f;ddhLe;S=;a1O=11;MgDo>vo%MiPszB`{L|cd;;xkR1FC!n z%}y@#m?t1{pLfBzW37fWE8=1d_uUL^@Kfen!})Pukm8>O9A;JS#;j2_P7!NA%dQNc zzk7a?!>R@EQs?b0o95Mart+My(RM4pvokwt-`(!DZ4jun+BoU3*(>$0PqjNN#eYif z`mwYzXw$sa+jji_&RHAe`dq(3!IIZQO{xE+@A<9Qd#ggP$(a2VQRL9lzWqZ|TVUhN z{B0|_cp?OOEFQK!*>>&b+*cu`Wz|g$yEh+_nsiNjgR#fM8AtaOoY1N;Ofv0mUB%|h zU!cm|+N-i8(x+;te@#vO*(^t{{3eb1j9Vqzl}n?$72NuFe$kW>__2{G+sXE+@TC>c z4hGH7)V$KY@B5?fsf7onKNVg{EL)z%zayb$@pIkwRTUY9JEx1j_)vZI|7A&+$on?x zyH9ARztD8fe1AM_ai!~nMcZuewsF2zO=9Hn$-VaWn`*IVZ`Dc>TgU(JG*{o&Ex)=* zZQt>B*{Pbdr5YGc9P=|@{7fTivwgqK((ktAM|6HW%&K~%#{B$7_@BuyQjWIFs<qQ%nJRwGWLd!!`JuP&6a5XmXnwK zCBdfJX7&E7*H5)>N^ZGw;5M7YpXyW7e(TG}Km4rZDA4Aqr1*1g#QFH=lQ zy(S6&h|MsY^zh^Xd4N|xQF zFAjU&%wT$2d|3Z+q4&9~lP(zJjGA67uXRYt#uD^f#|{&UK}+|vz$ue|r55(}Ca?Li z|I;t&H>)n4oZ~Tj>69PqB8!uh14QmB3#)y9ccAUR=Ajn`DuO1i0ji-c>QnO`NB=l@ zqUt5z@p%WBP4)RM#cZsLyQvla-O%#tn?F^)VU@8 zgO=A(1Ja)!-nK9FU-FA@ulFimHemN&lwxGURvE5YS40rP5jg|Cr+c!yZsdy zr^VTnZgURq{Gb1OvCs8`LTbWmmd<-wbMh zFLIRUS-Z@&|JC=Y&TGfVd)*K3+PH0RD>bZ3?b4D8P)la+sI{(+@Xg}5CgyT`z2wDU zrMRVYmi2^rq??HtUzi$o#kjBeUBa0o940~G%27rI=}Oa7w^fDZ%~6Q%Kjzi{B-5jK z5nKJg#Lr*<+%x=mU6^m@&dq&Cb#_=j?=}#&7t@)wkaGirsx8C%RinxDV<<1p+(>3IJ*Yg*B|0bhc`|v}I`NNBAk}7Z6&TA{@ zpU-r3BhQ&;_iMA%zgLE(OxrQ(!qgY5yo=I=+`AT3t@+I&ns=gOpU8K$_oDN;4#Z3U zI2ZFer*Dn34#%(X)9JFeua_U0s~2=cZuUm0Iqx?cgfsiBzOr(sh9<9&OX9MVR&GYt zXLLTxPtDt{ZFq3P{S)WY!dW=EdyQ7K1_eLk**ZZ!Y1Zd&!fRFfGfO|;xTA3N#Ifa_ zeMZT0^Xu*%OK>sgxb&0bqKf19yuCsXbbfD`rTXTPSJJ7Od7Bf@)Q0W-(_5|3s4|f>vy;yi_flu(X zw{w*)b8OPHFLW`=Gy1H5ENaJt*3(lSEu41dhh*~hOHA9Oj~8D{ozWC2T(-N7@kWsv zyDHnSC;e7$W>;2szPt6aFpF(f^R3NSWIW>LhnD~lSJ>3JQHn_x5V!jeZv|Ag*k zdNlD-d*1n?(kHy@uB~F4vMuN0&M*7+)S7QEIWXh5VC$aAI;N3z!WTB>ca>&!9?!k| z-hXGuztnq&jGmiszq?2Fy8P<`dl}oHv*%?K*Rz_n-Q=BO!>~hXimLOB$)cuzVlp?b zI$mb@+4+*lgN%Z;#2KsC zbQVq7!lv^}*?IR%ZyD?3jx$R=@9CXxo%*>e;{1Ul%Y`PYZu7XZ?o8yu&r_sUK2uLm z6npgI-HAK5<`*q*X3II`zq9LDSBm35<3AoQqJ52%3{F0ZR(!#2bYg`|jTTdSQ}w)! z=ho-{`2ByU%7%%zZ9}&;fA{;C+2C!|Ij{SX!!$w$U|H*oEUc1?HPQ;Z=6~HcKZ)@U&0P z4t^(xLk1g*Uc5NRlyP@L$&T)&n`YmV);)SUh;hg6&zHj_tLC`2aC6jhrf=g)?P8T( zb0*;c154fl{_52leIY*&YVMf-dCsxgJjtyg42kDsm-o6|p37%Dol!iDUuDVj!u+yg zvvRNN@|Gw1-dI_MUpuH?`EA*^$Bo`gt6oR^3i1h>A(5fwqN z>P3g#xZSn{ZC$}|WPbP7sB1eH71|qGRlWKr;2I^uT5YQ!XFk@L|g$0syL$IZyhEWsl1|0JpD{?c2PdL4c7BY)SM5b13~4%@<* znLlmWSv{BaLhz#-7i$6*O_rHAf8FdqAsGtAe}gQ`SO0qv9q@3WmP!1Ba{>>i9e>c< zo)*|}^HwX*hGzXUg@VGXwM*9Vn5H_M=J}m<{DeT)vaL3MuFL&@c0Q`r-_2-M-;<7` zfqU}hrbx4jOi%t9HD!lA^Q6gV1z$yp=2nOYHP|eBe4_bm+$x@bYdm=h@63L!WLfvd z&5xxoX!*Kl@8-wx_$-a42M%77|HkRn|9X?ojImI;f2+#GbmfnezE;c7#h%}si?~QAc{QcmQJz=s- z-%LK_Q>Giawj{|`=0u#;Qj1-)c5`VsuDW)0EE|KK80ZPwxms*D z*uw5^5ji|h+T(`$oFY`IIWZI6#dBb^xA0-p>Q|%>H4?2PR8>wta$63@Fbr1lKrhK z``vlM$Nq ze%h`nmsKY^Zdvlz_jR#B+m*9lJ>{<2rR(gya{lT;p7R1#yNw0ozirv_U%B*?kLoSo zJrjdn0+t?+5qtCeXKt*Z{fB&wHZgw<=SOKTRW6BS%Fi<7KT?zHKL5=N zd&$n$1{DVR;)m;)`1a=BNxwZujH}?s%ydz`b^48I=iH{neqUZzO$!( z`g2;8=gOHkU%K9koSCHjtI5xh_uJgh+<_LyMFgVWe!gmRA@wllT-8^5X5TWO8^s{v z)-d$x%17>>~=7IC^jR`Qv8U`p{atBJcSM0r@fu`<@}qaUk@DVpEuiF zK4V(m#Pbt&obKB_?-|$Z%fUBn_uu>Vrk|nKC}H^xOgxBTFqubPZslyrqeel z+T=6#^WU`m{%Py1SA0%=S}7mmwyH<#@-`dPL^Zg+`F`{JyPT6EUGKM4yI%BNzFgFx z`_-a~IKv&i^S(9uXFlI&y)Mb!F?~si&4~jRiP0$we`y_w@;p1&EU@2()oM@j^Nox1 z>sD0H)?j|~uejq)P0c#f2yFvp?lMpP_TLF755-%5{j~hqjTqIsdkq&hsMj%DaT)8& z#QOI47H}$Wn%eQk{ai|qh_>bT*Ou=5ZGCFpv_tYbtBnghU;a5e z{aw@Ezwdre7oO?Z^`4z8=jdO%_fi#&4pp`}>_%bf``f?UKbNmxXf{u!eb-Nh_5a=^ z9sHwF@qFI-}Uo$zW%oE)tP^*gye5MQ(@W3&Z~a$ zild?~>+Y#$r@WOGw@$bic=f`n{a-IwU)+5B$;6e)TV|dr@s(Z6`O7o*!Q!=CO`Bc? z{n%D$Jo_SVdag>Bn25jP!L@srH8owi)Wt17tv==P*3?%?=0P*}_FOCu4sQ0GwcE$} z5byW?BXTD{t0pWu@_+HHTP6I-g|lXr%-E{o9lS#99y{;6`Y%}h4<2m6F+0?A01Z;vuh4ky_TN1aKX>yl?875<1RJ)`dQc_ zQMomF%IB}EYFHCb*_@SLYV=!XD(B=HmW3_uRj;|CZp+*a-IO}_?osQ7(~c}@32qCS zo|Ni!RHREGpF?ef+F?z;9Z$3JbxqbxI4!<+cSBF}ht-Gfis=V$G@Bf8_3yz6zcTMv zAChgEZn_}7{kew1T>eXo?o_a>zWR$JvC78&lzMoeMwJ-vb8q2uQfJd|dw!nCE_P;Z zvBjhvE0%n#lYXJLo#jD(eU6Bp^oOWviEVGcC`v7!vBH7l^(*!`|u_6Zl?=yOj#R`X-&^s951t$v>YF=VAOfk?Htr_9MH`UJK6e zT=ISU&J`XnMEUxBA1|GoT=FGrq9o(CL-}%jOgEDIZfsGMQ1)1V?_c7V=(Jq>#-jC? z+k6>#b$9pqPoJ8>z|))iVWR^3%C*WfC;k4iyKF-Tlb6dfsYy2&7?Oma?2?GhR+8AQ zyxn`AngbiFZ%v2NX@RF*>EG^LTkuNq#lj6PoO8e_|Uq0z-s(=Gus&$^? z`=$x)F-QjLSsv78qtuDJ9(b7NwS&8|juz0;4Sbrt>vmv<)`@8lKC zSRUIf9e!eokz%%jfL+9@->EyaVzu{OZdqjD7;4G)ZK_Lpkk%P5A@0e~_qedm&KHny zR2IE#x#@(D@dt}Yw`0o|ux;29BzvvUWVx(D%j13Tf4j~o*u2+e`JUQ|s&d=wm8S82 zxuA1fmGw>D(gg~tipyr*ObXl(9=Yf^<12^5@lj{WO?6LHPnt2uKy%ew`LlbTo;6l{ zH7`dtCHNQb^ywBQ|2t+dZrr6i?R({q3(8!ZWs>ijnVP5>J$#uN9_m)qyugj?$EA1Y zbiAH_Z_eXiGS{fqA z>*d7{ol@Hto=~2*O)=!dL@wL+%Y>76pXO_Rzj*bbHQ5HQ-u#iPUnUxPEcMgT1IkIS zeF|TRRJ-5sPBnOYXSb3|&qOuu4Z9_r@4nPMB~^O#d33CcqwRvbvTF7hKbX#qn4v1U zeAUFe&Zl;Yc9(0CvlYTjOmfn~140S;+`I^LSkS(fa+G54-N}di7-Pv+kAV z_jd&GJdjS&)brlBwC+vajcYG&YTo+BD&8}#l%unIe^`C%{lf3%Y3~(hC$0ac{^5CN zW?^pA4XFZ!XNPX?iN0PKm2-MVUz>aT@|`7yOIH~&-J5IlweWI)o$c}4TAh!yJetba zc=Yn<-)CZpxA}4F9@G9*Z5x-G_7PZ)ulC)b5EYn^M0uxC-6$`b?lV|j(#7HtXQF)@kxE|*{xH{ z9_`s;WpilRxBKC30T=K6z8Y%fsB`POoa47c4rX8fS7)4$-51xicN6RG&2t3$D+5iX zR3^^YX%cy^MCiWisYmx;%j8WJmp%43q?O(8w&3jM&lmnKNVCjNpL*cEw#;iomZ$sp zcx&DrOK|vi=i%oQ59ePN>*y)juIR;hE=Ae#^=y`}3}xXrf0=3quj#rs;nTNH)z2&X zLe0Kru*l!}WVY|h@0+`Hk6jVczbx7)f33;%mV@K!nOhH-9tqJ>=b4cjU;C$4(#q-x z?R=JY`Ir`i{7q2`mwCyyV*A|PuS(va`eqrC-rQVfx>7t(wUO%|QV)nw5UKci(pGwf=I?G#} zH`n|M^S9+6oBwNTh_O|@kU#4pWA;Wf8Jr{cYd2B{i*nPw`843uv%zbR_<`Dbj-k5ic^{;JVF;l^PY(D|kA z!rc9jjdrvAIFTB?cI~v&Sp|8Gwv+BSyFI@Yr>&r9tmnMKr{d0>-#@QEu-T=@wma+e zrWxvQnh#7ro@}^!$^5r+E^6&tty|bq)3RTtEAdzFJhg8APLCJ5%1$j}-+Hn>&N_74 z`}N#p?S(6D?s@b_pj&o{yy`ER31xAasVg4rC@Tr!xbW$ZpWf#;w{z|4qUW^=2%Epj zIWptaagLN5Mn@I%14^Egcdj&l zf69_qIW21Uw69lB@h+KJYH9!1^471M>~jZK7D!jEk?#)5YTI~rvP;P)=11>V=$0(y z+xxNW*#2atpC6@|*E3F)&`El5TlLqPYfBIQjg)<>7?Qc_`|lHM%8x%zjEw2>`gwf+ z4WBEQ`_sJ-_03!9Db%reVNhwd;MV=e*IqjG-E7SPn+I&>SB}?|-f!8wq@|HUxDRo^+} zNh?QnM!fdP=y#w0wUl$k^%sPkFbrFFEPIA`QG&MfoqoUIu%(^HuJ#LQz2}owKES}A zDLJKd$+}q?47@MHEf(}QEaY_YXxv)=ui~Fh#kxw3=3!upn&!_w;e(;^3B%8cwFY)S zmpKZ&RG7Ngx2{t32GatahXO$=ySc1iTSn~l+0Q-w!RE$BDZ3C|+t`UYE0k{k;A-pN z*_GPiHeGL_j@Q@MdZ(Uq-KaYKGnD@XyO{9hOrg~KZ(IBWr(82SczgH6^(nFQYb<6? zXJC~&cQN(ZlYrFJ;MrUoPkm&*EZ+PlBjT6rjO^H1rH4DdE!xg!{=@0NO~i~P)}5L+ zE}V@s{wyqBbMnvwxm8CV>2GZLInUI=VcYMx_1xcnzI6D#n7jvlL?MSYtcyU}6ud&^4gGYhO9Rz2zOo^~VX zN!6lAy@1WK6GgwJzKe@^bZq-7wajj}6{3!(Gv_(`C9QsQ*jlW6Q=6jv%wNI>`$G=r zL@}h?zEJC&Q#Q3@=K@8Eb4yvC_*&nv)_!K1D!1)l>anRWmU;MaeSWuNulbDk3F}=7 z%y}Z29){a_KlZrzF~PFpu7Bplz@+l>Yr3L`PM@!R@o=}5_Nm;3Vhe7p+V^+eMRPUI z-*ep$20c7xr`dRW_xU}uv*twcEV=dSwY$0T>lKj~Gqo2gKfJxWD*MOHODWomRZq_8 zJCt8?)u&X)PU!RD-6wi0^{q6XWyCw3JyluT<+j&IRidnBVcYVv{NA%C1WjeTFQ8)G5 z>D88pj(qK_02# zlw&EXf2;rAQZksDaa?`(=G7h5_bc1h9sBiTSrFe5hdbvb1+qoztM&f9S|hUY$z6tr zi?7yqP5-g32TE3cjXrxcGpx8Re!1bvxd)G@v2Z48GbU6E zT21)iV##6hH>N+-t}_3)?Tm@@cvpY@dv)cZ#HOeJkL~#Bk#4(C+9h-KycDBbv1QZz z88uS1PhLo0YT(6vQ5m~j?qGqrE z?&HGUe8%sl#{H*{+;+ zS0nv%*0Y!|0zvcU1aQ?)`Y=N!M7TLmOZQ~H7~e9sx2YeGzZ2Te`&L|e?am$dJ6`Iq zduPS2=fGF?(vn4pMe<~U*c~rZ#zlTA0uHgEiG z+u$=#j*u|KQ24XtQlUF_ePZWiU_VjktKjQR@B19%!ylUdiU_!|W~Dkm>wfOsj~V)%^$)somdGBG27yao*-0*0f*f8q>EcSA!=eC7kG* z>ip#7hE;9Z+bW-T)*hMT@{j96Leqov@}ix*c^~idr_b4W%CD|__vK9?2V>(SyPl_? z$gTJ8-CF+kg?paZsyhuGKUh9BKh)ywnRWf}r9cT6odBOanU{MbG>w~z3vZPEt9cvx zqHv`}>F%sT>*reEPbd}4d=)fp_p7c28`e!e@%WF8>@oNArb2b67)#rZ{&8){V)pmj zTK?e4pHFWMChd4FWpLt4+j`$9{g&!K+qzWzybm*$$Se-e5`6T_e3$Dgqu{uXn?=t{ zf>!_J+o@)>(A4s@#c}1CqCtBFznI)qHGFebW07oP)V89;)|8t&XU}qdef1n)M@4_86_#)ndP^7cZ>4x$O6hd)r=rSJ7ac6dKifvAt7= za~fx&*K<*m4+ZDXhjW_oyx4Qcm&KZO;l17!B2x@(6juwz{QKu{|KTQ|@BHR-3QryQ zbG3fo@qYHri+&mL#4g=>=#>6>DgOt{-{u`+isbuVaY=3Z*IUV76|?p`9GMyJKK1_f zckkbad5gL)xA=5k=HnZoyo4FGN{w63e`tMoxb`b!$uC4GtK^6^YKMoWI^ccZvAQ^1?rU?^}eAHhAyg zv0xR@c`~Kbnn5D?^^+UU9BdObw+jV4u49;2xVuDbKvK3x8vA5+jBlYS33OU-y89dUw+tC*xcW^$f&$JPdNktWA!EmfQ8xk`wH_p% zllk_4-Qlo}*0ztbw*61xof*zKZT*$=_q`r)=seSToVEV3%7o|NoL9A_lnJa7H|6`_ zv-5j;=6sLi{b9<|*X}e-s#bn*XHkdw>u(1HRxM4h-sK$BxbV-Ud)qZioqxFfVSczx z_R?pGu!{Hk)90qeT6ONvUwLc##{d7Wytp2Hs_@x&?VW0OgKB;~n;+f%uaxgPUyfv9 z{XNZV(fdQsx-mSl31l_;l%TrZMB#~k8hb>^wo5TCl?m&=+$c0H`o6jBz>~*;y?<2N zFTKuiN$&YnlNfr&PF(-pr{fvBUfrI^A!sNazR_Q|rt+UflFRA~+Dr9o1N#E9%LJ$X zuX)31w_Ph|&e9c%GUWo#3ND2HtZ|t3{;Yt{!)sm1J!^$E?+IR6pD5fWU9E-`Q6mW3>{>S`Dcxu5zj`a?LHooV{PZ;pAIF|isG7rN~3t%~b?@iHiu zefjRy(ko90$a5#H<=S*%?nSX4-cOcqny&7ZoT{|&sAAV6iDliNA1voQHgn&n|4aX> zRkdCF`77#ueBjtF*z>gOcwCdWyeGPHbC_b4^o|GL6BO0{TToJ;a7 zFP;Z8f`88Mzn*k(cha^+yBAum-o4R#x3Ka?=^e9{CtApaHrhCTTx}7&DfnsP2*aUCpT*mB zPptZ-!@O|w0)cf>M;A*TTK&l6(8}t)|CfB!d^aWgZPJ%bEgQsgj)k0hGKD{Hu4ks~ zgu`F$*zaxY{65hoFx&R{fBDVf$64}c`EHjFP?>c@>5}+_2|p(<{b>C`_mtx9g{N;N z$A&P5G*;ef(aLRIQ`wsMytDYG>&mpX7nR+4yHEAzhsN@0zI&!#v+1AnwVSak`F_+X zoe7kmcCc`|PeX!;Qv3C*kn)0P3{O4t3P9BcW-WSS#i8Fq_mCn0; zjk8y4H7>Y*+Q;kslImsC_oQxp=T>bqTW0^A?THf=HzhCp6r8^7*Wr2L4_C>A=!X6D zJkMBtmF=TJ{>B)Y+GUB-c3-zQ*&Ymjt?}{!hlWUVdxuvumR*|A?sxiHzKm<1)3N>U zES_vm%r`na`Bdqu!kXVkobiW>H+@|Dy(MmI{LE!3({-*tSikRt?61zkmZPg9H+WRs zSbo>_DgSP{IMePq0{z7kf}Yl%_|5z0OvMJz<%+*v9kyPnxV&YN)`Q7@UviB9@i3p? z$a|n-b>9VLo)4#tcATnNc1SJVUn8s~%zVkhAAJ;>NK6XKYb4h!j z-koE0`S5z%VzUoX3)gd$7>Tay-9D#d>eI{!x8AGz`9?F#gS zuU=PI4}J4wxw&EO{_79V{AlXh5aibMa$4a{m9OfIQor+8Ri5Y z6y5KP8+)Ein7<&O+3;i6=E4>3mRqGAZR6{0wxm4V;!*ZmCtTp#HCFNB!o&QpAEw5o zU6tPM95F@u{?q>gPd-j6wevpucZQYmT+<2ilXCYY?NG=OopA3?KEtW2{B^t6H@p1h zTY2W5CMUPUS$F?_f8AXhuRn=$St$93{gU~^KB+F&p78Y8Y}FQFmX*(@2d#g0>&IkU zb=`T>jy~6XD^gs`I!S!?=T)kE)2&S$?edZWbMG;D?OYds@#bZ&UFC~D>Iz6ZetT!f z@V#mK&pyvJJ621ld7dZ{6W7xb?A7w#H0!2Kf9Slq%rieMOVg0xdb=X}h1>P5R|LX1 zUNFDfP+IxDDF3fn!V<+Umpc`ZY_zupPxwCLjcjdu^tV-Kw9zSW`=>{L~F;z@ef{C;0WU9GoLtn2v0{v}a%TFUYUGfuk&Uzv{W zvuc%&6QBEcgHfey)UIRSjIO1%ryLd2IBnxK%lJaQS+Nb*is&7BOP`g_v}4TJ^f}L_ zN_Flf!PN{m6V$)GyRg6@lj)%Sx2b^+?=DrIi!ru&6uR#h>!YWevSya>J$dQmdXum4 zO8Vz{hkqFs95a+(X)1VPS<#+FVP>@3hj?@KDp=ucg%5&Hu}s}nQl{L%Sy zTuGI!^rz*c>M5Tls?DCE^(|6A(%2WJt_aMW|j;mTctaUrn zipp8-W<+n@M|DYcGa4FH0(jjy<;JH_OCuqIQiv`L+|_}x!-%2 z8?4Y(w0m%R#gRM9_B(yy>YjbHN}4x!dAg|Gk|S^Rg=YusU{Bbzuq|;(*x3~}*$)@_ zI7)T4t#_%sRKaiL$rA7BUu83II!hOeT=$FoF13q)U7HkTc4tqK`5^u9z(tp>v*Z0Q z8SiW@K6?E8v&-|oGZ*un)>&R0>s_S$sx8qwWE*lpSE||=yYwKsr1K%_p+ux zocqCJdEjjA^Xmh>>lPL$u1nb-O#6@s5-IKgyXL~*? z*zq!Z>(=?Ub!QZ}zFBchF=Ma){{H$~RqY%%6nB1>dQmt}L0|ex*@8apl}{Rz4lQkX zyKE}s`%CIhd@DM*!kNuyd;2(sFI=~B)m)#hCz;zWYi;LXWZInKRvaaGuC;G@@`=sa zO#FA`?O)xNouK>uvtnQgLz(6G(i6wp=Gd2>{-@#jr`vDeMC0t0vPV~~o2vXoEw?J! z?}~b%@SoC6X{#F~_D|X^6R`07{pEU%daJ8eNIzLzAoncbjr_+o|6(O0eIECoIsZOO zR9KI>^oYHxt<|;m_<|+tE9Ao7`F{*sVPrY2F|(=VbGKXe%eIXzJLGQ|Ev$HRP)H@6 zt?<+PJ9*V9)0FhzFr=I?`MI#Tl0j)-qFCf^MYVbS6XXN8a&~51(&(KKtdV5Nx#9a_ z$G7~awoa;l@mDp~=d*W;M&s0sYWM$9(_E_m#k~I4y?UYDABA=Ia|PR5m7^*gwNqrD z?R(hz()h=td+gVieG~b|qdxPx#D-5VKWaVKJ3iy{gk251>Aja`Yp#BLB46vbWk5=- z=;XgD8Lk4lALksHXv61!?VahivRoc3)o+_@|ITyX!sX2Oe3q=O%cWf_kMCcXrWfhp zkyLp10;@%X?xr%6!oPby@Jw2#emAKB#lwogJ{d@9~i@#ZG!0>~|zYwiPqKS~exT@xtqVk-pN9qw^VyT_mSW zcn~?oXE}qG!h_jzQY{(J+3bvE-447h7u@^3Vau{Zn|DYB7oU3)ar}{GNvv@G0fF~H zQPuMg^j&zke6g_R?8cs3t7o%mhMDdUcFPe}N}BZlcSQ}~Er-B8GmR#?yk1dqd4A~i z^1UoGcg|ZNws6_>We?UBtxC0-`RjPtI{UY?rDo1s@=NE9ip{U{`x)~#uRHko&J{&D ziQhNQ^GrBwHzm^LRBjfZN8Ad_`WN>8o6`F@^cdD zp4Q(>ciz#oM-pt-Q*rpL0a2{>0yxVpI4mDijK> z>!(_K?KP?Bm~>2E$nxXjB~BV97d_U7-jmZ|tBKL!%SkP}vZN+_*3lb(s;5})ZqEtd z%Xv4=RV(J{#UTHR3(xY|UzX3Z`#y8!V!^0@Jx32eJhx`v?e-9#&s~hCjAwmLTXbcW zYa;s`=A7Q;6_!OQN2^4y6~@2#&@}yD#k*sLhgOCecN!gOODfoqzqefY@v;{uUHKmw z-CFSF`TPXmpO+tJH%F|i&7LcE(X^s%Nv5H;cA~Zfdw=X{-44dKgEO=)ADfu%_T)fL z20Opj!%4Pxk7n}uPXC*|{KNHwj)Lwya{_hpyce&|`Xdyxbf?q8o#&UE|Ghn_Avyk9 zpUGlzPljdMRyOPEFBplhG<-IvFY>TWxIj(b6z;jX0?S1Y7D;-~cbA&E=k_Ab{%v<< zez`hU#IY_v%DeiD@Vu|@&h~IW-^y^vtUl!U{LgKByd*L&ZMvwGnz&$s}lf%VSISA^W&>UcRPfHff4W8L}H{9E&@zkGPBnArL+p?Hx^ z{{Q2_8BC3>&kvP{8s6A*rQ+(BFlJ%hiW6^6F9>p2*(m7}$oy5~^j!Y%LdKPAyyQf; zX@BsEb#yy)hT)~WsoncMO2?m-&W^fP6HusSYwfXe&U;&0h=IjiL4thCZu)oa*(AMD+b;xFhC(sMfa&UBm8 zPM3w09;U~xC^@}y*N)E9sVeg~PH_`hnzKG|t&4(`(-FpR6Q{L&EtWM|b8qQGKlxG< zX)}{aY4`W&wf}iOT~kXaMca6y(-qfKGpn|)Uc2&Tz5LCV;P~!MKJE42kIv-`TzVU2>bb?352Yp*qTzq+kms+R8a#qm_m zdcM9>dS6U;f0}px=Y~U~mD*`rdnc|p78mL5jMo&1xM;O2|5y3M-KO8VZhA#V{G2{R zI{B=>XT7fA+UXmLug~e89h2#EaJ@|FM&16n_gPOG%Gw(yZ0>i}6OvZ?y(6$9^w9sm z>?}v!|7Na|bAR&IO6K~Nn<_Tu8sDC8uX@p9qui7p`F__+`$O~kO*W`pcst2Z=iuZ9 zhG$GyZoZej{L9JH!oTX;g{)h@cjzxId0Ez(@&1|RsXueC_pSYxxLagK%evblrHfQ1 zp6))EuYJ)kD{zg~Hv3aXK7s*Dxee{Ew>8=A3RAs#J3T3Rp7KQA2Y)}7h8g`_+^2t* z>-pnS!za6U39Qurd2nmkM3KNJuT~o0SK&3<&eZ=e^55Z;miBj?Uv-wv$UU4o>(EYy zOLGop-ka+#X)3*~B<``CT5rzDQ~Sd+OP@aF6;XR6Ik%tZn7l2gXrW+ubgipi)jf9O z6h{6(sUQ1V6W+6F#q)Lk=GmdP^X-++t@g^Ff*19!XxMuFO^xP+y9Z3!`jX)J->oSqYJ<`fb+-p^B%lA@*r6w;|F64lmuw%0 zpo*>2!!V`EhOeKmw4B&#>9PB3|IIhEBkq5%Ei2hHyJ_3MJ@t;^=L7wvmPA~*cHxRx z!SDYE5+W~lRCZaL8ct8O%{cBqGr#02yZI%au9nhlc_)ql^Y3@vy$_}@3;G|+E3w@n z-E8%xskVAXW+@BaNkp-of3f8wn}pP#r;F9Tr|^`iP4H3S;JJ1G$(2pa7v*n$f8PFg zhs}wv=bucl6*Odj|0m`4RclS*I1!--TUOfmi0nAm9{ku*l{}zo`l5MEyDvQ?**w zU2Q$JDwd;4Rp#^+n+<<=Ji54zAufBReVXpSSJlUZUFBy_&J672m-?=^yefAO_v%0A zyqwlX&f~35-{t->PkWKJyUY)RkZfDu#swDd9#5?~Yr}Tdb`!^&qQ=jEdA4S^t@SuG zjjN(rGgIvuw^{4X{$trzC6CK3EF_AaOnF`2X+L#^ANwgL4n?Crn|8@Skpcz=hPicR z`%lfzD(?(u_^BpTa-=%2dn772ZgKfPvaw@SHZ z>Mpo^`+G#1S@Wcx5buJ*(#kuznknpk7s9Rgyx4ricmJf9NoV&z;WmsHkxl#IbfQ&- z@7)xq=PISw!Vkx-w^oimyt7*92FG=#J4ed4UcF`XUVG2q-Tm*sT-vZIfX`ss6o;I7 zz2z6J_(YvfqtJ~+BcaVa^{X9GWA4S2tDUT;TH)B`<0@Qtt$eoZughhwYZF@;fAHP;>1}&%uW*oW7jN>rKI`Pa3#^g?#PScVIIirUI`{2{ z{immL_;;SZWLj||?!&*bdz;&3eOmvtf6o-iw9;lx5vbUznDghI)aT0AszLML-+w(_ zl3!X?+KqSB{RN5F|LmR@vMteg+r6*md%p=JMqV!Z(S7Lcy!F%nF1;&okk=>kqsB4M zw=K1{f1h3X#u=mV<*wIzS5}Tq|2$7$|MY1kyPe*GBH6M#;`bl;c+ueeO6^&P?&zwAdYh@rW*98U-9KL; z^!9AeE606{bn?Ca6^7~>@oD_{pe7b}vPgBY`lsCw+bWJ^Y&7l)Ip!uTFTMQv)YEe| zO!aqhkWpNgvXV2N-TPv)uJGkMzYkk%6Z_#>nXYt1Fh%*8ux;1YSqc}WHs()Z+x|uT zXEM*3w`)uJBo7^F_%F94h+n+--JV&OWRe+6Le9b^xSsdKaNkgopZeJ-(EOL zdn(tR;~F!3HcejTQ^7ma@ApDw(~cEamX$0!-E394d+j^V)bnrmy_wJ?}Xf6&NuRwcV7t=-sgGz^g~o8OEag-m8-n zWyQ(ey4o{7$iBJJ@%5%CmsYKp1@p{6=E`hm{|{naC!+q}jru?Tt;Wf%CW>cmncENi zS*#bKc(n2GCGBhCxp%w{&$lb-X*J$`>A+*IO&;H_r)_HG@BN&=EMSM~kE!#vv$Jp9 z-+Jl&-sznWCtq>+=zC@QVU;V{OkWZne=U|cEi~d8y?4aI$|mV0 zV^z4j6?0p&Qbp^WTN;+9r+1&`+xhwXzH6C>GMcM&ncgyS*XQPB_?s?K+lh_G8Xr*W^B(}y#Ln*jvvbpOnJyT_n)=4`psD$YpqZJsJbg=p?{HE zGF8g^%BpG2=2^)$a`W99`M*!t6TMI2t?P|-VqHoKOmjrkXR+q#h;Hcq^<-AWg0!B8 z|Kl@j4_{aysIvV3aouTUSB_50X}+D8eqA+en*0rAxt{y%rfb>nEI-t2?%cpMUu$>A zKTSrzV1-HkF>m*{_MYDKi+Kubo#yTtj5!CEzS+RwV#fMsWyLq8js&4!&+M|C*}S3^ z?z`__@KmTcdf_vdtl#VnuD8ytGe5g=YVt#szM$F-D{sDAR6g^%a!0psV4S7k-u0b3 zm%87&TT>^LI(d$A(xx2&@_`XE(x24KtdKZe`9}Br=Q8G|Z(IDugkCg6Z+>+k-e)Zj zf6Vt;Qh%>a^fcjF|JU*F-?fireJ)%x$-g6G`dXl6(Z*v39OKVM&565pa!Jb8*^a{h zzD?PFeI`ez+m(sW#MazUcAdZ5abdH?k9$Jf-iM^c&8jwA7qs7a=~m-6eX}U6!-Ev#>jFgG%0DL+ixxA)ux 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 literal 0 HcmV?d00001 diff --git a/mawaqit/translations/en.json b/mawaqit/translations/en.json new file mode 100644 index 0000000..c39509a --- /dev/null +++ b/mawaqit/translations/en.json @@ -0,0 +1,135 @@ +{ + "plugin_name": "Mawaqit", + "plugin_description": "Prayer times with live countdown, notifications, and azan.", + "panel": { + "title": "Prayer Times", + "sunrise": "Sunrise", + "now": "Now", + "in": "in", + "jumuah": "Jumu'ah", + "loading": "Loading prayer times…", + "tooltip": { + "next": "Next", + "time": "Time", + "in": "In", + "tomorrow_fajr": "Fajr (tomorrow)", + "no_data": "Fetching prayer times…" + } + }, + "settings": { + "city": { + "label": "City", + "description": "Your city name in English (e.g. London)." + }, + "country": { + "label": "Country", + "description": "Country name or 2-letter code (e.g. UK, DZ, FR)." + }, + "method": { + "label": "Calculation Method", + "description": "Choose the calculation authority followed in your region.", + "karachi": "University of Islamic Sciences, Karachi", + "isna": "Islamic Society of North America (ISNA)", + "mwl": "Muslim World League (MWL)", + "makkah": "Umm Al-Qura University, Makkah", + "egypt": "Egyptian General Authority of Survey", + "tehran": "Institute of Geophysics, Tehran", + "gulf": "Gulf Region", + "kuwait": "Kuwait", + "qatar": "Qatar", + "singapore": "Majlis Ugama Islam Singapura (MUIS)", + "france": "Union Organization Islamic de France", + "turkey": "Diyanet İşleri Başkanlığı, Turkey", + "russia": "Spiritual Administration of Muslims of Russia", + "moonsighting": "Moonsighting Committee Worldwide", + "dubai": "Dubai (experimental)", + "malaysia": "JAKIM, Malaysia", + "tunisia": "Tunisia", + "algeria": "Algeria / MESRS", + "indonesia": "KEMENAG, Indonesia", + "morocco": "Morocco", + "portugal": "Comunidade Islamica de Lisboa", + "jordan": "Ministry of Awqaf, Jordan" + }, + "school": { + "label": "Asr Calculation School", + "description": "Shafi/Maliki/Hanbali uses shadow factor 1. Hanafi uses factor 2, giving a later Asr.", + "shafi": "Shafi / Maliki / Hanbali (default)", + "hanafi": "Hanafi" + }, + "hijri_day_offset": { + "label": "Hijri Day Adjustment", + "description": "Shift the displayed Hijri day if the API date doesn't match your local moon sighting.", + "minus1": "−1 day", + "default": "Default (from API)", + "plus1": "+1 day" + }, + "twelve_hour_format": { + "label": "12-Hour Format", + "description": "Show prayer times in 12-hour format (e.g. 5:23 AM) instead of 24-hour." + }, + "show_notifications": { + "label": "Prayer notifications", + "description": "Show a system notification when each prayer time begins." + }, + "play_azan": { + "label": "Play Azan", + "description": "Play an azan audio file when each prayer time begins." + }, + "azan_file": { + "label": "Azan audio", + "description": "Which azan to play. Name your files azan1.mp3 / azan2.mp3 / azan3.mp3 and place them in the plugin's assets/ folder (see README).", + "azan1": "Azan 1", + "azan2": "Azan 2", + "azan3": "Azan 3" + }, + "tune": { + "label": "Enable per-prayer time offsets", + "description": "Apply per-prayer minute adjustments to fine-tune times." + }, + "tune_fajr": { + "label": "Fajr offset (minutes)" + }, + "tune_dhuhr": { + "label": "Dhuhr offset (minutes)" + }, + "tune_asr": { + "label": "Asr offset (minutes)" + }, + "tune_maghrib": { + "label": "Maghrib offset (minutes)" + }, + "tune_isha": { + "label": "Isha offset (minutes)" + }, + "show_countdown": { + "label": "Show countdown", + "description": "Show a live countdown to the next prayer instead of the static time." + }, + "show_elapsed": { + "label": "Show elapsed time after prayer", + "description": "After a prayer begins, count up (+) for up to 1 hour." + }, + "hide_prayer_name": { + "label": "Hide prayer name in bar", + "description": "Show only the time or countdown without the prayer name." + }, + "widget_icon": { + "label": "Bar icon" + }, + "dynamic_icon": { + "label": "Dynamic prayer icon", + "description": "Show a sun/moon icon matching the current prayer instead of the fixed icon." + }, + "text_color": { + "label": "Bar text color" + }, + "icon_color": { + "label": "Bar icon color" + }, + "active_color": { + "label": "Active color", + "description": "Color used when a prayer is happening now or in elapsed mode." + } + } +}