From a7c6f01d17bd33456df9249fa13862a962db0add Mon Sep 17 00:00:00 2001
From: Tian jianyong <11429339@qq.com>
Date: Sat, 19 Oct 2024 13:53:21 +0800
Subject: [PATCH] =?UTF-8?q?=E5=B0=86=E7=9B=AE=E6=A0=87=E5=B9=B3=E5=8F=B0?=
=?UTF-8?q?=E6=94=B9=E6=88=90net6.0,=20=E8=AF=AD=E8=A8=80=E6=94=B9?=
=?UTF-8?q?=E4=B8=BAC#=209.0,=20=E6=8F=90=E9=AB=98=E5=9C=A8Unity=E4=B8=AD?=
=?UTF-8?q?=E7=9A=84=E5=85=BC=E5=AE=B9=E6=80=A7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.cursorrules | 65 ++++++++++++
ActiveProtect.csproj | 5 +-
Models/Common.cs | 46 ++++++---
Models/ILaserIlluminatable.cs | 30 ------
Models/LaserBeamRiderMissile.cs | 17 +++-
Models/LaserSemiActiveGuidedMissile.cs | 14 ++-
Models/LaserWarner.cs | 4 +-
Models/MissileBase.cs | 3 +-
Models/MissileStageStrategy.cs | 48 +++++++--
Models/Tank.cs | 26 +++--
Program.cs | 93 +++++-------------
SimulationEnvironment/SimulationConfig.cs | 60 ++++++++---
SimulationEnvironment/SimulationElement.cs | 31 ++++--
SimulationEnvironment/SimulationEvents.cs | 33 +++++--
SimulationEnvironment/SimulationManager.cs | 6 +-
bin/Debug/net6.0/ActiveProtect | Bin 0 -> 147952 bytes
bin/Debug/net6.0/ActiveProtect.deps.json | 23 +++++
bin/Debug/net6.0/ActiveProtect.dll | Bin 0 -> 72192 bytes
bin/Debug/net6.0/ActiveProtect.pdb | Bin 0 -> 37308 bytes
.../net6.0/ActiveProtect.runtimeconfig.json | 9 ++
.../netstandard2.1/ActiveProtect.deps.json | 24 +++++
bin/Debug/netstandard2.1/ActiveProtect.dll | Bin 0 -> 70144 bytes
bin/Debug/netstandard2.1/ActiveProtect.pdb | Bin 0 -> 35168 bytes
obj/ActiveProtect.csproj.nuget.dgspec.json | 26 +++--
...CoreApp,Version=v6.0.AssemblyAttributes.cs | 4 +
.../net6.0/ActiveProtect.AssemblyInfo.cs | 22 +++++
.../ActiveProtect.AssemblyInfoInputs.cache | 1 +
....GeneratedMSBuildEditorConfig.editorconfig | 13 +++
obj/Debug/net6.0/ActiveProtect.assets.cache | Bin 0 -> 157 bytes
...tiveProtect.csproj.CoreCompileInputs.cache | 1 +
.../ActiveProtect.csproj.FileListAbsolute.txt | 14 +++
obj/Debug/net6.0/ActiveProtect.dll | Bin 0 -> 72192 bytes
.../ActiveProtect.genruntimeconfig.cache | 1 +
obj/Debug/net6.0/ActiveProtect.pdb | Bin 0 -> 37308 bytes
obj/Debug/net6.0/apphost | Bin 0 -> 147952 bytes
obj/Debug/net6.0/ref/ActiveProtect.dll | Bin 0 -> 31232 bytes
obj/Debug/net6.0/refint/ActiveProtect.dll | Bin 0 -> 31232 bytes
.../net8.0/ActiveProtect.AssemblyInfo.cs | 2 +-
.../ActiveProtect.AssemblyInfoInputs.cache | 2 +-
...tandard,Version=v2.1.AssemblyAttributes.cs | 4 +
.../ActiveProtect.AssemblyInfo.cs | 22 +++++
.../ActiveProtect.AssemblyInfoInputs.cache | 1 +
....GeneratedMSBuildEditorConfig.editorconfig | 5 +
.../ActiveProtect.GlobalUsings.g.cs | 8 ++
.../netstandard2.1/ActiveProtect.assets.cache | Bin 0 -> 157 bytes
...tiveProtect.csproj.CoreCompileInputs.cache | 1 +
.../ActiveProtect.csproj.FileListAbsolute.txt | 9 ++
obj/Debug/netstandard2.1/ActiveProtect.dll | Bin 0 -> 70144 bytes
obj/Debug/netstandard2.1/ActiveProtect.pdb | Bin 0 -> 35168 bytes
obj/project.assets.json | 30 ++++--
obj/project.nuget.cache | 8 +-
51 files changed, 516 insertions(+), 195 deletions(-)
create mode 100644 .cursorrules
delete mode 100644 Models/ILaserIlluminatable.cs
create mode 100755 bin/Debug/net6.0/ActiveProtect
create mode 100644 bin/Debug/net6.0/ActiveProtect.deps.json
create mode 100644 bin/Debug/net6.0/ActiveProtect.dll
create mode 100644 bin/Debug/net6.0/ActiveProtect.pdb
create mode 100644 bin/Debug/net6.0/ActiveProtect.runtimeconfig.json
create mode 100644 bin/Debug/netstandard2.1/ActiveProtect.deps.json
create mode 100644 bin/Debug/netstandard2.1/ActiveProtect.dll
create mode 100644 bin/Debug/netstandard2.1/ActiveProtect.pdb
create mode 100644 obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs
create mode 100644 obj/Debug/net6.0/ActiveProtect.AssemblyInfo.cs
create mode 100644 obj/Debug/net6.0/ActiveProtect.AssemblyInfoInputs.cache
create mode 100644 obj/Debug/net6.0/ActiveProtect.GeneratedMSBuildEditorConfig.editorconfig
create mode 100644 obj/Debug/net6.0/ActiveProtect.assets.cache
create mode 100644 obj/Debug/net6.0/ActiveProtect.csproj.CoreCompileInputs.cache
create mode 100644 obj/Debug/net6.0/ActiveProtect.csproj.FileListAbsolute.txt
create mode 100644 obj/Debug/net6.0/ActiveProtect.dll
create mode 100644 obj/Debug/net6.0/ActiveProtect.genruntimeconfig.cache
create mode 100644 obj/Debug/net6.0/ActiveProtect.pdb
create mode 100755 obj/Debug/net6.0/apphost
create mode 100644 obj/Debug/net6.0/ref/ActiveProtect.dll
create mode 100644 obj/Debug/net6.0/refint/ActiveProtect.dll
create mode 100644 obj/Debug/netstandard2.1/.NETStandard,Version=v2.1.AssemblyAttributes.cs
create mode 100644 obj/Debug/netstandard2.1/ActiveProtect.AssemblyInfo.cs
create mode 100644 obj/Debug/netstandard2.1/ActiveProtect.AssemblyInfoInputs.cache
create mode 100644 obj/Debug/netstandard2.1/ActiveProtect.GeneratedMSBuildEditorConfig.editorconfig
create mode 100644 obj/Debug/netstandard2.1/ActiveProtect.GlobalUsings.g.cs
create mode 100644 obj/Debug/netstandard2.1/ActiveProtect.assets.cache
create mode 100644 obj/Debug/netstandard2.1/ActiveProtect.csproj.CoreCompileInputs.cache
create mode 100644 obj/Debug/netstandard2.1/ActiveProtect.csproj.FileListAbsolute.txt
create mode 100644 obj/Debug/netstandard2.1/ActiveProtect.dll
create mode 100644 obj/Debug/netstandard2.1/ActiveProtect.pdb
diff --git a/.cursorrules b/.cursorrules
new file mode 100644
index 0000000..ec908e3
--- /dev/null
+++ b/.cursorrules
@@ -0,0 +1,65 @@
+
+# Cursor Rules
+
+You are an expert in C#, Unity, and scalable game development.
+
+ Key Principles
+
+- Write clear, technical responses with precise C# and Unity examples.
+- Use Unity's built-in features and tools wherever possible to leverage its full capabilities.
+- Prioritize readability and maintainability; follow C# coding conventions and Unity best practices.
+- Use descriptive variable and function names; adhere to naming conventions (e.g., PascalCase for public members, camelCase for private members).
+- Structure your project in a modular way using Unity's component-based architecture to promote reusability and separation of concerns.
+
+ C#/Unity
+
+- Use MonoBehaviour for script components attached to GameObjects; prefer ScriptableObjects for data containers and shared resources.
+- Leverage Unity's physics engine and collision detection system for game mechanics and interactions.
+- Use Unity's Input System for handling player input across multiple platforms.
+- Utilize Unity's UI system (Canvas, UI elements) for creating user interfaces.
+- Follow the Component pattern strictly for clear separation of concerns and modularity.
+- Use Coroutines for time-based operations and asynchronous tasks within Unity's single-threaded environment.
+- Use System.Console for logging and debugging in the console.
+- Using C# 9.0 features.
+
+ Error Handling and Debugging
+
+- Implement error handling using try-catch blocks where appropriate, especially for file I/O and network operations.
+- Use Unity's Debug class for logging and debugging (e.g., Debug.Log, Debug.LogWarning, Debug.LogError).
+- Utilize Unity's profiler and frame debugger to identify and resolve performance issues.
+- Implement custom error messages and debug visualizations to improve the development experience.
+- Use Unity's assertion system (Debug.Assert) to catch logical errors during development.
+
+ Dependencies
+
+- Unity Engine
+- .NET Framework (version compatible with your Unity version)
+- Unity Asset Store packages (as needed for specific functionality)
+- Third-party plugins (carefully vetted for compatibility and performance)
+
+ Unity-Specific Guidelines
+
+- Use Prefabs for reusable game objects and UI elements.
+- Keep game logic in scripts; use the Unity Editor for scene composition and initial setup.
+- Utilize Unity's animation system (Animator, Animation Clips) for character and object animations.
+- Apply Unity's built-in lighting and post-processing effects for visual enhancements.
+- Use Unity's built-in testing framework for unit testing and integration testing.
+- Leverage Unity's asset bundle system for efficient resource management and loading.
+- Use Unity's tag and layer system for object categorization and collision filtering.
+
+ Performance Optimization
+
+- Use object pooling for frequently instantiated and destroyed objects.
+- Optimize draw calls by batching materials and using atlases for sprites and UI elements.
+- Implement level of detail (LOD) systems for complex 3D models to improve rendering performance.
+- Use Unity's Job System and Burst Compiler for CPU-intensive operations.
+- Optimize physics performance by using simplified collision meshes and adjusting fixed timestep.
+
+ Key Conventions
+
+ 1. Follow Unity's component-based architecture for modular and reusable game elements.
+ 2. Prioritize performance optimization and memory management in every stage of development.
+ 3. Maintain a clear and logical project structure to enhance readability and asset management.
+
+ Refer to Unity documentation and C# programming guides for best practices in scripting, game architecture, and performance optimization.
+
\ No newline at end of file
diff --git a/ActiveProtect.csproj b/ActiveProtect.csproj
index 206b89a..d579445 100644
--- a/ActiveProtect.csproj
+++ b/ActiveProtect.csproj
@@ -2,8 +2,9 @@
Exe
- net8.0
- enable
+ net6.0
+ 9.0
+ disable
enable
diff --git a/Models/Common.cs b/Models/Common.cs
index 28e4a52..01b946a 100644
--- a/Models/Common.cs
+++ b/Models/Common.cs
@@ -5,28 +5,38 @@ namespace ActiveProtect.Models
///
/// 表示三维空间中的向量
///
- public class Vector3D(double x, double y, double z)
+ public class Vector3D
{
// 添加静态单位向量属性
- public static Vector3D UnitX => new(1, 0, 0);
- public static Vector3D UnitY => new(0, 1, 0);
- public static Vector3D UnitZ => new(0, 0, 1);
- public static Vector3D Zero => new(0, 0, 0);
+ public static Vector3D UnitX => new Vector3D(1, 0, 0);
+ public static Vector3D UnitY => new Vector3D(0, 1, 0);
+ public static Vector3D UnitZ => new Vector3D(0, 0, 1);
+ public static Vector3D Zero => new Vector3D(0, 0, 0);
///
/// X 坐标
///
- public double X { get; set; } = x;
+ public double X { get; set; }
///
/// Y 坐标
///
- public double Y { get; set; } = y;
+ public double Y { get; set; }
///
/// Z 坐标
///
- public double Z { get; set; } = z;
+ public double Z { get; set; }
+
+ ///
+ /// 构造函数
+ ///
+ public Vector3D(double x, double y, double z)
+ {
+ X = x;
+ Y = y;
+ Z = z;
+ }
///
/// 计算两个向量之间的距离
@@ -161,22 +171,32 @@ namespace ActiveProtect.Models
///
/// 表示三维空间中的方向
///
- public struct Orientation(double yaw, double pitch, double roll)
+ public struct Orientation
{
///
/// 偏航角(绕Y轴旋转)
///
- public double Yaw { get; set; } = yaw;
+ public double Yaw { get; set; }
///
/// 俯仰角(绕X轴旋转)
///
- public double Pitch { get; set; } = pitch;
+ public double Pitch { get; set; }
///
/// 滚转角(绕Z轴旋转)
///
- public double Roll { get; set; } = roll;
+ public double Roll { get; set; }
+
+ ///
+ /// 构造函数
+ ///
+ public Orientation(double yaw, double pitch, double roll)
+ {
+ Yaw = yaw;
+ Pitch = pitch;
+ Roll = roll;
+ }
///
/// 将方向转换为字符串表示
@@ -272,6 +292,6 @@ namespace ActiveProtect.Models
Y = y;
}
- public static Vector2D Zero => new(0, 0);
+ public static Vector2D Zero => new Vector2D(0, 0);
}
}
diff --git a/Models/ILaserIlluminatable.cs b/Models/ILaserIlluminatable.cs
deleted file mode 100644
index f5994ef..0000000
--- a/Models/ILaserIlluminatable.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-using ActiveProtect.SimulationEnvironment;
-
-namespace ActiveProtect.Models
-{
- ///
- /// 定义可被激光照射的实体接口
- ///
- public interface ILaserIlluminatable
- {
- ///
- /// 获取实体是否正在被激光照射
- ///
- bool IsIlluminated { get; }
-
- ///
- /// 开始激光照射
- ///
- void Illuminate();
-
- ///
- /// 停止激光照射
- ///
- void StopIllumination();
-
- ///
- /// 获取实体的位置
- ///
- Vector3D Position { get; }
- }
-}
diff --git a/Models/LaserBeamRiderMissile.cs b/Models/LaserBeamRiderMissile.cs
index f5dff36..f2b4027 100644
--- a/Models/LaserBeamRiderMissile.cs
+++ b/Models/LaserBeamRiderMissile.cs
@@ -1,6 +1,4 @@
using ActiveProtect.SimulationEnvironment;
-using System;
-using System.Formats.Tar;
namespace ActiveProtect.Models
{
@@ -23,17 +21,26 @@ namespace ActiveProtect.Models
private void OnLaserBeamStart(LaserBeamStartEvent evt)
{
- LaserBeamRiderGuidanceSystem.ActivateLaserBeam(evt.LaserBeamRider.Position, evt.LaserBeamRider.LaserDirection, evt.LaserBeamRider.LaserPower);
+ if (evt?.LaserBeamRider != null)
+ {
+ LaserBeamRiderGuidanceSystem?.ActivateLaserBeam(evt.LaserBeamRider.Position, evt.LaserBeamRider.LaserDirection, evt.LaserBeamRider.LaserPower);
+ }
}
private void OnLaserBeamUpdate(LaserBeamUpdateEvent evt)
{
- LaserBeamRiderGuidanceSystem.UpdateLaserBeamRider(evt.LaserBeamRider.Position, evt.LaserBeamRider.LaserDirection, evt.LaserBeamRider.LaserPower);
+ if (evt?.LaserBeamRider != null)
+ {
+ LaserBeamRiderGuidanceSystem?.UpdateLaserBeamRider(evt.LaserBeamRider.Position, evt.LaserBeamRider.LaserDirection, evt.LaserBeamRider.LaserPower);
+ }
}
private void OnLaserBeamStop(LaserBeamStopEvent evt)
{
- LaserBeamRiderGuidanceSystem.DeactivateLaserBeam(evt.LaserBeamRider.Position, evt.LaserBeamRider.LaserDirection);
+ if (evt?.LaserBeamRider != null)
+ {
+ LaserBeamRiderGuidanceSystem?.DeactivateLaserBeam(evt.LaserBeamRider.Position, evt.LaserBeamRider.LaserDirection);
+ }
}
public override void Update(double deltaTime)
diff --git a/Models/LaserSemiActiveGuidedMissile.cs b/Models/LaserSemiActiveGuidedMissile.cs
index 14de309..50036e2 100644
--- a/Models/LaserSemiActiveGuidedMissile.cs
+++ b/Models/LaserSemiActiveGuidedMissile.cs
@@ -38,8 +38,11 @@ namespace ActiveProtect.Models
/// 激光照射事件
private void OnLaserIlluminationStart(LaserIlluminationStartEvent evt)
{
- LaserGuidanceSystem.ActivateLaserDesignator(evt.LaserDesignator.Position, evt.Target.Position, evt.Target.Velocity,
- evt.LaserDesignator.LaserPower, evt.LaserDesignator.LaserDivergenceAngle);
+ if (evt?.LaserDesignator != null && evt?.Target != null)
+ {
+ LaserGuidanceSystem.ActivateLaserDesignator(evt.LaserDesignator.Position, evt.Target.Position, evt.Target.Velocity,
+ evt.LaserDesignator.LaserPower, evt.LaserDesignator.LaserDivergenceAngle);
+ }
}
///
@@ -48,8 +51,11 @@ namespace ActiveProtect.Models
/// 激光照射更新事件
private void OnLaserIlluminationUpdate(LaserIlluminationUpdateEvent evt)
{
- LaserGuidanceSystem.UpdateLaserDesignator(evt.LaserDesignator.Position, evt.Target.Position, evt.Target.Velocity,
- evt.LaserDesignator.LaserPower, evt.LaserDesignator.LaserDivergenceAngle);
+ if (evt?.LaserDesignator != null && evt?.Target != null)
+ {
+ LaserGuidanceSystem.UpdateLaserDesignator(evt.LaserDesignator.Position, evt.Target.Position, evt.Target.Velocity,
+ evt.LaserDesignator.LaserPower, evt.LaserDesignator.LaserDivergenceAngle);
+ }
}
///
diff --git a/Models/LaserWarner.cs b/Models/LaserWarner.cs
index 3399136..04b1082 100644
--- a/Models/LaserWarner.cs
+++ b/Models/LaserWarner.cs
@@ -78,7 +78,7 @@ namespace ActiveProtect.Models
/// 激光照射事件
private void OnLaserIlluminationStart(LaserIlluminationStartEvent evt)
{
- if (evt.Target.Id == MonitoredEntityId)
+ if (evt?.Target != null && evt.Target.Id == MonitoredEntityId)
{
TriggerAlarm();
}
@@ -90,7 +90,7 @@ namespace ActiveProtect.Models
/// 激光照射停止事件
private void OnLaserIlluminationStop(LaserIlluminationStopEvent evt)
{
- if (evt.Target.Id == MonitoredEntityId)
+ if (evt?.Target != null && evt.Target.Id == MonitoredEntityId)
{
StopAlarm();
}
diff --git a/Models/MissileBase.cs b/Models/MissileBase.cs
index 606e4d9..5ba575e 100644
--- a/Models/MissileBase.cs
+++ b/Models/MissileBase.cs
@@ -1,4 +1,5 @@
using System;
+using System.Collections.Generic;
using ActiveProtect.SimulationEnvironment;
using Model;
@@ -360,7 +361,7 @@ namespace ActiveProtect.Models
///
private void TryChangeToNextAvailableStage(FlightStage startStage)
{
- FlightStage[] stageOrder = [FlightStage.Launch, FlightStage.Acceleration, FlightStage.Cruise, FlightStage.TerminalGuidance, FlightStage.Attack];
+ FlightStage[] stageOrder = new FlightStage[] {FlightStage.Launch, FlightStage.Acceleration, FlightStage.Cruise, FlightStage.TerminalGuidance, FlightStage.Attack};
int startIndex = Array.IndexOf(stageOrder, startStage);
for (int i = startIndex + 1; i < stageOrder.Length; i++)
diff --git a/Models/MissileStageStrategy.cs b/Models/MissileStageStrategy.cs
index ff37567..5b2a05d 100644
--- a/Models/MissileStageStrategy.cs
+++ b/Models/MissileStageStrategy.cs
@@ -1,4 +1,6 @@
+using System;
+
namespace ActiveProtect.Models
{
///
@@ -45,12 +47,18 @@ namespace ActiveProtect.Models
}
}
+ ///
///
/// 加速阶段策略
///
- public class AccelerationStageStrategy(MissileBase missile) : IMissileStageStrategy
+ public class AccelerationStageStrategy : IMissileStageStrategy
{
- private readonly MissileBase missile = missile;
+ private readonly MissileBase missile;
+
+ public AccelerationStageStrategy(MissileBase missile)
+ {
+ this.missile = missile;
+ }
public void Update(double deltaTime)
{
@@ -64,9 +72,14 @@ namespace ActiveProtect.Models
///
/// 巡航阶段策略
///
- public class CruiseStageStrategy(MissileBase missile) : IMissileStageStrategy
+ public class CruiseStageStrategy : IMissileStageStrategy
{
- private readonly MissileBase missile = missile;
+ private readonly MissileBase missile;
+
+ public CruiseStageStrategy(MissileBase missile)
+ {
+ this.missile = missile;
+ }
public void Update(double deltaTime)
{
@@ -80,9 +93,14 @@ namespace ActiveProtect.Models
///
/// 终端制导阶段策略
///
- public class TerminalGuidanceStageStrategy(MissileBase missile) : IMissileStageStrategy
+ public class TerminalGuidanceStageStrategy : IMissileStageStrategy
{
- private readonly MissileBase missile = missile;
+ private readonly MissileBase missile;
+
+ public TerminalGuidanceStageStrategy(MissileBase missile)
+ {
+ this.missile = missile;
+ }
public void Update(double deltaTime)
{
@@ -96,9 +114,14 @@ namespace ActiveProtect.Models
///
/// 攻击阶段策略
///
- public class AttackStageStrategy(MissileBase missile) : IMissileStageStrategy
+ public class AttackStageStrategy : IMissileStageStrategy
{
- private readonly MissileBase missile = missile;
+ private readonly MissileBase missile;
+
+ public AttackStageStrategy(MissileBase missile)
+ {
+ this.missile = missile;
+ }
public void Update(double deltaTime)
{
@@ -112,9 +135,14 @@ namespace ActiveProtect.Models
///
/// 无制导阶段策略
///
- public class UnguidedStageStrategy(MissileBase missile) : IMissileStageStrategy
+ public class UnguidedStageStrategy : IMissileStageStrategy
{
- private readonly MissileBase missile = missile;
+ private readonly MissileBase missile;
+
+ public UnguidedStageStrategy(MissileBase missile)
+ {
+ this.missile = missile;
+ }
public void Update(double deltaTime)
{
diff --git a/Models/Tank.cs b/Models/Tank.cs
index a6e5ad5..71ff327 100644
--- a/Models/Tank.cs
+++ b/Models/Tank.cs
@@ -6,28 +6,42 @@ namespace ActiveProtect.Models
///
/// 表示仿真中的坦克
///
- public class Tank(string id, TankConfig tankConfig, ISimulationManager simulationManager)
- : SimulationElement(id, tankConfig.InitialPosition, tankConfig.InitialOrientation, simulationManager)
+ public class Tank : SimulationElement
{
///
/// 当前速度(米/秒)
///
- public double Speed { get; set; } = tankConfig.InitialSpeed;
+ public double Speed { get; set; }
///
/// 最大速度(米/秒)
///
- public double MaxSpeed { get; private set; } = tankConfig.MaxSpeed;
+ public double MaxSpeed { get; private set; }
///
/// 最大装甲值
///
- public double MaxArmor { get; private set; } = tankConfig.MaxArmor;
+ public double MaxArmor { get; private set; }
///
/// 当前装甲值
///
- public double CurrentArmor { get; private set; } = tankConfig.MaxArmor;
+ public double CurrentArmor { get; private set; }
+
+ ///
+ /// 构造函数
+ ///
+ /// 坦克ID
+ /// 坦克配置
+ /// 仿真管理器
+ public Tank(string id, TankConfig tankConfig, ISimulationManager simulationManager)
+ : base(id, tankConfig.InitialPosition, tankConfig.InitialOrientation, simulationManager)
+ {
+ Speed = tankConfig.InitialSpeed;
+ MaxSpeed = tankConfig.MaxSpeed;
+ MaxArmor = tankConfig.MaxArmor;
+ CurrentArmor = tankConfig.MaxArmor;
+ }
///
/// 更新坦克状态
diff --git a/Program.cs b/Program.cs
index 815e251..61817a7 100644
--- a/Program.cs
+++ b/Program.cs
@@ -4,6 +4,7 @@ using ActiveProtect.SimulationEnvironment;
using ActiveProtect.Models;
using Model;
using System.Security.Cryptography.X509Certificates;
+using System.Collections.Generic;
namespace ActiveProtect
{
@@ -32,9 +33,10 @@ namespace ActiveProtect
var config = new SimulationConfig
{
// 配置坦克
- TankConfigs =
- [
- new(tankinfo) {
+ TankConfigs = new List
+ {
+ new TankConfig(tankinfo)
+ {
InitialOrientation = new Orientation(Math.PI/4, 0, 0),
InitialSpeed = 15,
MaxSpeed = 20,
@@ -42,7 +44,7 @@ namespace ActiveProtect
HasLaserWarner = false,
HasLaserJammer = true
}
- ],
+ },
// 配置激光指示器
LaserDesignatorConfig = new LaserDesignatorConfig
{
@@ -71,69 +73,19 @@ namespace ActiveProtect
ControlFieldDiameter = 6
},
// 配置导弹
- MissileConfigs =
- [
- // 标准导弹配置
- // new(mIniInfo) {
- // MaxSpeed = 300,
- // TargetIndex = 0,
- // MaxFlightTime = 0.5,
- // MaxFlightDistance = 3000,
- // ThrustAcceleration = 50,
- // MaxEngineBurnTime = 10,
- // MaxAcceleration = 100,
- // ProportionalNavigationCoefficient = 3,
- // StageConfig = FlightStageConfig.StandardMissile,
- // DistanceParams = new MissileDistanceParams(500, 100, 20),
- // Mass = 50,
- // Type = MissileType.StandardMissile,
- // },
- // // 红外指令制导导弹配置
- // new() {
- // InitialPosition = new Vector3D(2000, 150, 100),
- // InitialOrientation = new Orientation(Math.PI, -0.15, 0),
- // InitialSpeed = 0,
- // MaxSpeed = 300,
- // TargetIndex = 0,
- // MaxFlightTime = 1,
- // MaxFlightDistance = 5000,
- // ThrustAcceleration = 50,
- // MaxEngineBurnTime = 10,
- // MaxAcceleration = 100,
- // ProportionalNavigationCoefficient = 3,
- // StageConfig = FlightStageConfig.InfraredCommandGuidance,
- // DistanceParams = new MissileDistanceParams(500, 100, 20),
- // Mass = 50,
- // Type = MissileType.InfraredCommandGuidance
- // },
- // // 毫米波终端制导导弹配置
- // new() {
- // InitialPosition = new Vector3D(2000, 50, 100),
- // InitialOrientation = new Orientation(Math.PI, -0.05, 0),
- // InitialSpeed = 0,
- // MaxSpeed = 300,
- // TargetIndex = 0,
- // MaxFlightTime = 0.5,
- // MaxFlightDistance = 3000,
- // ThrustAcceleration = 50,
- // MaxEngineBurnTime = 10,
- // MaxAcceleration = 100,
- // ProportionalNavigationCoefficient = 3,
- // StageConfig = FlightStageConfig.MillimeterWaveTerminalGuidance,
- // DistanceParams = new MissileDistanceParams(500, 100, 20),
- // Mass = 50,
- // Type = MissileType.MillimeterWaveTerminalGuidance
- // },
+ MissileConfigs = new List
+ {
// 激光半主动制导导弹配置
- new() {
- InitialPosition = new Vector3D(2000, 100, 100),
- InitialOrientation = new Orientation(Math.PI, -0.1, 0), // 调整初始俯仰角
- InitialSpeed = 700,
+ new MissileConfig
+ {
+ InitialPosition = new Vector3D(2000, 100, 100),
+ InitialOrientation = new Orientation(Math.PI, -0.1, 0),
+ InitialSpeed = 700,
MaxSpeed = 800,
TargetIndex = 0,
- MaxFlightTime = 0.5, // 增加最大飞行时间
+ MaxFlightTime = 0.05,
MaxFlightDistance = 5000,
- ThrustAcceleration = 50, // 添加推力加速度
+ ThrustAcceleration = 50,
MaxEngineBurnTime = 10,
MaxAcceleration = 400,
ProportionalNavigationCoefficient = 3,
@@ -143,15 +95,16 @@ namespace ActiveProtect
Type = MissileType.LaserSemiActiveGuidance
},
// 激光驾束制导导弹配置
- new() {
- InitialPosition = new Vector3D(2000, 10, 100),
- InitialOrientation = new Orientation(Math.PI, 0.1, 0.0), // 调整初始俯仰角
- InitialSpeed = 300,
+ new MissileConfig
+ {
+ InitialPosition = new Vector3D(2000, 10, 100),
+ InitialOrientation = new Orientation(Math.PI, 0.1, 0.0),
+ InitialSpeed = 300,
MaxSpeed = 400,
TargetIndex = 0,
- MaxFlightTime = 10, // 增加最大飞行时间
+ MaxFlightTime = 0.05,
MaxFlightDistance = 3000,
- ThrustAcceleration = 50, // 添加推力加速度
+ ThrustAcceleration = 50,
MaxEngineBurnTime = 10,
MaxAcceleration = 400,
ProportionalNavigationCoefficient = 3,
@@ -160,7 +113,7 @@ namespace ActiveProtect
Mass = 50,
Type = MissileType.LaserBeamRiderGuidance
}
- ],
+ },
SimulationTimeStep = 0.025
};
diff --git a/SimulationEnvironment/SimulationConfig.cs b/SimulationEnvironment/SimulationConfig.cs
index 80bae84..57061b0 100644
--- a/SimulationEnvironment/SimulationConfig.cs
+++ b/SimulationEnvironment/SimulationConfig.cs
@@ -1,3 +1,4 @@
+using System.Collections.Generic;
using System.ComponentModel;
using ActiveProtect.Models;
using Model;
@@ -49,8 +50,8 @@ namespace ActiveProtect.SimulationEnvironment
///
public SimulationConfig()
{
- TankConfigs = [];
- MissileConfigs = [];
+ TankConfigs = new List();
+ MissileConfigs = new List();
LaserDesignatorConfig = new LaserDesignatorConfig();
LaserBeamRiderConfig = new LaserBeamRiderConfig();
LaserWarnerConfig = new LaserWarnerConfig();
@@ -325,35 +326,55 @@ namespace ActiveProtect.SimulationEnvironment
///
/// 导弹距离参数结构
///
- public struct MissileDistanceParams(double terminalGuidanceDistance, double attackDistance, double explosionDistance)
+ public struct MissileDistanceParams
{
///
/// 终端制导距离(米)
///
- public double TerminalGuidanceDistance { get; set; } = terminalGuidanceDistance;
-
+ public double TerminalGuidanceDistance;
///
/// 攻击距离(米)
///
- public double AttackDistance { get; set; } = attackDistance;
-
+ public double AttackDistance;
///
/// 爆炸距离(米)
///
- public double ExplosionDistance { get; set; } = explosionDistance;
+ public double ExplosionDistance;
+
+ public MissileDistanceParams(double terminalGuidanceDistance, double attackDistance, double explosionDistance)
+ {
+ TerminalGuidanceDistance = terminalGuidanceDistance;
+ AttackDistance = attackDistance;
+ ExplosionDistance = explosionDistance;
+ }
}
+ ///
///
/// 导弹飞行阶段配置结构
///
- public struct FlightStageConfig(bool enableLaunch = true, bool enableAcceleration = true, bool enableCruise = true,
- bool enableTerminalGuidance = true, bool enableAttack = true)
+ public struct FlightStageConfig
{
- public bool EnableLaunch = enableLaunch;
- public bool EnableAcceleration = enableAcceleration;
- public bool EnableCruise = enableCruise;
- public bool EnableTerminalGuidance = enableTerminalGuidance;
- public bool EnableAttack = enableAttack;
+ ///
+ /// 启用发射阶段
+ ///
+ public bool EnableLaunch;
+ ///
+ /// 启用加速阶段
+ ///
+ public bool EnableAcceleration;
+ ///
+ /// 启用巡航阶段
+ ///
+ public bool EnableCruise;
+ ///
+ /// 启用终端制导阶段
+ ///
+ public bool EnableTerminalGuidance;
+ ///
+ /// 启用攻击阶段
+ ///
+ public bool EnableAttack;
///
/// 标准导弹的预设配置, 所有阶段都启用
@@ -384,6 +405,15 @@ namespace ActiveProtect.SimulationEnvironment
/// 毫米波末制导导弹的预设配置
///
public static FlightStageConfig MillimeterWaveTerminalGuidance => new(true, true, true, true, true);
+
+ public FlightStageConfig(bool enableLaunch, bool enableAcceleration, bool enableCruise, bool enableTerminalGuidance, bool enableAttack)
+ {
+ EnableLaunch = enableLaunch;
+ EnableAcceleration = enableAcceleration;
+ EnableCruise = enableCruise;
+ EnableTerminalGuidance = enableTerminalGuidance;
+ EnableAttack = enableAttack;
+ }
}
///
diff --git a/SimulationEnvironment/SimulationElement.cs b/SimulationEnvironment/SimulationElement.cs
index d0e5dc9..8323d37 100644
--- a/SimulationEnvironment/SimulationElement.cs
+++ b/SimulationEnvironment/SimulationElement.cs
@@ -5,37 +5,54 @@ namespace ActiveProtect.SimulationEnvironment
///
/// 仿真元素的抽象基类,所有仿真中的实体都继承自此类
///
- public abstract class SimulationElement(string id, Vector3D position, Orientation orientation, ISimulationManager simulationManager)
+ public abstract class SimulationElement
{
///
/// 仿真元素的唯一标识符
///
- public virtual string Id { get; set; } = id;
+ public virtual string Id { get; set; }
///
/// 仿真元素的当前位置
///
- public virtual Vector3D Position { get; set; } = position;
+ public virtual Vector3D Position { get; set; }
///
/// 仿真元素的当前速度
///
- public virtual Vector3D Velocity { get; set; } = Vector3D.Zero;
+ public virtual Vector3D Velocity { get; set; }
///
/// 仿真元素的当前朝向
///
- public virtual Orientation Orientation { get; set; } = orientation;
+ public virtual Orientation Orientation { get; set; }
///
/// 仿真元素是否处于活动状态
///
- public virtual bool IsActive { get; protected set; } = true;
+ public virtual bool IsActive { get; protected set; }
///
/// 仿真管理器的引用
///
- public ISimulationManager SimulationManager { get; set; } = simulationManager;
+ public ISimulationManager SimulationManager { get; set; }
+
+ ///
+ /// 构造函数
+ ///
+ /// 仿真元素的唯一标识符
+ /// 初始位置
+ /// 初始朝向
+ /// 仿真管理器
+ protected SimulationElement(string id, Vector3D position, Orientation orientation, ISimulationManager simulationManager)
+ {
+ Id = id;
+ Position = position;
+ Orientation = orientation;
+ SimulationManager = simulationManager;
+ Velocity = Vector3D.Zero;
+ IsActive = true;
+ }
///
/// 更新仿真元素的状态
diff --git a/SimulationEnvironment/SimulationEvents.cs b/SimulationEnvironment/SimulationEvents.cs
index a9a5171..3f5e1ee 100644
--- a/SimulationEnvironment/SimulationEvents.cs
+++ b/SimulationEnvironment/SimulationEvents.cs
@@ -34,17 +34,32 @@ namespace ActiveProtect.SimulationEnvironment
///
public class LaserIlluminationStartEvent : SimulationEvent
{
- public required LaserDesignator LaserDesignator { get; set; }
- public required SimulationElement Target { get; set; }
+ ///
+ /// 激光定位器
+ ///
+ public LaserDesignator? LaserDesignator { get; set; }
+
+ ///
+ /// 目标元素
+ ///
+ public SimulationElement? Target { get; set; }
}
///
/// 激光照射更新事件
///
public class LaserIlluminationUpdateEvent : SimulationEvent
{
- public required LaserDesignator LaserDesignator { get; set; }
- public required SimulationElement Target { get; set; }
+ ///
+ /// 激光定位器
+ ///
+ public LaserDesignator? LaserDesignator { get; set; }
+
+ ///
+ /// 目标元素
+ ///
+ public SimulationElement? Target { get; set; }
}
///
public class LaserIlluminationStopEvent : SimulationEvent
{
- public required LaserDesignator LaserDesignator { get; set; }
- public required SimulationElement Target { get; set; }
+ public LaserDesignator? LaserDesignator { get; set; }
+ public SimulationElement? Target { get; set; }
}
///
@@ -135,7 +150,7 @@ namespace ActiveProtect.SimulationEnvironment
///
public class LaserBeamStartEvent : SimulationEvent
{
- public required LaserBeamRider LaserBeamRider { get; set; }
+ public LaserBeamRider? LaserBeamRider { get; set; }
}
///
@@ -143,7 +158,7 @@ namespace ActiveProtect.SimulationEnvironment
///
public class LaserBeamUpdateEvent : SimulationEvent
{
- public required LaserBeamRider LaserBeamRider { get; set; }
+ public LaserBeamRider? LaserBeamRider { get; set; }
}
///
@@ -151,6 +166,6 @@ namespace ActiveProtect.SimulationEnvironment
///
public class LaserBeamStopEvent : SimulationEvent
{
- public required LaserBeamRider LaserBeamRider { get; set; }
+ public LaserBeamRider? LaserBeamRider { get; set; }
}
}
diff --git a/SimulationEnvironment/SimulationManager.cs b/SimulationEnvironment/SimulationManager.cs
index 3cd240a..b35a6f9 100644
--- a/SimulationEnvironment/SimulationManager.cs
+++ b/SimulationEnvironment/SimulationManager.cs
@@ -81,7 +81,7 @@ namespace ActiveProtect.SimulationEnvironment
public SimulationManager(SimulationConfig config)
{
this.config = config;
- Elements = [];
+ Elements = new List();
CurrentTime = 0;
IsSimulationEnded = false;
InitializeSimulation();
@@ -232,7 +232,7 @@ namespace ActiveProtect.SimulationEnvironment
var eventType = typeof(T);
if (!eventHandlers.TryGetValue(eventType, out List? value))
{
- value = [];
+ value = new List();
eventHandlers[eventType] = value;
}
@@ -244,7 +244,7 @@ namespace ActiveProtect.SimulationEnvironment
{
if (!elementSubscriptions.TryGetValue(element, out List<(Type, Delegate)>? subscriptions))
{
- subscriptions = [];
+ subscriptions = new List<(Type, Delegate)>();
elementSubscriptions[element] = subscriptions;
}
diff --git a/bin/Debug/net6.0/ActiveProtect b/bin/Debug/net6.0/ActiveProtect
new file mode 100755
index 0000000000000000000000000000000000000000..139155c5734084141cbd4d359b6f7d7bb34843e8
GIT binary patch
literal 147952
zcmeFaeSB5bmB+o$y$QJqK?6xhP&60uC7>cI0%@V#@S;If5Tc?|lMo__yabZq8(MoAETU&zC_5wPE0+OJ3pYQLyB!`e#+UN89
z7e28U6XIDNs>6AC&X`z9lqQWV&3s25=>UYKByeCpre<8O@QBh6Vy)~WnyW*QS
z$?43JN1ZZySHC*`C79X{7@(-Ax@Otj>W-wY_}+cb!S`H(Q$+86d?6PfJhcBg_=?KQ
z7A`5PBBd+7dw+8>KE3<#nN#SSUs_sJc5i9flA5BLlDS>+4c_hGd%dpb_if>7~gAcOoe|mRW>870g
zC@NaE_@0Wz^NK1K-&sjkS9~*$JNTY*k?6fEO@53;MP=nhcUF}wDsxi1;yd`IgD=e$
zKfU|=>&GQnavbBYsAzJ2VSdr1={L-BrP*?nC_<+F&qWw<-h@+sqBV`bqN4egom}e~
z-xA6?|E!bf>O*3wm&NncaX6X2B~T}d*162m`(Nwl2UKwS>1!y`rJuap|02%A>!);9
z|B8whmK0Urw`gwV!lETLRXyU%_J{$W2dX}%$Sf7${wpe)S5i~ry`4&5_9TbCXI=Tw
zyB}X?O$WlBlvkCN%qzOPq)JwxYk!-saqwlk74`1Nm)-?o2fn%0wo&Pd?*kW~XU|mK
zk5Bg3|F5XXMdT)S#ndnou6V5ZHcBCN6g?WT|X49#$b(TF})bcFuXH4tkPQJuWJPd8H%t{cIzfAgMWBQUd
zgFpRibN|#1X2R6**VDi3f3?iJ-DI9YT9`lCNobb#^4VweY!AOeg$b^{?xWjmDSINZC+ZVg2PGm^Ej8D3r}+wBGj(r}W~BM_fJvqAKRvbdL3xHy52!e%5`}HD!xNOmwSI+L#OZv+4PsWkL`=
z%zYPs_3s?_ecfk_!!$do_kX<{=;c5!2YNZs%Yj}F^m3q=1HByR-iRB4RCxTY};h>3{y{7UA&)PE{8kZBX@-oAweqgJq=Ns)8
zA>+l?pcUN{%!qyz92kwAYu4YAwr*yY*;3VN%;;9q_5{nCdYv@v$d6elz(GKUar+Pru_Hd((_x*d5t`sw)1KG^+vT<
zd~T%u8StrG?92G*;sKHNr}eJ#dhZiy-{`h`VtHph@w)gUQ(sD6@k6G*M9=d~eUV)@
zBg&W9>rX7--n5?g@9_5?^u||NyN*m}%$6rYvsE9D2b$tJeC~d>!>c{dn)>P4W_=`R
zM#tjKdHb>=?KzfN8Y4aYQr*TM(XX5YvvgX(6!OjbdOk8Ab(p@#_?wam&o@!0uTv-Y
zrN=gk_YK*O{4lO|zWCZonKEcn8;z!I%!%bw;K$@9=(ES5m3F^Le%Ex3joMHhyROU6
zKMrM#z&XRkSsss%=8lRCzJbqx4;gknwFN(g`)bN*96q34JQzTx6Oe;MXy^lPlA2Du
z(aD?dac#xBf4pW}VT!rx@#K)LJ69r~jSv0X*v6n4BRQ;lJ8^c%inKpL+0e0Idqe+D
zexhgVYlCJ~cl@;aJG`le9?@7EKz5+ZGPUnaq>UiY=gE^kq=T0$4Kf6Cy+nrEKi0?e
z4}Fm|I)0(4S{aWQ{u5=7GtMfbzK`JHsyuj@AfY@g>JFT819D1s0E*wR{)R2^TY7aEpv*@=uhQ0*o=X>kU({u?u~kl%3Phk!j&=gb%SK(|*$IBo%dc!oV^*mFOjCFc>O%E@(Mmp$}Y$L
z2+sU8X||oV#nD5Lj%4WA9ta%>Cr6HR4MyQd>0Y1GqwU~v#x67ZJ>cDpooJT*{s!+S
zmS4>nOkpf0Baf4s7#qhn1xCo@8@JNB=UScL4uAvbmai8jHoy
z-5re`a!EhwtgSCsF}8INy)rfwFk_@E>hF8cCeChP{4~cu2~KY;#{zHqD>@@w(wRn|
z&Xl@z6+l;HU&0Kv@qy;I9&|kRTlkoKDjzd{``7tcNn4(drvm>yd>rG_I~aODyX7ay
z6+Xjq?9eLL2K{f+YSylv6K5Odn%|M8_t+E8`-$Zf
z!JCh~zR~#pd7U~YJkl}Q98bs6U3%J1#5c%CIDt&d7Sy84c#QSZn=pE-XULfL)?hOJ
z(hl2S@ydH;rR&mh`I24Bq(Y;{#BXyC2LsU~wl8R+twT-yrIe|=qd9Li@*$lV^3wW^
zNs&VqSVEWC~?dbLN;s&lpqq8MGZ;
zVe)RW%qyC!8z-9jtWO_!v^AI&y@WcSsog;S%SVS=O|lK1-}@1E_Iu>-zU!*7>T@c-
zl?#j?=qElzz4{#`f6vboY&)X&e_~D)o_(?-$cE=rMt+_!QnLRt`lNDGkr8i9
z9eI#{@65w~d1!Iz=$hx%_2l8FZn+seJ$Zi}*$d6VM@Qbo(;O>sU?MzZ9-isReJDY6
z1`cT6^{3|sjoqiFfb(3zwPLyb>o(eRBe3KDIQrFMIc280&yKRLp5=5YKkEtkf-e6&vOzj`BfAY-3P(<46GlqcN}na~-D@yJM15%iWo
z??W%G-YA*y(_CbFqWM&rSp64=o)q^f`7RJIyP;*+A*XEgp!4h~+k;Fabb=F>P$`V_s^e?DjzLz-peJ{qWCIKZL%0!M@Rp
z6V0LG6Y;`S+W#*0Y5P)ZX+G$dA@r^g(UyamV8V+G5TAQW#wdBxvq*+G1__
zsMD4cQ@DXPygV$Fn`U-oTp&Z|JKq{G;|Q7IJ_V~ZHW
zd}Lr4eBHO*FxMkzmdQKHSnk6ouYl(LtT(1H#tRt#6_nq>{9~7A?K+iomETACqi%a%
z|31xe`qzxiHq&klJfeZ}OZQPWgq|i(Egn0;#hIL7ZnW(aKFxK=77Q8d~u+5e2jH(d5UR2&zOuA-!e@rfMeU8u{iL2zHQSA8H;5v
zJ-!j1)aT@zmp)1`g*o4J{Dhi2Ox|aVQK9Q6)Lq@_C!9w+o}WT%5iPt=zl^TD+*Ph92T6`vMMou1scb7{<8TV}Klnkb}@1lczaD`V%@o(j@zG
zEoCGto87TztlC4QWAE~`PCC_=IliQPC5_j7+Lf%g(#A)mg}|L&ah|QaTHh9tuXL4Z
zri~{05<}r7NEkbKY@Z=le0<
zWh;b#>WIYI!&pM0r%-s%eH$Q9bIyAst=kztBx33u6v^_Ye
zEr$H0TLC*xm6w}1`)jOiGE1B_W8;O1vy*{C7O~0&R#WU6)4tDMQ%DvvqZYJB7_XIgv`L>sDVxQ2fA&91
z|99_j)^k@z+J8ZxMDJF&Z!PB}&bEd)y4YmrrAN2(Y^?q@F|4*Rjfa0TRyM3*)vawx
zmkm3y{5Hn#R>pBQ<9Q3?dUMkkl{XOw>SM1j8-lajgkN>*kl91fCtdQ>@qjGx{jc
zfGa=Zb-|!cdcN(;lbn9v#Tg5>jXvM4W7Efb*nK};KCE@yui~k8>oPmrop0x*M;}ys
z@S&0UL+!+Ps{j2-S09%vU;H87EB@SL*UN||^XzFq$g_>|xg;yH9p@nj-=I!xXe5t0
zaa1E?UPoKo114`fI%~&A9T~{OcVs!4F(Mf)@H^XikWbFbJPFo$xjy0a>vV;FQ4Nn7*sunge%HuW_!aFNepTo%8%v%@47|*2@Jq
z?fHxP+7w9MIqbxw$M%zU*G-TAW%Pq7Pre0DWG5SwOySRuulQ9FV=?UVM>g(1Y+jB=
zTmP~T8B;ot1H*n0Yj^^7rGWtt@KmTbt8nYM&lwip{Q~2PZTYtvt7FT8Y`UpY_8E%I;vk
zRK4O0O_SzI)t4>jPUMXJ$lr=U#(^+=m_?m}L%VHxj==LbXtxa>d-ZCL#kV^8f3gq0
z?Hu{X>Cx;Y;+K6KTYXe9UikVlI8=nW5HGTk5*ggHOICUkBGEyaNBy2r^?4ZOK@x(v{jK-90=6c
z*<~b?o%@B_=Q=(=h%GyHuglX{`5y5&`$bvMUy9yhwH(^$dhCDAK$2Q7m{8_`s$8!;(nxuNoQ?=
zFV23i;y?JJu`k$bVy>SJ-o3K3%-e;m%VMk@ay0ggv-quemi)QxjCCt%%$2*68S4sc
zmtm|6sIRe>uX==ePUEF9?Yj4Ld_M7hcmGLxYp)$uhw+v?>0NZmW{MWlUlE=+2Mb@M
zeFS)wUc(wuG>SISDS7;BH0E@n@obmI7s1^%b{3Db-@`oKFv{_3_6#-kyVK12h}N|$
zI^$+XNDmWNy@ouSc3)mD>G*T)kt?0`?(eWEEBZJ-c;hH17N`AAjdeQDT(>RNX}!Y9
zA4VOu*J95d;^(Qcw|zEmPR;Z9tNP_yM-c1#y<2vP-RA)Nb|>%6Di$j{@*46X9f`+-
zP4SCNd*dC>8Z0V%u6PP-u<{@}`mtm&Gx{X>ViR`Q>k`F1Vx*t6?!Z3SYt9K4YZGMY
zUnX_CF4;F!`s%Dp_JBiU|Frf5W
z>Oe+xQy|^efs8IX@Ez*gIzWBSc(ku_d7`oN>wzc#tvQkQ`zh019+$;Cx&TibSubAT
zz8?X%bcOryoqY9MxM~|INzv)*AZP@wJ8T$0M=*&!CpN`O{8{9sH
znA=7FwY;mX4{1w2i~sD3H&^DeUaf;h_M`JQx&BC_8j{EVofP3eu+=J=SSwSO*nA9g`@Fh)J?j}!ZDY8d3$(=XfN8>C})oeo`c
z&Z&6kQ)Igay8ZFauy}d4ZqtUXN0du-%RNoMljlV8a*1K45OY=g1uxZZtROZr!LklC
zA%_!)T^92kPWyc;O2%F{Waq}U7tDBc#R+rh;qOO|%ikJ8{7B_3;wJQ&n3ffl&)}cq
zLbRjUu0JMKhnz}hQ&=ZRFQ?LWIcX{Qco);&B^7s#T{PtFjW5#PCfa+>ZSPwAyBsUU
zZclNDqD1qO=pbf8%)N7NgO+zDviAEi{UlzpE!-tvV}9zHC1*cp&l!#ldw{ylA;*p$
zMenrsx{7s2Y=zUG{r~F4svqAtmvNJPR!~PejqH!nTqfOCy8PWcu}$bVKD%h`JZt2Q
zm1O=o>Z_jCytT-h>dmHJF}lAp#apXpL~nA-6<{CNQ_gGSddhZ(+q3bu9MH}q)R)W-
z=GmRUC|jx+zy-*Q_O;GSG=;LO-oDl;@v4cP@v6JQ`Bm|%R`M0EDtB%3T_Yk*)2zO0
zD0CP
z!=6xgbKYpN
znb9xF*PP*{ALCs%-+MpId!5UJM||_sKIBV#3kQfP7Qqkcq~;cDkYi_d`|H6w@hqP?
z+mXTaXp5ci#PYQ-6~ZRfX&pf;YpS?LFYSf9%wi=fUae%8`@y
zfSuTGrmHI@2ZHu~mi#u!&)h)m%p0hyKJTM{8XtR~9KIGZXDA)sFn>Ge=(^h%UQPWT
z^J$|Z=&Uj2kM+dgRB(vDck}e~w@T^oH-YEr^7k^8{cHTaqm#eP$uF%!Rz3deOjzC1
zoxCjsUsv94wby4lTk7!lCzO#bvi6+J-;dz$XM?)u?-$2TkH43L`>Xid|1|i!6&l3f
zbHU~3?^(Qyzb}w4{&qc^a3mPSo;mSon+K(){%Yn18;5HblZ9i|4kwGe*P&wt0p>8u)oP!Ea&?pwo;uQ%-^lauEPRb$GbzGtEJratD2Oe5@9|`$YZe
z23HGyS+(qt@Bzyv9l)p6Uen3v-a^sFXIbyFzG&cih_MLcV>PV$o!yVdRm4o}xVUpx
z%R8e*%(7nPZ`8U3*_JPU1F&>S`+d`V>y_AU$96Uz{{2|d#hN@rWAGEn19|p2NBq`p
zysJzjYte>P-)wt@cW*z%YuB51rHiU7zd&`wJA1woKfwLZF790HljaD!p336~w9?ko
zZd>vTYRg$~@?OC|YYas4@Y6<>{5&{Au?Dp_%xzaXbs_K(=1Kfy`f5h4
ze5=#m=X8|Ihzk=WtbZo&8aw$C(|ncB
zT;*uv_R$6$j0FQJ;F;b0ZM}5Xm^UrYd
zrN6IH{;T}2pHc2_^}hyE$FqCg?HAUP|F`;I8n4swzdp21^}qfsp3v8oJj;#Q61wSz
zyqw3`&&PJZnyPOOi1~H1mnZoOl{j%R=|c+fFl>CgWLW%MeMU}Oh*(+q8A)xS2X^GC
z{M4d^*~5sFHT|P$E62{&5+C~?yZy}QD?C*u_DwH7#`#t|PcewjvvNPlKJ|=5$lcFK
zXFo$Y3g$R;RiHnL*BwC*R-X}S^I~?%wXf4foyr)p5hsZabAO4Y@aU(lC!S#SQPb%ZNYD
z+UkLBcq2MmX8mpBlsxm)aVoRh%8X8P>1mwd(L>zSrQ>G%c`|Qq>4v7R%V%uzTwh#zDrxnG>^9Q=pdJ-%k1aLvNW=%al4kWK{i+)w1?&pD`9?+E%o@ELcQYi
zICI&7)8T(Y5BTb?IT>Gzi?5Bd`yS4IF3!F#&O^SuKIA1|!kM0It#?um%tbd-E@5ww
zb3F?Z&Z%nPeMJf9oLD;)@x6!E5UKe0+7~od@I}sf@yB;PmU%HXpKlA$XPp!3YpnWI
z`ga|=xPblCi>o+pL>AP0H4m^90#|u|j{SG|O^S|-`N=^3Y
zzNwM+zQ^NRCzPm)}l&)Jvk(aCAzE9cb63#Ey#
zoVS7oue@QuN<70B4$!kFd@1MWvk#Jd;2HWqf&Huoo+-5PhzXAwuCo%>kOezvV>s)w
zlm@G5$f2CEUQEWrt$1cKd7j-pKL5w;0i5~`m+*&);d}A0tl9ZZ+2Kh|Il<6@2~imSq78-<5rC@C`z?8#Vu;2RrcPH3yduXV0)b@~B1s
zRZe4W&io&^N--Phd*`~><4FX0T8pln
zQvYbYP;uV#q4`4oehloLN!&(!*groQ`pic^>orfXKDOt*Jr^X{-$ZilsKK35E%+%()uStI$WxX|HOc_2KxPHO@9m`VA%K<1iq@->#it+Cq(
zewB$)Mq{QJM$J2crt))X6S>JrG*x@BA^v$(x>bJjHS?9NQ$IyLCXQEXAH-en19zp@8;|kO)s^2zgNe2;WQEMIV90Ds
zk7)g-^BxJ&+bLiBj1!ZZ4J^KO#qIf}@|EP5s_!Z{@NaA@;%iHEo=#g8Zn@7n+un5_
zOLEJ%OL_63CQp6KpkL~r@Tza;Q@2=s!^a;2tayhv=XtR~@2rme@f+;6q;DthL#Z8G
z&X7ytaQyi6==;#5^{V=1r~B7sl#6Ly2HvqQ-k<*+eK<@VuMY=-|5_i;`5XK21Gf)n
z{*^u?xp=>?K6Kd&vB!b)nekHoiul8p`^UrE+i3Rs5;XNcQD2IjHMI6E3hcE}r>*OV
zce5`VQ(4M{;IH;E_VVtxi(Xl8oMIX$aBCf{dNCLGUDVTfz3aAp(mGn@HD0v$w%eZ8
z(Q2>7ZSOXoe{bJcQr8|w`u;89r@fF%-&gg$NoDDS*LRKA-_!Stsi(d_?zY`i-@og&
z=kzoGvBS02Q{;ql-L;M3*7MJ`RA91L}7@_d8S)qy6L2kF8G
z|9j#=U$;Gv2T5*w->1Ge*ASaoZ=Z>_zr%IDLs2ZQ>vyOj6WKP5Km6DQ`NX_K3B2>C
z_Z{pRg+jdZXXoqvsYqT5dmG8A&fdnw>>&&zP5Y3Skfu2HYGO7A68Qco$!wL3UCG~f
zk?$h%USOZ20$Alnut!vv7|DB!KN~;iP@<`AW3-3JA>#VC`Rg}Xdv<)U%YI@@KQn47
zX*ujsTxC7Jv7EHk{5gAy$qQOJFQh$Lov}*)S>0`p9Cm*5>BaOWSmw}SzSHa}U+tB%
z#vwLvmD(DD52AhFp2};_#KMnfpLak{Wi;>YU_VCR18@NX`%0NRbJ%;bzZG~^bG+_R
z(6<5^(PHw2$18tf*YcB8KHV+PegXNM8QIn$nYwh3FD#90mYtg6AM@2*3i#Yc~WpBj&y@O>?RFS38@jYk1I
z@{dOyV^Ps%Jbs9etNrhu_ySGCMU&P%lGpT1hn70dM*fbv`!+eUrEdu&Glj_3{&*yB
zs`l5;cJ}s`z4XXNoxOPIipMtwI2*E`7&l|QbRYbPP~N-0AOHCrIBsurobh=_!$IkCOh@)7W3uB&+dPwANp3%q!Y+ed`Qj3dG0XV!vE=
zaOV|T&+GfK)qFpuGXz=D%fR#2mp#-!%dL;^YuA5y;wklWsIN0`vKj9Id;CcGD`%v?
z4c)4LdJC#=b&eDKF&D@t@x~BII(xD{-nlh0op+)b=;dezo-t$G1`b$DIF_f0L^=NZ*`p?Yfh_=3|;ObL_p9F+bv*
z{43a;R_68_DR;|2GkSN5ITXad(mH>&>pSX)Z
zm_p&-zUu5(v(3Pr9zFUt>toI`i=G6Jo}t#RiO|#Tqh}lRa50Nb&!vkj6K%lg@tiGnb}4w3P{7@uoS|6uxq%8KZB8GEbq$@&8((-R94g)~<6;=Fe#H
zr7v`B=*KrjJ@Lh*qnNhDlM>tS%#N-Huk=4;vO9gxQfGWVa(S^sZIiZ>^+WBMX0&(z
zjK2Mi;0Jf|&pRiT5#351tydI-(i;6^;W)E-d~2|FJl}@2$GDfKHE8Pp9h|Lan9)r`
z?->@Ibo;BZi~0=P|8=wN2(s|_MChPh#dZIQ`s<$&UCx+(U-;=azG8dq>yd5j%Wb=x
z^5x9YYO@)c_)p3-1e(V;bH<@Dg}4BFcla8_JFL8A;3{W6F6i4frj{}dl&PakqsnZz
z@`^RS(BSys1Ksmq8PRX4AEa+)99}yb-yq((a%zu56ZzZ=F*=rF>J=N+U1s)Kth>s`
zYVW*`Z;T}m`OezF^?|QLkEWqd*P>TbvCReCQx>#s^D{~J40{&7h#zYAZO+Yi?e{YJ
z{XJjb8|eFYprhICSBuv#U*E+`yZ^*Ay6eBzHotcL^z-0_a8`jcRE_qTRl8)}!M*1~S^>#*x0}w$TWV4xF?pKV5CIugA7Wm;1&X8)c9E
zaO%rezs4Eip3XLG1|xtIp3vcVYA}@?yMJ+!C%g~!2;IF+EeiIkjKLK4_Onj
z9@kn+?Z~caK6;k+WJhZ4eH{~3zRG^aI)7ClbEnS3_}7O2O?fA6U^EZ?vt@XNtEMyWt+UZB^%*b2aITEvqeySh?CbLK}Yk-uLEPJKD&IhH1lI%g_e>wqvaNenDd(
zInlmM=X$X7jFJD&la6(ikIrAH4fs&Z^R_R0-pBLSMY_XbD(BJPg6|>r`tY@@_|~zo
zFXuczVNXGjPK3_zL7u247h~;>Kit-vz9e?--?A}
z*Rp;-fNfZ$wk&Jur*2yp)7ApoT0vWHfj8T2>k{ADI#@G~TuA#op
z%_YL>Z%nO{fp?r$@L_YwU437aKdxENUNy+l9P9dPc1>xsuIA5Jz~+w6Uz
zgy?6S0~Fuuh^JItYnkOA&Ut3SrRjBHPgdE_knE~B%e?a(H_ry!XB^0AI{tb^cfHgTq`=$-Uo
z!h$hlwa4L|SJgUO@syL>&$8Rs_^E6ivYHdjI#9y+i>KOi`7LcJZ3nc!kImW*jTd+6
zhjYGjpxc*$2TGuQ(;0^SdfR@y^Vi1Dvq9yq4f-iVjbQ
z81H*|FOKWoE9&igXI&C$&*sd)QTP)NWFMFdjoF+VI10}Oa`s?bVBpRPlQ?^S27CRt
zn?oUZaNiv!Z#OX{?Q7mlU$Qu}kjdGCe`oJ`_eAs3>-cQDZ!?Et#9HsBY@D(h$7z(+
zx-i2YuZ-w-=|>&+PTl9;C!zidZx|aV-iB6f*qCAs+*xEi7B!4T%$8e5T(+FZ===CD^AT
ztM7r8^l>z_>_gvl?s7P`GbPiEonU1i*i4zr$ZJ8aJUUBVI`8(;sXn#R{_X&@F^`o8
z2Cmu1pJ@9?w2}7nKi>c7KIj$Q2cT;qf1hHvi=k~UwADh}L(s-K6Pq@Dqq-6ql8+#|
zR`AVFPvf?a@#>Ct;)^}jk?j1tz6X0l->!x5;gVSkr4XwKaF?SK`)V8>oXwh~y>Zn!
zZP?d$-jU2H#)Y0d0{k&!GQ|=L&ioIR0sb*hofG`Xo!9l9hV)h6X>^=B
zhp(CT`18Fpr|uNFhx`?si*Dpxsch|A7X&-*L$Kh}iRIVQhpG6X
z_@8e$_j0Q4VeSJsgSzoI4Ci(`@3fQclP{BuomLz+%=bQZ=kr}t(6n2Tl{4p4M>OCs
zTpk9$a0$#*>%P{
zzADK5ZYlJoFMVQty1ZZ034H3K*iP?`hVJOsIg>nS6wO-O*gQnX(nyQ&z2AGAo%Oz-
z)={iG-#EjbueKfGJ1?zQlCbHSjQ1dD@t3`lvah;j^-WmwKLti=EI!}wl$WgT`Ff=N
z7S1$b585R&&brjOGboXF@lZaS{IH12SK(BBQ^F7)q=4^yL=P{OA8|B*VW<-C+GYrnI
zW2$*TI>eaUeGwkS*w+Ht*Zc4{1-j_fXi06?orBwXL%1
zkL|YdZgIc+(0n<_*1ti~OR1wdE|>YT^-8TvwZ_ecPx>w)E4o2AHDB)Dk=J^qqci)!
zm%L^5#w+pFG%v3Bsq;;42ss!?dA-Y@8#2%7x6Zh~-VeRvDOk9F%Dc{?>y9Ny4Wj*SITwBleBT4T
ziW|H@TUr~b%wv=hk6zDmVmr2dLT8SF<1=`~=Ef_7?Xp?X!Ia(39l+XS6RqU~SO-Aw
z@4(j>yv?>pQ>{*W6dqs-50R&NBirV0cJw{o)t}Hw{FSfg+^aKzHsW`UJ}v%!8@j|d
z@i#(jCcYxEDaN;j$^YQknHcovVz*a$2j%1&!O>b>Bn7T
zXPB+WXYpM<-zk4i{+NdyTwi?5xAPYv3#C^5o=H}{^f@HnNq>{Ei(KNpXYkxQKP
zrS`o*)YEuOrycv-W+$fh=y2Xux0W?nyV{?SZ-0xq|6eEB-!090>8XwS-cDmQ9DJMj
zZht6uUPv}sBW^7Y3|dnY$XHVsFgtUs>;uz2j~8y^Y=6kg-WlNA%hx$mxd)%|542Ov
z8K&dZb9kH`{g^alXH`=-p4n(
zl23h)tvjeCqfe11Ig17Jn;ysJWm@ooeDx7|vG-)PP81&ETkEw>6s}y>agw9hr|~fz
z^7H3F$9y*A|I~JR6rHd4f48DF;FX>}~v~eNIt&I1aow|0Vv4jT@YGoDsW~{^*-x
z4yf9?rMn3VmBx5n#@!H#0|>qZILw_L9q|HWArwHi!P}2A@^3|d*SLYcbJaX0d#nD~
zJ}K=Da@(`t(T_~t)sKHk#a8;}+Fa&Z{E9q%`=@&)6~{l-mRr$ls4siXm~EB*cD2uW
zPKWTGS2Blq$BOgH6pmaFSsd-|5nn=eA{nH{Y!FLK+&?z9{3cT!)AnFo{?_T}Ld
zyi!h#tN?#p-w6$LX))s+TQ?e7HX#F!uh4lP6W^a<#I?ks50x2NRG=UB@+mAQOW*R_csh?K`HZm!(>$$v#fOY_Z5+5qGbijA
z{yVk*k81xb`d~&ocs4+Tt!pbdPr#o3Icgu+>y!Gk1AO;`@2hxH
ze3iqKRp8qr+R&51)VY$n!WW~DO7r{t-nkpCIln>Kp7L$I1c$AMl)cg|`?J0$pUKsJ
zM=pAa&UeU-_)shVP2*4dyQw2NZ$!3qrWHQBGTr%YyI-EZMg8!X@mCIGZxjpcu6%d;
z=*3}VCvu@jZ8I+Kh#uzgt+KO9lP&)bXwv*}i}K)?cZO2mUVHi_omG90o)pR=i&6Pq
z*dE(&i(val@g2Kgj}7GvKHIl>%C@xTJL5EwadLdNZglx?)XCNh9UGx>`6``kxWFkl
zjBC*Pu-o^NoawX&bIQYJbC$%{azNf(_
zK6rXL+U9qsj(c{gHOJxMqm(~gy`2HB)79H4Zdu(|?LSK|{YJKDj$n*Ena+hzlH&?z
z&BA*2v5k8uGaDS8=jJ+fwktkc?-DxgK^5{-yZxHS~~7Y@ZAwmpgU|Fot??K
z!M{q^6+O`9w`4mmcX
zC;l4nHo*I?bou*Hd!|Ff7+*iEGhLm4XKS%79`Cl%rs-iU{{YQlV)0$a*&16r^D1yh
zSmXbaGWNQ3igTZ>hxb`uUs{gGPr)Hs`ETlWCo5h17N)HC4VQd3<=Z|SewP2zgjmh)-w2B{D0f#pBVb>RPUR1toBRZ*hxB89xtsXO
z5bBPjuI9rXJSo={{?aM;tv|*$Xiuk+?`E2av&jGQ?x2YJ>_VgKyWgTdf|qZ9GW_z}
zabJF$Wyi?I(!P9n(JVR|SIu$O*Ztm{rh;S#5pR?Ajh5-?WLbZvL~wv(2RK6;6D8-4D>3Rcr6t
zYn`sxndCjT$;$KOJyxCgYUt0_49TD5J$5ns`;}InzOlDuidg7tw6A*vv^HM_JVO30
za`gYu&NGLdy4rVQzIdmSd}Er&hltU$*U{d3X6^W#FSuXE5bw!hjmwz?#&K!v4QC%j
zc*__M<%KwFpgnAzIZ*peio;S?cOP{4`3IdbT!w7KS8(4MZRi^fo4z7b{}Fi4XKo0y
zKf4E5d@F(`$wPs=j*=`E|HZQ7ilyMO=T+J-PjuRCINI6qse|_jX-XfVzR@S|zAJBDH=jCun?(C|eV6v5*ih-T>WKf^SDypk
zt?fx;Z2to~W5=;W@bPBS#ivHzbr-@+-bHu0@-OE5ALT=TF7J!AHm43}kDYH1jymTA
zrttm)^7x&R49T#4hJZDP+WiK3gWPnT5wP=Vzfp97i%TNxJwC4E{5JBN4m$!?QA4f3^V>xk?gI+9Mh#`*`u;^q6FJV)qm
zJm-$U+K(N+YmPVz`E5W?1gq|Q)a?sRD?fH*Olhx@M&H+~+)3$-o92WT^j$Wm>wKVj
z;{T}IU7p=%>e_v#++ND5t-E~OD4x|lx?#3=}rjG2NzwEEcmo2`-<|lTg
z)sg4F?Df_rop`(Yce;x|pS@_ETe})OiovyF`@MCZ_8(@G?!Dg!tbTiS^4vVtTgm*R
zyge?yD|)~;*@v&p#pl(zpbNfY&imAIj;Wk;Id#~~68jMBM(@*QW4jy#J!;P0bVo#Q0Atqqy0bPr~TZz6N_jWT6+5VPdt
zBEDsE_YFw<4(~Z5&C&&o&nD(b#mRCmarOY>|7P-XFZ_p@Es6hJg{|Hu9jfIVitrqu
zUWB<2Tbn1`+Lu!Nc`kdQvMFASUTdP0?q(u}JkX9I4~&YRS_ikVPv+gtq`t^!kRS0w
z^0({mptl{F(ir`b7+=R)(Y+sTA8q*WAz@FCGMzGi5qP|LclEVh=iSb;xL;JxLXMqz
z_bTcrzLLe+(J(PZ^+|R;h7Hi1Z`)1Uz*d}eA65fxOCM9Hukz)5cUO#$(nt8{(-Y+T
zWm$OO`FiPTv+G;vd=P;;TV7{U54kxdM&ZX1pJaAvPHmjz$;-KI+b5m->gH;*3!QuC
zUT{fo4f_FK0LN%c>2DG9O}5N7-RYzHP5GU?S;?7%?cnvxE40=(PP*e&owrx{EfWH>
z4Zl6NkMz)Z{+2%Q=#_kj3%&JfTjO=B`hh+BeK+kov1BJMQb0eEzj}|BspC6oX(lGV
zi~8N!+TytL`z+{r{l}CMKWk-YgW4lWkCu`K-lhJyrRPU?#TRq^W8u<$WdG9*zUg0q
zPxj5fe(=uioZ?qg?w`Taxi)dW|I*zD*fVF(bW#Ggp)c|ARQAvM;TN8PKXxWQU>fIp
z6Yv3p+-vXLKh+igpTQkI+icZ-h~V0@*b4!^#RP1hIAg6dFMar$qgUKvu}$9-+>US4
z7CbBZV_OcjS2hSeJUhx6EcVL2KDMBgbBg%jZCUzmV_@_H(uKD+i+hWZ^(N$8K9pjR
zx88zXqW(ns^SEf>eu;uvk-Si1U3yNYSsKFT?&CLv_H!0W9Nh|c@q=yu)>@Ap5$o!8tO@DX~Uyw}y1_W0TFVh_l+VWr$D@C9;onEjygNu76}
zWm48YLxb(Q{aIr6_<6_da)YCTUv~KVulPDzpG*y=*mrt=!kyj=xzqdW52ij@!Jf?l
z-luWz_XN&ugwEt#n3b|K#NFQ^@>AMRz2{r^a^_yX#*RV9WP4SQvn!!Qeg}%Xz7KLo
zw$9&3w?o|Xt+NgH2SZP)Z)@DX&FzZ~aQpTQyqe>V`2*|?45Y5^*->BXe0}{5c-2?+
zF-Cur!Mz_FS8;LjljAmeZmFx_Tj;CGGvj3t;Q^5tHCvz5z8#|Tp
zz0baHe9(bf?95Y*4!^v6$EU5zX^X6SdfaWL-Q7FRxhZ5v_3!VvcYM$RTPB(RkJEM=
zV=mjWpQrZQus?-`B`4oO{*3y>_#CmzpA{X%UIOO{vpk%__u;b+UE5;1pL|f1Gnnfq
zQbuz6I`E0*GtkND=;jUR==JF8b?jwL>m^`H{&1NCqGlR6#BCC|_sX&H
zq9rsZa>_lw%;j4{(A!u&cx-60Bd^Bd41Ms)aodA~$8MhFto7wj-TyJag$bU<>JRPT
z;NW+*M%B4%)%DmZ`qLh9=Z5|tDQ=S0K>%ILfphr5U`A6rIn*YHm(@Gir-ic^hLK$nV
zv%XMTDZJRc#u+2M7xAuVI&zAiG`b=9!8pYe8iTj$H(}bh$MyR#*=;)auQ_EWa$)NU
zYgA$g_8RrOv~de`G*-_Ut8WLJR^86EKW3@E!KVDyYf00)`qGHKNpbsMNB>nv<@e)v
z_{*XHuZS;q!j~f-^Zglrzd7#QGwH>~6?1BW*HL&q0sKwRTDx?IY!n_o4-eI56dZT)
z9qxe%ujhR-A=18rv^DJQ?f+M+Y1$PIzheJlnhqcXW|hO2F~~rCMW3cPXJ-zt;w%b(
zH}d+b(dNTw4nT`#<
zfjwr&2J81!E@E6%r;eDa;sLGD!+pz~C7>G{=y3lA-%)re!T0OXj?Amht}(AqulLBBhL%m_Bq>Ox6k*)qjhfF
zu0z=tX!K$lqDOm~ic4y4_T;Tju@B-Ghq#Nmzn4y3or_RkI8SW%r9j_G(3d~)EOY>=iwAzS=ZQnZ4`gWkMR^=7gAR|e4nRynCrWzMeoFNiM8C?_6y}xuUzl&;^(}p
z{v4k1pw_u(Fh8EjJekHA^=GUGVB^w>XUfKPo?R#x&!{IqM)6GSTYJN|9C`etHNIi{
z3Vz3lvtgUxaO_%0bwacwUOo+-8mrts{PycyQ*YO2Eh~GaZ$b6#P@_wa&XK(ZEivf?
zd7oiBT4|$zwxuI`fHn92^e}c18!Nh$wwxGHJ9?sds673#jmZ}4^W@03*c!8K-z3w%
zGW~m;6B-!30a_*mx#xMn2K#&EYen0N9d^7|u}kD?^snTHAjeCTM_R0%Z{$V4;&I5p
zU8H;c*wcd2o<8;TOxyqrd47xNA>a5tW`a1Tcm>5j!*|p>O
zW+2ZwOQ$;=21Z{6pWS!(g^rAQoVlvSod@3sFLPu&zg%R;si%WiaXRrd6Pn+1f9JP=
zG0>c;dwH8H9U2x%CU&!TgH5vebBr;8FXcSN5B+vTBf64fo&Ik};CI`8YJ>Q>YET>Y
z61~#d(pl)xOmyi+bZQ2=<=VZV6Ti@TKGx;j6T!HA9v}TZ&n`(u6mz9NtaI1P1}Gk@
zb041Fg3qHhX1`W_WTGIEcgE}@%6K+pEA()|?A9yYdV1%8)z-^AJn*4T?LdbY*Oh!W
zB4=vTa?5%6Y`ZUeMY}(C+eOZ8nP!Ye%YKQLI^AOgEibDK_-tC~%MbM~nG_CWlEtGV
zli(0-qnK}HkH)&`ipxk=8+f<#`3($>jpXfge>aA}Xvf%WWo*97yV}tG0Q%;v>u*`Z
z@2FyB*OR~b8b@aI9zh=SuW{r}@8fva^B{gfF}_Ias@KQ0Ce@CQaV9OM-#cM1qIHt|
zko0I1_Rk)-O~j(4!*T2tPtoC>we#+WR^C4Dwa~mB1Am84HN$E9C%fHq2b2q8$F-)`
zeIuMXweK4#m+n%3mfO#+_&ey(xPhbGokM<03{7~ZczAqsh)pkT3Ga9p@BdIaG5y`kw^Y(=h+&JcA(pFiH2zr(>Tn&hJ|rHo>p
z9WhS$Hi7Xfz-P?iTZ)fa<4$sIUh7b2A1pxJdJS~Z@2g6yTscyn;@SK?OkS9IsNA)2
z;t6BbZl*gt8OXTX`%){gT^+L1d2gb3POEGE;%gn>=rT`kR9|D6#Qpy^pL#g&1#J_^
zx8;R8whmM0CvKhTJasP6|C=$|1N8jLA)K#ixYn`pX|&zE*O7yM!2bO&)sc)>+66WIkUFzGU!S
z#qa)!X3Z&@PeiMDHUyqEz>k>vPTEWKJyyh=t2t~^q&?T|d+Si_Cw-5>Pser!>KD?_
zqw^!%mdQt>KF&MGA>BCz-VCCyaMd9r_S&P}wTa*zK%VV4x5?j~-F61=Z!*VP;vHut
zgio;ay%t_}<=trHQZ%2n68|R${|&!WcKKLvzTDyU4|!MLmqM%J?Qg@A&-r5=aVWhS|V=jb!r4Skf5TQ4k{2!Rt8-)y
zPJO>B9LoPM9E+`|^P47*p-%
ze3Lxw=W4%FbJzWRo31feJ0a3;BEP3^BE*LoU%E+*dq+xZ6Xc6r`qJGbjy^>|lXqE+uP{7uCcek45jcT;)xe3yeW
zzn%}x55uEktzpk|Y)D1BvHiuL4{_ePcdlta@?M+c$jAH3Fw-v@8;!RvhR5+6Ln2aoi@X+HSiR3CmHyu}Bv
z^TA7e@C+Y3(g&yc;DZG|{62V#4_@bkm-yfrK6s=LPV>PBukqpc!CQRrIv>2m2hZ@q
zBYkk14?cLc55EuI;)B=u;3YnIh7TU;gVTKQ!6`ocK6r}{Ugv|C_~02nc%%uNCAs5y+H@|XW-OJCtj&_+(fh%2jKk&c1
zuf;I%IN6!6C;CU`w3S8yFoD<5bb>VLU
z>xYhn|2AOGG}|z1>#QHTu)Z(-sSDo-{0kSp0r+<=tn&f~T(|)ExC>7KP9|t9{5mhd
z53Jbm1mKHYSUw!zIN0fVz>{2fH1LfsEPwhA7aj?`(1kAre!zu?1Fv!6i-0$}Fz1r9
z^uxrWVF>Ux7d{ub#f8rX{$Cf)2L7W9X96E};Q_!w97y3g6FAL;q|A%$r#1kD4fjY0Fam9RHx#jH!V
z22E=qjY#vsz`cebosH|s{#KtStb_*3!>;zOvM!k&!rT@^e9zcp*5}Lq)yraFMpwN?3mq{vOIbY$dGqmy2863Sq(4jYO^{1mO
zAFR-u0aIsv;Pyjh!^VWiQg-%iuk1zU6Y@W?G9KpOa3J+y(0mdIamUt?08Z}{!9u`K
zg4a8nK*_OdM?3yXr+Sl6RRec09V&z
zn(6=LR<3!124Uz60c(qux+P$}X1zd4ERb+8K(h(8L8~o*fRLttv^y|2bsejOb)>v$
zg@_2eZM|#f+BAurd8tsdq~PseS%rCh$I2CD+Q(Prc794)g$_9Mf3N;Xx3Ml!h00{U8j`I!D
zRinfQa(gUFxpVkEZ8JFZRKOIZKEV;W)Hcf$r#4$=;oEkz!gaPOHm3Mq`1pa9`pbaX
zYmI6Rm?r`VgWcAteRwj{N`2cJwIyiP2416-gG#tkO*Td*VU!tsiCs6ypjEgj8L{1*=llpLqS=Z-@1iQ_%kwe2@>bn8+
zf+X_cfQE8ipjb3LnQx8GO+~Bbq&^j}%EM~|=v4;bhgL#ez-qPTp+12GDzr$w-o;)8
ztPgyeX1CEF`7n|Zdbihl3Rt+~)*NIO+SKX?R=6PMPyOiX#kZ^qxQpqEsavOi&g+~Gyjn-hX(_Y_&
zPXt>M%)<%pd&=N6#Nra!Rl9utxNvQfS!bm+_JQ-MM3%q6_Vj_QjJ18}VdzLA#w6{N
zM3iq_OCPf~A@!Gu=81&K?;ssB-HND
zSte{uI2W5$oO(p&Fb(ikt7F{ylLS-g57z#*fXzzDmoqm_UT>LsFh;nZeABYFStGOG
zKEuol#rmO#seAjuiNT-rLz&V@Mvh587)T|h7R~O*WSjb7KU0^G@Mb@=E+NG4TY=lRt0^k0s;aCix~Hn5
zrmU(X!>-s}4P}_Z^0M&4in&!KRriH2s1Dy#QXRgtl2$GW&s|m%URYT&uVV51a79h{
z&Z^2qDsg8?#lo_AhB|J`Bj(-5iwTD>4NqN6I|~=8#)uoH6o!{nl~t83T~<*ILDk_!
z74yq$!sTTPmxQazsw)@XT^6n>uc)R}<=lm3i$;Kge-~7n@|v0@)nB{pviX%G7FCp1
zRaRHtSu>)va?xdX-UIFhmrcH^r26Ni4c~%FKz=XH6wsdy`!?TvHjYTvE0;d}`(K;zVUt
zSiGh!MhYI3R#ugjF067HGO4_*bb-yhJHwO6nRMOE@RE|6@^IO`71cG><8Qy9`kUsm
zIi{p)(dbcT^7KMDRy6ab8w#ghKc#5uWOJ#PHme|i=9I}rvkK{^sjdN)mvjA1*A>!}
zo2Oh?blvpn({7s4V@4Q0BO&S$%(#Bp!Wu^L?y`l9aOHw!OO#D|P1Uk8b7#rIYFen6
z7hYV+uvaXe7Z$1Ec@^}I*6*`ly_RN9pI%txe=#HGl`W|raaVQaVl$#@+2WdtMP;Rx
zi|?$M-)-8wvb&x1nNHELQ&t3(-Z@`vrUZ`;p(t5UGGbBnW%DX)7MImrDwbbbvSi7^
zl4Xla%O{vSt4bD?-BVe$V7$4o11`F|tg5=Aa`AYxsG_=>At`d{8gF;_!jh`ea>`dB
zQpQwP-#g;+ks~g@!XU|&r6u%uT;Vsq_BHpdEVsJi{<5N)@Zw?NixywRV3wAZ%|p0L
z?yXp~Y*Dy+*^(udRW*p6%9#=7(&1*raC1Rv_=4Mvgemue>S3-Dg)0`@T(4YKT3&P~
z17hZv)s)^dFV`#ZHDyPtBsG_rt8K;82udr-xg>1syIp7oIz*ci$r1)^o`3W_^{&2e
z(cH>~T`G2BUAEZ9>z4K-m-rV=oH-?b@}!wJT|aS_nORn{&=%#cIj(4QNQ#ChJh!T>
zWL|02vPE;N9Z8ark!)2jDJ!kGvjVyy+qODzsK%(0uMQnwxNvSs=>newo`Sce=48|k
zwuv1rhi$!a${<>5J%7@5m(uh-6{uv@J(t?XplH^VnKw_JH1&pSy7aLlz1tpEmsQ2zN#4bZzp8|KZzJ08>-RbfGb_O(hdc^@55eOn387qpmYQd8S*+
zG2-OTTyx#@iFD@HqM1{!nL4X*ifpUhpRObond>l);+Cye7zw7a(wb%BoFloVUMIVB
zqob!?QJ#dcYbLf97If5g2Ffke$wh~SCk@Z!DOcw+6LbudGdjzvt1c6F7hYCfUQ$)&
zjnutNHVewC7LTZ`MkeMhE3I*@qq+R@5hHE$XHXkkzkRmKwldZCRhQN*96`O(qME9b
z#nlT-uykfp<+6p&Y%#A4&tp-=;HFu4rO+cr$T2!*c=GO>&hV~KaD70-E!xzl+
zS)W$M{w)nyCsyo_?y=7Ql%F6A$L!SLHJt-9yl>LuRds>w(&5#czp!#{$wE&$9rf$bG4)0=*EgI_DS7r%du#wVv8QsxTS4u(V}9DmD*TQ(NfE?bQfEy`(0~&|6Kl=;E;^Z
zKIc3uy7=<0%eU5g*Y#hwh(U&@7sF95Dx}khNt4dJT&kjaCuUukj(Uw5Mg|}3s&IFC
zusfE@pP0a+DuQA;P35x;zwF9pOqz62B*JUtq>IwJ1!)n9l=GQ!IW;R`DU=xz&Ma?1
z)y*Khd|;p;W#{n6A=E~mkB!=acT5sA(gt-zSD2?b~kxsxa>X3ivH7Rl=(
zCPRIOvZ@efAhH5<`O#m=a52_^KFh-=Y`il=x$#zbEb-@8y?MXRbAuLv?oaR4J>7B9
znrSwI3IH}y-`to=hTNSqaLpS~hf~j}K|-6jWuFI-fP_A#@xe(Tq7CnM@kf%4Fund^Us68L8541C0T_>S8|T
zqHW-Fmw#FdCIO9>o>l;+S&8Iv25SoS&?F(Pdh_IqUf^h7?(=vr!FiZTlS=VPlWubn
z(v{|6j!0tpJhUei!~&lWqb3g<=;hT)N9)43wyC2{Hd^{H!Dorcx0q`nqnI7#nS=Bt
zguG*m>S$GdeCczFy;SZ;jkCx8@p&;?H?KT;FXm#r`C^R3w`nBo55@7-RmE2$P%?19
zaPyV4&bSf-Kro0EjV^Z#)borc6(iiJLdOb$%c1s_*Zua
zn>;OTaPeST#-~yKc&y3O*a*A&S$Xl!JLlInCN9o@eCHB4pavNNW7obHY~pU>{B
zb=dSex3}Krs`YxE^{$$l4yUKCp4Gba>UxLA;d49doL-mPSzlwTwYxlS-DmT-eAu+-
z>rvPyVAw8Xe9w$yzS1TZ1tEa>B4{yIG~4leF}A4N@q01uxV7W_BEP?1j5{FsZom@V
zT&$NMAXb#w%P->}{BXPl_S65s*dP{5D(9$W|oi2;?EivSG&deVMTe$aO7@)j{HZ0BeQZh|5Y|$T$w>^+WE&A-~O#gE+{x
z8?r%z?$;5Y8{r{s9>!)vRv^LGK*oJY6J!_Gp4V~g$C4!E;w6l2=Qsd8kh_D7u|Fa$
zSgt<@a^7{|4DwJEx*_8@_?3X1wE{a@kmaaLn;_RhZi74wIRv@=ddBubCT?KtAmqvf
z$b19)KsRC^1#;yo@CCWyCZrQ`_btdDWaVuL16i^bZjd{_0lkoi?nIjQA-{JaZ;%yt
zBQ21D?;&o;{*Bmm;P#uqCuHS=jFrBL1GPUw`9QWl0{xI{A4NFGO^;!58*;}JSgVF?
zeiGb6PJ0UJgchLE1rE48`nDpd`)5FXHR7l
zi*b>u?9no6vPBo6x_2jboRA@5`9=nuTn_U>ln-`*K#g@=7+|y9nt;J1Dz~O{_#a
zsJj~Z`U)%Ahc-~W82>K@FN>M=95?ELn-v8-toWdZjUV)~qKZydJcznKgg=P0atS-G
zHNY$f!pyQM!mRDrvEp;0Y*Klg6(8oNkB`y+jmPL8r7Y6}nens5g2t0(vmc1#F7(`7MhK^QIi_C|Cf}{3ci&~BBuyPL|TVwo%-v%i&OKhT@o-SEH7c@$?YVENbV*%O!5H9!z7C-|79enlRSr{xqMt?
zKbvGT$wef+BqJo(ksKhondCN-J4otHXAl7~pL-%CDANlqhKLDEKY7Rh-e+et1a
z86eq9ay7|*k{d{FBDt01AjzF1_mJF2@*v40BuieS@+VnNvXW#S$p(_GB(EXaMKVq@
zL2@n0^&~fv+(L3Y$sv-vNe+`dK=Lrj;y=iAmXS1<_w6THA6w!suZynuH|vz&4mdvb
zx5wW4%R|m-@10-ue8nS69-4j58RuRh-w!UA59T>sGw|xP-Bvz(u6RglW_jMvMR}cd
z9#5U4wn}%pd{r)2wX>?;>vL7v_1gLxz20Z{+G^QF9{yrhYc$N?rJI3Av&>0WSTUd&
zPz)#r6a$I@#eiZ!F`yVw3@8Q^1BwB~fMP%~pcqgLC2+*_w8BOIzIT2eMv5-Pz%e`8}FH7LV%gV3Vh%4VIoRcT|f<-Trv2$=%g*=?cUDga5@(f<>4|a6xjSJ_aY-<8xk2|0@vc#U;Ws2c(@vDFh`iNP_Yq^394smDW7Rr#nA(;JI)a}D!(YNm}wMSZL*ye#Mr^~qw&
znW1V=yf31oJvsbd@W1OH8MUgt3GFri76}DginfZRW`#U@okqxVbHMznGD5CNHibcJ
z`M{uT5UB*@S$UwS-w0~%q*!9TiI^)|>^4pF^!BJoc!deDp#t!fz}=t+hiR$oY}}j%Yw{g
zr*-!BY7smy5)Qco{&=6(V`I^I{U>4g)jVBGWAUY$*BxEv519u@Ef#lsmU2H@XSX}*
zWr-4=4On|IkVi!IXVM*Wf)E4mCA**c%(UTf8e8UZ$nb*)YOFi!D=&
zUE{$qYeRX1zP#1cWvHR4Kz%n7;&XdYlnYzhY?>II5a;X+&vpKAOr*I6gDuKLrfZ(`
zg9>F2ggcQSG0&Xq;6o`-cdOwp2DVX^d9@w|Qy`Sk;tyX
zsa!a}ty+^=j}$^{EavYN^BhiQZviy=Loq!XZ!~Iq!cqX8Q9b5gjuIC&XiWh$)a~IkgVX++a>MN1uIUs^MCOMz6)-XV)lH1Y(VT9{rxo
zuzAi_9I{Uy&J3LAlpKAw7-{y8Ds%&dK9~`@Iu;Li2jq9BeN>%)V{1?layUaT4O|A(
z32S<%lN_j=7<2HIiB{_E@W(YbW+R?(DCWmpNQ>%Xq?K7-lRLc2AM(c=G1)_b^yl_c
z?Fs1aXyX#@WqpR1dO1F0(9AuzX*3uckipvG^>IBK^oQJWUBtLe*yF3mtLzu2QjSCpk7PJyD+uFu`>kRE
zD@J;b4@#VxvijWq0CzYn9pYgu6kz@dn?#Waidum&SlF!LHg1nckHxr$egWfQQRwSA
z=vb~t!`x|rBTpb46SK)pN#yklMO(N9e)oB~=WPN7++MG69F#B_dPw4A7IsM-#>9Y!
z-XmeGPmCAC9Ql%A_Y3F?U;yBL4+@Amkx2hxfkHu}C=$gytf6;}Kv-%JV@AJ$M9B35
zp;#Ets{mj$&e5hMl6VWph|#l5=9Qox5*25VV89;|x`qS}#{F^{zKg@49`tkxX7(5`
zhz|*rw*e!49PTHGX2jt^0hbcvhXo4adjn31aZsDgrvb=kKgU>I^b%fAI1s@XLq)?y
z3$JWy(Ha-Ex3zFp1Kc&{>C(MgpI;A%JZ=(pdb|f~M%>R9fny$bNWg6Z#-kq06g@I0
zgNBvN=a2!V>n?)H8nA~fdYAxMo
zO%!b}-j8IIZm^c_vh1B$e$6_It9Y<@wPlxOUvcY@Wpz=>R?F_94HLFoHY0t9iy97D
zT3bs>Y^57YR+g?TnT6;|_f9-CanKrHTeQWpe=<@}MBI5IW2add^Ujs;fIdbzLilfl
z6NJBTlJwtCSR*_@_;$iu2){#kdxO+}$){xaLBd{v6Krv#bYDsC0mAnXju75Vc=g57
z|DfT2p2RN`E^CtbPlOL$Dsk}?8Gp%qiKi3ZOxQ)Zp;@{&5pE^yCVYr+obc)|OaJ!}
z-b#2I@MQ42hww+_zK^hbs!Y$i78!mk;X?}~KH<~SePgS{VSy8@;WCNW5N;-XKlyJb
zTy!!IpJ4k5e}?b@!ZiXjc98HI!W$M!{l6!?s7>P9X)--t!nYG%)GpoMAzXR6#OI$v
z=_mY6!h5fj?gt6m7D+t!GvuG}2EtueN%sc`#|i&}@Xo8Hd&6gCeh06W_$gq{e}g9R
z+0&)_zQqzp1!gSZmiT?bHjl(7ohs8);g$GK!svY%)Ux*p2RbGG@@dll5aA7kySk+N
z5yEl5#HFW8|BIJM93&hMNcr%OVmVAw2IoiKl%|`acwv_#DE+
zF^N|RoM1-?zeIRVT)Ln2c^*E&rguwx9pR0H|C4ZCk941UhV;Li@U?_1mPz;jAiR?B
z#0ptH1HIBc49w%(M))bhC4JKUgfpdkobXqHdHLE_NcU}oXAypl@M^*zQ1~r`wXC$rzK!r*m|^DWYSC*dx_e>B1qK5T?1Jo#LizHNjn2=695i*V&_QvX*8m#md|
z1>v3Fkob4Noc}|2N^Jjv)bCv<**@aa`DeE+@D{YJtY2){%)@IC2%
z{tW4V-oHzHH{mYA4-?)&_=NMM|3w?6|1T0=OZWo9{eKJR?#KK)k`_Y>Z<
zQ{o>JUi6&AI|vW%me@$o>X#+{CER)Z{e;h(1zgP7^gl@ViwIW|ZX-O4uuk|I!pjJ+
zA$%+04TQf-csF4~|9-*`lKTHwl9+}8)1X5IANnct|k0+
z(szKck)9)j4gIBWO8rLtnNHZKKVHH{eTfq`%5#A5dWvrkVIzI}2>+1W4-z)Yi@hb|
zH_B@fVWYgZ5;pwrHu*nb^3UFu`kq95r;Sgr#0L_WTqyC+2rmGhJf5-R{~_HUCp?4j
znX}=4Qi4S=o3=2S1}~BN{=)HOeE$(Xz5)0I#)b(O
zBhM#T%J8q`XPT5&VS#@zo#4DAG3e$P|I42>Cj62KpCLUb{d-J!qY3}Ygx@jYBBVrG
z$@r(6u+M}aHsOyGVd3HO`uuT6OJq|ES*
zCcM&w*O~B}Cj3tmb{&_gztw~TCcMFfA2i|DO?WEWdU|H1qt_;wQ>GU0LPE7HTyG2w&>KPhl3y+1eM=cIqMI{EXODg0p*J`R0Tdi>K(
z*kQsKnQ)85$@s1`xd%<|H<<99CVa06Z!+OWO!!F?e%^$CW5Rn)_ze?&*Mtw5@IOts
z2wge&OXk1Sgr}PDsU}=u!j&fMGU4-0xWR!F&kw5sc^6P^riUNZxz02NM?2A(<}GT^~`pG6~K#xc&Z>q{Nr9J8+Uqnl$^
zmO8UJR#j<-HOHzd&RAQ*QYk9)|zSQ^T-G-NekR^KRq~F)Pf`
zyCqYY{2IL}P@Zj`LS1TAbp3c-u!4GKDDSFK-kIzHOv+wwYQtu6jlisl4N92vO@tRK_ir0MNG`!}cWAJqT
zUGs^9??S{7h#z&=eBz9|6gb>&oNDKiA7|%MoMYEI$s&mN?scS)T
zIvrQ$a4cP(M;HH!d>JRu`BC&7N6$0Pob#I_;;^|Elc&u2RZHXSxA-0B%7x^q;O{r^
z2R6iS@(4M%<7daYOdcASK!iv?CN9s1rw)c|J;@W{S+{smms{-B9o-?6h8A>3m*O@{
z-0qYo#I>-`hlJAv%U;)o2I}kO*Ii=aKo9rnwA1ehi#sEv2c-~=cSpoUdO11E71rT0
z!Xge?leJ}0Kkls@CBjr75n+BY*{hA1M4%pHqM0jIm}2mUEk^iCw`D(O!tc16?iGuH
zrX{C#ekt!0(@ygo{+I#3#fytRTJjcWUu8skXl?w
zh2F7pAr;qgz3!-|OZ4~-QGlNAXcV`?wP<&UU%S)%UeSCU)!Z*8m0AqZ<8C3=4x&0|
zFJ_QdBZmpR!=#P!wsH&Z**CS-Xm~LVeIkBoneM+6d^(%^N^tgbC;UAQ&HO-H
zyVh<)1a0-2aLv3{&7-W<+U?v!O?uP?&0E^Ky2z#I3~2^dm;Nvbx_}Yil*`VpF|l!o
zV(kosJKTZ)iPCaZ2fG6pY3BdtCBB@K4@7ux>VdOk9n8E
zE3RPUc6My6l^YdOGYSlogciJQ&;-eA6{lL(bJ4N#DFadx4)U6f!P2P8+4a|+YyM!*
znwJRuHvV8xFFq!;P&lN8@PJR$?-^^R#BN$0UTfejuY0W8T9=5FiUGkJj)!>vg7=S7
zT#RiVMUAH}9@fOCv@x%e@#&G6j0h7q{<;!ohhxnTTCK>C7%_~l3(pn!{GDQ6SSbCn
zC#J5E^n3N5g2o|8%8`dLw+osyx7A6m>UlHFDt!LE%bUem8RNwvzb(AsWuZXW?bW)Y
z0X`wMiRgLV5Dyzr-LTih^;ldBhXQ@Hd{LiP(O<%vIOf~R>3psx;-
zcbPn?&RC_$oX6#Sg*Uqz9c|%)imQ19Kh$f%SLPeRIOdRY5+`3qTi#C0{=~{a)@-`X
zp<$vdCo{HHAr=gpZJSxjt0q>&3zl)f*lTuuu6pIR7@Z_4binN;S1TiK%<6J;`dT1ptX{BGszpLbjP0})XAdfp?xk%`p
zpL7oKmyan-$~J)44zq1LbJ}7lHJ9IIn7-bi5aZ*B1G=O|}mk
zrY)YXG)KD&Z%M*CUW?JActZ3jRWz@b(VFB$d=fX?YkKf5skh0C?`6NwkB3Uf8bfB0
zR*U3=J7eg`>g4ilS*>k&+zp*?v%T7s;-l!!ixQ!hl7|O)HSAG|^$E8Jlw)1xx^6w>
z8R3H+-}t32r!T2Pm%F$yY6`Im4HS*MB3}a^79$f3XN~F
zh*wYz?KM(6x*Yt^laU;>8~Iy*e4sK$mNE6;vH^;vSMh1WmsBudV;wZj#fA?$R9yZ=
zT7be9iRUra^IbggZd3uZwu*viuH!0sLdRNh@GxE4vUHtDswW)j!v}!e6f0Po#lkn=
z8!?ApaD3;(XcVi@gl&;oXAYtP8>xN@~CSJo(;ipPcBB(YAxKhSk=
z0eDI2w((CuY(jU019+*=n7D}Q>JXo7sf>-e55h};yjcn5u5S57m{gx~bM<0#JvoQs
zzU6wBSNFNGtfY1DZD>!lJJ=zYAPZQeypmuYh(|th`8jfxpJU|mt21`X$DUBx*>Xzc
z5}H8?f1K6tp~Y;uRzCK~cwsr}Q1>|BvPo)UgCn&bKVp^0MNv+MoO1KAm+!>#r9bgP
zGHSb6fi7f3qS`q{lQmeQy?gA}WJJ!t*DxRyU_V^cU9qN4Yq7M}f*4}S@-fya`L25Q
zggwtrsRgT>O<3JARyaj&T_S3VGo}Z8D9KK2!D1FAUh?EiW5$xJ9F3f!JHWa2INwP(
z+~iVSA^QA<9SdpCRu+edZiEE#Vi>s*=E+O4!^!MID2HOPneSi}Fd};m-}}eqZwI8?kof-EIVb4zU<%?AL_RQvF^HTTgLcI2ufwUpU0f1B-C!
z+mw7nDMY?`m)WaxZAr52VquZT7Yuv5v3*&nxM=i{>-RxCK^yiKHj4BiO6+%KWZ)=+
z`Z4Sdh@z8|2czg@ERC2pq&T#T{Rw$yqL4#Au7`+sL<^u3GiS6=TWYI?|1pr%1|H8#
zvk~1`r;F&^IuKbZuIz0cL97v90kZdTd6R9>NqmZhYxE^z`1R|t0wf?0en0Uv#bLS$j{E>1^{6!d7mQ78TjV;S2TaP2lk2A}rI?JXm%cefd#-1I_
zk)0w(jwEHL$&sBXM-KJb6gXI!>WzZZDXoxrNYV!<!}A}yk3%=I!3&hz|bSytc|@55W4TXDy%m;V&}t^fE_&VBrjOIMxNUjE9~H>VEH
ze_-#Ao_+JP{i~k&{6AlgoVaS)*Is*fVCIuIJ#poujti#lsJh-W^MeIf{rR1aA2eM!
z`{_{c87;$;XTJV`b@=34?mZlxT=JV2KKK0vU*B`asu#w6`1*SfO}qAUdoDlpw;L85
zdElF0pR&;+1
zeV;qH-+jf&%dYIa=aK4HEIn_2pnq!b8&_4oHfQZs_uMvBd$;3T4U_FN-+Sf5OD|vW
z{Lsb^Z++>e!&S%K_P~V3g{@Pj-1l#Gw)xL`0JU0OP{{@z8AOH-Q(PWj`6_*0M0J^0;&dhscL
z5AKXMEO7tf^~;+kelY!j>&TMV2mW;P70*2I_Y22bz8@F<>b>tdJI`FSyZUF(KKiY*
zfB5zezV}^&%S-x`v)#xbIJV5v);Y<`P1q@-1*kO?tkda*B)5??RRgw>$&BQ*tCN`
zKL3cjXV%kK#Xt3xw|~@MylUIj-jCQR+vdDm|IPdEx&AlH2VT7T?!I2jhI##0eE&<`
z_cp(M=I1UeyUoIG-8*no<=^L>{`TZYUq55VU&7DKy`c5sXx|@iI=%nZXHKa)Jng;R
zU;LNrt=T&({_CL^-w5mTU(lK+{LIs~^X&^N5|`@twK(s4@yCx@U$B4s{>tv#?tOk}
z2fOj~O@lvuCH$RV-@W_ApD(%lNNMna=YIDef4lP+PoDPm`*+N&cB~wJpzJG^SN#2s
ze|+Jp+wYs{+1jxb9U1R_L`U_H*Z6Z`49`@mAH{%TKrx^gPz)#r6a$I@#eiZ!F`yVw
z3@8Q^1BwB~fMP%~pcqgLClTBp{rDz-J$x!TsTc2NA^_3nM{J(t1S@BjYi&!g{M?^=7WJ@2#k
zJ_Bt95gFM<>Pm-}_p29f#jd$7vz
z`((^1!#~YNionkvYvi!7{y)i8*{m~U5`4cQQlbBp{u}JUt
zL{vM@rl#hv{5Qh$QQ;}6JJtza#pNU5uC_dK{Yp5E)=dixk?lCjAFUhiwWC8u>qdBy
zl@y>r@3aaEP@tu(f&vt%7OS8DMIum8fC3%KhM)jNL7<=jMJiBGfTA!^P=ErpYkg3F
zqBu}cfTB;Jpa4bRKtTZtRFCyR0g949K>>==KtTbDvOqxrivEFu0u%!R1qCR|0|f;r
zDgp%sDH~rPNmL%1q(n;NTL(b)O5-)Qp%AOa#%RL$jag1
zC5ghe=}5D-4HcEDjkjUk#%pV=k9VeLbD9;}d?WG9OwDGkQ;tn%_73yO>CC=izA&BH
zpS(PCAb%?|bM!ZZrbtOXX<%#opRm)x1o93A4ae>!tw
zn2$_nP73pL(wXKkPo^`+lKZRilUW+Fr7s8ywk!}Pr`s;nV8@4oX_BXqS7c7p-weiU
zN_J9N+qJ?@Dl6C1x38@3)@>>ah59O$wfvU6vNDi;``B#&2=e+YynnXn9$zez+85K2Tdh=0p9dT3T5LxX|WTqxU7iB$UC869F87m
z5}z}N*QPUv&ynv1Lv6ax3e++l5u{E53iK449STq^3=|Zgz<{$MC_u3|P*8vZL(qnx
z0L4*(f>mL}2{~;Lr2Zm#|f1sE0FV`1s
zT9I~L!bI8!6Lq;_JBLjo(ms@WU8ZC+!`axUb1%|993~&b8YyX+9(L)3N@1_k7!i6|$J}+)_KF?-8EAT4j^C}i{gN_6@j0yif7!auCc3>~Ynw}`P&UrU&%MtjlxAmnkQfCh
z(26#73Q)8L3JOrbw+%tzf0n;|W+wk+1*Bvd`%CsXnFS-&TqF!v}N=><2fr0`Q7Y7Oo7|Whup4(xYBc*SIDhumae{G0k9qWHH%-5&=
ztAd7oX0sVG44wLn1u3Y5x*pa8|!0|f;rE)NtG{*|qnNaowjM>KOSe`A>&
z_}eGyZ=m28>tg>qlq)jp^|wyvv52fg$vy6`q;mKWe<0Qtr5LxESW+3xD=8n-N=izl
zwNTd}m{F8?8AOX`O?~rB*Qm*e)N3sG3B|fzO-PNVsd=Uw)fBNNe>jpUtd~UH&n05h
z%G?S&h~I_Z%V#a-Zv_?#2#TI$gE}D>6bmM6
zp@5)h46ATLE-1Q%wNOA%G>%m`Ar}-q$6B0_vs@QgoRG7iL)kb^$XU?R*5ZVm1wGSR
zoRG7i3s{R2au#%0YjHx(g6?1~PRLo%@vVgdihfg|pa8|jKtVxtJa{q>zxwC3RiYEF
zM4yRzZB;6MPet46I+uNymTFl1H?+M&SAe(3%l&uw>%YtH0H0;!W3n9GAKkn}%FCkl
zM~T<2elimfq$HXd0dHlo(!`JoI}j7C2j>P!q9j_ez>ji>BsfG$VqROLC-Jhl=fAEV
z;+YzFfOmu}ir<*rHRTh*~}tZFxV3%1wmF@arMornQyz5fwK%u@v=S@jYdlP
zRE#aC$IrmAd)BWASHVw1(Mt-pt%6kR1F(B-w_t)RE3VIkV?O$2Fx7nc>f1}F>~0QoE{C@F9ap!J&>WgDPxN#EU9Z~fv6XW9iO
zTLxyR6@6xT+-o}*{+-i=_36UzhVVtLpCVLi!~nDuNv~}`gfF(4C~)EZ_Yf3Y%GoeU
z-H`D{_C$lC|CFHJ*39NvZfgq(Vt#(8=RCyA^*76pe5Gv2UqtEr(`E2G@&}
z{Jzfg)9Xba8Qvg$wSNpjpI(XInEH)mFyE(AUb_yPc&W+MgBB$l_7=EqfLvTZtTf^`
zLMn@DFTK3KJ$Ah*GZwm00^>Lcjhm5hWNUdcm$1|ilhzWHIL^ybYc)iFJi@xpgzSmU
zTaDDsv3b+$+b^I;{!7|0#8RnvWaUKs%F`GmLwqz#s?cUOQR*?X+SM^|8p@?@GOR_;
zn#`b`5GNUL*Z6uMmU5LC-x^1oq}rwceAGgHaY6sBk+N7x48``^QK8X-(s*WfnALfr
zB+)QX+V%j&u(f84TQm*am&6k`fwsNC^%MchI$ozQLOBvzj_FWpInrv}X*rmFU(K(E
z%QOK-^t|9#4uZ;qdb
zY`)j_{GhvNQ0;5A9cuB>
zC+dSvTYwfunUP$b8w-0#(|Ni2&~d804C8yKo9d($_f~@08PT;~TK7^F8djHS;R!o5
zYZTU(hbrc~h~>s%Q1mU^72Q8nQ`f#@+iI57oDhuDsQd`}Lbg?fy>5mMy-KCBAe-Nr
zU!LFALqqmZ=1XOG*2Th55Le5i@@sk5TrI0bk74TF^(pO}15|j~Ah#E2-H=yXL$ndGu)j5=jbwKMcZal5y*_{&X^@9E{y
zv+~xE9(SE^**ri{*H#_#txDU*-fzVP5Obez5R#Rsy<7L_Uqd}&uFBT2q*Jjz(YQYd
z0e#%>j29*%eg%Gu`b47?ij$e);APQ*68+Dw(vS?U!IGJw$_Hx*oD7%5{7Q&XMxp5W
z|3=OkA!@^FT%E$p5?E6u>NL+$xgJYCT>NppkF9LbE{g7f5nh0>*zo}ivB1^eqDazp
zkKXAv8=C8=yLTpGWnTQ^9R{&J%c7Bz;2bLKAX>14r1HF$#da9Rxs69kY^7?wXg2fX
zCIYn!o{S{3*^qRua3$FVZ&;b6N0-5YX*K~>Wd+ehknub>F&8*bnb@hDR7pWes_k$L
zsxplHl0uxrh5A;sU7Lx0YmM{!e(ugnkdp8msxAm2!O#u`-ARa0(Ek(ycfIt6p^nkp
zg7HNGirWJP1t>6?+fhtmO=tw-Ndk7qFVl}E#cfOrybK;XKs3c|ZF+EtwXRNeOluX=@^m=hT9}>cejA#oJYVyWcP(sv
zF3+x6_%gd@Bj5gVC_X1bJKO8n#IjQ7X3QtyvgegHuXt>YY87&Nf^5a5wxJsHz4nXvVw(~D
z)r`b#d5h|6g6S;eFj=N?
zgXW@Y(Zc-t%+*JzZ)IaJdS2&Pv>>RDuikDL^*;_qJq0L!5-2D@@zX#-;UpZR_*ejQ
zLcn5{6T)cybz^ij>c@@I%7NKI`iIaU^8679pFhan&9h@Yy^Z~gJUfd->_OUB4@3R*w{r#u16$W$s1uzXUbcr=bp6WqCpTgkwlE%C*WHs1
zS^wDb$pAYRSn@^mY-?dLWE@bi{HiZ>4+xC4`E*VW@x)&m%}iE$r$K-7v|7Ecc>7pSF)EI30i_pu>k{q4=)n7^+L9rKaJ
z+_il@@>*fr{zm8U0kLsO#i#1w1`_Ln!SnZlI`c<}nQH)rUc#fmb+TRZGC!qW
zW#55zkK(nKc-c*?mv?i*Ypo2M{AqCRZcccit%&Czthwg;JtBJ`Hv@Bd#r7JTuG;Lq
z1*T?GX`Q6rb@%4Bzn=d+WZL<`QHBi4`GJ!u*nPO04=g^eD7tB%!^FdW_u9@cHbjBn
zIobTtiOnB2Q#-D~9ao=M;Tq0A$dz3Cl_z8JeIw7qbjM^HIouumxi;P+9F@O-yy0HU
z^O{9>n?=6euXLZ|QnR|LnA~@>dAq#7!zj{0MRrn0*}NWM`oHl(RFK
ze*}5{Mt-5{>hwOdi|RJWHg3$tsj!>>y7Rw0T;1crrnh=L-`yj7mQfn7
ztais+@zw#_ibL5q;|bUK;-SfI$^iIBi~-pg3;#om>>9>~fDlLW^+qKO9+1
zE-o&}g$aOG-)_
z^uBm8N@Q&nrol^y3+bJ8rXwX0Eaxvu8}6zW}K^-8-RkCl{wAW@ii=*XM9A
zEvqbby|}FPja;jidH(0fy1UYsh1wV~DzY&OquG&y7>6MF9mgoi#@Hh-hE~V+_v5
zI3^ThM}fCLkEmQSIJop(or~-`WAKbb>$`cTP~P#-1#UBEAJt%6x=c#zUU?=xxeQFX
z`5tpM-gUt|hB-vXfckdzsi%=C5Efi}0JZ?utQy-@?a3zAcWeQTQC#3wpt%e0`4+7^MWd{{34QGb(Kcm{@ZO1C#|S6e0qi#zT>{-Sa~FwaIBBmL{+5&t>(
z!bv#h*IjUfN#oQuMn=_-j%3urC8QH|4d_H(o)>GP!Pwu<@9%c%S1ryjMeCO${T`X~
z8LK$TVY&r&{qg%kofiSTkG!4OT)|
z_-5NhZ^-ENb+bJRa
z@v2{{`eM~%$gq!w{Bw1j^^^0D{+I6rlKZ
zpr8Q7V}XJK6psfA3Q#-|C@4VjWT2p+&xd>qWgCum2<_|CzgNCez2ZlGg^cPcMAZ-X
zfUT%e+`Atz3Ii>k+w4XCQ&E?C@|xjqup24&&mhP4Zv|rdX9es`W#=fS3u!*HWzA4yRV8$6C}GfVi3D;nW&d~Cf@oT?PGkjto3#k
z{ZkOzKMw6~cUPX@Nq4sWqcSbuABF&&xsrsPJ-B0Ms{&`*SD(O|s8Y)n$vmi?(WZSo
z(#HPur!WS+lm_lkc{`4`--?n`FJ}-Ayadt5Dk~mb`zNO(nI5gl6X0->TM$f67g!#g
zRZmX4#nYIyGn7S3W0m9GV|g)_$xZCBylrl*^%)(8cF`BJX@yV4Vy%A**$eVbpNC9X
zDTVI-##;Nvb8bChS6MuI#K2f%=yL?qQF*SHaCz4t;pVAVAGtj=xQi3a?%`YKqjKGN
zT#{eUIltBPd!O}t&rbZ_yHmes?ac28`o(5a^ZSdP_{HXPC;7c%d%vFS8ni(q^E6_H
z#&}~{pgIk$=5ERe{^g4SJe)TVO
z?ffmTol#w(!ivil9!mEwLr(Ofaxs71%#AlqFD362&s>h6E76_s2zxwpg_36+xl+lq
zj^Mf;U-_I8zY8Mfk#E35+etcK49FYGI0cKhoviwD)wAD4WeoZqQrG)~HzGdfFz_-lxmyD+76HEbUWv8zeuI3#L>6VpRqolipoQIJ^vC=uU+#Q!9BKi
zEsB2%^5V+twQD6s7OZ4lk$CM|c<$o)5LY3bUI{PAyN@%#hmaU%8s@DVvQ9giNaj~c
z>_j8D$d$T{eXKQ+$oBnhFLDFICc4SH8ig)ET5VjfRN%bApf>mQNUR{@4ESUVm{nlzrUtCUK<@9Fog@L`mPJjdyT__
zc`wvfUwSkrM9m^-v@V(vHrkul?B)W;5Eot5WZdsn!kr1jFUoqamro_~Iu
z7g+mwe&Bp(+V}J9xoz~DC@EI}|MiI1n7n-NASUjigw`CnxdMIMZd_hLjyNAu!1VX~
zKtTbDKLiR2Q2a4aP=MmqKtW+^?qoLiEYvz3Hn?}>Uqitjj9o`L+q3-ZmDfF+JHaf6yp#c&Na7on5c@4&{BSz9^pPhXThc*9w&
z^D-zM94`kk?W1Ok%i`H|vWJ^NmAMn$vP3pWqUN}^#wmyNJUxAfxhV^tD|>%BPA8L#
zd2J~Rof-e@{FClq@vQ~fhn#{GQV5<}jMGcJr?9A`aFM=`fXDr%q?p&oxSWH+jk0y9
zwQsMFeS;q0p$epav4<<%=bYKUAllmgw$@!jfx%qi7N$|}dO*hG()d;n*V4gyiKK2g
z4DJa%MsnAii2MOhjn7sM=I-MmynO_=>1A=a?dd98gc{r+-S757l~$1HTy(M
zz2Nm7FZ}wB7tJh0YiHkIvA3UdH@Z{*qnLWcR|wZF_>E@f0pp3b^{ADVy_m!C66Y43
z%8^ffW&n#yx4v;_rawXWhLYd}^$sxmEHPFN`tE|dh-5U7JC4*4VNp|e0nS94PCOf8
zrVC*A;5$ecPb!4c{TbK}($zpNF%1zGZMqC#)1}CCH`sJ{ciGR}q?~g^MD|7bhuJwI
zcgDFdIzy%zGiPwdsio$T>i^vt=l79t+iCEt@5F>I*|(}bqx!*l`X8u%x$3dT`3h&8
zIsZfR{N((jsG)Ro{)gxM=ba^I3y$X3vt;G}gR^A3%O%;fd-}|t-D7F-C+&~=axVoa
z-Ut*F&`)FRr*IM8o4t-u7-so7M8acC<8kR|*HU2f#KMqx?V8)%=1Gqm?n4A*
zgnc%AX5q%Hj=_e3kqpP;IuOs-e7Q3VJWazhi+ky0XFl$CKJ=HT6+84{GeRFxKC5Wg
zKfad8?sw+s%Ffn)up|&$x;C6v>%Nawh6C(itJk_1!_Dn8mgzJ+9zEVp(Ynuw3g*b*
zj9Ak_aga#R#M>r<)9!2{PwY66v$jnH{&$FHYtjVoSl@ZK|Xmpym+l5?E={S51W
zhdYy1nmWcOUz%pc<<3H`R@)9^-LQSE!fes&u|L-ilz%zT-<4>m%CmpjuH>r@kvGvd
z^LHh=m?&ass>uy5JJn#6zlj`i*i(Swtw2Eminjv=1t{JL6cnKNbD*FA#k+xm0u=8B
z3JOsCB~Va+;;(^%0u+A>6cnI9$FMo20L2G^f&vsD2MP*Md=e-qK=JoLK>>iBz+-g%;W`JtS*HGRlSrKeT6~#IUAQN0
z{vEO)y!yht%9TSjb1248_PM}lWRZI?u7eUR!mRt;CK6ZTKdf>y^Z^=QOD{xLvtb
zt@gg}$`5mLaOHYP17de?S5dq*<^M)q@oWdvs9tXLUjH*twx16Nn0Ql|cc0fl^-G=M
z0vK@Yn8K`Y4F@_y2MpLBrM!X8Fwq%0VZhZd#LUz~#R>beoqaJ5kLW^&o7Abw(QXZuY7GrtyoR7FRJY1WwLX;_
zx+%QnXgF+Bt$zrq6ItyCA#HF-l4^|=WLH$Ff*@>Y;NvSAcG$dvoT26lOA7fKyQ@0Y
zvW)!xKpCD@DJkMy@h5bcu^hLYTO*~S-@Z&0CZ=KvLvM`ue?e5t87HdD+0Tn}+AWP_
z=dDP%@EG!;!be(%<#Ha0xG5{rIwqtI6+`qvorwQeq>0q)55SiZD*L$E@k>*g5b~Ez
zCF~dzy}o0Jna4hxu3xZ-a42HL>T9d|_=!$ovOE5--^b0@7@K$zaZkteLXfH->sSX_
zm18>Pr|NM9<+ViT`BZ(h9M5iPO7Zaf&C8L%IIZ&`mrp_!*FHT0s}cWfR6Aax_N$P3
zVWMI|QGFF2VM$)a2EasIY}tESHFz{2i4e*7H