From d8476d937154bb9a7a6b2b5d5223305430923248 Mon Sep 17 00:00:00 2001 From: Regalis Date: Mon, 10 Oct 2016 21:13:22 +0300 Subject: [PATCH] Hull-specific ambient lighting: light sources increase the amount of ambient light in rooms and the light can spread to adjacent rooms through gaps. Allows making the default ambient light much darker without making shadows look too dark in fully lit subs. --- Subsurface/Content/Items/Electricity/lamp.png | Bin 2842 -> 3822 bytes .../Content/Items/Electricity/lights.xml | 23 ++- Subsurface/Source/Items/Components/Door.cs | 10 +- Subsurface/Source/Map/Gap.cs | 7 +- Subsurface/Source/Map/Hull.cs | 3 +- Subsurface/Source/Map/Levels/Level.cs | 2 +- Subsurface/Source/Map/Lights/LightManager.cs | 168 ++++++++++++++++-- Subsurface/Source/Map/Lights/LightSource.cs | 11 +- Subsurface/Source/Screens/GameScreen.cs | 9 +- Subsurface/Submarines/Aegir Mark III.sub | Bin 22022 -> 22326 bytes 10 files changed, 198 insertions(+), 35 deletions(-) diff --git a/Subsurface/Content/Items/Electricity/lamp.png b/Subsurface/Content/Items/Electricity/lamp.png index 05848b2ae7417588a221d9bde2e6f4c596d09029..529fa81a1c5634f38ca35265b4f1292f84134500 100644 GIT binary patch delta 3781 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 diff --git a/Subsurface/Content/Items/Electricity/lights.xml b/Subsurface/Content/Items/Electricity/lights.xml index ecbcfe351..04e0f4f93 100644 --- a/Subsurface/Content/Items/Electricity/lights.xml +++ b/Subsurface/Content/Items/Electricity/lights.xml @@ -10,8 +10,8 @@ - - + + @@ -20,8 +20,25 @@ - + + + + + + + + + + + + + + diff --git a/Subsurface/Source/Items/Components/Door.cs b/Subsurface/Source/Items/Components/Door.cs index 3ed69e783..a4ce54086 100644 --- a/Subsurface/Source/Items/Components/Door.cs +++ b/Subsurface/Source/Items/Components/Door.cs @@ -56,10 +56,15 @@ namespace Barotrauma.Items.Components get { if (linkedGap != null) return linkedGap; + foreach (MapEntity e in item.linkedTo) { - linkedGap = e as Gap; - if (linkedGap != null) return linkedGap; + linkedGap = e as Gap; + if (linkedGap != null) + { + linkedGap.PassAmbientLight = window != Rectangle.Empty; + return linkedGap; + } } Rectangle rect = item.Rect; if (isHorizontal) @@ -75,6 +80,7 @@ namespace Barotrauma.Items.Components linkedGap = new Gap(rect, Item.Submarine); linkedGap.Submarine = item.Submarine; + linkedGap.PassAmbientLight = window != Rectangle.Empty; linkedGap.Open = openState; item.linkedTo.Add(linkedGap); return linkedGap; diff --git a/Subsurface/Source/Map/Gap.cs b/Subsurface/Source/Map/Gap.cs index afc3071f4..5790aec50 100644 --- a/Subsurface/Source/Map/Gap.cs +++ b/Subsurface/Source/Map/Gap.cs @@ -30,8 +30,13 @@ namespace Barotrauma private float higherSurface; private float lowerSurface; + private Vector2 lerpedFlowForce; + //if set to true, hull connections of this gap won't be updated when changes are being done to hulls public bool DisableHullRechecks; + + //can ambient light get through the gap even if it's not open + public bool PassAmbientLight; public float Open { @@ -48,8 +53,6 @@ namespace Barotrauma get { return lerpedFlowForce; } } - private Vector2 lerpedFlowForce; - public Hull FlowTargetHull { get { return flowTargetHull; } diff --git a/Subsurface/Source/Map/Hull.cs b/Subsurface/Source/Map/Hull.cs index 83693d7da..9667555b4 100644 --- a/Subsurface/Source/Map/Hull.cs +++ b/Subsurface/Source/Map/Hull.cs @@ -723,7 +723,6 @@ namespace Barotrauma } var entities = EntityGrid.GetEntities(entityGrids, position, useWorldCoordinates); - foreach (Hull hull in entities) { if (Submarine.RectContains(useWorldCoordinates ? hull.WorldRect : hull.rect, position)) return hull; @@ -731,7 +730,7 @@ namespace Barotrauma return null; } - + //returns the water block which contains the point (or null if it isn't inside any) public static Hull FindHullOld(Vector2 position, Hull guess = null, bool useWorldCoordinates = true) { diff --git a/Subsurface/Source/Map/Levels/Level.cs b/Subsurface/Source/Map/Levels/Level.cs index c3adb7194..1dfe397b6 100644 --- a/Subsurface/Source/Map/Levels/Level.cs +++ b/Subsurface/Source/Map/Levels/Level.cs @@ -181,7 +181,7 @@ namespace Barotrauma backgroundColor = generationParams.BackgroundColor; float avgValue = (backgroundColor.R + backgroundColor.G + backgroundColor.G) / 3; - GameMain.LightManager.AmbientLight = new Color(backgroundColor * (60.0f / avgValue), 1.0f); + GameMain.LightManager.AmbientLight = new Color(backgroundColor * (10.0f / avgValue), 1.0f); float minWidth = Submarine.MainSub == null ? 0.0f : Math.Max(Submarine.MainSub.Borders.Width, Submarine.MainSub.Borders.Height); minWidth = Math.Max(minWidth, 6500.0f); diff --git a/Subsurface/Source/Map/Lights/LightManager.cs b/Subsurface/Source/Map/Lights/LightManager.cs index 3095465a7..71d658f7b 100644 --- a/Subsurface/Source/Map/Lights/LightManager.cs +++ b/Subsurface/Source/Map/Lights/LightManager.cs @@ -8,7 +8,9 @@ namespace Barotrauma.Lights { class LightManager { - //public static Vector2 ViewPos; + private const float AmbientLightUpdateInterval = 0.2f; + private const float AmbientLightFalloff = 0.8f; + private static Entity viewTarget; public static Entity ViewTarget @@ -35,12 +37,17 @@ namespace Barotrauma.Lights public bool ObstructVision; private Texture2D visionCircle; + + private Dictionary hullAmbientLights = new Dictionary(); + private Dictionary smoothedHullAmbientLights = new Dictionary(); + + private float ambientLightUpdateTimer; public LightManager(GraphicsDevice graphics) { lights = new List(); - AmbientLight = new Color(60, 60, 60, 255); + AmbientLight = new Color(20, 20, 20, 255); visionCircle = Sprite.LoadTexture("Content/Lights/visioncircle.png"); @@ -53,7 +60,10 @@ namespace Barotrauma.Lights losTexture = new RenderTarget2D(graphics, GameMain.GraphicsWidth, GameMain.GraphicsHeight); - if (alphaClearTexture==null) + hullAmbientLights = new Dictionary(); + smoothedHullAmbientLights = new Dictionary(); + + if (alphaClearTexture == null) { alphaClearTexture = TextureLoader.FromFile("Content/Lights/alphaOne.png"); } @@ -77,7 +87,38 @@ namespace Barotrauma.Lights } } - public void UpdateLightMap(GraphicsDevice graphics, SpriteBatch spriteBatch, Camera cam) + public void Update(float deltaTime) + { + if (ambientLightUpdateTimer > 0.0f) + { + ambientLightUpdateTimer -= deltaTime; + } + else + { + CalculateAmbientLights(); + + ambientLightUpdateTimer = AmbientLightUpdateInterval; + } + + foreach (Hull hull in hullAmbientLights.Keys) + { + if (!smoothedHullAmbientLights.ContainsKey(hull)) + { + smoothedHullAmbientLights.Add(hull, Color.TransparentBlack); + } + } + + foreach (Hull hull in smoothedHullAmbientLights.Keys.ToList()) + { + Color targetColor = Color.TransparentBlack; + + hullAmbientLights.TryGetValue(hull, out targetColor); + + smoothedHullAmbientLights[hull] = Color.Lerp(smoothedHullAmbientLights[hull], targetColor, deltaTime); + } + } + + public void UpdateLightMap(GraphicsDevice graphics, SpriteBatch spriteBatch, Camera cam, Effect blur) { if (!LightingEnabled) return; @@ -94,7 +135,7 @@ namespace Barotrauma.Lights foreach (LightSource light in lights) { - if (light.Color.A < 0.01f || light.Range < 1.0f || !light.CastShadows) continue; + if (light.Color.A < 1 || light.Range < 1.0f || !light.CastShadows) continue; if (!MathUtils.CircleIntersectsRectangle(light.WorldPosition, light.Range, viewRect)) continue; //clear alpha to 1 @@ -117,8 +158,7 @@ namespace Barotrauma.Lights ClearAlphaToOne(graphics, spriteBatch); - - + spriteBatch.Begin(SpriteSortMode.Deferred, CustomBlendStates.MultiplyWithAlpha, null, null, null, null, cam.Transform); GameMain.ParticleManager.Draw(spriteBatch, false, Particles.ParticleBlendState.Additive); @@ -126,7 +166,7 @@ namespace Barotrauma.Lights foreach (LightSource light in lights) { - if (light.Color.A < 0.01f || light.Range < 1.0f || light.CastShadows) continue; + if (light.Color.A < 1 || light.Range < 1.0f || light.CastShadows) continue; //if (!MathUtils.CircleIntersectsRectangle(light.WorldPosition, light.Range, viewRect)) continue; light.Draw(spriteBatch); @@ -147,6 +187,27 @@ namespace Barotrauma.Lights } spriteBatch.End(); + + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.Additive, null, null, null, null, cam.Transform); + + foreach (Hull hull in smoothedHullAmbientLights.Keys) + { + if (smoothedHullAmbientLights[hull].A < 0.01f) continue; + + var drawRect = + hull.Submarine == null ? + hull.Rect : + new Rectangle((int)(hull.Submarine.DrawPosition.X + hull.Rect.X), (int)(hull.Submarine.DrawPosition.Y + hull.Rect.Y), hull.Rect.Width, hull.Rect.Height); + + GUI.DrawRectangle(spriteBatch, + new Vector2(drawRect.X, -drawRect.Y), + new Vector2(hull.Rect.Width, hull.Rect.Height), + smoothedHullAmbientLights[hull] * 0.5f, true); + } + + spriteBatch.End(); + + //clear alpha, to avoid messing stuff up later ClearAlphaToOne(graphics, spriteBatch); @@ -173,8 +234,6 @@ namespace Barotrauma.Lights spriteBatch.Draw(visionCircle, new Vector2(ViewTarget.WorldPosition.X, -ViewTarget.WorldPosition.Y), null, Color.White, rotation, new Vector2(LightSource.LightTexture.Width*0.2f, LightSource.LightTexture.Height/2), scale, SpriteEffects.None, 0.0f); - - } else { @@ -209,6 +268,86 @@ namespace Barotrauma.Lights } graphics.SetRenderTarget(null); } + + + private void CalculateAmbientLights() + { + hullAmbientLights.Clear(); + + foreach (LightSource light in lights) + { + if (light.Color.A < 1f || light.Range < 1.0f) continue; + + var newAmbientLights = AmbientLightHulls(light); + foreach (Hull hull in newAmbientLights.Keys) + { + if (hullAmbientLights.ContainsKey(hull)) + { + //hull already lit by some other light source -> add the ambient lights up + hullAmbientLights[hull] = new Color( + hullAmbientLights[hull].R + newAmbientLights[hull].R, + hullAmbientLights[hull].G + newAmbientLights[hull].G, + hullAmbientLights[hull].B + newAmbientLights[hull].B, + hullAmbientLights[hull].A + newAmbientLights[hull].A); + } + else + { + hullAmbientLights.Add(hull, newAmbientLights[hull]); + } + } + } + } + + /// + /// Add ambient light to the hull the lightsource is inside + all adjacent hulls connected by a gap + /// + private Dictionary AmbientLightHulls(LightSource light) + { + Dictionary hullAmbientLight = new Dictionary(); + + var hull = Hull.FindHull(light.WorldPosition); + if (hull == null) return hullAmbientLight; + + return AmbientLightHulls(hull, hullAmbientLight, light.Color * (light.Range/2000.0f)); + } + + /// + /// A flood fill algorithm that adds ambient light to all hulls the starting hull is connected to + /// + private Dictionary AmbientLightHulls(Hull hull, Dictionary hullAmbientLight, Color currColor) + { + if (hullAmbientLight.ContainsKey(hull)) + { + if (hullAmbientLight[hull].A > currColor.A) + return hullAmbientLight; + else + hullAmbientLight[hull] = currColor; + } + else + { + hullAmbientLight.Add(hull, currColor); + } + + foreach (Gap g in hull.ConnectedGaps) + { + for (int i = 0; i < g.linkedTo.Count;i++ ) + { + if (g.linkedTo[i] is Hull) + { + if (g.linkedTo[i] == hull) continue; + + Color nextHullLight = currColor * AmbientLightFalloff; + if (!g.PassAmbientLight) nextHullLight *= g.Open; + + if (nextHullLight.A < 10) continue; + + hullAmbientLight = AmbientLightHulls((Hull)g.linkedTo[i], hullAmbientLight, nextHullLight); + } + } + } + + return hullAmbientLight; + } private void ClearAlphaToOne(GraphicsDevice graphics, SpriteBatch spriteBatch) { @@ -217,7 +356,7 @@ namespace Barotrauma.Lights spriteBatch.End(); } - public void DrawLightMap(SpriteBatch spriteBatch, Camera cam, Effect effect) + public void DrawLightMap(SpriteBatch spriteBatch, Effect effect) { if (!LightingEnabled) return; @@ -227,11 +366,11 @@ namespace Barotrauma.Lights spriteBatch.End(); } - public void DrawLOS(GraphicsDevice graphics, SpriteBatch spriteBatch, Camera cam, Effect effect) + public void DrawLOS(SpriteBatch spriteBatch, Effect effect) { if (!LosEnabled || ViewTarget == null) return; - spriteBatch.Begin(SpriteSortMode.Deferred, CustomBlendStates.Multiplicative, null, null, null); + spriteBatch.Begin(SpriteSortMode.Deferred, CustomBlendStates.Multiplicative, null, null, null, effect); spriteBatch.Draw(losTexture, Vector2.Zero, Color.White); spriteBatch.End(); @@ -264,9 +403,6 @@ namespace Barotrauma.Lights public static BlendState Multiplicative { get; private set; } public static BlendState WriteToAlpha { get; private set; } public static BlendState MultiplyWithAlpha { get; private set; } - - - } } diff --git a/Subsurface/Source/Map/Lights/LightSource.cs b/Subsurface/Source/Map/Lights/LightSource.cs index 5412b025e..03fff7bfb 100644 --- a/Subsurface/Source/Map/Lights/LightSource.cs +++ b/Subsurface/Source/Map/Lights/LightSource.cs @@ -306,20 +306,21 @@ namespace Barotrauma.Lights Vector2 center = new Vector2(LightTexture.Width / 2, LightTexture.Height / 2); float scale = range / (lightTexture.Width / 2.0f); - spriteBatch.Draw(lightTexture, new Vector2(WorldPosition.X, -WorldPosition.Y), null, color, 0, center, scale, SpriteEffects.None, 1); + spriteBatch.Draw(lightTexture, new Vector2(WorldPosition.X, -WorldPosition.Y), null, color * (color.A / 255.0f), 0, center, scale, SpriteEffects.None, 1); } else { - overrideLightTexture.Draw(spriteBatch, - new Vector2(WorldPosition.X, -WorldPosition.Y), Color, - overrideLightTexture.Origin, -Rotation, - new Vector2(overrideLightTexture.size.X/overrideLightTexture.SourceRect.Width, overrideLightTexture.size.Y/overrideLightTexture.SourceRect.Height)); + overrideLightTexture.Draw(spriteBatch, + new Vector2(WorldPosition.X, -WorldPosition.Y), color * (color.A / 255.0f), + overrideLightTexture.Origin, -Rotation, + new Vector2(overrideLightTexture.size.X / overrideLightTexture.SourceRect.Width, overrideLightTexture.size.Y / overrideLightTexture.SourceRect.Height)); } } if (LightSprite != null) { LightSprite.Draw(spriteBatch, new Vector2(WorldPosition.X, -WorldPosition.Y), Color, LightSprite.Origin); + } } diff --git a/Subsurface/Source/Screens/GameScreen.cs b/Subsurface/Source/Screens/GameScreen.cs index aa1bd038d..55a217098 100644 --- a/Subsurface/Source/Screens/GameScreen.cs +++ b/Subsurface/Source/Screens/GameScreen.cs @@ -128,6 +128,8 @@ namespace Barotrauma { cam.TargetPos = Lights.LightManager.ViewTarget.WorldPosition; } + + GameMain.LightManager.Update((float)deltaTime); cam.MoveCamera((float)deltaTime); foreach (Submarine sub in Submarine.Loaded) @@ -205,7 +207,7 @@ namespace Barotrauma GameMain.LightManager.ObstructVision = Character.Controlled != null && Character.Controlled.ObstructVision; - GameMain.LightManager.UpdateLightMap(graphics, spriteBatch, cam); + GameMain.LightManager.UpdateLightMap(graphics, spriteBatch, cam, lightBlur.Effect); if (Character.Controlled != null) { GameMain.LightManager.UpdateObstructVision(graphics, spriteBatch, cam, Character.Controlled.CursorWorldPosition); @@ -339,8 +341,7 @@ namespace Barotrauma spriteBatch.End(); - - GameMain.LightManager.DrawLightMap(spriteBatch, cam, lightBlur.Effect); + GameMain.LightManager.DrawLightMap(spriteBatch, lightBlur.Effect); spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend, SamplerState.LinearWrap, @@ -355,7 +356,7 @@ namespace Barotrauma if (Character.Controlled != null) { - GameMain.LightManager.DrawLOS(graphics, spriteBatch, cam, lightBlur.Effect); + GameMain.LightManager.DrawLOS(spriteBatch, lightBlur.Effect); } } diff --git a/Subsurface/Submarines/Aegir Mark III.sub b/Subsurface/Submarines/Aegir Mark III.sub index 2d0af9d3e92c323c434384112c96e1e781f9a35a..79c236a1a93f630cdc0578092740f3640aa9b0af 100644 GIT binary patch literal 22326 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 literal 22022 zcmV)1K+V4&iwFP!000040PVePliRk^Ao_i)?tf5utM(J+5bt0)xmAuGA7?i?am6{0 ztM=}#6g@-F=!r&}l{B$^Zr%UBXz&FfNRS|h)M&;!IpdK=Vxxg>bT_&i-QT~z`*@S? zR-0_GNpG?rp1sVjR=dTo>F%$^&p-eCY;l?GFLtZj!)m)xA1*%Lt^fKOEw<~+#lCv- zaGf3&|LwnidHLcx-7h|7*=BLIOE2%z_4;f6_nYlyw%e@!on0={&E+Eda;tu+H~PcN zI|b!RLCMr;7pWR?u{taOl>T_1?fzC@g^%B?v+VHv+2W91?SFU{KU>^fGWEUdAD;0y zuM#d_zZ7p65iyA|W%S2ajJ=UW3Q1o-`@jFM|FT$o{~`VQZoAqX7C*oK;Teh%dA9iS z!!w!iXN#{tJR_1mTkLPs&uXe~?{3n~v&HK2BHdl)<6UfTqHJ>&y<^ck_27SQKmPFS zeRiR+KYU&M_UY5=BHKM%eAhY>PV$jttVcpT?i=YH)q~w+m&H)8(%VD2+EgR_e8_GJ zqWzd24%zPOvtlr&fbX)4!w=7vh!7ejdRhw2>|(p#?$lQz{a?9|`Qj*$@3x<_-K*^e z#>sYzoAk@}?r?i|0HCn~dXe6y7izXYJj40>>vVUOX-cT^^qc){mR+jv0}eN<&EMO# z8Uw!aoIP9I0{n~ZW`B26aFqJiYM)*lR)4GS{IR>s6wtffuK7holjn*0Upak+twMC8 zW~n}Ymu|9k@n`kHF8kkit6g@vGAs1{VwZis+^Jy{i4I?H)t`P+U%I`8<-OTosYR#& zD+sHNnsxE0#^q175YMX5)i>6w&0mYp3NJ}&PkyH#?SiC8*ba#L0e$~n`(!l}7=m3C zuM`2|Nc~sw%6IU+UbaDoZ7|1C!p>|n8{5ROoQ7|(8xFF5T=u0rN~q{3U)aW6Toq(~`2|a6r!ZHr-l@Mq>LZ>jTOX-zP$NJ`oA4 zb3l%S2dVw)YLl-2jQwaA-$1?Jz`ftFWMexk26GspqGB)}%ZSGD5&7$cSchUShtws3 z^@(KI`w4mayn}?%Y!dOPu)e-M-a%4&_yET~uELagC6fFGcn3)%co2%|x6D1%!wDUH z<&{YU`*dK_HhPMTMKCG(ituCWvqxtyF&`UIui&Bx`97ii>GKygUI5^)<4Ub3#9x$n zKk`=3z1HXC&nP1pCf>l=~Q#@pugHwSw|;I2$8DPmFz0 zQacnZ<(YdsY`?^3tr6k%Wndrsba^?x0n-n0QJ0)&)*B@_3HKgNV=wD@neyAv+Jv!^ z_YfvH;`GdWU3Q_D_n4252=g6=N#f&I=0=g8BI{v_>tc_c&m>)PkN7wY6CWQDuUXh( zWQtK@uN^V3ABgxg{u3}I5lX6~5Mm6Uk3xN%?d3%;&r=$B6q@J2gB%yZRq&Hh8FyxhNjl632<4j_?m8L zY24T#IF}sa%10TR5X0a~N2#HCPtMz-uQ=@vY$oVN+((NcTHk2G?{WeH9q zcC2wpl30nsM;%z!2F6EQYAlimQyVeo4>dNA&Cmh~H8elo(Bk2SHf+Y3+S13<)I2tP zCL~cqiz%h|`@`<;;&8VsFZb*Z>1wy%t*)*Q`S^*nY!nQ|;(c7Nf-<}htBZ8~F}aD+|7CmfE^=Kx6ULI7ma(t-goOLQjqJ}9ATe<+QkR!BipkSOx6aRU-A zK~=LuJmDdrF4kGP`FQnN0W3r_G71>S6!MEAESQ=a^)t?4dut$|m>Iqyglo3rK!5D# znyXtl0_@8$s_{3FeCP;RuWNN32!z!jP}vWmu@r(iO92x>3})1^7Q5};)wK;qoyRH) z1H&mydN^eb7iX@wyVbwp`i8|TD5ljuNCc0B!Ubr<$HA(|#MGV!SYYgpgvDy&27m#{ z#{n}5lv-?S%;K@YEX{`y$)Tye(Fe?tg+^}Z;HsV^u;nq$teLB=ck5PNT z)CB~~!_q6eEEE)d;ZgzZ6kQDrEZN0}V~|)UPQ3<+zSa;fJc&tv0%@aV=U92eq+v5& zsDCz6-Y{uI1ma2_=in&o+=~s4W74uJq-K2}6IHz5HO1N*GvWBNfnR&b>;SNY3Md4i zQo@6uR}vs@6>&WPR-4Q1=Mn|WI3oy0O#OguCcD*i4MZ($ACCfIrHaN11Zbn7Ak0!E z3V{(2xNU3G5D2C0se`c&r3|*NVp47GhVoUCa370z$>nxoh?oT|0WXZ!5^5)l4q@cm zeTlWofK-qIt4X%R63z$#K2&pjw|MT*%fhxkv}r|^7V5w!-R-uYe^E#kg3efp>O_%m zV0{P7Z{ejMSDXDW>Bp>8UnbKT5rqYSP=~b+5E_TyEgedTk&xh;jC+yT-rS^{OA8A| zs(lEig$4o0^kDIN`*~9UK!#P|kOdN@8;NXlwc2DElxMIJL3OK{=l1R(OsGxOQiBd4 z2}8yz<*|kkKoP?gN`@ImkAoCElp67k*(9RUZnh2&jm~Ni%S$D=8g9IFzxeO9#EeBl|o2@V4?81T9MuIXT zK*GtTA5_Z;&%`*FphUIi5ZZtpq=FK2B@yw$(b1=YydoAGgNtc#qTL@- zAJT3=fMc@LxD`Ox(XfN_q`fx*j_CHiI3&VtkB1&V5@8};r5A~J`VQLol~_k*&Gz~r zHiGeqaYShkXo%h2zJaLaN|oB%HxeOSgVT>r!*_^{+ez;LKqUcEb@&0aYsTU@%d`Z2 zxy-#Yo%Xit%&2LA+%bh|P_b+`ohRZGOigV%gYmYzT1bxEqhQ=&@c$*Sa!< z6bi=j0J*A@)cbs0El@-aN`Sx2*>#4iN@t4fcGdQjC%sdzKF9P$@OkgBoJksP*WPO9?Hri8Y5QLoSSnv0Uo!;q!fK<9m*Khl~{Q`G8wM9 zlp!H()s@>-DBRzjSW+(c9qOZKzpys;6tmnq3V#hiblWm@07g>7-1YN_h_UuNp{)zj zL0gj;flY1(n1tFj)RPurJ#20yfv;OT3WFaergRACyO4wo>tQQgfCJMx%+pNNx0UwR z_C4*y^bHf`E^OFLqWeHtf~cu|6FkL`)iMN50l|d3;ef3nXaPJF6IwqdeZv?E>+metmx=w#&<&C85;LkAQ~zvUPfl$)cYXVGl4Jw)vm{zRl9V%c{vnGDCoWSw#4IQw3W+@pc{=nAkE8E_a~R zbSNQ9eX2d7gJW?mO8E9}y)F;m6D^6&W}C% zt0i6h2w6KN!DZdX2{5b#~Zp(!+LF1_`Xl76v}(u~wUcr)jYIZAQ!599du>`k+1=+JQvZ zI8ZjcZR`%XOy5{Dd0w-=HTykXt*?}tdw*S77|fWP`K2Hc+E%BzTn(`ow1h)&H3}JW z2~HbVQ^-(Ia^kpJ>AzH*4z5jun482{@DD_AapCAzIY;Cakf5i41bcWSkQG&vkYYs0 z@lR@q2?vS3s=2cuA?rv`9Be&Jh(uCH0?S!k7_}CL7$VGH^o^CGg(2;1mZ%#g;-Yoo zPesajnRH7P+4>Ut@xHms*0pkG*2O-!Y0N@x0N-j39iP?5?<=u8@%YpVTyu^_m7KaK0^(s2 zAXean5E3cL6zaU13IVsw+VFy7_d|eKcNy?QAYigNmt1HA>9`1B>+bS{Ai%9mN4Rga z)M;`@MZl0i;DXfRm%`0_$+X?0a{NiwF((fCe8_8dfR49!duFv2m8w9q@s$Q0X&WRSf| z=}cx;%h+~5H$kIhChguNwKXzN;2wQ&a?E{)Mke1FA)P~btdXfznHUKu3c-@2kvg{6 zOjjV`>{u+$xNXNnB@11D@i=2A)|%@^9lb4R#*Y0?okefb#j88;-jxacNzHN~vmHlK z=W+B+y55JJN5g8Vn}ogWHeK!h*lxQcbhR3o?MZvZR}ShcRq9?XW6vFFd;p|{ObA=q z;E)eFMWFLcr|Id$Y%36rD%*M{)DZ~9tUNzT5Gb3osYkL#MNzg^~;Tn|bvBMhPD#*zf*8=c8DH@V)d(_L03 zFjpsL!|4<i? zzB&3cORdJ@8=OC?Ic~oR{(qZpF0YloS-jtFs*843dN7+vUH_h5ra|ph?f#|X)mq!M zh%+sI->}hXOp7|xn!+(~WXjTc1*OTevR0c_T{uZdv_yS39iR200j0Ar5_%I; z#L7|(>NN;E7C}G8{5^-FUFtpDXHN8A`tq1trob$Dsw0)CuMuDW6e!0LWi+C?Gz(F` z^WHC1p-*`+HJ(INAoWvB59$dCoXf7>B-l1uSjA;foR^uuH!ZMQOLhQ3!f1#ysC=okp3(83B$ zXeuV)Y8i@%PC2C!h6>0W-s4Eug;PW$>N^aQ-F4L;q^7N&#eI3UZIiMr7^#~)kb4tK zp&Sv-IU>SL{f=X#X2jL*P`idfDKNN@rn_sZza{F6>NOB9=4!jCt;=KeM>b|URyK>! z2gmzQM_-|Y3Oh&+)B3b(z+4pmEC!jy7`zhd2MSRo5u^ELhk_J}$0*D}nKu#B<*tPK(X$dVPih}J z7veUqV14C!`X|HVLRw+CuK-+w)ejJYDzd;QjL?V>Ae7qq34Bvc0cw&_wVl8vPSoG= z2>C`#DKDsZsz}qLLIY-_B$bf4JWdo|99j-ZR=h{*Jyq{zK4W0BLLG6XdT2a`Bqk9l z(VeP7Z-{nGK@|EiA+pky=06&jpJK&ZYWWjB0&UBc2lSg@=@EfST%fg~%duVztRxjK z^*sX3gUcBaV4y?>6=iA@QC3+)LUFEN?}B>b@SZeS%V+4bQgFzUw7Xgh9Nas(~^NTD0_;3+zY|M z3rI|gtyIc8_>S$7kh99Pfx=Es3_Z*3z+l&&5_Z_M1U|;r7_oK5gX3o^0-8pSx+x?a zQbyipCXdJ3B|P9pE3<$vfO>1||Q|>acFV{fTU0iP|Q#}r9rsr`= z8;{p+H0!I|U-DAZ`bKkM(RJQvM#YWhU$cwrbhEl>z0s`ere>Fm*W0pq3W}|wrBqj# zg+HuUo4<0E*W=2lNDUyt$#k0;H&aFRk%dx*)<`*Qudd7ua{Vz(Wbql&sj2;#{Rs$s z3*dJeV*3F5?C|IQP^-eCzOlVKSYLsU|5Se(S*WFjM$Afz)?qGWQz*uv?u!#A5o6Lr zBF2(aCy~_z9ZI6x6k>hV10M~6aO@+H@hO}rfspA@nakkBq7Wvb1>a7bLKqie|HgM0mZY+qND@yG&%HvZfL?V>6-7D6 zFvjYG<)WSH_`?^QOm!fKTLf zg{9XtlqV%KZMv9bcWrLy<`0!J3l6KEwlbrF`F57zr%9MZkQ!Y?Z10%(iRdrFd^<*G z!ki*uh-p!;3$WCUzfsot>CpwpC%gK{Uj4eXil2xR$Z8rXMfG&0Y-q+dT zvCxIo-PpBH3t6!6kp;_>a`(JV4`p>FWTorVgh2~C%Mlj~ zMXD#_FBQTk%!D{8f2r9t(#oiSMt(KhOZL?-cr1jG%(rbMJ1J>qZJWe2np+|X<>x4D zq>?sCUq!~pLYst-vA^0Ob%$Q>PpL92ujANuSpJ}oflk~zg224hAhCKHyg1&c?FNPI zk878n|M}7h=zCtfZM}~dUS2=$$p3Ke?eIPdO1R@u2&DNQ1+&WcXkmo;r;EFv?HE@d za=M=FTB*2$O657%eb^EO@9u7H%f4xLMPewHr}K-=2{|~I4`4dCB}m(C31a)jjwK^B z8h@@ft$SP7FAJ0soyUz~uHw8QtWZU?tmHrd@_m##mi>vg)%rF}tpQK!^u?ci+-TPL3?N z|K+Ihn6GS6`f<0qFx|D)hO>%|NH(ONg@N@*X-AMa0owIY>{qoG7wLN8QjVM3kIN*% z17z7Sx*biRh0{$ka{6>D+i?Ss-FCe;XAV<88!-qu@KC}TQ1>Rts3!H@nbLE)#X)`_}5KT+& z=Egx`O`60g;qBEjqR#-VM6Ovf5yo0Yl{T)Tt>xfkxMHCYB(Sz6+QV>_mY*1L zt`mCPt6!5L3p{|iT2jPed36=VVaUezi5w|p#azfrz>{#`0{v27j~jxlNNkoBu(HC9 zoKJ=<;~K*knBuxOpq6ZDc)vEs%XgqFSJ19GJe4a2tz6@#m$ttEN8(y7#mB<(S$TApDE<9c%eHyJrKL!KAkAGl`76Q)$SlkK0PQt+i+f}`8=NHa z1xwfqs;~wJgkEp+Vu-9Y6$x+xdAZH{1Jj|cRtAuJfs~K{Y{7EUxii7Y3X4Zbn@F1! zU7_TJW)V0nS1*ngUE=GOo%PqF1;0h6SqM$`mG zo{ZzdOROV#zzwoIEWw!s^>&=HQMNl_E0lR(6~0+cAw*d1e&QrrCUYukwL&_e1`0&EN2ueE}d6>Xk2N0Pe#SkUT)^mzsS83@b4hci52M}I#)*aO5UAShYQ7O` z(_HsI5i1D<*$qTlg&YltK$%-q&YPsWxpjnWIcyNHf`B9(oM9yg1+s-n z$BChR@2sJQ{Jf#igu7D%@w5_lpc%TDHONrmsr1qyJc(&_uV5&nse$KIb_qyRb=sGM ztR`YwTM{869hRB_yTTbf&}t&4TC6hQNkm(E=T4O`CpKwc zkY=E{cs?}MnG=+eQt*S65w>b+CXtR;%#NdyO~X($cf6sk{JauArn!IzV|svm$0l`% zaHTEhUPr)@%3&xHR`W6}`7DezOz144USF%xW(Vg*jLeGm^rQ#G|UJt(aZ z*Wx2>e$rzm=VGg_kWJOthAvQScc@=q|MBmR!Lgdzz1hv>p~>eF5>M8 z4^w0g@Ott!a6*-#Bk~K015$>iUA{mUx@lzQ&z9g^+9U(8mG%jRM5v`p!9=-FdGeu_ zSp#m#BI6BTLOH0VKBUgKoRsl`V;LH#gphqxPaUHoMCajHFglp#S6IwE*9A1d5UFKf z=R=8Xt@1b*u9ObL)w&o&u};FDGm+C`0h*_z4nfuG00OAai>av&#KW$2I~75gap)_t zL8E1J`%hF5B)=lBRTsh|FjXd@Sy>E4*^`ND0}aFm)v;-`dpIICjM?|S+wQ&}5gAgu zJRNh7ad{+caBNvToUlj3bx4DzbP*2oJeO?4oa9*!EtVJl4Jy{B)3E*6l(9u58rE>6?hI zB~y+SzQVflOw@UnCNq_df|wr!SM-bF#kj1C;#4LPomwc{XliR#qdBy69I=|iDDw#F z+@ZN@^3`OL93g#3V%fC17!;jL`V<)E#h~=dT!3=(5>7g_*Ms$Yc3IQaq)!6PmqX{E zf-DY&LcF-`LeH^Kku_AB7R=F5iH$cLE9uf&C}xTa4WNG&AL)eLmV)MhxY|N^pLtV9p4uIR+O6GVZ6l2PY@4HPXr7!3CN-A~RJ?5IvN~l> zSb0qf;X(JM97@{7_`rpTW~zh&H{OwU9O^vfUcX@-O@i#g6W}|H=P5LkqbZAW6aCh! zgQi`-4uRKYmMk_!>e4Di#Z~Kp+9kGJv9W{_`LkrUwB3}`39G&9+Nf}fQGjJNbD^{b zQmA%d7QEfadH}5A8dk0L*0Hf-b~zq~gxbO!%1p<7bS{bn8HN^tEbx+8xc}A#4MQVnzFil zzCQbwFM12nG_bX(O?2nkc^0(ON=r_Yc6r_FNMlNgYR;4gGm88a_J?!venVAZW-`ZCc> zf(qjJ+H(kN+Mg8NKvP<1;)o>^hqFpFfl+fbVOfWwnb=+w2`RhtHBZrMG%xR|6LtqT zPf2XEQ^M}2jgDxOb78rn-j zBfv7{0{V_%#v>|oU&D8e8JnJQx!c6}_ZV%>y7ASN@lDpV((btOfyNc}ar+v)4;r>= zS&6OwVHC`CMb${{pGXIi{jDysDYFMu)Q=&8rRTYlDKK2w@G->_I#y~d9HuZ&3;)v) zk869_bmz26GQuGb@Jv~*z=hz{t}8QiFIlD5-xbjz)^Ft$Fi0^a)XZXezH5JekZ z-zaVu-40k~4_z<9$PcQ&VW{0{w$97~!*yt1tJ&%~VsxB-4EBp8zQ(rI9)MGZy$3#} z>%G|oSaH8HX#hxM9cc}+I_$*fO}KN zOBB`@>He_4PA|8g_vNl%?O~Vauh;NsInHx6>H0rSkrC9k-Y;1mQn0jdQr_KzySCrA zS6A!IJIFpe{JB>$+WN+zw!nrXL_McSMtOI=Ad|0$E94lah^v3bGliEYPL3snsht+e z5^Z3lDP7tN#;{I1LgGG(q?N^pCgU=b!t)v+unv);MTTi zXH_&GQ{Vxn=dqZAn4>tDG?Q5;4<;raj~=3?$Ia>RgLax5exQwlh9miboh3v7N6-^g z8m`XK~9h*?0QLxCC+-|s4RgxJdqE_5~eE{ZtuKy zK5Wb=CBl8?M`Q_;^F%S7jwjAiB8VkU@cc=!l?IpamZ}D4F)=GobhsWLiYHL5e>j9= zTQ0rEzcLMQoI`Juf7Z~ zfY_ZcXvSn#I;c`}y4=vrBVxO1Or$Se%spZyxFKQbD9dWv@d~(Fe2ir^ku}7Rv#h2J z8llkAZ}uUvY3c&^H;%Ec*y_mwNvg{ujESsn>!4Wpl>GW3{rYaZQXlE_Fr=M*$u9*e z{`m?8r*buxepX`tRl2*{wh675o6AL|x5{|GRfR%AeJ#?sx7Vu>6pxc;)T#^7fHczz6mD0mEL^RE-pt8RdnEr;eK_^E_R}A6(wg#z$Jk~6+#VV{X(hf1 zxJo=C2StH3Ecq?5T06bE{k(%npG-yh*V#J#>e5~$*3~QlEehJQ9(#zdAsg~v!doz( z>9-|yJb8pQURc<%6TYl5i)Xr7L?G8+*Sp{K)7sc0M6LU-J&W_HPmtqH6JwgKW21C+r>u0y@%+ z*dJ%JZj@Ok<8U`MxnkhbRQXX2eG@vzk|;Jou59r4hac#oENcJYa`*gRq4wRxz7-A6NyM|n-pE~>@C z_F#6O6^Gcd4ae%F?n%nXeRpmT=^u7S9(OBIt90CXHSfKen4MR1y46JTz6RELHO*?q z_`I6qR`a)A(`9mR+yA%S*?OGcdTb$`-Cm2wG(y8u(9X1bDB6)T?H()b?AnxP+C4Jb z*|vjVQPQk_c_!TnkWS}DH_v!>h(IJGsOQbOc2ch2P$&- zEKHUuN03!G-Hp92iWhHsiZdP@H>+lj3g!1!y&5>cHp19)w`5;#ciDcgW#q|- z$YTU_{AXV{%T6gbasRz`-F5|Y9~TBY0=r9dPW8m zh?|SQTJcKgR2JBW)u&a%e5a=0mTuZJ+jqOa}`|V-mRt}hY4_hbX82X4#N8)cy zOt+Db%5kMc#_i#k>vVUs`0?)F|IP|`uZ&IkFAl}yhNqt#mvk_jmdy5(j0^?&wQPb9 zBIZvwnX>XW7hf0e)g(40J+1f<9#z-(Tcu|^wT9W|U3Bm0Z#Ya$LyuJ_Y9r$+YLj=0 z9=?q=*p8UZlMu{9G^=#mfJ|JONya945ADT=@6>ZyrU}b3_3Cd=4VwYYV#3QZwT~3u zylPPSrhpCNn|oKS8$YzM<(pcr%E?&NHqp8M;r;AUiN>8NgBW(wQb-B2GCO2EPU)Qs zca0Ky37@QRSHgV};Dm>FW}Bd-SHdSN+|}iGPwXVkoNb3YK0E#HXPlYBOjs7}XBgLu_8+u8XZpt}YcqmYKyg*a&Su~r?+%CUrVJES!Fni3KE{cwus-az z>vgv4B>6j568YWg;;)Lt|JtN?2R)bUa`E!wBHQmB`=JheESpVze!wFt0Umctdc>Da zeO#*^OO&)4eoP4@|Ie=%uhQLRI}iNx<-h)T``hn7|IeRZFJ8WS_0#+JkAnx~<7WY6 zSMf&;(_7O_7mg* z>$)JzI4IpXq6{c!3J z&(SzN>RYX)f%-F^0zhT7(f`%<<|f@-E>cbUMfv2T-~luuoATs%04GUJ{-1eZm^WZV zK;-mzKngo?d{!oSiiRMLeF2X~BKV_Z50lo7rP30*YvwG>k!`M88RMtT)oPPvyVd6E zkxGf-c_$~x2F6x|-gIX+7|sSyz+Hf?_RH+d2c!4^$4`I{kf|y`IX&~i7so`ib$V(XJePtwQ89w@QS7F5paWO$P7!Jh;ZSVhfQ>FzE>TuEUu-262ac5d2o-QLifgCkr%8Ka-C6DKdPd`PaK-?1bkC6qGEI_pg<(UVD@xT)h0}L54Kxsty zY*{MkNoA>E`2>ssW*Sive5QRk?Vo_~CxqG?f5!AQ{KSa=1R@KB5NqR~X&*{^@dVsK z#6+1OpInakLe)PmgN7zYWnnwbi44b!u77*vk%350|byGeG=1m_xdgP7n6#0L^)wVc$242c}v z$mE-5f=8+jen~%O>#}y0={Ux49wmy@fuXN#bVYvvtKlsU*_Q*9^-p!Pg!k8Xhs*6} z#cJ^P0!SRef7RCMM-N+N76r=16rk59ti0&`Yje51_zOO|A7VmU0+d1FAHgFTk6*W+ z)(Y5eyIEcA?~9o+?+AhG#bDy!gQ9O(!>3*ld(}49O~XmsF!>X8{?8 z8pbpHb5Xpyv{7njiC!Kv^ZS6zu0aMWy?=Qt(IA6oI9*K*H>u% zvbwsq8fop)4d^_X>&yLNf1Rom^1jq?d26~i(5L3vVhxX$BR^NxZ2g~5En1=SZnwR? zTkqB1I~C@S=|Qc@*Tt)By)HFoxzMG`w7=7Oqq8xVpI*p#)CW^6sZ(r3p2L}9V<;xZ zQjEn8#lTcNQ*3^U;n5UBb&6pzz7z79Vgo3av{9@w_L=QkpwKT3O#Ot?ymwW@+_xUI zZF_LULE$;BAYcdxbv!7n4sA?52x&!$@SQKJmRsPM@wMDqGPsEvgLf;Uvhgf}5R3in zr<@1MeqGR*8w2Jv_qsNZHa`L{?hmVr#oKIslNII&N2X?XOqeo9pv3IJzQA>h#Ivp5 zrkl%)yHB6?rNhy*iHIqQ2peo-j2u@y(75tA<5sbyoV?a-V;rGiLoT}5-bC-H@p`N- z{^}q6joRmnpS~QF!FspaUss}&*j3wfb09u}w);K1O;LKZF(F$IjhUchgr}{j>Z^u2w@!}YBoNsB)_mao#B{jO%dtXM7!v>9;EdL z)gapM*z+9XR^=MSjyi!g!F`Wm%WVaZX*ByEDPDLl{!J>AQTP1z?Wfxze3?7Ep*e* z%H)50cathkTwPu$Ga+A9otpTc+mAmy`&F6x7wLNOdV8T`B~515-%yshvNArZU!@%> zNqvEPlV@syy;j2?a}h};w4`L}heT2+G0VC78&dDpZ>fHRnBnTPBv$XG`cdB(NJ%dE zPNIGk3`y1B`i^~nY`-Ym*qM~$=bT_tQoux#D2WwUFHXmqhActj;@jHMU|^AjQ=#mc(6iG-7|;Y+7!aj@f@|}S$Dq_i@4rIL#0nGZc*c}|;K4q)08F|B zLf^*rplfY#rfdh^VBph2m)6f}BG@PW5a{y6a>G$&4xKi-l3M6;I6F+akEcghSdAE% zGQUn8T}wtWWq_VKy0#$0@#&!Z{-A8D_4eQD+a;>R=3C}5uj1!Cp$Ng5J5U?vD3+0r z3iB`}-GU~q^XsXi$?AN1s%Y{$f1U)Iudda|YAe0{dbv|)?-JFTeI((K-ny0I=W~XNM{Denco1b=H57#@Jy``lsz@I~D<7Dxisxx}R z0h{twd!S@eyezfA)v@?w@FMj+b~1R;x^8+Hyxy!nD&1bgi`Dt7={ZuO6EIRg_&CC| z1xa3Kw$nt?k?yC7q^z^y2_X4uyW6dP`16AR%$n}qYicrPv0@I(-xGG zFo~s5cpQ6Oa0;DS(clgm9&hN}Xb9U4=y#mYjfQm4I1*8Q-l?PhyY1)8GRs0HiDRGf zU@tY`ao_P1yK5&WD58BarF)J4?s~hwz25Hb_T})lV1}fH*d5+711Ap{G||CzJ#l1o zwuf}TujE=1+fgP;TX;h&h2m#sT&P2+2A|A_%lo_a?e*Pmb+LGPvAQe~Vvfzx=o2?5 zsoGKEj>UUalp01wVqbyN9xK{Pvj?+!l2|$jHd4%vieTfEn#7Lf-Mno2AgAX9#dSIL zKzJRl)6KTLD2{B;3>0fKq3XhknwLE6tPC>F`=o=e5(qwU&pWv!m=h z3}2*UwoH%&qx$*p0Wh!wrwly=26j>hWJw$WgVuOTg58j(C%676(VYalkdn)kbcA>D%7fm)rGrzxq3y087WPJ^?I$%?^sLuWYIsSq>?XONx8S zXLqEj=c2GJDIp5_uP1fkZI)i{tE^CL1Uu$%D{lCOtJSBKk=z$bYizQ$dak=TUC8}N z`zmB@l-`v}h*csb^eS3yT}&4oZOq3#cMl%Rvhe#Zi*+f3u!xMf2YHg~LhidR#^%71 zMhFeAo`0I_!UnGkR2+k19z{7cy*kXYMkL%|=`EE}ElUCJ-F9bLg}S)ZAG>t3{{*$A z?pGY@16;|g-W{n_)M0ydwa&aBE5`bBe*pDTeZH_7&eWO>EIO)-_LZ1wuP+sM0;!if z1tdGFoyJ~FyNcqwqulPcUsgA(!`DCe*=BEU+$;jhU6mJx66k8~zc5trB_-}!?e;7L6c zOTvZ%+-gG+4`>9DfG@?JkgsqvKJmllaR0&v3n{Pm3}Wj&f%m?}(?xu&VV4LY|F|MX z-j!h*4$`fb^}?_YKqyY)+6+YOTNwS#FZ$ka7-Yc2f~)}0+Tw7Yc!$c#3zqkoNpwJ# z^<^f!i@IP<*QlG+Cy@9jkW*nvpsWr|fX7|ziDGvGE+0`Z-^9gENPEa})_By`Li#sw zE`P*0l$E6OE{4dNQikG;Tu$+?Mj>?KFr+mmb4x5D9#WHXx{Y@B31kTEyL_U;X z^5#Yel3}yZsCYJ_LsTAj=nD09;V28A$kyMqY1#+aYcp_M$FNhIA;f($M}J~t)CZ_R z4wuQiGAMDFECA&?JEOpn^fzrD>mErX)(!~gTM)CP-yl>NyB48$YjaZQrXaZ36&e10 z%nRG2G$p%@Cxq*3%%wxj#LG4q6}ATt8wt6>iLm-m(n|!w%Cp6oIjNyVeI);0K&4g) zGCgZk$VZaFBLUPEE9&J^Fwj!3O(7r2Cj|8;z*>QGuu;~Ku~%o}e02g1bB#!y;$C4! za<&zLIAeD;h!t0APrDT&v}XT?AWa}+cO7JS@g z<)K~U9s=5B7UE??Qov5eVT};=o<(SJ?2&<3lLlz7sG+%vTJk`wsUw;F@{*!ztqU>6 zG3iwOe&a-zOB)194_%wT|CqW~tQWF54l#iW0Kl=XW8C*f%3SSEoZ>2JbFB5+P#G0n@> zNeVYWk3~eimK80pjxNDbCuSlb%xa8qT)=g#a!9OXb0}aEPx+0BxcL%R_M-bK; zl^ST~Wi(d$pHSdhyW53%#U(2jBo13^7P|}LZWsSas@N_vY!b{}AB;ms!i9DbVRPc% z?ZU9LUHT5u*pCx;_DdfqhTZvlMLs6Zh6zElPDQV%=FHhKy|9Ukw|C26cgys_=B}{D zUc51L_DnC{?xsQhV=r?yO)qR0Z{oLiNqv{}x^3#9wE^sbjH?wH;g?Umt3gm5Zg(_C zNC&QW$FP#CSxC4>ecy?6Ii|nxyB1l&hk@fb-Usf=CGSeHoNq`RHc*^22lDtvi?e9x zO4WJBAL&9osW_bl_|cH?>M&7SyetS1cjj(8$~7^))`KY6QKvxl4}@Ho2(O4K_*v`!73e_Kgz6pZr=o{uUL0ORrLW7_t z&H^O91xWG*;9*di1J$Fq z*r)Y*sq{r4TxVNjFOMX3P1Fb1Ia~XzU0xWw%TU5OTZQ&8!g0Rdh{4{=;NsdW0KAFwOaeVeTe9^y(i&~A*KePPGxbRgd+E6UiS83=a|ueQYP>z>j#0oCzO0(xq7?Jxzbi9nvRd74g_c?X8iZ4FL%kW$UmvzH+ zwuDYAt zPH_T7ocR<};pR4QyElgG=Vm_5RJgSb+-|VWe)BmedF7idz;+sOEK zP9MGuJYJ@~LR!hFR6jSV&?i2ML|qK$qT$h^dQe0UWU)W_ArI@6?tmk(wLw-j;L=t`#u=`!5@d_g*Uj|b_3%o%>a&lY6hQ1lDtmCp_x~W953%c#ZiXIuo)6p z`4Q=i#2q&ENue@Vmm>ej>E&g%+r#?DxV~LnjpgD|Px>Go$t1i?)hrRwf^#$;4pZl` z{nl}do5Sj?kdKS=dX(0Fr~bZg`4%CKB5lKhMf;*pNQ1C@x#86QcJPgC2y~S54y| z8uuA;&TJo|6fVdkr;C+B?jCfGk6y*+Tp(@=k$eC6n3Sh{uiw zt#n=60HV0ZT@K)x0de<4tBKw|0ICh(r?R_7PO4X4s-S&{;&PwPDQs1f1-ClP>YA2b zgHDt|zj6fch7b)(yIC;T=La+d63& zPaf-Dly{QLrSfqUr7peQJ>eapyvLe!auma^9CzFyzT81k-2Gk>)Ge9vp6nf}BG-}a zW0YYmZz_@=LNey^tmC%!8IJ;$8S;V_3`MPG%GMYOuQRP1?W}2v_lMox#o=z3l?8X! z+uQ8TcK12m6=k4Jr*X-6w1jrg7+NOL0WeH=ZIR$;NuW>tP#D6%z*51GbU2Kvgq*Gh zy41blhr&p#&g*fs)Ge@w!Z7uYbvI7k(mMpmkLg9xF5OfoMuO|EeM145cI&!gFb-Qz z3ji?y2!@WLLjlm*N(x{K8r!|Z0~XS7Cl!jbI32tWruHF@^SbN0A^QLbrZ6E!P}Uy7 z)A0}piGiSyfMWD|J;Nbb1zDB(i=lWdw4}8m{Guhm`@4@fDRhn~+gM*`i+`>@eq2L= zt;=kGv0D`dyj2Kmo3sOLm>^uhkBI`O|BGUcF?mq@?1_YbiM)=#7+$fyA4aiV&Yx z>+DuZGAKx2;JN=_7K+dJcORkn*j@+V33|?=rBbxdEuos%Leo=jS+-YDT@C6%X1ljl zp{fQEfCrXJHmH4JQqqP&ODvJcBlzh9cG%v2PS@q*RzX!IV31}=YioF(Uu`b8pUZlA zB?QGxNJ(8Nx@EL{KLAr)R;@%3fUd>mwZ(;PBID7EYnOFah=J6|e|LaeXP*vceXWA? zuw7t%i3Su(AZ!&QlpuE^rk1CZK!0bu15}l@7n#<$LXqBf1CF02L}wfY#v z%tO{8B!I?{=c`=*xr6nsJzY6zrPkh z%r2%%sQ^A0HgX4$i*=T6K3lvdyQ^y(2)BweD{f!PT)Wk#W7oPg zwH%4H4kU@Jq+ZC~2aB)2sN(|4Ix6YB+AB4og!!Ai65n^`V_y}<#RPR27p;{Tt&bO` zOreRYH9x`*(C_MX5*NOTj`gQJ)fDZ;Xf1KLu!|hlsr5l`VWk0Kkqe1p32YQu*SX>7 z^DsnPZ!i7=`b9FmR2Fv>NgYhxUw(V_KYn^WoVpsXKUW(MeN9D!U?S>e@PU)v;KE25d>DeVx1c#d z`T*Qq)-WPd}w<@h;qw#&eJ z!fJ%y)5~-h1mx(_vu}UVLHkRs*!BX-@+yEGVzT<$7q?Py=U#M50(+r;?Sh*0KpiZt zi;CNh`)NtQzzr;Fy(lVJo0{87T<3V{kdR`Gi}W^y$!WO^@2|lyE#Ijz_51y81}Yo} ziufr7{Jm_hoD2O_BRz6?7*oq0OU=gui@sJ2mc$C;mP&e_nPoy|p~DRE9%d0e5^!>6 zd3(2BJ03^St8m;Vgy+ZY&&tf))f9&Hm~alJaa0%ytulG<3_rhKywbKn&Is>TxhB(W@UMTq{MR3EfBXIC|M}DF#miT(etQ4DVOqPR z%*~5+i+^>cERYUvbWb3`3TI)pf>A;vy|@O}(Hn0nTj2Ze$`N|SmdzTruYiET_jH+K zh*>p^FI-Q;6X1)wC+I25j2YRYp}ZbFTcDb2@yr%u*n;&Ph8`VT$jbPY@tG+`F-7tu zWW@)tNf)m(Mf*ePp2l?t*OHDfF*Mu~tc}^xr+z{#!<^HMeJUpYj~ZUq`#MeDYeW~X zuCt537FGYT!qr_JU=opsCWewehpvH}4r4 zAVhWqZm|w95%ew_exfee#(M@vaol|fcHw1*KlA178dQDBUif?QwUq&S6c(*c#|hWr z+DSPyE;~)v_!Q}8p2+1^bmmrv7m@}moEWnvlZ(@rn@g8P39rZH@dy>Fz#8s6tZuST zJ3XAjzeAcnSykK0gf6qSe#te|g80wJRQCxj|8sk2FiKKql-9=gJ&dBjHhZ;y8}xq| zqS3hK8y>T{C#KnxQX#IH+@eAT+TF(x`P6t?L^95D_DTHMFY&)!`vV0NyW0RUS|Zf> zGtQtH$g++6sQa?)@7X&2+E70x%0)%glh@S7vKp#k+MD!?j_B#~GCF1n!OJ{edG9Fa z>FcuzBCB4h=tkieqhqeqSx?Qr*)6-FH*c>ur0n;NxEV4Fe{!0=xnloEeJ5G}PIjO4 zd=1~r8fo9fCg@CMZ+hZ+8$VDwm&E_84}%StoH^Jr>Q{ci?cH?oB~YFfw?FK!)64DWeRW&GRx4|Gv=}LV9;;(D{8PPZYLtNqy{FIO_q>7;BHi1$ ztHpia%m12E!5-EzdHj7w50`ef?-(KKH+tBq7(I{bXx^9jJCMsBnfc?Us@gN}OBHzV zL&fDHC%JZHnM^W5TYLglAgs2pqR#-Jh2br{V2s6PdztN_CeaJEZ(qPK`C>_9^(!QS zdwrK#sA|cT<0@FxxH|{>gSSe7q1d9By+DM&KrwwG@EAl*%o1+=xk1b6Fa?|P1!7pE zn*Y|Q2jE<1gM`^p)~0x!h7Dw*)>GpuL+D>eQ5Y4#p;QQ)2}xj2g{9_F5<-0kO>;aa zJmSrO^+Z@=wV##=FLqPDtAd!djxI5)N>P-|gsoo67xAFo@5m`)h0dTb%53B(NrfiJ zD~ve27>=;H!4J3n=8~)+r=McXDxd8LfzXtONGeIsK1G>l9 zbD$mIHHwGtIcA(KL`GsRHCFO;sKj-+fSE9i;$z)=cP{e)W3`x!=lomzMmQdUvk?~w ziF7CIxp2-=RH&jrOU6ajWaA`BL}tX4$`|VYpnT~FbCwxHLGgOjuxF-RQoWQK({W2` zM6Xo3jLm7#;(Srzx5jxa8*u9`goL|!WL~6Ef(xwqi2cQ_3q4>iG|Zccg#s)w{6=iJ z$;hqJYBL(Rxfwprs^vxoP$gnXGd*MSvx3zYH5^S-GEjg$fSUDSra#lD-#Cr~4FZQv zrF9>XlW0k2l&&}i6$_#O#K0H{D~+PXlqqcIGq*}4^IbI#Tcctzi)Y4`$IqEEZ}q?V zLWc+~$7f(<7J_nGvz;N71*=vz_r~O&4rSaf!AL-KxRIDtiXn;Tb9I#HRrrqedQ?12 z*qlxe&&LtuJTveWqPx{+Z^(vTtFNK z^;FJ+>Gs*X(N^>Nyi%4@Y}pzNSkOjlT!_MkR=Jfs$@hW2i| ztKH_&rNaJza_672-TjkDwCy+rk4#+WwOI;bR5903b__@)@zjO&pzkj$+;aE2Cw1d? zxBarZfkKG;Y_kUw`Cj7gV^$WLHuv&5)I$gRC%k4Iz|_DNhwRHC=l*BO-O0A^(3|TcO z2b2m1AU$e>w22Hdkrg?8y8EzvuOO|FuTGz8fzpaWskyq!Y;dj8d!D&mUct1cZU&X0 z1YVh&H|8p8J1p6H2wQm6#qcWC({NBTYkOi2LRNJz@V(E#LHq&K{+fta7>tR-M3502sHGtJNF~+HKa-1nM2fSTRh|{u1+!p7$tryExW6 zxz?JTlg@Eb(GZTJ{$cH2(RqV5KU7(t&JweZ_Vq383jL518{a;-Zc91hgV^kdYrUDmt4M935$tbvjgFxF{3QDPTUE%(aF^hw`g;WlGwBL%f7eL?Of?}z4fy*67?|% zcH8WR4$?)@ayN>+6?Tzr;`TD6qH8o)v~{do(Vo$_Y