From 12931938fd8befb03c0b9c35ac8b068bf55b416c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 19 Jul 2026 03:59:30 +0000 Subject: [PATCH 1/6] Implement FFB/wheel integration: Moza SDK, ViGEm, FFB model, config, runtime --- Config/WheelConfig.cs | 86 ++++++++++++++ Contracts/IVirtualGamepadOutput.cs | 17 +++ Contracts/IWheelFfbProvider.cs | 17 +++ Contracts/IWheelInputProvider.cs | 17 +++ Ffb/FfbModel.cs | 84 +++++++++++++ Models/FfbCommand.cs | 27 +++++ Models/VirtualPadState.cs | 29 +++++ Models/WheelInputState.cs | 26 ++++ Moza/MozaSdkAdapter.cs | 183 +++++++++++++++++++++++++++++ Moza/MozaWheelFfbProvider.cs | 127 ++++++++++++++++++++ Moza/MozaWheelInputProvider.cs | 106 +++++++++++++++++ NewStarGPTelemetryMod.csproj | 7 +- NewStarTelemetryPlugin.cs | 18 +++ Output/VigemXboxGamepadOutput.cs | 86 ++++++++++++++ README.md | 48 +++++++- Runtime/TelemetryStateStore.cs | 28 +++++ Runtime/WheelIntegrationRuntime.cs | 174 +++++++++++++++++++++++++++ 17 files changed, 1078 insertions(+), 2 deletions(-) create mode 100644 Config/WheelConfig.cs create mode 100644 Contracts/IVirtualGamepadOutput.cs create mode 100644 Contracts/IWheelFfbProvider.cs create mode 100644 Contracts/IWheelInputProvider.cs create mode 100644 Ffb/FfbModel.cs create mode 100644 Models/FfbCommand.cs create mode 100644 Models/VirtualPadState.cs create mode 100644 Models/WheelInputState.cs create mode 100644 Moza/MozaSdkAdapter.cs create mode 100644 Moza/MozaWheelFfbProvider.cs create mode 100644 Moza/MozaWheelInputProvider.cs create mode 100644 Output/VigemXboxGamepadOutput.cs create mode 100644 Runtime/TelemetryStateStore.cs create mode 100644 Runtime/WheelIntegrationRuntime.cs diff --git a/Config/WheelConfig.cs b/Config/WheelConfig.cs new file mode 100644 index 0000000..0e4bc7a --- /dev/null +++ b/Config/WheelConfig.cs @@ -0,0 +1,86 @@ +using BepInEx.Configuration; + +namespace com.drowhunter.NewStarGPTelemetryMod +{ + /// + /// Holds all BepInEx ConfigEntry bindings for wheel / FFB integration. + /// All values are live-adjustable at runtime via the BepInEx config UI. + /// + internal class WheelConfig + { + // ── Wheel / General ────────────────────────────────────────────────── + + public ConfigEntry Enabled { get; } + public ConfigEntry Backend { get; } + public ConfigEntry RequireX64 { get; } + + // ── Wheel / FFB ────────────────────────────────────────────────────── + + public ConfigEntry OverallStrength { get; } + public ConfigEntry MaxTorque { get; } + public ConfigEntry BumpThreshold { get; } + public ConfigEntry BumpScale { get; } + public ConfigEntry BumpCooldownMs { get; } + public ConfigEntry CForceDampingScale { get; } + public ConfigEntry SmoothingAlpha { get; } + + // ── Wheel / Input ──────────────────────────────────────────────────── + + public ConfigEntry SteerDeadzone { get; } + public ConfigEntry SteerSaturation { get; } + + public WheelConfig(ConfigFile config) + { + // Wheel / General + Enabled = config.Bind( + "Wheel/General", "Enabled", true, + "Enable wheel integration (Moza FFB + ViGEm virtual gamepad)."); + + Backend = config.Bind( + "Wheel/General", "Backend", "Moza", + "Wheel backend to use. Supported: Moza."); + + RequireX64 = config.Bind( + "Wheel/General", "RequireX64", true, + "Abort wheel init if the process is not 64-bit (required for Moza native DLLs)."); + + // Wheel / FFB + OverallStrength = config.Bind( + "Wheel/FFB", "OverallStrength", 1.0f, + new ConfigDescription("Overall FFB strength multiplier.", new AcceptableValueRange(0f, 2f))); + + MaxTorque = config.Bind( + "Wheel/FFB", "MaxTorque", 1.0f, + new ConfigDescription("Maximum torque clamp (0..1 maps to DirectInput 0..10000).", new AcceptableValueRange(0f, 1f))); + + BumpThreshold = config.Bind( + "Wheel/FFB", "BumpThreshold", 0.15f, + new ConfigDescription("Minimum normalised tire delta required to trigger a bump impulse.", new AcceptableValueRange(0f, 1f))); + + BumpScale = config.Bind( + "Wheel/FFB", "BumpScale", 0.35f, + new ConfigDescription("Scales the lateral tire delta into a bump impulse magnitude.", new AcceptableValueRange(0f, 2f))); + + BumpCooldownMs = config.Bind( + "Wheel/FFB", "BumpCooldownMs", 60, + new ConfigDescription("Minimum milliseconds between successive bump impulses.", new AcceptableValueRange(0, 500))); + + CForceDampingScale = config.Bind( + "Wheel/FFB", "CForceDampingScale", 0.4f, + new ConfigDescription("Scales centripetal force into damper coefficient.", new AcceptableValueRange(0f, 2f))); + + SmoothingAlpha = config.Bind( + "Wheel/FFB", "SmoothingAlpha", 0.25f, + new ConfigDescription("Exponential smoothing factor for FFB output (0 = no update, 1 = no smoothing).", new AcceptableValueRange(0f, 1f))); + + // Wheel / Input + SteerDeadzone = config.Bind( + "Wheel/Input", "SteerDeadzone", 0.05f, + new ConfigDescription("Normalised steer axis deadzone (0..1).", new AcceptableValueRange(0f, 0.5f))); + + SteerSaturation = config.Bind( + "Wheel/Input", "SteerSaturation", 1.0f, + new ConfigDescription("Normalised steer axis saturation point (0..1). Values above this map to ±1.", new AcceptableValueRange(0.1f, 1f))); + } + } +} diff --git a/Contracts/IVirtualGamepadOutput.cs b/Contracts/IVirtualGamepadOutput.cs new file mode 100644 index 0000000..538603a --- /dev/null +++ b/Contracts/IVirtualGamepadOutput.cs @@ -0,0 +1,17 @@ +namespace com.drowhunter.NewStarGPTelemetryMod +{ + /// + /// Writes virtual gamepad state to the OS (e.g. via ViGEm). + /// + internal interface IVirtualGamepadOutput + { + /// Initialise and connect the virtual gamepad. Returns true on success. + bool Initialize(); + + /// Submit a new gamepad state to the virtual device. + void Submit(VirtualPadState state); + + /// Disconnect and release the virtual gamepad. + void Dispose(); + } +} diff --git a/Contracts/IWheelFfbProvider.cs b/Contracts/IWheelFfbProvider.cs new file mode 100644 index 0000000..9ff9de1 --- /dev/null +++ b/Contracts/IWheelFfbProvider.cs @@ -0,0 +1,17 @@ +namespace com.drowhunter.NewStarGPTelemetryMod +{ + /// + /// Sends force-feedback commands to the physical wheel. + /// + internal interface IWheelFfbProvider + { + /// Initialise the FFB provider. Returns true on success. + bool Initialize(); + + /// Apply the given FFB command to the wheel hardware. + void SendFfb(FfbCommand command); + + /// Stop all active FFB effects and release resources. + void Dispose(); + } +} diff --git a/Contracts/IWheelInputProvider.cs b/Contracts/IWheelInputProvider.cs new file mode 100644 index 0000000..a071324 --- /dev/null +++ b/Contracts/IWheelInputProvider.cs @@ -0,0 +1,17 @@ +namespace com.drowhunter.NewStarGPTelemetryMod +{ + /// + /// Provides physical wheel input state each frame. + /// + internal interface IWheelInputProvider + { + /// Initialise the input provider. Returns true on success. + bool Initialize(); + + /// Poll and return the latest wheel input state. + WheelInputState Poll(); + + /// Release all resources held by this provider. + void Dispose(); + } +} diff --git a/Ffb/FfbModel.cs b/Ffb/FfbModel.cs new file mode 100644 index 0000000..e98ab9b --- /dev/null +++ b/Ffb/FfbModel.cs @@ -0,0 +1,84 @@ +using System; +using System.Diagnostics; +using BepInEx.Logging; + +namespace com.drowhunter.NewStarGPTelemetryMod +{ + /// + /// Converts enhanced telemetry data into an each frame. + /// + /// Implemented effects (v1): + /// 1. CForce damper – centripetal force → lateral damper coefficient. + /// 2. Tire impulses – front left/right wheel delta → short ConstantForce burst. + /// 3. Global smoothing – exponential smoothing on damper coefficient. + /// 4. Threshold + cooldown on impulses. + /// + internal class FfbModel + { + private readonly WheelConfig _cfg; + private readonly ManualLogSource _log; + + // Smoothing state + private float _smoothedDamper; + + // Impulse cooldown: tracks elapsed ms since last impulse using a Stopwatch. + private readonly Stopwatch _impulseStopwatch = new Stopwatch(); + + public FfbModel(WheelConfig cfg, ManualLogSource log) + { + _cfg = cfg; + _log = log; + } + + /// + /// Compute the FFB command for the current physics frame. + /// + public FfbCommand Compute(in NewStarTelemetryData data) + { + // ── 1. CForce-based damper ──────────────────────────────────────── + // cForce is the centripetal acceleration (m/s² or g depending on extractor). + // We scale and clamp it to produce a lateral resistance coefficient. + float rawDamper = data.cForce * _cfg.CForceDampingScale.Value + * _cfg.OverallStrength.Value; + rawDamper = Clamp(rawDamper, -_cfg.MaxTorque.Value, _cfg.MaxTorque.Value); + + // ── 3. Exponential smoothing ────────────────────────────────────── + float alpha = _cfg.SmoothingAlpha.Value; + _smoothedDamper = _smoothedDamper + alpha * (rawDamper - _smoothedDamper); + + // ── 2. Tire impulse ─────────────────────────────────────────────── + // Lateral impulse = FR delta minus FL delta → positive = right-side hit. + float lateralDelta = data.TireFR - data.TireFL; + float impulse = lateralDelta * _cfg.BumpScale.Value + * _cfg.OverallStrength.Value; + impulse = Clamp(impulse, -_cfg.MaxTorque.Value, _cfg.MaxTorque.Value); + + bool hasImpulse = false; + float impulseMagnitude = 0f; + + if (Math.Abs(impulse) >= _cfg.BumpThreshold.Value) + { + long elapsedMs = _impulseStopwatch.IsRunning + ? _impulseStopwatch.ElapsedMilliseconds + : long.MaxValue; + + if (elapsedMs >= _cfg.BumpCooldownMs.Value) + { + hasImpulse = true; + impulseMagnitude = impulse; + _impulseStopwatch.Restart(); + } + } + + return new FfbCommand + { + DamperCoefficient = _smoothedDamper, + HasImpulse = hasImpulse, + ImpulseMagnitude = impulseMagnitude, + }; + } + + private static float Clamp(float value, float min, float max) + => value < min ? min : value > max ? max : value; + } +} diff --git a/Models/FfbCommand.cs b/Models/FfbCommand.cs new file mode 100644 index 0000000..b0f8fd2 --- /dev/null +++ b/Models/FfbCommand.cs @@ -0,0 +1,27 @@ +namespace com.drowhunter.NewStarGPTelemetryMod +{ + /// + /// The computed force-feedback command for one physics frame. + /// + internal struct FfbCommand + { + /// + /// Lateral damper coefficient derived from centripetal force. Range -1..1. + /// Positive values push the wheel right; negative push left. + /// Sent to the ETDamper effect as positive/negative coefficient. + /// + public float DamperCoefficient; + + /// + /// Whether a short bump impulse should fire this frame. + /// + public bool HasImpulse; + + /// + /// Magnitude of the bump impulse. Range -1..1. + /// Positive = right-side bump, negative = left-side bump. + /// Sent to the ETConstantForce effect. + /// + public float ImpulseMagnitude; + } +} diff --git a/Models/VirtualPadState.cs b/Models/VirtualPadState.cs new file mode 100644 index 0000000..ca3c4d4 --- /dev/null +++ b/Models/VirtualPadState.cs @@ -0,0 +1,29 @@ +namespace com.drowhunter.NewStarGPTelemetryMod +{ + /// + /// Represents the desired state of the virtual Xbox 360 gamepad to be submitted to ViGEm. + /// + internal struct VirtualPadState + { + /// Left stick X axis: -1..1 (left/right). Mapped from wheel steer angle. + public float LeftStickX; + + /// Left stick Y axis: -1..1 (down/up). Reserved for future use. + public float LeftStickY; + + /// Right stick X axis: -1..1. Reserved for future use. + public float RightStickX; + + /// Right stick Y axis: -1..1. Reserved for future use. + public float RightStickY; + + /// Left trigger (gas/throttle): 0..1. + public float LeftTrigger; + + /// Right trigger (brake): 0..1. + public float RightTrigger; + + /// Xbox button bitmask. See Nefarius.ViGEm.Client.Targets.Xbox360.Xbox360Button. + public ushort Buttons; + } +} diff --git a/Models/WheelInputState.cs b/Models/WheelInputState.cs new file mode 100644 index 0000000..f937c43 --- /dev/null +++ b/Models/WheelInputState.cs @@ -0,0 +1,26 @@ +namespace com.drowhunter.NewStarGPTelemetryMod +{ + /// + /// Snapshot of the physical wheel's current input state, normalised to -1..1 or 0..1 where applicable. + /// + internal struct WheelInputState + { + /// Steering angle normalised to -1..1 (left to right). + public float SteerAngle; + + /// Steering velocity in normalised units per second. + public float SteerVelocity; + + /// Throttle axis 0..1 (0 = released, 1 = fully pressed). + public float Throttle; + + /// Brake axis 0..1. + public float Brake; + + /// Clutch axis 0..1. + public float Clutch; + + /// Raw 128-element button state array from the HID report. May be null if no data available. + public bool[] Buttons; + } +} diff --git a/Moza/MozaSdkAdapter.cs b/Moza/MozaSdkAdapter.cs new file mode 100644 index 0000000..d619bf7 --- /dev/null +++ b/Moza/MozaSdkAdapter.cs @@ -0,0 +1,183 @@ +using System; +using BepInEx.Logging; +using mozaAPI; + +namespace com.drowhunter.NewStarGPTelemetryMod +{ + /// + /// Single boundary around all MOZA SDK C# calls. + /// + /// Design notes: + /// - installMozaSDK() connects to the MOZA Pithouz background process. + /// If Pithouz is not running, subsequent calls will fail gracefully. + /// - createWheelbaseET*(IntPtr hwndId, out ERRORCODE err) takes the + /// game window handle. Passing works when the SDK + /// acquires the DirectInput device independently. + /// - The returned effect objects are typed as dynamic because the exact + /// C# wrapper class names cannot be confirmed without a full decompile; the + /// runtime types are resolved from MOZA_API_CSharp.dll at execution time. + /// - getHIDData(out ERRORCODE err) is global (not per-device); the SDK + /// aggregates input from all connected MOZA devices. + /// - Native DLLs MOZA_API_C.dll and MOZA_SDK.dll must be present + /// in the game root directory (on the OS DLL search path). + /// + internal class MozaSdkAdapter : IDisposable + { + private readonly ManualLogSource _log; + private bool _initialised; + private bool _disposed; + + // DirectInput "nominal max" constant: force values are in the range ±10000. + public const int DI_FF_NOMINAL_MAX = 10000; + + public MozaSdkAdapter(ManualLogSource log) + { + _log = log; + } + + /// + /// Load the MOZA SDK. Returns true if successful. + /// + public bool Install() + { + try + { + mozaAPI.mozaAPI.installMozaSDK(); + _initialised = true; + _log.LogInfo("[MozaSdkAdapter] installMozaSDK succeeded."); + return true; + } + catch (Exception ex) + { + _log.LogWarning($"[MozaSdkAdapter] installMozaSDK failed: {ex.Message}"); + return false; + } + } + + /// + /// Poll the global HID data from all connected MOZA devices. + /// Returns null if the SDK is not initialised or an error occurs. + /// + public HIDData GetHIDData() + { + if (!_initialised) return null; + try + { + var data = mozaAPI.mozaAPI.getHIDData(out ERRORCODE err); + if (err != ERRORCODE.NORMAL) + { + _log.LogDebug($"[MozaSdkAdapter] getHIDData error: {err}"); + return null; + } + return data; + } + catch (Exception ex) + { + _log.LogDebug($"[MozaSdkAdapter] getHIDData exception: {ex.Message}"); + return null; + } + } + + /// + /// Create a continuous ETDamper effect. Returns the effect object or null on failure. + /// + public dynamic CreateDamper(IntPtr hwnd) + { + if (!_initialised) return null; + try + { + var effect = mozaAPI.mozaAPI.createWheelbaseETDamper(hwnd, out ERRORCODE err); + if (err != ERRORCODE.NORMAL) + { + _log.LogWarning($"[MozaSdkAdapter] createWheelbaseETDamper error: {err}"); + return null; + } + _log.LogInfo("[MozaSdkAdapter] ETDamper effect created."); + return effect; + } + catch (Exception ex) + { + _log.LogWarning($"[MozaSdkAdapter] createWheelbaseETDamper failed: {ex.Message}"); + return null; + } + } + + /// + /// Create a short-burst ETConstantForce effect for impulse feedback. + /// Returns the effect object or null on failure. + /// + public dynamic CreateConstantForce(IntPtr hwnd) + { + if (!_initialised) return null; + try + { + var effect = mozaAPI.mozaAPI.createWheelbaseETConstantForce(hwnd, out ERRORCODE err); + if (err != ERRORCODE.NORMAL) + { + _log.LogWarning($"[MozaSdkAdapter] createWheelbaseETConstantForce error: {err}"); + return null; + } + _log.LogInfo("[MozaSdkAdapter] ETConstantForce effect created."); + return effect; + } + catch (Exception ex) + { + _log.LogWarning($"[MozaSdkAdapter] createWheelbaseETConstantForce failed: {ex.Message}"); + return null; + } + } + + /// + /// Stop all active FFB effects on the wheelbase. + /// + public void StopAllFfb() + { + if (!_initialised) return; + try + { + mozaAPI.mozaAPI.stopForceFeedback(); + } + catch (Exception ex) + { + _log.LogDebug($"[MozaSdkAdapter] stopForceFeedback exception: {ex.Message}"); + } + } + + /// + /// Center the wheel (reset to zero position). + /// + public void CenterWheel() + { + if (!_initialised) return; + try + { + mozaAPI.mozaAPI.CenterWheel(); + } + catch (Exception ex) + { + _log.LogDebug($"[MozaSdkAdapter] CenterWheel exception: {ex.Message}"); + } + } + + public void Dispose() + { + if (_disposed) return; + _disposed = true; + + if (_initialised) + { + StopAllFfb(); + try + { + mozaAPI.mozaAPI.removeMozaSDK(); + _log.LogInfo("[MozaSdkAdapter] removeMozaSDK called."); + } + catch (Exception ex) + { + _log.LogDebug($"[MozaSdkAdapter] removeMozaSDK exception: {ex.Message}"); + } + _initialised = false; + } + } + } +} diff --git a/Moza/MozaWheelFfbProvider.cs b/Moza/MozaWheelFfbProvider.cs new file mode 100644 index 0000000..c6c57f2 --- /dev/null +++ b/Moza/MozaWheelFfbProvider.cs @@ -0,0 +1,127 @@ +using System; +using BepInEx.Logging; + +namespace com.drowhunter.NewStarGPTelemetryMod +{ + /// + /// implementation using the MOZA SDK. + /// + /// Manages two persistent DirectInput effects: + /// - _damper (ETDamper) – continuous lateral resistance from cForce. + /// - _impulse (ETConstantForce) – short bump burst from tire deltas. + /// + /// DirectInput force range: ±10000 (DI_FFNOMINALMAX). + /// Our values are in ±1 and are scaled to ±10000 here. + /// + internal class MozaWheelFfbProvider : IWheelFfbProvider + { + private readonly MozaSdkAdapter _sdk; + private readonly ManualLogSource _log; + + // Effect objects returned by the Moza SDK (runtime-typed via dynamic). + private dynamic _damper; + private dynamic _impulse; + + // Duration of bump impulse in milliseconds. + private const int ImpulseDurationMs = 80; + + public MozaWheelFfbProvider(MozaSdkAdapter sdk, ManualLogSource log) + { + _sdk = sdk; + _log = log; + } + + public bool Initialize() + { + // Pass IntPtr.Zero: the SDK acquires the DirectInput device independently. + _damper = _sdk.CreateDamper(IntPtr.Zero); + if (_damper == null) + { + _log.LogWarning("[MozaWheelFfbProvider] Failed to create ETDamper effect."); + return false; + } + + _impulse = _sdk.CreateConstantForce(IntPtr.Zero); + if (_impulse == null) + { + _log.LogWarning("[MozaWheelFfbProvider] Failed to create ETConstantForce effect."); + return false; + } + + // Start both effects in a "zero" state so they are acquired by DirectInput. + try + { + _damper.setPositiveCoefficient(0); + _damper.setNegativeCoefficient(0); + _damper.start(); + + _impulse.setMagnitude(0); + _impulse.setDuration(ImpulseDurationMs); + // Do not start impulse yet – fired on demand. + } + catch (Exception ex) + { + _log.LogWarning($"[MozaWheelFfbProvider] Effect init failed: {ex.Message}"); + return false; + } + + _log.LogInfo("[MozaWheelFfbProvider] FFB effects initialised."); + return true; + } + + public void SendFfb(FfbCommand cmd) + { + UpdateDamper(cmd.DamperCoefficient); + if (cmd.HasImpulse) + FireImpulse(cmd.ImpulseMagnitude); + } + + private void UpdateDamper(float coefficient) + { + if (_damper == null) return; + try + { + // coefficient > 0 → resistance to right movement (positive coeff) + // coefficient < 0 → resistance to left movement (negative coeff) + int scaledPos = (int)(Math.Max(0f, coefficient) * MozaSdkAdapter.DI_FF_NOMINAL_MAX); + int scaledNeg = (int)(Math.Max(0f, -coefficient) * MozaSdkAdapter.DI_FF_NOMINAL_MAX); + + _damper.setPositiveCoefficient(scaledPos); + _damper.setNegativeCoefficient(scaledNeg); + } + catch (Exception ex) + { + _log.LogDebug($"[MozaWheelFfbProvider] UpdateDamper failed: {ex.Message}"); + } + } + + private void FireImpulse(float magnitude) + { + if (_impulse == null) return; + try + { + int scaled = (int)(magnitude * MozaSdkAdapter.DI_FF_NOMINAL_MAX); + _impulse.setMagnitude(scaled); + _impulse.start(); + } + catch (Exception ex) + { + _log.LogDebug($"[MozaWheelFfbProvider] FireImpulse failed: {ex.Message}"); + } + } + + public void Dispose() + { + StopEffects(); + _damper = null; + _impulse = null; + } + + private void StopEffects() + { + try { _damper?.stop(); } catch { } + try { _impulse?.stop(); } catch { } + _sdk.StopAllFfb(); + } + } +} diff --git a/Moza/MozaWheelInputProvider.cs b/Moza/MozaWheelInputProvider.cs new file mode 100644 index 0000000..9682328 --- /dev/null +++ b/Moza/MozaWheelInputProvider.cs @@ -0,0 +1,106 @@ +using System; +using BepInEx.Logging; +using mozaAPI; + +namespace com.drowhunter.NewStarGPTelemetryMod +{ + /// + /// implementation using the MOZA SDK. + /// + /// Calls getHIDData each frame and converts the raw HID report into + /// a normalised . + /// + /// Pedal axes in HIDData use int16 with 0x8000 (-32768) as the rest position + /// and 0x7FFF (32767) as fully pressed. These are linearly mapped to 0..1. + /// + /// Threading: getHIDData is expected to be non-blocking (global read of + /// last-received HID report). If latency issues arise, move to a background + /// thread and guard with a lock. + /// + internal class MozaWheelInputProvider : IWheelInputProvider + { + private readonly MozaSdkAdapter _sdk; + private readonly WheelConfig _cfg; + private readonly ManualLogSource _log; + + // Maximum steering angle the wheel can physically rotate (degrees). + // Used to normalise fSteeringWheelAngle to -1..1. + private const float MaxSteerDegrees = 540f; + + public MozaWheelInputProvider(MozaSdkAdapter sdk, WheelConfig cfg, ManualLogSource log) + { + _sdk = sdk; + _cfg = cfg; + _log = log; + } + + public bool Initialize() + { + // The SDK itself is initialised by MozaSdkAdapter.Install() before this is called. + _log.LogInfo("[MozaWheelInputProvider] Initialised."); + return true; + } + + public WheelInputState Poll() + { + var raw = _sdk.GetHIDData(); + if (raw == null) + return default; + + float steerNorm = NormaliseSteer(raw.fSteeringWheelAngle); + steerNorm = ApplyDeadzoneSaturation(steerNorm, + _cfg.SteerDeadzone.Value, + _cfg.SteerSaturation.Value); + + return new WheelInputState + { + SteerAngle = steerNorm, + SteerVelocity = float.IsNaN(raw.fSteeringWheelVelocity) ? 0f : raw.fSteeringWheelVelocity / MaxSteerDegrees, + Throttle = Int16ToAxis(raw.throttle), + Brake = Int16ToAxis(raw.brake), + Clutch = Int16ToAxis(raw.clutch), + Buttons = null, // HIDButton array not yet mapped + }; + } + + public void Dispose() + { + // Resources owned by MozaSdkAdapter; nothing to release here. + } + + // ── Helpers ────────────────────────────────────────────────────────── + + private static float NormaliseSteer(float angleDegrees) + { + if (float.IsNaN(angleDegrees)) return 0f; + return Math.Max(-1f, Math.Min(1f, angleDegrees / MaxSteerDegrees)); + } + + /// + /// Applies deadzone removal and saturation rescaling to a normalised axis value. + /// + private static float ApplyDeadzoneSaturation(float value, float deadzone, float saturation) + { + float absVal = Math.Abs(value); + int sign = value < 0 ? -1 : 1; + + if (absVal < deadzone) return 0f; + + // Rescale from [deadzone..saturation] to [0..1] + float range = saturation - deadzone; + if (range <= 0f) return sign; + float scaled = Math.Min(1f, (absVal - deadzone) / range); + return sign * scaled; + } + + /// + /// Converts an int16 pedal axis (rest = 0x8000 = -32768) to 0..1. + /// + private static float Int16ToAxis(short raw) + { + // 0x8000 (-32768) = rest/released; 0x7FFF (32767) = fully pressed. + int shifted = (int)raw - short.MinValue; // 0..65535 + return Math.Max(0f, Math.Min(1f, shifted / 65535f)); + } + } +} diff --git a/NewStarGPTelemetryMod.csproj b/NewStarGPTelemetryMod.csproj index 1c97993..88d57a1 100644 --- a/NewStarGPTelemetryMod.csproj +++ b/NewStarGPTelemetryMod.csproj @@ -37,6 +37,7 @@ + @@ -48,7 +49,11 @@ - + + + libs\moza\x64\MOZA_API_CSharp.dll + true + diff --git a/NewStarTelemetryPlugin.cs b/NewStarTelemetryPlugin.cs index 9e43d46..fe753ab 100644 --- a/NewStarTelemetryPlugin.cs +++ b/NewStarTelemetryPlugin.cs @@ -30,6 +30,9 @@ public class NewStarTelemetryPlugin : BaseUnityPlugin private ConfigEntry Port; + WheelConfig _wheelConfig; + WheelIntegrationRuntime _wheelRuntime; + CarControl _carControl { get @@ -78,6 +81,13 @@ private void Awake() }, new MarshalByteConverter()); Logger.LogInfo($"Plugin {MyPluginInfo.PLUGIN_GUID} is loaded!"); + + _wheelConfig = new WheelConfig(Config); + if (_wheelConfig.Enabled.Value) + { + _wheelRuntime = new WheelIntegrationRuntime(Logger); + _wheelRuntime.Initialize(_wheelConfig); + } } @@ -182,6 +192,14 @@ private void FixedUpdate() _udp.Send(data); + _wheelRuntime?.Update(in data); + + } + + private void OnDestroy() + { + _wheelRuntime?.Dispose(); + _wheelRuntime = null; } } diff --git a/Output/VigemXboxGamepadOutput.cs b/Output/VigemXboxGamepadOutput.cs new file mode 100644 index 0000000..a23c8af --- /dev/null +++ b/Output/VigemXboxGamepadOutput.cs @@ -0,0 +1,86 @@ +using System; +using BepInEx.Logging; +using Nefarius.ViGEm.Client; +using Nefarius.ViGEm.Client.Targets; +using Nefarius.ViGEm.Client.Targets.Xbox360; + +namespace com.drowhunter.NewStarGPTelemetryMod +{ + /// + /// implementation backed by ViGEm Bus. + /// + /// Maps fields to a virtual Xbox 360 controller: + /// - LeftStickX → left thumb X (steer) + /// - LeftTrigger → left trigger (throttle/gas) + /// - RightTrigger → right trigger (brake) + /// + /// Requires ViGEm Bus driver to be installed on the host PC. + /// + internal class VigemXboxGamepadOutput : IVirtualGamepadOutput + { + private readonly ManualLogSource _log; + private ViGEmClient _client; + private IXbox360Controller _controller; + + public VigemXboxGamepadOutput(ManualLogSource log) + { + _log = log; + } + + public bool Initialize() + { + try + { + _client = new ViGEmClient(); + _controller = _client.CreateXbox360Controller(); + _controller.Connect(); + _log.LogInfo("[VigemXboxGamepadOutput] Virtual Xbox 360 controller connected."); + return true; + } + catch (Exception ex) + { + _log.LogWarning($"[VigemXboxGamepadOutput] Init failed: {ex.Message}"); + _client = null; + _controller = null; + return false; + } + } + + public void Submit(VirtualPadState state) + { + if (_controller == null) return; + try + { + _controller.SetAxisValue(Xbox360Axis.LeftThumbX, NormToShort(state.LeftStickX)); + _controller.SetAxisValue(Xbox360Axis.LeftThumbY, NormToShort(state.LeftStickY)); + _controller.SetAxisValue(Xbox360Axis.RightThumbX, NormToShort(state.RightStickX)); + _controller.SetAxisValue(Xbox360Axis.RightThumbY, NormToShort(state.RightStickY)); + + _controller.SetSliderValue(Xbox360Slider.LeftTrigger, NormToByte(state.LeftTrigger)); + _controller.SetSliderValue(Xbox360Slider.RightTrigger, NormToByte(state.RightTrigger)); + + _controller.SubmitReport(); + } + catch (Exception ex) + { + _log.LogDebug($"[VigemXboxGamepadOutput] Submit failed: {ex.Message}"); + } + } + + public void Dispose() + { + try { _controller?.Disconnect(); } catch { } + try { _client?.Dispose(); } catch { } + _controller = null; + _client = null; + } + + // ── Helpers ────────────────────────────────────────────────────────── + + private static short NormToShort(float value) + => (short)Math.Max(short.MinValue, Math.Min(short.MaxValue, (int)(value * short.MaxValue))); + + private static byte NormToByte(float value) + => (byte)Math.Max(0, Math.Min(255, (int)(value * 255f))); + } +} diff --git a/README.md b/README.md index db141a6..636f5d3 100644 --- a/README.md +++ b/README.md @@ -47,4 +47,50 @@ v 1.0 First Release v 1.0.2 Updated for new game version as of 2026-06-18 -v 1.0.3 Minor update . Refactor to use com.dowhunter.TelemetryLib \ No newline at end of file +v 1.0.3 Minor update . Refactor to use com.dowhunter.TelemetryLib + +--- + +## Wheel / Force Feedback Integration + +### Requirements + +- **MOZA wheel hardware** (Moza-first implementation) +- **MOZA Pithouz** software running in the background (connects the SDK to the wheel) +- **ViGEm Bus Driver** installed — [download here](https://github.com/nefarius/ViGEmBus/releases) + +### Native DLL Setup + +The MOZA C++ native DLLs must be on the Windows DLL search path at game launch. +Copy both files from `libs/moza/x64/` into the **game root directory** +(the folder that contains `NewStarGP.exe`): + +``` +New Star GP\ + NewStarGP.exe + MOZA_API_C.dll ← copy from libs/moza/x64/ + MOZA_SDK.dll ← copy from libs/moza/x64/ +``` + +The managed C# wrapper (`MOZA_API_CSharp.dll`) is copied automatically alongside the plugin DLL into `BepInEx/plugins/NewStarGPTelemetryMod/` during build. + +### Config + +All wheel / FFB settings are in `BepInEx/config/com.drowhunter.NewStarGPTelemetryMod.cfg` +under the `Wheel/General`, `Wheel/FFB`, and `Wheel/Input` sections. +They are live-adjustable at runtime via the BepInEx config UI. + +| Key | Default | Description | +|---|---|---| +| `Wheel/General / Enabled` | true | Master on/off switch | +| `Wheel/General / Backend` | Moza | Wheel backend (only Moza supported in v1) | +| `Wheel/General / RequireX64` | true | Abort if process is not 64-bit | +| `Wheel/FFB / OverallStrength` | 1.0 | Global FFB multiplier (0..2) | +| `Wheel/FFB / MaxTorque` | 1.0 | Torque clamp (0..1) | +| `Wheel/FFB / BumpThreshold` | 0.15 | Min tire delta to trigger bump | +| `Wheel/FFB / BumpScale` | 0.35 | Bump impulse magnitude scale | +| `Wheel/FFB / BumpCooldownMs` | 60 | Minimum ms between bumps | +| `Wheel/FFB / CForceDampingScale` | 0.4 | cForce → damper coefficient scale | +| `Wheel/FFB / SmoothingAlpha` | 0.25 | Exponential smoothing (0=frozen, 1=raw) | +| `Wheel/Input / SteerDeadzone` | 0.05 | Normalised steer deadzone | +| `Wheel/Input / SteerSaturation` | 1.0 | Normalised steer saturation | diff --git a/Runtime/TelemetryStateStore.cs b/Runtime/TelemetryStateStore.cs new file mode 100644 index 0000000..10829f1 --- /dev/null +++ b/Runtime/TelemetryStateStore.cs @@ -0,0 +1,28 @@ +using System.Threading; + +namespace com.drowhunter.NewStarGPTelemetryMod +{ + /// + /// Thread-safe store for the latest enhanced telemetry snapshot. + /// Written from the Unity main thread (FixedUpdate) and readable from any thread. + /// + internal class TelemetryStateStore + { + // Boxed snapshot stored via Interlocked.Exchange for lock-free reads. + private volatile NewStarTelemetryData _snapshot; + + /// Gets the most recently published telemetry snapshot. + public NewStarTelemetryData Latest => _snapshot; + + /// Publishes a new telemetry snapshot. Thread-safe. + public void Publish(NewStarTelemetryData data) + { + // Assignment of a struct to a volatile field is atomic on 32-bit aligned fields + // when the struct fits in a single CPU word; for larger structs we rely on the + // fact that only one thread (FixedUpdate) writes here. + Thread.MemoryBarrier(); + _snapshot = data; + Thread.MemoryBarrier(); + } + } +} diff --git a/Runtime/WheelIntegrationRuntime.cs b/Runtime/WheelIntegrationRuntime.cs new file mode 100644 index 0000000..7ce423e --- /dev/null +++ b/Runtime/WheelIntegrationRuntime.cs @@ -0,0 +1,174 @@ +using System; +using BepInEx.Logging; + +namespace com.drowhunter.NewStarGPTelemetryMod +{ + /// + /// Orchestrates wheel input polling, FFB output, and virtual gamepad output + /// for the lifetime of the plugin. + /// + /// Lifecycle: + /// 1. – called once on plugin startup. + /// 2. – called every physics frame (FixedUpdate). + /// 3. – called on plugin unload / OnDestroy. + /// + /// Safety: + /// - Disabled automatically if init fails or if the process is not 64-bit + /// and RequireX64 is true. + /// - All provider exceptions are caught; a failure sets _disabled to + /// prevent further calls and protect plugin stability. + /// + internal class WheelIntegrationRuntime : IDisposable + { + private readonly ManualLogSource _log; + + private WheelConfig _cfg; + private MozaSdkAdapter _mozaSdk; + private IWheelInputProvider _inputProvider; + private IWheelFfbProvider _ffbProvider; + private IVirtualGamepadOutput _padOutput; + private FfbModel _ffbModel; + + private bool _initialised; + private bool _disabled; + + public WheelIntegrationRuntime(ManualLogSource log) + { + _log = log; + } + + /// + /// Initialise all providers using the given config. + /// Safe to call even if wheel hardware is absent — failures disable the + /// runtime without throwing. + /// + public void Initialize(WheelConfig cfg) + { + _cfg = cfg; + + // ── x64 guard ──────────────────────────────────────────────────── + if (cfg.RequireX64.Value && !Environment.Is64BitProcess) + { + _log.LogWarning("[WheelIntegrationRuntime] Process is not x64. " + + "Wheel integration disabled (RequireX64 = true)."); + _disabled = true; + return; + } + + try + { + // ── MOZA SDK ───────────────────────────────────────────────── + _mozaSdk = new MozaSdkAdapter(_log); + if (!_mozaSdk.Install()) + { + _log.LogWarning("[WheelIntegrationRuntime] MOZA SDK init failed. " + + "Ensure MOZA Pithouz is running and native DLLs are present."); + _disabled = true; + return; + } + + // ── Input provider ──────────────────────────────────────────── + _inputProvider = new MozaWheelInputProvider(_mozaSdk, cfg, _log); + if (!_inputProvider.Initialize()) + { + _log.LogWarning("[WheelIntegrationRuntime] Wheel input provider failed to initialise."); + _disabled = true; + return; + } + + // ── FFB model ───────────────────────────────────────────────── + _ffbModel = new FfbModel(cfg, _log); + + // ── FFB provider ────────────────────────────────────────────── + _ffbProvider = new MozaWheelFfbProvider(_mozaSdk, _log); + if (!_ffbProvider.Initialize()) + { + _log.LogWarning("[WheelIntegrationRuntime] FFB provider failed to initialise. " + + "Input mapping will continue without FFB."); + // Not fatal – pad output can still work. + } + + // ── Virtual gamepad ─────────────────────────────────────────── + _padOutput = new VigemXboxGamepadOutput(_log); + if (!_padOutput.Initialize()) + { + _log.LogWarning("[WheelIntegrationRuntime] ViGEm gamepad output failed. " + + "Ensure ViGEm Bus driver is installed."); + // Not fatal – FFB can still work without virtual pad. + } + + _initialised = true; + _log.LogInfo("[WheelIntegrationRuntime] Wheel integration ready."); + } + catch (Exception ex) + { + _log.LogError($"[WheelIntegrationRuntime] Unexpected init error: {ex}"); + _disabled = true; + } + } + + /// + /// Called every FixedUpdate with the latest telemetry snapshot. + /// + public void Update(in NewStarTelemetryData telemetry) + { + if (!_initialised || _disabled) return; + + try + { + // 1. Poll wheel input + WheelInputState wheelInput = _inputProvider?.Poll() ?? default; + + // 2. Build virtual pad state from wheel input + var padState = BuildPadState(in wheelInput); + _padOutput?.Submit(padState); + + // 3. Compute FFB from telemetry + if (_ffbModel != null && _ffbProvider != null) + { + FfbCommand cmd = _ffbModel.Compute(in telemetry); + _ffbProvider.SendFfb(cmd); + } + } + catch (Exception ex) + { + _log.LogError($"[WheelIntegrationRuntime] Update error (disabling): {ex}"); + _disabled = true; + } + } + + public void Dispose() + { + _initialised = false; + + try { _ffbProvider?.Dispose(); } catch (Exception ex) { _log.LogDebug($"FFB dispose: {ex.Message}"); } + try { _padOutput?.Dispose(); } catch (Exception ex) { _log.LogDebug($"Pad dispose: {ex.Message}"); } + try { _inputProvider?.Dispose(); } catch (Exception ex) { _log.LogDebug($"Input dispose: {ex.Message}"); } + try { _mozaSdk?.Dispose(); } catch (Exception ex) { _log.LogDebug($"SDK dispose: {ex.Message}"); } + + _ffbProvider = null; + _padOutput = null; + _inputProvider = null; + _mozaSdk = null; + _ffbModel = null; + + _log.LogInfo("[WheelIntegrationRuntime] Disposed."); + } + + // ── Helpers ─────────────────────────────────────────────────────────── + + private static VirtualPadState BuildPadState(in WheelInputState wheel) + { + return new VirtualPadState + { + LeftStickX = wheel.SteerAngle, + LeftStickY = 0f, + RightStickX = 0f, + RightStickY = 0f, + LeftTrigger = wheel.Throttle, + RightTrigger = wheel.Brake, + Buttons = 0, + }; + } + } +} From 423e0567fe1c3799d10350bc3421ad85ac8ea149 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 19 Jul 2026 04:01:57 +0000 Subject: [PATCH 2/6] Address code review: fix TelemetryStateStore thread safety, sign helper type, NormToShort range --- Moza/MozaWheelInputProvider.cs | 3 ++- Output/VigemXboxGamepadOutput.cs | 7 ++++++- Runtime/TelemetryStateStore.cs | 18 ++++++++---------- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/Moza/MozaWheelInputProvider.cs b/Moza/MozaWheelInputProvider.cs index 9682328..463e83c 100644 --- a/Moza/MozaWheelInputProvider.cs +++ b/Moza/MozaWheelInputProvider.cs @@ -82,10 +82,11 @@ private static float NormaliseSteer(float angleDegrees) private static float ApplyDeadzoneSaturation(float value, float deadzone, float saturation) { float absVal = Math.Abs(value); - int sign = value < 0 ? -1 : 1; if (absVal < deadzone) return 0f; + float sign = value < 0f ? -1f : 1f; + // Rescale from [deadzone..saturation] to [0..1] float range = saturation - deadzone; if (range <= 0f) return sign; diff --git a/Output/VigemXboxGamepadOutput.cs b/Output/VigemXboxGamepadOutput.cs index a23c8af..74ed3d0 100644 --- a/Output/VigemXboxGamepadOutput.cs +++ b/Output/VigemXboxGamepadOutput.cs @@ -78,7 +78,12 @@ public void Dispose() // ── Helpers ────────────────────────────────────────────────────────── private static short NormToShort(float value) - => (short)Math.Max(short.MinValue, Math.Min(short.MaxValue, (int)(value * short.MaxValue))); + { + float clamped = value < -1f ? -1f : value > 1f ? 1f : value; + // Map -1..0 → -32768..0, 0..1 → 0..32767 to use the full short range. + float scaled = clamped < 0f ? clamped * 32768f : clamped * 32767f; + return (short)scaled; + } private static byte NormToByte(float value) => (byte)Math.Max(0, Math.Min(255, (int)(value * 255f))); diff --git a/Runtime/TelemetryStateStore.cs b/Runtime/TelemetryStateStore.cs index 10829f1..2093daa 100644 --- a/Runtime/TelemetryStateStore.cs +++ b/Runtime/TelemetryStateStore.cs @@ -8,21 +8,19 @@ namespace com.drowhunter.NewStarGPTelemetryMod /// internal class TelemetryStateStore { - // Boxed snapshot stored via Interlocked.Exchange for lock-free reads. - private volatile NewStarTelemetryData _snapshot; + private readonly object _lock = new object(); + private NewStarTelemetryData _snapshot; - /// Gets the most recently published telemetry snapshot. - public NewStarTelemetryData Latest => _snapshot; + /// Gets the most recently published telemetry snapshot. Thread-safe. + public NewStarTelemetryData Latest + { + get { lock (_lock) { return _snapshot; } } + } /// Publishes a new telemetry snapshot. Thread-safe. public void Publish(NewStarTelemetryData data) { - // Assignment of a struct to a volatile field is atomic on 32-bit aligned fields - // when the struct fits in a single CPU word; for larger structs we rely on the - // fact that only one thread (FixedUpdate) writes here. - Thread.MemoryBarrier(); - _snapshot = data; - Thread.MemoryBarrier(); + lock (_lock) { _snapshot = data; } } } } From 6d43e2438783d133764254441ecf372433c74d63 Mon Sep 17 00:00:00 2001 From: Trevor Jones Date: Sun, 19 Jul 2026 02:52:54 -0400 Subject: [PATCH 3/6] fixed compile errors --- Moza/MozaSdkAdapter.cs | 11 +++++++---- Moza/MozaWheelInputProvider.cs | 6 ++++-- NewStarGPTelemetryMod.csproj | 11 ++++++----- NewStarTelemetryPlugin.cs | 16 +++++++++++----- libs/vigem/Nefarius.ViGEm.Client.dll | Bin 0 -> 290304 bytes 5 files changed, 28 insertions(+), 16 deletions(-) create mode 100644 libs/vigem/Nefarius.ViGEm.Client.dll diff --git a/Moza/MozaSdkAdapter.cs b/Moza/MozaSdkAdapter.cs index d619bf7..c9dc97a 100644 --- a/Moza/MozaSdkAdapter.cs +++ b/Moza/MozaSdkAdapter.cs @@ -58,12 +58,13 @@ public bool Install() /// Poll the global HID data from all connected MOZA devices. /// Returns null if the SDK is not initialised or an error occurs. /// - public HIDData GetHIDData() + public HIDData? GetHIDData() { if (!_initialised) return null; try { - var data = mozaAPI.mozaAPI.getHIDData(out ERRORCODE err); + ERRORCODE err = ERRORCODE.NORMAL; + var data = mozaAPI.mozaAPI.getHIDData(ref err); if (err != ERRORCODE.NORMAL) { _log.LogDebug($"[MozaSdkAdapter] getHIDData error: {err}"); @@ -86,7 +87,8 @@ public dynamic CreateDamper(IntPtr hwnd) if (!_initialised) return null; try { - var effect = mozaAPI.mozaAPI.createWheelbaseETDamper(hwnd, out ERRORCODE err); + ERRORCODE err = ERRORCODE.NORMAL; + var effect = mozaAPI.mozaAPI.createWheelbaseETDamper(hwnd, ref err); if (err != ERRORCODE.NORMAL) { _log.LogWarning($"[MozaSdkAdapter] createWheelbaseETDamper error: {err}"); @@ -111,7 +113,8 @@ public dynamic CreateConstantForce(IntPtr hwnd) if (!_initialised) return null; try { - var effect = mozaAPI.mozaAPI.createWheelbaseETConstantForce(hwnd, out ERRORCODE err); + ERRORCODE err = ERRORCODE.NORMAL; + var effect = mozaAPI.mozaAPI.createWheelbaseETConstantForce(hwnd, ref err); if (err != ERRORCODE.NORMAL) { _log.LogWarning($"[MozaSdkAdapter] createWheelbaseETConstantForce error: {err}"); diff --git a/Moza/MozaWheelInputProvider.cs b/Moza/MozaWheelInputProvider.cs index 463e83c..da34a23 100644 --- a/Moza/MozaWheelInputProvider.cs +++ b/Moza/MozaWheelInputProvider.cs @@ -43,10 +43,12 @@ public bool Initialize() public WheelInputState Poll() { - var raw = _sdk.GetHIDData(); - if (raw == null) + HIDData? result = _sdk.GetHIDData(); + + if (result == null) return default; + var raw = result.Value; float steerNorm = NormaliseSteer(raw.fSteeringWheelAngle); steerNorm = ApplyDeadzoneSaturation(steerNorm, _cfg.SteerDeadzone.Value, diff --git a/NewStarGPTelemetryMod.csproj b/NewStarGPTelemetryMod.csproj index 88d57a1..0c60ad7 100644 --- a/NewStarGPTelemetryMod.csproj +++ b/NewStarGPTelemetryMod.csproj @@ -4,7 +4,7 @@ net46 NewStarGPTelemetryMod Newstar Telemetry Plugin - 1.0.2 + 2.0.0 true latest @@ -31,13 +31,11 @@ - - - + + - @@ -54,6 +52,9 @@ libs\moza\x64\MOZA_API_CSharp.dll true + + libs\vigem\Nefarius.ViGEm.Client.dll + diff --git a/NewStarTelemetryPlugin.cs b/NewStarTelemetryPlugin.cs index fe753ab..59c19fe 100644 --- a/NewStarTelemetryPlugin.cs +++ b/NewStarTelemetryPlugin.cs @@ -24,7 +24,7 @@ public class NewStarTelemetryPlugin : BaseUnityPlugin internal NewStarTelemetryData data; - UdpTelemetry _udp; + MmfTelemetry _dataOut; RacingContextManager _racingContextManager; @@ -73,13 +73,19 @@ private void Awake() Logger = base.Logger; - Port = Config.Bind("Telemetry", "UDP Port", 12345, "Port to Send Telemetry"); + //Port = Config.Bind("Telemetry", "UDP Port", 12345, "Port to Send Telemetry"); - _udp = new UdpTelemetry(new UdpTelemetryConfig + _dataOut = new MmfTelemetry(new MmfTelemetryConfig { - SendAddress = new IPEndPoint(IPAddress.Loopback, Port.Value) + Name = "DrowTelemetryData", + IsGlobal = true, + Create = true, + + // SendAddress = new IPEndPoint(IPAddress.Loopback, Port.Value) }, new MarshalByteConverter()); + + Logger.LogInfo($"Plugin {MyPluginInfo.PLUGIN_GUID} is loaded!"); _wheelConfig = new WheelConfig(Config); @@ -190,7 +196,7 @@ private void FixedUpdate() }; - _udp.Send(data); + _dataOut.Send(data); _wheelRuntime?.Update(in data); diff --git a/libs/vigem/Nefarius.ViGEm.Client.dll b/libs/vigem/Nefarius.ViGEm.Client.dll new file mode 100644 index 0000000000000000000000000000000000000000..690ef0d99140952f593eb1ae7c96654429b6a776 GIT binary patch literal 290304 zcmeFae_&L_)jxc9_wJ8uHtYsAAwYx$g02Z5vY^C(h98?mC9pBFAz}h5V2sw_?p{D8 zB=IK7a$TiW`&0X9(LS`bt$k{JVzo9gG=UZswYB(2HMZ1F+_a5CA=H%ne$L!`cN4(2 z-|zFj|GjCs_sp4@GiT16IdkUB+_mzCJ%U9L1QGvKRS-JyroU4D{O6BWWRIKn({aM{ z8Lv(6G_8DX`t=RBMSWW$O}9pF`hxG4o9?``DdxL*lP@CO>AUSt--^}MzArRw+%z{U z%UPh44h02arO6@;xCV|Gt@R5tre~Vw3BpEj<9?NLiU=D)w}#*+MS-fG^VcN`E+BW^Ckoe}lle~&z7*@ckOS$8QN`!R zHf@g~z5f=yU({EfZ=)EhY?vE~Ms5Lu^9CLT8xotxGFpn^nj6`4M-vJXuL5}HwC*^k z+%n1@{r4ov6@SE=S+EL6|6viHZ5IR+#|pxsa>(li(vW}eZ?eDNB-je4n*E^QEUeew z=7|ZAFwM%fJl+hvSa^kwx161%Asv;AT4Lc=OYS9B|3vg%oSk8|Y;Fe2Vxifhy=NG} z)ZAzW$`nq`(ca6hIh$Vxb^Rm}e2tI>{tk z%XganZZtL9X0uFOyVhwdyvHKhA;8&QE#GoCr8w;~ro!C9D|NJinX08pOc*d5Z^I-^ zMH}dUwocq`_UBTj**^|1=Xk*nUY)$GS(v2r69H3O(j}}Y;fIPi3ztOzZ;52%5d|~O zd(b8@BHFwc1w`;x$ACJ`R zT%f^-h9-cc(O-?$C7=bCv)v|M2SmnH2Ab+{^q9)T$6URxRs&_u?iND*VE z%STfTmu0+(4_mFX$f1Ke-&x}=sWKL=j0nto{NtZFAUaqu|F`c$s<1 z&E{!SHf}JlwcJ!VH&RW*nuVNu(lZJ2;iGH3Au6$uW(Nn-<#3 z9BsUzuNqYjq~|xP(fs~aGbYC98O)Q=xwFu)%A72Jr(1)%ax{ORhd9)3G;y8;asIw1 zWm6`g6iklBlK8D=FVzZ<%@#E*DpP5i6}(iMl^h+--)S_aBrnb1jVYS25286Y0V$c9 zp$Vg#<5{AHMKhG7=6I>8r0d(DLzsflAxHyS(uid9EF$Q?8Q@L`!$~vCIolS!3)U4K zCA|L*Je)QkEI|Luc`|sw6hwyBoj%$VecL9XBLEJa@YEA65 zLA1mBi{1+`8vGy3HFsNz@^on*^+t0nU5O6Pt-kk}K&#Gu~<5=Me8_ z^AR1zN2S3B37h0@@L=$Rxi1huXYta*Ir`bzyyR-UzzUKy{9EuKwfG9&x>}4Kd&>Cy zv8Qzt(}WZu+bY)HVKLX{>|z!$f+9)gs&CVo0p-eRzOQH zKP$cBtaK1*D2Mr8YSjNd;tynK%+WsSKYS&uj-u0+X}9>Np%<|L7;~9-5Y}NQ2eHU$ zvj;x-XZ5E48}&AzJxveJnkp7Qrjs$$3&-no_j282PA!_D5B@ltZvqBCFh1JGM_n6x zZYf92)I#bT=7oTT6aEowrP*nlW3|j#RCK#Idy+2Pa&&H1xvgmhD804et?PH$nX4y?Y!UFLCuSF2rZFON)hhBE zDN?MW$wrFQst8I!S|m1;QhhE@u#;nX`dO+mw=MFURKk;{UNMIH)t^UQ(_0uCu1A)K zZu7&I7R~iU{tBXzf8e3{(B>WMK*G{|4JUM#wwdpxO#jaFs9d?Oa{i+Ey2|BgDmNE) z2qvu-j73A~lX`Rn=?c0tz;y^wR2e<1Sloo|`4(4eb)COUm`OYeo^5lsfxMRjb?eiri?pCcd#Mgnz@5i zCzT*mnM#m4rxK*isf2DJIRQ&^8D;5H!qQA;!mxXvfp7YY&Vqi=+W8=|njn0Dm|6x1 zWivq7AOplwX@GEX3=m7D0X~ujv2q$%td|Ce<;(!Fnj7HP(%{z(u$7j)=tZ0{Omnfx z&%tk}K@7Bk-DiNUv^YjFJm}7M2#H<;{H_7E(kfT@mbO;Rnq$7O&}U4Ttst9n zFE*f|rr8h`Tnd<8v1yJ5-%Rjag5e-gAxqOGNQwUAs7*L3Y-yUuaVK;fRkAc)%5i@q z92^Of7cvy_D>VmgJlg-k3A!`sdgb{|@AwJv{%bH6Mn6|MA6|kc6N+}GG zmRgFG+5b5_rPo)Tr+>D-YV;P5p}yqvsKbg<`5jc8%p*@w=~RNckV;SwQVHrnDnb0G z5;O{AQHh$RnWwm}+DzJbMdw4&X6G5FjGcA^${-|o8@;T}jYI*~ zg0S=^G`)2^-?vj_#iLb5M1m^cu9q_2gf1i>%gonn3=eE>Ch7fn!4fNm1!v<#sKI{)aMLC?VRW54p+3%8b0%K66RP7pV}s5(qtF%StX9hLTVZ@C_*ul; zvIr0&#lzvNQxovj&AHf4FGEpF6FvRQ@z5A?jW^pg9##OCXyyz%yGU^xU9%099KFDH!kuwjsq`RT?$h1VJ!T1^kR|^&BbUT zK`0|eiwL5b7@bYfeI&ihAU({(E&hvuLTaM6Inq;k+U`hCP13eUJQa>!LNsXJMxi6N z)^>y1&xqO_gW7LWDQMu;q-^QA+JP#VZuis6+WY_!z}zG(y$MZkj!)0gIF%Ngcj>vt zo6zUX(PD7H=ja-mqm)X`QQ8)sZ;oCA7Wo{#7Qh+XN<8&BN;&79qgi~8QWKv$N2zH( zM>!8GKuMpYl(ulrv^h#?%+X4eXkCSeHZ?B?7O|rsWkMofrM^;Fkpp~=V#e^lXgSKX zK8OO*3WCT3k6uj>IpEQ22zr>HYYEyz&`N^7NKhp~Um|D~L5~o$nxIDs3K8@eL6}dr z)-Mxu9YL@UBD}!d$mx_iE(ac{i4nJ%W=1JAR7d4SW^$A-jhYk*a1_k}z0~B$RUG9= zqozb^If`bFUMfFw7e~<~(@_^h5*$TyQAc5V5~>yQ(NN21dcFu8W;HJZgfr4d2ww`3 z8F`x!9t}~3nPugmF%0488tVJkND5(sXrIAt(TAuv(O*pxAY1e&B=fW+H?!JUHa|_p zF_!#IYl}%(2M*~kdIQn>22qBovb8==(2WE=K~Nn*-z2D>p#LCfJwZkx>nTHZ z3s7l8rKfa5rKfa5#Z%$v?L^}{MC}fOzH3n9hUzwh8aGrt1p@_DBxmA#C<~amJxTqI6WMrEy z1obAmPd4UO5d$yGh{G3_u=e+Mi zjvZ`hBJqC#=)#ObL6bvJ@T@W9&>&2{PrDLA{Qn&MLl)UPe}IXHX+Ve0ccSjjA0lmO zY694_1&`Sd?*#F8SjU9-of!~4oqRcuY6YSZz)qY0FmY|4ZMGNgd=9m3{x{Qz9|5uR zzc}_Cj-6A^o19?HonXthj<=oN>cl2EyH0e=hHhE4=4?$d;J8z`p2kZ;D$`EGt@qO* z6wEgI*(~ILP3tF(H`Z+a7lpDqTdA{AxXaE~>Sh$~va^*q)F5Ir3dh;m`r{Pzd@A=R zfOgU&@)Gnm@>fz`cnVGpw^Rg9!b8Im0bZ^NPPcO>QHf9yo`fIbzZd8^I4RwM_l1}r zq`jtW!o`N;maX`{D%XVq^f#XWJjN;Pkl(o~QG|Y}>@O7;X$WEaY#Y ztr=9)@&44brjMG$WMQ2`cEkBBrV;pFtT~*L)VpJ=5+#3W6?; z;RzW<3$t~8o!L%}U(Hl&R&t`jd}ekgzX&kZk4=#6LR6wQ=DdnolYy4?CLEkNl*_b$ zWY{QVO4__I3pWYAHUqW`k9^&b=ZnI!&(bymQ$fgsJR_$to@Tz_ICE{$htO7LuFLM* z@G*3y>0u;c!7?LuD~?9?Aa&3C)(a=P-WSfN$61yPJ^=oA!8!SX@8kWx7kXfC`XcI% zvg&;7NgFQ+2-elmB{Sg4TMS;kLhTncnC1?}c_x9^mKQM9Cei`1b7H_$Xe{@SAU$i2 zc%ipwVx$Uu($TSwu-Pc&izzV2f?PX~31~%~k*HDB<(Rz^x=#h?ET>~%y|Vjo6&T}z z2|5{f#wbauM8xdbHvdWoXW2M4sKwWSihKiT)u`jYw3V+61z`{qD+UUL{Zg%%Pzqx!w4z}b-q>)A{wo!PF5|u` z?<@MuFTy|uqyJDYbzhbGE+3RWT!YVcuOpkBri z4g9%3w$)HjRIQ5(kz4;&1#MZxQ;G& zJ7R2tvc!*+JgiD~^|u4}qX;icoehDpypVdCnp4UvNHf*n%ELA8_7P+*`2)Ndcl##< z9^>G<0FxEUih{+;iu+w1U9rWjovpwLQb6ABF-vpYo)rb9>Xwb}?9u{)uLrPz0K%*w zAO_%iHD@-OBT=C@i>Nn-$dE22g1XEg+p`6>0g_lz@P90}e=4Sq56-A6A2|}m0`P`D z`p`dnNX?l?$p^V;16}Lu1Bci{Ga%GI*1akUDSZkzIAB)T>@~<4lJ|=pCna-z4@Wi% zVfM2UL6G;m`fPB8FjDxRsZrOUc$q`#tskYDoF?>>6tUxEY`nVFp)nC=|8+f)5$o%E zNPh=cYMT3tcyOdzsdIF^CwV(zNBY+(l_P=I*q@;NV6z88>ihKSHI3tmg1-*ws79eC-u%3p zvjQ2UaR~GYoA;=}&P4EVBgT=G4W(<;oW&@iN{5+U>jhDv5`A`B4^ReqH6c|3Eh^d3 zB{?~N15Y9wjkSW;Mhoa!8i43Zl#3V~9|k9G;kx|_9P9q%R%(#}xisCPa2%}GwD^%&w zE2!MBjZF>9t%kIlpGQA1LLnvC8R8Oycv7;^Cirq z{sA0v3G%QRNh>9DknAfL@f14g;hxrtr+^kpm2wYWE8PEG?%E8X0>C%|uHlvtkHut- z$!XFi2pQ~9s6nKu0W-;$9TOEhXBC;Cl#8YDa&ZZLO11To0b0OdQA6&u%A?x3N63IBY_OI6&}pw+EL8b3Otw>;mJ^wxygedx7vMBeXc z`;00`c4f5~-|>)(EWEOiCIUv^5`y4K=sLKv;CiKJef>HZ`=?+y$%>w%KU^O?hV!tZ zz(oeT2E&%ijqv(S3gFJ87g-SwmAah8sQXIDwTO=y2STSXtnyg1K$zD$op1e2W<0?qFZ6Bqh(o(9nWD z8%%pT4#omiAx4*TAUCKMVZEIsK5hLoTCiaZy+8}B39m*IYrreS7UDTpTzviv7K~l5 z!Zcg3Xc_X-*PVGf^-;pob8__@tY0Z%=~7Bwcw8 z`{hdOs{@uxa$yV{kn}`dXV+n*9Z=fu=@mOpy4!yZF667IjHaJPnFsVTwBWegX#=SQ zxeKrtU~!oj6<|D|m_~)LUO}nz#>>1)nJ-?S2kr8NLX9R^Yt3}~lH_zPh76#<^HBrZ zOS&7+sMDNtm zP~)evNsaHsvoWpW4i<)DuG5MCGkIRFm-)BlX)`+VZ_D%dd`gd&=Y|W%$Wy-h z^W-@hYti}T*#e?uA-R!A%d-*gwid ztmjIvv->Kd?tJjZ6d@~uR(%z@)B1M4{o6%)MKaT5 zH)up?>C36-`lc@fCcTtqH6BG79=bSp3-mZC+|$Nl_H3fLQz;W)bfZE%_v~z4pOdw+mOJOlhyrYX4+R3*_>P1Kqi<+$NZX47CCEmPon|ofo_rC@APvcq-EhLCbBjV9jc#n# zi;g9y1W#Z9>*JQdYwNj@S;v;>1=C{)`KuCbTP2q&Ian6DA@4T^55=_cgwomhVAS;( z^8YE7T!cEBO|I+FBu*{~ByM(hd<_t0n-@~gSjUBqHKYdHJ~|fmh2lX(TgWwQeWeu$ zL8<{C>eh|g=6Q)3E|8Q1@;}EagfZa0THpG0pyBqE6(GZ%Z2`2voxR+H_X@mycq0(D zeBPMiL<8Qf7uOPOLkKwm8@{EVDodx|GTj8{;HMp_W{-vGFUdz0!1hqpkZ88Xwat zj0>q|qo6pHwW6}!(I~_#_e0%?I%($tdK}hNRI>^%k|xH3M_{GHp{QqWD1Y$cq>} zZ0|)9=P^xSo88k^oGUL6H_z$meU7{?R%*N*Z^bT$ys$)mRHYn(z#z8GantS~tEt|# z)U3Wma(d=`!rOC}@Y=C)*M!#vjXIxtap7%3<|yH5lXi)KPDL_83|3UAt?R*{I6|xf zMU$Td5L41hB`Ri?9B|*i61(0iR)ox2Jr#*u_Y%Zkq2GM8ro^S`wF$E^wucXdWyQ^l_Mpuy6+?JP+9IxEY1#xYKVg&xX(HV zZy;6(I|-{NHxGN__kxuZiN&UP)EjResft{p1i~Tq$7v|v?BzB}8e#8HGC0yJ+VL7L z4Tah7Kt4Tyw_-}Rfgh|mA}Vt@WgNM9)Bjj*3(z&CC_44p7QEgyK~Tpnl}oa?I6!4pq%oF ze4&7mk~ezb5FI|r!*kF>^00mqZ*f~FTF5h%Nckp3<86B%AvT_kN=0_+3_k* zyvobo#1e%S1YR?Uhgcz`EAKB*UJo%`9v2do$5;lnP>Be# zd+OQKFrze{Xq9#ZHDTp6YXE0`b}FQlxsiXYCDEAj2`i;?wx_9F z?^#*1c-C|2Ecqr;P`c%t975kxu@m?{6XlY|qHl>ZvCr0ywCoe)4WfYPvP13?L+mez z0@c>0$yZe&2Nj@7aNv4_Bc?>ys5(QCZx)5?LhMDO5)DO~-7i8v`)tS3JR!><2d&@k z^+e1Hc5#o5E;p9MJ5aVhn_x-xxY5`70~+I-$qsxHmwt`WN>m;R0b(QnfM#wQf#ruA zBDs{;X{JsE1r%Tr44grU{T@pP#$cch$iz~y&qSgKvFoWH+*+(bpFv@nsH_s<@|7$V zC8uI8u}R`{rlfg(7Zzu9=48-ef^1^WMn{-s!1|At+-NC>*l7fssCX?3d&BG~tlj4q zJ~XPZE6jd)R$-VSD3~nFR7^@}r07+-YeXKNwoQy@!-CDcQnO$vaL^qtsq}1{LOpp0 za(eUQqE}0Xwq+*7`6UM;cBMOM0aoiu6=oyiHcB_llicF{q4OaHVXP#M!~&?@LNtSu5L!KyzWSt_GL$z|X{4IHfyUND@D9GD zL8TKB({A&!_Acpk(L2}C8WPF z;*m47R08R)OOh9jW@^~*Fq)}1nt=leyXT2lh;@3yOGT2X5*ACAiBhIwD+#*N(?}~* zRRtFlT6&t8w<}vFq+F?-tcdiQ+^h;uuX0g*4OJSpdt@qbwES_FFq2#3+!$&|G-Mu^U4|t0^V~!?h|w zd1w!wf%o7tgc3U)@@L-W3Q+Eb3v?NbeDUfLX)ccy#~ghEN(#!v>zEyYx(%);-tt9) z%4sO~6Q$bP<#L}FE=ZU3W95ZMfkB}E>%2R(@=%NFx?-L~9yR!4d6g#9EHnl}6mb z5f7#jtsJo@jrb}@Jeo#4%Mo8qBMx!I<7vb(j(9SS7~zPg(+H1;I=3&4DBy@^(}+@z zcrK0Dz!A@<5PLfTHtZm*F0nnl#LKA?4Nr4KR~qp=N9<1{e$5dF(ug6BIFv?svWe5f zX~b-f_;nhwf+LQk5gRz-Xd1DDBl^>bJsfc?jo8N#ERERD5rb*OQH~f&BZfKRL>l24 zPn-^?5q^#sNh20>gpf$-*h-EN(}){^*y})Am+4*?U^<<~eB<_G1$329DO`AX5N# z9>P*E@EDdfwV|nso23`;#jDfjvpZVepj7p;3{RgFTIQwh&|wK@8hT z3_pbP`4m;|=xPxIUCG-j_Ht5cdA#`;iGbO`{;ps@c6u_GhFQ9uy#gHjFAOic9QEZ{ zTuQujF_>>8RnZu(b-yrl>isDvXP$~n$BYinKpE_E&f-jI#?Gjp{RyJ2?NOv-YzG=4 zeml_4p+;B3lf9{a^|WZ(l1dt0w6pEUq)F`QH79z<0c7Xw*+JShdx(F0w{c?NDP@ zS+z(N8tG+e(y@gaY6WK^S)f!7DyAxRUPH-30qTnXlSjlZgCbxT+@ow_fs<)zohv9z z5!~~*1Jf6*@rf`2RGs(LUq z2sZ`bI1T&`8X4NCE(Gs%pU_pbvA_i{C+=665d(xThml1&H5Co)`4?3XB>umtwduUI z&`Eti)n|)AD%dDt@AG5$^r?-~t9oz-o3o0=mILnpUg}L$`Jb2MV!hqhh>=y8y%PYs=wqN>0|CYD6b|@huPPmelTLbjZcw{c_kkTsD#9%SaLW9 z+o}9=$o->nnDj%~==D5js_$X9X%*~Df$}8t*czlm><1-Ka?r8N@9JUS#Dss&)B|I5 z7&P0vYN260ECBxq4mU6H=~52c*~LI6|BS-yW1!e%B$0psn2EOo|A>a0>qDhC1hvxD zVGYbizAELh?*_>7)b+5#m{s7w)lh&wu#c{yS;yS4T6A&l_pndI(93A0cHlQS1>u_H z5F~rA)rSfuMpt@R6LP>Lzlg=I(71G>-h;r`CI_A~aTDIUWICz{F>HZ(aGb6ZTIDk) z>1K9~#>Iuuu_&LlAS&Gie8xS5YMkfT1RQJ?kyxKY`LATSTl`rCl z1(3Z9qwJBcgxmijUPcS4iHCb*0Tzl$B?Ub%lhi77cqc8330OqQOK2pJvu-G678l*5A z0W=^O)ura#0WhTIY{83{Ya1+pFdHYTIWeHXx3$q+``X2OOCO>USWM5HMfAL20X-Ma zqvw*@cy4|$XDxqat>mu@{QPAt;ICOe{+g4I*W(XcLwG4cVebn57WY=*jacg5>nYuF z6tIpsjf8uC_4(U1!sRUQf8!jIv0FJ z+ahWTP(4}$uz`E+;zkQQ4Wagl1&1Kq1Ro<@@M0nOjaX>n9S>sG#1p&d`B*zWpJ=7$ zPj=ArXWQ}I{NQ6x^H<`l{PjePzdE+?*E4tU*Y_Lndi>#z$MI5vV!Y!~00{z~1klIZ zC9P0OM;b%%jy*hgA92!4hbKW1%=88KLD@_Dg3n@((}A;^(+bJpZtz<5)O(5GJ_=cK zN|WEi$eroY<_1L;w8;VM{I@B<<8b@*3l8lRjp7~{LVu!TjIzOaN5#y(%;0eRT1ULvB`pV)SwmN;?j>FLdMq|`$p)KQh~+QY zLa&@9A)7^rjRO)dJCGJZ%2t-Nf^+!|Q=9`yn}$#-k2TuY;yj}`cw)yTfrF!(MVn|2 z(H69*)b*e05um2Aaq=5xorFcH8+wYQARjRISxGRY9D50KsvD*s_h%jfLOvjBxnx38 zxq>5hHiBG6fpz9#bbo?u}&cjS42Lc0( zka?a`nU52nwYV^_-KG3CzGg)EwBz9RIk&&+m3thP9(c&|-__V+nR%}%UOUn(mgMcU z0)wlm(#X{)-f{5m_m`EN+BUi5oo%^T2jL_kEbFR|JK`ZRUg3c5vn%{CgQQS{dGaO( z3&;Xi+5^Hez|q474jQ5ay_j)>FRu_h@ycPSg?5%44>A=6-3SvMYd)G|1or(;?2o zVI`O!4VJQp_RRt9)TZxn)G{H-fb|Qw-N^R2CBTxP*@i zMjnBrXhViQ#t2{DcL}sCxe!{D`~N{QTqpL{BuB}X0%@GGRb&@y1(40AYSrX!F=;Ouie)A$M8yPWBO{5JxEMDj|A+O>(p0Xh zdW8B?;Rqn)e;<}GQc>#J=2$i|`by~vI*eFp@{VL&)HT>U^3wrwO=I)5pzGyr zS8`UT<93Thn$osYV>J%|XVndWSdH0mbsMMaY$1+w;#)il#ko1?Wz&4xz_Lkn)Kgjj z35-L7hz^s+V&(lC#7mJ}u0~Kb9BGGfoOPFId9~x@_AKRUhvLmuTu#gDmTq0wpk`Qy z+pfB9`SN}U?yAbwcstv!B4%S#k`vhX;m66_^Msua_AP*FMV=NfW{)Bj-|iv(j1#!U z%XUs9pKm*!5Cz4hTXDHER-w2dy=93i({9sJeopes>TsggRL!12NoA-OTb@bk<<((! z?*gQuvaiDv!9L&7TPm8uY$Hn5)~`!uQjhF$Q!jp{K#ymG`&Rml#-U!umQXRAPxqFI zIDXO0A||t=n$BNdBE^8wfx|K9q}>ynsyO5UFtZ)PTCzY>q|oE z*Dx!FxNmSGgm0Qm4J4L$-3bJI)SL%lEVPrLv7UFvakQb!iLGMXo@fz) zvP83SCv%)U;7DwB;EJX@(c(DOi%q8x+vNV~M;5pIJmAglrd1~rTTdt|pn8uyFc0rC zd?V9z=e)$$dGcvWzrERgh5KFCW_Qapr1~lKDy7OjNWMnNK}t6H5-szh|DD+C8u+13 zdN{FlIB_+#^3Q35!BMm+HHtPRQ?wmPd^FdzY9z6BKS9V6xrPL_8luXeT< z%9~tAegI|Z9xxw&M*h7;EqIJqD@d$B?LG8ZiGOSH?+*Oabz~0_8x8L+Gwmuj=@`hE z@-^JrZ#+GgFRhG* z8`GCleKZwf?yFa=raoy&=@V^AMH<@v(u(Z1ztR)KWy8N!9z4Q6JnHA+vAGnFJ41ME z-GIl=Eyvw0cKln7Vl6c&*0LVOT5d(LmL?Qy*@j{*EnC_Kh~}wo{0_bWVyIl0MO; zlC;3AD7|vO8&Ri@KcHc##)mE4AKPP_6HgZ)EpYv|k+#!33)7^m$8>D5Eo7 z7vMLS;&EpPkF6W<*trE6w*rU$;js-k^e^#3E2t)ZPS0zkz2I#0<%=(HXkkUz9&+Fn+EwRB2nA3AAhfYG0y zdeBJG;i6ww;X)Fxm9aZ_*F;{co0(%-L>V>=7OX-#UOO-V=Ob->AuoK(<$hsBfkXK% z46xX7(A~Zm3VK_Y34f%o_kVx}G)-~ervM&hZNCd{MCI>2sTm;u7Yb~4-`Ta;HhpbcS7vu#140VDqrXSR5zLa*tlKxa)@6` zNuQqTrVV+_0rkVkkOtyhNsal89`NzS7PefJ`>;4Vw0syOO(>d_$vx#RL$eFZ$?zEr z$STqDM!>a*`ThvE3?E6aa`80o0t{pUHF|XTeN1^UU%T7a8&q+3RR5Hhed%fV5b*h3 z%5p~{>d|&dVO&9?^_R7SRoegTf_`94#~m2uUf0P|akF$oJa~-nH?Ubc7GFLht7l@j zDV4*Ca&tl~SMu8uVjDs?*pEP+y~;c6He6!w z#^xq{;0S^ek`sy4)CStEh3P;;Rer_j<02eu471}v;65eY$>W!Fd%%_MjV_Xxv?4wx z#4c%|H(UEH@@3(l#il3=38TE;XyV%q+7-c#l<*}wDAE2=Im|N91e~Da?XK8(t#Rn` z0XAMkQ{(ZqE*3@mI4q%x@4&BPKZalqF%gA~z&Krg0BmPPKx%>UzoJ_(CfETZ4*g9e z5G5r?i3eDn>@n0}{{SJ1ow5gz(y}$yO1dQ+g5glI+bVZicYChLmh#%)iVf}#nXafZ zN!W>*>gnot zkGzB^sFEen)q|rZ{t>FWkZ{T{`x;R?QY(L^#wOyPc`fd-^DOofGWZFl7$nzu_6Z zAH=+u*r=tC;^`!#f%+d}r3Ohmzetq)BgP;l1@!*As3>RgPSNP$ta9INP%_J(RW?=xZA&`=YJ7zb(x)GmU|quQ>44N*Hz&;Ii?xT6^LBzgmYw7dIt$8(U8}?_(JR@%l&(m@$kz+7;*6vYfmN|$qOiH=gM;}1s z)Be#Fg9`h!qtXhfIoZG9Z0z{VN*`ueh+RP2d#M25drNuPNY}8NF$)k7D8QP8LV=-5osuSuq@@;w>I``;XxTvm&GrrDHSk?hP`NQVM29aM;}b zcVuggNrlvqRA4kR-e@F4Z$!!<^6dwR;Q!$Gvv^B>>}GZtkWz}s*9rCufU0z&I=&^J zWkGngxcMNJD$OT~FLytLUxuXX{SB>g*o~Dok+mQeiJK7}`IHeHl6yU+5KxKTov;Fv zd>hJy03m{}2r5<%2fE_ThY?;g1oJ(NgeI7$02w@=M=<=Oc&VVc+~vN1JRd$EevE^L z1NSw9T_HA~EAD=rjUzsW&|Q4ZiIO#k-0~kG#@m1CjaMF1ghcb>jaCJrgy68{liK6Y z6bB!7Kl}^|lmwr2Km0h!{$RXvsJL>UyZs@gl;!zKsY~(TVjO+z7<@Lq<|vj=+)8bJ zj_#`}&HV_Jp4@q%8qLR7XX@o4_I-333ITMm@L9+D?VORB}Cv0pw+mT4=SXmJOYF`kgJ-FV65f+^ArRND~~P1R}FHv7kxv2 zsC)NaM5}Rg9yGqSIbXn`Hi8Mig9XH)wtW`zrY#{2i`*f%#V{9C8Naw8ZKeQW58Hz9Co#5yGnS~_&o0IMXgCIglL+n)u^TXF*(y{b2Fg+l zV3D)HJ|i4bfx)F_&q*atusZ*jx|Z6!R?Q`A<%BR?~>UKxV`YlDt`Yk&qJpSB;} zq!$z}9*j2+!8LK;|2!83Mo+@mu7em;DCE%)dx}AjYx=oDLTgT77L=@EZn+i3xk3(; zLLSf+GGAB711+mcf`?kJRw@yKKGOZ6D0dB6y7^Lu6W+UV{5$ugP%2%F2qQeFf<)y3 zC=PvRK9=ELiVUv74e5E9bkLd;Tx&*Pr@%wxer;H2<>i+v>3feF+(w7(+nT6wv=$4o zJ5QQh$=X`66iPQK>&3vylAhSS#B#^(Nmt}aliS~mjo)2sx?-(K8V6?wE)UMSjw!uK zEBAOniS7v%owVbY%}KK(HW>@@NdZ@~PMS@ztdjyqn`4&1$ud-ePf}`FTd+d@EnP*a zWyPmR8}kAu5x{$i)cNORCyTfEq#12j@W|Zcwks~gV8_NQrkOn@eG%u$r9NE0{ywC9 za+$a}c46^dqPv}3ykZG@`xpS6A8<{=uTaul9cZJ>yIeRz0SRrsSc~tJInn-umEG=!|)S%x@SYGbDa@P!?d7_XOxd& z(>UM-*f(gh?Dvh50NobC=NLbFo$kr*A~#w49AnI-+&#eenJAb1RyZW|eFZ)?z-I=3 z% z91#Y%_k*x<6J{lkDzkNn45N*a&jVxC>?1zCaiGz!)Og4!|GId!YwH!a zzw3?H9W7ZgK}4yYGn8h)6CJ4Dl6!l%S6Sh~kGP;pk{BD83Z^JjCj8^j*uo z4*yH3JP@z&u!lLgA2QKG#?rO;=?se$Y-=$>@hwIuzC{bg7s}0D_#U<6y_gRJz~;cl z(1no+a`Vf^g~S?`&4;9?QS8j7UxgFigQYAWuaC^@1teGY1RNLU;mzZ-Mts;}hLYN>($+=L_hpyyQ-XP)e@c+U$-CK4;b;a9E{#|ClSPN`vQomr8xW>5lSR)tU*4bx*z&Bq^>l3O18mi`Z~eo z4#hPTuO#OcgC)p2h7i@BM~jSu{TVg^6Sl#E9GWBL4mCC;vP+Sq>!X8g0ZEG-U1~(3 zZ>x?aAJK=HT?BGySh@`J3k*8gH#KtSj5cl+cEeNEWBo4xM6ADu-3^abKfu&}h=g4J zRuEOL#I=2O=UpV?w`mhm%H0NN7v30c%znA$&Xm$P$T*3r6INr z=34U_Ceaa3<%tR$Yw^;k1?QpV*Gcn_P2@ranfxj_REU&G`_|X*?xFSd1DrY#XXux4 z?80yLks-n{40=l^F&;XLARbHeweNN1L9rUAzu2$R$suyqZ~`727qTa?tili<#*g&; zt`2j3jgo9TO@6av#eYD6K5?Y~Bz7HcHE0(I`MKs2xfqAr(>5wu*dbz-bSSO+0hBCt zM6CG6X{)s{3-^Gu587$PxgG}u_&pwks`A!c7pkgi*mG0r&VqJta6f+K$FVU!3sfjV zHcwgWK3l_+KKNEA5eCob`ArOfLTN5|_*rR0Pmo;SYiMS!g zuz_y?mpj;-u=_8Pav{LNjv+Dd6tXuy40Ry=%EL<3L-8~5)KU=&to;mCEP(bMbcT3< zUG=uAu2CBD)GatD^r$%RnF|6Kz&c(A-HMy(!)RgDZ!oP1*HkOGBp7%v@K)etKvmyd zhrm#}fbucE<>|)mI)IA2*g+Ij)sOVB5ylQ8YZR_)Sa`GGsZw+3gqE+F#uUG!z;Rub z8Y}R!C;8@#AHLy!&~wm979O|EWC7Tp`BEQ4&MJ!zb zRJUWQOIwp+MeHce$F(u~ZBe)^v}EKw&)qS&dgaFF{56sv*9sc#4M$Km%)Y06fdtE# zP1X(f&{I{s`1;}j3*79IW|#CJ{njC7gVOte1%>S>_#DyhO)^dI!!?P;9bV$eF2Amp z^u~(drC-c_0S~(h1IX{|k!OG#JoE_$sMwSP54e-!1D6wV?M%91h`PY&L7!_Ne)I(D z(r>_#q{y(O&qYzCzD}L>B#42BaKkXw;`Qn44h;6qTyNlyq8e(azD7~sN!rw$XHm~+ zRk#3Ed42j0q|waC^GBPXQ}yXlRUK57*LP7>3meon?^Knn__+=58&%swwK)m;yrfZN zbS>EEE`C_xoIAzz=@yYya~{{ogjocRzp@3pAzX4w9U3$IXH7K!6S0~~N85I>6;r0g z=6+=t8_;~tPR$LU)WXzxL5csr#LiRJ37Zl>)JxBsIYja6$;bLl6N|USVro1 zGUc5(9!Jupsce{?f&Hw-2VIzi3M>sSLVO6;ppRE7&k=i|v7i+{#}Tu#=VqemG6zKl zGfC~ymwD(5zVsy&t{KOi7zrvZZ$9&RWR}ST$`P!9EK~L7izd=6J2uGv}O^pKLm@Aua6F!1#-24lhoo1 zq

9U?tsSuwuE4n`lguA95DZLv|2lD4WGBMU~jp@gtHEOt&1NhrCTd(Rz7JjZlb_(yW9xaa-pke4#7$( zgMAO<2<5^l9`3K#(@f^_XdCo{{q)!F^x;kobQ{BR<{g;W#!#Z8A0Z72SJ&cDq(Qq0 zIuBQ52vr7@Rsid8yyFN;CORlH&aYa=JNgMu9Hr-DN9g&)uj%=d!}R>wAv|$IbeO*q zgZ%Zx0siXP&tK1U@z?iX#_REiJBIL5=wc`Xz;B420MN&q)NhE!JC5-}xSmRk(+Nw* zF%F>GAOPcHs4}cy0p)CC#%+WmV~Lr7U#oMI95gYU`VGW@2ut9#_3Y#?>Ef`aNVvH? z8;cVxAL$i-%LktyV{!R1XNRehEc%Dj4AAe8rAdGodGTOazQk zq4L~~7!+tfwx46Dq-_{>YP7(i(sw|Owqg8|FnN#*I*2bEYGV2Z7J6FAjJV#Wuir68 zf5zrQ84vNROCiMUQ5U4phcIIP^vC9CC@n!=*P+q(f*Y;y2*Zu0S0>^{b{Nar3uqqZ z2dnp}YvoX}yQXsk=xEGk-vd~C(i#FM=Gcre)a;y%HB!WJd?JP-e$YfyO(krv5md}#TtdZ3y@@Y0tQp^5=seDQKJ~f zwROrlg(DZERK?g*R(L1%Jv9OKm9^kh_rDTlz7S)WUr!M!<+t5`x5XE9Dt&VQRkt5l zq==6lfVogsIP%DPXVAGKqB4@bugrt7ROQ}9D@PnC+fHfn!co zU0`GX0~}A(Dxyv9LU4+EZFCHM#w8t57xHd>1bjW1d379| z%0=LQlvA0D9zoOcRO_xU86IWZnGlAXJC*dc2Np1)miv`l!EX;b@~lJ!tQl>=;iT%M zsG7s+Lw?HPGU9I>0Jmj$Ong3AUzR^o7Q{Uar3XE%>4TuxCk3) z)p+GC2z%2p3@uv)x#LnMR(-DfxRUkZw7^25{r2nW53m?i?tGuCNyk80h#l!Pq``P1QlFJ}p$yI)t;J@aAZ<5Br87eN0Wy#(6o{6r`(SnXO?4)uxerYrI zS6Q`68T3;hSSyo%pwHb%wUh7CHA~tzy5JwkcZ&{p$4d}`{AxjB*&Ru{e6s_vtK_is zw@!q9x~i3WN3m&JdF;xz;snyMOWKMNWXESxZN(4MJG-rT58g_TbaQ7L2qo8c-cPTp zPMKcUblyj=<(=*HTHIFrC7sA4I+5qi8j+vi4I&qGq7@-Ip_3x{NmpkFy{w(P@xm{d zhZ^Z;4D{>vhoHR8E!P$~NXT>?3m56S>o^OTG$)!bbIRRE3yd+=Ju;CJI!I z;1>%px1{-_^bfxo^VFj#flZ7zFhqKIw7R-FtkkC;43r#x(uG8^^-W<>}Q)av{x z_ToG#yI~j3+#9yz!EPp=Y8&3{6KR#w6ulGpc z;1Yh=^(cNT2(hwb6oz42Pr?=B`iCFqLFC%_aWGs0H$DtZeGbTd$MNjTkN{2_xXbWY zz_s{|q~73hG;uV+e{(VsJkDd7_$8LgPaDl^DHKl^#OW8L=!b3@J}7~)Byw<=(!U{g z5VOL;XhW}UBsg2FQELus8a6DWmK-X(g_`FX`(gPG;Vv`(P#-2^!He3LVGgN~e=FEl z%)bb`pi}!IY-ye}UcNgvZmUavk%5R1v*3i9KI8itdDp|HSPp_D^N^uj-OxRN!(@}B zmoS8NZCY4W;d5n$k1p`*@1cfgu{$Ha$Snt7(;M~!p-MyA4wg@L`mj2!8glax?KP+b z-yWysgGtW?!#N=PNg9U89)9>AHtcc|>3)}HOn{+}i`fhfS=aLv>FXXX6CXjr3!&fW zrH^ju26UJ{ww(gQ5zA#iMii|vw?00P9iZ5L?*K(*s#(pYI1r*A{eJ05Pzs#Hp^vW! zGxY-YWvnOrUCIT+01zv+ww53U#Y;hRuwfyWH7=b9g~Qd14&v!tta8;jFvuyKH54XLGaI6!K_@xxC z#GRd>R}}(pEyKx=xx93@yY=*qu~V(5XGnARnWQParI@R=#WX{*lqWNh4!qTV(EVso zeUl|KE6}vqYrC-wOm<11P|L9;t<9<+InZ`saYpPC+`gMd{o}pkJ-dFs-m~&iT~jUP z16yISHG%>N4lFdu@F= z=RXUF9}=rkj_~iX@m+EPnekFeXXSjy_4v|uH8yr_)w&28J5m(9) zRz^jG!?l(pyC>lO(>|~tAXG2?fFoi6+zSJ8Dv)?h#0zx5M!&Iv=s#{O7}_|LZmH|?Y6<)EjQw$tYwmJgC@JZfy`}MbfRdPnUx9B+EUv-}`N~DSP7v;h_YC*JY#Q6vDAZ-uTf0wr2Oxs^8X0UGxBleQ~Z(gZeqcU zsxn-1CYBMWlNWqTcZ$wZN=3*&AA?mLw=*x^O5L!Msbt{C#1QUaX2N8KkzOjYzhMBC zObV(Zi60u-NU1*vV`xdq!Nl;s6qk;K`A6C8c{T$U=azI zU{qoU0|`;NL`Y0xAaqj2#U_w+5l!V--As?p>$KXhj!q9YeerD-(DsrGCIKA@N^2qn zgVK7^MQc;(7j z5}c2eZLzj5PrE_zfQ^hV)4m1)`vpz^N(4FU+Nwy;#b^B0EL;7^KvVxk+7Nf<8PAt# z%^dE$+pe|yFBI`2gDyokFgl#GWNXoqsZQDl@4lJV{BFCO1!ZZUw)D6+#+`Y>^9O_{ zwSMFbg8xBbp2R%;C0iJ<0`jr=o$5EoW;j%D89EzA(^C~iGV1pMt0?}LId|8|;JExX zVT*_+n+%aa_E%wg>zF}r=`5tja`af}MZNRY@JKKyh-_4a)J}m8WaSLVo2WXA-wLV~ zdd-f7O*B=+@j!N{EDCB53_#RLT|}GKC6cE-*P3@QGh%?P=K zAKC-LA%#DnjPhnd7Tq|<7qqUMda^m%+Z(VApBUmyA^i+L>p#$J!`)HdcYQ(Ix}?B!p|fYt z`kHN+NoakxhCdI?U(O1Zeu5Hv;lre!h4B{!A`R6u5tAJ0*mYeoBuQei`&wp>W|0vN ze&W~_<=8beRg}=eqb9A*U;pIFF9Ngw=IbB6p3~DMOIrf9^QcMLumX4c zn8pcB7(*ka?Tx#MZ)TCF&y*=C+rH3m*Z+&i7&}#7{wa}C#ONk0g4X#dR{wmLUMsO$ z=a1zhnK(LEY08!}cDIdw*y3wUYSCAOy@dOO7k2H!ObRNMP}Y<7&XQ9nF}_zh)$s>0 z|L(nTelSVTr@=t6D^K^(Q-lZ|nO9~qShiPi@ zOr~eD!!c8Is1)90_=A&pMPr{iTPk=L=~V^Ur!SFZ@*5UrWA%MV#Lg542aP&5t6D}@ zU+4#I)_*A}McwjI$?@4pjyIm4V^$UeC7I=b0c`a;YER1m_6%953*i~wckBO*FK|t` zsNGW3O_8GZA2)%A;1uv#%@Sos_(7R|Ac+P34U%c^>tT%CAI?r~oO-!llDUu% z-;)buSgLivocxa)lYgID0QAdfW)*ruRtcM0CHjr6e_wcokPWf!0O97Ws=ALdh%$`4 zWrF*);%gX(E(Vj(cigGjYflTnp16g29T5cH(At^$M&muSc8b0x{5n-%8GfCvFA2X+ z(zC;_SLw>86I9>Y4E=_%?>zk~^Hm++>6h?@UEhHU#TW}7Rgncxwx?8OE3u@iEWc7~ zq98kpom@eQMCs4b<-lX`8nStT#WN|iZh?OFWDq}pK>=hhYnvx2U6wakd>gP419?0z zm4;TFy9KbogO$ZDBQ+DDB?|D4NnqL=cOL(RuWB^Kt9>gn8e}dMKjYwFJKL7%= zjFf{AIt-sYy_UoS2pw&}T8`&A2vx{b&`?>9pf+DuuQUg1(}4(yQxY=I7TmfDnU zbj5htG1Q4fT(Ddl8)zIyR)*M2?jQjeE_skuP%b68!4#N53LCx}O$DMS;J1pRbM@kg zp94PGpd2n0DdF}|AmI@y`$6hmc<=EKq~kS!*PM%oYQpHAhrcm@#wn5%_V* z*;Vv5W6uIFL)(|u!N%p?eeU-~V=A~1GSY^Lv|GZ$0HQmlBmpj#1B<~t%RIdVs=DC8 zXm~55)xM$3#om;i>AU;W(q*^xpj+)=!bDF=k6`<-{K#8bvR+6P!g4CZnf*~V`#LO+ z%R#_IjtLY^t*Ve$k}#2^cKMOFveEkZADkX-9+}>y&kvH|QFfI~c1>Q%Ov!nw{3xlR zOY~;y9tKa$T@J8lMf68Rh6Y17Pg1Hpl;qGjo&FI?E^FLCa+OTPjzoOOtlR=guJTaQ zLoR*Z|D0Szh|J`RB)Q5%Nf3?KV+JKh21sfx{BuK%4*={K9tcg`K9GYNAobEZN{VQh z-l8zZI00!tM2blGA&TJC8<>$4t}jQ2M+z3*2_;v3&e?Vtn&A0itYwe_$i^ZxKk}e~ z=ag{fH-|F^r{~rxs7@p{T+U>nDrll+x76tc`H?qHr~j&QFe-LlyDBE3A@Nc2mLzGH zA9*XgQ2*ngbc3X%mbIwfpI>%q!Rs=az%rTpO6@UFgW`d zfZ&+0_N*lG_AHBR>oCMUZ99ISZJiKoF!wH0$=R4c8eoA;>FzeFr zzTobU80X9?>aniOCr9L@u2Mb!8k`7Sb!5EEE^#v zlRXhq@`(-Q9$a<6`@a z92+?_CZOSZLh^`II{F_}I&py72B4=U_ot=Yr=_^3jiSp^O8TYA%AOaL^k7V>L#Z8q zN}njR-{t;lOS0#N!2FOveyOU{74qx7Ihf=-8}AwGJL|w)>)E8u*Za zBi8zZH|cxfw7~YN?g_Kwma;B~ZphO|1DPx>-V5{$RuWShZBaM(8FvOY*ya4>Q-Aeg zU(rDe%Fgk~h!lNDiiT`V`gU4cGd}@N&irQ)m}D>)S;>r*=iU9p@>h3qT*OUW^_ic* zWdCs;48AWIOYW}(*myBrX=8dq8v&K;?1OR(hWjgThTaClRhfe7&|l%TEyFG*Wr;`V zrS~O1BTW)*zb|IHdf_bfEq6OQ0h~;8JRj^c_^n(-gqiGcbRoPT3NIdRy86b=b@PiwJEGIyzsF^sM2khQFtj`bNWRu~Bh+Yac! zJ61(HC6NTyAxK7Wgcd78n07f%pu>j#>F)nwDYK>Qs*()?OGX5i0})u1#EueM3XFXK z%`9%Wpv8WK5e;ruL-A0KK9!o@4O+gP8-tO+uErem9#nYfL;l4bv?xdD9Ml`9{0tw*uy8vgl%kWTG`9XrnQHM zdo4zS4OzQj&wHcMO*0o2uum@-r)4EkVS6uj;v)Q zNr|2r<&DL(FA+{<+J#2;*d&5PG-k?dQEv0*1Z#miA=$WU@&mTinJq$ zh(<_Vr2D$bNjR*mEmr*j$;qgeEUEc{%@~4`K|>Z3)mtoYW9YW}%fg}A{W=Ny#&Zyl z7>hp^!I#K^neTX3fIHtqBey~V75l3HYH@7+Um%;)=i{PMET~4#T z$*pe_ce3Q^!=W0UYKN0u;O^Uu51T*8I2a0NuqJgnzGcW=%j!Wd$aiGBsa_(XRDvX#Chgs<4}<^q~Dll zFf?Nt^2U+Gebb|-s+7LX$stbyzh_aBynRwl(5tnz&Yx5(HsO_y`VbbBvJ=7BvcCtT z%1$n!)}2C|c8bA+RCoiIvnMj48;d1)uK5+=Z^b4NKHM| zCQh^MZp%>Oc{gL)+fjEHfdDL|z@svnD}T%O6qCDMv`3nla7U&mSAQGEs4PzoeGR$k z<4B|o%7;gw$dfgEM-vUZ?PL`#S%mjC)eVxd7Ep5RlaHr|7Ivn)dMa+xZ+xktM zJEVpDo4LIufeT!Ew*qils0QKSaYUH0Il-HVDZRJ#a&Z$N{=$p@@aVTSH>(Sy?;;#ac-r!q0QQ94e@K{EAHBPX=w5<=_kkvwX{d3avQ z;szTTktW2VrX@nEV-1KOVyBNp)iS$(S%QBV5qlpMm=6`txI{&nu`CSpCSn59CSa~l z4!(XCS4Oar=1FG4Okaq?$LpjV#vT<2UcVTxCnKTo8$6a}no4$k$j8mD_2Z5!v_huF( zp9`h-@!7iQMKgMk&4O6cL_;PIdHQ0y+m*8x=Co#>g@H2Fn0mYy$y6;T@}V?+1bLX- zRIevEB9Ps)P`rO9St}8Mi+wE|DFVQAq7IMfSC@7w^~0ubqUN&WAIGeBlQs$o1juFc zav-Mt)Ws(#0chlPv&*_UIV06ZxAB0o$)o z#Dov3b%;9kH`p<3O>GlZI)@TkI1#q1mwke7^yw)T)w|T@XqcsU=-mil$i}SEo2E4K z&-jz3!|;ekonCVDz9bycDO6mqmcps4{uZnxdemJ^zhM!D^moG|3JW=888GHY!#h*= zX>GGlb;xab?dxL85|$v>gNeW8*61!#fZvNwtYUbDJQtwRD5~wZL|~$U&!m1BuyH}N zo%Lr*B;W=v|HR@>El8jNG5CNaPoDmP`nnxNpLwI#6}Z_d6zU!DWpnfOV@B`nwNXxkij#JT?Bd8S zcIJ%@E#9c-tf~8%VrTo6>E=_N{wFq&Q{I?H{}Y>dnb2e!eO4x&{Z9xJy#5I>39Sdn z6ZHWP@2sLCj8A6?1b)l6++f5YUC7Z~o#et*3?p@!;rrl|aI^G_QaOQ7_#Sitt#7)@ z6OkxoTv~q!#RJgRdz*CkfW+opB-Pr~ALXwr=ga@ZL+W>%`h8gaKB|5n=ePa|F)Xbg zCoupDW^g0{PNz6}x#IOY1x|rcGN_q;wRd6hT@@v8OOSr>m~_-S!9fmex#Mbub<}0EoM?5b8UX=cb0RsA+Dvt5 zt5GF&4~v<4gn|OLh8%r7hXIs9@?#`F4>46z03&(Yc?I7k{@V!z)KFj5}nnN14R*syOg^z~S7bRI?2H!QHY@^+P!m;N9PS+o1yTUwF zz&G*}>>GV}AXQ{cy=o3rdP}1842P2W_h)d95GoXXT9XEb9URE+Q%gA1?9091Voo3j zQ>6MwoNK4OL#tWm)Ks6rItRND-&0DzM{AY|Tq*A)A*PBdm_AfWZsnHvFwZa_BLHYG z2_1JsiPdMp(!nU2 z;z1{ia5#2P=G%h@Qg3PsMb!dTXbZZ)2}^?0ayj1`J1dulctfF8WXcFx7IgY!0|~nW zwns4wOj;#{sSEdmyWzsEv$XegKLshSps~<9n9%ftvZy!qK8=%WEbbG9AYpMIt_Tug zxQiu^T3ofjgS=(Vpm*>p|7@IUWT1)AB~SKHx_*M+@2v7}m818(RsLmT#6~h$t}=Mu z$RNDR%RS5k{lF$Is&69->^?u&C5Bsh8C=7(#_6+@Jkj;DlaQYA&&Cpgc?Ms5{Hk+j z^-OypAev1jF-%A-*CX52wBQ{crm+rwNL?7zi)8`Gbo&1D7_lw>z(E|euH@Iyu~Pb0 ztx7w}q9@|dg!Z}NNL;?892D4@RyCz4C1X&OoAitRO-4Lt&z(X9uYQUMieGp3zbRYs zR%j~@9e>b4{P4F)WFYD#5g1-*Y`?R7jmbF+L(>kj717s29%`{KiIVz4b;utxnpX+# zl;9;2OkdpN5=k4x01R0hyu>boIVu(~M`5 zFyF@d^h9Hqp;RxPO1V;4Y)`oiXRP5QD2%U9~}C{fN$=4AKC?_^m? z@MG}4${zShg8zB3-;~z4LwkG2j)vMkn5gyh;*)3Bo)&Cx`dh;TU;GrWt!aYN`Rpvj z_pj`7Od7TJxC`_S5EhE^&ad5UlgZGrRfxzyoz7^*_!ml~XHQ7!J<2{2UP!$q$AWn(wqQdbusCX%X z+ed5fmVLS;wN>kL?Ap3m3S{4%P&3rouyy1a$_QStJxab^@=cz>sD_sMTB+!q*+>yn z$F|@-Wxrlh_Q0K~?~$GVkz?eM+FJH0-)I{0p}i+bJM0+Z7x}7V;fO z0fE^)QOyI{llyRYo2GK8+$+oPGFg8g`h~In=4yx0(mmD>OJ%WkpN(4~Y})bKq@+B@(=q`2~kdd;FW&fFVm`;U6 z*Z@-ja=wa`Y2?LYDoEOlp3D>_UuQBHN_7&@)*K;3>CzNAgj-K?#?j*RVEAZz74XBFt+t zZ*%%*XHku(avo%(tOx?{jKExM+aPfGO<7D}u2^(~Plb7oGlpP=Xp&HN1~i)#%DO!_ zNwYjH%DW8PLIJ4_8Ua}|?PImi-z`&I1M982lZ*A*DC|L5>OI3|tY6?6s;w6R_til} zVf1g>fly9P)@N~4fhikznui<2!U9CG2oRk$1c>tVuRf64r1@3UzEEtKKY;9mCHOl; zgvswK$q&N^=QBC=)>bJ0n)G8b#dv47#fb2sWZV`bQ=+9#-em6V_W{3tgcU<#Fl5TU z)jMb;CiB)9NzFA$EqX#Ef^KIG7yWkQP$cEtfuEp^wK&0^82{-h5N=X4%?$5mKNnAD zADi*0{Q>Tu*m{OK%=R@-!7IIw_sUOdztPo%@d00sT`eqKedbirj?ZqHO}OjgGGS)D zCL`CsIl0)sc`RIrv_^PgJ9g~I)9<6;-X)YLszC5{jLF8cSxta}`N_~xA8t3MzhyRG zwH{?;<$bxP`ZLme=DE@!$|pE>PIv6w>ps1Hcpz_d>i+2WXV=8p=7=5NQ`ox_F7SJS z`4_!(7RYMs_6!xk)S-7Gh`>he0RfP4c60Aiur(uHW_CxN@M&d`yo@^tqHF`A`!bJB z5k;q(WDtaw6NPB)9(TiRW;f5Zj-A7q|J)tx#|4&+j{czbYne}~E@*hrLTs)hbL^aL zo$Kyc_X+bMM!dX8aUX+=1|RmAFJ!CyBX^qQ`j^?-P!FeceF|^_p8+WMs|0ROD2okj zOCYo5#adM0j;La!q;H85TQi^cKFwr`H4dp;qv$Ui^UBnpMd*5%ElF(M<)DAH;^lfr z=x@9qW=VX|A_F-ndrc=gGf6YN36&0^Y2Sr1V2UBt^^l#S1U~z}ln*C5L-nmHgJ1&D zt48SSr^wfTrDsKYD&Olyre7`29qHHNcy3Ei6K5X8SMZATN8jUpZ2GfDi14@c=f$}) zT}FXtLb~*KZzu75M=|4r>Ok#_YTw^-2yVuciF2|r#N=L zd+Gzn&acM2bLyQ5@5>dAr{0_3bzvNC2yGmV1&cdic%2J(0&ouy4jekdl`5WbBLZhE z4L^=5)~xj2Vt1SO@2PJeI2}m36;WBjy+@Y?=0tJZfvPPxI)_F&$w>qO99!$?&hS!x z17vB3Qd@wva?PU(jLPHd%R4Yo{{deRl`$H1#E5($aD0RXVl;j z@hi3tp^?c{rmpd6k*5`N#=eR27Lfv{H?SHZ(c@XjHS3p<-7xJ>8q5*v_;cu>0`z8>zzPm90V&ZeZj_IBE|aO}6uIc69` zb3o_?nGB<62qatrZiqcz$o_Tkx<5q!Up5wv*l=X_J}Uk&cS4<#ll*Q1>}d>25YAne zNzZp9cR{dyfA0Sv!S-_!7$RW_a+EAqi@A15md+5JyJnUJLPrkB99x+aVClk1@BNB5 zCf%CNNeFeqYTqup#Pj8%8yJwar`7B+A+N*^J`IbxpIj;{QWClN!|Txhk=)*yv28o9 zcLewngT@c?;n+EZ=|8x|vD2Y($zf7f^&*uww?9}nPjGi_8plOanRYszutgT;3q${m zenQC!3PXPwvE55-mBUc@)Hww;eIZP>W^H1QkM0Xuwfe1;5c#MX{PEDhM;;4a)}&>% z8~ZzIY0;tDa75HdALZM4Lg>DQXTsl2PO)_LUg$Z|(AF2wJdrL(v%!AI*B%g37v^kv zdOu63r%0Q>iLYfo2!#Ue0R;~x66AA4jy~o9mES2TbfFUAuRc&?BoD_pO>3GluA&oS zkY(K_{n&tK7q5~`Rj1LDDH&&I4{Rfs$wHIl=)0spJn%5@uh;OC+Log~qrBwYL%#k^ zE8m}yIp`EIJkKk2M7P}E*ASDXn0VZBS+7bEYkD^H~^D* z#@~In|b;x`vsoJI6pUM=&x|jS?A`g zhM1?SFO)UVmxd1ROMKK&meH~J80bqw|50CxJFhRr`OfW2cTzKfl=H%V*+ZEl-uMy$gZECAp_?3&-3-SWJTPPU@7o^ zR2y>2==mUD7kfAbLDXU*M439X{nN()!V329sm)s7fwN_cLsS1=GaDKTe(Dok-(au` zM{JAH=r_F>_!tTEk9+WoU>5j3RJ`Wi_N$!{g)8~G}C)pi?SgcA_V)%@8 z$0V6Pd4`Y69g}SO%rksa+%aQKpX&^t>F$^*rjN_;ndy$1YWfT_d@|fI(@mcn0cm8tN4UFy-|Bk1F8n{#Lz~$Sd1|P~ZWXsmh`NldsUuC;8HkzA3NI z$m@IRRhBOOO zT3BOqDNk(JbLpN;zHBidtvP8PIo1kw-Os?svOXrk0HmNsY)8bgsWgq0X>Ea`PKKtz z@V%lYvK2JujthJ`H-QKgvItzck6xh+#U`(2mb+V{T<-t#_AsAKpbNEP8nP`TS&YWz zgikIfy{M2OGeHIe7(thW6l)QTIOzzv=je})5vb}KH!2nX5x&h>cjM4!te&)&xW!{F+}g2gEO88_1w{%Q zCcq&2^%GFXTfotDCpvG<_#2WzXq^jEhcvJjBa@5XxbU*=iR37JCZ+c_ zU0Itt&(ze(dG<+M;gGLCFLBvcx@dM5(u<9w0t)%O4Vrd}{tZr>MHUozbw5zUT*<8d zI)RK0{IWrpX#m5m-bDR3kqm?M*A1EOX(CWml@1&0JrNH2I(EPymI39ZB3kC{XJ{aP zi_94};=rggm8DLD7cS{r6vZao1Yr0x%iQYebv}Z`hY+rxOroU^|zfJv`TNPx+Q0nNJ zFKF4X_!_T{Mq~d4$4-mmwVD;o+!+W1re+@WXYO{lIevZ#>?tub|BdE-p&_<@Ub=qs zeD~>1C$#F_2*ZuQ*ohw9bO$#pK#vfQ9u274yBdNXwigAW=(hU1ombCsAK3I+$h(J% zlER<)a3H&$6SbxFzUp?{LIh;}OCQR}0lGlu!(bWVil-Ul>_U)~bZosqfXM8K&fFbb z?ARIQc&%Ol#ccNr?){FR|Ay+4wPaW0J8knX-5SWQ@h@&C*NlZmp6y1SKN^(hYotMj|dV-L5Vd@Xg*E07wcE%yrDLbCA zS=HAl!IgH^R8RViW=h&L93TzKvLbherJ5(i82Zc{I0LsnHD2u`3 zx-pc&M?>2oVC#@Vy(Kyn8!qdwQWIrSKTF8)pJTx*zjY-E=W>SlWB?b+7 zl-Au1D^$yDpON{DCh} zk7;@9W?S%9qMy>duh4nTF56%m5&d@kywO+BC7K?5U(0-SR- zc8$x`|2Go#1;y?b?vnhF!rTS)w=g4mSq9(=-62QBKJ`suG zNX#oNo{Qy#!Sq21kxMtPQjP3Eb~P9!X7a+N?@ma9(#W1Z_;^i@ZJV^kNxq}An)+k! z+pBK9Ffj_p=Np-v;CDtJ@YnSRWskkX|HuhmcIl;?z`8 z?tPU{M9>)xg#dd@okT@#h>!`pol>>R8~)!`txr`g=#5lqqGOkE5qjWnH2FR``~4M_z`+%jf~n|(-&@hq>jx^D zEEV-%|2-9j0~T&Wv5zf%iSb02Hrg=BUnhk`?_&-O7)`iC``Uc~SrT=-9 z!zLW>*yW%r`%cGshn6MYS?uTL8mf#rlqf9ix|=Ewi7BrVxo|lUkUp?55Rjy)O>j%K zrX0d#3DS3n@FnXsb5fm7G`jpkOx!nmrh%craePu+n4VO-M{`K?qJS9b5SK+iAyG7y z)ZJP6rq-5<;WikDuL`t|pUx+81Y@z%HCm0X@u^oZhVsA?A!cr@HK2f67{fB#nvr7l zt#DaP!b~WUUYYUO;MM;-u0cOId?MbV9ce=PzLh1M_1mA_quHJi#GagIh1jXc(?1uE z3*;L_qFgR<#ti4WmXq_MCRx1~s`3;)D&E|v0n8rzpr7K)I zp$;I`uEd1z+!Sjrmq+{Ox^i0Qj&>$4fCR|sLu?|jKUI_l^Qgi>flWKKUe_LP6}FFo?*FVQF+*r^soV80Y{wfFpN5- zb&%1J8G@fY;cWX%tK&gAA!eHq$UMllBS*hovGceFqW8bR5Nn+4M(_*D^U0_e>MbpiB61)ICf3!O36btdCX*J~PXv&*Lw58IREnZ>X(0jous{* zw|{xA?ibhxEqlg}-7_&a@GB{WDG7y>VWv4&U)yv9X1~nSb0rlAA8Kc}LB{P*t3#n$ z)H_@p=#JN0{=|{pP&u;e{4Z+ooil2+T|uT@daBy1oK=bi2r0u{-ZXB;RJFW%uhsts zdi=%`N{b|kEx!RfS0XJR{127V*O>9N>?Cdu{z;f#L-apO&c+6WZ4rB2L-U|>RENo1{6|re2BH}3UiK{antK+A1?`Ar8;rfLABw=7Y=$t|%=2v;f^I^(KA(mW zdz=%}8dLk=o_=OUPYjOoh#d41Fh~0LV02E|NsPBc2ADbc7Lb&Ks!{r8*mK6_OJBjO z&m~9513WRf_9$E+*+16^)NhZ(56H z4~wMNFa0&;DGdRcjyQLd)hSP1L&^kNz+n*9KavN{Xv{J12jzkz!??T5mSDI?9pigP z$PuO@@^bXbmuQ!QAe)_jl+Y(MyW2d>mHimlg|hZ!W?d44gj z*B(!1W{YebMSfb%$l%2PqDUM0pXldT&ba-rS^$iJIuW+Yc>NXl*QU-z2Pb%u^YasH z_`qfnJk>*-&b{AOr;`D_nG4dRDm!m+{9%9e+x~#aTWC#b@1(Y#I)zanyW_!~L~+0E zc;Is8;y}_3{zv*qM?d`1UuPq-`-}D0(76;G;b*DCIABJNZ_Z>GRI0JWBwHGDxhB=}7d7~(;{?-ttle`~ms@g_onnFbC zeoaASfDWJ!t{`FWMpncFy7s2y4{b*FScA*Y^S>%LQiP8swHF0*3Sdo%aBa@^zbK&j zUzIx2P13a|6sV`PR|On6#&V~(_Fn4yY%ikfhs_tDKGRgLCTJ>8BfHRx3Y%}zE0w2x2e}ZPj3RL0MqsveKhrL8d~*cchjbHqmv=Vn5+e4y!+<`w)$TQ zB!Jx6e&u71B{hk-zo?pLOfS9t&^zugNv5U=zo%}i|KU1GmI0+M^;d(BK9H#G*Hq%( z*GXc$8j0liO~rN8i{TWFJhX>Y9%dOo6JIsiv#v0`3C}KxBO&iN?D>sD5XUn~{~NqD zL)9qiNn%64vt4DP`vgiALg_Dg+Wc|>{7!GToK57mW z<6)65`XcCxc)TeGg`ZmyO)$<0KVh|xs*gfKUi3gQuT%C zq3>};c!m(0YLSVN37PwyB796ahC-9;FMo_o>!*Ju3kF6`;Q>(n3-rAMVcmoUV-S$2 z6zQl;VfZ7Z^ch0UazA%o$j8Nwp0T&iSZrS(2Nw)>=V(z!Xyv#JUZ^#-{9h6sIn+)L;KV6(!|-4Wc1O&6ZPFLDB@eRjA)i7Rb>r z%jrkmVy6eiQN(c^TYoDHVdv%{+Ns`Gc~v_t*j?NfY;4u^H~wU#H6;Fn?+0vSBK7c8 zyPG*mdHpgz5bGR?=ugEQ>?Zt@m!%bR~*`=jFkJLv# z7wOMeJWg^U{2;OhEOShSJT*swNER_FFQ0=5y@+-&h*CJV{p@K! z23oU_kY^bJBMTzndeud()U|h#Kq_&Hy7JOn{464UHC@FOa33R97J}Cj>`P zuQp%5&1;<>Eyhdo=c{YHWC+U5nEDhz7OeD#yni;grjpgbK2%9h8rR-4$s{Nqgk#r* zfh|#iIj@T-dbF?E<=BFTTs759X+ zz1(`JxIzozFG*nwIRcfM=#w8+b0Uoyp6C_M^Yu7|DH@6^d4sn%8HUM3ThdeeK>MSxG-ryo&JFON>A=bf|t7EPa0E-IwJQ#UJiPRlgvY z_puVtnDC(3E>)C4tBhwYi3HZW=kpd z^=v8j^=}ERO0j!mdPmAYIG)g*l%oFvriXdWQbJ2$QHo7Z$LEg6Na$HWZVAP;GgG!i zd1AXJ>vve4&sr>fTRh8fEH&QQUB|ojc75SXpCmvy>h30GAh9FI>U^1#U`uZS-$u*} zg9qVHIOHBkF4s=T?csA(|yp zR-dqU2g=fWDeKM_6CX$x4woAKV4OJWx}213`O2{w1Qt6cjqIZqxa~as#g3|usl|@X zjm3^dG0ue&@O4MAsSD`#1}i><7Uln@@gq|TpjvJ z%FD-@`&icei!j%F(AS*Ai=D^jrwvMh9sZt*9){qneU#i;>}YO^O_zCd)5P@apb54- zCouE?+?S3e02e8yJH`cIl-7K)g_l^OT`bXvLbp&^t4^4k_i{!JOVmkO*tE6@&4F7R zi(&T-`I9VN!O`@R4EbOQ2`2nW$dF>Thf&%Qt?ebt3X28VjEU(M7lPZP(=8b|@gyGc zngtMp39pG3Q84B;Io;FVe@Rj|{T0cIiIUxf1MwXc*o04fv$h`tBeh2*etc8yr!^#K z(xc>6a}qRt6cv9!d%NkQSomJXo1hjr;tw=^G%UVZKnz33tnadjohBxm zfhjHG7Zy-4msm3fLK*|)w;ao5CbK?@b>$?^9Z1{N0Zl_TNeo6FPzu8#ddtQ4MVkx5r);H8aZbU>lKZPIEf^8ZS5Qcld%@lj2PRshKq-e|Rs{xj_ z%oEaK+cNuwjB+ok(K9}+&-O1~ITS*g8CsA(bA z%V4=imylsb$s}e5gkM+>pI%Wf%S)m-!c~pe4*-<$oz{qT8``7gDHV#TCvMq1ix{1; zlp2eY*s)WGL=euQX%Z1t5i%B41@B~IsrB{8dN0*?lCfUJ54#CjS-+D2ZhV*n2`!qR zmkSvdzt@v3JJ;%jU9+FRbEix8wU@;mYZ&6WoSp0hcCx-U>y4jQ#@_hx`lzT+ZfxVN zg}2rld!P*Z5MtY?FvTkx|NyJjS@k05m8opzF z-D6XjiESx5Ex>AA?6`orT(p@iOv`$)BZ;-3>d!0+Z~V9TBxa~pVbaJP!@c-9!=1Ro zaHp+R?xLn*M;@6i=^^1B%fvp`VNyR?ldl$=-D`8jUDQ|XxVyF3QE&qHOXm5ryze0% zsg|@tMhla@*IIk}Tar5-l>S@WdzRrIz3)rMm0tkd$)=-m(M>NgWm*)>zJ7~i-T{Hr z!a|D6!ZK;3Q@t0kiWD3oXIXGYy72o_eNUQPqhK!hJO01fX2Aa!;sMQ)Go)!J9{CvQ zrWkp35cgEEW8_J~-(eU?~ST2_1dEOlL9ZnT5M3?tk?v_fn%DLW)(v!wJ4>5kFKuI1%kP!s$SNk>ZL zFCEK(@`A)3-d~p14bqAiBzCBvf~J>c!`XWwgUQ!q1=keIriS0D8;c$Jdr7_bWg%UW zf}|1)xCGl=(d7k$_u{BU{b2|@Du`m~Sg9bs{8C})2+FT|$HmJ53ZOMvRe<+N1JGZa ztT<(FzqM{H;GB*7oA*|sw1Q*JK-1Y~hF|x$uD>4Ht5jOM^dn6t>k3I__1O6M;$(A% zH>&H~xW9R#x_Wx|vt;V?nP=k>ZodwT`%#{#lYb`fqroS8g9P?I3%0sDh3LwlO^pJg zTDty5oMVr5zq*2)A2SM=?R}@~ixx9Rm`ZDj+w0A3={g>ak|ccmo;bb#BE{|pZIUyd z!@53`W1?6Cs&F1gkrMDX0(!f8f`94m?43heoDsma*%4$%c$j%uJdd52!Uq?N^5vTFxs`Z^Jv7c>u6V>WO1gm>#+}ee&xNW ztMPDRC7FpI8RF+jRCI02ZYpjG_A3H5_(dL4dD;nn?MyPp?_=Fq#z>|!vODcAws&Jy zf-N<7HuhdkH3m&mHTMsT@eVK6p12!uYW7Ffe0uizSwUOzpJt6H_CK*qVEmo@{^@N2 zvCz`p$#<9D5>B!z#d7G?d%(@1-^uUEx>9~Q z%{CEd_EO8?nAbqAaUaG&*+zNamwu?3J~+gDInop^a@+UCcXjRkKJW9hv679dkFkTQ zc~xc#%NDZ`Yuw%z)=Xm{zW}_(@QA~VWp_*~-$(W`7-UKq)Vtn#OZx8NqYU+)u0EMb zy1wo1YTAsE;u+e z;@!>lNOBJ))<}{dNB!B@phOzKCuiXu`d5?-XQ4Z@zZgLU>J#0y8vcUX1+oqCrC%kx z_Pl)99n+@s8X8$5^jm*0=Jnw_EJ)+PD7(n<^CJM|*!mW~zW!lbiaa@GQ3a_@o*R9L zt6bsJW5gmaGAoZT65BG5O#*av*&+La@TZXVyr)ReC*)%Usm~M@)FTxq#uSM$950{l z@GKH*zjIaIGmH$T63niJGas+BEwe|^+RZj5p?j&`jY@k@_tL)Z*c?z|o(R5Q&?}5~ zqDua~q626a65QRTgS77CUa6f=ALH2ikb1FtX8ZJ!o-`?YqECoZx6)GUNq_j%CRUyU%0iK??Z)6QuB`7V6diE*#|X#175_YNmbxcyMO_ zLw(65UcW)*a;cP=+24IhM5I83Y+e)QQeMd{*faX?R1CW);5v3?58K_hh23)d!iB6# z#oUmat_v$83l3O+)cORpb*qi|!NP7(5R*e)bD{7$o4W5#k(I100c*1dKo$f~aF)J> zx9-LL#AVQRAN{cBmBuGhs2+g^zVrE0b=S_EQInCuEQHT zC5l9df!Qycw~W0kQgYm;1}(Xu&)T=8>nQVVUuZ^llGm-Sll6A#od*QNG50&VyO{H1 zTuT{AyVAqx*Js_CP6LqHj;*re>+DicQT9*nk)<|x_l(R0Z-F{i%q6mcv|SL}Ds4eQ z=K-xdIoKhHDz=s8`iu{>n|8tJjeP=Js=L^ zV$9{lw<;muvCHlcYywtHc^NaB)#H-43*~2+{4l{qd&|q5!C_?=1mntvV_?;WfmQqR zh1l7^MxV&Rh1G6JBhi&I3)Uuf1h1>1wV(_Ic+c9)j z78Ml3x-n(ZT)~A64qs1Hw9+#CK^O&{uE5;nd=3RMtD~gv#WtGvGC@HOAv{jP5(0Bw z#4suxM}xymW@C(CJ|&o( zukYfOyX@5brf$n2oxu(ftW@24E>?WUQ@F~>;9-5``()h77P}{DYqk?hkh+Kx6!<#`U^h$qi1bovwoPe!ej;+6>N1e=c+8tZB@y7JGl^Com1!2zPB7^gI zgTZ;c2+rd@aL>9vJ3N|E88eB_%b5Mif?!s}SH7<@f`Zo#_PzfS)Ay2de3^-5tOrfE ztEYQ3a^1ZZbjgz~QI4&}@{;Mq42@{@u~;HE-}Jey+cM!a*zEOJ_sejb=g_VpIDjb` zV@OU1o7!TXUR~R4fiu;;_;A-}wO_wY{i@^A8jtMFP-^){)cBt5O@voPdJM{ktihpT zCHp!o#)FEFuG{PDafsbjUpu-z$5Ge#Xm|7(#5+2w=TJCD|J8@(uFCzsqgKK_LlLB~ z&Lx5Mz~?73d#o6*_YAF-onsBJ2UhnmAiW2;W*GKkFq*`^>Jv<_hdqf@eQ_Uf;unnO zmHU2Ure~k^+{U`{*hlIlc5J#Zrai;bg>me?24UW*)?l=f=?yw-s*hVdV`{3;TEx)y zVXFrrb1B}pxJL>gPocm1!G8B>wq^;zsP4`(r~WS-tGvDn zpQkm}om_?@Pk22OuGxU4kaOfN#tyJ!)AnN1k9)@CfGPiV=;lV_n8}aAcD7TNt9U|Q z|2Y9em)K4=VT4P*(Q|3^W!a)+%~Kvs)8au4o8j>@!-K21vD_$0=(rLC`cd7Lr^Pn) zaPwc)?%YE=Ba$_VV?uK>0=A~z_&NOqQnb%cYBi_qr4`x;G;M9Gc-EH zQ1%d6m~TmNo@}=9E@x*6c5G*d-!Z0*%C6xbb+Vbom-nGdFn19iRnv@71zR6VpHs0W z?-df=9vvJn@LGL6XXU~~E7Pv=`E7hlkhZh?TxTQ~rW{TMT&fqS?jkAobQtK^^h z+HDw|H9msAcC14Z0}{LGXiS>D_GnMYYPnX9{e~`a`KnzO&sCDa3fEBjy(_wFNlx%a$#*u_{IC{8`DeRi;gU4nku-!a9jnb=5so6cbVqkD z;c{T)$RY5>bd?1W<%fh`m)z{zovbvMos~DcynQ2YHhDWGZyewGF8f^GxU$4|*@v3- z<XO^YKN(#AeR<9F~opR6f|=R@09OT@(tx3{A~Ov&B_^$ zuLrB+90o~pxt7Cw(fCopQCjST=0q7~!J)=0I7cZ3TrKkq>6)F>H6|F-Jv*m+4E9RR zLryR#H^%!K&*H96*4JWlsm*dJBOg(UmFi=>`cTUn!;n1;ay z6VgFiW(rEYXkF>+$d%0o2Ap1&vuj!5Q1qTID;Fzl_?$%+-Oq&P%M*HTXg5MIil)jh z)~bhbj`gfi+ur-B2DX7tv6yobS=ikvw7z}`UXER-@NN3cR{M$Kcz!1A;H4BH)*J zO-F5t{ysZEVboT$cj((f$Ms@H!#fhOW5Ww;S9}Y7yObS#_OO@x!9($ceZ}s5URzmo zP=8qvBVWT$aS;N*fR;u`6I<}V4eE})uS%%mX-&lwnmM5Krcp}S|Jp|5>~1#XnCY|zMCL&zQTmHJNr(MKEsL){n<04n`)=$ zWHJ~ocqyLMxp+oavUiB$n_~B?@x1yk3@k{or?&f!I-;A#?2T_K=#?#F#CJ&8S9k+b zqJ-E|xkDCn)a}}yiENuf?)J(!t*PK)E{nFMv`m(R(ih= zs_ifG;$5VUViDZzo3*{xGwWF~{|&6NsP1ifR@8w!S3YZ}Y&>P@#nZ{$$(O9me7Pvg zJ8ZYC+X#Bd+RKb2LLUZp-g;}>HkfVpz?=l_*1oiM{gqjv&~9fjd%2f#FkNy^cq8GD z6RzEQhPPitV*Z?%=VjxSz_pT1<#z*@NZ?EfTudM;_q|tMugW^7v<}L+I#ODSr0I|} z<5ilZ-jmaew4dRs$_xTQ(tdeU7*d_L-Ootczx?PNNRJckO$ppuN?`lBfyW5^y$UQN zaL2iUCkXr(2~?>1*|~v&M~?)akd!|@H?W7mdp_)v^b1#<3o&Wh&2no)tVBcpm2Y4bN_#cAie2V?1B-SiDw? zljjnisXRN$<4)YQJU`>v&eP2E9*@p*knl?>>w2DBd5U>9@%)14*F3v<_VB#N^BK=s zo?+{W&ohT7hi4g23C}v7dY*sd`6Ev|&wD(_dHQ*58?2Tjo)n(zc;@rm!Bfn$j;EgI z7d*e>`3=u2Ja6+H6zzriu(09_eJEQgO9~GxFUzW;b)_qdToskB%A%?YZzb>dc&j#AO4qC_EH7Q< zDy+QMySiwNhp3h{6|O4p$`aSw%8HdmRaJa@Tt#aty!V#4Ru`?VsN6`LinT?Rg`U!i zH7*I|V|A&=Q?$ww$$eE(;i~eAmG`;US9r@;xhht!^j4BC67F47xUR6Yyzrj#BA2If zqpR@V!qPR&x67=~JFl`hKe)!?T)gJKH5KdExQaHcELtmNk>0+1AbioF_j?MZ4wZ!) zU2BTgyUL5!-0P8L(^BQBEM0T2%TrO|Dz8{`ujQFRX;M~Los-S7ZgjCW4Ek>8-AUL% z;P@Aw2|Uwy3V7}zGu{=3E0*AmL&*ePgFa1XHaqtLS(uXGTz`;`K@E670V@n;rs$#1mj z@4}Vxgsw>DxtK@dOC7}jVt^Dk19uhfY}_K;S-8cx({S&_9gPbpmQ36-+-%(YaOdNe zfonQ$74DC4rJd*C%AlKv>&2am zyAJne-1WFO;tI}h!QG5|J#GzdI_^(#-MA0p&cLn5U4Ywwn}+)kuGB5VZgonXSKvyW z*WwCH^|(WDAIFt;d;wSL^cJq*pc7XH(Q#ZCZa=Qz#5UCGycahaS8y{OS8%fcSK4+3 zuHeXnEB#XDtSfLI=3Dy1c3hef)`-=~IfvyfT*1X*+)227xPnuAoYg7gVJz;IxKnVY zy|Zuy$K|+!W0?=7y*KbJZC;Nn{q12~!Syq^g5wu(1;=}E1;+<*1;;vW9Bx0Z%xwwr zRwwAQB;jtrorHToZU(Nj#R6OzD=Tn?UiaX};@0Cze|rX3#>fk}(tp)ljoZO@4Q>yv zoYnNQpad|0ZfUM0`p3*hOY8u8zWzmnlrIiNGR`IeD zfDLpOtzPTdXeruIw9@NQt7maVoR=qYkl z0d&!tl@giytOYx3D@zLrD6No&^i)=qyCQ^x#PI;McdfK;m=38bDiV}fNMTe+-m6@N zt_TvCe~mVCRh8ba;967USzl3kAML(grVUH@JB;-3_u%S4E`tUepxexzVZf#6v%%?wUQ=xkg*OOQ448%8R!+Qj~6i)Ne9zr;>MhQh(RV8DPURSDM zi6GPL8IkXEvxmln7_3;s^rJ9RwXw=mB2LsWH_xZTw@ehB|UtNU?NiP_k<6mksikU5s6c^ zarHeF<)tfC*MpExTN13sfQ> zVbAaN8VLOV!P|XMd6iITMNn^PP@Pvp{go?94w|mKYPOK?Qcd3HR~8kCdvlQ|Pp~cT zx#9O))|7fm*(u#$G`Etsm4)TG%*k}m%ncR^`w@d7Q_aam@@kn&C-f9$u4Bf`+yJp` zeCHOeE?iquQCWn~cl-v$TT~)_cx^>R`6Bw6thE609nbv2QqTN~%Jcl^7M7RaQ@D~& zHMhK?s_4AXfpP}|Bp>lVrwr5cygZce{BmzqNsh5O%m*7qbJR>K-P9sTTu^#XWntyU z{F0(IVPNhk@^~xP5Ci1S^;TAb7Bhp2%GYC14^rkW>-mc z@qq3gX!nXWt7!R(HF6c*|RLb68`>R+S+4=*WfBz-TZ#o zbf3hP{I=st`WJBHaU0EW(UsxT@)oWQ_aLssKa4BWY7ef^{KrgJH~o*B-+iWg!gTv_ zr5?5mjdXTg$tS`5cA9RI>7Q)6V@=nED|?F+^Lvu%US+yda0Q;J=J#~-d#3rFVSdju zzq3qtf$8R$;fqXniRs>Lx+_d~mFbq4ZaJ>Nwbpb!rvC=h-DJ8oxYAw^neL;wg3l*$ z1uwtFO~Tz{es|!?-tri(?7eKs#-1+)SH9<&->b~;t+*5L-;OIM5PNW4xH_)vVeF%g zJ?9i$315IKJde9^1^yMdF}NkB{{~#i?{Qq|KhNL_{LkUap1BcM@;Qtv@SMS&h?{be zvG-blE8ia6RNNfbmp%3J<@YePteV6t z?<-dott`h~TUf<7H~gwRt9X}><;y)Kr4qo$^5w;aRi5zsI<=oMqe(vHm60?>h4++7 z{Hpb(#h&HYs(g(1>(u*NPbHK7^5sx-Of)N5xt1@7nOI(W?;5DYu&)3ptUw$K6l8gk zrwBU{7RyaHSu8VWT9gc@$PCOBHCx=Ra zU#yBBRDLA)!NHMm1N86DWyQMEN{^S?uPUutTh0znnAcF@Yo&fgC9eMggu!tJYVR5V zV^ALd3=GSPl@)6hmm*S?0Yt6vu99tqP(G?TR%B*bR@|{@(JcdQ7in#?EzR%m$Gr4s z>8l3fi{#a^qGI)$QkV3Ns#0n36$8jHdi|h=`%c(hO9zFLmQ4&4*8juay8uL4t$X9| zC?qP%Xp*FsqfSW)Iy3KFnJWVNqJxs6l9_;lf^v(Cf>~l{K_f+FWo1QWWo_D7+X^og zDXA3|nH7~g**j|w={`|eQQO^ozh|v^VFs}}|MQ)F{@*$0g*Cr*U(b5hvu@9OS=qnE zyuR`JWgyWO*baTT)XV9hcrvfg8#^<*5-JRcdtT4NtVD%%pNi@(hhgPikyjQV)^ZHQ z=@E?c7SR*uH;JJ-p2M?W$v3FKma#Ry+->=u81D1K|^0S~}>J3prHxwNd7Ekv{kiZ{Rfngl@ilwP$DNc={#W>+n-T*zM#b~H_-q6M%q%L61gqMQxkGZ9c&sR8~Xa-JsTT$Hx!BAbP-h|{wNNaNnqc)MlDBoc)gtUgE ze2F0PqqP#PgUFEo1Q_x+_}%e-cY@!Y3Zyji{Qk5tqxiH(qWrIhp|bN~$iDza1yc+& z4yFW#Xsv=FS~vRfCLsA&!%#k(U?@Fgf!&{b$nSmxNObOip>m#tp?ELB5MA%UQ20kM z6n-@rNNbfSFopP|RN>%Em>QTi7|jISqky44*#zu{(NDyE1(;@-s7cs=!R&&eKHCCp zgNagO9SRfNZ_e$*+2~ni=x=4{%LS}g|NHtejRE-q>8Ka$P>U9<`gM$k zJowP~!po<8wEv-eiZC{nB2S`@Y8aTa208QVx9BW}L=dIWG~%xe;}wm4S9;z)VB=xMoYoB5|qv<$wn>K{%%?*?Q-Nn+$#eoVv!s1gW9zK^H4dPOGt)E zhJss$w{?zCf!KZLvS7+^7lTP;5!z=Na;oTuzTcBiU=4{z;#{zF2l74}_ltS!lYWyf zqDt0s_AeLYTa20)As%T)W5F5XL4UoN=PC1FE~Ec^d)w@Mb31V}mj19&GlL#ZhxM9*@GGTII zD1I?a1xyu84a`=U?JzrGcEdEm?1wo5a~wuN1mp6;-UZVQBSeEH7$r;;j0#2r5;m}4-4piv5^p<}7YZqON+=Dw`$fAy639jguu_E9_kJ^5wZxs)B(~kQ_-^$GuW6(@o5y2)6uNYit(rKb@O~mkq3{#^P~GOy?#9J zk^mpM966O-9*x+&ezTA#-Qb;p+?D}T;4T5iV=N;iH&HdqUpGSHaXfG(a6Zx%1LtBc zpt{UK-PZsU;lCWn^Dk$)Qa-#K8X2h^xxQqleTQ5wtzYCaSyQs|^ZoI8*))1mi82j* z-r;*6nI2ki&g!h)w8AUw%hCPxbv>9ci(gGw)^gXVEcm) zJ>2lfqmS)){D~)bKK1k;8lU;&v%8*q{!hDKc=4sCJ$v`U}dq>|t_Q8iAwSWA{r^o;N*@=$7{PpvbUwrvDZ|7I1PXGPizV7M_+N}l$hA5(==M0s5cl*W=otE`X;93?c~P+ti3z))ZVkkfu!Tv1*Elo6OeQ#%|Ozr z908Kx4{(!DhaNV=X>AasI4I`C3pCXhWJ2~@#d44eS008Ru}0Ve@#fNEep z@G{^wAZ`;04Zz93oxm%AyMUzIX#!3GHUndTM}V=wHsCa1JJ1O10Gfbapc&W&v;ez- zbdO4~D3ne>7|;b&0^@;EzyzQQm&_H237%Sg;WFF0IUZpAOKr|1Aq;{fxt#!2$0qpp};1%F95ax2LaoF z^b*%`;9wxF{f7d*aEAlW0EYpEILHHq10#S@KoU4La0HOnG$VnurnwNPf&VC=4Tw)A z3KH-lU>YzAmpar-e7zaE8v;vO-9l#Et6L=cv0(JxAfjFN_nE+G*6M@mdB%mHR z1Ly+I1iFFAz;xg&U^Z|zuo&nDt_RKm)&S=Mw*pgv4ZwN8M&LqV6L1l*1-KY^444Bv z30w_41I!18*zp`SPzh9E02v1i0n++)5HK3YfqIA)|jxO5A z(N*Zrx6tn{_PdMy@kzT)7wwYiBKP9_{ey%0o@)D)*}-S(1%dXflJCp6rNiJfc;h=e)WP|MUU?=&Ag)hVv_Hx)IXaKmJkpFyUCrx-VbVOV}VzKk5 z_=S*OveR0CiGGrwSk#>IDFsK! zpXx$#6blN_ySMtKsQBy+KdL2DqAJED^`G9-IsUyNTjTxI^YCRvo*i{vpDv58I! zk40>1-wIYQZePdZb34hc9EW5#77{>o^1C@R7(Ypdi8i9AfYF@7Xr{X#a=Y+*@hPnC zB;%y3A(4;Z|~`hUx95I7+r{up@;H6G4szM4j2m*< zZq`z~?D>oiUbfp`9?1YNgO@$i-#3Y8yiNFcGTl!{0p>Ni2gqe4vNq*qq_CEk%iv=H zmBHJcmyy8wJg*<8gYFMgJI3QTxQ%#uyanX)QW!0qZ^^8-Jl|C2&+|=TEx`HKf4%!ZF`l8G)8sjMqg#@SJJ&~6)owb9^3+fYG{$?@yd7L!A%u(s_tQ~k9H|zUy-D$7M z^Wl=rxK>3#+P+u^1*C*4m7@Fd(c z2Xz5&0g^5#6nGYHn(Ij?L^`6dSqkN&z)`?EfGQyM+Zf=VfM(zyfTU}nc{LGk50G?8 zgMevplP-gFN@2iExE}-N1K$Q#02_gufNucnfp-G81NQ=V0$&I22JQwn13v_|0^5M? zK$_c60-J$d!1sZqyBZ8U3-^1#u-W*eDR30;m!w=PKtC@-EikpIO;P57~;lW9!NT;sX!&%r9jfn4F!&adn+&+_&87x{3Fl> zq%p@0d=Z!q+z%w(5$UY5;jRIa4$4ISaFgz+1Nnvn*TYR~0n%|z1J=M@26Vw41>6ev zv%m%*t#e2>I1Jbb_go<9)S`h+aIXSZz&#$=0(TaWbcn-&ZE$1j#&n4hz~gY=4fFzO zJs=<*bM?$0FtiE2~@+s7N`f# z2P)yO1G?a@1nxxq%YbgUR{|U0Rs+-FUIEMo-Ue)k{}f;`+y%h(z-nMF^0NbL;Jz7{ z4!0G!74A(y0d5VT0qzHZjli|QCSWqY!=}@C@8_ zKn?OW0);vJ-FFqjN5L5m_d;Ma+>yX2xEBG{z->Sca0}1{d>EJt+)4h3e-SVf?sT9T z?$N+}xM{UVI!PO_0`ASgO~5CC^}sd2?ZE9o3F$5d?u7dq3Ws|la5vo9z-Hhpz&7AP zUm{Lg_ga326B0$&C$0X_jN1KtNrN4l}V zEpXot+y=ZB7=?O>z#VX}1ClP)1>6Pqtw0ytW?(biRX_=D3$PXLjlfLgI}X?m_fp_V zU?DIU{+9r|;LZR>Bb@mjXw@oe5MSzMc^7hk$0_^}r^? zn+!~aI}f-7SOm-k4g^*J{|c-D)&sW!9|1N1p9eMqp9VGoX8>D(#X!Cfq9^|3xjPGU zzHDEH-IHw3W;=C0kLNJ03b*GmjRd!^V!MBCU(I&-+@6n}teg+Olh6HW%_RF5VPzxR zuM6;}-HPl_I}h2;cY!<~yuZ)Y|>@yi3&@7#y~<|AC*Kax%)7L-w*q$eUf^?kno zqUQq1PHT*1NJUTD^`_;z0$Q1H9TGi#u##v&K0FV`DnV^2nQDvLk!!R`E+2X3cd zISxI6*=whoxLN-MMavYYw@7fosY59))Y>xSh9`Y^T1*?er_#^I2PS{{qOH zyjSPtavcGeU9NlL&(m;ShU`!KI+AIOAILeD{gR#N=bB8ef5~F{qe%MASa6f- z$oJq}j=7y{J^8aNtJt$aT(`24@rUb2Rx`QcdJ0aDtY6?R(qWKJYc;Dg*Q2av{gUgA zxTccpleqSh>lC=Way<~&PICPR&z0|*xR#J~hg1jZ-+Tu~JzlmKur}uU9{QE_a9m@{ zbq&1DxSeZsx!ysJLpr;4$6Uw5%jNn3E`Qw4>Ew3$rTr4=uDF(&>+tC5X1?E~u}{`l)Bcm(JQWWo zT|i(sxdX##zsgJJ@rgUVZqi56bLSK$%O#Dbq+=rAVE@1|n8z=Lob?x<`v=D-9i+?$ zvdeWR{T#jJLS=E?7N2QImq@kceB@89%XZS2a_u|UH}dx8x>Ne4v@|yG_Tc(bdh(5Q zfK<<7lql;1xh5&F&fJIp2G)V=NY^lV<+@E?F5mxBU!5L3)@4 z&`i*}TfXo`N?Z|i>LWwu-~1^r52(afwtc?ar^|@&DtK(@!HS1dFHC&jnf|AdcOAhx%behT7%2J@rvxhcZD@C*ko8$ z^~Pn*M-BHJAF%4I^T+$5ZhZI;7r6}2tv&wjx^G_%i=X;x{<_6}e#+&cPE;ehP`l$# zeza%vitC;m=3+kJ%`n%G#)R-~7yoegKm92?oC9+zXo1Hs+@?(Zv!JZ+5R?rtRiCjJ zdgM?nbA3L;f!qm?eiHG9&neq}@#iITBg_>R5*9{A2*LebGXAT}xnY2u%HiT1{n}5l z(jRAAGq-GWaiq@~^9wR1$Z|zQ7ZmBY55Dsw>ALeEFdte}2sA{C?v%%Zy3i;%;%T)39izzW5s>(m$E@;@$h4hv%$OFCBh`UFhf>aQRpJoo~H0^`ngGTPt7k(Hs=G)hu7iKwP$A0aEyZ)j_>kc{F?z`t~ z%+|l#umj6aR~>e~o#tA$Q-wFwQ^)!4-hJ5lx_C!!i~{v*cxT0<&Lhr;C*5-MYlrZO z{H}%J!&{FyPc*#y$nMXO1HTr*`)<0%p8=e_=t@Rqam>1=o28I)K2)A}!K-g1^SR7{-Y1HW8T_kMmst8@L! z3*L@=i};s+?7=%)oh6N5Zk_QW4r-{sFzX*9-gXYX=Z|-Msvlz)l>hw0)epbzEY1ID z|D@|dU*?VT>=(V`JbBmDZ}T41g8l)=WA1;)dCNB&>%TvR@cON5(#OB+6zWHRb?Vtc zDF4&(RrkH?%)RH^A8#nd2?A|{ldc)k=G<`E{7KiW2EV=kFjYxy&O;;j?73?dbvvk+aLSdoK+8g^TTih zIX!zPPFLALPkr9S_pW=-dEb)Q36t1-zdE+MEGRM2%M^jwnr(N$kPYe&A zG&Oy)U67{F9e(*y=TGBzL@RHMM1CWlShnn_bL7S0Q^)KYX&2fPny=e-)LChIs4>ri zH~y=Ju6gZ)qs~{uB3}9It2oHRz9;__{=QS!{^G^=-HHC(-*_J|U$BAUD*yc9$1d+D zY^0O1ql&v_Y#z_uGB&*OF^ex_)wSF$W9mTemQnRoJBu%4#{%w_G1~VL3zsqTS?-o` zTLyQ_*cQRvGFBb@kfoP#=Q{3|u}#a}G8UiyfW?8{+{k8LNu8TSnED+%04C$#+p##>~%KS$Y|}c5t_h#Rc3g zqcDxTWvu$~EtXzJp_#jTQ0Q=u0zc^Vy-R>}-rN`<9neR*LORlKJg{mB*R|FFC%|0~ z91f&&@P+~D7`zDJHu%#jrvVrWq*L)or?(UCk-$cv3b+dx4%`hK3fvDQ-E0exbcwCN zi-E_0q`N*2i~^nnl1}zCkaV$UfD?gdfs=s3wOm&n0=x{)FyQ4tB@oLfQX>dhMlmeQ z;_fV1$e&OLq~#VZwa9yU4tteKSdm}EKH#zSWK?Ql3WW?T@JRoZQHT%!Wv#&1ODLv%b!`YK^*3bTEgg7nbjCCFjKcWU#~2s_;;jM`Ed z2(uh%<_4#u_71%E2Rip;Awfcz-U5x9@R$h1+M{%8wK$HFslFBFFI zZK&<7Z(#Xd0cBA<72=uwX~<3Wk>E~;38aDI^;e(3w3J>zyqbXgLg2Lx?#6!dq_|Wb zU4b+Prl+tL#5*34C(&^l?rs>lz7(fF9tEbOyj+MEoz=@5%F7IQB8<#$iql_Sf$1o( zOvEb-$cyT-3GS_Z@}qeD@h&he<=2IHEdluv4aeXq-#*YK9xTD zs?H|0qM#zqeIff5u(^op)rf>VUWL#K+UZ_6cUNXpI?6ef;^1}SvMjZMd@z;@A;75` z&GHqvfs-b?6XvC<(-Yz;PI|Ck0{JZo_FGJTnL&QZENwRYh}@|xzhsuSEI1xZTM^`! z%F?cfAE`-r+SGI^V^eUvbc$FL?8oxk66BZ0@~ekmFD+>-UIYA8*P;x(SY4I{WzJHC zunEG?-D)<|V%`y4D97(tTEU|Vm@k-o`2E)u<(Cx@qiGJ!?#*M}x^>yh=-!xs^A#Dd zOUjn3lj9jpAwhnN8BJkf});?jkDg-kY3R9Qy_q~M%h0s88N=i$Xt2J6!g$DRlg!cF`I>|rqnizT) zE%DBKAvqgM-k&KbDK5wo^ecMDnZSe;M&k~}mB$}SL*q;4dD6)FfABpMBjL|LInCDd zq>;;c#2=U3M}8$P(bztP=O40?&ncsT8W=YWg@fk|Wx8p7w)IMZt)pq~r#OLOl?Wq0 zd5sYmcGw?A^K##G(SAB)dbXl`lHZ-c7MNTZnI^$Mp38ZYe69AUSM?J%*I%xjcNg*^ z-Ursx)h8X*vqQt{BBzVaMlwn!H4l3wxlh1Oe#JmJ9wGV38i zLAf3#Fg!3l`G1ISj}cD-$C34*iNg9`G$zP&9P#s!+%Fa5J7q8wUk(qXgZ%$m)LTwq zdBlU0=P56c-+k#WtOzczZ}^3M!u!&5`-b53eZ!xs`t|UieJh%Yj~ z_6P8j{I9(&IJ|HAaa)4J1Lcv@7u_Bl-nV|;eZqJ5DStq{|@_R*3Zgj2EVOB*uN1E=(%Tz|@N{M`K~WD-!NW2!qK) zqFqo(Wsb*MLWTSght7jlL77AfA5to*fT>7RPpb&HyAZz^ZWo0^c}3|p@YjGA8_X=2 zYhYHutcAG^=5d%eVSa?Uv{)g`gvo$e2eSp{F_T6RKna3 za{%Tv42_}#gn?Kah6)!5gRtfujJ5kvd_!*-&UK0a(?$p*@kOUmLL|P|HyUfsi-j@5 zSRrr^k&O=S;>0|B)E8$cRVK2t9O<|VH~J{PLnVhN6_yvsf#|y{@LB9q zXczpcXX5A$`Zh3Pl;Y9q`~d$xi4t?la5N+0%uh;NkQ$$wJe7tz!LCT66Px-RfP!_o z!k@ky(7eFtZgq~J5+dH9Af|9~)drtc4Q=VYzvdx#43`2%~tt#?k~H*#+C z@fmG7FX4UvnHBWez(vC0z!O(MdEo$5*NsokC-K8@VnV?Mb{q?RqnDjt!H)>R(?tpF zB%|aa98n>h4LS(}x}lJHbaa`HdHz&z0 z>NxkVptSz8PyAmKgyN$7{PhMoSs_=I=af{YqAlr=FB~kx4n4umh@UC9-jhoLjx4#E zLQ;yd%ky)14Z)3<$&WsF81Fw0O*kC7pfH!6k&=x=MfmZW;3T`xaSQS4yus>#ddQy` zej+r@{}Dx;p~4Rh6&@IvT5+&q%Ag^B=P%qP*7=qRYI z$R{ypS^3J9IVE!Xzfk)5n6A(*s2?m6Iz#4_D4*e?D!g%zaUXf1Eji%_xlTKp)`Ib z6EE@J3;FP*#2uvmgMtYhRkY`vq?ilXxk=ci^k2t%|7Du z{IZ@_Sk78(K05<1i`nPVsY6(YPT{%x^IRlci18^$oK0r0eeVdSIgqc0r5qXqpcR6)+)?HGV`eartni78!wbo7^&^j)O?mg|*1 zrT0EZVA+B8z*2WK@EVc9;a&<3A0R=e>B5 zs`Fm|X(atiGd}-^?>HIf|1jIXl+6G1!p&7aEI}!i2$3A&X#e>iJ-S`Xla{2Lv-x)vN zAOA(ffA`UokB$+(c+~soHRsR&#z$C+tDq#l>XW6PsDzA9R(+y7H~#zWpLP5s2-+Jt zWzsEp5B1*PHXHnx8}XwM|9oaDN+cue9nT@)|4|RcZ(IZVTm$`=T;0C>DBmWBa4Z|i z=d`KL_=Pz8FC&Z2s=-58Ycp_m@yfDX7mgQmx$v$^-*~k0@dpNm^_(5pPgn`gkA(g! zgB>T^PdGooH7Gc!+zh_|3W^X|HXb3%TOJe|OgFDlaD>40RR3S2pV5tn+RAcP;&5o0 zGr?tK%*?@|x-uE(Mh+~GRAx{%ttcV}|L^s`9KfoXCT|tgfl&PmW*{Ko;`a}*U8xH2 zgq3vb^nT{K{`B3&K9N~``i^HkZ1haR8I1MvwQYw&xFKM%eP$p%Cb1A-H_BjNrJ2XR z-9_(WWw5VB@h@RP;}P;T<^ct?_msG^2c7p0Y9nZ_?5EFUfd+ zjlTmsmBrD37aG9=qsM!x8sxc5n1HkicrUF0Z_3ek>MKDLy^o5m8?HG(`gRzdKtgXJ zt58l6eCUle^3C!4(A%=|X&)4e&UISAW)eJaAQ(}GOj9Dl==>+jk>17RCxlR03t^`d zROs!!eB?3HPY2PJ4R;c#qA%mq+ub~s3b~f}W32^UC3x3Pg>vbALwfg*P6?oQzE${U z4xQOWarqbVjksshOVdIYpWeizb5!Wkf_9z%R}@6Jh+9}UK(Z8!uk@B8ozP6Q_HvBs zKwmg308i-+b9zs^45{UFP3{5rad!v)D_Kh7JiP@?+*s*uE2YNoDO>TlIkV58M(Mb{8s(8u(nP`KE(NQv@_0?=t=#rZR0rB z#=*4oZRzv1b0XSW0f{7ek-5;@oA3-f`XQcxLn!qbdXu+TDoIWThwY*Wg3Vb`kdK22 zOXx^=`(*7@&16*$>FS^owohJ=HY3(NS%s4@ak@u-QDKgKa%E2GWT#`;5F0e!I4J{% z!6SphQu}0_#u!(M`#l9&rLj0ju%xK8Xhm7<@}h#ctkQz1YqXPbiezEl3aHu_29}1b zR4N+|(JU<^^^-rhiNBGXIFY48%F>+WP=9SB%n2`o;Qu{bv1b`bYJR`a}9Q{ZPY2hVh12!%v0_j0U6A zxY$@|Ty9!xYBn7+oi;_ASDD9J?zPN`yCLrOxX0r5$GsQ#ecTx9ZfmpkW9uqgh+S#F z!v325UAxKgw4>AU4@amo%4v13bmHAM71jx$Fp%wbuH&_0LwbEyp&)zRccb|EGP3 zW3pq3quja0dC>WR^RLdYX@P+$u3LfU`Zc#|9?(3Zc~SF$rb{zSJ5f7TYtSyyuGenW zZr3(yU(p`YeyBa6J*Dl|{-O=lh3iJ>M(ZxoP1Hr}rs_nUMd#Ed>SpOubqjRY=(2Px zbosgx-CErZx@ujG?l#?4-F>=;b&uTlL>(cg(y*sgy}zf<3&e_Q{lzEl5={tm;- zhBpnT3|)r7#^J`X#%ql^#%;z&jk}C*89z5lXqAi23(dvmkImth>6U!Ur7O-z zXU?;HY>l#MY)0F)wh4{{4rG=I137Niysin=j?iAI)9M!M*68lh?a=)}_nhv1j04@e z5b;9vv@~(0c)R#CUlrOnr{NT3@HXPyY~P zphbU7e_AgZ5)3O06^0Fl7YyBoLB`p}EaNKUPUA1=j~AKdn~F^zn>tKini9#d)&^ruj58qFShEec54xO=r-#U*5|FSSX-^ft>0L~Y*TDA zZ1Zhdwj$d)TfJ?E?OEFqNWfX!AbX^JoPDC*Zcnt&w_j(kwePS$YyXFRl4FhYcIOV~ zcTOxQg=Vlo&_rnP$h2mrW{zgDrbM$=Q?04dY}b6Q`Bt+TBhEwGC$&o5r8*P(tE9V1 zw@g>6yG!?~Zm<}I9ybkq*~&O_)G*XI(m2z!%v5H&$#l1=!Sn~yo2JXm)#iK5P3CyZ ztCrz$7ssW?ZH&7k?u)osw6)7R+j^CCiFKK^*m{F?BWicI^;xv~aNA^Cj4j=kXDhTt zIGm1q98WpEc6{%c;GFE#Io-~Ooa_zBDy*B(euFhjHE)C38?{&KGBI*Is@tP$)}7D| z!-z0dj2EvFi_qtHi*JY@i(jJ6M(8#ArTPN>2K3fO{XYG1{Xj#MA=+RtTy0ox*lf7R z@UUTr;VHu&!z+e^hW8EahCdrZjh7l@jAmn^F&*RlM)clijV;EvjiIJXOtGeT(+tyW zQ?6;F>1LD1wA0jz7X8BXl_}I5VIFT*o3Ah@n&+FBnwOh%!Hql351Jn}KWTp5e9U~p zeA3)$9%30|nQvKZdBDq%D>S1fc?0Ay5m~MO2;P-yK{+igY!+iVcYIJ;rz)-6W4a+8>Shl8LzoQW6{)U z8qmM~u5pRW#K**!(R-BoCFm!4`XYU)zEXdK{ucfH7%yMZ|C>I_u-NcdLxj<8yw$kV z^o;3GrY4gX{1GjyEgs7&7IU04E}3!SgSb<1-^C3@znEaPSW~TwAw3@JAFWN+6V^`a zHMR-%$#&6RWq;fLxFg(YbgppXozz{l$HZB@nsFMN<`s+~W3)*ax7KQFwGU{Y(Y}h2 z>vQe*+CjRDbyIY9-BMk#?k3DaPw0+_cj!;)UB*&ljqy(7K-0yhY*VS}Dbs7FOU#+( zXU&5x{lrG+b>AF_oJ>GA%T3F@It%u{>|F*&cB`>A1id?iAX1Tb$NR)INpUnRVs54Z8bv zQ^a{_hmXXQ;wZgYpP*0GFVjD*Kd7H+SYpUA6dEo!?K6FbHOvOfX3MRXJ1mb_p0zYv z+AW`1zOoFCi-08D8uxMBU*bCBzKQ!OZnSkgcwc9I#QKbN57ss++br8Wj7A%59^3u4 zXY8NZRgOiDGDnT$E=PwW&)MkwjOyLN^e4g$%^}S~?HcXP+E2B|b*FXz#B3fZUXK1s zGxU?hu|E3>l&>PY*t5zC4#s`gq(f1BQQc}$u&F@== zS);8EYZ}ItIZmMq?`xpAG|eW>3~{!2t$01gtGmS~^m@Zm!}W%3hE_wE@iOCdV}^0P z@jl~0^l6$DLNKnRYSXpZ+FY!=im|4t(r&^Gw?n%VE1O-~-P$H?m2MM8n+D7lJ9Uj% zqwLmopci>ji!RJTXLW)YB8G|KSeuN(NI6bai8j%NIY|=TVybw|aNKaxaN2OjaMloF z3^$H4jx(w;#^{YUj52OxnsJFS+n8@G16`YpTZ~(c+l@PnjmF)^{TO*#jmM0~jVFz# zjc1H!Ap_y2QKoSwwJFA=H`z>yCbucgv;8vTl9Bv+E9*2=C#;iBnpa>I`{N0^mU74;zw_eBVx&^h}iJCTHd_977 zayx45MQyuL*D%yG3U!PYHJEu_sAZ~{jeDf!=3;$Sp|8@{=#}ZxU<@-VjZsFIEzu^~+U*_atEaI7K7-ZKS-ao}afD-yG|Ca>80Szq z)Q)I}-eGejIwXhNk&02a+1Y}xmb5zCoX0Q{9(Q&)PddHM)6Ooeo4TE6v8GoDN5ED= z6QT*zglp2#*D?*+pe`Tum4U+bpm7tZ+yXkcg3|4vbqAJW}Pj6yBO8C8&_Xh@R=@??fYxgb*#q$(A1l@7_ugly$Px{4uR z6_Bth$XE@etR8Z<4U*OXS=$L|+XZ=RGDgLXi&J4HBKq-u82ZK%?49y8Wt#QqS6eh& zv0B)nY1Hi2?ANqtS~bTs$2BLhw>qOas|nGDYe#9vY1P^otzK)>CTiW9Ipg)VZ;yT%yay zZlMg4xknBi0D}#TKzuJcjkmN%6FJ24hc%J{+sOae6h@|9ZVmpQv~1(=dZ& zV?S7?U$5VURsUA3`FCI~v0J|%tG-sO`;O~RVw66kKdTQhgd0W~#u?Ox7>rpqL!!ZL zNJHyqqvgxc>YLEwThZD((9*ln$}MQ&WB;$Tf3!tKQ9)}(FL9?`aG z+qE59ueJ;OH$fMsQ|h90D(u}fI6FZsh*ey0f>#*P2f*r## z>={mCPj$w6)*509w~exm!x|;VrnlKJ?zwGgwk5V~TRzs3>uogNMLCKwZ?|Fv+2J_p zIPC~=j)ImV+8N{2IL*#ftYNa9WzGucdaPw?oDI%h&fWfT@EFEEjC$B(De#0YjT>Ru zGio$?Xfz~^Ta&6u*A#22FnVm&Y{Tf$z{Zajj2!J6FGh|oO}9p=RbkZ7Yt3xbSiE)XQNf9JsL4rw)Qz9T-sD^Ce|la z=(~Jvas=aNH`WA#DFiY{H68`I8wa_If#m5Sdp1a4qN&Qf)7)b2FbkmHWyu8P4VD(r zi~RpPU(o}El*RRUGX~#uhoLuxn*8;3`SI5v46;0Y{NCZh?!j+QXi~V}o{*NCSE?#5 zDOy>QRiIj)Rfrc#RLgQyxcRQiD^w-Uov*@YSaPNg8%9TZvCFs5GIrl5izM0P?o3O5 z1@7FP^O8k|^OK(gc0M~l`2~h)$x}!(I98(&W7i7x{6gMDBf` zG&8Jxb^-IBm$y8Z%9QJunuKo|-#kcA4CUWzA^$F6qH5@X;g`@nFASlMi?y>0KT5KZ zAcD{>!&j5ijQ~e}U-Tn2D)2Kj|{67EU zm*I;%g;#+3z=Gh7fB8N3hDit)Q1EcTx97xb#zz|1_W@WPQCGZ(#p4tBFBkI5n3ot& zUmG|>eyNCuf8iqf>AhT3F1`B>FUGq}gyUYc5Y=D29D0nF@lpU!Sv=J_@uv6Y{@=?c zRiBQQ>V_@w;Z;C=G`{CjH*7GPUaD@1?hG@)UAsiBlxo+jqZUYY`Rb>nji=kd0m&2k z6(m&>Tcp~gxe<$+CC|sAPkbXue53XTQxdi`MqEB6PjhI6+F?+yTBwJ$yGeM{F7e(W~zEl@Ikr zUInkt&8#v*K@zBb11U!PB6C^Xa!@`Mw(9Oh5u3h3H2dcmC?htVAnQqHJq+uq8J?84 zB#-;8C~5N>Wfqrt&rbN3YpN@i1In+AP$s<_F(Td^p-eduF(O%l`)jz<;r79uD|wPD ze39=G$2~(iGr$635HW`s0K!;x87GKG0nCWs)58+RwezuL8uAAth##CY@pTe-qJlSg zviUR~)MCX`<>xb6Ql?RDF7QR#;6zGK%3Mio^*(eZdP?1PHHkp7=bETw&-JQg&*#@3 zY?Uw9d`OgPj}raJ+fhe?(k^XoF24W*rMl)I(J(toJSx>DgvB>?UB8aT7?E-)oxd}BObW#uHB*D1?xUYOh=M< z(p|e>-9TAXTYO2Lvk>iw!$}b;_`o_ou{P(Uvaq^@5uGEDP5d6bMk}~$cdJPl80&}q zbq_dsl*=b7?5+!KgOA(O1$NXWMI?LPVY2OuyuvT4FQ8xvg?1o|6%pe%0pL-W^pU$Z zTOCb2qrSk~m6FH%4*MdHqrE&SA9=I4Ag-sIMRj`)qvh@loj)1p5O**BPYSdT#P4%|Rf zB9ojG)S^elH@-th{hKfHgDKQj!y({RVrU(Mo%ujc<_*NSa8A@xeMNqH4G*xKkh?r9lppLSj>05@g7!8M3U!S zFn&=J5stcuN5K?dIe^`Bb>5up4Eja{^9evJ?~J#h$z0{i*)kbq}mx_`%tRN z`_-+;7Nz+jN3kH@SS-)g$kXlN0^m95_Hbd6JY2rq9=|Yo(9_Vdk|ragjV&aiO9OgS zYb(k7HC*1SE5lIO$7RtZ_N*WHBJaME_&GalFLfSY8PHeAO8sG=uK8e9Wwa2nwHaOSbo3tT2HufW*Uimki=@M(Jf>!j z7~vWvzJXsgj2{3GxH^{3u-;#E`xB3}}%;KNt>j|fCB`#PWtLPq8x9KI3K<{!$3 zyvjyCdgxBt{3)F1+#Q{TpwE|4p9gaeCyl4nzR2v!)Et!O=$@|skuUNEc!R!Co`euzb8SM1o%S+oZt8rD zicFe>=osvW^Wmm8N!+XCBg~J7lcx0yJN*>vi#&7rx#gj|C$aL%h96D{Bk_3^Ms-T- zi~J{|W5G~9GBDs!LbT%4D9Q7_|GIa&SG&AEM3B{l$5{gqF(Yyx-$nQAy zre`{d!=NS-hg17W76vtuES%c4M+MrvcT;9{Znfn09Fc0>XvMnF*TMyiK_rstO7T;3e@uF;OSpN&7{o`dRE^~ z3puIELs*qN(S-$G>mjVxol)>W#mj~?VH?)bIT%j#O{um~U4_!bzw@41o3GBK^-jLp z#U{Z-wS@Janh8~6T?(2iQJwCtOH}82W`^tyqn?qd&X?ff^7n;AbtdZ!$Re8ZQDG9! zC8702F6zlgL0M!>}q?Q{&XB`Om8NHh!3j&kuxTt?Aip)DU8^wVBe!c0&n|x zr0OHQWkb#oOz*4#Cm$3MCI|Gw_9BW3V7%173(S3 z4Ex2JzPr*2!9NaN0GqGn{@%mSd4K({CBMPXPe=9evyH6a=N3X5F9POr4T<*^zDNz#$}^ie$6$R9CpIz=8yFQ#6rao0Rh9gzq_2G zn48gE{!EsD0qiK;yt^EP%|BF;JpSrXrB*3~ZzGf!V64In7Qsd;YMu1GVLPwHY#u_x zm1jm6pyD@2E$|qbjYw1%`ywA0PfU$KzCmNxY3ALiCc@BRtk?&_r@A||ToX9rJPuEP zC)%Q}LR=bb=)*=BY=~DGORqT?7{8q2!(Vmk9o8&8Kf(OH=)`aG_ZupV`1?6o0{Ghw zH|Osgu>D^Cwp@BX{)YGRH{vBQIA2|{;@{0>1G4Xj%QrLcKrSc3=Nv9O;du_1?;mqs zE=N#&R6c;qe*U%*vpk_M{<(+0&G6|@ercX%{2fb{0RAfB=KNK_=I3uWa`{#H&AtSy zVdVv!2Qwp-bD+%f&$z{q-o398JWCP3mpTfl!)leUT52>$hG0jd?e!salZ! zYkiT8@HwYlo`h#lyEG#%Nk6T9ApOK?l73(0bu8(k^3j1EA)k_B4(T`*)IS!GH&Uuj zHTHB3X7R*_1P)iNo_J-DTWrR*bO7xXc{-Zk!D1}gY28&tw0S~b{nX#=U{`-_j<sJUll;WIeZd$f#B~N9TToCrEP!Fhwyw5>) zNv*mBl?G=~{(7*Fvp2B0de_T6<@NNcy!PH+6-^=CVgln^sv4dfQ zA;~c@nD>W7Y}YdR#GbvPK6uzGruf*FV?##)nXEgot;gOFbRqOEU*v(&q<=@-K#n1W zY)`@hMxZ=wON?&M{HT=8N6Y5YFcBT`VxoFg4SH2##EWiq9)3X$XIi}PXd*gGX6ITG z*vLnaF?vuLl+^dY%GB{?LwJk@h!EHZHY0*pH7tPRbgBk%+>Lb#`q?okJ_7og5<6*G zn+*x?ZGxWt3gUnSwo-z=wx|Aq|8J+BuN3ykmBsTjmbKpX6XR-D>^-%Pj)E@}eeB8Ix2CP?wHA@5qIdz9+p zCrj4X)=ZYLNOvLykhBCNr0V9$Qgug%R4a9(<3u0y)>dLb^Uj1G8qMc#w|qVsMM1X~ zPa95^#J+F?LN}y%ev&+2N%*zCA8`xKDsInp(8RncRlgA-S>IX{F71IQT~()Il06@i z7Vy2Vq$vm7)~>am&#DX2(Jct;5h-GNJ8o+zq>Vq(-QAKQ-UP;ou2aKlm>=Y=!GS5K zz7~IQdtR4ni%?IfxiV1FJKjQ#ARG#rDkN9`qAZC;TP4>mL_R;We4^Z*cvS7c&8+5q}tS>SBz5D&iUx5JP>r@re*_)`p@Xx zyNH0=q~>H#8vt#YvdfzfbxDMB5EPTU&`lfQ*G6MQgZDcGNYxcl%94SS2dmCuU!fZz zS%XxI8-(-2Fq9uk+NnT-hKLaZybUqbB^G$4y3k~dc~b2_srqLoODS!V?||faP38?W zHpzb8yoS!hd874Cj$ni!{RDq{&p}XvO|2)Ti$=<)F>hgAS%rR(am}>{y%X0^-I+}B z9)(7(3r%EHf~>1B2mS;iK^!_onAbN2$?HP-I5!9)i>VoTW8y<8Goy&T85nN^_T2|i z>F*<%65C&AsZI)`%KnMx6~@W}d+444ZejFEyQkl@YkAs}2qY%SX{G8cCDC`B`NxOB z`Wmw;z`Aqky0+iE$5P&Mj_1_nihk4l?MlX%t*o#BdPtuWz}M5bVJ+46!`CNy`h1pt z5XioXijjFM)e@@%IPCTuPp-unTU*+rD7vBzS<~GGrWo#KHyB7)s}h@&YZH#Zv?m`< z=zx3(n4dMtp7)aLW*_n12?4DKl`2{QMU$qB?#JVorh6>m(h!27?ZjE1uU_(`(W(&w zIh6?`w7EeNiNTFY<&;2)yc=t3)aQ9tbL`wO5cpNp;}PPnTcXbNuZ&e}W$dlTw7&>|b_m@+k!0hLs}E=tMtt*Zdv z(10`MRjRyH{ZD1-;0WbF2$15`3~A^;CAMdvX;ZRxOA#}>acj6|!W-nB*Nq#e;TZ2Q z--UX&LAQs24LW7C9#+3cyf=eJskRVh-^lwujjv`JUtRu6GCe`{=~T%RddJ&6aw#R_ z_Mhil#xn>eF+!DGU7-}pBIBEA10&T%u44>&%X<@MDakVj!;d1-a{>~Ks30XkP?0!b=Px{H%MrRr8NuqkV^Y@?}1{_(@OVUt2-5C z>}L|$E~@@XQFeiM>~)Ylw!HR|I;~ZF!wcE<-vq(^LRfp`B~@CEY0w_k>hpPDVw3om z6IBV|E|l9U&(?>VV0U|(y(e&|8=R~{wk*gyU^22H8YJ%i@Mjib1GakH<1d#}IiL|^ z^&aron~%E$)CZ~TUJ=uv<=BQFH>^Dv>}hS#y!J||dP9^F3n)m)OavSz$-@vf4sG|A zcQML_-=PpuI2Dz6EB5kktjVzaBBcU#k=P$;t&iJ1@{&h`2_(2&#KQpau21qEuCm1m zt24l55!vC|1+nhhUdHbHltZlLg(y$MW)2Q;w4FkW_s*+H(X-lK;coyMRYkoR9yx?7|Wf zc2S~HK^F}gi`q!MBrefi*p;)o(V(DsL84KliWOm3q6j2z5SGI#_NrA|tG2bZt@fsX zmnK9Y806|Ds8zi5%f!_-YK0)`{y*=WvzrCc`u+cY&yVLJd(NDhcV^ys=biU9GmjbO zeHD_1)A24XA?(K`dZf=nV?uZ4pmgakaJud8KB8^+=J*Z=*dl(wNRMhKl|0tE{*3fB zq1W{-f^e471Fh?e_=eE3pS&^t7+PcFD@SI~e4jDhz80$x@I+t0QFik+hmdw?^G zoP~>cXS&zj?wkvNcwhc40;3B`6c{^&GLp{E1!NY6UZI&EB_Wb~-q2Y}YUH__XB)rC zl56Q|y0mAYKtpN9km@ zmE4d`K13(?4bZ*pZ}&i*{I->RT{d?gs7{x@U?pFlP43ajf3cEhW|Lpj$@g2yH)NA# zywatMtmN-!lb_Ma-?x%2{0n0Lpp!4QlAE)+f3B1LlALhf%L{{ayY&_So0WTMHg~hm zeUO!GW|MEy$$Oo;bZa*GDxLhEm7L5bU#OE`w32_4O%CehC#~dPWRp+T$-l6YAI&Bo ztCN>l$-m7eAF7jYvXcLtO?K(zOReOmv&nm277UKJlAp;Yzps-|u#%t6CcmzeOReO! z+2jp6`AdiH{JL!NvpRXFmApBd{70R<*-GA$P5y;WUTGz7%_c9`$q!k{+p@_mI@z?6 zH)NA%>*T1Fye6C6sFSBka>989FG!EpbQT`|VIe#m7yYUS5ubSfRNncWYX9CKzy1HF z_s2*2N+x!|emq8dyJ!0D_H;Uy-(j?`_w?K$29bWAn{o?RX}L}uEzyJJ`Q%2b;$^4R z4kNyo&^h%K!t4h1(XMoQLr<4HTk8*tUQPUck| zZe|pt)!J1o(^&L28fIa{EV&(Ef%KNNvjtEZN2vm_jO3cWGoFQ&*j4gW6R?*Ho&_(W z3s?G=?lGMK$}ehLSYj3SgFXbmbZ5d@!3XsTm1@j*fJzh} zHH7p$y74e=t=j5ex=B6D)2{9#UXQ<BT?rBiEXrF+_{D#@scfk6`*)IIya%=U?<7IWEoeH8+GZ^Bw~XQN@ZdvRBIJ zq=uzSZ-jcyZZV}x(8`}l1#9N3;uv`F3*wrxpMIMADW4WupW^BK*l7SALopq~s{RRa z<6VKO)LJe2Ij^@WjtNtgEFFMn*Dv0Dej;;St3M;-vH!@)?nL1>ap|=L&@AgH^^?_Y^j)=J>dT;uE;|vd5dS ztQidUEIeaP_IwPRm(ZY(>%=+ML$ky>Y3_+6$2-(a#4j`CD4)KoThn*wh_=A)?qFeC zaM5^2bZErfq^+44kY7~)!S}kqY>V$FGXXOEDd~Lr5C})?hWVCtL6m!St0-z&L(^)w zk;rc9X(kMeYveVC=@?Z>MuX0#oYmQlA}@1)7=b`{^OzS0)*OuRW?8;)mi7iSNyifl ziTXZ8TZt^TvX610=bmf8h~Vjm8b}mLxMcVyN(loVjd@3H{ho&IRDa+hx1U$iQl0HK zT5HLZ?kAnEZe${@e_E!qJJ_+rxsG@B0|;C7Ag$XN7^eOj)h~m<*GP(|-d}1fWc1g9 z)m*!bqIu@_*tKZ)bFWh$F$j!g1u9TEt-M(Pzc^brPFlS{-k;U)(UZV()pYlb&U?jB zhUAQ~#u*|5>*;y?$gBMFdNDt1og?|1uZIEsVI_<&PYvO(Ue93L?JMfI9d&w*vj-PR ztjTCB8O{Z9EDGCsHws^9sgXT$v1uy?!)d421j=HQBBNImuQUv!Z<$fJnMcen#m$jq z@e4*`Sb5mDC0b^lQylTN&n`kmE)?Z|whNC&Md~fa55_5!GAw>;dER_^DuONt@N22Q zWwyS%bh~;T)K+Z;FN0f&M>Q6gp7)|2y{zrGxpq7$c}urP9j#kq#Y*l)h0i}W(k3x7 zW^r!BYmX!|^Jsf)pc;-jMMQyZVAn;mT11FZU3YkYsYLEaDw_;Md#);Vt?MXFur zyq+fjkruO`RzPEU#`SFgEV)5Su5;u|&Hd?SNy#eG6A_0ulZe(=(ku2MNu=N@Slv`w zmYVqU)gV{!qc?LX_=h!xHrU;)u)FzNkU}?IG_=y})cyQE)hiILTTgVWbF%b{epcB1 z{HL_fbe<{63FqTo(zhS;*Xr9{JXw9a*M7=0SNe80Y4C+gXc7B)$?Zd_tIldMyA4>` z2vK1jhYr%E|JWmKc)CxTf{CUcJChC&eNobB^cW+4b$K=4Bz6O!^>$n{wj%b{;G>o? zg)wTd>C&HTaF^rAW?2;X26RFkU#7Mj_2<7xZB?@6NvdpMK}nZRwdDOw z$r1;t>GZIQ8BdRS=&cj)9ZmOr9kHkpzov|$b(jQxMzakw#L^hTxH^e9f*ekk=gro0 zvd(M08}c6VQVeN)hu5g$xhmu_s@e^`KTl%xjbnJJ>aU7v*Um^MpP~uc#gvW+441>iTL%4||Tw@Vzw~hqEXJA_`jLATvhFF0{%v z?N_$qYsx~>*?-aoPuAt(k?n=@Fg`>pY8wU= zhnTAa#oKiocNSkQFNfUyPQo%z9pb1ILifuv31K{gZQ z1(U{JU+-{=|qa{KyDbhyoYY1MShgv8t`c>A)m~IEg{>`AEXh`j%lUToREz3oadR=wvDw zJJ7|HYLh5b*ya?r&1x^t5l|<@?590>DT#mcLrAkMKKLzR&fFj7I>`L%U<#iQy0UZ} z^O9n{pJdVN(PPtH>SztA_&%D}U?hhvF&fYI7=^2SO^yZs@HM#>cJHSGYmz^(?y>Z+ z2)h-Q93C(~iX>01`*S)SHdRD~;yt@M9MSTC`^lpC+wODR&$XW1JS9JG+|p$yFXuNh zdUL=W_xU!J80Xm4;ffXo%z|)ywIeakwX4IE^I9BkET~J4a}bpjtj0kbtKZd85IvV> z6PtBF(8lP^LGyyo1KZvY;d=;S3h|l+<~i&rxxnRH3+Qxv$oInRRBBLw@2SGXIFC3v zN6}Q5)zlyD*VNSkv;OmK?*|eW5@gPVjf}=GGqaqCEKMp9Caz{3mu1^@rT?g4UFv=? zZMi(I6CNanl{VoZGVn_a%JcO)xbIj+;Fy+U@iTP`)IvlEkPNd|ou36Z!U7f>5Qwi& zryN1kK*fYO$+=PG1*A~cexU~s8m&MPMNA@^3M@uT&_?M@F+{?vfDukzsm>oK3{NYv zHgBSz*c2vZB60#|Q*p$68?Q96n5df(^E34%i%Ok2telZg9D)iT4MR|AHir-UJ8rY( z;lgPy-}R0K|MXq&TDT)@y0r|Wmzv^_P`4Y$d)O^l2xAYL=N1P|#%z7`&~UQ8*k~*W z`&LIiX{=GJhXs7=XMf0_IroQ62l_{GBHS2Rg7#dDr*4RJ8Q}+a{LGxNn9FUQUpxj| z!ijuALUc&LH0V4ovf})3Vo+GST&(pVN5`YjnK&fBY>ZvbU_{J!GWvBF`d`TG3z~C^ z)!$gYLRGNm5JryH4|K)}E|i`~<7J+p*%>t1;`>VSQjlDHUpVPlGR_w*b1WDrKduGE z<~FkfmFg|l91q4BBk5=kCx^wug_~1_VRP%b$>Oq*xjGQZ2BYxt)3CkM>cdiS(sk!S@h zMS7>6pM|s{fM4A0fjI`dgQgTDlOp|MzX%!U7;PPT|{Zj>L$3iYL_|_ejYRjLm^Ot zyH(Eah$KsU|G*3~$CsI#f~-CxjCSSaVd1bv>jP$A!0dGg_gEnx8s3F2I^WMBhT6<$ zs4yQmgyua);zAeh?r)WA_CoCfNTZ=g8lzZi@P0AB zPZ6oPkl%G-bDUp>e?eda=BbQ?>-=XK;FhA|N+`?eW}|Cfy0RQy&~p1=jFH=Oi40;VghU&H0@)-uHU zAS^6QY{559t#D$Z-Lh|&?VBfR78)`EYl?%ml}p+;!rrDNiy-IQW&7qPXf$hPAyCbt z3{Jvvm2aJPlIwd<3{`VH46|>_lsSWy#G+z7oq~XdGEe;C#gdSi!ors|-sR{u<{ovL zF5EOFcB&e!3)i!|V{7y{!@Lx&=Cf##7?+R>4@rHfin746ijF#`PV;urQB&gV5|PoC z4RpJiD*Fl9p(Ixr_u zk5Rlw&Cb9wr&g!+j!88wGTQJ*iM=+@ZB$#G(pXPB$nQoA-F%o&C4 zvhn7&Ln4jH5lOkUOMLeBma{GxKYmB_pq8`h&gZwN17ut z;NDf}iaF_Q%=z~`|GoK`S>-E|nrJ1=B=q8yG6GV!o?-rAavW#vJR(r&5W<3WIzzoy zoozcuzyJHdzUdIG;+3j+! zT3z7_f%MxQ%Oj%Mxq|Me&M9U~$OS_pi9CFu(}M}4IJl&K2nX8~@Qn;lo>RoP>3j?> zF^W3ePZdp1xH^`bMU)-qknaN$QqJ$-`v57Iftv$Tijj3(0cC?r{005>KZzefS54{S zOs#f>`t`|kT)ZwZTsCMccZXfSUA2CFa-2g$cfcGGBwZb>IZIr8lJ{YPd&)V%y#Hr@O-8Q;((g*Amler9%RDVyHpqS=&6`cLpGfm()9feG z8nS8j(~Xg$W&su%BtN`8XuZh~Z*A6_{+XG-W6hTf^Vamu?U=qC415(|JHgjZ!Pic~ z*UoQ)ubno&cG~#bY2$0>|9^a4eL#H8-}zO1Nt)NfNETm`wm-fkZ6AEi-nJ+U7ddbiX#klXdlfM>ayP<4P zE@exGn{RR-70g57Wv01ryuibsOTGNLO3r&3#Q%vN{#+t^3$8>rzVRHtWJ6iI@zMs# zHj58ozvQczd<~Ls7IZ4Gp;P&RPOTr^qB%c;Mrq31y%vo+ghrQSaW2h=revyvBkOIs z^(H?;Vb+`c@b-lDCO<-N)|>qBw%K}8-C?x!2ogx2e$zBzj4yB*iN!9=E4> zXzY&yF&y8q&|T4P)$52J-cJu`z0zW79spy#G$m39HrtWl-tLWzwmUO0S{w0|oc#c*?BWKEr+n$KO-MXG$p0rS zT($AIng2Vc^QSlVl3*o+l7rnxHB%fV9(=TW1Q-9&xEL^wQv&jP1r7RKtkL=I(f#m8 z1Anvye{`UY$IblT!T;Xa%S=G2A$9*g^UvH8NtT>_e>y$hY;Ac0@+E==+5tZ6HT!iF z6F*8!+`};=Uo4rJ?vVHYBqn~2KV{->N#OUB#KgVwsOKN=A15Y$M*c7P=8^x?k+_%C zvxLk1wBIFNByoPV-8;LFWM3Oz51T5r;gYzV_tk$+5v%33t~&GdusN-|ZuEb4g&flZ z=3K+Q=nZfsroc)OeyV*{?)Xwx7V}G^Fl`3+I@n_AzWsOP;l(8{@dtQ`-?o<%09t=w zJr?Ij59M>Qw!nl7Wn*A^^P;w<`3s^g^YgTXUV*d!qyLaSdL#}*#gj5OX&2rQOY$;b z#IHrN8QJRzte^#X;ld37QV!Z4HYfPmvuRG+i+Sipwz%@~B@yM&2__(`1?4Qly{`jw z0J+m^drpNX69TqIz?ciYSlGg&KM(jma>xHbQpjvKUm~j-yAQ}#W@Ru z=2QnUP2Ok_Q)dW)_>=%U9}3r-!7c~eZf1|*0hO|E&M=C2YJy!J_6r2J74uZgoJ+3` z`8Lnq5HQz=d|P5?N*-VoQy^9z!uokaYDDtv{6FOf5)+J|l%t<@h0h1lSn~%{3O&he zr?IzRL^m`pa;%qPk(}cf3t84GseS%xLRB{6>$jIOI>FagAOCz z2855R+B%MC!@HKz^EpT0HC??#dLpxTs>&MPQR%_UhZ%ui>KBb{D0a7(p1|Bi{FGA- zkepii&g$M~$*6mAj&ZbNl>iu`?qvMU5)X+eD^*+7THZzHCp5;nR72{Hq9b&vmDL)U zc28J+Iv5Oy^5fKXsIj$LeahI%GybJ`?Vs<#*%*@u!{wAnm;SI@s(gS{vri3?`ryzk4{U{s8-`GQ&swA}F%MGHdiR`ZDj5FNa6{BW^g_|2e8 zHj&t4(|EyffCUqd0*mKqUvxm&TepUw&fKrK?>3iXfg{0R3mFz3Xhe_nM}BAUYtfKw zYlF}(h%{b8&Z0tTR6nEK3x1PgOcl)8vS{>l&LJ>IWa7`zD7CObx)D7c|A=<8GY`X9?k0!xqSA z7z9+|FbX?Ug+v1Rt8ekRTPKmFW*!^7YJBeG1bOk@RzxGGLg_t7|+PC)-95_<~_B`;?WMGu^EZNk(%B=LxvfdmqxJ z#DE@=$OAPC%A)RY;}vD9ND zDZJ*oj3c~WMs|vfYy)$!(pqIY)QRv*RUvMW0`3YXILYLbQE@5 z=c(ujZURC#sxcLaHkH|8i*t*e(_gH=z^BL2%$x->#~7*VPL*#5vX5dIx7$C(VRs;4 z&Vts)C>Ig?2k5{TAU)fGHt|*+xC1xQo}3P>%`KMbFV^3IQ@)`C%Mcm#7+C9#?30+R zqZu-cxFN!spl$FGR0Ev*k)#3tMo+*Q%Z7&yYWJJc>Sg*!d0KC9WOk?IhGWRq1-+m3 zMRgd$fkCcrKH(TJYgCskzm4Y=*O?n5rgd@~#_y%e^x0{K`SKFN;(#B4D;UBb{9;h$ zg|k3silG(ZT^;<6K)t{GL7>8Q8nUvjbq2TPv%swQzwOh%zg3@{U+L5Cf9gJY{!jWe z{+s*6nI$>Hlbl)JjhmYjp;;`PWfEqm-P{b(vm$27fSG@Il&3m5OJ1MM#Fm7~&4j&b zo9PUMOyq7sX z>o{>Q{v!!Sd|qXqdy$wt)mu1jI0waxzV~1u@0;Y^oZ?k$^~1T`)7^8rUDMqQ+I)m$ z#+xV{G3(e*e$D0xl4}!@0G)DJOk=$#z&s=dKWyTYPCAxih;gujNAf(0x+eqxcNIJs z@U3;v70G9%!&kQd0 zBtrN{-<5GWw~}B}98MEqQ0$85+%I)z<^zdlv4?hEy=eV{vFcczP6%_vv-1m8l^~mcN3Y_*o8>*S>t^YqduSPGlhYg+ z5TdvyH{+X}!Z!W}e(S-^J<=RPUmqkVPkzE$AC#nOzAcdlczLK#9^eWfU!BbQ5MeV( z6QdPKKOgj6gDv7-CTqmJrr8`gih7T#9f=pnefwv?WI(;qA<8H7uJL>?-HDAfCzQ9V zf=Bb+t-`SEu(81QbQ&tsyY;deWaGI7VyNnSTTr>#Xq*5P9ht;QM_uZHqcrs`N&+g9 ztXrZFEqFzE=hHx3nzT^RX`^79Fg}SkgXbB->-=E8n*WuQkPb3mX41<;|G~mt8(&zQ zck}7Z&k77?o)}pyObJfOS6yeW6BLEbm-J!mf?|!NCMOfg_Yn<_H{q?jmM94VyEmxY z){@lnyl|9$ZpyJif5t!7rJfWdG1xl(96j*+kg|Tio7uZT-FQ5@i~1+xEY4o9dP5!< zh#5x0s8AQ^kHb&0^yB^b*ze252>~lxqRHA>m&mX($n0;uf;ri&_bZqF3=5kiCsA&M zd2vU@gYYiR!|FKg;KGktTo)K<)zL%MrL-X4)byo$Q43tmTwuiiU649TjklAd!&Eho zW>b@@&$T`?y`yGMB%O{PA8xz|@#CVLK!|)hWGX*5WJ&~LU!Ob4 zyv?%B=V`yiHdo02<+4pNpxA8l=RB%M5y@?~Ia7GuJ@PJW^Dh06Wt%f9)cUu+4aZy} zP%f~bYL0m}&zfV_@{r3hKONrBF}IJfIOYk$F$-;u*%T3uNgO+esj0z)LS(q+ty!)) zYk#geO+L-<#h-A7d|IU4P|3-?db%d-9@TV;CKxo=sW-Yc%Y0N==8_zi+2)Ra!MF=^ zGegTGiTTZxo&jr|P&VDLc;XV@I`>^wLL3CWf&RO+gl-bGo1Dyq)6J$1m+BruD?(oG zgOPhdt_ILdk?i}xJ=|LE`QiM@P$%cUhNf`TaY(s`)^)2f2m}XYl80qJz$Am_SOPQC z3(io5qzZS8m^&npdX~}XiWI&L<}mZVq(UyuA>p{f9Rul26k6C7@_VUQkt zOWGIoU0psidP$FXftD_kR>~T~hLR>EFkzI;${b#)86&(>uuRv4S85h1rw?}OphnFn z^(lzzAMA++r_FUlUND#cya*Mv3uQpv^T@Vptmx;FRi2f@41qy5o|`V_y7>fLRc6Kg#;HCD*$ z=F^&=73{zRf68AA1Ddw379O|;WWWPo74`|nto|ng@`jNr|?Ktsl zjC`)Vot(j;MIW@$g_as-9dZC6#C<3d(eJAyun-w;G|c(e(qs-%ipjQ)t1wq%1XSOb zI%}qQqSFE`XX;>(i+GUekf3?P+$g8;g%)b!nS4Hrf>0MGVdNDs6J({Z7tgVq(`oD; zM~PTnCi98iAhf0*5mP$^oGm*&j_mXsS%chnoJM8~PIB^Zq#jvjLL$x7y`@$&V9cnu zWM)5=GqZQk`6+_XTS0UF-wAk}Kog(J%0cYQIh%r#@d0XfVCNC~LL6vB&RfiBdvg zv61=<)+7PO4Nr7;LeMvVxBGTCQ@ZEJkhXH6pNUs(zcq1Yc_*|`ErVb>$KIY<5Gyj2 zL72#*6?7I?4Qu3s8V?^y17?Y&-{fwM34vdXdKff+^#q@T=Ch&-ShRDg(9W?P0v!G( z`o7Rk&?cR+7Ue`w(fmt?S?RN%Uk);?NM0Gbxmv^#*teRpQRv3KNOmGhC>O(yO7V(% zZ;>g}zXK$Z)EH0Kb=qwYACWwOKflO^sJ*{Hol zD>8JkfhEA7T>_c|vIgvw4(h;X76E()bZ>$z0?l@#o{&Xg8yuK1ZKLWZ5L#ELKgwLT z6U?br+RsRfr}Co&<8$8QGReVf?4$Vn&1@A?gITPM#>tzJm!pRhPBcXAc~w$4wlRl> z&fgW<;E#p($D$@5u(%HeH4AoZ3W8l{s0g{%Lh*@6Yg$MI6V7H?yX$j=kwLaFGALIV z3FGn$p#JtpWqwn(oT$tLW&@H}LbwI0SrkYZ!Qd;h)~u7NK0`-nl9$NcDFJUZmj!G4R@0c?F976~KW zTmjOcN$r-&Zih#0HN?eX9dT^iH;4`O?0eS1KKOIlR_Df>TT;wr)g(P@#Q+F1%SEkezam9ZIA$PtpwtB&PQ zyvd&ztF|LAD{I^_59i~#V?&IVg$)vIm@23_l%4d2mgadhDYJ`qjV~vb`7Q>T#!q** z-U&omp4_eTNQ*zCZy`XMxxvcejZUpOGf+O1nt zoEICHX|?Ffvxmj!dGp|OZkBUaORXz=GdZMR?%SWGq&YsLJqyWLc!_-8jU#^Tdx$>fu)k`q{i1_{{U{5d*mA6Fw?kAV&I~R~7U@eGnSQ3}%9Y)v&#odQE zx0;kC)W923-6mOZ@z-pn38^y;Y>LbIrX>;9WB`yNxhc=uQAvTN*0m0Z(X7*yRlh(O z%+9+8*(Wta+#0jQtsy6*)HCnYrKs~+n{|I2g`7{FIof@D*yM;2CyWA%rFp`6Xy zHt}Rv7vWBE@0abQH27R6GTVML^f7) zTJ)9VtYM!}3>^C1t$*aZZD_m!Oc&0+wq>40lUJ~Ls( zlVr|e_g*$T5yCQuDWJnSh~-{`?rz7MSG92v;*vla!Qnm4%@~voXt-RQ4Y-<(5eB)(R;xP`Rh>&F&?D~5}1Utdn)3$7K3$MpzSoj zAN#4BN-DpKDs}K-#X)Q z1S9#?b0%MhT8I>x!sr?~=S*hKu&meV0VvXWs(u7<*4flKrhL6edQYe-EfTgjIPw{N znN4J*82oqyVSvVy+e4XX5 zVP55_-PpO=a5KwDEYpn)tkAK=vY14;(Jyk4G^Se$!=o+!mug~DwpW*4N$GflpDb3p zS@@m+Dx2`d;J8tRP%DI$OZRa-VZ!m3ne`6Sl`4rO&*Sy%GV>ybIfV1}o|M%O)QQYg z5rKF6GxbTRLA@M}kHWh_ec8n|#oQA(rsYf>WA>f+0=y07tgP8xAjECrP^{G|O|-~r z$c@Vu`1bg8S!^3QD;2ai&U)n3PVpfjC3n3wAWE?lLPCQC~kT7gB z6vO>Ud9QSFB>Iv3@duYQGzUjEwDNxm|CjN9Isbp87QZev_*t=7)zmH48#JKD+9H5H z4ZMHc>H9)jYEcA>*@PLAy~&)=1m!3)n-k>nq#e3gm-+&+L3stR5XPbU0m2xftI80D zweqSM(n7>k0?&xlTstLt7_=ch(WCpiXw{lFBIW)JVc?>HF{`*IhcMWBGoQ$=%b%Y` z)RndMO{>qAc~ULbc~LyYZ&R7NElWPPQh|_o9%%ax8cN&MuX(jC(LzZr&kLy&EYKtUCq`A@qPOlkKfc-V? z8D`J+Bp3c2b`R$VmvFd~Y|fKo$d2phu7}y8!C|?g0UF+LtuyXgT@W2&Z2+`&NG|{! z-v$7?1yK(RBFS^uJLsN8 zl!dRBlNcu{Asa(z&o|bwZ{BMAjH`&r9{KJ-+?%I2{{&Wu*dH+SeeJQS0lmxYB0{OW zfzfTU$qe=~t|D9$sEC!U<0L^wSLdv(G)Cmd}a^_2>d9%Sj zIJZNh>`7dTPOx0Lkj* z=0oZro@JEhp|AOk#tV`CFSbQSWXPr)(rG!r#1gU4-1c#Zv9dfte~iSBv}BU<#2>NN zc*C?(jASNd_gcl0x(5h1LENu&LNW);m$WLP?xmTgIKG0|hy8NX9jE`T%^Ev- zcoWTT!AFbMbGAgM45wd0MHeK`E+FDN8IUtcZ$32KxZWr{-<2g_^}Y*X{B&8?8Vu6| z*NBzS^<~r?F&&=N;9%yhaCN5aN+Er9C8k*+`tNl>^kqWdGZ2)5n%cF-D{G+9^RSqx zhobS@q&|R0y_eL|ef0eYk22XS{%T1OEzb-2=1M>6IFCi=!lQD|4-r$JA)0a@$}%Bd z>MpShF}?_@GJCLOV4MEQDxqlmUG-7BuY18ULAaUZ6a~*iF%E<3&or2Xl&Al_gF+HZ ziXAP(1nH^Y;)FT6JiHKFww&dXiGHGe7}tAr?B+9cD>Q}}?V2&}JMZE}9kCirn4809 zs4~*nP#lgw?}!w>qa6Loh=%wDPbuQqlLeEEM$Ue7G>fn_MZJZWDQr$fK<^7TI?9d0 zKD9y|Px$txh&86M&OzqoGKUL0)fS@E;N?RC>5Wng;1)icDhxc8pI+s3dx0euY zePAh=nkl4UZQk}~2cknghz(o(40^5DZyc&V6l3f03+g#tq*B_^cs`cUwH7NqLXGH8 zved_iVV5X=EKmKUEIRss!G?HZ*%61XynORboR@dng!!SW}}CtB1Rl>um5lP z0pAy~0TIq=c{1PM`eD==YTXq(To?^Q*`>CKVzJKWn?F!b^we5WXNZ7sAZWn!segq_T)N$N)@A2gZkNdJ=aYAq-TA*2E?;^nj7@fA z9CMA4J()KltBK(=JhKPz*LCy2l_ey+csw!~`%j3zXWPUp3-a^y(dTM2tE^}MY3KW- z>Fp7)-R$-V+rD6q*udA+2rLBm@gN>c4j)Svccx1p{x!QrO8!8q9Dt4i;&k1%YuroD$1qKBi?giD_Q+9<8b47@pQGJeV=Y_5R&1 z$tL?>28Vrbx)3is?4oq(-+zVN*LQL3 z#9(s#Kyrb>mtKTVUW>^TBpd>Abm?^IKk1cSj{BR|(%vd*@8VWnw-I0C2>U+hxmI(v z4!)M=eg)JZCPljRr$Euy$??36x@m?S$IuyGyi9jBRaCe5ulk8m5$-6gaf*;j!#*>B zLC@|D!nsyWn>l(X={$}H`rukgA50-#;LEY|Qus2CuDn)yZ$GD~AKJ0tuqiZIvS$NM z0v1{f7tVk345W=nBq{(TU;wK)Q~1anK&v#M95^cl4rC;7er3VAQ{e1jPV5Kg6+x@r zpsO^Te!W1X`D95H0Emvs(#rs$kH7@##U!fV=_$62QKMz9bm>xHr8wd7XhE!I;Q-b% zY+qjCtaul=bGIfWBr*eY%&_xOMzEK)(&V z)f53*^%`5vw_suT~7gkv07M2ld^i(MUU-MH_i+;9RZa4ePEWj*% z$~F&fX`S>C=!QK!@-SqlelijyChloN997@{j!eRWm?vqZ)eXnX%;S3JCF8x}RkJF# zjJfQj;-6zTcX5Pgy7Z4ApM6}9L8Z(2U5J3NT+>g^o+&iI$Bza)R58vlbsfSQPHPrl zkW*bu4Zy?J5CFq{U(AJM*8Nham1WZgnXht>mo!!Oob}Rn8QJ~l2ni6n(Ko3j&)Kdn zz@*I?K1hIVJW*v#e5u1Zu^lnZCvs6@j!Tml{Q#mEODstvmyY(Wqf#I8SO>Q{RBb(i z!y)r9rsS!AL!@lXyPanu3K2%tm74PiUyIgSx`))q!UcifB=Z+(JHq6{I~5eC(?1`S z26U1?c7D3_Dc%6`-r>3jAge-S2w@)N{7z>*w@mib@VZUos!P32bELbFg}xFryQB$? z&5#32-lfv|L_z9xp(%A4tq>f_^H1Tg*aQLD7CnezHeS2vCue@Nhv zVm3n%r)m85Tu*(J@7YwLe+5t0QJ7o`4X`~if4cPFzra7W&?BK_m9Y|TNOQsc*G}-{ zr`RKh14vXcbt$w51tT(a8;OD3KO_C4&zv`iutLzjHK*0lG{PElkBHg!6?W#yRZM{G z?5c_RxEGoVr80l@JlPDInCDtM-l}aL1pBI0VUIUcVK3J9bm=8hp{_`b6IluKEA%C& z%zVaqHPx4TVw{6~5OpzPiD@qB5$}MJesStk(!s7t?Rn3VlE#m2_hh+0BKiArkIc=M z4|<(ayYv1lY(0I^4*H1=#{8HQPucS5R9F7SI${`Y-8$D-?QF9T9cIt6K6LmM5`@fV zX+tUjCrqahXkx&bH#C$0A07IN6y?X$#X_1c{fK~38S&FHrw~VEZ6ibG1Y&WTGDMgM z5S%nn9=sCw^PChl7rCVEiA5G<>n+~qVsL23qDS*`@`Rc(dqmTv&r+~zz1f#8jSC3T zz|y5n4+xWqc`&LM%cUy=5m;ybS{R#kE;5lIqkblu-Tmc)El%;vdatgSrq3BJS#-0U z_bmFMeU9}kPONUri`Tv-?(nst&HPvV@8y3Vx5KzS&d=~Gl9(?cL*1aOP0vrFcq-+= ztInbQ&GS`3j00vvZSe;mg*krFOspX1Lr(nwbhN2~EK39`H_z|WiT}}wAG3fYrVw#{ ze|fW@08@VEEaV({i+Kmd_aM3o`<{UgD+=t9vW7Aw6F3r3E+3a?9~1IB7oTDr^^A6j zG>Bp=Q=o#Aa=bxb&Se?^=okotkv6l}d%Fk(CSFQ8MJZ|FERuh=29T*fU2^F+ppXU>EF z>UZHeLTvjKD#*agoD<)2zn1m}u4Jr{i>+<>s}AKf`#{pjSAUjux->#27^Y69$_k{Z z07(`c&3tpxs?#3;ir-URYxV(0pE|2LHJxD zpoCwV90NH8E5!aWGp2J83T)Nue`nZ)ng_1Pqh~26L1mG3Mq}qH6j$R{M;;Ku6AEyp|j0 zhzqB%wZ1F<_E|>Nh;>3m+q(D~lhH)L(TJ3@6MULk>P_u>Rf7%bBiTK<%m1d#$oSrh zy=ARv0O*(DbBhCWlnrATFe)#&V#0CGZRt`I7)%E?U@^kJw^G|P^kYFjSt#Vl z2D7t=!Deg^Xy^MFL2`N-CNwS736_q6jUn(vk}Yi%3j?L3raJ1yeB%lG+G3w%YU-y{ zU8fX%FCupZ@$fo_$v9&iU50}x>Hj?SBJW&NB$JDSX|89Y&vC_@9Bi$AUdBeKE_wHI z9#hyx!q6<|$@pG~ebQ2$%*$&t=Xs*Hwp8EAWAyr#YK(ks(aT$^$=?>OYpLc)_O|Gm zE!97e-|x0m|4@FtE!BT5;CEKz4v8{Z65&laoCC!(l&*=l9IxfjRWUX_>EKbko-LsY-md(pL)c^d4UUJ7P?k#Pdv+l;I z=iuBOnlFN!26H>76U5FDapGeWLCqZdWGDWW<)b&1xb| zS{|Q|Hie`@!{|f()DC1Q2S6FhtW7~3M?x!ftEQFYJ^6xl?*l)F>moqKR? zbyRKT*m{n^>^YxmX*bjoNY)qh_<1#*8zsvD*X-*B6x&_=FqeH`VUFjv%u*X0W* z60K>VkvN=1P|UH-XB{1LV_fw=d9>gCqcvPEoH{+69w^Gnz@-D16dIhV^xWwrn;TX1 zEX}bG+V49b{jIyA!+{ce!r%O*H#&g7gJO>ekU?w5r}I*P+2kLyYw1AQarzRi80(EX z#txF8;B`v}raqEnA(uLWZwH1GM@r+uX-D}gX)zkElYHs6rS9fEmq-88yyxgxW$Wr# znbcZTeLk#>&#Zh~NuU#Jx2TkdyNsxPz}mvg=>ZLftUr+Iqi2&T=A!=Ev4f&DAmc>c zSKZU41KrPcs^ppd-Au2`#e{S`y{>1vEIbx;E^86!Jx7xyjVJ#3*gR?Z{-P@*g3MuC zm@m(q;gh|B{3yAf+1ELzmg`R7)8XB{5#GLQw7*?g=YG6XRN&p4!@l;LhldN-YpkfV zi?zUoE#R*_u@LUFhFW?9u~gzc)wkeqdU}wX{Rl_95Ukp+vqRKd@R{VaLlR}`3mAmC zx93#8s_iv^OpdsHCYNKZ;7n}bZ)3^*b)`I=`mU_Oi4o7p51n@UtIv!fdws&pHrV~* zXFB_}!XaWyV!lDAAfK?7)#nrRBBRQ#R^moBsZStk+v-`SE}$__(;Ma$4SIvOp6kHu zc}WMV1lL&sUYv+FbhR6%7l?nEA3MYh`5E!Vh#H!daE|70)%w);U?(c*PhnzL(nn>I(Bh^gA^K$$A)t`T3OSX7WBqUdi?(ztq~lTpf@%$oUa0VO+jRxWdvy zQlpwb!-x~eH{@<2RDNnDKtIqtmg~@Vh0|@s@CTN9xOnVUP@n~P^)g0!yRCz%|4iy- zYR-l6-}qrhYG78?Pxry+m3nNtIn1h&E~YMOL@fLVIpi5{bO8CZ=v>lM#F$ zR=baE$jXRpxJT|t>r^)j(Bwj-F1Q|CLMpyWSCkD5vDXec7uQ#E=XDIBQ(?dmy-?1t zmUYGYcAfRj+~-?$b_HQ=uO^3jobStdsgjrH^ov@<7y0Ev@P$M(SY0Ypd0(3NnzCDe~F889} z2#t?^Q|pyR``$thQ!>oGhI>Mv2n&Tg1^W!&-q}Y6lOaZk*bU+zS=NP&d)3qEv2fiO zhMakhfOSurm1kr&&rhv9?$#Hmiq;LJb#=+&H^a%{Uxv+Hj5eouBJvJ2+ItFV6Lr5R z1mhu=p7TmRF&?AP)^mjq`hgHm-h!Edz^c_Knxi{8G>>L+LP49c?S(LooWxLszlX_g zzCh1Mw_}NbuC{G7sxagtd7mtY<(Z`|k|P6x@0*M&%y1z2R=|}uX1)eTqsR^nEbRne zMiuwNxP+lz;>r5?44DS?Vjan@F7`cBId++x@qzZXx0ZZwN}lM^8HzAxO1e@kw@u=#_J5l)#xQIDrY1DZVzNfjSj^xt8E@Df#) zu$wixUWV*X9m{kb18m?X!3dmeJhQYpy(~x^rZt{mx$(-9QN_kgd_rCF+_Jjlcoj}w$khbrdem>U;-HN~kW9=0N&(JE zm^JyagU|);3k$<$J0uND1Za}TczDLe)|D~p`B~LS2q~5|=va%&_>MwW)vRDU5Qx2r zP(>oNLw#oXKKxVV9=N{=3KGs&@IO9b-3cUoC|UC9H87Hy!bp-O`E*jrM(NDKa*|Wa z!Hs~j6D>OcdUnbXBIr^JQ^JM1)OUNW-|;9$^1fK40)8+2)GjL)j13#A*7uac(z5=- zk{@0#*KEnP_xYlE9tB5hCJBM!CMetRb#WR|T1~7IB+dKT5>8$YKMF_OHP(z z@lhlB$x|Dww8>UlsZP@tMYAMqrPb)PM`4ytl589>SrU4%svT=U-FS|20|q7T|!|%{CEP4tn+qWLwub zpCxi19AnRcwG?X^Ts$sEEICYFfl2LYvFRc4+zR3|77ca|aH8w@r4CnMNq#up&Jz2c z!Oh&PQ0$}IPRVj9c{C+c&r@UnKik$|$1QkS>D0+Pg&Zy}lcip+U(%Pe5IDlq5&%Tl zZ!Vib^*LnLuF#7qw^79qQp`KVO#CP@RPoM&gnn5&p`yT&IKJLNnd497^l#Sv>vp$; z*SzQm_mlZ&IErFZku1XL&gcd7>^#Hz7<)JTbhG_0yej>r^)Klt8kKhE<<<7_XKowo zj^P8qQ?PAUIIdhbyW!{sA|W5s9$wTD-NZ~Yj%Y)u(epwuT}G1osr>1*4^#QEfAWcA+DEr@=>UG)!3-u&uOI@TuP8b?-NwFGe>$k@gA3<i_uFY%Q0a zCO6?hd+nkll>7_;>C#~o1Y?JA&LCz5M6_!~@$FWpNY~4(;$J5V6*Gg7h48Ym7PJU$ z_onlZhz!lr`X#!rE5CuDGRnK9IfK-%nPFlOD%!8~*UMtdtnyka0F3s-57Kj7;H>6r zuB86;aDo;bs~-vJhm6dTIb8K12TVJlbnHLOE5X9ynr0wYHAKVfQhyeMm?o=CfBp19(P#b(sM33WhsAE6p30X@ z4|gO&?`f{G8s-eaT_x~L3Y+0sYI6U}6lL_kG$>#H%M2xV&f8@SHM0MuUJdJiY0~~R zD_f#jx-2@Z{jNh5cJdAiyfz9zH7Ixm2qf+xu@AhwrxR-gZ2WnI0l|yN_qOdCsR>ar zAr@Uh*9q#A(**5z=>%WNuW%A_413ZU9cNL`U^zuK=2RO_AzR`XR=L-$!+lSXv>e^i z=4&ODloeO*chm*Kc(e)|9buM~kQZPmxQG1y=8n0WRS*P~9(G)d~IRz#?@L zf{j_ST(arnF%Rwe8<|lciRYjNq~^KmgbWEG699r zZg2~2;Urbrjw4QeG^?x=TwNi@JZ1QONg2?j14pPcG(b`9!6Y4sHl=PbOZwQapqqb; zZa}m#r{&Slq~)(j4$CAUE#J!=q$!*EmO2e1hitc}GVP58uO*$6l zZxPHdAd|-YZ~4riT%CjY&-$e8mrIU*nrR^)jk$=%NG$oQYL+f2m>*-ceVVSwZu<}D zBiWB5yYam@g&vKXQX+X7v$=HIkDS834}cLwXv8hO*;tkTyxo% zn@4cyzUh2_tl(%<8huuxe5bf8EuF?MmVtH)f(Fch8qWlIh`I^aPpGr9Zw+Eb|w~Ldhvl zkWojomp=LkJkqyIix?+ZNiY9Fq_d4`l$Dx^pya0UhqEwa4a`zH`jJmZP+BdsA}HO9 z&O?r%vtRg7>dm&5erngsJo+x`@41Vg(de)gNObE1hetBIfPZ%`e2B`5!919DWMVMS zr&q!Q?xaSO8dphmmI^$2%hDI*Y&@|XY(97Kk94)EL{^WIfXSJ3b|nf&9?tH|d1fh_ z%8x3uXe25TY;9XkdF{})XT?Igt{p10I4yqOcWK9pQ8?i2wK2190yijd53}H&V!=IC z;I_%4LURRf-%B@7IAjXa(Ef1Eec=i{19IZ;WxmkPAP=-N#E+U~!z%@z?LVb4654RK z06_?V;6z4EkNWgh(aF-Iob#;T5AApBci%O`im%*@45H&J-`B#3gm6BJe{rRV1!|Wp zIrQXkYJP3&nEEpxyqzFR9dVg1UC*eb2HP)VsnBLKS+;KTnCw{w^s%167I7GUOkWea z!X7$1SDuokZTLY~dZgY3)ElwZ!)a9g&c*dt9req14f99k5AvDV6T{3L_Rbda=vj0mYOs#-G0ZLwVdlgtFsV6CW- zy&@UtL5as(13smjOpWXz4v1B@y-3Rr?4e4Q{0&h_G=XI4V?3=qNI)i?Kjm3H1j`bf z9!kf?bWb{Fz(3v>dmF5}2^^+i3|(qKrBzL(5S{j`XLKQ8-y{%4VFKcnQctq<3IQCp z0ha-|;-b@Dczo<1K$Hj!5X5j9A9=QUCva*7&Y>2Z6D>F=37mWz&OR>xH>Bf2WLi$T z4f~7f%&UgeC2N0)w{|6=6nWVBB);Dx_7SVS+_~^wEEaD~l0{*#2vQ#6NYWCYSapj4 zJcj@H|C7#1;_~H&@NUhfEt`nl=Mj|`>EMZ)kq8b?3$^2Rbc|}?fla_1U+>DhtyDtB zD%BOxO%1tX&Zpt&_$?Qgd;;K%IUuW3R>{TbmHU9Hxx{rF7d!}*HV_cMt-O-+baZu@ z;#PZPSmS$k%pFU2ths0Db7y`>FNvdM{KmbhneAbyV}mc%`drmk#AB2 zm-biY`q$*FgS`^-Dc<#4{~;Pxa>Pl3rR1sU)A^wXUJ!STg*aR?HB}ND3B`7)D^8>) zP7DCIsaH(5x|8xkwtiVl4aQM#Y0#}-?0lKg;c~P$gav7B1sk0Q8=Z?8P>r3gj9)*t zI+xa)Z6eTZ%{J3(HFMh=TJamP^VI%WlOM|1Z|kBFgLEUb=b@jjGxf5BV^aQ_dhfFM zvGx-rN=_DtiIOqaPnGp^3O^Yc-kUl8fFAjA$8)&u$eHC$?0^X_AqG))^^A<~aYQ5W zJp-bL#`n0QgZbDazCjgRCR)<2?i1t+z`G zn}niO=^o-a^3*#R^kmCALPr@Yro{Pal@sm4zONbA3WxD>ABcoFw!bYWLZt@POmX0! zCp5)iQ!f{kNcn?Q^4~%pGRf8N*oK<=qmgWKvF%59Aayje&UYbpki&TRjy!mHI9VPB z^5EgYU^iql#q-$j6CG@Ytex_@9-h-BNldH$Qy3;Iw4ztc>v#ck&iFr+nHG4)gBK^h zcktZWfcxP$=5SvRE(CTy3TWY^mErg`E;6`c7pm{!1~L5}Qk(eiRhRI-&hJ@9R>?4i z8jpNHdcMOEE({4G4%M$35dy3N6hucD@dmkTvCWf8QR4n88Eh_Pu$m%GFS2^G>NRLu z9G7zU$(=0aQpqvuUEEbLKs(OGtoO)b!L}yn;WyKt^yZYX$4rome8N|djv+g3m2Uo3 zck_=Kt{+Z>Tmtq1wG6O?95f{iPwFmdg)4bpp*oE=SgpDLEpTh=kk(cw9nYxaZ1j1& z%byk!XVRAYM(jQp?ePYqaW5VGglD2CkoMQd3R07}=c8Sflyiy~_<7a(wnq(NJrMQB zkp{68dM;ClxTADw_iV6gmi#u8Tj|RfocGFmoC6Ee9jV1uL+;p4FEohD``N%(ePVm` z4H-r1VMq_rg>AWJp%{bU-5Jj9wMxFB=^r}nqQjR z{2{vet~7Cu@XV(T^CDI_IqY$OgsSKr?S27dh~EK2knA1SnACL3pGw(aiUAu}x-V7bUMH>QFOuM3ENsbpIevJ!3mpK21*5J^JL|-l6nam+L@mwpJ#q%EJA@SquG4SR$kAiKAh_7h_ESBOdi>5~ z{GwsgH+r5c-spjp<}k;rIC1t=Sxa7lZXnpLbTBr}iPxTg9#nC_cYG*I=o=%q>oy%Aa=Th5 z>Tr}gPu`2eqG!FYa*+CKe zH(8+*;}M8NDm!reaLWhFg;0`ZM_e1me$i;(GXNEji-S9j{G8-k)H?obmRcjcU3w0B!=Yfn9`J?&AjttQ+O6eZvdrImnIpSZ1}RtTcx`>&aK za@k<*_r34$_rAaP{Wd&V&zk$JnOU=D&6;_n=-A}534B``w@M)++>w#b%~Ch3dHRd& zrDq$8yjVyLC5g$YCWKR^MaRj-Tl{3&*^1ZfNRcDX; z3EHM+UxplY8ZC+EMlK5V#|5X$dtzjoa>5#6Uk2?6uS&Ss>^Y3XTzXVjt}H6~w6qvv zgpS3z*IuMTA#DyD5A+}r!o)CI%aj{sQ^)=`$H`~zrFTzdkC5(~WWW76>J2%g`}-Ij zWGg||8FSrX`brcx;kmOl|IZONJ=VUT?FG1h4u24^TaLQW5j8OGDTx-bS+gMU$+VMd zpUKvi5jS!;X)U8V&f=;sE%0N=+Nkzr>9#q~x*uQ*_KWRfXg#mhr?jU>B=K}#c0-1o zo?Mt>UrRQ=w#JNt_Qn(*zCP9H=^M|$_hnxcTv9N*AuX6UEV#!6SBDhsyJ$;B4c+M# z|KUBScO32s^(MK$y-ALtb+%od!3|<*q6q1LlrjVHP2sG_kGx!YuWqPkMW?PiwVwBe zuN!M;pbzkuVap_2B+G77T;jgJLG6>@hO@XLcQWmz`Ex#6>Gfqds`9f}eLsFueoVkG zwckg)Ij%ftSYH`gAWS|fj1+@8gL_W8%o0?U;%6+s{12)Tyi)p!*k8@}Xa<@q9mX#V zv`AP^F^wVCIU-|x!Pv?DXS9Ej${k00544A&Tohb<9PuAE;k80I=0ue}0r7Vk;``d5 zy}G+XYA!EXR9!X1%-z=WswHff)Lym0q=D4E)v65=(FEJ~^T%@awW`E)Gvp3yhD1{| z*<7tcF8fznA;)P2RVdRLvaIK&QBVPhh+x+vZ=2RoTmQpbgEkn{VbK~@v<70m*didG z3_qo>cZ#@gjib>r(X!8cs{J&|V{iB-u@Kz5gSu_*dlkxazfwW_^I0)jsKjR?BM%-+i+(4gK&J)Pi98x|9qz$24TfT?irDUo?phV8%r9tj(Me7MIUVz^rn1fd&6Z8`YVYJttAj**3wpx#DG) zKWAI;fW*;ejG~CldWDi|js3-Nz-f}J)aDppU1Uoxb+8m~1V8Xv|Bwxa7~HIFePK$p zFr37O{9%84A$MHtmskb<%r0amf1x!hA7yO*K-c`{Imo0KEA0Zw&wQy6E5*1aMRIkU zJ4f+b?rF?pz!er>)6UgWaqkEZFUUC*{Nv2+`RzBk?DYpm7OGirAzluJk`mS7AcI%W zeRPqc;g=zdw5y|%p6Aq-g6>1ZWVB&t?pY{5&vhP0W*)*~NL|RipQ$!Cd)9fu!)o`D zL+<{#ciFc0=h!Pf;dw~d(b}n@8-g|$hMQsv;yxFf(X00>f{VfJB)%)8KfEOScCp9{ z!bkT&*TT$WkanhOUM7lmb^=xRCq*B6$9r$z-rNFJ9eCPteml{g(&% z>g)pSFM0y0g_fA6ixP6D{SPwidzjR{&Gv=D%bWXWtV+r^sXZRk5a(UD&7b+Iu&`W4 zlR*EWJpzhEbH)Aa*sv9z{&#^T1ykP@Z9&z{-EysCwp~lYA}}^>?E9RHOZ`c~Q+?UN zHrcG@fT%gg=(Dy*_~sGUwnOjJj`#Pf=^&DNyicAO6|)SYBC`I;wO>ChL}#%i9A|BZ zo`flwC*PgNLDTJ`5&Ln4l!?7-_HE7|PKrJhdDb3ZHsxpQQc|%`+NT(22#%M}q{!_c zv(o)^7^z?Ian?iYfg5;Ws=;oa9$#B z$9bDNPdv_Ju*%^jl7Et2)-NicAkDe91E%J8=RMmz`-0$0|08RgDivL|r4FuMhB zAdY6uxgeO3eO+w8rs51g*&X``&7;qb4fn=O*>MqGI|M?MH)0y031yc+sUxCz{7rqL+q>F_T#P<+?1ZkiAtMIKz zX7inUTsqUAu`~?m&V&C6-IO<}P8k(-lnS#NGNy%3-Gx#eK7mD6iv5Ouw_1i~`KT_R&s-w>u!Oz_KYU2>k%Ty8N6in{(|#OGhhW|f2{PLF zDgx)YOVyk@k#n57_!m%oGj`?2+Q&_ zhMVmOIg)S{9b76V9lYafj6fE&QgarxEN1WUu#g?<@-T}I7v1INbLJDcTFKA7OZgm1&-HNCvIjg1 zoD1Y~bHQ`Li@=M(OTbI~anIr;7cm{=>k;`Zf`d=2bG5}p&Yig%NsHRpTbt=aS!e;x zYOin;qgff~O14OWLpERjgh^6=N=zdqf5s@45@$(?ZKQUqc{ zJiK~h(&n~^s^vpcIelYu-*7t#Yyx+zL!NWB>B)!g<*ZJHkfji z9k5zY7#k!hM5r^(G~L*{89$WjjwJV!o8arWPLUQ_6fc*$wSUV)-wZDtRr&F+*%P`2 zFSa2wI}nH5ay-nN=56yOX8BtNq!+9~_mSWeqGj$O1RqD=w5~-OyRCKH#WK2EK9w4- zc~dh^6cu`Za~LmZ77GoorAKdpY;^c^(o(Wfy|P(4V&%uT91$_Y-MWC3WOQ-i#Gad! zWZBBL1E*e;#PUbUs4ZrogH-|_cK&3YFP%#;7N>tjhQBA`@wuOv7vp}SJ2EckxyGbz zzNC7->EzAnUU`sjyvMGKWm^4VOZJAP$LcdP;kEMJFp>3y^(C{sBTOz! zAY>(Ci7ABjfKZO3QtWl1TdjxnWT`&Si^m>|5@kdbdZ`d-WURFu6cx?>u!y@*k|Oui z7i3~V5f=Y~Oyr{PNO_R`CLM}JLDig?;$2tZdM7gBP;9KA9?+O~BC!{5XQm^L)R7ZK z>iaOyN3N9Czjl%$8Als`!ntHmsDIL`#O5(6;d!12N(POw4Cp11jK5wJ(D>1N^Nmw=G0CIy4Lh1#YT#SPB_!rXn;dZKIeQBN z8yP%AhVpd+Wi{%}$&FXLGskeRU*DJDV`e-T0>XMTIab0pSV7NOY`#Kqo7_=tX`$$#a=<5V( ze^76Vs3=yOaG$lwuCur|VzEE0(_tj2y^M4m9+d`>p`k>3W&0_k69pK|3-@%M47(pu zO18vUsp}Z<>h|QPPQzLW`#;Jc7qR^?U3w0k&4Vsj>w)zhE!+BGo zdTJ%Wp~nwx6baBJhC$zx;z!EW6(Dx`(`t_WiDvII{&LO?Tp`9&XX}X~P9};|AjuV! zMHnt2gf3mXh1#S1?f2@a)R^f&aXX#z&7>^p&{D7nxoc=>AH)9LA0=CKr_FPZ%!WY0 z0u0g4m`o1s$uHwTelNgHaa4Su+z9S7v}xnycbv<{}m$w&Vc<5M$fi{ zU*i~K%+w@(`&3bigj3rjK8FrM9F5o^qYz$$C{dHHH@fxR%DM32x>E=!d{~$n*T!53 zm!7%T>R-za!D6Ui5T4dbIepg0`PP>3Z82;Sw93AVFYXhhlPr#bCNxA^25iN+XW-#} zl54fb6l=D91`Zp9sps?uFYvct74L8Vu`ti}o6{=WZ$85xzKfY@^G0R>mrO$}UAoA> z?@gjfr}4-YT`%9D)7nBHfB2fTLBV8t6P$oskYn5La?*9L{k95KkbX|~jp^qEre`lz zH;sFl5GLgGteTj)DSUfOcw$C#!DVUjai9A$Uk?65jwEDH3S#wq)oB}#5x+SRjnh_t z=JUZ%tZU+1`W~Un2QFY!Ki~=VB?nH*c|MRJ2Y=6oeph1n#Gbm9aDluaKqO3-m(jc= z@#1g)hSWC_Yem{?6Z^)|aVP4Cmf z-3r2IdRY{IPUl}RG|v>@_cXCk_tg3M2Xzk!I9u;l|)+4Djl#B-PF2g!kC?gFKr zlW#z0CiR?rmAp{T$(P6r^_-l}OF`xvrfL1*uOz7ky*fN+s{2Xbsr{AhvHtM&u|m%e z`ji2ktY=y3i{7h%ZpZAhzDW8w)+UU0p4$8ltAs5Xbzb?#W-5}>5cVUmFWv(sQ z#welR{lts8t!rW@1=G+{QB0T(a-jRk`0LhgQ@6J1uUVZyqS7)QgI3h$vYH`zb*G!U zl&J4^nhrfWV{9OG;Sy=tghiLiv57p5Tmv#>FWPeC68h^ZPq^i!9C~U0m{m#Mr+!IK zz*t~YLqh1t`N0ck?v7-(9C`2+I+v&A$gkdTxmKRua^&{{-)cD`BP#G0EfNLeLI*e# zJ?+3^Ipn0}y>Lq!+N(S^Li=On!gu#~H_aR{*`6^x+YKh$j)s|J8#%{h2~=68nJiB+ zS&r9P21dD``e-!$7CSSxu=84X%Xf@(VL%1$ye^)dTxWntAKRWSHwpR?DP>8Mo5!38 z_e)tuadT905h7qOC%ES*cOdmFLa=qGXLm8m*erv=id4?d5~~h%IJ$CnAWxLA;TjA; zLR(`iX9r!uH--Oa`!gc~(Rgl+_3!$eGWbx>2ef(~wGng4PMBYT+AtWWloL-bqSt;` zlq97rE{)l-Sp2??l0EVll`M&NoV$9VChNftdx zG07_fk&!oi4p;vlr@N(3F~QkNd+?#CIat~Z9RzB0+rLNY>ll7TymIt^ti9+0$*7;p z2Qbn9?O$P?A|b3+uCgb<(Yc(XjT8Kt`_SoRQxmaiZ;*mwy`pp*q8=KWqC~Hu`u2~n zC*idnbnjN|Xok+`O$&h1!_EGM5J;aR(03)uML<=`Ni?uf)P&U76Hl{3TFKuQTiaoByIkB!W6N&1{5xr*p7Dj{cg6B<~lH@R5}J?o#D zdLLE<>NxJRGzx^!d?-1HGc$bZC4}Pul?qxqJZMlZAfgsuUtIk5=(auiOv8w!1Jia~ z=W;prfC&#US4xY|=DKLDgIb&LYwV|jiFSDcRTfJ;b6(5D2`7~4I18=#juG)1b-d{( zj%Ov@anbR4U8&=Ai^latc`eX!j>~Jbj<-H4-WQE=E)YAUF8rZ;i9rIzQe7>T>}5nS9)jH+xO-S<89iheMb zz06tuJ4=1m!bHAF7jsvpH>YpSIn2LA;l_lgFlLicz_EG}Ts0dw^HaqJ5cTG#`S~W7 zKc}z3?aN*nBl70_H130nTrDRBVPIYJr(@*lisX=@Rx0UqNsm+|Np^LSeTBP->_d0m zs*EfnV+z_YnLr(7mQ-e#C)(Pz5)NG`R*VM+IR0$4^pchI_&6n-wj3OZ+9Od}=?w-B zd$YY8L=HoE%%NxdXBQn5jdzMLB$C5)qRCb|h$6<6)d;$0P9zhI_g46=P_HRisa&IUqu;W0!8!lS1)#wR_QEdd0+ys;Z$lX4 zUDstWM8>cXk0UD)LK3x8hPlV9_mETV1(Ml30;)SFTlz%uvwKx%vr?$XGtD^oGk4lM zv|E~x3-r$#m1OMS>36BS{c{N({(T1Tf7XP&1NA_{`^iGg1qX$}sokuTq)y59N)>gy zT`MqjH?*ZYT?=io#E=jP_G0C;Ezuw9^7uo4j|u*c;cz16-FH4A;ax;Uq)wQ4Ck0{A zlA`(%YrYn)X><*AY~Fwfb2t2(a9R3HLO9_aIVVA@5dKt41!R6pwv!YMpR;?=Nji*3 z;&Bap!XG3G;m7M0lTN+cNnOt)gmt%m7mA3!`k*g{1@lnvjK_hYJ=i@R-07bV?zEJ~ zhxgF$C7B+IPE7Ss3Bq|b>7v+;=q_s9OdrJ%NcBE)Hq|vQC+Vg98>T@`H35Z-GdNBL< z|4Ah1GMJxSlgAjkN+{~}Ta)}bugihDE>4=Y&z59oh-!qzWJDO?V+b9gJ2)!%SBQTZ z%n_saz%KFmcY;N_G=ngionU{$xrc&JcT0u~XYOTHac$zjz%y@B`f&Ud?*>Fz*Y^;L zGB@q&_m{z|U-ny{_~SS@^zB!BzsDN1m5MTO&s&`kz7s>A@J%r}`|jFuJZqxDBDSOa zi#wEG)_T|`^4gB3SLVJ&4vp-d!$@1Zn(xN!c#G;I(#FpD7;N6yph!N0(Z`B=$!2I^ z@nz4PkGZ*rn`xk$UPMo&Hl(<0Us?UIelKeS7-cFD!%UF~ud4K^wJap~1A zecGi8m-n^HtJ%PavRnU!*l3I4E~+kWa5Bm&Xsk-KCw;^F;Vqk#arC1!XZ^;Q6!{@Wv%DWVueN$ z*30(KWn6`?&gS*|yoQ4bOv>S_>+SoLht)$!>lOPhjb+j9;U!1yIzcTf7t}6OihGOO zF!)xuelL>utK~gxmGDmDb9Dj_YV1OjxL~i?XPLxVXn~!qvGrh*RlJ~<^$@7t-=W?g zmG}4b`{VN7tKVgN!+uG<56a3=;^xh{ONLoml&~g&MC~_~_}hb3+)-7}s{c&(v-~r+ z`Z?O|v);{9%T(F==Og6ynQx-l`m=Nm?k8sHoR?@dB^~~ebc;M|XCYq_+IjkJl*icg z^4H^H)i*XgHXNkd{M`Of??JmCV+?;LrIBjEV5W4%?bv~Ma?N-!!vW|GwetN2K z;?)TRk03E%#0cvcYoGfx)CrZ*b12valv=Oza%G8Us%3_5v@LaL?kJSGCpM%$i_W}l z=wfROrypQ45`$=~UoNvQ>@eF=BQLYQ{AVXHiJqn$Phb+Q$~Cwj%2HU)60jfIKVDzO z=`UjvhEH{hNiW95tsd582d>1TnE5HbJ0>vIe%UR34YS<$=A%^Dix@L`Aa#Qm zO6;+(`;%N@Vc!bqa*0GAdTxNNyr;=w#8kZl6$bLwd)fZ7U7=5pAqZVI7$s7(c6(EC zPHF-s2aQF3uGtDF9AVc?mWZtHl(})zc3q-wN;E_54PY!-#8WIANJXO4ELJ;9W(T=| z&!l}0MHzoDpd!{~vm=k_9vM>CUrXN_ZY>zD`W1UBz0#Gt@(vT31svKHE8!95Ql-kx zJC)N81?_oH7L>8(dab}(ad$!cir+H7W9{~in14xO+w*>jtiQlTUeuty@PmTz9E7CS zO$X16buF}f{VaC!Ugaxqg>e`fR@~1y-+5?m^L{dOz?*$1i!=FPSK>x7CMjfb=1uao z=RJ%>AQtM01+y!jbccS1tUi?8KI_$W?#1cEEN#vEtWNJj)GZvyk3+BWiap_LuwZhaz^71P#v!M-RbFhM&ud$Ab>hgv@i|30M106oA7tSbFRURxc39+P$J2>Ct0?6cGA z;&__L>Y!r6dA~J1t?&V|V<(a9CJkmcn(Xr9KFPD*rhEKW8Jb81uQk=0zpmiO+(Vu5 zfwShX^BuXOEpIeN`+14Y`;X3V!$7Zrq8#uVfP z?|1XbF0p%i-UJtUfI{?qK$nv$YrCvNk<(=&v0fpd@_*d%FO&Mw*es5-TW$xQHC`&#J*Rk5nkdhuqs}~a&sW{r7QJ@ z!e^vpy^^`)$+$&{Y>NA42k&*?^8t=x^f5M=t8N>rWQm@umgg#|aPB{35a+6dER)dh zi4(f>-Wc~izvFFy6H4>rtwr&EMS>sW#7w`>XXQQIr>+ZLyZf&6{LDj652B0BTNi)n zyf)~Jl_~Wt>*7OCYxcz~ijR~@Pn=1AqjBEJ=el*0VxT5_+@BU8<+IA8*T2$57N}#GnW~j0O*7IW#!) z=$Fx8%cOsW2JX;3(sLX-T;zUo6yLFntqk>#4W@(^B*v<5eO0#0ZRoL;>fkQhEUoER z7@|Boj3^jwD605(9aX(IZZC5IBpOKVrUxL1MU$pYNV5j3-s4E~&ZYm1G()-{p^ds2 zc|$z~vYRh-=yUAIAbm>kQGEo%fK7RwHg!=%pXpYVO@{itRTj2k$* zT8>eT>>d@#YZjA{7?Wjo3X@qvWC`tJdE;kEEOu8ut6LeAA-3KAHqw|4-STH1;_pm{ z)ZbPS#Hy89&WBnujxYG^@MUh}ya@e_plNZ~;nMe>XKu*sVi;2JKDl6vd$bYF&0xGQ zT}UH6u?cO3+6V`yC(;XVgZB(=jcK_PnYW3PF(n>E-@)%i67ID;t5?nxlpP5T91EV| z-R8}X@rFugxp>Qp@pgHqi!9Xl41dtqw0#4ZGj|&Mjg8oKb#c{Xe&+`qqDnmpr7!2W z*hyfFGP=+Te|pF#Le5tZ`-@=7Uc^zf6MgI^<4KDVN`(lfiXs#(sN}S5es)Z#Y!=H6 zK3K$uQ@N~z_$Bzjw|TojQnI#1X2}rC_=4hUVmsnH`!DaY+?1^%1b7w(>if9m=}n08 zxte#0-hP;!wsSFa)l3#L{RL%Q$AXCT5la?#>uwPUIDT=N%A56pw|(_2Hk^fAGq(%D zWC-g+3waCsR#%2dYBpyF0=~z zG6qtg%a%UsZv9WZxUSpX+9EH$j>H9M{t4*P{M}0!5u!nEh+V66%>m#ggtfs`ipAf`U_cm0@QYFaJ zmwo4T)(dh|`K5BOZ!(&F_u5vI8aJJhm?U%&iu}lbOAbSBvybBT(~)ioXyzkfMJB|6 zmu7b4F=3qL!!RA0M%~o52Y!hG7psmj1F7>aQN_3J+(RkzdOmVbkOMTTNxInOU=Hu~ zciJ8T-^43yVY+-d;?$^-(msDy-@{^BT1eyV>ATgByCwjxI(*< z^MYJVfSpLfED9+ZAuZwcTr1!CKFohk2mS5PAzwe-o}<5O`ZERsSK8^Rh`d-zor`kll*~PW zaoodl`U#HC%889NG>oL-4;2uZLj$MS`yU%z>^{M32vwJ6;3#dRt)O(S^Z|8vktWIr z9XZCC({(zm{j?=)DHw-3a2fibHnR0}jJ8KlphTHjPF_ki1uw)eB^;a5Tb`Nv`V(`B5kcth|GgV7vv-tzUhogdyD;bTmBFjSvo6TDFq}A+pL2NC`R*w$w(Q&AxcNIz2ERqyKzt_i zfz(q~v-#cE?#quO5n=Nhi0(pWHSUgQu8$*&2P9^Kj(1 z>f0g`(aL>XOU(2RK(bVIsB<{L!Q~f7Y^XiH zFg@$9`PM+?dVkKxD>L)s-oQGfaq3VeYHuHdHyUG|&SY=oJo%m}L1~3mlTR3QnF;E* zKFH5J#+ycmVqtnlHLsBwQP}*kCEO@UOuhjto@v6I#0$Q zAHsRPknw+!FaiGT4otM)Lh0??yzN>qIvYkC5&)O`Ywi!@X9E$n_Dk|D!JQI6!Phn+ zg6+Uw{q{$HCX@fJLTj^Vi@6>wIB^}r4$JpV7#jUfjlB0G7vP3rmgD?=aSpJG=C+By zp;ux5M6Nf*(4!+5=W9C&C-+)Rr1(}f368(2ZSf>d!4(zt-HaRg+nG}Evl$tE^KcPf zTa40UM#Qi^6h&NPZL#p~_h1;*xN4g(-oxbHAr5N}u8WOKaX-OvyLaQbFe21D8ZG5S zkNel6bZp}dEhI-1{u-IWpzC}J!5Uk^C$@+7^MwRE?!^PGi{m}PDU9g6b%}XglBPa> z#xhe{JWv;UZ-=YqjG{|5P9eE5>Dy^F3jbbvc{KF!bk6zd~O>Aqoa zet6!%$L>1T&i&(8HCnCT_#q2$f84f#UcR3GT1=!wKx|~GfVjx@0^%cA3rL9g1dNKz z6)-w-ser`Dg#yMzG6al`oF!mf@N)LC*>nCl6*|xA5_wfM`8ty?fbbw;{=WC`>sLb1&!~!*PyCs36VQ+Ju*tXMn&r6 zeYCufj+DuJqP!bhV6NL-DB+m%0uhikW%Tc+XR6&YXSwiXy?Uz5hKJH9$6r5S>J68 zYN1z;FZ%|r<$9Eu!@UdecK@l{>deoSQ}t*@`cqbI^kr_x?#aDs^*rmoZ>FJ|^2cfF zeHs&~pe&!pMs5}mr>gmBe56RQgh;-CQIUB9Mn`f4Bt~Wl7!#QxU~J?Z0plW51SCb$ z1SCf$2pAs`5`C(wxx3OGc~<5wMsBw7b@!B3N>1xP-BIbTZr_cB`x;L#&pSNt^L)bd8BZKai?KWtc+z;L@SMXlgJ%}c zH+g=<^BB(`d7kBYh35dz`#hiWjABVHT9Pw)&gZ$5XCBWrJUe(^Ii8)P)vXIWL@GkNiG%Obg1? zsfFdpQV4#Sny|af26?BSPZCV+bhpmH!~fLacKBSiQ_e1(A8l~=D%9X`?)`}Mo%Zh2 z2${LxAC?6lcORYIHCpYGpThp4eI83hbItMKMtK)Qko6sV8qdPEd@L<9bZM1}NHcRx zj^ExT27d0=pA$&bSh-5Mp%jsF^j4`Mz1GX@RLBvs464B-Q=aZ|*>52@t9wuM=YF1& zvisJ)8@S%etCtkdC&iqD?)$mV=bxo4_J)$El~<+qPwe|hS8bWBwV`kyW>v6^7yNOo z5ilss>2{0@x~2c+JiF?WFET9n$s_`3!vaXgSBZqJ4jLDH!Yb&sDXK`a1M1}xZH`6Pa#i!$zAs!z4)gE23;JMhK4A~gCexg+y z`y!djoYNshgv+A_gZ0|4{g{Q>Yh0{!NX8Oo3WI(L_Mh<+Ik7NNtP)P{V=s z@GCexjssX0d$j3_w@VFpe@MG~>^g)wMr@TiDq3Xr=H*;PJ<4M^Vj~BU-&A+xu}-va z!>)Yhc0L05?M^n=)%s4>k0Po~vak5jAYb{~H>jhtFh*t&OOWJBv2!5~nuv$f5#epLeK*NQCa@OkT{**k{fCl=x{?E4ElMCI`q}5atlD~? zXmQSOSMP|3$shAYJQ2;UE>SB?J{ywJBX-GWSd@)4jlh{sF=&F4h{!Cf?Ygmq3iZdY zI?bZLaCFM$YC-A8?6P2&v~65v`^n@gCuyavP>-;;C0iFujM*IIzI+ay5PN7(;prXuhxg=% zI^wv%LG1>!-jLFk*xS%L$(12a(fFq@Q zkajv*NtSfl9L9aV(mSq$O`r|(d7sLu-LfaN!Sxs3$92!dW1K(kQ*jeBQuo?oq}Tk+ zH}c!Blno(n7P^lT!qP|}@(!-vZF#agkf$w|YyGBb4B-D4wG%>ms2w`K2)td@D^1$# zo6;P7w{QR(!G8WSV?8Pvn*3Bpqc2p6mZP4g88q^de#>&A0J&czc8u)NJC7~oXc6$_ z!tmE(!`^2&&*}^3bDZ@VpL@Y}u<$|;LZW-YvzeX2ad|8%xZH_&1JoHQs=@R}fBJ`#DMPzf#1TA)Av; zdOK#8?17f3Yps2B|0db(%aS*BJhMr*xY$XTKlHhJ`%^TNk?E2*GKOS7bGsBk;%8tk zC6$n?Qbd5bw?%KV$ST7b>w|pFgIWyMX0aDUZKbI>YPC1=Ri^(}*%DTlv4sX=f@5-9 zH^@v9OwKtH^c-q#<~=5Gs(l)Vr^**5MNCVlo~(4=&AFw}+#F(YMz9awQR&Xu!_$kv{Nk)i zzxytv;iHr5?pHo`rF-#=nd<$*8JR$L>slSB=VSNVA6L3>_OFBuaC@A z;`s)9>dFUIW)n9Na@s~6;%#DX;dz;dTCLCc>QsulTVgE*c z6fotI_rgx&@13mU-?$lnIzk4Ez>FOxeJZx}1)ewXlS*~+;6GF;TIfTPBH2{oDJ1=F zrF(B`p(IatqE3x3vvB)##%&aUUh_%chpZGU*9XreX!15D2cMNNfS>&?{XF7#)@S0| zt$qI{zB|PC{2_gxKPTaPcyqB(PC~Q1yx<>~@Jn8#D|J+^A67>96d&DbX2;h3jXkrr z>_2iBZ$~Fvgx&h-+aGT|vUkR{@_yvP84G~!RxiDI>#h&}jthPJO?oe3Qtyy3M{k@K zN6qlL!~(iozo~tbSEv;BP7Vs(-}rIN*8MMSm%O^SzP5MTGdj++RT4+p@ksC9+80UP zD&aqjB>x#mC%zPeo~<9>`0SR>MtV063DkY-$4fi69!;4%Mp8MNGGiBEw;cHJSCeh? zGUIMuAXu+*-2}4r=u(hf8@sn0*uQZH2_(N~>B#9S&h}pq_2K{ej*2{S)7D7w%Ucd? z-u0|Zzs=PTMqR7 zYTAn`!@gh5cvr<*x@+s+r3bb~mhR@+we`iN?{3{&{I{)pZ+sgfPkvj%9KCTfZoPy{ zzDjc3yL8$$0^eMkpzt@BPQE~waLd-C#gL|W^RSW%RhNl(6Yj6(kn00KSvWmu{!cNSz;Z+CLt0pdWm5h~;mO4<=mwik zl|7ZXy!P=RUiWuU3vTY4N=Waz&h*|n>_U1UkByuu*ugoyg2izY2w4A|gYLB-P&n`7 z@n}~%)ShH!xApRi2fXX{WWMa3x+`*C-nx15Uh5?9y04DnI+0^@V%_)ti72_3|J8ku zSi*TP-{TJb2QTg?BKbKVaG18xJ%4B9OkF&3>6p{(UJJeDORW2^?Cc$7?HbpEy-9xN z7CyDz@M=NM^NnXn_TKYftMsPyd`$>Iq)H-~R3-$Bd0cPWsJ}#bdO>i~N zkqDUXc$!HVnC^lbi75{fhAU@rYg)r;iYVUpQx3nLk2+MW=AXA`i3EfpGdhT8?F&Ja z<%;N3k4*q!VW1XsoI<}z-L>PaGZNfPfHa*5Zx_hIAYbPhS$mL>ZyiY8$a|=NRB##T-!v@!-{J08 z>IRBCi{dJEgIB)l8C~*96V!uXuoGE~TAWNueA9)U&4E<6%1vbTVlCwsiPEh^>ZaD2 z))qO{QUvR3O>ZW3>os2QQ=d6_ssk~p-H!@We|ZHniQHcP_-+0ab4OurkL{t2MaJ^j z>(F3PsnLjXe`Fw&icjqk7Y*HkG$fD88vCQrn^UYKhdL7j6R`tX?N$P&eKiS&-aH(+ zK^@u3Z9T&3-u=|uV;aZWS<35ZWKQm(t{Bcw<2<&}t#84fsQivaJov?O3J$+ScdKp+awduAC-{e^O)eMvwUHQ9d82y^Wb2e9TeAPfT^85&Imho3Za+q^_zD zS8X?@-R|@1p-aN9-Be!~N8Sf~|Hk@Ik!)l06h@h{lDA!?Z51vP&Vs^?yTdpSmgqIMQqF;>Rp%AT3d)7lBVsm@w*i{f)C_YD3bT-l!>P(;o^Xm`O) zWr+DzO>8fyQ{uu8WZ2z19&VrUhx8sO=UAX}>AlM4f99fc57nu7i|8Tj|N6i_P$Cubi zt_u{f1;9EWv?Yc6)#V&OIAO_;q4vhpr96rZ6q&JuX}*lj(0f%hmF>>>&};2NQ1{9f z)A_9FVuIDa_S`-08xZj(6!maP8!)%KE4Sk;;&q1yrQTeg?|AGq$-iv^79g^rB+NFnKKWUZVRqXQW&4>6AZl zvk=Su8!my|?EVdw4jVb{G;r3STc!Jggj;{ap}mRnR>j-Ou^;)}GrIY6ey3UkhTbzg zL`tH24sZ3EOms{klb>}qbZReF{0lopkDSjjm-*8eT;%cL%-zo;BNM1_FpA>&+Q_3I`duWqq5Q(wk zHo8hkX=*1o7|nHgkYLUM<^ox1b_N-rB#{^wIaj@Sj%hqLa;nBLCK3M_xx|GR&u0Q! z-j*-^cD|j^;+f)-lMZ<)V^l&YII}~3PfX~}To)FvxIeXDI!qCbn3pA2?a_4T+W{ee z2^TcvrJPk%BETBo?k|e?g%aKkoPZm!ydLk=4*9CFS4HOJfP|xC42!-b#hO=Qg3VLu z$oDwfi;C>`=vk;G!i6c;POK$k22yvA7lML&6CV|7xu2RjTHb|>ypNH0p)c=aR1nw6 z_B1NI+=+SaCyUvi??}s!>tORUaHdt1RFJc~VXWm(jC-~qXIH~`F9r{xj*PsV=Nb;6 z0US(>7omeX`A4Th1w6OrIqAPU?OD_b?abM77m70MvG1W1iYn4=<)(MqQ{=M%F+++W zN-xv$jtzxhMY!gh@~F4GbNq3gE!jnRD6b}L9LE5zob68wj#8RlRG5k%Dn2(Ts|l}D zpP%s*TG!DJKEfKxZ}o9=ld_pP;sh-fJ}?2nOIfCH$HnvZwhKf^66Zp!cns6 zP<`{Qr6;Jbs^xuSN7gd$^bYUgJ-)aO-`e@nHNEewe_qp}_Eu*EUbBBaV_@LW{P@aX za!XEG;|f+b3@^FFLa3!$)qW|9G~0_k_H*i`DZ{?1S{X|W5^dOgnYk-J)SuXJ_My(v zfr*vt*YWxE3Bl>=m{>P%!S|8C^E>TgP2i)2}N&5#sM4hqu^p4P;fz9g)6dSnA zZ^`%5Cj`F+f8aQ`Z$cv1z*(}*=9`cboXcyPyr!|B2z7e$2et>F&kyxZF_{E@;KV;2 zZ%n(k2j9ngbR;C`;A3$&r@Pzl-p&l5b04gkei^FYKyQ?nLWlWJJ87KS*fGKUVX?n* z_4W44xLW6t_m|{7ypC0ttFN1Pz5}hk7WD4A!dxNwO?~$yLEmA{d@});^~w{O&Izvr z@1lEXH@f$`RG8ZxU{@I;xS?u!fg{|UfvdNcRKe~`?2`yCDP@Uth)f|dW^QlEMnuz_ zT1sk^ESP=X^|u$omJ9v%PBnzW%@mqBr=Gb7Z>FH7+4djAtG!r~_j8|UHdce>oDEUS zBd#iZNJa5c7%PlkktNYuqzUGp@3bi}#=dMJck|UsDxs2kS67~r?i81xoPJqEq8^AY z&=p@?psA)n_G!FW;SFTd?r-}4T)dvEDc(-T$(Ix_L(_}Rg2JrkJBwX`8mL5@z}*V* z%gboVRwE3e=VgSN(&B?xE7vBEC*fO@|nx5G_LyZLpun_ZsAbR@Qff7WU{R!#b0qtSY)ym~B6F zhRn+zSMYMb^&<&vxI$*=4$3>tn(vt*g$?z`u1b@G)b^`qs;$Ox|AqAOoV^5Wz5VcX zDQ&oe=u%+&TMDOhxBD|rP&n185KUNNs2z2R*)PSk7k@!9{q~X5hZR!-e_1iJMilcm zlckuSWh$a(sWN_`5gN~*VIKgo!o8#`{U(~6_GMB_oJBMl9E|pV5-HS_<+>};{u!?W ze#JkXATl=XW0Efs&Dg_?UR(o15vvCy4hEssWQd}zuoCUkniJ$abGs@_U&?I`BhYd3 z{B%9VPY&HW!bf$-7%Q>8Fnwl6%Mt06EUmeGL3f@J)uOi*JIVZZL^92H)^qKE{w&{j z@HvhmN(-P1fL>)7Lz9un9n#wCzho{Mq$2#{LCEgpICn%mrCQUm(noku$SNnw*bzSJ zo>3j;!x0%NRfhK1Gw31BLE(f8XWi77Hs~Hr&!=`eWtJFlRUP5sL1)uwnyUtqTC&-I z>j=cNZL6Gpynxxv&X=s%iEv=7}5Gc7!hf|L^}W3KSm^O$J}q`CP-a!y0B8 zIM2Wv4Gb8#-oRfN_y+^G82FNby#~H-;AaLV_3M02Gce1*Ii?(6F?fxE>kNFvz{d@I z+Q1zKzGC1(1LIBoPBHL&1APVt4E%Qke_`NL2EJn8dj`gSs>^+fff)u~YT!ZxZ!|Dq zV5@=OHt4_Y4EG4ZOy{8x3qQ@Gb+_8Tfqz|HHry2JSF$ zkAd$Q_?dy@Khyc98JKQhmVxsOTx{U21~wb`eFOhs;5GyI82Fxn{RWOV?e8%#%Rpz? zy?scR=LG{FH*mdyPPjjLUCk2GfsbDnqwt<6=!8cRsr(0V^YWK$?Vj~>4Ii7V(uWx)pG4*CacOIMaw*OV@=sqh3ER(ncsDXp$`xte$CdUG#IdMA6OQp^YrK>%)6{|co6}7hnswAn#KtpxyEuKJK zou{U*_7<0G*NNlz826H>@?GxH1uEXH<3;=1#+`FJs$OrIdOc=fwt+qaOANfFqPC); zy3D1@T?0WC(Os^p7f)P1`wQGf@r|C=^(4;(o=bR8gt#X1oXoR=$HP;{a}JN}0ZQLO z1*_ooK#Bh`9Zk~uhk>6MC}G8)W3(#0@-aFdT3y$9Jmct?(ogGo&fqEHk#a~Gj=Z8eJZtwfxcyev3w3Sq7IjkYAC(r7h%F zWpL?J@@qD@w2}NCG`Nfp`8j<4JdL_G7=P)f^6N3U^i%oS2A3@?`SlxI+D?9n*Xr_T zXw>B~xbzA6WgA?^wfu? zF5^vpdkijpPJXt*oe8Jk;L`Wxmsq6hBYjYQX$F_RD8DR&kJYFv*Wk{)RBUj%pZb*; zyvg8A2EX0l>kTe_Tz(H3TzHZEHW+-3MqNDyA7yac;4;qTmw25nzwjver5RlKi2R&+ zUHGp2vWxn9@*UW0oKF8ot|*#=M7sLPRO9C^i& zYtAKcR#grde^eSKYn2u1uH|LR&#un}hG;1Y095Rz~; z4G2!FJ!N&ZwH0M1vbY;L%~Mm|7#Jp|47%3^1D?7{PkG%6B}XZFL6=FgSMoz;HL_ND zMPpe*b$y^t*HFT(px~vqXb!x*q3*VdT2Fm-y~a&BM9?c;K3E%%)UF+~$iW{h|)sm(|vxbVV2df)&isihNQ5jA0 ziWT(%%?T=+D$0TZC0$n5HLNH_ifw41&WZ*VO%PFYB!w%f4@y#H!D~xbAd?PCf{K2X z!P>Gxad%kDR@KoQ!CD%vtV(iIf%#Kij!<1)SzRH5_lmlePW`KEYAS9it??{h9jNd$ zQjv<!DtKLv<-0)pgPV0u6OFox94|PoS<$kz{BAfV(PyhYqTH&tP~& z`ijyOgXb`AoRTPOJ z`0%kU_^|He8fO8Vax1U(1F1zdpYACHW{G~A<{aX@Y z+%ha0%%Cxi6{ucOK^$b#il%^0QY}|q;z35@rG7FzSCrQ3Y#U{i)Ow)IVE!lY9~n=2 zC0$}LT;u8$%j;^Y%T#w|VYsrQMtTgZ`9JIJHdZ$ctV}9cwajF-bpflM8nuGa^}MR4(JRYYr`F(CHB?l% zfD0-DUlFP+FYraf@%-BAKsB0++biZb@K#n@vk3lA_s!E1p7>wOz{ykmzd~MBI`iqM zfr`A9aOJ!v7LOWVRI#G8zN)UF0vG*@a#vx+N4qbslKx&_S68!`{wOmjg*)C6_Zv#9 z16S2GMET7xt*KdFT1Lm4UsKmu5#@WLd?X!lACZsahP*o$l-^b`{{%kbPRBfv zm&$ihO+`ihalZ2xDNp_k<-6$m8wxbf6+ds8l39#nUQ-$EQ@ygnwYXvR7kQ~9uV)G< zZLByh-igaWFcr&bpP>$R1CzXXEebA2Q+K?3bU!k|UGwW!)R#6?EK=$*nud0yR;9Y- zzzgOVmevpYn#=+9FKIb>z0tq24>{sjbW*I+gB>)Gi+Mli`OLthlTMm6jwjwg(IKhu zLpkU-(G$r}HiPxs|C+!5yOu9wsivE4+9O)8D)N7{PE{zFQmWg}(Mxy??&x7MqWrTB zKE{yWZ*XUwUL1v28QfXNHbup6HMq0RULWQEP!#^S!JYDLFu0R{x53Am^6iO=f570z z+x3>g8{C=4KQp+q?sqNM^mFidgFE39qx_Si@RTS#&EQUZq(}K@7~DyJ zdX#@w6h12|e0CH*CkoFsxTDALMfv-q@Pa73$lwk=7DxFPNBQ3v*DtgHiYoqwt3e?u@U;qwo%cJN>iU z;7)(pWAKSie~$8ZmFfQK=rPj_?&!g?4esduilh9SqWm9>^50C>rlYf)J(+&Pmlz+FuGmU@0!JYKeDo4^Q*WixctjgdSCjNs4 zKi}Zp26yzzw!s~K+;4D451n$0&d=eW(frb5{GIUG26xggHn`Kj>J9GDXT8ClNjy6J z4AWm7{ua%jqQ`eMKk!GzKN!{jA2<0sdh2D&mLqnRJLGdMTUJ(HQC0)2FKtBrF=Pa9 z43vXA4$GDWs;VV`aagvjva~TU9AByQRgMek)-)Jo*|Lh#<<&Z6(p^nVd4G7Z9ma)=CI4d&?<7La(SgonPrPi$E9bc)4Y`Z0NvE7KgGb(ZWK7Pu;(XVIKG zrO72b#8Dwi$}1{MMbm*&$BF7GV{sR3sE{N|q%V|;#szYpD85O5cyv~4?5*n}4COzV z`fzXPpt_Ss7ypY=5qecO1cFeayt=Wz292F;`lCUqcj{SD<@u7LXu1!D8={0~s7NJ4 z{{OT{C1rK>O3OW1tzkqHx&_NcMI@_H)l4OMepku$ix=msQsA%Kb+A{A#82EB(*K=) ztsA7mL0u(vD{8CJxz*G(R!gra86uJ%DZ?98$`|ebwVOtSC_y>J>bLyMh#DR4ghZA6 zhUj`6<%Xy~BAi42C^`=hP5AQFsJj^&)q@M>1`lg;kJB$4f3zn})q!E%e|RX;8SFg& zG`qoY|5D+k-pA4LOVS@P-UCWsGi=x!eJS-j`)m)%58-8X%Su-nWy>)4Idg@J!8;ej zS3JJK%@ac&muH@^jrldD>|PA{df0E!Q^#>-5l_dyn71q)nZMEc zK*wWby4uxQBb*4z{4egvaUG5z!4t*9{Jt55-yemqkHY^g3jg;g z{994@A7V%5_uo-?k|~EHpE`1-*x5T}bfDC^=&cx+$2f=#E8)bw26yKtZ%yD1)g_#? zx6{fM!?dvT>l*SH&qld-;`E$!J?2Hy|Dt@e{}!X{bR?*Rd+Ujj`kJgKN8)F6YdqJ$ zGmO6jxBNo;XZ%vbjt?~ai-D4l{OV1-hc+311FK%t_#+0s^`6F^^gVqV*QpHsb^INd z4N>K8iYlka;Qgk)PJE$(*i1-Yl}FlHp!8AMdzQ9I=8^SjfV1f0al4mqI|1LDL|L(8u|etkC@KAp?62%&OJy>kaHR(BY4sI>RRoe8|9F z1GDN)d;@z8%=)^CXZWk%!3})WK&N~o`P}jRw;T=|fd2;I!z&a=9?65hEWYsXnql#T z`(Es14*atCHOvHMgsLH(+f`YragjMokN2!tG}etK;3Jx!W$mnDbbh5Uro*uzmjq}DM%}5s(o2} z-6I+(g%ek1Unlo3r$>{bg6>0-g3fs;g%js5`8l)049XtB2CxyDHjuY2Q8~3)b%HXT zI6aA5MjArN0209rQWLsJJFkE;LGmaA(|v1XOAXakx><#*iEz>K%E%IylaBP*I@)YG zf16HFPN&QME9nidv6NY;IdT*XwTbk!m4pzfO7=IMpOkRqPN()cF}=jK9?H}aM|MhQ zKslk&iMW8y!)YHU&yn@g^MT~(ZK#mVFmHWzqxYIc`D&hV=8EA^#LAkAYY-t9*A>jq z_eortXRfas+R1X<1YTdagaw(i2djCsxO?mCi)8zJH5)`ms8}pU;o5Ykup&@ZS1#d% zr^|16c)c4nn4dEC5pi3G)PGBYn%|ZiSY=?1f%OIk3~VxRje)HOt~c;O10OZ;4+eG^ zxWm96179+5kAZ(Nu-Cx1473e=&%lEQ{=>k216?b1eG(0vXy6$JI_akye7b?N49qpK z$iQL)s|*Yn*koX{f$I%?)W8@+od`HwWzm?RxlO4158 z8oeWFV)!#;A3*wbf|18?XUT66_ZG6Q;gMfq;f3Yp7p^w7$3~vtbWb5akG!nrr^5OD zm#+|ov+M{Lv9joAtjJ$R)`N%9I`RKaiZ1R=$yZ-6? zMW)n0o&OL^*5w$AugfE|lkO0@TzcNudIg=1E~m(VB4s$`73sin(cyIYN4k3{rTmHv zl=njZT?kFf`MY{peZ)onO=q5?HhU;pz&Jq{xzgVraOpyPpfrr)^`7Z-~ zg8nzs{lu7`74Sd%*UAbs`rpX#Ev#Lge=)9q?ceYe?%_O)^DmY)>%a2PiSPNpy6vU% z%`NwYTGxK#-nRC2)_vh`-oO6e{{36u{?2zFc<_7Q|G^J`^y8mA^wXa`{K(IL@ykbl z^&h`}>_30=+sA+RU%&sue?Rf$hK*1C@lSt#`k9W-O`ErD-PYB;{n_VsJpaPZo?W|N zeCg#^UfuKB>wEw5*Eja{?mzJ6TYr1|9lP({$a{Z(|AT`ce)RD_J~?!_|H!9DKjSOz zu9(=k_=HiT6UU4lmy|r-oigF1lP9L0a%$S7(@sBQ@|jaSXPrGYecCzaW}J6^=JXjC zT$pvy#WQDJa_ME+voFs&>2fv*D{rZ)zV)`66}5HsUvFp(1Xr$VT7CQ1ZoKK{ zWhGzif5)0T@4EYcb^ZTW=l?%UfA75czPzgz`12QDT~K(K6B6rGp+x(yzuQCE+_QG==99)l+s+&1{2-GaeIhbX^(gUcFE{l2O5 z6J4GB5)Cf8Jo%*q5W5 zPcr^R20z*0#RhlmSV|1;?AuovTy&1|t2elF-lxgnleD+1+2D>{MVrALyM^@z7hR|P z9yB=n4eIxh!Ot}KqXu{ERvtIF$M|nB_*n+;F!6{UgZCIb-Qar+KF#302A4f} z`Pl|PSEH_j20zc>{RS5us`}lp+dtEwi3Xo;@Dzj3FnF55FEqHv;FlUa!{C=0Jj>wO z2G2J5Y=h?-T<@}R{>|W58vi1L=Ni1&;9i557<|6Ls|@Zlc)h`|GI*207Z|+R;Q0n` zGx$P-uQ&MB27l1tj$HSU!LK#`j~d*O10Of|SB(D#gNuG$ejNt?szzPi26rUw9)sU) z{P!3<#xQ_hgU1^Dpuyt|?pm+gH{Rfmy!!vJ_a@*`RNLBcbqFC7(18F+m>OgVa{~b) zkg7l!0)jLUAP7na(vU!gHUkDk42l{>BqC~5j&|mdfkd1lqPB_}6*Y)@0!}S*G$?9^ zF^qois=cbyiFnTWpL_5B-TQpEVCCKKUTe=o?W$eX)t<4`8mX!@Dro*5O^5*RXvcb35~H%AXFiy@gZU8VPUb_IOFMafV6JCAoVkJd2 zr!Ws<9>qMA`84K{%%?LqF`vQQ%zP$uEAv^*vzgCkp3D3u<~HVYnAb4BnYo?$Jm&Sx zP0St47ch4+U(8(ECCa;mxt{qg%ni&f%#F;~F^^=P#N5Pu3v)Ab9WOwv%srWF*Vi4G zXS3dic`kEb<~HX3%xjqIncJCnWnRxbkhz0-cjiv!Ajb&^HAoKm`5^~ znVXnLF*h?`$2^OzMm9Z(tt6ypj1N=F$_QeCwF& znd^9gW?=5g+{nBG^GN1C%uURFnVXsWGq*AiVV=!=67yWVcvncow*P5 zdgi{&9nAfiJDGP-l*A!3HxTv zp1Jo^qWr$hgP7~Wg?*@|XCAKUCkuVFre_|j=_7?cLDMtO()cu?&(V0a;CULKBY2s{ zO@h}l_uM3S9rF<84a~(|W4!0D-WA4s_P8HOhjt$_n(t(;;(MHQ7n%;*ccg=M9|h9g zXyW2tC_Ps|$7=O%Eq;H3?ZsVn`mG#cNBg~W(0x!k=zb?1DI9MKb1QTFWTUF5U3@y| zjx-&#k55Os`l~mDw=<`^+VopB35>#y?x@p|h?3Be$>Hd3G9Brza*6bk)Vt&KJd5C~ zIlt?Cmn-9dzfMj&FPs4! z5C`>>5zBUDv{=pyw0U zuEVIGjlkV_O;7!e%B!VM{cZ%9W>5W(xRyTkL&}e4PyLbVPb)w5%MqweE&g=WHtDtc zpnf_6x#eMw)G59gSA5iODSujg)PJdbJWU`sl-?q@_M-ZlDlO&mQ@^J4wECrIX{i0Q z^r@eZK<>2bPU`Q(wfduePw8ppqy9ev*4lL~jRPtlZ_mMcqsni=-#K6z-2Z5Nxc3_x zCnFF_D;L>~KrhnzU6xueEqtRIzJ=5Ha<`{(HUhm=E0=h>W`?WXXxvdbw0tM4<(%s( zCq0qk-Y>-SuXA1XNaK|DWwd@y); zG~V4gjr-PIj1R3`G!MAzlhyWbiJ#^NcYS)B_-MYMcG2QnrIvFhdXzY59&v9+F`u-= zDCQOFaiRx``GsN>J?wUrhiYajw@ivUep}i#S#77AUG*&Hqgm2?PG8I?QLgbK_TO6a zN9Q9-Etc)Yd@|M5E_D8(`AQpaVt#1Rr>Nz3pC8EHR9Ahw_Z#yO0)YBB#yd~1sa_<#f-7$bU;YwS1YlhDE;SxW0TbVX><`RDSZ&dWOi?QkPzYk8;f;T0Lv$ zRSHin(K@^~i_rRtv{PN}s@0!1--`5RyUHo-V_f}6*iUh_tFWKrmLH1$7S}$zu-8VL zHr{S>)04f)HIHcJ(a!TC{wZ$dr`lQM8W%!8wM}?a8~uD&{}AzOv!+;gQ*YDG+d?1h z)(zN;9?qL2kb0>3c zpFr9p%6o|QdggC3H!!c$^ju#XID4D)E_>zHf%HvO2JS-*<8wy&pSZe_i;{>x^5 z7wdDG({u53X#0TLK4BT_wQ-~E19}Q`sh0KHx~7i#1FUy)d$(uaz+GhO>Sf>m}Z|>cBjj_1Zp-H|xDwAIthe z<_XL{W}d~ol6emE518jM-^sj;`F`fL%->~R$NWX+4a~n}-pIV3c{6iuo$Os9>dVgh zAm&Gy>$!YB%tKj!n0Yw!Z{9?^G4>cF>hx633KmCQ6Jwk4`Tim^HApBG7o2dlzBAs_n2$@q&F~+ zWxa)Y5RY$dUo?UBNvzlQO$Ra0Vts-Zp4-Qlc@FF6Fc0VWM>5Z2eL8akhxcP%#`;~% zYnc}_uVcQKc>{Cpyxz$CW!5({KcL0O`O)@Wy{klh=dfPe7uEK0gIKTaLxysG{n2tSpPWlTITbaM{|67=5?&suD6Yx-w~{DV7)k7;~7WR zk7j)%>$8~Wv3?@+X4c=s+{EbzFxU2(73SW1MSDNUJc#*1=CK_A80Mj@-@x3-@egDk z&iXaX8(BYqc{J&$DJmoTqq{*-3V>GfpZ$oi+5H#5JLxp{}EkFm_XpBH>1^E%c?G7n`zmj<^>-#XzW4)Pq0>>Z5yo~kFGPg6olext9gPAw5K9PAN^Hk=|%-b>d-Y44Q zIP)Opxy(bE=Q9syzK?k{^K#~~%x5r9U~XkD?#t4fq2dtNxpBCDcjqf{ch{ZA^KOTB zoo(UWDUB!c?vBRS@@|U8*YU22#*=WD-#z{$+<|lFbg#pmr{eB|JHNe+p6-&m>*+41 zJJ;@VYw2%rD=*#c6n6txx!ng8KH_f@^jZwGA2kBG*WwrZFWPP$?c33P2YP>09O8b| zO2j~KbGF1I_G##@fH=fH%_>(tQ(i`(mbH2k`!?~o%PkIZpN!&j=PmDj2tECE*V9|U zt+{p{)b0Z(^KO&a2U^2-9kly9akx7y4srixr7ORJYrB=2J-&C+%D$yM!amWJKf%|! z+F9_FHt}0s{Zi<)-8U^gdT+%&e=Yr7*l%?8LvcTbdcS5*_h0DkQ+K`!ZPuE%)wd2$ zZ`r!ri+6X(N2J%%-h!`jwV&V#u6`qUGTw!Ck1xg5enPM9I%@G--RhIdBi=n~N#E+~ zw<0{<6?cz6vyFbeTYPk%-Qvb+--BWihuDWobk(QWH`I2WY2TUl>9k!|u@6o4t@TfF zf3>CmXk43z1gF1RdUXFa$<-f)K3RQNiY&xFNK5|2K26KG6#JGf??s9ICwD!?Pvce` z;=Z=Ft4;gFRDNyuoH&iwI9LA_`+(YRw%A{%c|of$vCq*mUIo{7-^Kp>2;8yO=54Wm zw#HRoV!vyhYkY`(rI!3_`#zcv@e!CkwE7eKW9wY=xY$?JcGGEJo%S8IU3S{Hrv15= z@hJ8OwcT{m)4r3I8gZHj>907%zLvXQjJFm&@nl#36Z?PkR~%wrSbO?FJdfbsf5bkK z_LKtYDSdZ)ioaz(5c_y7`4Rif+EWemyBO5pSGwv;aP4Ua`WBDa3DRZ^jcX%b8SVX*$aR7 z^QYL)(^9AMQh(KQOPuz5>DP+1{7@dqLY%q9K5a{Vi(jyC=d|yyJ*7g=aZu@7`j2=H zfc}a@>>F!Ozli5oMxc*q^M`m&!0I}Gi{2yty4R1pzk7MbzW#dTLL6fMy(K?lzkucw zF~hWQF@iL%g%>=*l^?wQ^&i^8nSFFFjc|w`r|#U^*V%@*L??Cn$DnR^e)N^%9w5t&k9+*~ z&$D>-`+@SxZ=&uW7j5+Q zF8=gWbbR3A!v0+sSEFm*VOJ4Uiz&KZ)(H!uE6}`;CE{tKgLiFUUJ!g z{@#A%??D%TZhljT8)mI^apxbm)`ewHc5#Y_;?&}!>hgeS-5?4(inQ0d2s??|Ju0@% zefITb6p!`u>UD(X$6w7Lw5{KDr;2mKwh)@UpV>-izx~<+gxR^bZ6kE9eeDrK+r7Sz z5;|UbX(yp+-ilp>(!vf;5Z1p_^(3LQXu(s2hKuK(CbYiuA^vAfCH@b0wkviz!uvw%a}T5?bTmQ?X|61J%Usp##+RcMjUB zV(w=@sAwD>^*re#!wOV1|03-pu3xZ1MMuKxDw>QvUm$-+S(b{%BVVX!s~+hRI%opPOlJ`0uxm<>)uh(SkkLj^>4Rc zMPtyXDn|Y|_*L@HP0m))wzok=)X#qMx2?!g(OUnViZxfpzefJ`C$_6-eDH*dkv~s7 zK>k+mM^)6H_)$gMU6WrY|LiXwRZ%+iql&h-CcQ!aHH&jqv{jr?(QXfaQ?-BMVHJ%d z94gx04z{cD&x=yg{Cbj#+5S(cC`G)fqJCbZiq5G4Z;`z%XrhYQ^($4(UAs+1{ZB8b zXq@r2;5nXelf9#IxQg{J#;E9gZj*}HDMc#Q7!IkJ`|=qT(T?v>IKv}T1=c63n0-E1 zMYFC}MThfS6^-wt^KcdGdo2{)wn3neO+_j8Jr#`)pHeZhq>DN~8B4-dG(CKq zin*~{RgCm2SJ7JZso(?7saXF|$a|EYsX zQqj8UDHUzq_p4a{w__?g11_s*Oz-&#g~vEj(R6j0isnI^RCG+JS+9jT%;FG9uoh&d|S1}sz2+HS3irej$uM(%k)MYHt@ z6>X!6RmA+DqWy`tRjiQ@tLXgpI~A>W{HCJW`>KkzNBusd{Fu6isA%0Ds-j++prUcz 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 wU| Date: Sun, 19 Jul 2026 03:13:14 -0400 Subject: [PATCH 4/6] Update to net48, add Moza native DLL support and copying Upgraded target framework to net48 and added Microsoft.CSharp reference. Added references and build logic for MOZA_API_CSharp.dll, Nefarius.ViGEm.Client.dll, and native Moza DLLs. Enhanced build to copy native DLLs to a x64 subfolder and set DLL search path at runtime for P/Invoke compatibility. Improved logging for native DLL path setup. --- Directory.Build.targets | 19 +++++++++++++++++-- NewStarGPTelemetryMod.csproj | 3 ++- NewStarTelemetryPlugin.cs | 22 +++++++++++++++++++++- 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/Directory.Build.targets b/Directory.Build.targets index 9abcb86..46fa39a 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -1,7 +1,8 @@ - Y:\SteamLibrary\steamapps\common\New Star GP\release\BepInEx\plugins\ + + C:\Program Files (x86)\Steam\steamapps\common\New Star GP\release\BepInEx\plugins\ @@ -9,18 +10,32 @@ $(GameDir)$(TargetName) + + $(MSBuildThisFileDirectory)libs\moza\x64\ + + + + + + + + + + - + + + diff --git a/NewStarGPTelemetryMod.csproj b/NewStarGPTelemetryMod.csproj index 0c60ad7..c029b80 100644 --- a/NewStarGPTelemetryMod.csproj +++ b/NewStarGPTelemetryMod.csproj @@ -1,7 +1,7 @@  - net46 + net48 NewStarGPTelemetryMod Newstar Telemetry Plugin 2.0.0 @@ -47,6 +47,7 @@ + libs\moza\x64\MOZA_API_CSharp.dll diff --git a/NewStarTelemetryPlugin.cs b/NewStarTelemetryPlugin.cs index 59c19fe..9e7a33a 100644 --- a/NewStarTelemetryPlugin.cs +++ b/NewStarTelemetryPlugin.cs @@ -2,8 +2,10 @@ using BepInEx.Configuration; using BepInEx.Logging; using com.drowhunter.TelemetryLib; +using System.IO; using System.Linq; using System.Net; +using System.Runtime.InteropServices; using TelemetryLib; @@ -48,6 +50,9 @@ CarControl _carControl static bool paused = false; + [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + private static extern bool SetDllDirectory(string lpPathName); + //[HarmonyPatch(typeof(PauseMenu), nameof(PauseMenu.Update))] //class Patch @@ -56,7 +61,7 @@ CarControl _carControl // { // paused = __instance.paused; - + // } //} @@ -72,6 +77,21 @@ private void Awake() // Plugin startup logic Logger = base.Logger; + // Point the Windows loader at the x64 subfolder so it can find the + // Moza native DLLs (MOZA_SDK.dll, MOZA_API_C.dll) when + // MOZA_API_CSharp.dll fires its first P/Invoke. + // Managed DLLs are handled by BepInEx's AssemblyResolve hook instead. + var nativeDir = Path.Combine(Path.GetDirectoryName(Info.Location), "x64"); + if (Directory.Exists(nativeDir)) + { + SetDllDirectory(nativeDir); + Logger.LogInfo($"[MozaNative] DLL search path set to: {nativeDir}"); + } + else + { + Logger.LogWarning($"[MozaNative] x64 native dir not found at: {nativeDir}"); + } + //Port = Config.Bind("Telemetry", "UDP Port", 12345, "Port to Send Telemetry"); From d707c364602866a51fecb7c8fcaa2428f9a32bce Mon Sep 17 00:00:00 2001 From: Trevor Jones Date: Sun, 19 Jul 2026 04:40:36 -0400 Subject: [PATCH 5/6] updates --- NewStarTelemetryPlugin.cs | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/NewStarTelemetryPlugin.cs b/NewStarTelemetryPlugin.cs index 9e7a33a..e430b79 100644 --- a/NewStarTelemetryPlugin.cs +++ b/NewStarTelemetryPlugin.cs @@ -26,7 +26,7 @@ public class NewStarTelemetryPlugin : BaseUnityPlugin internal NewStarTelemetryData data; - MmfTelemetry _dataOut; + UdpTelemetry _dataOut; RacingContextManager _racingContextManager; @@ -77,7 +77,9 @@ private void Awake() // Plugin startup logic Logger = base.Logger; - // Point the Windows loader at the x64 subfolder so it can find the + + + // Point the Windows loader // Moza native DLLs (MOZA_SDK.dll, MOZA_API_C.dll) when // MOZA_API_CSharp.dll fires its first P/Invoke. // Managed DLLs are handled by BepInEx's AssemblyResolve hook instead. @@ -93,15 +95,11 @@ private void Awake() } - //Port = Config.Bind("Telemetry", "UDP Port", 12345, "Port to Send Telemetry"); + Port = Config.Bind("Telemetry", "UDP Port", 12345, "Port to send telemetry data on."); - _dataOut = new MmfTelemetry(new MmfTelemetryConfig + _dataOut = new UdpTelemetry(new UdpTelemetryConfig { - Name = "DrowTelemetryData", - IsGlobal = true, - Create = true, - - // SendAddress = new IPEndPoint(IPAddress.Loopback, Port.Value) + SendAddress = new IPEndPoint(IPAddress.Loopback, Port.Value) }, new MarshalByteConverter()); From 331d05b425969f2cc2630d0ffa93458f2fa91cee Mon Sep 17 00:00:00 2001 From: Trevor Date: Sun, 19 Jul 2026 20:53:52 -0400 Subject: [PATCH 6/6] added moza sdk --- Config/WheelConfig.cs | 4 +- Directory.Build.targets | 4 +- Moza/MozaSdkAdapter.cs | 43 ++++++++++++ NativeDllLoader.cs | 107 +++++++++++++++++++++++++++++ NewStarGPTelemetryMod.csproj | 33 +++++++-- NewStarTelemetryPlugin.cs | 54 +++++++++++---- Runtime/WheelIntegrationRuntime.cs | 10 +++ 7 files changed, 231 insertions(+), 24 deletions(-) create mode 100644 NativeDllLoader.cs diff --git a/Config/WheelConfig.cs b/Config/WheelConfig.cs index 0e4bc7a..cfc497c 100644 --- a/Config/WheelConfig.cs +++ b/Config/WheelConfig.cs @@ -33,8 +33,8 @@ public WheelConfig(ConfigFile config) { // Wheel / General Enabled = config.Bind( - "Wheel/General", "Enabled", true, - "Enable wheel integration (Moza FFB + ViGEm virtual gamepad)."); + "Wheel/General", "Enabled", false, + "Enable wheel integration (Moza FFB + ViGEm virtual gamepad). REQUIRES MOZA Pithouse software running!"); Backend = config.Bind( "Wheel/General", "Backend", "Moza", diff --git a/Directory.Build.targets b/Directory.Build.targets index 46fa39a..0561a76 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -1,8 +1,8 @@ - + $(APPDATA)\raicuparta\rai-pal\data\installed-mods\8148729079362356270\bepinex\BepInEx\plugins\ - C:\Program Files (x86)\Steam\steamapps\common\New Star GP\release\BepInEx\plugins\ + diff --git a/Moza/MozaSdkAdapter.cs b/Moza/MozaSdkAdapter.cs index c9dc97a..df2a5ae 100644 --- a/Moza/MozaSdkAdapter.cs +++ b/Moza/MozaSdkAdapter.cs @@ -54,6 +54,49 @@ public bool Install() } } + ///

+ /// Check if any MOZA devices are connected and responding. + /// Must be called AFTER Install() succeeds. + /// + public bool IsDeviceConnected() + { + if (!_initialised) + { + _log.LogWarning("[MozaSdkAdapter] IsDeviceConnected called before Install()"); + return false; + } + + try + { + // Try to read HID data to verify device presence + ERRORCODE err = ERRORCODE.NORMAL; + var data = mozaAPI.mozaAPI.getHIDData(ref err); + + if (err == ERRORCODE.NORMAL) + { + _log.LogInfo("[MozaSdkAdapter] Device detected and responding."); + return true; + } + + // COLLECTIONCYCLEDATALOSS typically means no device connected + if (err == ERRORCODE.COLLECTIONCYCLEDATALOSS) + { + _log.LogInfo("[MozaSdkAdapter] No MOZA device connected (COLLECTIONCYCLEDATALOSS)."); + } + else + { + _log.LogWarning($"[MozaSdkAdapter] Device check failed. Error: {err}"); + } + + return false; + } + catch (Exception ex) + { + _log.LogWarning($"[MozaSdkAdapter] Device detection failed: {ex.Message}"); + return false; + } + } + /// /// Poll the global HID data from all connected MOZA devices. /// Returns null if the SDK is not initialised or an error occurs. diff --git a/NativeDllLoader.cs b/NativeDllLoader.cs new file mode 100644 index 0000000..b1fed59 --- /dev/null +++ b/NativeDllLoader.cs @@ -0,0 +1,107 @@ +using System; +using System.IO; +using System.Reflection; +using System.Runtime.InteropServices; + +namespace com.drowhunter.NewStarGPTelemetryMod +{ + /// + /// Module initializer that loads native DLLs BEFORE any other code in this assembly runs. + /// This uses a static constructor with no dependencies to ensure earliest possible execution. + /// + internal static class NativeDllLoader + { + [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + private static extern bool SetDllDirectory(string lpPathName); + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + private static extern IntPtr LoadLibrary(string lpFileName); + + private static bool _loaded = false; + public static bool IsLoaded => _loaded; + public static string LoadError { get; private set; } + + // Static constructor - runs when this class is FIRST referenced + // Place a call to EnsureLoaded() at the very top of NewStarTelemetryPlugin.Awake() + static NativeDllLoader() + { + LoadNativeDlls(); + } + + /// + /// Explicitly loads the native DLLs. Call this before ANY code that uses mozaAPI. + /// + public static void EnsureLoaded() + { + // Static constructor already ran when this method was called + // This method just provides an explicit entry point + } + + private static void LoadNativeDlls() + { + try + { + // Detect whether the game process is 32-bit or 64-bit + var is64Bit = Environment.Is64BitProcess; + var archFolder = is64Bit ? "x64" : "x86"; + var archDesc = is64Bit ? "64-bit (x64)" : "32-bit (x86)"; + + var assemblyLocation = Assembly.GetExecutingAssembly().Location; + var pluginDir = Path.GetDirectoryName(assemblyLocation); + var nativeDir = Path.Combine(pluginDir, archFolder); + + if (!Directory.Exists(nativeDir)) + { + LoadError = $"Process is {archDesc} but {archFolder} directory not found at: {nativeDir}"; + return; + } + + // Set the DLL search path + if (!SetDllDirectory(nativeDir)) + { + var error = Marshal.GetLastWin32Error(); + LoadError = $"Process is {archDesc}. SetDllDirectory({archFolder}) failed with error code: {error}"; + return; + } + + // Explicitly preload native DLLs in dependency order + var mozaSdkPath = Path.Combine(nativeDir, "MOZA_SDK.dll"); + if (!File.Exists(mozaSdkPath)) + { + LoadError = $"Process is {archDesc}. MOZA_SDK.dll not found at: {mozaSdkPath}"; + return; + } + + var handleSdk = LoadLibrary(mozaSdkPath); + if (handleSdk == IntPtr.Zero) + { + var error = Marshal.GetLastWin32Error(); + LoadError = $"Process is {archDesc}. LoadLibrary({archFolder}/MOZA_SDK.dll) failed with error code: {error}"; + return; + } + + var mozaApiCPath = Path.Combine(nativeDir, "MOZA_API_C.dll"); + if (!File.Exists(mozaApiCPath)) + { + LoadError = $"Process is {archDesc}. MOZA_API_C.dll not found at: {mozaApiCPath}"; + return; + } + + var handleApiC = LoadLibrary(mozaApiCPath); + if (handleApiC == IntPtr.Zero) + { + var error = Marshal.GetLastWin32Error(); + LoadError = $"Process is {archDesc}. LoadLibrary({archFolder}/MOZA_API_C.dll) failed with error code: {error}"; + return; + } + + _loaded = true; + LoadError = $"SUCCESS: Process is {archDesc}. Loaded native DLLs from {archFolder} folder."; + } + catch (Exception ex) + { + LoadError = $"Exception during native DLL loading: {ex.Message}"; + } + } + } +} diff --git a/NewStarGPTelemetryMod.csproj b/NewStarGPTelemetryMod.csproj index c029b80..0dcfa05 100644 --- a/NewStarGPTelemetryMod.csproj +++ b/NewStarGPTelemetryMod.csproj @@ -57,10 +57,33 @@ libs\vigem\Nefarius.ViGEm.Client.dll - - - - - + + + + + + + PreserveNewest + x64\MOZA_SDK.dll + + + PreserveNewest + x64\MOZA_API_C.dll + + + + + PreserveNewest + x86\MOZA_SDK.dll + + + PreserveNewest + x86\MOZA_API_C.dll + + + + + + diff --git a/NewStarTelemetryPlugin.cs b/NewStarTelemetryPlugin.cs index e430b79..4fa67c8 100644 --- a/NewStarTelemetryPlugin.cs +++ b/NewStarTelemetryPlugin.cs @@ -2,9 +2,11 @@ using BepInEx.Configuration; using BepInEx.Logging; using com.drowhunter.TelemetryLib; +using System; using System.IO; using System.Linq; using System.Net; +using System.Reflection; using System.Runtime.InteropServices; using TelemetryLib; @@ -50,9 +52,6 @@ CarControl _carControl static bool paused = false; - [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] - private static extern bool SetDllDirectory(string lpPathName); - //[HarmonyPatch(typeof(PauseMenu), nameof(PauseMenu.Update))] //class Patch @@ -69,6 +68,10 @@ CarControl _carControl private void Awake() { + // CRITICAL: Load native DLLs BEFORE any other code runs + // This must be the FIRST line to ensure DLLs are loaded before any reference to mozaAPI + NativeDllLoader.EnsureLoaded(); + //Harmony.CreateAndPatchAll(typeof(NewStarTelemetryPlugin)); //var harmony = new Harmony("com.drowhunter.NewStarTelemetryPlugin"); //harmony.PatchAll(); @@ -77,23 +80,27 @@ private void Awake() // Plugin startup logic Logger = base.Logger; + // Report process architecture and native DLL loading status + var processArch = Environment.Is64BitProcess ? "64-bit (x64)" : "32-bit (x86)"; + Logger.LogInfo($"[MozaNative] *** PROCESS ARCHITECTURE: {processArch} ***"); - - // Point the Windows loader - // Moza native DLLs (MOZA_SDK.dll, MOZA_API_C.dll) when - // MOZA_API_CSharp.dll fires its first P/Invoke. - // Managed DLLs are handled by BepInEx's AssemblyResolve hook instead. - var nativeDir = Path.Combine(Path.GetDirectoryName(Info.Location), "x64"); - if (Directory.Exists(nativeDir)) + // NativeDllLoader.LoadError contains the detailed status message + if (NativeDllLoader.IsLoaded) { - SetDllDirectory(nativeDir); - Logger.LogInfo($"[MozaNative] DLL search path set to: {nativeDir}"); + Logger.LogInfo($"[MozaNative] {NativeDllLoader.LoadError}"); } else { - Logger.LogWarning($"[MozaNative] x64 native dir not found at: {nativeDir}"); + Logger.LogError($"[MozaNative] FAILED: {NativeDllLoader.LoadError}"); } + // Verify both architecture folders exist (for debugging) + var pluginDir = Path.GetDirectoryName(Info.Location); + var x86Dir = Path.Combine(pluginDir, "x86"); + var x64Dir = Path.Combine(pluginDir, "x64"); + Logger.LogInfo($"[MozaNative] x86 folder exists: {Directory.Exists(x86Dir)}"); + Logger.LogInfo($"[MozaNative] x64 folder exists: {Directory.Exists(x64Dir)}"); + Port = Config.Bind("Telemetry", "UDP Port", 12345, "Port to send telemetry data on."); @@ -107,11 +114,28 @@ private void Awake() Logger.LogInfo($"Plugin {MyPluginInfo.PLUGIN_GUID} is loaded!"); _wheelConfig = new WheelConfig(Config); + Logger.LogInfo($"[Startup] WheelConfig created. Enabled={_wheelConfig.Enabled.Value}"); + if (_wheelConfig.Enabled.Value) { - _wheelRuntime = new WheelIntegrationRuntime(Logger); - _wheelRuntime.Initialize(_wheelConfig); + try + { + Logger.LogInfo("[Startup] Creating WheelIntegrationRuntime..."); + _wheelRuntime = new WheelIntegrationRuntime(Logger); + + Logger.LogInfo("[Startup] Calling Initialize..."); + _wheelRuntime.Initialize(_wheelConfig); + + Logger.LogInfo("[Startup] Initialize completed successfully."); + } + catch (Exception ex) + { + Logger.LogError($"[Startup] FATAL: Wheel integration crashed during init: {ex}"); + _wheelRuntime = null; + } } + + Logger.LogInfo("[Startup] Awake() completed."); } diff --git a/Runtime/WheelIntegrationRuntime.cs b/Runtime/WheelIntegrationRuntime.cs index 7ce423e..264618c 100644 --- a/Runtime/WheelIntegrationRuntime.cs +++ b/Runtime/WheelIntegrationRuntime.cs @@ -44,6 +44,7 @@ public WheelIntegrationRuntime(ManualLogSource log) /// public void Initialize(WheelConfig cfg) { + _log.LogInfo("[WheelIntegrationRuntime] *** Initialize() called ***"); _cfg = cfg; // ── x64 guard ──────────────────────────────────────────────────── @@ -67,6 +68,15 @@ public void Initialize(WheelConfig cfg) return; } + // -- Device presence check --------------------------------------------- + if (!_mozaSdk.IsDeviceConnected()) + { + _log.LogWarning("[WheelIntegrationRuntime] No MOZA device detected. " + + "Wheel integration disabled. Connect your wheel and restart the game."); + _disabled = true; + return; + } + // ── Input provider ──────────────────────────────────────────── _inputProvider = new MozaWheelInputProvider(_mozaSdk, cfg, _log); if (!_inputProvider.Initialize())