From fe6147029a1f3312b513d8dada07f2e4d8d04736 Mon Sep 17 00:00:00 2001 From: Jared Goodwin Date: Fri, 6 Mar 2020 14:21:53 -0800 Subject: [PATCH] Add server admins. --- .../Services/WinClipboardService.cs | 18 +++-- .../Account/Manage/Organization.cshtml.cs | 7 -- .../Pages/Account/Manage/ServerConfig.cshtml | 26 +++++-- .../Account/Manage/ServerConfig.cshtml.cs | 71 ++++++++++-------- .../Identity/Pages/Account/Register.cshtml.cs | 8 +- .../2020.03.01.1355/Remotely_Installer.exe | Bin 276280 -> 0 bytes Server/Services/DataService.cs | 60 ++++++++++++--- Server/wwwroot/css/site.css | 6 -- Server/wwwroot/scripts/Pages/ServerConfig.js | 14 ++++ .../wwwroot/scripts/Pages/ServerConfig.js.map | 2 +- Server/wwwroot/scripts/Pages/ServerConfig.ts | 17 ++++- 11 files changed, 155 insertions(+), 74 deletions(-) delete mode 100644 Server/Installers/c9e1760f-9ccb-4f37-8347-7e5f304af915/Windows/2020.03.01.1355/Remotely_Installer.exe diff --git a/ScreenCast.Win/Services/WinClipboardService.cs b/ScreenCast.Win/Services/WinClipboardService.cs index a05cbd52..f1ea91cf 100644 --- a/ScreenCast.Win/Services/WinClipboardService.cs +++ b/ScreenCast.Win/Services/WinClipboardService.cs @@ -69,14 +69,20 @@ namespace Remotely.ScreenCast.Win.Services { try { - if (clipboardText is null) - { - return; - } - var thread = new Thread(() => { - Clipboard.SetText(clipboardText); + try + { + if (string.IsNullOrWhiteSpace(clipboardText)) + { + Clipboard.Clear(); + } + else + { + Clipboard.SetText(clipboardText); + } + } + catch { } }); thread.SetApartmentState(ApartmentState.STA); thread.Start(); diff --git a/Server/Areas/Identity/Pages/Account/Manage/Organization.cshtml.cs b/Server/Areas/Identity/Pages/Account/Manage/Organization.cshtml.cs index 0442b1db..f3505ab8 100644 --- a/Server/Areas/Identity/Pages/Account/Manage/Organization.cshtml.cs +++ b/Server/Areas/Identity/Pages/Account/Manage/Organization.cshtml.cs @@ -111,15 +111,8 @@ namespace Remotely.Server.Areas.Identity.Pages.Account.Manage var result = await UserManager.CreateAsync(user); if (result.Succeeded) { - //if (!DataService.SetNewUserProperties(user.UserName, currentUser.OrganizationID, Input.IsAdmin)) - //{ - // ModelState.AddModelError("OrgID", "Failed to set organization ID."); - // return Page(); - //} - user = await UserManager.FindByEmailAsync(Input.UserEmail); - await UserManager.ConfirmEmailAsync(user, await UserManager.GenerateEmailConfirmationTokenAsync(user)); StatusMessage = "User account created."; diff --git a/Server/Areas/Identity/Pages/Account/Manage/ServerConfig.cshtml b/Server/Areas/Identity/Pages/Account/Manage/ServerConfig.cshtml index 93e6eaed..5cf00258 100644 --- a/Server/Areas/Identity/Pages/Account/Manage/ServerConfig.cshtml +++ b/Server/Areas/Identity/Pages/Account/Manage/ServerConfig.cshtml @@ -12,7 +12,7 @@
-
+

Application Settings

@@ -56,7 +56,10 @@

- +
@@ -167,7 +170,10 @@

- +
@@ -227,7 +233,10 @@

- +
@@ -240,13 +249,20 @@
- +
+ } else diff --git a/Server/Areas/Identity/Pages/Account/Manage/ServerConfig.cshtml.cs b/Server/Areas/Identity/Pages/Account/Manage/ServerConfig.cshtml.cs index 914ee484..cb0a57fb 100644 --- a/Server/Areas/Identity/Pages/Account/Manage/ServerConfig.cshtml.cs +++ b/Server/Areas/Identity/Pages/Account/Manage/ServerConfig.cshtml.cs @@ -1,11 +1,3 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Dynamic; -using System.Linq; -using System.Text.Json; -using System.Text.Json.Serialization; -using System.Threading.Tasks; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; @@ -14,38 +6,54 @@ using Microsoft.Extensions.Configuration; using Remotely.Server.Services; using Remotely.Shared.Enums; using Remotely.Shared.Models; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Text.Json; +using System.Text.Json.Serialization; +using System.Threading.Tasks; namespace Remotely.Server.Areas.Identity.Pages.Account.Manage { public class ServerConfigModel : PageModel { - public ServerConfigModel(IConfiguration configuration, IWebHostEnvironment hostEnv, UserManager userManager) + public ServerConfigModel(IConfiguration configuration, + IWebHostEnvironment hostEnv, + UserManager userManager, + DataService dataService) { Configuration = configuration; HostEnv = hostEnv; UserManager = userManager; + DataService = dataService; } - - public IConfiguration Configuration { get; } - public IWebHostEnvironment HostEnv { get; } + public enum DBProviders + { + PostgreSQL, + SQLite, + SQLServer + } [BindProperty] public AppSettingsModel AppSettingsInput { get; set; } = new AppSettingsModel(); - [BindProperty] - [Display(Name = "Server Admins")] - public List ServerAdmins { get; set; } = new List(); - [BindProperty] public ConnectionStringsModel ConnectionStrings { get; set; } = new ConnectionStringsModel(); public bool IsServerAdmin { get; set; } + [BindProperty] + [Display(Name = "Server Admins")] + public List ServerAdmins { get; set; } = new List(); + [TempData] public string StatusMessage { get; set; } - public UserManager UserManager { get; } + private IConfiguration Configuration { get; } + private DataService DataService { get; } + private IWebHostEnvironment HostEnv { get; } + private UserManager UserManager { get; } + public async Task OnGet() { IsServerAdmin = (await UserManager.GetUserAsync(User)).IsServerAdmin; @@ -56,9 +64,11 @@ namespace Remotely.Server.Areas.Identity.Pages.Account.Manage Configuration.Bind("ApplicationOptions", AppSettingsInput); Configuration.Bind("ConnectionStrings", ConnectionStrings); + ServerAdmins = DataService.GetServerAdmins(); return Page(); } + public async Task OnPost() { IsServerAdmin = (await UserManager.GetUserAsync(User)).IsServerAdmin; @@ -72,10 +82,20 @@ namespace Remotely.Server.Areas.Identity.Pages.Account.Manage return Page(); } + var configReloaded = false; + Configuration.GetReloadToken().RegisterChangeCallback((e) => + { + configReloaded = true; + }, null); + await SaveAppSettings(); - return RedirectToPage(); + while (!configReloaded) + { + await Task.Delay(10); + } + return RedirectToPage(); } private async Task SaveAppSettings() @@ -103,10 +123,9 @@ namespace Remotely.Server.Areas.Identity.Pages.Account.Manage await System.IO.File.WriteAllTextAsync(savePath, JsonSerializer.Serialize(settingsJson, new JsonSerializerOptions() { WriteIndented = true })); - // TODO: Save server admins. + await DataService.UpdateServerAdmins(ServerAdmins, User.Identity.Name); } - public class AppSettingsModel { [Display(Name = "Allow API Login")] @@ -130,6 +149,7 @@ namespace Remotely.Server.Areas.Identity.Pages.Account.Manage [Display(Name = "Max Organizations")] public int MaxOrganizationCount { get; set; } + [Display(Name = "Record Remote Control Sessions")] public bool RecordRemoteControlSessions { get; set; } @@ -189,17 +209,8 @@ namespace Remotely.Server.Areas.Identity.Pages.Account.Manage [Display(Name = "SQLite")] public string SQLite { get; set; } - [Display(Name = "SQL Server")] public string SQLServer { get; set; } - - } - - public enum DBProviders - { - PostgreSQL, - SQLite, - SQLServer } } -} +} \ No newline at end of file diff --git a/Server/Areas/Identity/Pages/Account/Register.cshtml.cs b/Server/Areas/Identity/Pages/Account/Register.cshtml.cs index 235b2ab8..6ae4abef 100644 --- a/Server/Areas/Identity/Pages/Account/Register.cshtml.cs +++ b/Server/Areas/Identity/Pages/Account/Register.cshtml.cs @@ -88,13 +88,7 @@ namespace Remotely.Server.Areas.Identity.Pages.Account ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList(); if (ModelState.IsValid) { - var user = new RemotelyUser - { - UserName = Input.Email, - Email = Input.Email , - IsServerAdmin = organizationCount == 0 - }; - var result = await _userManager.CreateAsync(user, Input.Password); + var (result, user) = await _dataService.CreateUser(Input.Email, Input.Password, true); if (result.Succeeded) { _logger.LogInformation("User created a new account with password."); diff --git a/Server/Installers/c9e1760f-9ccb-4f37-8347-7e5f304af915/Windows/2020.03.01.1355/Remotely_Installer.exe b/Server/Installers/c9e1760f-9ccb-4f37-8347-7e5f304af915/Windows/2020.03.01.1355/Remotely_Installer.exe deleted file mode 100644 index a44d7a97bdc113c87e819d37081e67083eef5ace..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 276280 zcmeEP2S8J2w7wZ65M(1bKtKf}Q|m%hKyizED@9Ndu}C1`L=?1j6zjrCan#+qP^*H9 zqAgYHtW~L1k)qrwPM^a2aL~hs}2W4smNm z4NqAdS)@081hRl(qLG7qo9TQ6e%~;RA^X25lqco&ug~W)y(zwq%NXvI$)aR*eLj<9 ziijVdsezy^>bX)uML*UIqpeg|8|kh}Y3GQ5$q`65A1}9yY{h@&k2Rz_OT(q3kjd%> z9hpSv82WKVPloYymIee%P?2;compPi3UnwFl^CW28&SF#60Z1=Zd^u-8Dhp|Zckv~ z6I{jsuy*YQ*(Zx|VJnw$sU!Xwt?cV@Bf(chA-qduKZq-aE+Q^3in6)-Oq%eR zHV7fXh&KV(x*~z2ix}N0lCco5j3h#2IGT$ADe|eYfW1m|5Vbe6zi6%1%DatqY$r% zMsW!c7Ol56muaDE%n{DlQmR66SrxG!spihJZVvvYrhGBr6xn~l)29i7~RIgQ1jlLnvj+SLnuraIN*G5)+h1fDOmq4s0awRf1bw zlR_D;Ex-#<8L_JJ9Xa+~bHbg^l};jC!)v3exDGDT6@_ULS0JuSEV_q-x4>4SkE_H2 zId;Uo9u@t~6nu+Tp2uEBXZi|Z@S8RrWnm0g!J^Gx> zI6*hSX=KcBqtLf}V@BK%g;D5u#A`+YN4_AEQh*qRfWX1tS=c4kj7qdR(h~856d(ju;*#$}ssjSKJbr_8fQ%Rs$w*0%H!C zI4xxYd16eOtY5+?k^Ro;(3kI2Pui2igkFFtT(KMSC71z3;jls!P33GQ`#RG_h{J25 z*|5%Z3|dNx+YzTh;c!8L*d6f*n81x@OUD2`3_CtojBzdChDYHV1?Qu7kr=pq`(BuW zD8iNQh6-YgF9GuM1zw1Rdw`p1xDVyoa|vI8Sw5GV5>K`%%UpW4uqnzgK=}4k!ImOi z>0Lz`SE|QVNU)bxGt1}L$4{??dbUpHcGJxf$rr%mWRh*8sYEUxjNxE>xH&J1jUWRP zh)fHLaHTGV>`?~zWm-^#EA6W&<4Q*85s+TaHVsU%i!m-GKz4e-xrn7amFdSuz#JYf%U~nOV3DV}h|9EwcfbSL@os^77}B0VI|_3RJKix3VZ2jHHr_E$ zIT$n3C_~(VIvnlmHsLc%5yEeb#ON@Q1X_v2op1^7jEhJR-UWfK!0P?DT9U4a+6g6q zS5yNz+CvNTv?bkJvWdEu787dBNCpriA!d0OV#`k9Ur-50Q6dyO6_)g&60V{| zTimR$WHgoV6eT(|jOE;>Q3+pGqRlnp(+nVxDQ=5})XYI7U5YB=fuu-%Oh}lp1ZJ{; zEs+dDi3B54#LDA}F^|dt(B(>3Qd`npwvLcrVa{Ov%9`~hu_szaVRm5s3JVteic&Ja z!YoRDMHz*DrSMO58q234+g8R0D;CSAK0-kxrDS~I%fyE=KH`HJlEGBO@_{>`EibAu z8_L$VMr^!hlpR7rB&B5hgy4s6W5){dz#PT$Kwq#tfB`}o4>$y?6MP9gC?(^8zIMQb z!KZ0jz(%kp2<)B1yCR6D*@iIVGtI#t6PXcBk|ODK0u+9L;UgY~z)@R3zK8W*DiXl6 z+;B0o@|62yXPyM}qe$8vx#BMogVHoEE#b$Q0I^QdNX9xvgIrh8x)By`fq9$x2!!G` zhzs)t7_fqHU$m73P=+EKLs$?#g0chIY(GS&*9IG<$+A1u!TKz+jiwSYy551d0pJ2f z1dg?Y(qPgI{UQ)bw^EeAa4-`}hYAbxS5cJmg|wImY6!KRc%}{lZSiKLSm!Ft*-AO& z_JuhcDTjuLQ0z%jKqrv8YAbd@zCu%Rdt|Zev7RwcwjO)1>oGyY)rqpCfSuZmd0epw zCfxW3UBZo|0zK|D3Y3;)Y6U*%HIYNOOkCGOal;`F^J6h_ZMo)H%S#oPF`*)|ghH_g zINQlY-YMMYiHde%8MRILv>RY0u@+&xkA|YMO+rz&7(LC-;qBoU^ntH1S#XM65PFiK zc@cXCn(ukyF|x{aF^9RM9LpX2ibgX0${K;Lzz%&KAv7aR&<~`hlhzF`>I$Vkz(&^p zGRI=)7a==~3dOD2`mJ!4jHe4cjombjMd&2!B$9(olMMyzJYkGE3PalA#y;rDjidtX zn<&VyiD6oo-8WGy?3;qX$I(v6ZcPQyj|QMn`fZ^~(t{LbUDC3!xVer(W9dwa$~@B@ zO`W(IO)`Y+x|6|V)DW1t2*I0-zAoRLvD&g~>L>wUl&b)~y*HG{2kSnQ19}enjqY6LNPn2f@!VIG5Cz?N%`iaLFpj_5ZG*hCVXcCq6Q*T8-N%ceuL)os8 zgp|?+!~$JlO94B@QWrogha20V0ymNh&;=AIbpf?1>H;&_w4mq$k3!MXAc_|2g1be< zF1qsKvVmuHWR+6}z9?4?Jnabx-NR=Yp$uyyChdv>VtwYy?ZW*sttB5}nt+zr&cXL- zwE(8zMSK4?LT)6jDMj;4v3);P2Y#3lfgijDuyE;il->7JF2JKeX_BEPAMg8FCTwfv zeScBz$NT(K>5C3b`Miz2M{1TFncQOa7MIf0xM<*Rfio|?O}%_u4D&1lC^_! zVFv|Dc2JX#?O>U(t(EO4$}QCn5?E*l-7^An8Yk$FCMXgKbcHtop zbf51a5(t~!1jJZxOKuljR=bfh3ARpLJ9{oK95a=O#tPj>(VX}Je6dG2nvU6p@Ae3( za0yDIDJc#`Ok}R>dKTH3K(May1j6_l+O2mXtu6f--Yp439Va_!5_$SE)M8^&IAzhE zR%kv{_r^EWL?T6Pww<&gYDmJ7ltkcCLufukupp?JF{_8R)Q(Cgpdh0UD_2W^3h{b6 zj;=Z~u@h0|XjZ&7Nph$u%Vk@z0%eR8Q=hQb5M3c;dDs^e6tGnZTiHEledgFL+1Q#` zY^8F-c@tktJPBfPL{xYLCH8~K*d>ibU|)|Xo=oKkr?4S668llvZ44X1Z48!wSq2;N z<%<0YS*|(m5h=!#Or@4BxngWykcy;~qTfwef5F@V6F7w{L#g}-2k|Jz@Rw`2XK z0_{v$d6?al<>|=eQ7+`ch5s$Dcso{JY3=Gro1m}l$BC!GRB;q8(zeKu4#7n{oy_kg zo`JwgARR{)rBb>A$(GPSwr?MX{;LUH>HG(aGP}pc_7EXI%8d=RqS~^dK0m4*8xco? zWfblv*v&82aBO}lCENUBK+uMqGQ=}U1=(I2ycsjOoDOVL8JqTOyk?XqLO~>@WNd&t zv7rnF8+Ol(A>P0KL)ntq#AXNy@H9ZJp@=DV?gD{$4w5n* z1?Fbrxk%aXtc&~a0g!|B+elU>lhawAm`5zkbRC+o6NUUHK$~UdV4y9lE7Ud@e~WsB ziz3E0J0!pOU4Hgs!`O6?jYIN%^dVCV@_4d4S8YBUIyL6;!(&OD9LKQ=6S!h{9B#Dd zqfq=EE-XG;Odj~uF4SAPQc+*LK*j}wTOd7xTyx1n!iZUl0|G$9~7}Z zDo>9^S|C}BGI_>qWQdm_4POw)73Hs?hI??4*UMlVE=2`eu$CdLBUz5Ct@JfpvZ90% zW1~X7zCe`iH&?b%M)g7{h@_OvK8$O!k1~|(6EIC72KP`#(mKW^4xZec;EsW8f%srxKa&(ne?_ZAA@fa zGRusTW++;4#Zu~K`8=`>++=DE`dBTDRfSqq!m6b!bmEyi)DVhUW%4;V&vMkEQ#Uaw zRXEL%PO^2LVWOfG^NZ{}(Ms+s!@yH=qqGv0Qg&z zt$vU?eK3mI(*~I%} zsFvU_dq!rD-Cqk<58D0lB|E`FvI`e`I%jE&A!7r5xsk0<2YYD@8tkQO+2M}36A#Ap z1?>T~!XS`#SLi7eW6vjW5}MVxaRmiJ+Vm7VGmzc=5?35icu>GDrgTJ68{plb2eI5p zD!>s11xmYaY9&9S5Ynaqy@*}VzXZ^sMCk(hR#X7CxB@Qjf!s*RNZK`sCn77#9Wf#6 zktk%dCzPN>tumE31L!JbTJgj`%b1YwwLrNI>wBIkg70-e zAiKx+S8}iqU?KAY*~}A9M$^p0Zi`Cx40>8cOyPQ76tEjGa=kj_dPl*L8%YIlJqnau zk6I~QPieCxlwMH`Mwv^F zwPw}*s2_^5i~50s#SQQ=kMbEE8TR_j8zHAQ#c}r49+oKKt;O`gc&^XlO)ER_ro~@Z zHp~x#(?s;gB@p|xOC)tBgUGp}x}qM%1kwS>QykzMYjY#1#9X`|m0UM~gOEi`DD_1( zcH#;@fFfI*(N0I}@FXN8$+&PMX}=*|j%q^jSH$=X34;oQQor>;Ms3?@rj@S|lg=Xx`C>D?!o^;uxQQ0mNXvW(i-jylVX#MbenCMA{f{|OK$9P<3F~D>0;SW?qHNiroMJxA z1I~}2Vir76h|oc4KCFqc*8rq6A9e!h^7FZ2+{m6tN$ttw;sGo>wb5Kl^W+ZjL(gE1 zrX4Fr2yJHZEMzI<;aP|yilu(kav9R$#{sUL88$-fT(b`OW|ChB|6g&@Gc)14E(Tv6 zBYwPzmQp1nEq22xt1El3<|m~)9B~@j**fXj8Efa)G=fG(+78a_7QI+zZKxMfIbQy2TXLcF9N^nb=-uZ$#Wb5x>B0h}^J4+U6=*~W> zDP6;ifQqQcHD!^OU@Hs7jV&*{DG^}qYQmK1JTiT6llvH$y>ib|CKN^$=-hk_tZp4q93#v2x06>Xe(X;UUas>Ug+FH`jSAu1ZGk@OS+xCj3~RLi?1NY z6{q8>EHZ;>?)v zS^Ng#k_-}9Smfx%#=~zSSL7g;6=Wiz%SMIRgIK{U#aW70vYGNBVVI#=!Q)I9a_I$@0vKj+3E_-|g zuT?reVzras0Hd|PqBR>q#z;j58$re>MFtz`z{OcJJ)W@VN*<8m)JNzQ@>e5q4ss+9 zaiLRAFZPsEf`y+BRURYYve(+;Cx|;*>qv4Dinn2?aEqeyQm(dr;lbwtQ!uCZDKOq> z?_gxjcygHUqA&_X4mv!6nNaeSxC_kiV9m5@{V1euhQSJgD@#lB~785#L@mA2nd= zw3GQQ7pH!XU5b3z6gucpfA9+53lfNTLWsR7@Z-}NA-$(*#Fe~)#7i>El+3ZiJ2*7= zV`^cXQIF5!D0z*_B0dY9V`Ev!_KEln3Y^T9a-?HnwSc_|qxVjCL39mmC%&m(MmKG7 zB2u~;q9Pl4vKqAYa5TkKOck&t!ba#V80%%!%&379A=JQ1CAuyYze8ZJBOA+HrW0d0 zP=Ui(rp`>+Gg#7pAM|&D{?jqJ^J|#tX=4Gnh_=%MkmgC=BP#iTi=(!w3IE1i)Xos; zU^%*z1U*$tKz3LefkY zBlTECrNQVBDPBO4J;<|pv1dn;X}(|&ED0ANQ-XUH_KYF*D2F-s z`;#M3kXZ~0?ms0wB4E68zkqPb1nH=N@WNQX0RPbeQb+6Y;iDwd;GmI?)`J41;X#s+ zcFmoe&_73OuL;2s6Qlv{LINg4Nd1Eyt@}(E85}gKN5GT;lCJ_n+Kp`0%D=^^7A>2$ zZq_`YiEHZy{}whOBqC^hfI@ozfC%hm=!IkU)2Dq$`v3jemfyIZd~-4Lta9J&89E>saXF~DMnHh=Kg2yw#Y*9mh)CtGgVFa!&%or3+WP)(6E@47YRTc}@ zVwff$SCpd3cvOl&7|cvzMkqB3MbkiL%{mTKZ#?(~AvuY?jz)t?N(wZnAdP^r@uWyZ>0PRiGwe5;OiU~J@H0!zkuT_=5A`1v;HKd0+&(ZMB*M9nzw_Xr5R0-3aXwFzCSzSzCFk~`p*&Qw z7|db%_mKvKLxz6@9K}l_4Jb09!d}y?>Buq7TwApCAKk2F^MGb8Ec$VoUeI*3WKwts z|L`hd>BD1&D685TUxW#mB$0kq1^SwHWLl4nhzNCaaS0zaHekGexbyg+QBp~`WK4wf zD9L!2NkJiFCcAvmq)AJc$^PSmT|$*G<6-LH;thF=etf2ve7FojrBBeS_~nbPouM2o4zOFYPcPB0>^k zWyE2Yeqclc{H1{b5d)@#23Q$znM)rS?LJaTXn-_gid79BrL_k62TusFMs>aZ0i(## zy0TN1wIP?O(Muv7?;kAV$b0dDYx@r-2Rj{dV*1$Wa2Wh&V_c>q8{ilvZ%JK*(cw z!}9THU#WU#fj~r3I5Z6?<^NOA5c&KLlHk$xmGl27XsC^^{4{H_F<+_niQ>8Xu)wok zfxv5mG+ZKOS#|Xf86B(4>U=>%Jsu-$;n>6x6!wA7mjf~L!$&|YEk%_TGNDaf#RY{; z|BYdZ)@2to1Q?vA5LyK3T?G{A9A!Ok6g1QUaxER3e^mXpTzqp9&)4U3ZJfTR?&Qe7 zV#Z;tnWI=GuzE7l(Ufn^h_yM4tr^33ddkxsFf-TVFio1s(pzmAW`ZATTFcY$T+7)U z#t zua2i~v|-Mz9?=F}?;195<@)FScdeux?Q?BMM!lc)qNd@?I+Awxwt;}_)^%dFB8J67k8x2O#S8hed^}i>Yi#BF?nt~f%}?~i_U3TyFMSE zX?%a1%~g5LQ?onUT z!_VWs;j-7}e&+WLXP)cbddN?0nCM$ETEFpwZr}D_R-WmLt!k7_4*#NK<|kdVk3r z@oMIAWKd)eVXeVeP7F=`2dbRq9a%p0!bVuR*D&d;tqx0m2)c42z5AS6{d4-g8c`5F ztC>ySx*u^bmC+(K?d0VFnSF9@xm|4k+l8kWIsA6r4Gt7s=*>woa!pA;z4*ZDm`2^^ z)N1r-&&~M2;rVS{<6h+59C=FDGc>zt{Ic$`Z;#m5e%I_Isel8#|16plM7PrZDM|2@G$J*_3@&%1KoagO>{pZocwKs ze*2rc=X`FaXGWPtw}}x(T6j#7#Oe2O%egfm{#rr&iVti4xSN?$GkW5x+zC;$&tIQ- z9UMu~l_rBrl?jYhSD7+SRS&4{L-E?E&ym zFN=*&+Aw2>wYuE4(YkCM$1g8ke>%y1(f0c%zJ1}#%xt!hcR)Yvi&aw>wX4Q<&JaaxK?2V*acxMnzcHT+`*@91LJ#9uA3 zoDY}O`P*r1P`8%{UH%H3)$F;gzT-gVvDS2#h=&#yqoSH$w2}HnO%wHbckcI_ac+rS zF_%P|XWovDnZfvS9`3*7;l5yu&VxyF4l`FyI7RQ9-FD2F zY+>Ne7w|;!` zJ+JLoR|*bCM&G(U&N*~vg!UiY3lGMp$8m%Gqo(z@;vML}z=b>JyWFQyI~LwdbbmP| z@`%^MQ7bZM+pPHD+*@DEPd_*CzF~(!+yy_o?_49r=zZIK*YeJfy0+E&%i#48t48Ca ze0Vop@ASXOv7W`f;Lg7vkaMd;FlT$huhlMaJ$6b2Dg@H2~+o7 zw4tg8JG(_E#`V*? zG`sDC5X&Q*^1?8ew!3CJc^^5^#WSZ*c5bP)Zs2o4{jZq1Ki3^Ke_MQ`d?vvn;naf> zp&?qN z{jE8I`X}su4{H%ReP)>c`k;Bf+XfW4FFB3V9Dd+A{+?BiHh!aWMy;3=lgW!B#U+eFiaNMUyvsWHHhMGk$kJGolS36?mOgNok!d0u+zs>b}uQho}Xtu|p zHFNXAUQKuI+w_QO!m0h7kaJp@k6+H%*L`=)$(*1uwR(-Y@#b=B%&}EZCbdh-3vbIkZ!(#_?%zI#M{^f1bm=zqjKR__A9T*s>ijxueL4S^-c3#`Sq6S@2NlZX8cgAbgiB1GcJ!ZVA||6+4wC0td+EA zYGA<)%Y;=nmRa*gzcXR1UBg?23W6H#Upm^!@5}p!4W`=UO@H&lsy8cAw(BzR4}NC7 z`xY~MEz)nYennTIVMMbFZ}fgQ+~dORa189LH(Ho;%VDFJcjs#hrb$pQMCaUftfBS0 zH)a~uPnr>*NUOJv-Tl1z_ka3L$M|OMsP*5H_gZm1mY=iPy3$>TR=&X>zU^Rpxp{Lv-y3) zxW3+)z4-BiXYO-bbmp$t5UT?lR(%+}ZI>`Gf3VxHqfPrW!;Y>Sy0xE!i)E&ch4+oq z(_NP6HyPRqE8c>)XR)U5U?;>u*7xn|f0JzH#LRlVE`n*_hH+W0zuWQ3i746T$I111 zBS;%Kl9QyB)Zgvvb#a?`j%VK{wG4IbbKL9qBR=&l{Y=wnsc2z3dE2rJKV3QT9XvIl zUFO=2UfOQ4r}BJGb`H~8x9nivgl<>(3zq8dUK&5?-5cH9``2mi`B5v=J^sj~eQv+M zU76<4KIc|;^SaZoJlLIiX4yrX&I3oo$m=@O7EfKF~~ zhbFx4dyz9ti2YPVv$IbMMlSPVdTqRV@Zg};tsZv0?SG${IcR=fdar3);V|54t&8Qz0Wf<1j=W}@!nNOi7ZDwBa_aNgH9NQ#e@rkCHcqR_ z`0@PoFs0VBJ^$#>C;W5E^liqDNX3q+(>$%rj!uie4X*ut`?l4*D0KHNI7eWBG4Z$3UXVP(#f|;L33)Ezmf+0o+!wjeSL*a;BY3o=NISGw+Lf;FL?XU#JW#g{rSGdlaY1f zH|^Z;)+u+#?ZI0tA{W2mJxn<2cQqo#DAX%-bC0<1^t!#O`{Kri=}lbsF4`RV=lZYH zH#Z;Zp?!7_yy9k$=S<=tkH@dyEZz3(O3+Qi`B+1y9Cx&JOMUCw!|m5+qX#p8&-0Kh zMIZG}4cajMueYy9XLg&{Z2YDC?X@n4&3nFdbj!2XmN^CtX2$Mc>AZ7yhYoiIfd>z} zU#t07>#)tU?!SC;+u>45_uN|dnbUEjIIf+rs@FfT%6D<*neS4kVHUjdv-@MQ<;bB} z@vfZsQaskClR?N2xjQxwTK8wd?BlgDPhEXff9XKZx~mU2WPjtaR&=hdz2*8wgP9c= zZ!g@e4+R`gt{ENQ>U~n(q?X5ATg6R(liNGy-Ju$W39D|7**0|Iqytw?nVehxsos$0 zjII426BcEjap`t+%E^V8F70aFjhYv}Ec?6U7P_a_1CuQmroGww?z`sedfQs$y!d)l zJI{l6jVCc9yjSjMex9>uYOR%>IP0cJzI;An&WJxAzW)CAw2fb#o)8i`Cgj@~+J_(Q zI(d!l)Ws3ews-n5?v9q8L+%C~?IAjMy-T?Hg?$d^r)BP)cRug5=i^6b-@O=@b8E~+ z8#5CZ=24Bk@iX4>8s_}AcSvYTzYiSj5}x3n&0atBwMYFdpk{ck9)2No0WOy zjGwum6~?Udx-ISU{+`Z#QsI z*NeWN*{rwa1HUULRtMQ_NH{a%)vSar{pZdwPpCbb*DvQ*uhh$4t0QM0sh2QiQ-t>Y z&Fkj$d$PhRGt#S`qwC(+XHyL}_O^Jv3HJ~c?<-^6PFXJX&@m)5vS?pL}oy`daed2%F$m?nrZP0D) z;Y3Lf;i4<&qK1eus%zwIxVL6SeQbnZJ9@t7%w3lg{iMg7lfN#eJIC6tXWoimI`(>? zzwYIff7Og?x?CouCp?qoK3jn3Y2k@L0XxG10AS*f$kq9vnc+Kg(f$CYd6nE*YoUw0^R8IT7lTfEZLiRMk{p^jvoGA74w8EXp9k+ z7lV6=-DiHyJY#^H)b%eLXU%f2VevrU&%^JuO>f6$BbMm*S#pu(M z(0gQZc2d7rXO5olAr$vK^xa=;F`@l^=B?|=mLsEXa)R|NzW84$dzI?>{ zbx$vgtxvd#mkk>&-W@xuSzp}fPVac*^w+{5^DDzSW8bYg8Z|fWZ?cBaaz(?d^XD z=AMbNaSfk?0}tFV*6MwD(^c1ZfjPG(M(M3N%=~;U>cf}2Ry3T^`r+Yby%sFjw;pSk zJO7B_$t``q;hAYsTF$9gn;-phpxY#Fi(MNZ?g$)dg>`Pqb%Q@1z8wC1#`aTMf%&>g zxG7yXe*416yr!WSX?f~&4_7VWijS2n}$AU6CD+^C2xA`XL;Rl zoZ;B-)i0@0*E|xtZE|K#=tne_Ml=gu4m~fo?7w4*|K;CO+y5x+If&W5uuY#=6Gt4t zNL#AkG&`f`ji{P&y9~Yip=8@d@ApHa?l~-3yb#ATla8%AdcnKKPnY-O?4qCkO1Ohb zX67-MF79|Zldrcadriz&ag%3{|B0J;Iyb$(1CD84b)U2K*P*F*u%~>qT$*?e!_IZc z^O@f5Y9xp)*PA^O)IZQ2JNC10R|b#l^KF}GbLRZgL-n$btiKke_t^Ep4bRa5nG=4T zXws`Mv!+pGyI(K2_3GI%G`rQM6z|D(bSFm-%Pv@!bF4U)RvBQWgiZ6T%Tb{o}mde2xt({AfQ1&gMbDB4FVbjGze%A&>)~e zK!bn=0Sy8g1T+X}5YQl?K|q6m1_2EM8U!>5Xb{jKpg}-`fCd2#0vZG~2xt({AfQ1& zgMbDB4FVbjGze%A_&R2AmJ1}FW7_cMmn%M!vnZdMv9NuF%g%&G@XU z8cRy%0^9UJ*=n?r?x|{(teyIEq1*3j#O57jx29pVNNWO6S}EsL^J6E?oO_+FY6} zITpXD5epg*__MH|_XC*=)NHf#^IBZ8G+^MOW*kmI{%1cIgUkjXI%_8XQwRM4x%4;L z)cS!Av(;q30`qD+?<)^j*qx|m+da$Eu{z6PJDvAEQ6mPl?=z@Q8_VJi+3G&;+FX`? z)m;YrN2;;!Y5d1mw~b}-hkPFBz8W#0eIWhm;0k|GpWbPV0MS_;jUUo~8HoOTZG}Im zPw&MfffVzwIzqP!D_l(#VgGbBV^HCJAoR2X{auQ_w3iuGQJ7Gdp7W}s&lNJyKtBB? zVYPmsLt{1La1rvg%L4&*_@I;J=t}RIv@VYqm80I$a(F5Fsk*|?cHUPO9>9RG_|MOS z(6K`W`|HQD?3MRDts!?S$gev3KNqsi%G2|6l|vVGKNl|ddm_+rc?J86_5@{q?+E4U z-uEVauD-2^9N=L9Qs;Ph3HfC{7e@IOP({aLnfFxSb3z4P6_r`hdi0#PWkvesbJl@Q zU#k%l!miA75R}iWpnl}Xg?~)FIEE;50KKXpuZs4mD)lZE*Xh5I1|C+R*J{Kiy(}D{ zSBnbjR_5Fa9_l{#9#)o}>MR2`+bf8%D*j&4y7bO%=hEy)89lSwRgQiyP~NZ%9{MO( z=W|~AUWceO{nVWg-P}MG?XT*nSLSn2=vD)?A5_wFiwDSeFAGDI4+d3--WBB;Tb6$6 zE(10~&`mXBMEk&U&jV4X8)ywE4U_^30+suHDb!KtdoQ%-a8h?4mnR=OP6k!fpR1$Z z56d03&k{ollfx!{^AWmiHiGPplekBHV_4?!Np~ zdC+yQ8nL1=TBY9;0Y6>PJvG`y@7(KtYJYt0cF?t>8nL3Wvb`#82EP$%wr6ow+VeSh z0k6wy#Ejm_s96CpPN%dg^?f+BNY)h%nq)O6R-Fd*u3`Eb;%Icr$ETiwHRoQO_ zf|tJ><{rhJTs_0u@UD!j<4ex`h(`U=#eH*e%eJ7fi^A+JmSMsvD2e`0uVJyIf$CI-ma?s}8%WnkO(? zsm8u1pQyIqh5+wh)My*M+u%^u{Z*CxpdYQ1q-SYkv%2%MAiF~EN1d7wgUY|-~B1`cV$pc?}4fFJ@<=c*{QBFV6qjY zN`F;#-L7TX4&8QCP`{|M_)r=6l=nT-s-yejHT@A1c%pz|Z-m3eklk{q-d4f>RRtEx6D zO493d<-ztTYPNsUr`QUe>w>87B0z&c<$hzcVbwB4V_l&+e>@JNb@KE>P|DZkSXZ!o8kVWIKD*aa#Ui6%y z-1END`l`C}p;Me1F(Lc{s>?QIzL3*b&35in*5|(x2PSqPb$;LR{O7;|Hf~aL|9Af! zc7BQs;Bs1x*pTm4=(meM#WrdK{^lTc`Z#^3_p{&YR1`1hHUgx|T2|F{tMxn(wtcN; z`(i5E7wV`7Y_vgl)QA!N?ozqGWA>@ofcIZ&w2k(C)}N~T=V}KXSE&&rnoq`7hpph- zMa_0q>2LZ}2S&sb7&(FHxnxz(?G@#Bsyb|gJ^R&Y6XDsbI_#UXB!&+6l!7ozH_Doe(XLZ&GR`gC>Mc+59 z>ajxnazIsb9tb|Pr_BUahn^MTnFrZwf6l9_KSAfYYQ&6iE%&=D6|o6?+|_Kyo{H%C zU#kPmnyVSNGmu~Dvl8&wrDi+2{MY)nBKiO`x)(UEX6!2TE^BG_KzAFEI?wz5hWrYB zpSLs{)R_<6>D{u5tZ~&g>PD$_8#GpfPHsVU@K((_Vvs1_2EM z8U!>5Xb{jKpg}-`fCd2#0vZG~2xt({AfQ1&gMbDB4FVbjGze%A&>)~eK!bn=0Sy8g z1T+X}5YQl?K|q6m1_2EM8U!>5Xb{jKpg}-`fCd2#0vZG~2xt({AfQ1&y$BR&KGljq zK6NiEK^7}9J%cL9OQ=4ZelKfDR}U(uG^e1TF#TGVjz++iQ<_&$Kxr$gFHff`(z%ET z3koQ0K;`murXo!dlz)^)MR|5%fxMZFkyRm^!n9m$p&}opJ!ERZj6y@?W_^@q0fRaO zgaR-&ES?4%S$?jS94;B38JPwjr9D!GAInJ>e(|(ik!VG^Qrd&+%MC$s$$lX>oXTfV z{WAQDEmx}VLG_FCC;0#>8Ub6bq>mNVm#0%v&ZdjoBTr|dya@hH!h`5gc(OqbFRsbB*!g^ENY z?NM49hM@Rgel~;ZEBTF5S^<;7?-Vd9($rG(`R^b=fBe`J6b<4q*0|#1$uP(9S0#uv z9}NN;1T+X}5YQl?K|q6m1_2EM|KAb7@43_heOn0%t4<7|R~=AdC1`0``hhR~?MwP? zrceFdqW5T9ZNKRU-qR|f8`)Iu?~J3)gi6YoT^7clS_YlycgHI8clqe|zO2fVk2*94 z-he*U2eQ$YU!ELQ%fYj;Q+1$rKNsg&(KOmt_HRK} zdLD!hJ1S{^?~2-6ydLCwRZ@1P=0V7&{T})6r}n=}^Ii$|)8D|nS_%2IAG9ffFa7rP zGSFktP0*;~btsMeDWFfao!Y59?-kbrJSJCChi^*YIja~?`fdM@{>Bs1v=^`JyjSji zueff-)6jwD!OHFjKbi-@?>wk@zs^#Yjq+|K)G6Mktn^-GewB$sk1dtdrLVGl@G5C9 z_t6+Yo$ZyB*+W@oW#Z7ot&+MVDa!{h7tkXmo+l93QPe@4_Iq@{Qda+#RYvzoTm`?% zhQteWxf1%&-_&iOtOwHcw?&77$j?98n<5l=St{CzUf|`KB!aKxo=W=GCrjo zdRc*JKU?11TUt4-ADr@JqfT8=W%gS%cUIZjr_dKXi|<)Wv$M4P2nDb5LdYs4U}i(Y#_? ztj@Gzb;`53czLukzfX-rhejaUzZU0T(ez(v`;mC0OPb&Ol`El6ol@#mR4$!;l)K+j zmRV99JSzM5o+QQjf@c~?*$%?@Uw_jDdGxGLxt^+V@8YsmNkg^(biWch(D`Z2;xds( ze?v(zpVC+@@!kOWmE8+h>I?w#hk#VYT)F5RUr^>>S{!X+D^)&mRb)aQ&3ku2rD0lL{!6qqRYhi5 zb-}AgC3GQORr*_ds6V)p@-~-ckE&(Rh33JVmC%Xqiz_@2qVCa3$RfNwRJF0Z`rtXG zk~&pr9)t{A5ba0Fj!&WV@@)B(a_B;s5*E-)3)HL<)TB73nzRN1 z4FVbjGze%A&>)~eK!bn=0SyBGe-NmyUo6O!{iX$eE`|N=3jFK`!c+z!e%vFKv3ji> zMpK&oEfSCS6yldD@GBG)&d65^5vTNIcUj(Kyy!r6TrFg63&UEnw1ul&hFqph2Pnqs zQamiKTQpN|vg~(vTwRs{8gr+RfT4!=VTl8BPkk zpdS6^2m8w^)zwGDmwqRLZVLTCg})QgQ1d$xfJ5`qAfQ1&gMbDBB?NHxs0RvEfrctI z|Kup->4Uyjfl7Se4DIPVE%avQfA2`vDcvS-B3{x`Ifj^7>j){u}C+`K~6)H>tpn z_zqUqNtHO-ey^gekKUy!Nf!8df>e3GAqDlz#H18ChG_Q`q` zQh_f$J5+fbqs>?qWRPv;zT>UH33XK+$FYjG6$!zgo*A77m4~^aoczJLBD|>%>Y9R7 z`Hn2TOD0t2k2HM`W*lfZsQCB9S|U#sA3dSWyCQM$S9Kf@Qt(Av^1)Le1%4mR*~pJq zDpS-cD;%ldUC|Ky-Bpx9+M2?PO65GH6Em_V|nqy^%(7HgQkLL46yHlBc%6T z&Vb6}qbR4j%~4go74^~91f)t|(|XM6s^Fm9OmKLU>zA_7y<7mGYR2u)1 z@=INh!AI5gcDTw47i$2Sy;Riy$6_oBli)+|x|C#dNqMv{GB0fWi4pKvs)9_?qtrbL z$`-1~EASK5W}874-CNMUqa=Jv$}4k^0zQr)8j~fpEh+Cb>VEQfcF@*e1z9A2xiVfz z(_CM;_99OE{o|mLbS){5e5i#o&x*#;j^?_PD#~g~{LzN=TnQri_dsnGauNR$RFbZx z;v-3ioZ_t6N+Pn6ppP{>Ap4Uj7DV$t_#{`DOr1;5flwE5&c3fk5O z(R!@Fbepmq8xBF6he1eZ)hwk<6Bmo?k&na6DUa*<)N*r>+uD&DfPP>D695yt85G8sk$E1 zSZkxqLphEzRnGE0Y1}Hyqc~)$x*o49&O^?J=KPr|Pz36h#7d<+@X!H`QGt9^5}>K9 zK|q6m1_2EM8U+4>2*}<+q8F~{qk5Q1uXW+%Kb2mcLYPUfPO%|g=|Y%GuXY(wh*zc* zp%uftW;|XqY>3ynJn)hgQ%fFd8_LoMXE01YQ^Q&o3NtB$5QzA92w`k_KBMnP_1-hu zO$tMgBL1&Qjuk8aJ%y}ZijdV$rZ1Su?I=)$AKCe-colC)2j12oPf+1|T85hUv;c?Z z^B+S1dt?EqQyGMjR`HLVAN>|XX;l3873qG1&SFZtr=)ut`-*CSx`WE#MKb>NeP`s+ zxl(EJDZj$cn@~5U9A52<+k*OZkNvWYc63jzUA$fKH0s!b$~q_c3*{xAc_Duts4NW1 zy+=a(Z_D8kUR-BI8tvMa)AqQcZb>293PJSDx-=VJqwHV5Z=&FZGV;T+-ccy@L)2>k z$^_Bb1AEqiuspxpqL5Wu2p$#kL)04qQrO9!0U}+V-+7iMSCJ1M2B5Ou^&vl`duuxH zUJm*OM9&1s?+71-PQ}9t{hk`>0UoQ%;6r@><%h_dS5BKyg^lHf;Nw{iujJx9Q2(DY z+7K?ai?=B)jkNnY_h)blEb5BuA+sN)KvX9-t8V6QnaJ~yIzKT@;e)aoYF$nDbEj&medyQX#Z1^&5FE# zjrmgeRKyP(6>kgKKb0e&^}FKjN=k!Id4Bkvay!(g{ofYQ_EKmQ@>#!AZdY0yb;%D` zl|kkDQE9w2`5FZNFCid1H~9D(?eUryZS|U$N@S4B%QVOp;t!b%Gx^pAxkLj$-#_#RwCo3E zw6}ht#Dkuxia_l_^bVdmNO}D)T=Xyuq^ytS;ULqBTQ80FW2uIrS`;UiaeieJPM-w7$Uk)G%KOK4f4+@ z(ND$e{BKOl&X5^Kc#L6qpjn`34$g=1)cx2jSx9lpqcW(i@?o~RDJ zh^p7EYe#HoI6H~7>Ct_GgYi}b{J{1-+cV7Wg}U$kvE$$|eY^*BLOxzi!d3IpAn^YX zfp=l^&d~ZC(XUtkqP6?~WsK?nN@xog&J<%ia+Z7p5#uqUtJt;76=E0*2fv&3i6lGEL#L%TUUoC>f_-u{0j(OUYG1p- zcYLq+iAh@%w)3#BM`(K;yT~Ouwarm|Td$o5Q;+l9eD_za8;YolfM zZjJO#UY69@`=xEViSw4!EYD3oEh58OX_*P@g{OST%Nl3wt-tj5fxFFH_4fi@os8Z zV;#E_OTPNLN8`lT>xS(dmXZ|5jWyUTP07p4>Tc}qE?%*%pG(Nb)U3E@`Elo$Y@2gh zoap+)$endkl47~BCY!@k9_3}(8+-Q>uiDnZC1ibS*8Dd~6Te9uDSXAFM zX6N}=S@lGYy@sC5+ngTzRo5o1H;vud`&E{i$no6JQ+aFBV|yU4QSz{)ueq^tKV`oS zc6q!mHEZK0AIX%Iq?!D=c_040Q+8J zZ|BBqdfbQ|sAZP^@b=q`^w_>ScIge%&(|907uGk=CucO&buC)@gY1gXvE0 z{QR&wR&jpPzHfXSZpQY0|FwsAmY2wJ=ijFXK8p>@H-8@{Si8tidimAutk;s)&-v~! za?jgjyQ6jH)OF3B{~WTfof-IeTiE`24SKse9lQO-ET3jKzl*c9n40PjEgogtzr5pm z_1F(h&vkE-{J4!YEHQSJmj%?B<+bzft`o`53-rREj^4Fo`>1vc^g=_UXBm5kB%aKB z@xir4>M@SKePYrmkHJ5 zw(0l2l8&6a!O{YC{_MN6{)jjeFN^WF;85QOOIPP*`3dKk4!J&I`L>hhcYbAr*IXMM zyS?-FPtR;OzrO8uKW(=@v3b;F@Zw#+&vRa|FRb&-Q{y`)zl;pqItxHPZgY0v?bFir zv%JP9EcTP$TyeXO@2mzS>}hJ)&bKM97k+81Wo9s~=g!CNUWXfOF&)y@f7w@C%x63# z^BSECule?P!dsmg_iiQd;~E{YPv14^AFD2|Kc;3a)=mC4Dxg=dd^d|heos%nx-;zf zsG39Cj#{2G(Phm~sadP)CQlpTQqTU_?Nzsp{hwY~=CeO#@@8)A9N*QkUF;Jl|L&ZA z*0*inn6&gIsZ$;m2Fq}a2X>}dLZ@lJAUc!xSb^Y|6JYKG~ zj-90IPLBm?4$j$o-s((Vz>OVzxViblzJ5>j|Mc17!R?LMg71^3P3PCEf9$s9sk}M6 zC!f0P)6#=?zK`G2C4;lGj6{wZBfrnNJttEKF=?w6Ck&498m>HSo18B;+m)PfI%`WN zywLagai3{EF=>&$uSd+D=8MR)qhHQ2jZMFPHqF*{<@Hpa>5#*}wKR`yGZ_Q+z~QDV zp5{zwVLo_(Uzh=jT0S`Y*`o=~%*~hjNlgr(mGPfGj*qh%8+&IwJ?FE3S9+R{Pw$wt zsJ2~V(%SgOpWc_A;^PBn+*})?^CiEhts0SgqUAYp;^gcO&O0}xj;tFv{g<`hyJ9+A z_2g9AVu611u#Pcl4eln>H0qQvHmj>{BRJy7WwB{yy&^)l#_){2*G!JwSwDU4goM~_ z;>5p>!_`}aVtO;#b^gxfoaW}{i~aV*@OT!%nbF)>;e6?CRN?5i4E3CODr!!0(rn^e zE7OnoUcVbhd~1aLOngInU|5d)eWtG~by*+aGJPg+H|9s7lJG4L= zrln)|z3Ugh{$aO3oS1al);xB6LhY=vCS4k?yuQ@OBeZi&TF*wwH1V?ebps)1^pe=L zdcE{Q6K8oDdp~Y{GVL%wu3bW%Og|cC*KaM3O~d39nmDIFw0N_?XW^uOhFIN2$)2^b zVLEp2T+`EbyPw10POEPo+aTd#<^@IwPujgYHb}>=3(aXpy)ZfbVq+dVDq(!qNy9EE z&25n^FwaWm={qDQ`L{Cv1xwXGFEDYM^g_llYxCIit_8aJujk$}_TG8zOxkv=L$81B z{rZ<0?mwhv9ekTSB;nUNsUGM4X@;r%-F}~fw7V}o#F%nZeCBs=(l~V;H}>@JcSrV( z>7-*fc>JA_{bph}fQ4XSJM-8&!I)vi$IaP0OH`AV{9O)Nb0n_7eX!n)n}akSq}tIQoA?`};Rr~S;0 zb+Cuf*zr1c<_*(#)f(&u(47anH@dn>IMM(E`Kq+_vvy zJGFahyE0+9&(T|4TK!I^VbQfp)iNEDFbLytZK__wl?nTn#_H(UdCYXcLcDF9vzf=N zHdtyK%a__g(x%qOZqEsYLo}*+HZ5yQsIHFPUB}y5PmR5&*GTW<7uM^nkK=UxS6HFC zOZSBtX_;*~b2sZBlp31%^$Y8M3Z=%aFz@~r;am@kQc5ngUk!UM==})>oPrW}{_hb@ooy z560eRso$6mnKl69v}R}nwDG=^wbxqwz zHuAw-DNK{@9-?&s8>Qg-<_qKe_SD$9DK%@z4j;!W$5I-uwCKLGsq^O4tPA1J_3Vy~ zw(;?fN&BH+@{sLcfB!$+y$O7i#r8Ko&yzGs(N!zpy zq)ACqN)fP?D+(f_C_4xWDk`h2S3yt|Q9$qtihzPB2q?0MAY0$>ndiyU7QNoz{r%tn z=kpeFo;hc>GiT16IWu`?l9}A$`l4rgXC{x*j({_^dT3(!gtIpIXALFSZBJHWY{R|z zDWeBgepJ~5S!SNhOg?dI-ZT6AB#+X6l{IeDhJlIUm(NZ&^q<7P8we$84<$UwR0e;~p$72X5UTL;BKg)6G>?_)qZErfSnfx0EoTKow4>t6= z7uRhKdB6Wpxc9BDf0a`u>`Hk3qc2ts;a~J*_8ge8zQ?#H;uCR}3jf&vmc@FoG(7tQ z8|V25{Cz*^86PEVhEl zNv)ET+a^sm6b` zv9-YNC^osAiFQX}QnAS~p|m6cQYwK8rIPf`7~-m&pN8&N)mb@sE`^Gw$N zVBB~!Ct#14#ThVG?y~?%L9<-tR&zsa>?#M^ZRRdjaUlZ5YKNMgmMLZ$&kZ947LsnV zNt6*5S5a?=r35LXL`rE$vs&$C&TNOt1|#7x+w#g)Dv>2JAud`$3BueJnH;XtlKxlG6KSTU=l%QppVN0dMqJn#K1U`X8-Qq_%3a`awhg z{Z)!K$;qo9#0B_KPGx2u3Xb#xPfn-VUz4pkXAqo_r)FfW7QixS7E=*#y577ao;y@KkpqH1727&3hy5yQ1JxX0JyRE^2sz*fuO}<_w zj9iQwDJ>a$--sMUD3v5&E}9gGCiwFzEtpJcBeO~^e*He92Y5Dyh)kDd&Li>nF`M$u z4qlwd)Gt&iey(E8gM)MueE@8VsnFa)sgcSjIksxkvJFXc;(c|woZJwc>C7@apq}Od z7FZ!$VT-t6e}HjOC*F^%6UdM~FdO4zgu_%)f~Gdq1~MffUC`}6REboH zdag$@gB*n>n`H_&69X~Jaaq>npIE8EZ^#Q(0VGqi!#Hece`*lv)WchV>~4PlikSd^ zslZ_lD{;Z~x1sjADmV8M2k2kkyPo=dv?2?hMXA$QDD+Kx%`H3{L)uNFSo1jqKz&KQ*6O1Nq|O)+ z4Yen#l>N;GE_8tQh&yNuhDjbsbDPy?EGbw+-RD(m-bAj#f5;sb5;O?YVSjs}Gu>WX zY_jEpJD9Ctm6B-Ez{C3ptYN^3D!-wY!Xm0I;D{&8M^MeusQ|TKy4CJ9^Ai4}%<9Kv z*7SjrT9%XaNq;<2d&s!+2ul%UUoDgWKjAFY;IRnq*)HGPp&s50!NY78 z$*-@@U4XwQ0==&kw?OoVKmBz#%}3AUW0id~&-9n*4$%OnHA1m7&+f2Va{m`Rw+6K< zE48^S#b$S%S!Nd*aQENfv<&)BJkL`z_REOJtfBj(s*V?SDol^Q@rk17K(2b3W^>tG zo$xPZy*SnOGhdz1+xj2;_S@UC+#!-CWW1ABL^7>Tb1kpZ%sG!bXfLI|K`EnpIx$Y-hv*Fr@mV@z5eZYFD<*(?rxV0cXuyd9<|}_ zrR`0-XY8E3eoTXoJ;uKETD|QtlV@LfP#zM~ynTmXpWgEO5APk1J^g&vwwE>@TmAOh z*DO07a}G@U=Ec&ixvhKsxH_!x({PJ0=hqTm>N|3+X2gq0=azMDRWU7ip{+s3XLmU_ab<#P(yokEr7#&u?p?YjOU$0H@_<|87?v&kS>^XB~a!-q1eNqqFXn zCAI2({m#@oEn*g4Z`N|+vUGc&?MFMzx^ejp#j;Lo#_Wlhb#C6C#7c#@K^y4*Udv+j z6=CS4(6LYLUz7V!m1EP&CHaS|65I6YofdW^ZC{FR(V%xKo^-`+T=c15Vx5rF5eMoe7&RKq8m7X_4b=pwwmCWpP>V}HevDRH-( zCYPx24i3J%Z)xh$9S3@av@YA6 zHow`ipW{NdtR668P^-OVHy7D{y3*9LYwf%L9RJg!Q9bX*ENm2(lXLA~AH4p2vn_^p zfjKSSI`~iBYu6&z?sZ(A-)u&s#TPfBSR|x}NRuz?wVtV7pH~{<`s;7iXeuMapC+DuF)K{l$hEymOjhd_QE$HU{r&j& z@5D!MT^rkE^{Cgj&udxl?uG1Gw!N>I-~90D*cX2iZ1vx|cKd$&nb-DyGIC|h*!^=p zZF{+(ZEDJ)&6g@1Z*S4{xV9|2`Hx?3pBNg^_r)ff=U)Ef%-RXZkNmdq&XSz3|M*as zl=H=)Mz^|jJoo9&uUDjg(e2i2eOv#s>APj`mwgrSdc=E?_x|-=-}RFYKR)gCDG&Bo zF3zvq^~|@Ei$~l&vo@^Br_&8n-}xo5o_2J(?Z(UzuXUL5)cX&n{QALmz4i8ulN+wY zM82VGu6tjb^w{yJ#6KRpu=dvB(rG(>Ib9gO?z?Yq55K?ZxeM*CIl7&E^!k7oj<>n? z{q{49XQdXOe?u|n*ZkD0S6^LU??{&`B`sq6<=*f4N|j~$r6)TKy46-ceaepV`%m^> z;EdZkZ269pSGWG^8b4O(c)y41kxc`ZPyeXXfb+v=rWzWBJvYQP;E>{(h4X&>?TUGK zma=Q9>FA)i@7_(ilXfg@)Pqqc`UL-KPV78?%c{*svq!8m_YTZk{^rteRRJI(=6CMw|8l$OWg~M2Y;k^h-%_~J@b%nx)&%U(-Y|T0@mL?- z%FC6d->!RR`r^CKy|toh^mng*wc+ahlJTduK3%`ZhM2;ab=^8%F?`+Sz-rs(f82{T z9n-GWu2<~roA_JH!DBludTdEfWbpiegqVB#8m^eDU0(A0h|H9+if?Al&;G!F{18Jo z)wG4T*R0VmYk%|AQ_b(RKb_S1vk#U&yCSWV>W5bL{!vp^9qR1Lta~Kn_qj>VaZ5j5 z+GI$^Z|{a=7TkOBlTC49!+N%S@1`*}!tm6aB`y3-(J`)|d;89$)tR))x+VVXfy!Qw zWY4*LqpM$l`o+eV&L3;0iW!mr;f*n~i-&xAJfVL5FaI%ieE(hh?_9WCv}Me@pL`p& zCTCXD&#wLBqYw8l*502I;`ddXvmZsibZumnc5|zJ_pgtAJ9^gf9!=s~?ij0$x}mA_ zO5eqgH``Iw>*Wo1AEaJe+%9_mXRrH@9(%O)_%m}CKR4@-3xkftHCJ zh);ie^W~G1C$&44|LfSPclIuAbNlhTIpeGRdSvzOAz*KX{%99+5^as8Ca0!!Ac`Ne z0*=E;iU#;$hJ$zpH$XVc<$$lx&y1bw&DeXm8l=InEVjrjy|>z+_pnTQ$?y%}o$(@T zgC16UE)|DAxCYu0aoYm?Y2|%KNM+&scrq766G+e%Z3|N|RV2aw;cCFo!YORmQS2ff z?vC>HteO6Bq@K;uPc!J*bGm5;E!!OWL9CvgMlE`FTtn&aBA1pW#D5SQ&iw0AUGIwb z6m?mbm?w=Ywl89H-MTC~=7U%jI|6>R>J#qjWlQ3Bc$Q};Tyw-N#=8<7KH?>G z2&Nt!Qit03tp76fY0DUj&E?v=gv;dBAd*RNFu^g<*a$Jd9*vQmdMeEsL@=AfTO5AK z;VBL;^E7Mp^P!XTf=Ke8LAO<`9gkH71>)6G#$KeMh;fP0Cj_$<7?6Gli%bC4BkB)L zBaBrID8cO4aAW8wV0w;)#~VW}80R5Oft0h6ZxwRVOT)pes_ue%e$1cYC*Kh_H+n(6 zy%_beJl}l7f|%~GWARK8AIxr}c0X8$-n^6>yp+1EAIB;Yw+guiaEz?ODpsEj;#dL< z%qrHH4dGaSj&JQLGZYq{kE1iapBX8r7As(H!gO zPgrYa=4D3k+S{=TjwN!eJ9~m-pKv}iVDYH!KY}wqa5-FV7@>}j9&WwF^j&dTFP zvU$9|k7x`yBBnWZ=oSfyVhB4@#|Bsx=mdPk z|2NPd_?xi>dR#|&lT`#y2M}dUYy-pw)}e5+mP0kcTn#}zU_5J~DN?j$^Az1x;b?CL zV1Kc{%3C}3s8IWKl~nt~=|}%0y)RvA#dM@})(KbFEbU>j0z2u~MjgVwh@Ob_zp699 z!(jE>2tQCpYXp|>*H9DBdTCl}yj&d!Aa08=-iwuHKx#Y2P6WY$b*a^*;?aPbwYziG zq)Tn5(j*z?i&Vmo99D_9<#GhpSV29dg3P^~xbq6kCUgswN+vl!8yL>+vi>AzfnW@W z22dWBmwG$}>wA(|IPbd(Bk_>T!yj`fg>5|i7GMZ77{Vd9V(nA95O$&7M1&7=c-gOk zm{l<^)U3#=xS%jA1{*O5*z=KMUHnQF8^N)enuv(*z;a|Pv2IUbg%TEdFKQsL3XXlu zCdWJp%d%g_D*fldvfPugZXqjxje}w{wvYAm{}@<_jExIE32Qh_#wG?|ht-)QV-{VI zpkw=FtX*Ur#?E1m%|z{eSsnJZgs~fOghkb-8WylFq0zuva?G8wbv0}P$0}K9_;W%X z=8~~jlpBOFwob+_hinic*iIR{4=jr9Z`|oajR>xLVv#5~lgae+9g=t1|Ypzf}>(l;qN}nVP3HlNCl5DP#MznWB+3 zkg+W~!dl4KN4nX9k#&5XA@;?BWkG67RlIl#R^#e zl`{6J!iu=HGWJfu3f6#alCe($tcnKgBNn>wm>sk?)DPs{4 zD_B!DM8=v#SQSm#BQkbAa)zQA%jeik);w-0u(xHbGP<*}8FMuuSy!^tQJG>hwo=B9 z#}M|ljO~u@%bKzG=s+4$9x^L@6mOxjEH0gAErQs#Yw6W0EGPvN7{#?=Pt#ID&ew)5k}-;F%LXTV=v*->=PNw@GH|~GKd?0 zGc{v?LB1SYpeYZ1RMn4l=2)d>AuMe_HbTZetV7rY8GAYEc}+j&;@C{+*$2Q*$=ESN zbN@lCVH>KUlC=rw3omV|jP0*an6D-eVn4`nlXzTqTPa^?Y*S$nTP9;i;`_q8TiH&E zTM<{~KZISCv6Tq>-c8 z(@+a{+$gq4#whL))->H4_eeE8dz7{1aWhz{&=>ydU^yk_dz3Zp<;{nb9Fs=s=xU{m z_KZzG!J+bE!-0+Q#5Dmn)`LYehbo6<$Td)X<5*E|Z++v~B#u3=c_!phm5DtiV@AW( zKogtCu?4I&J1Ao}bx--{vcY|*lm+aju9+^6wT4pCwIVj*=`x5ImcS9?Zs?Ak9(fA4|z^k%)XYf$ol(qHrBnLB(wJ6=X7@F zlCk(YVfu;ewg-#WJ6L3YDP?$_M7@i3m$6^#j?$OXi){E?z%=#e>nF1_9Fw$X3X2^m z#XS}h&88qIuol?75m}GA6n+AGMFRUMkSIYq3V)5WoFZ!wM|(Q8DU=>Zta-{sJeQR6 zV=NQ}_KHtliBiSu`hnN-cfwPZ?%DeZx}9(eNeR zJV>0>hQ9nHac;Y6iT`KANO~6lm29^^l`}3ZI9O!c5&P#YDv6?43Hp}o8xBNUM66(_ z{C1En-V)>eNMXDt$HSCH;AupxPADw3ZYcH)tA}g1NTOIdC%({E8q`LCNpLWi(i4!O z$Xu~R_vQAl!;%(t=5i~AltgwuluCFrfZ%TIi-=5$wenV6;FN=a3Kqq4xi!j<6=T(~ z273}~uoJO{>G09x6NFDNYXqPE5DP;%9G?h$qVTDQPYAmg)et#oos9yq&h`hTFN^0e zly!_0S*;*0$PMk?2C{Rz#ro#0p1Rq#}4q6n>akm zVQY3S{vX0oHWjnnQC1!?8{xIVec3gZt6MHyV@1YS1VOkLwGAa0jQ0VPFjpRBt97Cn z0=mB#CEN=O661NenXph9E_M*khJ=eJSa4j7*i87|*iAGEGo#YQAwoHPe3YyjfN&Ak zI@j16VdFq?Ae_lpIM*2YgPGhb9L0XtmWiX--T22v3(9{|tOV@KW(mhs_r=cO-(OrM zea_ z9u@Kw4FUUvG*_PB<)09~2~Jj?6&}&`Wfz55W18|B=)D0$0tPBm*m=z`WoyWq*NIqzK*#sL>w2GquMFVjvc0q5{ryxmA^O6MqbFMDS@)Ea=UnqCWnd|533qM#=%Pjd313E7GW;G#8Pk zHz+%W4dC#a_`RxFdqUh4KSkS292KVyAbxUG{)&51(E(9_7@LaY#s&!c2U-FJWBxi(6th z24pIFY3JchaB4N=gWlXJ^g)j zo})mIP{s#t5)1051e%1g@$Cac#1#RR8Vgcd6%!Rj(5p@2y5QaZ|KL4-LVS(O?dy6I z0#AqogG&PEfUeZcVZEUR8}1jQ8#=O8m~ymn~K-F=mRZ6wgQf5x7dxHje3zLh?GDMa&L-6ng$HdTp(uZ{Sn@ zqlClQ8yF=7b2uK5S`nigCA<{YK(`a4wY_eykd2YGiSxfxxCu>YCjJ=S4Y6YMaNQ=w zJ0T|BUc~lgdlfwcEC|QP&ldJ73SzB_y^80lk0ALH-9$!hKcVO!`l{}P!dY*vu3Weh zuu*rE%OnLhb{oQd!rw=YH+BC4oTWU8G%f2?>8_!Cm7XjEY7r{Jg7td^syBr_8%I0~ z4TdSpg}KV!dV)jrf|BZ5Em=#>dAV?|{tU!^1-P1(*BQu;Dn>>>%hT`Et>%3(O3c?T z*M}&nPfsXb3SO;`LU_6&9uTW@z-#&rfL28shnXA>;cyg(CJrqeP6V7Slmi|Jn#C#4 zb7;Vx{64jwtrp(W>)9K^KlSmL!J6Z>zjVz3eIo0p`2sLYvsz4Kk7{lsoTmv6N@No> zQvjWs3c$xWeTHT!!q0H}d=8gt{sqdbnlpfJX?_Vx<0YpvCmYW4*gG7)%Myh=_8}W7 zSO8ax6|4p5vv_zV5AWgdL!Rpl51(W2vd!W-Ucxy}R|r(5LU@-2DAIX2kHZ-pzRKYq zfoj}?G>O88oN`9E49Xc!Kf~$gIDMR$D!eC{L@KkA!&Mx<%HbZ7mm^X+dpYGp4$pA< z8BRYVQj5-Ux8Ids<297)T9c}DZ2yytQ-e8$Zwp6*M;!Aeib~tlEXa`-Jdwz!y(gBxI2dx z9In(--aQ;v22gkvhi5oE%OMLSy1=24!*~w6bC|}ViNlo~?&0tZhfK$L<8Y-eRrp-9 z2Qbxtr9M?qX<1OJuvj||a8$saAWC_LLt`-UIgZ1X92!H2Vl;5Nfl`jE!%ODy42LX~ zC`Jyub6COQN)GpMc!on3##3_mDE6iDg#|*Y__X4R;t}Oz%I}n2{WkcGP(7hKp^8#> zRF|t$G@~>NHFf|LRhqh-x|A03Gjs@HcNDq8I@V7ueok5qZtJJ-u zJEZ$X*G%75Z_@|E+pGg$GZcO$!#4}f1jbtV4FP{0g}Kw~6*|EAWh0~{BpLh)Dqo2eL^qe%e#M4JkD zKu0h}MQ~gQ!7V)Yu!2$^3?P^t+YV5yL*e>bf-mzlJ?c`pMFhddQJnxkh<-`U*w8So zhOsxbbpWS@z7KzTX$Ym+&r8@5^&u$Fg%G`=!Hl)sdS2IKMoJ^qs|odnB_61D4ZedD z;ZY9+KAi`@;0L($D z0(MQ35H`^)!*T&d>@1`Ljz@VS_6OPlT2Y3GZvZ<1&SzZ!m*Tp2fh_|R*>bEA1hxWD zWG}OHgjWKJ_~w(oNqGfO#9Y-I;WdCFdyQox{5qh>-oW0Sz}5o#p`|&HZZfk2wt^K7 zz}nvqxCr4ueB)>bT!yd?b=d(|BCJRGcEHsL2ccv;;2Q{Ikt*0puCTx1Oo?zfQz0C| zGzdp9Ey7VO7~v>pK)4<=B3zHvN4On&c{*D73Y#WORLoN?RIO3{r20d3U;T<^vwv=2 zY2d-Y?*gall@+w2^Zok``vq9Udj9Y&9u2-~G%ZWT;hO3+fo;cHusTi4`ap-P(**WI zt-M-x9E-f_>FTfqtXiwnwCplg%GGIg*p6D|VXa$>7lD1s>!AG9Vt=ew_r1@*jb}{} zp1Oy=i)SnyBTa>#)M6Y2;1h_C4j(-}LHLBhvV`M97ABHgnNWQD9tyc*iHtub8-#;I z^vsXwhj%y%*+_8)TcB9Z+9_wS8TedK_G3N$`mt?(AF&Tr``H0}n0h}8P#3aB_#~*m zVx#ftrTL24Gz#Gzd>Z-BV0ZkNvm!0N3DC9^K2*(M*#Rcudwebh>}Sma_p_;iONEc| z{3-B5VW^IE_Pi(EH9se(Z8GcJwL?x$YH|)jSuT5td@Q4DuA5kBcDavI%CB5gTuLj- zKyjY(d}3Sk*bIA_&1yI0yHCdOW0RD*RVrnsdRw)27gOVHdY+6&X5!cnVQplLAL`67 zJ14kGhDvW$XBG@JoAb^2JWpF*bY4zQhQ(Q8HI=7ZO-^SkiAoi=qj>ohbDy?Kbk0(H zN`W`ET{sTe!<2{fZMogdSQTrDzXPd7}T6Yf4#4DF@=*sR;-2#-*^# zp0?6rvqQ#k_%YvtvttyKZE{Y)BaNTOp@6g8mPf<^W>=9tzelOXiZ|L3(Q^_`nDxQg z1RR1TbYiKA4(Oqy=%^ZzC|6pU$%3<9z}!`$<-qz|oGv^Dc+NuNBwK1LM(@jK+FS_n z9z?ewdY=LF(;2}#d?+6^6<#8@CKV4^&Dl&%x6AYkk8eKQQxz){CsB0&zBW}RZ|O=gG?@Hv7{wT=H;Q{=Y_b>1j$E^ z(u+*CLUTTI;86G^bIzZ{Qtde6*>kcvuheC(k*9V9C3ly^&nnf(@z6NR&NP?HgcHsA5E}+K4$e+Mm{h6uSsSiy z4sVsG)k?>t`FUbQb8|Ax<}?+U2jNJ0af#LJ@>J`^sm(*p z6HCpG@~qOrLYP}5k{ex%{t(U0Dlz9-V9ur>TNaeH$YIB+IUobgWxY!+&`xRa^mf=` zz%4mBy)0&{hni-!n4Gn!nHgOtE5GMzM$ z4swhrf^f6w@&-nS^0~Fc9GXvE!S8h7<>Q!K-UOWBri>CxvSYw}93pp=+2M{%cbHKY z&tXH>d~<;bw@P?$8fRJjs5O<(dqnY07$=F(W&R(s8sLR$3Z0=sr4X&g7E8kHf_Y zvK8xLpPX5YW3>!i)A3plPIbs>cuT4s!sSD{I;Du8b@R z5gTmAX>!~k0rsdpa4dRG&f{j6(JdP3WPu>ONw`;od0iToN&cDLNyCO0=R1yMW8@uJ z%;Gc3P}7cZ7HSdgKJ%@+Joi)P(d_I|&Pm+8kX&SrJIEH35vJqp#kp1~Rf#;+@FX^B z4-WjBvvHJ>NruZ}lbQ&t+n>Tvfn0iKa;KDZ$vglWKqMS`tcE*%BXMzxxsZxRhcP~| zc}VU;w_-YYhcXu>^2`aiF%#Z#wOdTM)a5%~cwToH>G+Uz<9X6OFwArR09{zZr1QT# zm{wAPdttbR1^+HO(!uFcUrS+rUKj2u=`$q2&4T>MkekIa%(*nnIeIv7TLdXR7X|B? zZ-KL2gGgQD)+LBU)_3x|r4zlpMZQOTF+6-?J9kaV$>G99tu*;cUB$Ap)3S@eTt3_a zhb0%D4j-`4J%`6IdZRofvQ%EOyB)YLW0=$IcvvL0u671b8@*9A8t;vO63L_5OLMCw zzwf}8jJe-et$d>-MTTY1$E_}o3Erq|X@TOtM8+H8ZXQf^zS-ubyKAS>DPJa3I}+xi zz)}deo95%%(QsPxaCJ!a$ZT9VgE^$Y?oCft)MDj@3^iL#lX-}IIl0r^ykJD9!llhb>IU>+? z=%XC&Z*szh=bI-FDsbBgN%b*)F$v|_^C=)(5LpC?a=%hcwmqxJ?r@Q1oTyEQ0_v-rVm~8WeYR1)b?-EZ)D@C^yaXm;WT-ox(!H`9srNm@)&!}F4$7C0m;IBrnr_VwTw)#kb}671Y^~W4S=#@K_eCAlpb)2P%d>-CiW%V zEy)~|NP`X&5?#WS$V=qcM{$-joo!q9u(;s)k~OgvN|M8nvlR3A!Kjn&VZw?@VhoH* zN+DS;pLW+;B=|_7b{vg18fFi>x`+1^!;F|=FE&|hypHrz2QEEw$rRF;K`=dXq>r_f z5@SbA9&PeqW4-M8=}_ zJ2wpju&-vOyH6xK?MS$HTpkvcRaENAr!+LDWZN0_D9u)K-}6iKIPTS74=Q&n$1#*@ zpcu(MTY}P7B~OasZiDeg9hf)Bt>(s!6R@QRF=BwZqxn3;krH{*;Yij5O9_NzFCpb2 zJ@Ibky1PX7-*5#LU0}wWC4lf$hNR&B2A>9#n1`CMb%+3dnae*|T2=p7_-~ z@~&02G>GH<^RT#~b_|m0MN-X}_^TDcRZ`N_YIH0wX;0hT7377&0&#;11(jMNPp81# zHqHGt24$2kpYo=W3E-Jjt`;5I>T=M&sRJ`V1}ZE*ZGxK}Hj|YWDt*jWwAC$8S_wfB zoS<;y4>D%P+=6kJ-mWL^4H_cqoy^4ol4A588>5W?^|GB5DA(&?t#y(hwkaq+!67*=JZt zxHK%Juxw{DET%#mb_OkZPLJRpHkpuZrJZi4yA$1R7#FMOd#GB`#5VP@Cp$#o3CldV zm6$j%<RK6#}@1S~Y|;W&9` zOKWOmAk1qk(fRZp#9s@_TbpOLr{%blIm?T4?R<}b7Yj!e_m@ghCZ9#TBn8}4NNVYn z7K0v)tfZ{;oDWkzIr^R~5+aM$Z8PP;;3QYC7&F-B0|h}+HAyrJ)uiP~M$D7#Pd3@P{ov)w@^tUCdn0^|5>M!B zkvO5IIpRbU@!Gj->zo`{k;S8~p5;a&nR}=7-J4HGXBC<7jb0*Yh}DOjR*1>Z?bn(e zHEx!550#o7Ar1V&4i(3GXX}x!sri88=em4$x!=;o$pAo6AW{AUVVh6s8m!0X-+fL`jN6>-SPrCs_oq zt(EB`@cksFKzAzXl2us-)Li(3@FVF`QZ^`eJUoP&a*`(b#D|zXOc~q_apxFlcFCKA zn4T>zCRYt!U9vIco4ll(e0e*_0so)2ec>57oGvel1W+G}fJEhx*GrQL*^<@A=BNpN zrp@J4YWJj^W_2VYvySO+RJ>Fpqx`_3vZxZ(lLg;fHJo;+H`qQ$5{%okLQ>EeE zF>JTsjVyPn6r?iZGYwbjiCGqM+3#dFN+ExlG z^^6mDruV_qg!77&asa1chT*las7$1wJQQEfvbd~BeykD2Wbr)iUal$4d|a+nJJkU2 z0#A##w-6}?p;qce8z@uoBwk7O0}(E!nnI+O6e1n*3yvF5sWqv?dASz6mq>cS>bQBM zRt>`kI#AEee<||UXlcb;*?2vZ5}ToNWvHCgkk~SEDk-o7VTvbVkg62|#{m+agYfFA zWCTtMLJgv{Bz`0QWuuI8xugV?M2czyd-lIsF3yxUN#`OeK*@!?E4^Yf;uT5<{t>sV z;@zHH8k0~o^;$lvEkT5Zk4$O&kW8teQo{*Kx=o>cndQN}6cPyuhhn6rl4kw22uRXy zQ8j@km7=Lsn^b2$dYEEKBXGKeb4iRhLA|VzFYl607`ZO`^2aJ>46VU(ZMl1!N7Z?i z?|-d7ppZ6*l+1{Q3z_ih+Q6cyVGmPu7V~E@R2IWaK=A9FeKwz zoi1@hqGk%*HIUvE<{}%yCk3$c+|rOYLW89av4Kt%qXZ{PZNh6Z!$3=&j}8wSh*%?zA5m^_9bdb)EG`9i z%UP%Da`viX&74x3NQ%;ggxV@LRL^VyQ@#WG-xWbdf|_Lo%hLQo16dj!ZV^#To@{4H z<8%4Icbg0oaOwyeQ|?Zd*sI-1V7S{ba7bKw73)81@bcOP{5Oqu$hsgkKoY^jnlBk` zVwHNA8c#h=y5QAe>iz0XV|B<>)Sx9~R%^bS`go=l)*7?Hlb zW;x!Gk&ATX3>a&0Y-dFsH68Kx1igq%I|I zipB*^cP!=4Rj#J6I|m6-^2w@o*R+}?JgmEFE7AW_m-YV7yR0@Z)LAqBC!O`M zqW+6+QY0|en|z95{3HD(eWSUITwrPTBtL`PF>;8d$(!_28V}x?4-Kj{7p6fqs^?|` z!;w-4N`#{pkP1af!KW1*G_O-fvyPGV;;KXzgoV`XZl<1$Lo2vj1<$rP*22QFpeV!@ zahZ;G(D-0UHS^`bZLOUy5xKDV1V7YfYGV;&W#s8i;`0}kOJ1R5@M%V?P9fEIt0!5( zQjU4&&n`IRQ4Z3iLo*YxjRc(nS9_gdB zsFO^KllPki9C=Hu51&Tzz@;S%>8E6(s2ty^nYfWkaNBa~V{&}mHr1{9)U)0xoLWt# zl4YjJ-fiq^_GTi9EUgDhBs1wQQ(E-qaobJhO8immpIGlEHOtMx4|GXoQdx;uB#{JI zQU*$M`!nPhxll(58{{J$GQs0f5An|$)h^d}DJg4zc@|3O1(}Y(LUSnA5~HzDBBz8} zPbC$gp3&77*-qf;)!H{4+&GY0a@t2@`Bif!A6;uKu!sz#cY=E>T8mu;u5IAE2HmqP zjH#Z!dYvpHvzml6P$plt))@>=Nk^$JX}!l<(29)u-U)gs>ZM-F;~JhNx0psg^&X3= zUJq?Lj7J)*wQ9vsAM=>F+U?Kc`XuQHORwEC)ww5Wy6uw@$MI@gf7WaWsM3bSzo~7= ze_tE%;IjcDuSUsk=Am6uuTu+Xr1)rHlj^OKT3^%k#SGHn;puAf{g9k7v{ggvI~u># z%jM7~>iHsAsoLuavcJ;WN^-kdWx9K)xffN^R7eGS7Z1MX#ciM@uZL8KOpfHS*dPL5 zkx)Lj3rthzpEpSAaA~tZGHx|FkX&e5T}#fP+bB7Jdrg-UNx9`u^?cC>UR9&bKcbQpG9{8mF1=;Xa%t!(gl7)5?$<|8F zB>BO_VC^}SW^>=pp&5(Pl3-lu^)|rCdb;(}37Qm7T}EO_LYid$kHuFni@0&8lH5kt zU??w}I?_9DYwwN0FXBM4RKQkAsJB^EcPyvWPo* zB`nRSUVo(~H#Mco;%K&!(z{#Wp1FCar%Gj$l*vn^wGb&BNxv~Z4(_5ParH@p?Vz4y zxbCv{tdvk~gHxXC{N1CNwIi?KVf$q@TR^?;-6&;klDI$No70J&ubC@Bp4o5#By1e> z_sq6!dcr%Dwx}dsk~Rx!=J)P(aH+)9j2{NAz}YO6gt-Jfku1G_fDs&d?J8l?3_{xM z)G1ZkrYgJ~dU>}-U{mv^8J$t@(GL+Tf3r{(|F49_xadk)4Lo`duSfD`_b zG-Ajo((LBumu4CxV_p8N*Z)?Fd;VE&nioh$f2)+r0YzZTg${J$e0&oA<=0TfMDC7} z%_TRNx~vpwXgW;9ps49Y;Vu)z6hEY#B-G&mJrzr$)=oD^q*7*de4 z9bg{9`AA8hcK=J_q_wX{oNfM-4)Wxxv485eCx2@^q-R#MUGBX9(U{8o_cci?II?B5 z(4~2jYVz7ld0y_2h2d6x&aG*C-78t?YcKK-9&V#^d}bj0{4dh^&eIRyJzz=Y;Enzz zV7)W|P+FAtVSQjMXji2pYNPrJ_&*kc-(tiXXCT&EgK&We?*6Mol%BAELqQoT(G;LZ zxD5pv1>%`F$M*sX*m5{gv??P*Ln|28r8+L<^u{M5AFaRtq(pe$(^?Ik8(2JW`!8hy z{!N}a%rx7lj2<4<`phg%%KPnyuWLK7jb>xFoX10sX*=Sw3PGW&!~Beb5Te7C^U@zk zf+ozM5$muzg3^eqO9%)GBNNm{QQ%Zct5pl`RH`sT7$R^}ixfaQ%FQG?3c>AKs6|tU zp%jfu&5H&ArWa8gQ|Jvb`j}{CQ>qO>&@sPgLqbT3p-oJ*p##bTX6O)T^ox#m6E#Lf zw4n=Pbw-uoCHotd0?43)Z9@VgqxF;}nhHW5Lz*EWTCYM&q77-l1w&5+{DABA4R8&; z@3|>{Z2*5+NiF~MGk#Tpq%{oElH?_-M5S6VjG+ScAts6i!l?8yX#PY|uLling%AW$ zssx%5!NV!5~2vw>=D%J+5l^R1R0)~op=pb|)1A>sK zO%_FBH8@sKYef)=VJdK)^jM=*87j7-pbly#p!X_vBCnxh7paXNPe1Tev6Z;$;Kz`! zgP(>7kfq2~PYJX`8m_si`OacuHhz%TnTU71?Y2T|IlW!#d2La?+Ch`jR{C*nj4PGF zNR=4z6Cs9*kMN%gHjWZlKkvm2I824NA+lVh`4)Skbm|Hf$nW0a#d1p_UTO6ZvhcQt z)lBdE$gjHE9aJG#3S4TW(xcA7)Wdr8dBp*Ngl4EXL=+9F;b1j-yk$tmQHTJL`nn}g zvZ=qodb?k3dgzOlo@02Vu3L+S!BQmGg}sh`fG zL$unEiXTCY@zd~R7ZKJY0kkoe>A|33DlsmVaZ}1i4|Mx|B@;xwTJ5K&KMf!2!DK2x z1<;@_QLoWZlauAfCL^bzVpH@Wf%W|_Tg%^El5dJ&R7Y#Mj@G#Cs{emgxaXB2DjwIs zFdC=rF;3B4?Wr%La|HIte^td_-yXp$>?~E-*(9*h|9xGaHp%aZ(!DM6RTMB~unE*# zLbL|I0igG5N=l26h>r$#*f1D+-Bc~>v=+}wK{QnQi3+u#$Mm81W3X>}{K%1^Qb!0d z(h(#fQ*so!8|u`48bd?FRLP)F5g~k(;DKK@VKGSS?EuW6aAoz zm433pX$fXRDq~3hV5J&LVKP8S9WRLfM#f1r_3&g`ttbUTlD)y!qAHqOxrP!`a@pPk&R8=(G%A~sjf*x^rjW46=&RMr7`;ZX zharmL0|Fz3rbmj?Xyky7DMKo|==C9$X(5$8DQjh>5FLb~Br77}D1t6pg2AjDBGooT zgLZN|;}5NrLYzd|B@%_?@@VK|a>n&zJPQv{G_MbxAwM-_y?+T+D^M$_zEGn@B}A0V zM#!BGo&xox1l{R0o^%@63Q`aSnF?r($gSQlS`4ggbj&bJiP8gp5)WXa#AwT=j-(!~ z!vc*;9wJ54_Z3*rzZ?_p*WSJF3(FKTlpfQ8>ulh@h#@1Tx~ayIlKh}U|JEY^MID~e zMiwLm-)!*-9c@DI>HTpt8TGYERH+rD9Auf{9x%*~qDJzjAS-gJpf@nb(L74;Pnu{B zskC6cKnKiv=$fIjSPxkuClWD=gD0bp4yi09lQ>#7iK8X6s~;(_tpBOl-0zON^Yiy_ zsd>0mh-tvuWHgCPq+v4Wq#R8KO^;jgz+_0}w2;b5>h#KD;w)e0EdSqH(!Y?h`>n}` zUU)^ELGU`Y5>_KdZ>W6IP&q3Uc75)vYArr}1u>2y`hy@Gg2DroMlwF3( zix@SA%3oBF9=XUgQZ8aa1QQTac?~kfqJ`wgQ>sO{Yif*iJm?8GPou#ll!!lz{~>BW zN{DdfAKVW-3$B2|Z1W@`mG>b6K}(GTH4rRToRy{|Jr*%Berj?RK?_!^;0q!k6&K@& zIuMNU<4Jf37mea6WtJfL##|2wI!Sn!+-Bq@4F72~Jt3DBZFoXJA8CR$8m^H~`0Hsi zBn6*j{?XG`lNZGz0rMyRVrk`-EryS9m`ZTtg6BjiPM6>s34!;+6H&NW(BK}PM%iBA z@EEfQEI-X=v`BM-*zCNrgurOS70Z=|eq{@@0T@CMlG189gyZo|;R$=%;;OQh*j{MfkYp;5QO%(sGUH^oJkD@cf-Z z+|aCytoO?*D`Z)aFNA*7`;i9;j86^A&Rz%hRB>d^89!~GR=pppS z8H=pdPAT1vWwp~2rO%(FZ@B#7=_mh5`uA4huH023dmq=;y8mVk9@tx_#gC!FW6A83 zF;u#76}FB9I@<9@0o>x5nHg!>lfU`pborMtJs0o4W;a?Z2haXTLZ~n^Ey$1`m5~wB zd#@>UaCAwO5-D9;zmFz<hB?EM(v6JqDlNub-M>t1YbVauOg_=h2Ylh+W+g~ z-F6N^bGUQvw0kpt3k&|e?wO*C!C^~ z*VD6?H;?IlCtzyy(`XLQ2pX*d{Y_(I*B*LP22*W{M-)n zPORcwrQe5RpLzSI&nrw*M|P}O`B>(?OR1xTqSyC*ylO+AUMtYjxvr-t9v|54<@n|4 zM{e$2ygKMq*0LN%R_JFR5@p)#@}4I_E*NfZL{a2PmX1u z8GQL%$1l=8K632~LD{8m(Dte$gM=L+?RS0k+4I|%S2oFfDzeEho4;F9_~?Vq?dSh? z^Sj&w0o_Z^r!0A??=yFHH;=m8?jp-8XuR=FmnQAy%M;FYy}~qyr_OuL)MwrA+q&8k zVshtvdGAV9+a)`zcKx)5ZJGP?#Gg+UYda6?xUc=juDjKfXS?)i-vt~V{oPk*riE8@ zs#HG~-L1?%Uq86x<#X9fPF5{hcz?yw3uktPRZLoZwRGCd&reM{zQ4W{5f&*}hN5j8!YtKR1VfN2N!v{X@=|G3oUy>-#SJ;^2dN2j`VB z)=oF|y;JYybnJe9+lzYR&&wutxIb=YB5NWB>82iB_Op4~sa_p3=Dz*hTSD*53&Eik z0W-V)w2}r&)6z2iw~=2D?wIk~+|?(pzB9Z~U8s6LJ@$^CE$Mr!V$Ve9kQ>=3SQ*i*UZdgJ)z%FecF?*+FH zUsP||s3Xqx&Gzj5^8VeN_b#mZVGwc`9{G97BX6y{6MgDV`+7U--d28AbvOw{%^$Iu8f-bz*W#gcra|^y# z@7elAJSF{SuZ|TP=MU9=+4Yxh$wy0;vJDr{PA$7+I{3oqkY(i~J1T$3VqJqyHHzsm z_*3%-CvWTvy4U#J)@FmYEdS%y$1moEpVzCbcmBxO+!RCVu8;)#HD%9l8F{-}P22_( zw97E}R`W|^|0pXcIX~%Q@H6Hi>=EbM#};30HtXXP2@}^Jt6ZKH_~q~S`n4LqH}NI? z#?@9B)AOA#*aA}5Muk@_n6Eef6y;j<1e7j#*@?K@A3vRb z&u?;h$@y;Yu6X+9#9Px7hotNdU3OrbU_0!0=F0DnZ|%FO@{`M!g2;gdr~f#%r*iM& zU(34exH+-o)$k=hezdh??~Z$B=RXRK9U(;Y!`%GgogD=W1*pHWaPG+XNNzx=t!9j}a-*6-vyx88bj!;`HyJcxZ!zq$UX@0N^;`^s%Cp0*u@-Z%Sd+>6m4U<72*`m4CMmGq!iOD^XdRYOdS-1T+bj* z{>o8r3~iAVbH+cq|LM=BC%vFg9@P^w-rPI?r@ilhYbxp9PN-IJ?VZTl6-cCrhyr3` zvG=Y4LRo1hK}1Cn`>LzhyV(2M*50tJ6?N@>W!Eki)-Ja1IY};tNE!j|zTf|b-(l{| zoH^y0dS`BK&R|a8s2C8t2_Dz9AG^D(18?;EWI4~LG0$nX&6fICj>jt(KMwA%YC&7q z0RAq^U7bC~B+poBUjIzyF1Kj+4u^eD9q40UWkBgaXsU26J!Ji?Ki6G3J_RjR(j;xk z3g1E=lTNiMMKec)1Q#FZyo(o$z#sMfM;5S+YKczDv#IfZ?lZkUj`umM9G4pi$ElD$b@!CyC*BF(S zIt(6_UAVjWdsutBhsY*Z>IK5-z8|Rg>LYY(K36c{-Urk!P(X8_M7+dQ)f0W@3 zFdtAHLu%C;=bl}BVR3erO|{VeDOfSJm}r^S9ESad)m>+gqZiOE{`~#WZy&aYCv{#r zsV?S?*z>PXZR)zi_U4TPQ(O<0^gNomYpHy~$-1j}J?y%#3Ulk&=E2dj(?|MFvv)i4 z=w$eShEzWn=7g2as7b3r09L)qKZS?SYS#Ua8l7$h*RD|}p;PP$zrP0+>G7%b!rhDa z6ixBpIJGw#*kt=632z2f+IHPku-8MUZZ+bS;?w4SPbh82R3kz3vz`!3Bc4J9QaQrPh_i@3oOCS4xzI%MbRJ)}g zK97(_KR9eLe&4jAMN{g}zyIXLOq-X@rC$qg{vl@P{4YO8uevzUHT~|dSB{@f*u=m2 z@6P@sLZ4f$G9P9h(%a5ybJM}`=`VfLu9{t~Uv7MB>$wwd6;1iL(!5Zw(hDE|UigeYs+&Mlh^j(*_yT2sz?SIYudvK+H z8(#e6`XZpx{FT2g&veMxc(42F%EOXAm_J>3aKLr>{vV=!qgVOQm{Q#DU8UEzmyZy- zZ=1Gi*u`aIuC8+F=~d{=Rl$eY;B<^ti8XhT`?*1M} zUj}vO-I(YVH4}BzJ|%4Vh-;begVOvaI!9dkvZ4ItK@(ri401bjb5?yxcV6g@xsJbW zY1ZtaRmh%wO>dUD)@abG(U0H0xL5De{+}|+KjxjD5y*FMfmz*t=e&MNX{l3EhGP`G z@_WTmwWP>d z&$?BX)#}chgZ}o~L$FtJcz2nE`3*nqsu@VdC-3eabb8zg= z>!o?=cf~1fpv@6W`|~l=(o&uL4#u6Bis7Kcunh9@$T_Za?roX*;}n-<^J4W@7(aTZ4=MEIqm)Y z*_n^8e@?#}e4$#|Qck>Q#kS2K`O&<3`mt?2q906h85?uy*`Bgy<5w;|RcYaFySXzm zhZo)2G@}R>D-+A{29z6Mhd%3=yt>Jo8zanKRQ!ASRNhCckj!2uVU#h2 z37$o~&r}*wpVzMV+1J;-Wj1H3Txl5QQEbx*&-vq%7FdOxeIdGdZp|?Ne{YXkw8EFy zCdreg<1_t7pIPZNX4-;8=k`^e47hT9QCQ983sd{Q8@;eq=LsXrEvyh^-YNZVyOhhm zi-wImP<3J4N_nBjtCGiedNIc?ZJ2M>`tIA_pGmP@(Z2HgmAGfvwsGnL>yXH#V%6T3 zO1}Mk{eusG?=%njX?%&_r|s$gInr`p8;>#foD(W|U-^7t=-U~Cuk@Rh=sYR3U*S~? zzjl~^WCeZ=FTvJt$-d1|{?^m3oQ>~M8@;+%`tnDM=h$N*{Jy^TC;o)w^n@4w<4+t- zqC3Y5?x~rz-_~#U#3uP|+}9Axkg~0jHEXiC)J#A3gjGdn7g}qU!CzbIY)X@q7FgY% zZ`b?Fa=DH8qhFOF85lV{D-YRosc=ZzC)~-b^bLBj@dAHLm7nALwErh%blHT#*I(2h zQ%g{I{fEnUUf%M((e1&?IJb;X4?9}0l5Fg&9lW~ zuh%}~_nBXtKRLE_g_PLG*LrL-JGlI1yv4?;rEVWW=Hc8Ys@;xYLV;T8~ohaX4Mv~x$?=#FT9`}7#=uyR*=^Fu!_ zJ{Uh?#)(UxA00WEgu3hWPL@#T*|^>NpS-e3o0Vb{zr_34fl>?4kM+7;xkeT5Yw0%| zx$J+ujhFh|c?jPs;zN^F&y$~bKhfB%((AZ{eweDx^IE;G;3>O$;rBhAs#t_nT|Te; z>s|7)K2gtQ83&&8nikq{BP1g=zM8viJT^RV!&tukzLnSAKZc~=9UNbL@jl+~H{(C| z-885A$VN~1Ik)?Dwv8aPX2#?LRxj?_4CtNqN4%wD%5|56eY<+Znz?RT@pNNIfF0(! zxLda8pT6z=YUGBKmLXq??!rxJa>RzI!`_IZFVOVV;&$JWRSTc(Q@2V$oBeIE12bz> zxwoR|Cyf*0N3DJ{qS4DYe%Q{a-|5|vl=z!ooBdWg@{ZfcMN+wQ^laF9*{$=&IPv9U zDL!kh+u|qOr#9~JZgBsd=xH-;L=XOIdpo|&j7=rlbVAPh3vE92jDJ*bdeT&E&%_>@ zcks_P#nxTkfxU}PHgnM&N~NV8a%$BS=aFBEuY9n0)W8`-#zm|%+k86Xs(n3d)4cm> z{F}GuN=k8B#dk0C=-42}P7 z6Rx)IU)<;F()2GYQe)Hnh*G9uwj&@ax9bik^p?wPCzFGi{a@ z?ABzLvR`alkD8Rc(`LNlq`(n?e8XS*zL>%t;-RBsDR!2sp0L1`@d@Cv#so8kkTWnue4 z7O|uH7n$lmWK3e&2jwfVOm(Dy%LB6pEaP?#`suY;CVe2I8q0oMgnoL>*ZuwgY`U2hVc?}d~j%3j%8UteT+Nb=G2RrM6KC_6`>3s65 zHp_mUg?@S)>3{kI8|ScC_ta1F?S2We_pjtMOK zNMk@$e*2gk`LL@x=mU$`oX?Hj#+HG9v>*6}ML%yCYjZ*H1CMDeVnY1_ujntB4|E-3 z(brGV?NczG8m0yI&^d29i7m~ZPoO%$N38;ibDTVJMW6Pt0^(~)I7mK3D_@Rjzr z|7Ou=Iv1``kUneErNZI}i&#*9aM5O8ex*a_uPpm4%`e}KkqZo*SjOQb^cVQP79r~SScEMh?GKHL2C zQI~A!W_!PDl`i}8I}iQ`uvquh|L5nokGkYTzd7hJix|*4u(U24HS@qv&os(Gv{y&{ zhwPsPs;kMXD-M2oE@l^q8Hd>jJ#^Vv5P9%_1j`s0ybgq&cAy(t?4`9#prM$7m(F?F zsB=bVD)iIOVY2#x4Ru(?;R5s*(gy-~EI=pp*hpT}m{%Vk+eNpE<733T@LYARA4dtVAUN=MP zr674=(-;;pA?$SSgCKvRf%Z{5F02hZ9OxM@~i8RVS{`& z&w1&49YwU+$96hw^8guIU-`kO^Bfem6$9-6<#cZG1nEt6VTknghmAu(hPLPY;2WaP z#@yt?Cr40D<3@h?kdw?Kxv{&T%K)QtAljeE$%leS%a`XM;m;%%eInd?7IaS-%UH&)p{ZEG{;Mqd@Ep2Jnd$=@ zL@?+=oz*D>^cy( z(RV8I(|=vEUqN>zZFPt|s{5Hb?4!9oL|b_#9X!)?$k1h9Ugeqen=XtWc^v|iwjicY z<(03-$l0UIC)nm`K)um-e{{ZA2Kn?H7@NC43R}VkYxti3(Bkd%#EBp|D6{@{a0a7 z0sgak&TFK-^c?^E9Bh7uG@W}#Iq5-}AW&}VEw9SV$;qyQN`volEc+ju8((2_B@oq} z9Mlb@_dA0*=|MSK2hv(BujYB9?JD2K^@g&a1IFK<9dv{cdio&H2F(4EP}W z9(i82ZDVB>=zbu4wF9xa*Z&vv>wHI7e$=%#nXsiR$k;l|Oa4XLY|D>y_{#PE)Hq`bEdUtVde4{duUk=1( z8>jE|7Wlo6p?JZz{vc!Kvb^Ta*Zn~FHil*YMj2WcZ14e_LZJIBVnpv<()%8>++qXS z*I4w8)_sE9+FnrQVB?b{Zn{4Ro`9&TDLY zg3S|H#Efv&`&|}8e1e>&Ec>z55Ig^CJiyF_W!zGs-{id#$k@cPAFcjtb!&({z>Mw% z4zrA%LC>;k^9Qz91F^Z^cLVwj`aZ8VAJ|NX?euJ!A#+@Q@tE{I5!l`Ww3S5)W3&ED z)eYQAfr442UZ(oMmFE!P5a1Bt5a1Bt5a1Bt5a1Bt5a1Bt5a1Bt5a1Bt5a1Bt5a1Bt z5a1Bt5a1Bt5a1Bt5a1Bt5a1Bt5a1Bt5a1Bt5a1Bt5a1Bt5a1Bt5a1Bt5a1Bt5a1Bt z5a1Bt5MUR9uiPhJ5%@yYtI(jl$}v8Y7*sjLuZVwAmZbk)luvQ~*RNUe_sVzz0!2Q> z&A)!7xE=AU;wel#0~gj`zf#TIPCQcW~&lU%xDmg1dRZJST%|V4kZf@; zrCD$z%Mq1Z+2RVoU=9Jn0Hz2v;}D}v&#+U$rIa%=%{E)yE5$myo)l}cOJPR>F1%9A zv)O5<7EeJw;@SO9vCfL8A>TH|ngYP5!YR#`;tHG<8Sm|~;;Mov$hRYY&A7^t1SVfC z?nV46N06O!yHGh!`6G#6N4rwwtMPjgzovZB51M{3M*WXe#=o_*l&tom zge%QX1)B=K_g>0&riABPxh%M{wcl@g)!KUk4D!l?>-+wZf_wm&-EXyc8uD}KkE zy90n(aV_?zUfSYt1lixUvysHF)^60|3`|VBV_;4N3s?^$$D7AHj9-}`;yxS#90D8y90D8y90D8y90D8y|JM<~`(4U| zeldXt?O!=KYdjFT5KKVqW`<~`D08zY@zoS({DQGwoU$nvIe(F@X~uM4_*VjbdCXIv8P3t{szqze{qsF}) z{HNcyw3f@(2f(wzM4kTXI!(ET9UdmyvP)e*WI2JJsmVN!>%t5Vu4%nT z_ba;US63e0Cz&zwObtmE=&}j+&~NPisBQ=1^jo7nLDbH(txXXh2GZr9zPvpDodwtv zX`)Tp`nNh3>etXgYwueo=%TTzg1XGSxQ5IhK(9@(i|&i{zQ-LrtxeED?P6nI_?wdq z$X;QhZC!GbtDZ*oo2Vn--ZKxo`k82(&iyyS0rGE{po7+mmDTag%WKH~-2~gHZ8p_s z4|q%+`(pL!$W1=%vIEh2R^QmGEuZEOzCPXHsRS}*y+vbZp3QxXy^yK7X4U4Wwsbio zOJ4|GIjxVh$;~Ofr9K_TiQvzeq;GOi0*q{g2FZOY0u{lNSi!;>9lq%uP)P+YslJXf-PjLkGg)u z_h`tYaixX^&u|SMeLidEC#cKI?KNzu1)}wAo93iQ|n8)*Nu zjHXVc(Qhg-<0G@2=+_*l)O|DLx(OpIw;^nZ2N|ME8_&qx=!VYfAex`F$<>#B1!c{1qg%ZUWY9QB zeMFx=ZTU0~X4_v-m#^&_WhR-RlWdV{lWlA|WSM$T*wz@G&`0CmLy$I1^`*Z>+0w@7 z)Wr)~{wCN$wi@-@d*JVGqP|tS{4q8Uw$M0u#{`?`zS!V#5WELX&_#HA8SA4ye#ne7 z(I$h&LFlLfqV*{GksG?I&zIcf!xkC`O|k25l-D~Bf@dNqH-0l^@@(AG#0hqpdS9&b z84$>)bGaub_@AfaUJm}ZG{H8iAD!bM@@bE^rwNpAdyj+#?6L$on?OQMOu0CR0EYmF z0EYmF0EYmF0EYmF0EfW;9R%|04F+k-cU<80DT;Sl;58r!Q+NpRvX2y=-Fx*gf#QmH zlX!ii5O1o$TPY|U`9&?nHN}TCRi+KWgAT;wURhZ-D=e>!S9VwFQ0Y|K0K*ivXoi}$ zCGe^aQND-A-CbS2LZ3qKkgCwn*n{xX2sL|E_QMaQUyOeWzZL!}arlOd5+?>Pm`Cpb zQM_p-zv_tOrtvL!Yt&92>AewjlQ;mB_1=i;+gBXkmGTKArjR}S>X2zd{{oArGGLu^*(L0NYY*`%+onfznm)%olu@>d!m zkK}e&x5=1mlwDw?u58a%<)jPpyg|l1@30^IIx*3rrv%FV3u3U<7d{2A-Zz$khn~^A zWQ1HgOEkJ4qfDp~I>kZZ^{wjXz6=nTQU~>8g?NOOLF)M4L0s`HIYK%cHKyM_1AlQt?PmB;hMxUB57LE; zdLBL7LAR~c{xr)jM4Cc0LSyIKsf=ajB> zK874)=iA;!8>~?PI@=j(|5^#ldUu7}3PSnfpWOO6F7|57sv*>#@-+kwZk*6(0nOv_?P}Uwq^D%?z zdUZWWpQe__@aPJ&eJ@B|R!-NDP5t(j5jrx!Ta1x~YidK0pfu1SklN0;qJ7mxntJ`{ zvYqlSf(*V#0x#{O=##0QKZ~*5&=B&C>BpqY!w}ivqrOMumb!hqt_er2dji^YqD(&{ zbddff+GMGxgOBblXxz|cvwEK1Jppz3%r)c}1*IFIhx)PJXUV~1>>9=BdkZxmjGd1o zn6f#Au$|@`>Wk|5>bj+Iq9M_lr?rf{u5=iewPDz`QC5UeStn>=VR(?jn!qS zUn9?$y}VrYTXlVO4V}i$$H|&9RB~v{Pc(w$;LS;tQE8A-7!+&-^)X5T$IKzXA;2NP zA;2N6pqdX!2L;t?-|8T6=^Eroc5iV5v_y!Sk> z_dG?2$Gg1n&=s$|DlAk&8Amvh$NR!7CQydfX%s>URD2&onIiuS&t?Geec}}oW`$ng z2* za?+=n20mXsaun~b1&=$3&K9nKs6CS1bghn)`Zd)-O-+58aqz6yA%o;~qB01h)cEj3 zz9MaqTAI3U=6W*mY5SmTc~GVf84r&n25rznE0L~fck1P|U4xg};XECrw;gGd z&82e){Qrc2avvf4{{*l1<_UK1%~ObMGtAR$GpzB$=hkT!0^1BC9?w>ltKiBo^R~;d z;3@LbECzr#!#ah?E<+)MWM$XzE!M%^f)}dx79QHSC;<|Hvi2>I|6kj;z}Q0LEIr@A zP>yp0@@Z{K=Zg#}?jsSWIh5A!%=k{>chA-$O>Wd1W+_+h(_Lb<1X?^k9zq()MVe# z$WyHQn0yM6-&uoaE#ibZ)z2=Cyyog&6rFq>vNF3+G87Gm;m~i&C&uhqXLj7vzeODnq`QCkI~?V#?2Ei$}nX51ZuR z3PXBG4w8;4c!cXXnNQ(tG*~3G*Qjo>eRCAgJm_ntG{)YU*`F$sr*6$a%FPuMJ`$3Q5!wqTxH?7=rqegXjA+ z0dFnP5%3zoHX?yh7}kYGb)8E5sWn6>a2^N*m`^u_zwK4_P_2@`4E_{T)}pa~w^Y<) z2gr>=OQKqrtD(rtp;dp6BiZPpsK4xTG;2|_4&4=HeBdSZlnC@hWxvr^F4f0^*Cgv{ zM;`CR-h-ZALn6WjgC$Z~SX5*ady%8iULc7Kj0y^i3~6E?BM)|PxA$sVyoje*CX+-2 zgvSXY#F1ga5}CYPwla_sDMJBiq=zgpR1zVUIYfj7N~2^^!E%Sds0a_SEW&ZH$R45u zf-GTvL6S&$m^?0<0ggg4B2pY7X=2|t&L=uLJS*4uY;ezJj(Y zgaqxQ$!r<9toHE>7Q{ux2x7&Na)CTb5Ev?s43P-rp%Ov&u*jgOSec-!Od=Kd1O`UM zfWX31yPX_K~%6p zRd7^zcvLJZ*|B($Z*smtp&>)5y@|b8<`+3QYM?}FFNg_)g%TMmJy;wrlh_NCHKTM? zuOKouOe*mSiU^AglgXuGd6daAL&HKsQI9@@#bM#%fN+?UqmAF(C0jd3O9I1!(!qg6w)aNg|>K zQ@w@B1dPBiMN5zh(5{&_t}p_?$dsJfWeS3$q=Eo(;J{e1G)SXap^rsFaX?r&+BPbc zX>bk>Sq)viscX2XXk1O~jjk0>r!3IEbsm*MPp52M&C@BX&w_yr^vq_n{w|k|J!>$5 z95wv1ob{yM=pzV6-7syQ>0YYQjvyAJ3sQ}!Nf3mJWr6^SBvK$(3<~Hq-_QiAROcuW zB$0)ML`s6F3&%!D2P%4)qo6Cs&ImmPVtT+-3mm(ZVlZ68@f5T3nd~4mj=#_ z92&U>1UR@m2ML4Sf`mchhB_69gu3OsON7A<#i9ld0l@*zz(?Zl0JK~kT-<|$T!mth ztGH2id_0}hTC1YHdpa=f=OD&_q8!Z> zjW9AwjvgS;Xp3l)Xzl@VSq&EQ6hp3*X%-|)=9rb=0mB%Yr(!r1w8UfRk@~kJM*t`q|A2iV~1fkrG&tr42nVDq1cGi~OdtWt21`TW>}u7fVAVavI+q+qLK- zXeq_QLeXJe9Nm;7fKmvgDTV@>L{8lG1+vhnm~b_9nB}6-BbD8;R*OiQ22|Zlp|&-q zpXSkFK5(NG28W>#Qj7Q%x*@$5#y?3dm`nXROfl*^21Z2&hlQv*Fh(*|8M&uEqUj$O z6-%qErHE&&auv~8saf`IL=1v)ii%b(nL_3AXb&eR)q2e_YrO`mBAhz6^>b<<6uLU8 zTx7)AHzhYbofu&%@t#gOsr|mGW{p&eQA!CS;SqrrO0%0v8;x`kQIQA~iyu@e2Fjo? zad=dSOi-I)>d`@w9**`ct;6)PEDVDr(UM3kFaw#To+pzc_faiozhT2HZu;fQXgqx zXqX&Be~c8G>t<()2|)Mtm&A3!It)v8H&+ZtZZ0Ahm%zYaQBZI;=5VYnW5gjELYS2r zYEgwzc0|6VtFTkm8mjXfaLf%B7yjQuAi<1Bw~)dn|F_)cyj3DF%)Y%e1UIMI78nuhNixhy;Zay^gks6-;VKl0?Bl;}lkcK$!kL-zgo&j$SQV~2uJyQg z#rf7|$%&;GA!(i&pD!vZENo?2&&J%Wq9sq*#;Qm?E4~Fkv7s5?BDty1Q&>(d#a39@ zoX<M6IN3zXHj}(MyC-;i?`U#4orwKJ5;6QtbUnik`qgG7ABgP5GL~9C!3q` z&CE&+T{1boW8ofqTlcHjJ7zym89NSeMjgMcM8C ze{7!deDm?jS58zaUa7+9Ab@_Gg7x zZY+Os@#Cmd7wi`P>{#cBW4DY;@muT2#iJsMSc9C6gXJMyRk1kD{^}NZtE={M8m_Gg8<9q8< zADt5(_+0*M$kz(aEvueNpEi2$>``W@WB&4%!sbF7)I=3qKL4wQg}Iq^g0K|DYgiN$ z7O^UXW@2e+ZEh~CLWwpOWi3jV=b!2Nv}phPRezau_wwr6y`TK~LZpr~Di}!fdD4C^ z)!Lj|x^?6x2d@`}V;WzrH>{h>#ijGg|GV~j`JxVMpL7&8JLmC6SjzMG6UkrO?(l-+ zS`*Zo3+e|jI0ehwS!^tDvdWtST(`ugu{e)+0p(qC=5Ci9D$dmQ`c zqW=`%wr1yxm+ZePR`~vC!qU=9UUvGec5*SQk)hSAzvp zo!%bk{?_&51gG28w#}>jN8kMy-|VRUz{95Dl@CucM_ie+rEfsBG5tTZF|YW>;z;8w zkM}h%v2}jM{W0%q7pgPFNtkH$voO)Jld4ac^XHp+eC@Gi;FZfy9+b-nR)@?IeIh{7 zMbRg$N||--EGna@28$x4iZu@l3G< zl}aizNrEn6Sf|Rx5zzvy@S~%!x|E`m>F#{XgZh3NzAY`$H7)J!vAPfZVj8DLrgdJs z#4f1kgW&^54xGHG>-*_<7hmob*xSsn!}ZZ;qk^B`K0Wqv|CJvujh9bo-nhca`)`t# z94p;uL-i+X{Oc!8Ozl_ubxRfpIiL+>$v7! z>)PYX}nk8*8OL?&(W8x1}W0jpR(cBdS zr|7#5SPT$XDMcO94ChK^DOQ7G>OHa$Fg{2*0*gfc4n($smRc1aFs?O!+~;s>KBCiw zwV57l#xGl$nMX8Rj+1W(4B-5rEM7Cjx>Zf&cTyZ!(UDDzVpCn9IJi+BQiUN!fI|#A zE}?^=U{D|q4(I?yfGaw(p@W$)P>dp#_?ZJII!vM?BRa}bmrAkbibImHEZL-`1J6nE zzq3My@|a5fsEoGy=@=sf`5hpcY$CgTkRpW+IuKAE!(~4<3rDF4g^dCn7lff?0RGdJ zvOIGnraY)p9^H{|QXJ>df2F^4Xhz3&q=~E$KniK6c(5v6>8qo#XjT=Omr-=sDnDA3 z7nV&ZU4~b(Ua7fT=UG3idS}^z?#1hcn4M7@b;Z5fR^Q>*V9`%?<0_8!e_eIrp;Pg~ zcxnK47K4Ryp?k7hvdg#zs@vBG^?W0@Ai=UWUE zh6$@PaUp+Pd6gwmfwJgq@`OHFTxR238GEsPFO|!(F={ngt}%2fW}8JdMpSZcyS3)1 zJ`2X3{ZU|>F#i68uV1%Z`nkU7nMb(_gUX#*TWMdfvW<9)?uL)K*US6kUsn9d4Ko*P zSyX+*7r~0|8+-4Zzj;8-Ct=;I^>uNw8?<@!%nFtRU8j{u9yaIrTd#-z{NS@{f57#O zT20)m)Q0{wliWbT^`0DXZuA%y*Pt|7xo5>OqUD-7bBq zOyB7~H$K>oIzLZdyyj7xk(IW;N&fd(tX1tYkFU+R-?ePU-XiNO-|W-6R`7}ClZsTn zKkLSCM;&`6i*Mg}6|qeG_?My)PfM2H|E_BnZ}aK(1|IHsxJc_wn=eJCy)IqEqte}} zO-^n4dCIU`*P3ItIfL0|yK1(v`uxFsw)w^ zOI2c8mOyQ`=@f;HDPJF&aD;9mkw`h;D3)=EWkm~Q($hB=JxX+#_u;U&6D9lc%Z6^2(=r-VD?9O6^n?$VbK;jD_q}cQsBx2LTYQ#3^Ez;IR_mkBt8RO_ zuUNf#e;(^wve~G=M@J^gylVQFp7vYM;37w-9Jp}S>bH$!qFRqx(B6CZzinP_n)~tX zS?|7m-mdxAY17k*_AdvPmuxvC+j#ZgYv-yKk@sn~D|E!p%dtgjbsKIQu)?cB=>fAo zTU#tE%*;hYF&7QaJ{R%F2^-T8Q^Nwg(oDBC=Vx7+WnGzPU0GyZ(G+!oiqjNz5|KYZ zzgrbiO;J3)1>!4&9!vquQI4wd;JYbGCJT26jFvgzs4q$uhI6qvutuOfH)|F6tW}cg zRIxlMB(%c1#Ej1q#xa$MsUSi)(7>s{mnkJQ8`sdNselF;Umwh0a^a{^WRIQ2P~i}v zM>6KYaW0G~{j*?}obd0<>YE4E%6_{$%5fT}g*h|Nw@6>M>Gkx}i6V!NlUA>;w&+#F z30sZPSuvrt?9lY&&f3*iyI0xKyUwOg=Q=$WwOZe;&#=qIi~4MP@ifLx?*4LXAMvt< zvyODQm$>`K^LsqTNjJI=*$~sWTsaqMtFbe?oloEEHYPT;`pQ=p6}ql{c=zG@fHNN_ zIZQj8a$)<-{r%c+vAkf@q~hAry;qGB1*}=)d~ZRc)koi)tukcr%o?(Lb=RL;IN1ML z|HJ-e@A*f!;Z3ai>5sU5ZAy0k(*N(O`^@^T`SQ`)y?yaxeUo7Z2PHhwT*tF z(XD314!X6alD~iD5({HXA6nGjsn@JRbxPC}C7P#UM7m|h=L=o*-|y$J>F{mCBRN`F zLT!Vin26TZ6|(ju3Y&|HsbyPWZ{pkjNKuiEP(8N{?tqvrmckYy+zWOAM z7rtsVIdbxu`_a=Jw~j3yUpemUQ0aQ9LsF}s?%Gx<*Z&-l~Zd8)0G#i7nW zu2_2b{>BBimR|o(-LW~ZwOs3dU%thZU#obipZ#kACTiT8iIt#HUiUi7x+7Cd1P@<4>X%l&w_;r`?65vCWapa@zfJAkXGS?>K6tY4r?nfpf358n zIPqxA@7wBJIJ#o%j@R4GGR#K)d+5*0N6U*(4?i>@d8XjP<=UB7XU@OS{b`Zwk0X9N zP{x0J$@y2i?_Srj|IyH7vn#De6u$LO%~w;+-+6pl)MTT0;haGWU!4#2i)mVanW*C; zL8D_eH&%YXH0g`Klidbc{~2eFce4`xID7fD%-?prSz=N1$c6=t9UoRWH*HQ8-&YHU zrVrn7dclv!R}M&@(&<#&cIm@ns)RPF*{0*(@E>|QMXj!QPyXhOQ}U6Ne+MRQ{(nDH B`;Pzs diff --git a/Server/Services/DataService.cs b/Server/Services/DataService.cs index 4b012b68..483366e6 100644 --- a/Server/Services/DataService.cs +++ b/Server/Services/DataService.cs @@ -64,6 +64,14 @@ namespace Remotely.Server.Services return true; } + public List GetServerAdmins() + { + return RemotelyContext.Users + .Where(x => x.IsServerAdmin) + .Select(x => x.UserName) + .ToList(); + } + public InviteLink AddInvite(string orgID, Invite invite) { invite.InvitedUser = invite.InvitedUser.ToLower(); @@ -101,6 +109,7 @@ namespace Remotely.Server.Services RemotelyContext.SaveChanges(); } + public bool AddOrUpdateDevice(Device device, out Device updatedDevice) { var existingDevice = RemotelyContext.Devices.Find(device.ID); @@ -152,6 +161,31 @@ namespace Remotely.Server.Services return true; } + public async Task UpdateServerAdmins(List serverAdmins, string callerUserName) + { + var currentAdmins = RemotelyContext.Users.Where(x => x.IsServerAdmin).ToList(); + + var removeAdmins = currentAdmins.Where(currentAdmin => + !serverAdmins.Contains(currentAdmin.UserName.Trim().ToLower()) && + currentAdmin.UserName.Trim().ToLower() != callerUserName.Trim().ToLower()); + + foreach (var removeAdmin in removeAdmins) + { + removeAdmin.IsServerAdmin = false; + } + + var newAdmins = RemotelyContext.Users.Where(user => + serverAdmins.Contains(user.UserName.Trim().ToLower()) && + !user.IsServerAdmin); + + foreach (var newAdmin in newAdmins) + { + newAdmin.IsServerAdmin = true; + } + + await RemotelyContext.SaveChangesAsync(); + } + public string AddSharedFile(IFormFile file, string organizationID) { var expirationDate = DateTimeOffset.Now.AddDays(-AppConfig.DataRetentionInDays); @@ -233,6 +267,21 @@ namespace Remotely.Server.Services return newToken; } + + public async Task<(IdentityResult, RemotelyUser)> CreateUser(string email, string password, bool isOrgAdmin) + { + var user = new RemotelyUser + { + UserName = email, + Email = email, + IsServerAdmin = RemotelyContext.Organizations.Count() == 0, + IsAdministrator = isOrgAdmin + }; + var result = await UserManager.CreateAsync(user, password); + + return (result, user); + } + public async Task DeleteApiToken(string userName, string tokenId) { var user = RemotelyContext.Users.FirstOrDefault(x => x.UserName == userName); @@ -720,17 +769,6 @@ namespace Remotely.Server.Services } } - public bool SetNewUserProperties(string targetName, string organizationID, bool isAdmin) - { - var targetUser = GetUserByName(targetName); - - targetUser.OrganizationID = organizationID; - targetUser.IsAdministrator = isAdmin; - - RemotelyContext.SaveChanges(); - - return true; - } public void SetServerVerificationToken(string deviceID, string verificationToken) { var device = RemotelyContext.Devices.Find(deviceID); diff --git a/Server/wwwroot/css/site.css b/Server/wwwroot/css/site.css index 11ef6445..63fdc32b 100644 --- a/Server/wwwroot/css/site.css +++ b/Server/wwwroot/css/site.css @@ -19,12 +19,6 @@ h6 { font-size: 1rem !important; } -input[type='checkbox'] { - width: 25px; - height: 25px; -} - - .container { max-width: 95vw !important; } diff --git a/Server/wwwroot/scripts/Pages/ServerConfig.js b/Server/wwwroot/scripts/Pages/ServerConfig.js index c8edd70b..778a3682 100644 --- a/Server/wwwroot/scripts/Pages/ServerConfig.js +++ b/Server/wwwroot/scripts/Pages/ServerConfig.js @@ -1,3 +1,5 @@ +var serverConfigForm = document.getElementById("serverConfigForm"); +var serverConfigSaveButton = document.getElementById("serverConfigSaveButton"); var trustedCorsAddButton = document.getElementById("trustedCorsAddButton"); var trustedCorsRemoveButton = document.getElementById("trustedCorsRemoveButton"); var trustedCorsInput = document.getElementById("trustedCorsInput"); @@ -10,6 +12,18 @@ var serverAdminsAddButton = document.getElementById("serverAdminsAddButton"); var serverAdminsRemoveButton = document.getElementById("serverAdminsRemoveButton"); var serverAdminsInput = document.getElementById("serverAdminsInput"); var serverAdminsSelect = document.getElementById("serverAdminsSelect"); +serverConfigSaveButton.addEventListener("click", e => { + for (var i = 0; i < trustedCorsSelect.options.length; i++) { + trustedCorsSelect.options[i].selected = true; + } + for (var i = 0; i < knownProxiesSelect.options.length; i++) { + knownProxiesSelect.options[i].selected = true; + } + for (var i = 0; i < serverAdminsSelect.options.length; i++) { + serverAdminsSelect.options[i].selected = true; + } + serverConfigForm.submit(); +}); trustedCorsAddButton.addEventListener("click", ev => { if (trustedCorsInput.value.length > 0) { var option = document.createElement("option"); diff --git a/Server/wwwroot/scripts/Pages/ServerConfig.js.map b/Server/wwwroot/scripts/Pages/ServerConfig.js.map index 5f283b95..da3b920f 100644 --- a/Server/wwwroot/scripts/Pages/ServerConfig.js.map +++ b/Server/wwwroot/scripts/Pages/ServerConfig.js.map @@ -1 +1 @@ -{"version":3,"file":"ServerConfig.js","sourceRoot":"","sources":["ServerConfig.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"ServerConfig.js","sourceRoot":"","sources":["ServerConfig.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Server/wwwroot/scripts/Pages/ServerConfig.ts b/Server/wwwroot/scripts/Pages/ServerConfig.ts index e5eafc65..5dcd5f67 100644 --- a/Server/wwwroot/scripts/Pages/ServerConfig.ts +++ b/Server/wwwroot/scripts/Pages/ServerConfig.ts @@ -1,4 +1,7 @@ -var trustedCorsAddButton = document.getElementById("trustedCorsAddButton") as HTMLButtonElement; +var serverConfigForm = document.getElementById("serverConfigForm") as HTMLFormElement; +var serverConfigSaveButton = document.getElementById("serverConfigSaveButton") as HTMLButtonElement; + +var trustedCorsAddButton = document.getElementById("trustedCorsAddButton") as HTMLButtonElement; var trustedCorsRemoveButton = document.getElementById("trustedCorsRemoveButton") as HTMLButtonElement; var trustedCorsInput = document.getElementById("trustedCorsInput") as HTMLInputElement; var trustedCorsSelect = document.getElementById("trustedCorsSelect") as HTMLSelectElement; @@ -13,7 +16,19 @@ var serverAdminsRemoveButton = document.getElementById("serverAdminsRemoveButton var serverAdminsInput = document.getElementById("serverAdminsInput") as HTMLInputElement; var serverAdminsSelect = document.getElementById("serverAdminsSelect") as HTMLSelectElement; +serverConfigSaveButton.addEventListener("click", e => { + for (var i = 0; i < trustedCorsSelect.options.length; i++) { + trustedCorsSelect.options[i].selected = true; + } + for (var i = 0; i < knownProxiesSelect.options.length; i++) { + knownProxiesSelect.options[i].selected = true; + } + for (var i = 0; i < serverAdminsSelect.options.length; i++) { + serverAdminsSelect.options[i].selected = true; + } + serverConfigForm.submit(); +}); trustedCorsAddButton.addEventListener("click", ev => { if (trustedCorsInput.value.length > 0) {