From f26e60793c0771405044ecff14576106095ca86c Mon Sep 17 00:00:00 2001 From: SpoinkyNL Date: Sun, 1 Jan 2017 11:53:11 +0100 Subject: [PATCH] Updated default Rocket League profiles Added GetRelativeColor to LUA API --- Artemis/Artemis/Managers/LuaManager.cs | 67 ----------- Artemis/Artemis/Models/EffectModel.cs | 7 ++ .../Modules/Brushes/LuaLinearGradientBrush.cs | 2 +- .../Profiles/Lua/Modules/LuaBrushesModule.cs | 35 +++++- .../Profiles/Lua/Modules/LuaLayerModule.cs | 2 +- Artemis/Artemis/Profiles/ProfileModel.cs | 2 +- Artemis/Artemis/Properties/AssemblyInfo.cs | 4 +- .../Resources/Keyboards/default-profiles.zip | Bin 425401 -> 422211 bytes Artemis/Artemis/Resources/lua-placeholder.lua | 10 ++ .../Profiles/ProfileEditorViewModel.cs | 105 +++++++++++++++--- 10 files changed, 144 insertions(+), 90 deletions(-) diff --git a/Artemis/Artemis/Managers/LuaManager.cs b/Artemis/Artemis/Managers/LuaManager.cs index 1aa9ea63d..fbd499a8b 100644 --- a/Artemis/Artemis/Managers/LuaManager.cs +++ b/Artemis/Artemis/Managers/LuaManager.cs @@ -1,14 +1,10 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; -using System.Text; -using Artemis.DAL; using Artemis.DeviceProviders; using Artemis.Profiles; using Artemis.Profiles.Lua; using Artemis.Profiles.Lua.Modules; -using Artemis.Properties; using Castle.Core.Internal; using MoonSharp.Interpreter; using Ninject; @@ -23,7 +19,6 @@ namespace Artemis.Managers private readonly ILogger _logger; private readonly Script _luaScript; private List _luaModules; - private FileSystemWatcher _watcher; public LuaManager(IKernel kernel, ILogger logger, DeviceManager deviceManager) { @@ -178,67 +173,5 @@ namespace Artemis.Managers } #endregion - - #region Editor - - public void OpenEditor() - { - if (ProfileModel == null) - return; - - // Create a temp file - var fileName = Guid.NewGuid() + ".lua"; - var file = File.Create(Path.GetTempPath() + fileName); - file.Dispose(); - - // Add instructions to LUA script if it's a new file - if (ProfileModel.LuaScript.IsNullOrEmpty()) - ProfileModel.LuaScript = Encoding.UTF8.GetString(Resources.lua_placeholder); - File.WriteAllText(Path.GetTempPath() + fileName, ProfileModel.LuaScript); - - // Watch the file for changes - SetupWatcher(Path.GetTempPath(), fileName); - - // Open the temp file with the default editor - System.Diagnostics.Process.Start(Path.GetTempPath() + fileName); - } - - private void SetupWatcher(string path, string fileName) - { - if (_watcher == null) - { - _watcher = new FileSystemWatcher(Path.GetTempPath(), fileName); - _watcher.Changed += LuaFileChanged; - _watcher.EnableRaisingEvents = true; - } - - _watcher.Path = path; - _watcher.Filter = fileName; - } - - private void LuaFileChanged(object sender, FileSystemEventArgs args) - { - if (args.ChangeType != WatcherChangeTypes.Changed) - return; - - if (ProfileModel == null) - return; - - lock (ProfileModel) - { - using (var fs = new FileStream(args.FullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) - { - using (var sr = new StreamReader(fs)) - { - ProfileModel.LuaScript = sr.ReadToEnd(); - } - } - - ProfileProvider.AddOrUpdate(ProfileModel); - SetupLua(ProfileModel); - } - } - - #endregion } } \ No newline at end of file diff --git a/Artemis/Artemis/Models/EffectModel.cs b/Artemis/Artemis/Models/EffectModel.cs index 600f7e1fd..a2dd083df 100644 --- a/Artemis/Artemis/Models/EffectModel.cs +++ b/Artemis/Artemis/Models/EffectModel.cs @@ -56,10 +56,15 @@ namespace Artemis.Models private void DeviceManagerOnOnKeyboardChangedEvent(object sender, KeyboardChangedEventArgs args) { + if (!Initialized) + return; + if (!string.IsNullOrEmpty(Settings?.LastProfile)) Profile = ProfileProvider.GetProfile(DeviceManager.ActiveKeyboard, this, Settings.LastProfile); else Profile = ProfileProvider.GetProfile(DeviceManager.ActiveKeyboard, this, "Default"); + + Profile?.Activate(LuaManager); } // Called on creation @@ -70,6 +75,8 @@ namespace Artemis.Models Profile = ProfileProvider.GetProfile(DeviceManager.ActiveKeyboard, this, Settings.LastProfile); else Profile = ProfileProvider.GetProfile(DeviceManager.ActiveKeyboard, this, "Default"); + + Profile?.Activate(LuaManager); } // Called every frame diff --git a/Artemis/Artemis/Profiles/Lua/Modules/Brushes/LuaLinearGradientBrush.cs b/Artemis/Artemis/Profiles/Lua/Modules/Brushes/LuaLinearGradientBrush.cs index 3336119e4..b12e299f2 100644 --- a/Artemis/Artemis/Profiles/Lua/Modules/Brushes/LuaLinearGradientBrush.cs +++ b/Artemis/Artemis/Profiles/Lua/Modules/Brushes/LuaLinearGradientBrush.cs @@ -57,7 +57,7 @@ namespace Artemis.Profiles.Lua.Modules.Brushes { var collection = new GradientStopCollection(gradientColors .Select(gc => new GradientStop(gc.Key.Color, gc.Value))); - + Brush = new LinearGradientBrush(collection, new Point(startX, startY), new Point(endX, endY)); } } diff --git a/Artemis/Artemis/Profiles/Lua/Modules/LuaBrushesModule.cs b/Artemis/Artemis/Profiles/Lua/Modules/LuaBrushesModule.cs index 8a944dd59..ad17ac975 100644 --- a/Artemis/Artemis/Profiles/Lua/Modules/LuaBrushesModule.cs +++ b/Artemis/Artemis/Profiles/Lua/Modules/LuaBrushesModule.cs @@ -1,4 +1,7 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Media; using Artemis.Managers; using Artemis.Profiles.Lua.Modules.Brushes; using Artemis.Utilities; @@ -47,5 +50,35 @@ namespace Artemis.Profiles.Lua.Modules { return new LuaRadialGradientBrush(gradientColors, centerX, centerY, originX, originY); } + + public LuaColor GetRelativeColor(Dictionary gradientColors, double offset) + { + if (offset < 0) + offset = 0; + if (offset > 1) + offset = 1; + + var gsc = new GradientStopCollection(gradientColors.Select(gc => new GradientStop(gc.Key.Color, gc.Value))); + var b = gsc.First(w => Math.Abs(w.Offset - gsc.Min(m => m.Offset)) < 0.01); + var a = gsc.First(w => Math.Abs(w.Offset - gsc.Max(m => m.Offset)) < 0.01); + + foreach (var gs in gsc) + { + if (gs.Offset < offset && gs.Offset > b.Offset) + b = gs; + if (gs.Offset > offset && gs.Offset < a.Offset) + a = gs; + } + + var color = new Color + { + ScA = (float) ((offset - b.Offset) * (a.Color.ScA - b.Color.ScA) / (a.Offset - b.Offset) + b.Color.ScA), + ScR = (float) ((offset - b.Offset) * (a.Color.ScR - b.Color.ScR) / (a.Offset - b.Offset) + b.Color.ScR), + ScG = (float) ((offset - b.Offset) * (a.Color.ScG - b.Color.ScG) / (a.Offset - b.Offset) + b.Color.ScG), + ScB = (float) ((offset - b.Offset) * (a.Color.ScB - b.Color.ScB) / (a.Offset - b.Offset) + b.Color.ScB) + }; + + return new LuaColor(color); + } } } \ No newline at end of file diff --git a/Artemis/Artemis/Profiles/Lua/Modules/LuaLayerModule.cs b/Artemis/Artemis/Profiles/Lua/Modules/LuaLayerModule.cs index aca0bb2c8..77b99e7c8 100644 --- a/Artemis/Artemis/Profiles/Lua/Modules/LuaLayerModule.cs +++ b/Artemis/Artemis/Profiles/Lua/Modules/LuaLayerModule.cs @@ -20,7 +20,7 @@ namespace Artemis.Profiles.Lua.Modules _layerModel = layerModel; SavedProperties = new Wrappers.LuaLayerProperties(_layerModel); - // Triger an update to fill up the Properties + // Trigger an update to fill up the Properties _layerModel.Update(new ProfilePreviewDataModel(), true, false); } diff --git a/Artemis/Artemis/Profiles/ProfileModel.cs b/Artemis/Artemis/Profiles/ProfileModel.cs index d191f30c4..da2f65901 100644 --- a/Artemis/Artemis/Profiles/ProfileModel.cs +++ b/Artemis/Artemis/Profiles/ProfileModel.cs @@ -192,7 +192,7 @@ namespace Artemis.Profiles public void Activate(LuaManager luaManager) { - if (!Equals(luaManager.ProfileModel, this)) + if (!Equals(luaManager.ProfileModel, this) || luaManager.ProfileModel.LuaScript != LuaScript) luaManager.SetupLua(this); } diff --git a/Artemis/Artemis/Properties/AssemblyInfo.cs b/Artemis/Artemis/Properties/AssemblyInfo.cs index 7e493dfdf..7205a0d2c 100644 --- a/Artemis/Artemis/Properties/AssemblyInfo.cs +++ b/Artemis/Artemis/Properties/AssemblyInfo.cs @@ -53,7 +53,7 @@ using System.Windows; // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.0.0")] -[assembly: AssemblyFileVersion("1.7.0.0")] +[assembly: AssemblyVersion("1.7.1.0")] +[assembly: AssemblyFileVersion("1.7.1.0")] [assembly: InternalsVisibleTo("Artemis.Explorables")] diff --git a/Artemis/Artemis/Resources/Keyboards/default-profiles.zip b/Artemis/Artemis/Resources/Keyboards/default-profiles.zip index 8553f2868d5ddf2169fa63802ac1c308f3b1fb2a..4341a3e496637f49cd0d6e4dc31398283278297a 100644 GIT binary patch delta 45027 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 VZ;8XdM2zf)EfG;VH5N?g{{aVTKkxtm delta 45918 zcmb@ubyyZ_`!-60q(LL02uLH{AuZh{-Q68SNJ}WfLw5_(-Q6A1-AYOK9`Idjxqkco zzPssYOe5#Md+Wb>!pa#=ClY+J%xg57>9+Tit@3+ ziL#=X5XNxGP(~q*3Lf4LjT6%z^Pcm_Y1)8FA$ZH2GV2`9XX!Bf6>9 zF;RD8Au2(0N@25t;D(ZBV6_`f6r+*7_LquE=Rjv>*B3Op?DxMyN*qeoztUKxWC4LU zm*1G;wL>=mX{`+3^yWcHnNhwc4ezbBZ|BNT{r9z&ix?CRDw$iRbKE^n}~` zR2$a-s={KYCn1Ci28Il%uRz>iyjZYcTuXX(!khXU(?7jVXvEboUG}(ya%ND}n80Bp z?a13XfIkN>$#Pg68ky4>FUcG$6;T#5WMOK_5lGocIi|=R5Ap_^)31?f z=p>A)g|EJYtXp$WImd9Yw=$vNlekp9v*`~ic7_B=YU>_n-L~%oclke<8x|KMhh8}+ zXt6aO8F>|LvQ=7R_+CI@c3FOX!EQVWux@beu3AvMn>F0f&a)Yoa8aP_e7jzrAdLE%sqI|%>WrXS$cUpd zf%r2g`_@@mp91eIpo2GXJd@rFm7>7q!9t*rC3-OBQw-Qjd|^BQy>q0}j)kj`YbQ-+1bC>3*9Vc7^eziC03 zf+9%JT}A97l1?JI;oEZYaF}a{IOXt)!*YLogzEwof#19uhsI><;T(BO?842nl`#B4_hJ&dG!lf!uVKFFCxxEn&nzLK8Lr9wi!=W&iO7P)` zrW9FbDp$I0K7U$9y!IxZ-3)a2Ag!dHj)Coo=!Dqwr0*OF+yYL!yphrex$)*0r^()hgV)pupZtRLiw~IihNU1cP?&WJ7OH6 zA{8G~<&-osdZjNj5uai`#qx)FsuXwOCnPNQ0!~=CB_iOg^^Qai8t)a=X?i;QR1lXB zn&Z}tK5Q^@u$f;U+<%6o{Dqt_nhSUy2AJPU+H~>T^tb6S#9+vuxV%6n>8t$FrxSd} zQD?XB5VQ^U_19_e!3;%|EW;i$3{nhI#6$_Y&+z5%46}=B&|cWhnG(K~hsG14I?ebq z_9x^||B5YtA6x#P*qLuL|B9VSDwGe5zMRNf-66|=wodaD3@fB$8Eod*OJNH~1xFPE z2ba%ygy<9E`xXfqd5nT-P<>LZXow9=8II~SZRL-YeUN?r6;}2>tn5EwQ{Sfk6BaIi z6lTJF2)NqRM!q|l$Sd~P6mTVj6r{qC0Jo|xO^Z8KwNv2eC4@-j{W*Hz9Q}Lrnn^9E z6y;#SiP{Vc&U+UV)`H@^;=E?Wb0}i20E}&q*@5Vul~9|ErX&`Iw? zQWcama(d$~#jEJ|6qX-;EQfgqdAamv3fc~k10)z}=t>CRBN$t_URw$_NckfeH(<4) z&o=MNahL>|uuUG-p1kRX=O|(na#V;JbX0!-bxUS?>0{sC*5k3|%^R(%=#HS=mQGA^ zEOMo%#)9v{{lcoBP00p+<6&jUW5{EzmTYc|_4YwL5F;R08uvyd$2x!_Y9=L$N28Xc zlB7C-=56i@Ul!zS&7`uFzgdyaZUK6QR2%ngauYi<)kPTc@-5}J|N9Mie;Vw_b9C!< z24{vO6>H|_KZXdr-9Lv&_kL#R{4+CJ!FS`IA(G4=C7;-@1dKOb6gAfYW+HHIh$>k| zP;vc;B2raURa8V)y`PfUSW5nn6|u4x(X3Cd3dgK)LXo?5+zq ziK1w)DRaId9DP{+41ToH429-F?m=!Y)KQTAe4)Tj!YE)bfZeI2YU7>Lu4de*q z2&&*RLP%}`3^Bmshe(8V5VX=vx(CNS4!(G;8Lb)rq{y8=N(9b*j6FN%eEoIizh1ik zMTYPxgVpTY2bSQp3=J8`W&dMQNpDU6b6Tq2PfJzBW<}V)=4Ebi?mzP~G{0Qf(UFaa z%O~Zm%!{JeR0vG)Q~u1$Xr~p5B%3^&yj&ccJTSlaRAwkIa%oX_IG}S@18rgC+P%oGS?}IDT@8QENi8kbsGbp>u%;47}pP(^Ve?s=Ugnb3g%3c z87sPHAiCL)^^F-du1CtaggCZ2*l0JiR_mFs&$rnUoXWP9=>^w=WH0t#Y#NUF(x`vo zK`G7V(7-Rvq~yXcOQ$5*=#xqzaLe1K>SqSOEVE}M`J^|Fe#s}t{FsugAs=Jp5eu$j zU@`}o>~zT&-XbV7T5sx2DA!sS+?vP1_s1z&lY3efRQy^{rN}FAxU4BT+_|JmWFGu_ zAz^K67bY5Mw0+zgTy?s1!?l`M#tCVk4n zEaE~dt)HvN*+cWe`d339?ppz4)34$JxPSQpkYoa>%j^o{ZL^wvdh#~m6lLiYiL2Ae zr1}JzHPB@sWxpF2@nCskI9hOf!)dXG<8)i(gqhzrN4wOTnZ$Y*HZZ00)w_cge`P)$nA8JOf_*JF`0V=4Leu{GqSvGAw& z)vYWY(B{aKm<5!o3dPy71m+={8VUthz%tS#CWm>*S}WE!%5xsFzfMp!EueJzr5RDt zZmf)zea74AbXb~R)>8WNnZD8sL^Y*$LRF>Wd>y4v%*t5i->4KHHGX0*Mkzi?G8946HL9}HV-@hJ3#mrkfMIXZAVvA`Xh5Q+^%y5+*COd5VY-cWrRIzkVQSw5t|nsbM=8vC z#1~qzotC7Z+26_UWt%SEa1KT#A;vqzO?C3oo7fGO=yMHTOz#5k`8?B2FWv2gZ}@>c z&u}`HUCvuEo|JFgy-9J=vjB>I!tD%3o<6)EN(wD)0)k)lHvvU*-2PZgd4TUCNRo$^ zGBqc9{&+m0LHC=fKeqks!W(K_)a+NUjQca4jAp$SzkgegTx;Cxth7HvTnQo|X2Sk3 zV=zjLACO!(DBqSjJMM&y2_$>o=R81OFOaT#q1QMlPSpb^IbREW-T4S9FlZEMdAW%AI-+c;ZfqV9Q8(F?iwq zDN;B>`EFIIC#fFul8fzmgu}FJl(xqw4W0(OV13#z6qjnj?5Auk>Yl*h9H()mVWTeV z5%mrC%GPK}hw9c3hGVV0UHDKIM=^$_sw1`Lm}Q-o#D+T>XV)4w#*aMYr3fuEV2h{8aZRFTI~{QL0&c-kX5O@g)h@me&sWt{_`8s<6+2X~hJlM3q| z+e2cYLn@N?Z@zh+s>C5{j%=u_F$uP<+T{&5R+c#5nyxsuH4J$3j zW25I&bdQFRmMrijs~9V(42>_W*76INQc(2HH<$32s-~8oKTw$~!3;GxEPd453Nw2h zW-etFv8Pk>C@M%NG9u7p5H$x`XM!pR=?FH!loB6y2;afx&=?ft*2s2fV zB3-e1$S5gAl?JZQb7=?&FF!%m5ZOC&hfJwYv@&0M)S#MNGo0+?Cd7|A4}VymXI}1b za2qXu)TwiKaBMwiYV^=oZI}|nX3Bap<~6F0 zV1N*(q5H&OQedOdl%4ztZx)XE7DsU*saKlWn?;hyr>7N_+^K5@hmg6q!)=K zZx-E2q44D+I$(crU5Wbxivf{ee=91ZUq6XGcp5f%nt>OI0rr(aa%JhWVpnHYt{&XU zW>MVDA<`H5y;`#;;z5+Rl!9uTOnAMB6QGFZw5j;5-)* z#G~%3ySrw&N$A4)87o>Zy}^>T_R~52nnMS;8rwbqySzWb(XyKF3adNp1zW(}d7w`u zf%z1&Ss0r@*>w3K@6Yf`U(0wKQH_@Eo*&va)USmd8-M!DRhJ24taXOqX^-|2MdE>v zKwyL1RP_=X%Wid69?wp{2bH{!hyhO$A*yAK+?3sjaji4S7Chd8%GmeE1;7lgpw%2& z!V5O#ex0(P&}K_g?X7Skw#O zUYm!88JEGfG3;>0CB36(Z|}4$)7K=}8?u7e(+>)J!FsDp(%y;B>Z`s=D|>9r9ahEf zT!vyk_JL~_iHOyzb#)r)9UzxP?@q$HXE6d>Qli(XQeKL9pNmmsjW~Xc7q9=+d8J~& zlq#cNPbuPkE(Q$XKZM7jme?A<2amt;>;Lltr@qGo&TU3PVOUI4H15qt#dsE878cSn z&otESS&beOmYbBonPJrJnqM7T=y5JPvNb(AihUX2muxXK4ftR{%KjX zn1b(<4Uj>7j=hXI^9O^96@}i14`@2ih~RtgUtrm9X>o=(u;%?^?~RwNE?E zCcl48(lrD1>&eTo?_Gd7{b?m&;m@ms5GH~f$NYBaefg&aT_{(V6xTq+YHOqs57R}C z+wzOTa~|%eE4-K1ZnwMhg=5!Fwv602RV2I<+$XTcKc&yKuNEq}?6R*8`GKpW1j)0j z1(U7wp1X~lQz1J)BgV^R!lM^ZV02p4(_iBP;Jml9Hw8N|NTb z4OsDM(?KF}ORMb@%p!qQLTEQNpT}F>ZuP{P*r|QdK?ZJ|b0%Zg%cDXbJdw?!-4O@8 zb6dB=o;bL;qh+Q#$LnUtY#^c@Zp1!$PrGJy_EXt&GR}s2827#>cPzm5RgA;N_x?ET zIbEA)$(EGHfXy5Ro505LHRJT2!3pI6{r5s18^5}KT5Ofuok`n(ICmK<7z}IGUqhH!I z$afYIMkCzkw!idvc~n}9TKVb-U5;v|ulMREOnw!&_HYugWevBjEbeED&ebJM={u+P zcQ3A^8{b;EWk`-4tVOfg1#T{MA2}`;x1FVQWo*4jNhn}zFm4*-}oqT=;&hVI-9sMw9#-oWnPdR zT8RGbIvy3?(sd^xnx}F4bLjwR4$rITsf*~w9Y6|(9r1QOOLw)h- z?7JZy&oqhxjrL*{ieJBLODDnldN@%~sk{@)xqUQ?PiZ4z$`FN2`*m@jh*gD?hxu3d zIHa0`Wg|zl z#gH?~oFmSNeYvp9xCm}yzrcakkwWTji?yp(#X!(I%>2F|4RoM1lT7;fslq-sBi6jt zCcu>I@_1VC=p*f0!Loq8l9HbvXW(Rzu3_PE)vspwa?2da$vqRPj_2nocZ=1K>(@o& zDp5~Nnr?e1_l3HQ12QsontnFbSYyVym%GltR8ngCoUk{vcU!ri;l#V0*=c@^_v*~M`A zyvZeu_Sai(xb!*{xgDA7+oD?Ov8x-j3rV}GZO2tE>y0xvFa4`il30LpSc_D~bXmjt zd@`ZSBqlcv#aG%_OLdIn=$L8(XH;V$FsZSx3<@h@wYJ6lr!UXMAk5a7TzgZ|Ps zLu6#H$8OU=U_P3!zE=Np((w-~$eI^yY&T7p(~+P&BI1pglWT8a=G10n{BcLb@&~M; z_O7*=4Qo4tcl@jzLTT%kxoew29IX3x4%6#8kX8EWb@o#9TF#F_^9%A#$3_YixAc*& zZrvX@aX<=Jv|Kz`frvo4g=?c)sTpm)1CBrk*1{qnjQF`byQA;%UFz!gi0w1&nWW2C zXa@}BIv|^91{Hxb*nT)Ka0x6O9v_@PhIGcmXhEw($P!>g;fppGdcq*K2{2S>PEAgH z2i_n_OV%|V2AM&DAp%&Id_>{zso$VLqc-G-{2d~!MG<&jkf`9#m`N8o=`68UNqly* zLL3HiX7@DcX#Zs<3O*J-Ru&BYJq;=%to8!V&_Az$ed$N8H!40>ot*r0i}s}E08WS9 z5+4zNk%|^W7@|%%kYE;_8O}{d;2zEe<3SM}4qK=KX>w_DJ{Ta`<%CK+`UGFeG>j_I zQthnz|r$|YR*J2GL}y!=9WGN!xSuRr{y{H26Dyrn>bSw}%m6G^~P_p;|8)TwBU zYgbnR8qb1?HS13rG$Egpb%GI3I!&l{BpOkMns)WPTcXX*#{sUQ54`Z7p=w*VOD(0oo|U|b?4(}-z~b>ySt_+k|?vERz7;_{{1+D+{fC+R&y3LYL`VZ?&#kCzpbWinQB8%Nqd{422L0%mTo)3Qk z<<3tC-XJn}Dl}w82V~V)$J5Ls&|Xo!%15Jn_MbU98X$xP&Ml#T<`zhYBZKt%L5co( zWO!umI|)S~MGD}(q{j33)DRI}W&&o6uT;VEkTHq;3wb#jlKYH7-uph|*v1Xk58bvo zjzMDZ29NWmBL0jmL?!gE*kbpw#r}y6(&7Kaew_C%R1p&X6_P9c1t=2(!#-82Aj_Yi zOlg0T`#AUY)5rI`A{-Sm@{8B6B~$v@&DD$>co)HxALmX5hOGXRGRThqD=hzgSpI*) zf^_&FVRPT1C|dK}-89`@7ZpkSuXADaQbYJsV8~#Vn z^IZeig+Jf5;ymzOE6)3SnbB3yRrqI>VO4TX=q(FmTL^p(c_+SDttbx%$zP$1HUbtX zJny;rTx^DW>Q$183Z!0XB>4!v7WN%A)IJ8`TS)4H?;@EkYv$Vj5vNYSXMkTI`CB0v^)X}>qKyK>4X8M;mOMLm<@@2Bo+tv!Dv$H> zY2{5Ryha~EkRc&%(2)BSveGLb`_6zVe4F6l-1m}d!ns|q%)Te-KeKDd|Cxn^zr>&O z(B^&~+Wa#Qm*tn`|Cxt$N~Qp0ht1f|7*QZxVnSI9>GxEeq5EHo0366aLbQrH&cIdw zJym7qpV}LEzyEsa?}eSEKZKpE)~tVC`uF*xbQ9aJWPl9$1qc3&&o3XIobsl})2`Ik z)bw}FsZ>k=LvHTt52@)4dYOh5T!Esviu~D65wNage+mkq<@)gZ^J9tX1Y-IS7VEPh zaUJCBG=~>nDip&yHKR}Y@cQ#s1f?$aJ^}Gf+3x@r*y+1aP+2(lTqwG%h)yEKq@whF zt7HlIzhl~sqPy3IFj17sa&O}s$X`+QBKL-%^@YHG9pe#7_kAO#XdxmHW=N5HFB_YY z$i0vYjz-}6!u~Ues|6jDTFdUG)^`QWQ)%tGqH~X&as|sY{Du65;Q5viucuhNw#f1W zJjiQiuL3?%%H+tAof&U*DjeypOCNm!@`NWFQJMU4xuT|5B9iA{^okGFm~zk)Ze}g# z$TUrtCrDMf;Zccx=mju1=o7FFM$&((MY0S`k4BP7O^?K4Nli0oTh&@`Wo3V580%ka ziZx@pVUHW?lWYRH`0MNXe~1(tEk+*qBE^?~i4i-uah5rA6 zNb%n_3LyLcPmzN7L8S1%7b*BSoyUwpk%C4<L->Yw5$9>bzS*lS2qat51<}S)^#tU=V4!}) zk6$TURJ927msK>Ev+@2CRC~cIRqg6DZKa6|zQg5-qtU{on{f)%^|VzzdmZhh7Ujrv zuh51Dygf>%2HqG9=AQh-H_HvR7uZryUwa;9a)cMpXLfk%$CnzTA39ZLF?h%poOj2# z%TjmNrYr6&ykCY_JMwY-&P7QcpcpE>9ejl7nWVC?j;QTYBw7_-Q<~i>bWNk0c=1Dr zQd)*8sk)NIeRbv={e(j3SVHtb=UeT7H0RPLVo8XBA%dnG=OWsi>r_(h*PA;UW3RGB zwvWrVVKt>^JSlL;YQe;lD<=&|JyOglCpfDmy3dIsy7EK&ood9IiQX>113F|6j7+DQ zQrK5+o)u|4VT}9sD=n;TBW3OMtNCS_g(wkc#;#S7hn+A|;ifF(1>|m0sy41Y@OfP3E<-jpe^(SIBQ=S5OWQ)KeaRwDS`VXVOFR ziaPLBHf^9MIbEO^`C#jvtr`GX_tsU*8HANA?1h(9`-E|h{zV`OPiYO_=;&yUB>uI? zu`!1)-Zirf1Iil}56b*30kv{UL#)Zjf!s_r=9!+Gxu{sJVZ`97FB>n7T&1o}F+brL ztbE(Ha=;1uRgGm)(?~|z{1M(dDwb+jiJ|`2s1H*}wsU$a^S2O1tfUseE@)f(e4{^o zk9s$Eeft&j&B08CD#LIXk07T>&gLKu(@x$;I;o+uMB!s^Q77VHDdG?NYfeoMPh}%1fw`TRpuFNF%pdE?I?Dx>l42>0N_e464Wr%ONeO8StUn?|V;#_occ+g)SCZ~&*Y0iotSLb99Q&ykeEAy!qPgm^Bc2LrTkGvrQAC;>xHii{n?4sL zETr$${ehN3)tz5$CwBu(vR@JVGa8qT2AT3R^_Z}TFnJ^JXUN4M0w!BfVZ8-U{W`Pi z(8aFlN%ZZzRfS=5`9FH;l0&`m#^wJwhZ+RkKGh6Q(iu+D32z%@Ej1>i)435_5)>#4 zjqlg$0c8Tk4255V#}AuY;)4PeMhJ~|N{bNII*l%?Z$GX|rk|@5=GXcqw+r8pOcpj5 zdK}7Zjn)T$eK(no8;}|obAF~a1M=suWrssd0fw!EB7cd6&-|V+6r!GQvn`u=bs1i7 zvlhurnYU$xgaj`puzw*wNR*di)OgSE26Pyvry-)X)%FJNs_8RDam9Y^RR0AIy@H*BcY+07!MbOt_)WvIS zf_P{!m#|W9enCVNMI)>|GFVK>IUGh=hL&I-+zIkhs8r~OrxH&G^~MSAjV!|mzEP^q z+sClX`BDbD{ICztf<+U`3|&mt&RM^m6Z1nrh#tr+crOLL@$R1qSHm(lO4i zuRQG~i$`#b#+WTL5~_jgC6mwSYN*Dvl%=!vwR=RJHx%fhA|^l?w$Qd8Julh#x$wAo=z(O#7%{hZDH>SSBMvq0V>(RP~aH|VOTzb5t6U5o8 zwqJqHawb``phKdAj@yH!>RUjv{eIU_-r+fgoS!LO>~o=NGkIXz1mWk<Y%@G4~lJ;Wd@!4m|eB zYfe0RlNNowRi&4E zTR++N%pqHaSdO~CvCqS$%@{WJ_*!PnI@8#P$ZcmPH!EqK>`~ErgHyt$_qc1-cmFd6 z?juzf^AkQT?72gUv?fR25m`u5)pUz7$B&*c!O6+@H5n;if)uP*i-7T~{z4`rjSX`n zrlRp7Qt5BsD{)agvEcSXZ#;pB^#~3n{eJa=`EFt;M}=UD5^_8Mbh3K zBc4d%+aACX;bxkr1d0Tfoo1<%>(jAW`ce&f@_PloNfg?P5nSDz^`~v?W{iDxw3fNT zk4U@B{W8v{`z_b!Q&B!Tvb7Q|=3u_t>%@vxxkE+fyzmvc%}Kr9t3JNLk}6d`{~A?6 ze~!Y8E@5qT$%v4~9bc+BC1E9Yb7b?;CdK!BoAX&pphe<~E-)fH=Uc57tHlk~@Ojw& zcCF`ARtIR2kh3O=DJDxQL0d$lpM9;RNTU4Xpvw<3Bq~*=C?)S9pdg<|C_N?0i|JhTg^VT0Ba%KGoP93 zo(mDaQU#!LSth8A+wl83t?_f3_WIP8kVmIlPs+F%+?7uRT!qebp54Ttn(}eP!}rrt z(%DLI+>I7 zh%^`NnZ{S*Lsa;!Asj;_XWZQF95O!~Q@5P@Y9xc{HE?5OSXX)^b=%8Rm?6-hIY3zz zF3vHsrV>@upize)MTAdaeK)Tj9kJNAN031+78KU;BnK^>;q($Po7V_+e{neG8V^Lt z*Z{8Xbo3c73P_HS46uzJoCfx@ge6nt@R6>f-87Ru^%hxNI!C7#T3!08(3^gROYa?g z2Xx91Sp5cOv!Ga=yEhEjD#>_q^buT(Vm8-I$|=kRB)rB@9E%JV(H!?p6b~$m_I4dV z$%Wk;Bpw+eG9LWMfx}R>;>LSxHOC0}#hjE-1qPOB`OM+k>34?#xJWf60a>Y&E>D<~ zr16W|_Dm_K$o<{bk);Qklp6_XYH+m2^AJY?jU6LSqBND_&;|=n z7(vIwqv#iGG5tEFKcVkE1$dHH@&Tme;Bh?2y%T~2bVA&l5bzAF0QrEd3D7(-U;JR6 zVC^FUO$7)E!~_XZ^HVX$iQ#x_o$AR^emrUk>c6rW$2&iJvW<88*WQ(Nbh7-~)Yh=z zP9nk&kaPUB{q5LS&|p3)acv$K&|)KCOJKruA^ODN3pd zn0uBlT*le`yUKvaU(z{KPWdh7rZW-s^gG_OL0VMGNtn8yTROLcgT=o=_=2guGf5Ut z@86yeLv}qz@VG5_{9m3ALsfNJ@HRlp2kXBrAJbu$;zQf90u}}99OB>U=&|Ffs-66S z8P(GLfSKxp73!G&@I{6vqDv>dz(zrtbh7VSWgfGiTz2~!od(9vD_7wa1!2!Cz3eN-_ zxU3V#wS2-BJU68dRQ5iiW<1a-K}?Vcjt_ZwMtbC^?pquK{Vv(14la(E-q>U$!06Nn zuQHBlh$5!y%+aHIleVedvJGH_9AEkjG>tA1lJ!Yl3m3jx3Jzx)K^O#Wh@BqGQ_)mH&5w_{drH0p<6JIJ zm^g7Y^)w&lRQ>=iZo4l>n;OEcFBqTG6N32Nb=QWD;0!t(f8#f&2g`%Qk@(fW@SFMp zu*v5Y8BRgK#(V&5FedoraF6Z3ZH*fDsNJtv-edc5>4Gx|(@*-3Eh#(_}2w+f=61Y6?9 z&V(lh#{F*!oAso}n6lAs_JZKnKF5tqTP6&-uc%5qP5G`i?X+>rAG6Y)^YOxm_4(cj zs^HL^3Q-g59vkCWjo^c=u~|c|r_m``AGzz}RO6cKW(traE$eXb)gcc@b=;a0v^8Gu zwX4^%4%9x`uwdr|YTj0Jh^S`3kD{3b}4}@RDB4&76d@#8K z)KgZkLf!(KaDI(+T>GVd^mdaO1c5Y#d3K_F)K792dbM+bvp5Zk{>px)-=H1-T|(od zep>MtcHEJ@l6cP#w$u($ZL5FFk9im?AlJ1L_}Hz}(ty<^g(a-7w1 zoV)dvF1J-vNzvb4P*>^_67mC5UsoQI_r{-*2EY%|c+7?}7K)gv@YJm(g`1T#p*h-kU8E5d(1*U}M!{90Y@8z7se~z9M)>1jk!xRlGv_!u2t!)sl~3T~Slp&? z>IIaqAK7l?SZFTTwYI$Nm%yiq)!Aox(+68-th663T8_awVhtAmQ5oXRbDvk9R(;9n zO};jvwj{8+ECG#;wvNLX)9Nw0Pd!-@E|_cM++4>sg?|uc4$n#<7l~vX)l%Zl`(;4r zBM@#{zWTM;Ou0Kcs75QsT}X_m2KC{6X#<|WVC%ON`p7-@Nt*s_{IYzL7PvY0CQFGu zw&2@V6B1N?v$?&V92m&HXHAWiPa6p_3Vx5vAOpAW*3YKU=c zG0Q>y5R3J(Ep1s>cPjce=mH%(Vo7YH2ZNveERWCBD|m*BPYf5noa1HLJrqE7Jr87a z$19$FZ2YY5uqXFs(qXvE{M|m;)_> z1Eq){Vz+GMbpHJ*Qd1JMX<#ignH}Sihgwl$06aHaeLH_Qt+$Hy8?%W(Z}mTzUH;!O z+w1|e^BUl02B-?aTr`k~CZw0QY2dPe+{qlC#{^ZZ+diO4ag|zq8us2>%GCWn2UUVE z<*kK>HkF_SOXX&?ze<0NNKi(aXkMso@@+{H)AU5YuH}L zUcd&<@Y>SYU8j@SnF<8=Q>go^P?^6|wvD>s*-gYO)jtF6K8c(H#w@4~2uW39&<<9g z279b5o^{E|i5)VeGnJO=Qyr`%J(n<)l=;H<%$)^eRx)n$S>NoHlfh5dqas_-yc{Rt zcGI1`XmXJJ`GV>;TUq`g%m=(LV? z4FTy>!huCbrxVT2`+jR2EJSw?MgH$S2OM!>;t=8|FnEyp8yG|gO)d-$`h8h_RGAI@ zMrnv#E)2teE2s1SET^e(p8Zu$3;(B_9$(U75!a?OW8dtz!Cm5JI!#z;@JKVg6t$B8 z%jrT-G_aheyA{XL5=mKPELEiIBb!SX*Ltkx_%PR zsXoUq!&$eVOX1%2d<>apgPBKvW_UkbjDIjre0RL^w%(f1TpTQ?sljqOrCUDn`~z4{ z2ec(6-Jmit zUQAMz_@1rC)|!YW3W)CfN;#ma4Y0VZGP#^(^n+(RQ#^7v8^9458MGGQr^&G~T<)$h zFoUn^VBKzrt-jxIu*K9kG0j9^>HG^i;sSJXcA?Fk@Xu)6_T}QGx+Pc<80-c0 zn+P^|=WF>b;zXU{?}nS6PBvu5JhhJ9qw!SE$6ue?t`uJT18ylbj;$7b9$gk2(U-36 zhXbS7`e~q+!LGOOXoKgg`aZ{0eZ z*MuK|rhjMiKajaWL$z{SPP75oaa0*6TGqHa7CqUNadRJdKxTjiL}sr4ip;@(BeTi> z2AOyNM&`Kxg3LhEmPF{bz=(>btbbj8F7jr4Yy2@i*7vV}Au~YpFJ$ig3z;SUpO6{l zH!>IfiOg~TLS~6SkeTxVnK>!`MrMTvWX5pEu`LRmh}>?bY#=Kyig%USm(yi6l11$hTGT!Yfu{e3;nYfPOYa_8Hdpx}y!t^*%+rBllAu%;)@5+SvdQ+oHveCRPAPfKQz;ssjP z2Wq$@0*Zb6-AT$A9xwqsEvN%LtzYItzg|**pK>iMtM%Z9A$I_l4Uq-hX8JP_zF5Gr zbAblFxJLNzg}>V!T=)_F2-Q&3e@W1fH+;S^&2>lg^R>2jw9X0pIJp%DSbvsvB7p^N zzAQcI3lsGOt7ihE;bLB}0(F_BjwBGYLan*4K-ngXF~`m5eLGj>b{(f;Vtl3Kr$*&% z94=3B-Xp)0E0l33VY9Lvg{=WC`jCGt`qFqYUi|)Z=V^){&i-l9m&OZ^1@YJX{R95~ zW6_t!17ei>K*(-0x`*t)J^EG_(oXssqxPIe;NAyU=~E{IOS2wG@4ZDoCykYE{3eB# zRf`n3t?1}nJ#5s)RlWi!?Cyc_=vK-6C(>O zn?K`8fEASg^@6+9k-XAtwp1?B1>ViU67BX$dj*dXPhb7Ze?UrI3h zIeF}j-;`>f{bxE&EgDAaClSAs0rwl!-|sh&BCW7>B3X6h@g@fM8(1&i?>AuUPu0Dz zqzfln)+Fdi!D=MxP#e^t_Q_6YL^50!MmeI@+^v#ZE@_sw&@Cd!Sj8!TcFUttGE zPn$8ljj{w#OafFZ2x$Zhsp6mwr(r=<2EqA#4uC2u+qvjeiD-0fo1=#iZ;0`56~BEF zBTXUXg^J~)L5&fx?Lyu&2jwK zkA*InN>q-D2fn!SmeeO%i(YXpTyt6x+|t{N7o|)e6QJ?RGirA%j=w`r-eOnSt@nVn zz2o~`OFzIQAM0PNxC$!*W|hh}nCplK#2%AjeKHOrc0ELg7nToP~#Z?xE+DBbY*5bxqJ&707gb2>d(=m3Z?p+NHD2zFq^9FTM z6FJQL-`w4o5HR92Xxwgh7XGpPJ6j#gtHyVIA_yn)uyt5hQken%(|;x4{jc!*{wsAf zbSYU)ZEl|5@doPBU9qNGB)vM)4`fbFu*3X_$>}%S?8&YQXoC%%2MT2I(Cl#)wy>R1UbR1suy>Zer2 z1oz5ChD@BBDQi%l2uB}ZScYL%XEDc$`^QY|J7XkJM-vgaitcDY79lV=0CCN>d;xEg z@4W^^L*dnv!((87cW=Qq8Bu)b-g5T4d&?KFdrLnRtUyzMPL*g#@obyb z5Yx}o#HveAC--sDmJi&S{E|r=>CQ4psruww4&Y zbC>sRU84SM>*52pb*cHIt&7Zm+Pd_>U^?tEa(-9$CgPU^ULy;uprFWN|F-%w{kHo5 z?evce98_Mv-yNXw*7&j$CW(e$U=y8=e~j&1{m1XdE`~S3i+2#Mob8+22TND^V)e$r zwbszS#Uc^hQRwf!F5leRl&q8OCK7hEHI2N){r$p!DaA=Dt2Isl)wTVVO*Y4)ao4jG zz`R%*qc+>;mmc$5p!&a~x{2&g=dv&XT2mUh})3=cv7d`yDLUnqE2D4DTC* z9!&8NPxL%794}PFf^&5bvCI3mE@f~AQG%H23jxvBbGKvKH#*Qoq)r@D>*oqi9N`6i z-_S|*s;b868>WHr;5&H6A&j`gdVS{|ccBCt+jsgIhFBKi8t`+&j^tot7ae^j3y=M& zw!CMVcYfiUqFtJE6FLRj6nSbZ7^Z5+o!PA+U>be6CCJ13hZ5@-?G#=@8@O zQWRUj1_pW${?BW$bwmDRUnPHN(j?_;%QrM&?-t<>BSlQGcMDl@8Y|elMMq9o&T?4l zuMQR{*h-4th}ge7SXhA_ENJrcH6EG-V4VAiR7i#G49s!WD0BioUO$i`-i0j5Da~e# ze!R>?zPHqy|6lCAcRZE3G zg_Z$|dN;#^vapG&9qA?MT9r3v*QvgrmswLxdW^>AISM67XWRkEggR~9(9D+Ka!Ho~ zhT#KoSHV~R4}jG~2<4uX4AOhKZyzq60z@vM#G%*kI__c^E&&V!Vi&{U++}b09}ot{ z9S8&60SE*8Haa~k3&t?i1>welf@@MQ-(SV*z86ki=BbrJ+FPqgS2%n$gWKPv{yU0PRDS^@aWG&6{Q12l|DA6K%Kee9?5%6FA|yyb zJynqvudtg=J9Xbz8$*-QgGO-b#s0jjR97ocL`_}K_a7WR$`U$L(?hQLARA zbS>`6Vy*|S60 z^Vuen{68prW+TO6%AV8I6dB-2pGQ$s%jf0sqfP$<#IW14F(8J$mMxbITDENRUdz51 zaFGB8=JW~pTvU9Zo1&1Z($J%#%he2e@m2hXnFB|ArXOj1CDJ9*Jq=?RLI8$=no>UR zIlr&qSoYO~SQlSy(mR)TfC<|5x+wJ5anD zT)Y~ABn(M{iwBq6gAL?mC=cq6RTv4H&)vHwl}e5iNgb+1X-s zjWW)C$cLkSnsK`%N|S&2ga{&0sJD2L#27vyQNSkzc$fC^328@(WcU?t5=t~AO{3C& zrbi!<%)IWc+mF_I*8TS1GvAcQJL65inWDiuFi04J{PX>T1Yj!KKS)@>gM`Hnu@@L5 zYQg39GVM=ic2f6b$!v+4bOW&Z!7EBe9}1tTF0`MzjJ(aF5l&E~mh;b8gp z;-_iG1dnaye`6(f%Y(5J``XTHxb3{gwjDIwc;Kt;bY2O^y|sZnPq&TsdR)g^E$WgQ_G#VEDRr0JIu#)*{G)A^1G{bw|l0T zk89P?o=bJfucaV5_xqy7B2Z`)iGlQ)g{kf>P~c_(XjjccBgjs>QK>F)a-fDUzo@ z<;S|HrC#-Vbkxbxx)=JEf;fuaN5Le#xJSV>`v=7+)Hb+gyi37U^!u>H%aeI92+fw<=Tt0e3 zL@AXmeB(>#_X~HcuFV;h7Y}*RM2@~x=SHWsrTC&3)E&R$d791T2ojtB4sVlKu-|%h znB8WCYwmEaJWk&`6|UEd$In;g2M&0BaPGAiUagAZ&zkzMxipFTF`wqiO;h&x4qe%# zBb`j#gQ7!!{%npVrp&Aq{hEo3%Q#kjPt75vp_0#aH793ib4{VNaHR0_LOi2~arDh0 z=nw^h6z%&H@hYE6_>YRu`c)>&&}$dlgicJC)QSo42|5hZmChyp;fceuKGwn+ zqh{sUYA;{DUbt0rr0}73;lrC(DXl5R1cQ>th`&=3ww#L5;ZL(ruZfrEX*uQYpq@Vu zvB&6)x14$$#vQNo!&`axhqO1 z4$l0p=X=N5Wo?dj+xR?Zaf2o>x_;Q~T>k9KcLsv%*S}P(%Ka*$58oz)j&b7ALq1w~ zyhjd!hzCoya_lO|OP~RH38x{}5Iky#MH>0PyoCSdCH#M$mtg+CyoCSdCBW%~|I15| z8T(&e!vDW{35$5)Et83&+w`L3+eu}~W8wCHLXiunVspRp*>N1vaEm|Wk%%u-vCab3 zXyDRABr*un(nkh(3)mC|eafEdP7v@YEe+|xD>UxB4swj6NEU=2w57r>$AJx>L5 zbJ8ThElVGbf5%Vy&huNJ)1S>XLA9>WaiT5cO9lhqCpEjO8dx&EcZD|G6D%ZN zce1qa3g3LhGxywkYB6>$?>R$hPiWhr@+<2s5e>K$G6juO*#BR4)3oQtba z%Z*8(byKvqO>_+wi*;DM8E)!*jq}q@gRnw(G(YsKmMfm{1xOTJB0Xnb!RO=bRO^(j zmiB6`&N7<+{#MYD^>9up@|GioH;sih9gIiiW4trhcnZG<=h@PPvkEzs-hc@Zzjc#21%0<_zx-7| z?9zo7t>ap`-|gS{rV$=@u@`J;W@fH5p4$50rtd-#`0mbvJZTKwugQ-fQ;_#{B%CRD z|8A9fLg~z1?tz()p?17;8NbehOhK+KG|Di&-N=w@C_hJZXw)ym{5+#6ACnmMpW~#J z1{D=GZZ*-?9aPYw=UW>~k7lT1yMKPxtJI11-LReO)U1~@$@}DB8{e%hvwO4RUh#i| zfA;aOkT;BF#{e}6qd@>2goCMIyt^$F|u1^)$D_`=dq`rHZ zEB->+Lr*)Z?eIfkhi50?d<3E33;}e2&}oe);jCgj(`ILI5*~L53M|@MUHcUs0ku54 zaLT@o(}%-7X;36cG%A?G0g_at%U%*ul26G&-KH@Uzi~l&Nne<KugRXYI+jL*RKZ@5DtMXQ2%9Qsw?9=dbu^~syAM^~Z)~by5;j#ZdN);& z>2_Z-iN!B=%U^V^v1liaE{z)?!@nIcEwV1+SViy4@J}XTU1Vn~%#KtTXm-b>3aZwF zR6%d!nzBiJz!P{FWF?f&Ao_-m$8`*Kl~@^(Mi(d^@qJX_+|8$M@PF4WF%-3UoQ@R{_~b@1zANJNEM`+ z&!A*XVBWry!us&KZ$BPLF9>Favk0n^Q+5dr#jnL|_!F1?G|eC_6A-xD)V-Tr$91?t z_5Ki?T;~WU*G=za_oH7$-dEb6DcFsT;p<#+EsyK#j0UWZLm-Asgi2j)L?blBxT?A}cjJr%;-7!~zupw|XUYDXjxa0t&R(}Cuq5;Dhp1a?^ZIaNKP8-wu%e~- zNKi|$+eA*(=zUUH$1`0fxtEvH&ieVMCK?RoAwW2Zdy8@O|qP zk@+=cKwV|?%_qu7O=Vo-=g&(8iyQrOSRg)>l8Q$Knf4Hnm1fT49rim0CkuurS4Q{3 zGciEqoxs6?vel3r&?9L)GCZ^Jx6uyxR%oB?&>54#V|G<6WJT3)ntafcs`b$fn@*nB zHO`CLDqfMAKeg&M-%?*jTV(L<{w)J+YMa9Nm?XjzZhZoQ{uy#u;th0K29?hRt zQ~8J8^Oaz1X=J0_C$zj@tr`es!{>?2eC+o~1) zrrUEncG&2ZjqxIv*_|(9?W?)7Q^W5sg&vJJGre8e^I+Rdddv5m_@e7{i^fV{#d5p* zlfutNE3G*YU@25hl`=*vfB10ICd__8`eyKWv-z-5@7bFRA6t1_%9h*6wkR*u13?%< zSP*6f2*Ri}06`csP90vaI$ERro-Fifd-BfeO}}%4PfznHtTzi*25iuf)XF@KRNyDC zdRA$o-d_B}ZoA#ltIfr+q9W7@w|@i_AC_Wi_piI;hLi&mT^>`m?i&c_4C@ zH1fpyd{x8|BhC#o>l2MWWgj=*o5ybiB zxi`SYz3oIA^!$qSArbs~vKJBg_vfDhD!{y=Tx3t8{{@z6`4g+w#pb$-aW3%c=9R zW2&cJOZq#@#Rvi|o+ZjOQKKWi9$-#91K*|$h=P5a7ffpGoI`Hxp&$rcdX zZ&kFR0g^3+4HD;`>x8%QVuV+2Uif~2U=kNY_*bdrukA1YkyvM`_3|0MfRAW3^qYy$ z93Qt8+3#IBtC`OWNyI(wwfznt5I-d=XLFdO<2ON-)}|-X`57#UU$t98^xSIcxZua( z`cI(?Z;VD})^etvvOBG%$a?2UrUW=u0v^A_Upb;Z+wQRw1}Mg*C*jS>1j(L#-mtXKKmR%w!ivj0fML(m z5y{?wF8l%%YDo^<=qJNILB|DmqWht6biY&ticaTMe3eqQ_|`*2(Iz5&8jaF24bv`^ zp2p|^9AI~PQFAf(nBOJRU8x2T_3eYD8bq;D4aPvK;e{G3)$krjHQ4@@Y9NE98uWU2 zP=MG6(CYv!dCG-l>#2kx)FP|*UU0uTW?72{FnUR%uEWv&MG)ODkSA&;K71i8oHR+o zeu!KW)_-Yoc25FKT0|Jll=>?mj1hi47-*&xVPtGxk7^MB5+iJAr4}RIkXf!+SGpVB zcL&k^;+6{G?L5emJq$zP7?z>14lopApYc#f`klWF zg`@NabgIxHs=npt#VqP-;Fq3mmVZcD)I9zmf3ASis+gNc4(g8LgasV~bZ(08Wg zS0hJhhUJ`Yh`&umoaxiGS0(@fXLkg{bVq0dQbbSB9wl~wp)h2Jq0kFvC=|vJ6b54n z3TG2{2?`VJ!u}Ez24M&acOLjZo;MmiaCPK6%iMRRfHF!FBsKtg#Q*0{yEX|ESm@p( zD2z|zlz&{c-fVO}QxBt8q1Rg!{vQN|wlG2ASw=JFzYK+U_7w~>6z+4gr8aQ$jtB|H z&B=QVg@B;Y{iL?9P21L(l^sw5F%kj=!$Kf>UY&~2=L7^b+ULtQAspD&%BP{)*NS2C z!u_rIA>4`|VgrP5D~7dvKw`|7B2f z*9YhwLPBB?SDuB*5E;S`!?AoGK!(_XA?W;i|00#pE+HWiOtiU6NT?;7kJ290_B%IG^wo4%9T zxK#&sE0%W<<5r;Dg9(gw!(5*tde`Eb(NSX68m-}W(@oPkgcFs7ZXl?quIG?|vYA#K zu1W{t_W+HaM^AA9qan(Mb~^Z556$LSaPa)0&mfu)2lD{~A^PuAhokxXtFHl9Ujvg% zfT=#X3MQ8TQ+-S{zh*1k8jj{OT52mDQO&#_r+Zg}lbCAfFY4%p7cZ0hZYnv?LdS+j zooNDy8=q_DAKTx`PU@mh9%yC(a5D?oYi97Z{x&l#?;(%3yIuJe;lSJxEbrkdtf-Fn zH^oX=y(pbF52hcqM`Z%~L0&hOj^Fz46lW|K^DU-a~LKuH@ z>RpSR=JFO2)R#0-3#3(40 z00pIUasIcBK&A+gQ0n+Ap~SdPLP@a|RujTR{{@D<1wr(m8$|#0vC;o2BbH@2`2SM- z?MuLSmzSQ7y7xS@W7F}L&Dq)bm33&=1z#ALF;Qq?FvZ?e&>MK^wcN0Mp(HX%i|JI_ zM{p^j%2nH%lk`)v!QQrPBJuIrr77Q0KYij0FcDNUum8W&e zLJM#N0BI&Fc})=R7YE_~hEkB#b{d41Yxj-8!NkD_Ix9TY?qo4wI_qv00~+H!4Bg|j zpLnsP=z`6r`jf5)pkSDwHnZg+%gtIqF8I>yZ3=jZK)8tK-t&?Ui)5#zu(ow{%4d>o z7h@ebK(7_gb4rX%q!uH?_OtITIBDSP8C-G)Aj9^S-SM@q9NumMzzrbewG;oR!ePNY zdKJBals|P(hvO2VG3}dBr#C(dcNE(6#&<%~4v&l;K~g=+xF=U9O}VbAiFchvkAc`eyS24~)tv@Ob6eP zfw_OD>%;9IW^z1xIKT2DBU`)w`7saH(7#qpd2GN1p@P?9#jUXaWyalP;*FRYRE7D50<#N;cNxwW@FKl4e_tjMSCqEcIR5{)8f#6tpXeUFsOHov19vuoJ#0 zUY`Eb{7k5Ka6*MotgMFpL7|(^1o}Op>(bBqo794O63zNyTVAk+(#08Shl!e0-{YYw zOYz6;ZK`cf=0r+e>Uz`nol4cbU+{yQdHJ`#m9#?jGs~XiUQUb>F-s0t+8Z+`sw!hb zBc&7KrJ--b2~rhC>f={SOMBmMze5*{h}nEF$YBw4m9`oA(M;$sR#o)In2S<&oWV7| z-$}TAAYo;M=9snMs|i2I#}A*MZgzaWo$pU&YvQKg!uadY0wH52Ged7L zAW6}4|7Oj(24H^w*9+^P=%LHg6Z4DNZ;|t+k|bVetss?CA3-T`EElNo#Got z23T`8BD|!BZ>gRY%*xxQt{2(tBk%7dD~F_?^^=j5I~xyA#y^+%7KX0d7-v6ovuGS& z%3-!7$!zwp2aiNi+2B%8|3eIEpIB*3WWR{{YF{yA?PBUNakgyzZrKwW=}}3d;?Wyv zHnd*zRX^$~4^>CRshchazdLP7x=F>pV%P4*GZho7E-Sfkr^~73a4?xO#JqSejsW2N z$YeVb`c&F2Jq0`C(d3GOLTegsG^Tf-Zt*D%g-&PGpF%dRYKPvB`~_l+<>kI7W3wQt7Mw9 zJ9B?p_f!+Q(ljn&P5iignrPkxUZ=ZL|G`MWxaQ*VQ-Sb#+1o z^PBQf^O?!01csw_1JX*b3})s#Pp8(SDLeBdwWRNi7o~eQ;kYTwx4&;mib!cPzF>9+ zO`nn{7WX5nFVu1HDHp(|z9^wRFODMci!{N=RmL<(RCye(!q=m{UK}6dJw#8i*mziT5QpogCJnAyWiMKU4m4Z$dtE zX3{@*-&Fz(zJz37?li#QXWE`dzs~_6d|`PJ&+9y0E?@?JX z`?qvrw1pN2011uA6ryqCV&mxy00tlGV+kzx;6M4h#9-BZU=oYL7k|Q{`Nhc$#^9qd zApCdCLM`EXzPHXU6OY%!V84xbvW=m_PXGr0xUD2}&#QM}N!`9Pz#B!NnAT8jaq8mB zOXe%Gjza@434u^h2;a4gT`?YYdQO?=@{T?RsB@00Ef!~%{b9^HDd#7pcLI@YqK=^e z)W>c8DAo&$*+<9DBwK33%0gsVWg)?3|5kuo-{|g(pXV$ony_zS747X6>mPhE(ES)z z76OaWU@dwa2KtQvVbH%oKhfB^$25$W$5Q+AGs(%*F5T{4y8_dam^4geplMe{g_F~9))o0x@lg?XM{peuB29X+PW zKx5{kFt}bGF>qGq`K@8nFNECl!-Jxv8ydB6z=J_=`9;q37Z(n*s){H=%~ffIn@-iq zzTHR0RlAP}8+52q|4e6J;?h%ml-_$P%>45JAk6X8X(3zRp4$lr-jt)6kR>y18INUbncsa7c zS-WwP|FWR##0gD`CJ8CdYpNOnGRJI$!`qyH50Uk|Alld1jVzv=&?no`GxEi(I%zsC7Cxrbl1C=vooYVqbI~g zSKdEe2s}K;=XB;Xi+E)I#D#4hjk$-D$hq{KK&gquwuJt^6?>bN#tIcj(a$U~iJns- zIZ7_D2)oTncgVb3NsQ{_$?$JNuMN=E9PKwb7u}C~PW{nnB&TbN4UYAc%CFxNYd1B_ z>UuWc(tq|W`ilCutheNg!Q{OyDhaF4`V%I+N`%o?H2CeFRp_f43!J@~QD2ra30L%a zwrtjZuO6Oi;mZ(|8N9O4D>JCo=I7ME;8@u`byYNW#eVY?PsL0dWB-WnG__JY`oNld zJ((FX`n;r#^2wc#&U*;wGU^C@ZJMQ``TDWgyPf7+#EyP66mK0RG`im`Z|Et8uoIn(7LSyD~^XX3Ig zZGZbbTNKV6(HFl+qeyS~*=f|j64o)pO0cJ?J#Ie7s~lZ{z8E7$&dTSEYH}3|nTz-p zl+u;P8F0NToi}Q_Gow#Qxm7)@rr-QbyLGC8T2N1#k!j{I>z+E$_(KPM_A9fKd+I>T z*(F-jB&e(3OAl**3G1{#QPJ1m=##O})$_8QV9IcE_PySs5q_CRfjYUVA-NfiHd_4@ zHWe0$k$Ojq$0fI#rl_~xRT_D0EFCkxvbf0tq#GHfzdFBv_-E<*BYI7x)cNG&YyIW? zS7@%zy=>uWCXGG3cLIwNK_+*#y09LTz*LMALBGk7?i*pvU6!dhilUonP1H(R?%bHXbhqc}bB1?JH zA~9O;Vk|sJp!NPij`vder6M<36-S_?C1>Uzv?ey#ubjW4Pe;`M4|O1$ zvsSP=kSeSW^lI+mcJ$H9Oq}10RaVnH~MYnixM8LeRjW`7!(}hoZ;ulP+2IR z%j4?vOrW+q-1+lwr{p)v1LUqcEYpc%ZST+6#Hr=P6@K9l(P0l&s4?r!^lzK%IQ6Ra zZTe$B0gUpqN%&ay5wV05B(HU{+|1Cw04LxjRqA9` zos}7J(stsl4-Cd@le4$m8jKh8Q?Gp?c5qSQJMJp=_|2c(KG}Db`z&~OqTCwjYy)uWs3Gxm$&?SOiU;> zk#!~`yTB{U`DUysdUUc(czw8St2{#fYL(*&h2P~LX*SEXvTRqaid`RTdd$K2z|OmV zU08fzw_A3iInaHlCF|EC zug|)mf$}?8U|^&p+&mrfzzZn9iwBocZIM_dGN0+X+RzK&frA)$;1x>yFb0C5#%a|& zT#>i+?tQ;U&NR4w2;L@S(g+V5%(JtD;ept-dLbO<_MF&>fu!FUDWF?4?hZLHJP^B{ zo@#Hn<`g=<6F{hr8ukf37(u|o1KB@mW8i@w0kEiCSrm+`8>4thl zHJS2vBh0uqN@%G8Hsj@GLDU1VJOg7h!14?X9w-6WjGX`iK``p%-vENhP5=RYAcAlm zjv$O3h#=4|Yf-_1552^i6tpBWz=kr`^PBY2NA=bmLO=)HPuf$O^T(S^K z2o+6i3ztlfEqOAUiqIqstN;Rx90vgC?G|aPYYU2ma7hSgb>0yJu;AVrqpfa=FbZ81 z>hOU|(f8_UE3O;5V1W|` zneaMP9Y%fQcg+s8aW@K}x1&>}#b|#IgTnv;5O@trK{S%J3x<8b(i|YH2cM zH;^PQ_&wwHqvVAu7wU-XRB`~Vb1_PIHc322H%2!b7D@>LLMa${TZf(tob{&ZQUr? z5hX(1xuE9|ijta4!mO~IrhEhg+)kjV0fI68$vdsRnDKdbz(!Nd*0hb+tT^NSTJ`VnV@5Uc6qC{vYI)O(k;UtLM=^r_fd0jE1+Bkf^`Zd?#h;>qSMlA)GnbibbSdk%wT2h4_t!cOu65jAt>LTv ztu+SEw^h-yc2@XvZUz@RE1daB`#$BP7c6?~BtEF(qgd@DiW;C?bTpf9`gPSLi@AxL z#%pnK18J9yQSj36&e-!K)zdb*1{O6+?0GihZX=&5mQNM$?fYz@&WRo6YZ{L@}AU{ z!(~2+1vBLVER$xs=Dt;AdA&<7yd3%qjk}n##C(?jLIBYiF&;%f-TwelmIJWtvo+e$ zI{;-E7o?VP5-g-*P=;V36~t8rUIMJF2reG^mm@Uxna^>^?Xf7sK7f^l2bnK;KK|iP zN6(4Z!WclYZ@+sz!7}QpDFz6jv9Cs7hv~xXLLa7Ec^65i>n|`z3{dBtklF) zQ1i&3!v|^(ZU@vnQc9A>62=6_?5k%o%0YYcdikm~&^j^zT1Poph-D`jAYrYeI%V8o z7`OHEvL1k76Av%k_qhMA?OJuX0#+ahj^<^!f6QJpVD>Tqv)3)38&3m{eDrrX1w+|Swz)rH-0Qq> zOniUmW!BStN=PmV`|_*u+j9=)pabuUAYnT2s8-ZUIxmlh+cOZ4;NFWzOlh(7{2SM( zP*W<%tL|kI3UIhu`E*qEd$SlU!2@P7zM}-R=y${*IIuU18S19+WM-{Tb^jWA^K4l{ zOPyUi=lBEN9_oxUgnqghp`>L5FAVrqsT+_d>ZPU+SqdHb=()YH z9Q)^KI3BQno>qb9X%%d!4h>J#;GDfXz##C;JCxS?qULW7n8m2@>&Yq z+g^W3LCt9=wEYr7O`IbX0<$+f4_)_dQFJCnk)reu(ZX*CNGfjNT`gOIPJwdB(Fb1< zUD@`}NCN44Ix!qc2oA_J(nYtL9XkqME2624dAZ3#%(f{W64!$OHXVVme$;b-tsTq2 zApLr=NWW|t>BrDc1~m3i`T7=tM+2EGIr?6Rv^rvDFfd*JNOIh0j84DwD|XURrnCsH z>M0(IDwmNGO?*mY=kYX6mBVPgvz_wt^;YVp;KY%C=p0QI#i^I}pV18?irS`gF%#iw ze5uf1$Z9uTn8K+tU63TgJzZc~HMCR~#UpIG7HiE`eL1sr>7Bh8FW-b^*~8W+c4u-r z?>@OjBIs&;fw$$o1iJC9^0ztD>_KJnoaJhLBiUz0g{{f$Iic1g#xp0PqSR$dOA<}Z z*Y4JPRr<_uaEac+ca9G8RyT=DT3s-)5zr}4vY(h-;Cdas7+mD|QJ>jcu2}e|`ET-GhVS-kua?98TPn0~D4XgVW${M$ z751O8MgjAM;TcAfIg<_oIT!0<^cv-?sVoVssajAmdglX->h2d3>)mluAhSo5+`f5* zm(xsia(|fQR_U9Ec3YNZ=H?ncNBxQ#+8TiN%`3sfxzc@p^Q8=>o4;7@PWTB`esrL{ zbj`z?N1>R6%=~mqR)pPW&yTKlQX4x!hjnTKK@2c3g?Cc$Hvk_n0AQd1b}8r*4Z(jZ z3>=_D#3~Hjmh&I9%Gy|Ex}QrYef`FRr^$RY!tt)O_bt!1Gp?&uV-yCAUDP&Z(XV_% zc4H+b-cKY1VTAz@D@kF|ZXo^xNgErA9RA~Mya{3@7=?jN5Gz^6#!6Dt%x0-v)wqjd z23O!%30hv>rA_s^O-bt~->FMvO0Q;KIY@X^vxmL@ap;O%dT4_L9?&;h4QO8oT@M{{ zn||CbB3vf0^hvkC-1EI~z!kY!*eWroLtn&1E`TG4wiZiNTeQ9> z#sVu0jLUp9#V8E)1BHS67=?jPKw+S^AVKENBSXijwwDo$jYGt_A7BW=H!Xon7cu|@ z;k&EI$gaXb3v;4RDXcK?304?*yl@973>Yoh0)>GmLrp+o!1*1lFd({C!&UYv(hfS? zYvTEmCF;R3G*dRZ`#V-)fZJNIy0e`|-H@9QV_jKKcL%J-K3 zP3yAYtl<}yAs)F8t}J*-AN~y^5PohY1}vcf0-Wsz5{`QWt$5=f`b`tXn;WI;x>Q7Nh3TX_rXW^6QLMi@%%Y= zmkxA;$x|kg@;6Uc-HZ5|Xft(Ej&C1wRU-@Wz3HiWYsTfpjoyiKqeEwzg$rLQxl_`d zEu_{NF>@B@8gbd8{N_SN^-U<8Ebyv%v}(gub6glLfCfl{z&@$&ey%;E0e_0Di6`$j&*$<&J7)lXefO2dz7Q_{a_M8{JEWg&J%vdHvj9MsopcOF$=bDVuuY>^Hv|n z^xR%E=^^YnGJIF9$XFnGbIF$aOz!cr6E@9SdO)cN)gCIcY3OefUM5a|!9Hi&lHNDp z5MRhI#_MLcT5G>YM?lT6+oc}q3ed~H`fv}+YP?-H&Rgvwm5b%lK7DUFlBGe zc&)n%YsnNMWgI4WP3^f}jgH>@+y6aYMH8^t4st zPM}1hiMIExrxW*CC;=?OXWs^Nd+w$b6(ALj07xnJ%f zgjxfEl9h67pu_* zxL%>dP5hck;IP)IzElzqU1D{0^Q}8DS@Bu{AS-U8{wG;+Tr!rd*y*2S#c^=j{v!sD zf07l)C8I4fE&*%;g9waG_)8;rWj_P~)G3eMPKUcn_dcNGmmw{7KDDrIpZ^oNwwTK! zlBm9V_+5HMlf8jg4FCYdF~L>IqqBA-g=xF78jT%I+f`fH1?@< zo;K{+XUfIRtsrtt)Z<#kRT_WmiF;%nr1{rH4ewvlJA>C;K&Xj)f_qiAObJaN_9CQu zZkDX&_n3MesnCaA5CZ2l!%RSlI7ighk%h8;3rLLH01RQH?+b`w0X9UgfDp1{<*arR zw-Fj6Q~6Komvny%7Jm9L$@pwTaWkP^Bo@799XmVN<})D}c*5cQcE8EMA8(Ou`FEvH zPJe2mDS7;eOS-L2ffzggwj!80#POmAR+qoaN8kr9Gr-s z2pk3gNZ_?VGDhPQ;Fqez5!8@re;w<$I`QSmpf<;=tuF6dEah4Yj{Ix@>ZuG6;NZw4;NUQWqPH!OEaLW z&g<(jr&`-5)sfzLF>~^l$LCQp>mLqdCfkxvZnV*TtG)3}bSZb-(nC?JTg64gR6|Ou ziVzC=MUil{eXjCcPh<;fw)#h7YGQf3x~fKnbALxsdYZy&=bbZ&y;q{;hJT|eW3DTk z$f`MtWKnTT*pyhhME1}0#!xR6k&TWA(RC|3e3+3cZawsHrr7sG^N@MtiR|AY0^!_q zD`w|D^|biT1yvoYPK+%VS+mqSM_V@274JJuF-XL8?y{#?yG`zThpU}7A3aVAH>*7$aet`j)cRv|vY=jf{hf67m&9iz0mdrvW%rfdOxd?o zUjO*>Q8h(`ROF=#;@`Um;@34UuZ}USSa|@|1BpK{nVqa zAh^OOOJY?dHs&r+A~bt&*45X^BtEfrz$W@yykKydcJ+hbzT)|{`I-&!5?ssWqO@Iy zehO(Ne2^3wAMjV3-hR4r~SA{gkv8?&m-NzP`&&nxpuD_iUiV2twG}HJ*9_Ce< zsor)XmeuDFi4;%joyGiXbiBpE?YZcV+{`Cs>H{0+AC77z#!oyf>|07Xj?y*%3~%EbUv(3|cP%%XGriOd>#`Nw~q;(UnB0dMLWKy zzsj|v(`Us2bo%hpf7WV_-5KZ>CTya6o-bw_@{%q4OGxj9_}fnO8ONSS5WxC>MoRt{ z)^Kd?ap;@E^Lfeu+3w(@l1i6r##zM>4W-f+30`waJX3QC4{GpIj-qZ!Pok{d>Wuhd zue;h6>c_Mzil+m+$-L{u&@3won<*q^=$xBF2HTQQ!k z>~+G9llZtom&t)(9d3tzH*X1_nbAl=_p5w}=B!c`O7H2)QhpW!}rzz?k()+A@`8-tyzf+rsx%>u@_+)UDt4l=2(mN z-Sn{GRdP3`YPosgg$_rb z2!ZGJ-lE1u)^&&T6h0_e26G0#r9NydZ5CGvHW5O|IqG3eT`t`_YciJVUgs6gBD?R^e#-ty=h!SijlgLr7y!v{#oAbP;*L| zcy%X$n%eh20|sB~@(HbwwrDL7L1=-~=?HsD$1g zL#iN)FAFOeUV)BKBB@Czaj>lX-bWYgO*9)aFo21hzkBTY~j%Bv?R36hGd22C_r(a*}!3)7>hn$<#}9) zPY#z33PJ%IZuD^^J>E~Oi3VyxAw}@)b#Nh8O64cP9cv% zOn`qJ!Ehg1=RjV>)4Pugsoust1$S!{;_D+QjuUh#wg`C3{rSBh{0S1Mpl0#NmFP{I?~^k5wqLa*S`Lap4$lXw-_ zZ`2UkY0wyE5eSH3YuBZYr-4i1QTTxL*#VcHz{8xd<5T2S4UA8vxGwg?-4(O_>r)C` z1jKs;!OFciKEn<@pmBDf&Mg5oe-K6V^- z#U61S@@K>+!uDr>BXAhaSYxXTfC?rg!W=XaGo{6E+e5!k82w zR(T{NrgP(c*uDL<7@u{%SUWmUHSr z%Q43s1#V@xRpFaHmdKx4qtX z+CN7Ibv|(2H4E%@$z{Nk60!XIWpDOogdWL&13T=X=Q2o5#8G>A%eikz;FksUW_bu{ z%7Wfz{t$XDi@br535U15@O&+XcoGGF;l>W}rE=i#LkX~j6CUE#5W4B`xinCYJl6jd zke57?9uc-@mO}95L9_B;PP&$d2UVuxF#*rgLiXoCi_&?G2aUeMqrrClSFkAnYodZ0 zY4Av)ALo#uMK$0-k1FvvAgQBZfKWXTj*~NnBObEA6P~&-|3?k(dbVva- zv9=NDtpZT2zM+8R$GG$_D;03*i32Xh{|p~`hITz?7~@D+4!cMl;Ky zsfmF4omT|)dxJGGK>mtgw$j4KhwRtzz*r8yjz_QIQSR&AVc4CZ|L?q(lS0xL!SfJf zgFY&Omki9C*+bakhOw~i8wOTjvjP`?O@m@OUjOc}I4(u)wA3Yal4Z)UjQ6XF8KqKlZ;ggjJ`vIs^ks7wX?=!i9k2vtFI z>oTE^bmtBE_MK?tz);n z0KY?9rs221-rLK&+KPxLUi8anl5QgurW*7V;E! zXdZ7561>ksr!6b1HpVtwRssv-(ijFbCHWGdh{FU)r5&5Icfb%yNNgF!I%-(&58pzQ(o z#_gT9^XmxnN{tykzoM|0bYudr+m8%Dbxv^qwa~&Z*o+XdAt<|D7&dc5KSaRuI(w2} z|C<`M2)xe{@md>u>bxNsTQ~Qb6)-wi7Q5{S$g{G7hJXE_8J8-p&)?1eoh z#~8_rFx>gFYK&x*gBS64o)>0A@Yg}`P*@#IfaB=oc$JSBv)TZ^cF^MF$R1rb01m=# zAzc%s5aMevv|s{e{bwei`yUH|zc?X|L_ij%NMnR}1XO8?v_TL+P=p!yp(tkt4wA%t zxrzAs5+X83UOG&dv{RI#uADw}#1gdq2j<}CL2EkHVvdxFmEm$Fi@aTI8AT}w`tJUg3Gk;|ZuB&|& zDUWAxz;5ve?8Fq>eieBFvsea6*dXaoKN=#yv3Ih$=63apEsxDv0saGxAycJb0WJ`` zg`})OV|X(JeYOTw2)71RU&4Gb#4fpEE=V=L|AJ!wxFGBQ+4I$(Kn6nS>5b_?A2>c? zot|(NxF-i_B5-gZ9q9N!2FbLKn=GG% zpxi@{VGw%y&s?BkuYi&Ud2HFtDx6@3>~usjx||0z2Q(Hs9b^uZzrb|yd^S10^X$Pd zK*m7m>CX8;V`>H1rq5wygSu&PKG03uVL}K4Web3rfk|R|VgXwTlM9$uo33{b7U-gd RY${wFalkQAdEihf0|4v>aMAz( diff --git a/Artemis/Artemis/Resources/lua-placeholder.lua b/Artemis/Artemis/Resources/lua-placeholder.lua index 87b7a962a..ab5b2d17d 100644 --- a/Artemis/Artemis/Resources/lua-placeholder.lua +++ b/Artemis/Artemis/Resources/lua-placeholder.lua @@ -15,6 +15,11 @@ -- This event is raised after every profile update, before drawing. function updateHandler(profile, eventArgs) + -- Don't do anything when previewing (this means the editor is open) + if eventArgs.Preview then + return + end + -- In this example we only want to update once per frame when the keyboard is -- updated. If you don't do this the updateHandler will trigger on every -- device's update. @@ -27,6 +32,11 @@ end -- This event is raised after every profile draw, after updating. function drawHandler(profile, eventArgs) + -- Don't do anything when previewing (this means the editor is open) + if eventArgs.Preview then + return + end + -- In this example we only want to draw to the keyboard. Each device has it's -- own drawing event if eventArgs.DeviceType != "keyboard" then diff --git a/Artemis/Artemis/ViewModels/Profiles/ProfileEditorViewModel.cs b/Artemis/Artemis/ViewModels/Profiles/ProfileEditorViewModel.cs index ff0385b73..1a6a8d678 100644 --- a/Artemis/Artemis/ViewModels/Profiles/ProfileEditorViewModel.cs +++ b/Artemis/Artemis/ViewModels/Profiles/ProfileEditorViewModel.cs @@ -1,7 +1,9 @@ using System; using System.Collections.ObjectModel; using System.ComponentModel; +using System.IO; using System.Linq; +using System.Text; using System.Threading; using System.Threading.Tasks; using System.Timers; @@ -16,9 +18,12 @@ using Artemis.Models; using Artemis.Profiles; using Artemis.Profiles.Layers.Models; using Artemis.Profiles.Layers.Types.Folder; +using Artemis.Properties; using Artemis.Services; using Artemis.Styles.DropTargetAdorners; using Artemis.Utilities; +using Caliburn.Micro; +using Castle.Core.Internal; using GongSolutions.Wpf.DragDrop; using MahApps.Metro.Controls.Dialogs; using Ninject; @@ -43,6 +48,7 @@ namespace Artemis.ViewModels.Profiles private ObservableCollection _profileNames; private bool _saving; private ProfileModel _selectedProfile; + private FileSystemWatcher _watcher; public ProfileEditorViewModel(DeviceManager deviceManager, LuaManager luaManager, EffectModel effectModel, ProfileViewModel profileViewModel, MetroDialogService dialogService, WindowService windowService, @@ -138,7 +144,7 @@ namespace Artemis.ViewModels.Profiles // Update the value _selectedProfile = value; } - + NotifyOfPropertyChange(() => SelectedProfile); NotifyOfPropertyChange(() => SelectedProfileName); } @@ -256,22 +262,26 @@ namespace Artemis.ViewModels.Profiles /// private void LoadProfiles() { - ProfileNames.Clear(); - if (_effectModel == null || _deviceManager.ActiveKeyboard == null) - return; + Execute.OnUIThread(() => + { + ProfileNames.Clear(); + if (_effectModel == null || _deviceManager.ActiveKeyboard == null) + return; - ProfileNames.AddRange(ProfileProvider.GetProfileNames(_deviceManager.ActiveKeyboard, _effectModel)); + ProfileNames.AddRange(ProfileProvider.GetProfileNames(_deviceManager.ActiveKeyboard, _effectModel)); - // If a profile name was provided, try to load it - ProfileModel lastProfileModel = null; - if (!string.IsNullOrEmpty(LastProfile)) - lastProfileModel = ProfileProvider.GetProfile(_deviceManager.ActiveKeyboard, _effectModel, LastProfile); + // If a profile name was provided, try to load it + ProfileModel lastProfileModel = null; + if (!string.IsNullOrEmpty(LastProfile)) + lastProfileModel = ProfileProvider.GetProfile(_deviceManager.ActiveKeyboard, _effectModel, + LastProfile); - if (lastProfileModel != null) - SelectedProfile = lastProfileModel; - else - SelectedProfile = ProfileProvider.GetProfile(_deviceManager.ActiveKeyboard, _effectModel, - ProfileNames.FirstOrDefault()); + if (lastProfileModel != null) + SelectedProfile = lastProfileModel; + else + SelectedProfile = ProfileProvider.GetProfile(_deviceManager.ActiveKeyboard, _effectModel, + ProfileNames.FirstOrDefault()); + }); } @@ -700,13 +710,12 @@ namespace Artemis.ViewModels.Profiles return; try { - _luaManager.SetupLua(SelectedProfile); - _luaManager.OpenEditor(); + OpenEditor(); } catch (Exception e) { DialogService.ShowMessageBox("Couldn't open LUA file", - "Please make sure you have a program such as Notepad associated with the .lua extension.\n\n" + + "Please make sure you have a text editor associated with the .lua extension.\n\n" + "Windows error message: \n" + e.Message); } } @@ -758,5 +767,67 @@ namespace Artemis.ViewModels.Profiles } _saving = false; } + + #region LUA Editor + + public void OpenEditor() + { + if (SelectedProfile == null) + return; + + // Create a temp file + var fileName = Guid.NewGuid() + ".lua"; + var file = File.Create(Path.GetTempPath() + fileName); + file.Dispose(); + + // Add instructions to LUA script if it's a new file + if (SelectedProfile.LuaScript.IsNullOrEmpty()) + SelectedProfile.LuaScript = Encoding.UTF8.GetString(Resources.lua_placeholder); + File.WriteAllText(Path.GetTempPath() + fileName, SelectedProfile.LuaScript); + + // Watch the file for changes + SetupWatcher(Path.GetTempPath(), fileName); + + // Open the temp file with the default editor + System.Diagnostics.Process.Start(Path.GetTempPath() + fileName); + } + + private void SetupWatcher(string path, string fileName) + { + if (_watcher == null) + { + _watcher = new FileSystemWatcher(Path.GetTempPath(), fileName); + _watcher.Changed += LuaFileChanged; + _watcher.EnableRaisingEvents = true; + } + + _watcher.Path = path; + _watcher.Filter = fileName; + } + + private void LuaFileChanged(object sender, FileSystemEventArgs args) + { + if (args.ChangeType != WatcherChangeTypes.Changed) + return; + + if (SelectedProfile == null) + return; + + lock (SelectedProfile) + { + using (var fs = new FileStream(args.FullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + { + using (var sr = new StreamReader(fs)) + { + SelectedProfile.LuaScript = sr.ReadToEnd(); + } + } + + ProfileProvider.AddOrUpdate(SelectedProfile); + _luaManager.SetupLua(SelectedProfile); + } + } + + #endregion } } \ No newline at end of file