From 808c4ab547717b34961b995a842cd964ba40a70b Mon Sep 17 00:00:00 2001 From: Rodhern Date: Tue, 8 Aug 2017 11:00:05 +0200 Subject: [PATCH 01/13] Rebase Rodhern's update 1 onto branch 'ksp131'. --- .../FARGUI/FAREditorGUI/EditorGUI.cs | 2 + .../Simulation/InstantConditionSim.cs | 12 ++-- .../Simulation/StabilityDerivCalculator.cs | 8 +-- .../FARGUI/FAREditorGUI/StabilityDerivGUI.cs | 70 ++++++++++--------- 4 files changed, 48 insertions(+), 44 deletions(-) diff --git a/FerramAerospaceResearch/FARGUI/FAREditorGUI/EditorGUI.cs b/FerramAerospaceResearch/FARGUI/FAREditorGUI/EditorGUI.cs index 3cb152273..604eb3db4 100644 --- a/FerramAerospaceResearch/FARGUI/FAREditorGUI/EditorGUI.cs +++ b/FerramAerospaceResearch/FARGUI/FAREditorGUI/EditorGUI.cs @@ -227,6 +227,8 @@ void OnDestroy() #region EditorEvents private void ResetEditorEvent(ShipConstruct construct) { + FARAeroUtil.ResetEditorParts(); + if (EditorLogic.RootPart != null) { List partsList = EditorLogic.SortedShipList; diff --git a/FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/InstantConditionSim.cs b/FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/InstantConditionSim.cs index ee8ab24d3..80936e64b 100644 --- a/FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/InstantConditionSim.cs +++ b/FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/InstantConditionSim.cs @@ -141,15 +141,15 @@ public void GetClCdCmSteady(InstantConditionSimInput input, out InstantCondition AngVel += (sinPhi * alphaDot - cosAlpha * cosPhi * betaDot) * up; Vector3d velocity = forward * cosAlpha * cosBeta; - velocity += right * (sinPhi * cosAlpha * cosBeta + cosPhi * sinBeta); - velocity += -up * cosPhi * (sinAlpha * cosBeta + sinBeta); - - velocity.Normalize(); + velocity += right * (sinPhi * sinAlpha * cosBeta + cosPhi * sinBeta); // Rodhern: Changed velocity 'right' and 'up' components + velocity += -up * (cosPhi * sinAlpha * cosBeta - sinPhi * sinBeta); // to align vector to naive forward direction. //this is negative wrt the ground Vector3d liftVector = -forward * sinAlpha + right * sinPhi * cosAlpha - up * cosPhi * cosAlpha; - Vector3d sideways = Vector3.Cross(velocity, liftVector).normalized; + Vector3d sideways = -forward * cosAlpha * sinBeta; + sideways += right * (cosPhi * cosBeta - sinPhi * sinAlpha * sinBeta); // Rodhern: The same as Vector3.Cross(velocity, liftVector) + sideways += up * (cosPhi * sinAlpha * sinBeta + sinPhi * cosBeta); // but possibly with better accuracy. for (int i = 0; i < _wingAerodynamicModel.Count; i++) @@ -158,7 +158,7 @@ public void GetClCdCmSteady(InstantConditionSimInput input, out InstantCondition if (!(w && w.part)) continue; - w.ComputeForceEditor(velocity.normalized, input.machNumber, 2); + w.ComputeForceEditor(velocity, input.machNumber, 2); if (clear) w.EditorClClear(reset_stall); diff --git a/FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/StabilityDerivCalculator.cs b/FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/StabilityDerivCalculator.cs index 814296e5b..d67e41af7 100644 --- a/FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/StabilityDerivCalculator.cs +++ b/FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/StabilityDerivCalculator.cs @@ -275,8 +275,8 @@ public StabilityDerivOutput CalculateStabilityDerivs(double u0, double q, double pertOutput.Cd = (pertOutput.Cd - nominalOutput.Cd) / 0.05; pertOutput.Cm = (pertOutput.Cm - nominalOutput.Cm) / 0.05; - pertOutput.Cl *= q * area * MAC / (2 * u0 * mass); - pertOutput.Cd *= q * area * MAC / (2 * u0 * mass); + pertOutput.Cl *= -q * area * MAC / (2 * u0 * mass); // Rodhern: Replaced 'q' by '-q', so that formulas + pertOutput.Cd *= -q * area * MAC / (2 * u0 * mass); // for Zq and Xq match those for Zu and Xu. pertOutput.Cm *= q * area * MAC * MAC / (2 * u0 * Iy); stabDerivOutput.stabDerivs[9] = pertOutput.Cl; //Zq @@ -292,8 +292,8 @@ public StabilityDerivOutput CalculateStabilityDerivs(double u0, double q, double pertOutput.Cd = (pertOutput.Cd - nominalOutput.Cd) / 0.1; pertOutput.Cm = (pertOutput.Cm - nominalOutput.Cm) / 0.1; - pertOutput.Cl *= q * area / mass; - pertOutput.Cd *= q * area / mass; + pertOutput.Cl *= -q * area / mass; // Rodhern: Replaced 'q' by '-q', so that formulas + pertOutput.Cd *= -q * area / mass; // for Ze and Xe match those for Zu and Xu. pertOutput.Cm *= q * area * MAC / Iy; stabDerivOutput.stabDerivs[12] = pertOutput.Cl; //Ze diff --git a/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivGUI.cs b/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivGUI.cs index d7886bc9b..f4e2d6a74 100644 --- a/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivGUI.cs +++ b/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivGUI.cs @@ -100,6 +100,7 @@ void SetAngleVectors(double aoA) public void Display() { + const int W160 = 160 + 20; // Rodhern: A width originally designed to be of size 160. //stabDerivHelp = GUILayout.Toggle(stabDerivHelp, "?", ButtonStyle, GUILayout.Width(200)); GUILayout.Label(Localizer.Format("FAREditorStabDerivFlightCond")); @@ -161,10 +162,11 @@ public void Display() PopupDialog.SpawnPopupDialog(new Vector2(0, 0), new Vector2(0, 0), "FARStabDerivError", Localizer.Format("FAREditorStabDerivError"), Localizer.Format("FAREditorStabDerivErrorExp"), Localizer.Format("FARGUIOKButton "), true, HighLogic.UISkin); } } + GUILayout.BeginHorizontal(); GUILayout.Label(Localizer.Format("FAREditorStabDerivAirProp"), GUILayout.Width(180)); - GUILayout.Label(Localizer.Format("FAREditorStabDerivMoI"), GUILayout.Width(160)); - GUILayout.Label(Localizer.Format("FAREditorStabDerivPoI"), GUILayout.Width(160)); + GUILayout.Label(Localizer.Format("FAREditorStabDerivMoI"), GUILayout.Width(W160)); + GUILayout.Label(Localizer.Format("FAREditorStabDerivPoI"), GUILayout.Width(W160)); GUILayout.Label(Localizer.Format("FAREditorStabDerivLvlFl"), GUILayout.Width(140)); GUILayout.EndHorizontal(); @@ -176,13 +178,13 @@ public void Display() GUILayout.EndVertical(); - GUILayout.BeginVertical(GUILayout.Width(160)); + GUILayout.BeginVertical(GUILayout.Width(W160)); GUILayout.Label(new GUIContent(Localizer.Format("FAREditorStabDerivIxx") + stabDerivOutput.stabDerivs[0].ToString("G6") + " " + Localizer.Format("FARUnitKgMSq"), Localizer.Format("FAREditorStabDerivIxxExp"))); GUILayout.Label(new GUIContent(Localizer.Format("FAREditorStabDerivIyy") + stabDerivOutput.stabDerivs[1].ToString("G6") + " " + Localizer.Format("FARUnitKgMSq"), Localizer.Format("FAREditorStabDerivIyyExp"))); GUILayout.Label(new GUIContent(Localizer.Format("FAREditorStabDerivIzz") + stabDerivOutput.stabDerivs[2].ToString("G6") + " " + Localizer.Format("FARUnitKgMSq"), Localizer.Format("FAREditorStabDerivIzzExp"))); GUILayout.EndVertical(); - GUILayout.BeginVertical(GUILayout.Width(160)); + GUILayout.BeginVertical(GUILayout.Width(W160)); GUILayout.Label(new GUIContent(Localizer.Format("FAREditorStabDerivIxy") + stabDerivOutput.stabDerivs[24].ToString("G6") + " " + Localizer.Format("FARUnitKgMSq"), Localizer.Format("FAREditorStabDerivIxyExp"))); GUILayout.Label(new GUIContent(Localizer.Format("FAREditorStabDerivIyz") + stabDerivOutput.stabDerivs[25].ToString("G6") + " " + Localizer.Format("FARUnitKgMSq"), Localizer.Format("FAREditorStabDerivIyzExp"))); GUILayout.Label(new GUIContent(Localizer.Format("FAREditorStabDerivIxz") + stabDerivOutput.stabDerivs[26].ToString("G6") + " " + Localizer.Format("FARUnitKgMSq"), Localizer.Format("FAREditorStabDerivIxzExp"))); @@ -200,7 +202,7 @@ public void Display() GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); - GUILayout.Label(Localizer.Format("FAREditorLongDeriv"), GUILayout.Width(160)); + GUILayout.Label(Localizer.Format("FAREditorLongDeriv"), GUILayout.Width(W160)); GUILayout.EndHorizontal(); GUIStyle BackgroundStyle = new GUIStyle(GUI.skin.box); @@ -208,54 +210,54 @@ public void Display() GUILayout.BeginVertical(BackgroundStyle); GUILayout.BeginHorizontal(); - GUILayout.Label(Localizer.Format("FAREditorDownVelDeriv"), GUILayout.Width(160)); - GUILayout.Label(Localizer.Format("FAREditorFwdVelDeriv"), GUILayout.Width(160)); - GUILayout.Label(Localizer.Format("FAREditorPitchRateDeriv"), GUILayout.Width(160)); - GUILayout.Label(Localizer.Format("FAREditorPitchCtrlDeriv"), GUILayout.Width(160)); + GUILayout.Label(Localizer.Format("FAREditorDownVelDeriv"), GUILayout.Width(W160)); + GUILayout.Label(Localizer.Format("FAREditorFwdVelDeriv"), GUILayout.Width(W160)); + GUILayout.Label(Localizer.Format("FAREditorPitchRateDeriv"), GUILayout.Width(W160)); + GUILayout.Label(Localizer.Format("FAREditorPitchCtrlDeriv"), GUILayout.Width(W160)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); - StabilityLabel(Localizer.Format("FAREditorZw"), stabDerivOutput.stabDerivs[3], " " + Localizer.Format("FARUnitInvSec"), Localizer.Format("FAREditorZwExp"), 160, -1); - StabilityLabel(Localizer.Format("FAREditorZu"), stabDerivOutput.stabDerivs[6], " " + Localizer.Format("FARUnitInvSec"), Localizer.Format("FAREditorZuExp"), 160, -1); - StabilityLabel(Localizer.Format("FAREditorZq"), stabDerivOutput.stabDerivs[9], " " + Localizer.Format("FARUnitMPerSec"), Localizer.Format("FAREditorZqExp"), 160, 0); - StabilityLabel(Localizer.Format("FAREditorZDeltae"), stabDerivOutput.stabDerivs[12], " " + Localizer.Format("FARUnitMPerSecSq"), Localizer.Format("FAREditorZDeltaeExp"), 160, 0); + StabilityLabel(Localizer.Format("FAREditorZw"), stabDerivOutput.stabDerivs[3], " " + Localizer.Format("FARUnitInvSec"), Localizer.Format("FAREditorZwExp"), W160, -1); + StabilityLabel(Localizer.Format("FAREditorZu"), stabDerivOutput.stabDerivs[6], " " + Localizer.Format("FARUnitInvSec"), Localizer.Format("FAREditorZuExp"), W160, -1); + StabilityLabel(Localizer.Format("FAREditorZq"), stabDerivOutput.stabDerivs[9], " " + Localizer.Format("FARUnitMPerSec"), Localizer.Format("FAREditorZqExp"), W160, 0); + StabilityLabel(Localizer.Format("FAREditorZDeltae"), stabDerivOutput.stabDerivs[12], " " + Localizer.Format("FARUnitMPerSecSq"), Localizer.Format("FAREditorZDeltaeExp"), W160, 0); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); - StabilityLabel(Localizer.Format("FAREditorXw"), stabDerivOutput.stabDerivs[4], " " + Localizer.Format("FARUnitInvSec"), Localizer.Format("FAREditorXwExp"), 160, 0); - StabilityLabel(Localizer.Format("FAREditorXu"), stabDerivOutput.stabDerivs[7], " " + Localizer.Format("FARUnitInvSec"), Localizer.Format("FAREditorXuExp"), 160, -1); - StabilityLabel(Localizer.Format("FAREditorXq"), stabDerivOutput.stabDerivs[10], " " + Localizer.Format("FARUnitMPerSec"), Localizer.Format("FAREditorXqExp"), 160, 0); - StabilityLabel(Localizer.Format("FAREditorXDeltae"), stabDerivOutput.stabDerivs[13], " " + Localizer.Format("FARUnitMPerSecSq"), Localizer.Format("FAREditorXDeltaeExp"), 160, 0); + StabilityLabel(Localizer.Format("FAREditorXw"), stabDerivOutput.stabDerivs[4], " " + Localizer.Format("FARUnitInvSec"), Localizer.Format("FAREditorXwExp"), W160, 0); + StabilityLabel(Localizer.Format("FAREditorXu"), stabDerivOutput.stabDerivs[7], " " + Localizer.Format("FARUnitInvSec"), Localizer.Format("FAREditorXuExp"), W160, -1); + StabilityLabel(Localizer.Format("FAREditorXq"), stabDerivOutput.stabDerivs[10], " " + Localizer.Format("FARUnitMPerSec"), Localizer.Format("FAREditorXqExp"), W160, 0); + StabilityLabel(Localizer.Format("FAREditorXDeltae"), stabDerivOutput.stabDerivs[13], " " + Localizer.Format("FARUnitMPerSecSq"), Localizer.Format("FAREditorXDeltaeExp"), W160, 0); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); - StabilityLabel(Localizer.Format("FAREditorMw"), stabDerivOutput.stabDerivs[5], " " + Localizer.Format("FARUnitInvMSec"), Localizer.Format("FAREditorMwExp"), 160, -1); - StabilityLabel(Localizer.Format("FAREditorMu"), stabDerivOutput.stabDerivs[8], " " + Localizer.Format("FARUnitInvMSec"), Localizer.Format("FAREditorMuExp"), 160, 0); - StabilityLabel(Localizer.Format("FAREditorMq"), stabDerivOutput.stabDerivs[11], " " + Localizer.Format("FARUnitInvSec"), Localizer.Format("FAREditorMqExp"), 160, -1); - StabilityLabel(Localizer.Format("FAREditorMDeltae"), stabDerivOutput.stabDerivs[14], " " + Localizer.Format("FARUnitInvSecSq"), Localizer.Format("FAREditorMDeltaeExp"), 160, 1); + StabilityLabel(Localizer.Format("FAREditorMw"), stabDerivOutput.stabDerivs[5], " " + Localizer.Format("FARUnitInvMSec"), Localizer.Format("FAREditorMwExp"), W160, -1); + StabilityLabel(Localizer.Format("FAREditorMu"), stabDerivOutput.stabDerivs[8], " " + Localizer.Format("FARUnitInvMSec"), Localizer.Format("FAREditorMuExp"), W160, 0); + StabilityLabel(Localizer.Format("FAREditorMq"), stabDerivOutput.stabDerivs[11], " " + Localizer.Format("FARUnitInvSec"), Localizer.Format("FAREditorMqExp"), W160, -1); + StabilityLabel(Localizer.Format("FAREditorMDeltae"), stabDerivOutput.stabDerivs[14], " " + Localizer.Format("FARUnitInvSecSq"), Localizer.Format("FAREditorMDeltaeExp"), W160, 1); GUILayout.EndHorizontal(); GUILayout.EndVertical(); GUILayout.BeginHorizontal(); - GUILayout.Label(Localizer.Format("FAREditorLatDeriv"), GUILayout.Width(160)); + GUILayout.Label(Localizer.Format("FAREditorLatDeriv"), GUILayout.Width(W160)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); - GUILayout.Label(Localizer.Format("FAREditorSideslipDeriv"), GUILayout.Width(160)); - GUILayout.Label(Localizer.Format("FAREditorRollRateDeriv"), GUILayout.Width(160)); - GUILayout.Label(Localizer.Format("FAREditorYawRateDeriv"), GUILayout.Width(160)); + GUILayout.Label(Localizer.Format("FAREditorSideslipDeriv"), GUILayout.Width(W160)); + GUILayout.Label(Localizer.Format("FAREditorRollRateDeriv"), GUILayout.Width(W160)); + GUILayout.Label(Localizer.Format("FAREditorYawRateDeriv"), GUILayout.Width(W160)); GUILayout.EndHorizontal(); GUILayout.BeginVertical(BackgroundStyle); GUILayout.BeginHorizontal(); - StabilityLabel(Localizer.Format("FAREditorYβ"), stabDerivOutput.stabDerivs[15], " " + Localizer.Format("FARUnitMPerSecSq"), Localizer.Format("FAREditorYβExp"), 160, -1); - StabilityLabel(Localizer.Format("FAREditorYp"), stabDerivOutput.stabDerivs[18], " " + Localizer.Format("FARUnitMPerSec"), Localizer.Format("FAREditorYpExp"), 160, 0); - StabilityLabel(Localizer.Format("FAREditorYr"), stabDerivOutput.stabDerivs[21], " " + Localizer.Format("FARUnitMPerSec"), Localizer.Format("FAREditorYrExp"), 160, 1); + StabilityLabel(Localizer.Format("FAREditorYβ"), stabDerivOutput.stabDerivs[15], " " + Localizer.Format("FARUnitMPerSecSq"), Localizer.Format("FAREditorYβExp"), W160, -1); + StabilityLabel(Localizer.Format("FAREditorYp"), stabDerivOutput.stabDerivs[18], " " + Localizer.Format("FARUnitMPerSec"), Localizer.Format("FAREditorYpExp"), W160, 0); + StabilityLabel(Localizer.Format("FAREditorYr"), stabDerivOutput.stabDerivs[21], " " + Localizer.Format("FARUnitMPerSec"), Localizer.Format("FAREditorYrExp"), W160, 1); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); - StabilityLabel(Localizer.Format("FAREditorLβ"), stabDerivOutput.stabDerivs[16], " " + Localizer.Format("FARUnitInvSecSq"), Localizer.Format("FAREditorLβExp"), 160, -1); - StabilityLabel(Localizer.Format("FAREditorLp"), stabDerivOutput.stabDerivs[19], " " + Localizer.Format("FARUnitInvSec"), Localizer.Format("FAREditorLpExp"), 160, -1); - StabilityLabel(Localizer.Format("FAREditorLr"), stabDerivOutput.stabDerivs[22], " " + Localizer.Format("FARUnitInvSec"), Localizer.Format("FAREditorLrExp"), 160, 1); + StabilityLabel(Localizer.Format("FAREditorLβ"), stabDerivOutput.stabDerivs[16], " " + Localizer.Format("FARUnitInvSecSq"), Localizer.Format("FAREditorLβExp"), W160, -1); + StabilityLabel(Localizer.Format("FAREditorLp"), stabDerivOutput.stabDerivs[19], " " + Localizer.Format("FARUnitInvSec"), Localizer.Format("FAREditorLpExp"), W160, -1); + StabilityLabel(Localizer.Format("FAREditorLr"), stabDerivOutput.stabDerivs[22], " " + Localizer.Format("FARUnitInvSec"), Localizer.Format("FAREditorLrExp"), W160, 1); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); - StabilityLabel(Localizer.Format("FAREditorNβ"), stabDerivOutput.stabDerivs[17], " " + Localizer.Format("FARUnitInvSecSq"), Localizer.Format("FAREditorNβExp"), 160, 1); - StabilityLabel(Localizer.Format("FAREditorNp"), stabDerivOutput.stabDerivs[20], " " + Localizer.Format("FARUnitInvSec"), Localizer.Format("FAREditorNpExp"), 160, 0); - StabilityLabel(Localizer.Format("FAREditorNr"), stabDerivOutput.stabDerivs[23], " " + Localizer.Format("FARUnitInvSec"), Localizer.Format("FAREditorNrExp"), 160, -1); + StabilityLabel(Localizer.Format("FAREditorNβ"), stabDerivOutput.stabDerivs[17], " " + Localizer.Format("FARUnitInvSecSq"), Localizer.Format("FAREditorNβExp"), W160, 1); + StabilityLabel(Localizer.Format("FAREditorNp"), stabDerivOutput.stabDerivs[20], " " + Localizer.Format("FARUnitInvSec"), Localizer.Format("FAREditorNpExp"), W160, 0); + StabilityLabel(Localizer.Format("FAREditorNr"), stabDerivOutput.stabDerivs[23], " " + Localizer.Format("FARUnitInvSec"), Localizer.Format("FAREditorNrExp"), W160, -1); GUILayout.EndHorizontal(); GUILayout.EndVertical(); From 9ec4bd2eeeff749386f3c9c7a601158f263e13b1 Mon Sep 17 00:00:00 2001 From: Rodhern Date: Sat, 12 Aug 2017 12:00:00 +0200 Subject: [PATCH 02/13] Update project references. --- .../FerramAerospaceResearch.csproj | 22 +++++++----------- .../Properties/AssemblyInfo.cs | 4 ++-- .../Plugins/FerramAerospaceResearch.dll | Bin 340992 -> 0 bytes .../Plugins/ferramGraph.dll | Bin 14848 -> 0 bytes GameData/ModularFlightIntegrator/Note.md | 3 +++ ferramGraph/ferramGraph.csproj | 10 ++++---- 6 files changed, 18 insertions(+), 21 deletions(-) delete mode 100644 GameData/FerramAerospaceResearch/Plugins/FerramAerospaceResearch.dll delete mode 100644 GameData/FerramAerospaceResearch/Plugins/ferramGraph.dll create mode 100644 GameData/ModularFlightIntegrator/Note.md diff --git a/FerramAerospaceResearch/FerramAerospaceResearch.csproj b/FerramAerospaceResearch/FerramAerospaceResearch.csproj index 0eacbc79c..9f956a9d0 100644 --- a/FerramAerospaceResearch/FerramAerospaceResearch.csproj +++ b/FerramAerospaceResearch/FerramAerospaceResearch.csproj @@ -37,30 +37,26 @@ false - - False - ..\..\..\..\Games\KSP 1.3\KSP_x64_Data\Managed\Assembly-CSharp.dll + + ..\..\KSP_x64_Data_v130\Managed\Assembly-CSharp.dll - - False - ..\..\..\..\Games\KSP 1.3\KSP_x64_Data\Managed\KSPAssets.dll + + ..\..\KSP_x64_Data_v130\Managed\KSPAssets.dll False - ..\..\..\..\Games\KSP 1.2\GameData\ModularFlightIntegrator\ModularFlightIntegrator.dll + ..\GameData\ModularFlightIntegrator\ModularFlightIntegrator.dll False ..\GameData\FerramAerospaceResearch\Plugins\Scale_Redist.dll - - False - ..\..\..\..\Games\KSP 1.3\KSP_x64_Data\Managed\UnityEngine.dll + + ..\..\KSP_x64_Data_v130\Managed\UnityEngine.dll - - False - ..\..\..\..\Games\KSP 1.3\KSP_x64_Data\Managed\UnityEngine.UI.dll + + ..\..\KSP_x64_Data_v130\Managed\UnityEngine.UI.dll diff --git a/FerramAerospaceResearch/Properties/AssemblyInfo.cs b/FerramAerospaceResearch/Properties/AssemblyInfo.cs index 614fc5195..099582fc0 100644 --- a/FerramAerospaceResearch/Properties/AssemblyInfo.cs +++ b/FerramAerospaceResearch/Properties/AssemblyInfo.cs @@ -8,9 +8,9 @@ [assembly: AssemblyTitle("FerramAerospaceResearch")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Microsoft")] +//[assembly: AssemblyCompany("Microsoft")] [assembly: AssemblyProduct("FerramAerospaceResearch")] -[assembly: AssemblyCopyright("Copyright © Michael Ferrara 2017")] +[assembly: AssemblyCopyright("Copyright © Michael Ferrara et al. 2017")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: KSPAssembly("FerramAerospaceResearch", 0, 15)] diff --git a/GameData/FerramAerospaceResearch/Plugins/FerramAerospaceResearch.dll b/GameData/FerramAerospaceResearch/Plugins/FerramAerospaceResearch.dll deleted file mode 100644 index 3e0d7d1b2bf50cb0f9f7507921512f2bd3e0b64a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 340992 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 Z zVQkYZFutALVbp(ATgkXK!;HJa z)J!MLSn!sz*)cxd9%ih2TWL;;PsWoSXYsTarzK06cfVp!#E-Iv8(TD68t=157>)x< z_G#H7f;1mo~WiZw|}rbOc# z%{nEO3`{imee)b{TvFA*TE?<-%cg(c2`&)Z5CGbq6&8)xwF~S7^vB)w)%n_A(Hj>b2?u+3b$j&R+Lv)2{7Q>&_@yK(C`#iD8_gH^w+SoPY?9Q}>s ze=F9lcB*5r;kl#Oz}np$!|)`R0h&wMwUcSIF^?agKs#G0tay}?ZL2-pG1^$5*@v~q zImQ|7u%FK1zO6mYG0CW2T(Q5wrW(adC>B-cF-MlsShIvWUl}>Ze9hW`uz(bHvTHFWJBsMajY{g;4Fcy+})l`8w_V0 zGc|&3Fv<(#(QS`ogHc~tKK)#Gys^o+tTZX0-Up6N#)66*4m*kU#v88~;g!S+)vkBi z@rrT0ijsAycfqmQI8e1PhAqY!Vfl_~4I+cK7>V&pvuT6z#ulS`g0j-5K?%qv3(Kb& zkiBYLuBK!Qg?W-yxHlTa1-)v_)a(S#04X2ZCk*NsD(l>~dkh^-+q zN417kg0>qMYAV)J*pk{RT%U$XkR4RaF{5FvpdH3}%~m&T0`{9`M}>vdQQ^L5INsP{ z#AN@T;dY>Ti9!sgNuVOO>6e3MH--y2<XR`Tdw#D3jK(d<~$o5poxy=G^chFLd_y_$X1w6^nC zqkJ0`?g!-PHzQTEtI+(-7^>NCO&d9H88bDz3--Hl(9iA%{b8IGmQT^mS~>qPdbAar za*exfWGUuYm~zLsZ9JwJ)o+nZw~bAj^%NGuj{zeOj|!{(h++$c4bW^)3$`*!v-gDU z((D6a`!)Nx#r>e$#`~IG6xqj`{VeQr&3+ZluQjt;atuFe7AfqyW)+3q)-0jrAm?qv z(_W>sY0ELrJ4SC|hlpFjJ!6`%BgC!Xo^eKNc4^ttZkmo%4wp*^{c)O;{dPYQ?N7UY^A@R#RAt zuv}^;>?O_m3ac}KH7^-?t)6$rnB6qn*lM-2gqbGnh_S!bMzEKJ;RLSLtIm>U_#hSg z)mFQmWz8<>irs0o&lzjB8=;uH^>9Z8v;IiMl3FiuR5l%>6zkafu+w91(rifUkDWCs9y1e(>&1;Xai^wwV)HBH+XC3^y_mKicmv30G#H)@;9GX@GKN_MdId`CU= zwwIaen~lu_6PaByer^4^vx&KBlG1FRFv{N4Ov_+)NY>~n=22m)7pIuFCbMj=qgb1- zoGIpRa*WO z_RlmGL&zhOjFx8c>57$nB$-;7>x8LR*UFrn$+9D|R%>OZ&s0{bh~{2lc~nPO`fMfZ zEbORe6NGu@DA|+3Mm?r%a=o`Q_X^9S{jF{|TbuRsShkQ}eB`#Xt+`3FHy)wjR5SK* zW#uTWbTM}en@i_}-JZv?Ji7KsP;eLX(9m zNBa)J1I?={91UpSBRJg*e@`U`eK&lQeOKZ!9&cq zg{ia*HQy1I=h)jmGkBXW?5tvvqoHQX5{VCNC1mRq!_LCm;9=(H ze%bNh5$4}omY#Ylc$68GuT!0RHh7F#TC*{!$#^^bI>lh~O7M6ycB#^Q6|za@8O?U2 z?hKq{)?cP_bRadz;WO(lFGx!=Wtfu`qx-2=NQSviF-MCI;doENAuSsh<_ei=-qNf? zhxm|8v-AoT--He|L$b`vs}GS6J; zXZ=GKn0NhbW$c7f)~;MdKWiqV;l;drCMe9bO&Tp03(S^FIo-&L?ZX2=0%`E;Pu zj*xfF_QF()eBbP$7=6(xncg?k4ytgMgq40*v0sEG3d^N`Ivoyq-<+mpVVzHfd}!X# ztVHK<^O)&*Plc=4`CP~`^Q30u!oCeTVfH%AvRta!`DVyzbDW>u5Bc0|cSORWg;WW> zU|xKm*(Kwp&dKzpc}rLx@rmD;=BA^{%BIfMLccV>Ij-1lu&>ONlZw69xlZWU=C)Ic zo#>nr`kmSMv|<-v^Rl`4jAEBNw-3E+hJVIP^_*YKR>FAP?G^fqIoZ!9h5lyJS=Ll3 z`@?K3ERSCAk{9}ic~n>~z1?NE^G|cZIo4FE{>#icui`t_1-qf<4b9GWc{=nj({Vw` zu7dq-Ui@0I%bgd8-Z6K7s~B~CF_f%B-!W5H1iN)y7>_n@gxamsnvL$d8|;QKby{Y( zM*X0yeBTY%ck6;?zY8mVNy&J=Yqw&5RIGUSTd*?J&+dcIjUek8EgRWA zz!hYj)GQM$*m7J}Rx-Q0T%lHN%@%ZTX?I!YHRH27%p^6F{XvVasBkX-jvO?fzM7VlODnx~kbbB760!lJN<6m~~XMPeeBDnv(s{eG+U|zpmI{ zkcC@0nuYaXcKoK2RS`D-SH)@yyRBI>VPk${Sw6XNPffTrQ&=wb>k;J&w+?AGK{O}- z&YG(J!mS_03hwTEyGH47D^_Hx4Z5wPO4HG_r_*vo6n%l+Xpz}EZOOjil(kYZG`cb==Xb;wjH zYu!7U%2>B-igoGzjH`^*B|x!0kd?FMYc{0!B%_>F2Jaz7J)jq_am88{g{iZUSPS3e zk=*k7Hr8sa8Mo_LYnd?2iF${dvDQA#PW0XiD?e!VCE}}O{h}DgGiJAi<3E2WwjM zgz-3t6}oj>%XsvzZPhQKa>QeDZR?O`JSI1^N|$08+q~v#XnieAjkJxetHN?=ds;Fz zwu+Z7(6og$wr-adMpgQRn<-Yia*FZkV~VvcR9jug!DlPVY;bsTxq_8}S>Bq8fG^-@+hOjx*R@l`_DqP=w zgTp#lJ*p@+L1Z?MVtM^WLbgD&RgiVI4pddL9m2vBndQ+*VKX)Rp`S0Tv*k!qn)e~= zW*yZmtUt4mYD!j7SZ!gL>kCWMtVMs9t(%pT%$jqkKV;plilCWOZEq>)1=K8z)Zw%{gwQiu;r~S8w^|3|?Q!A-H);eK%biMy9 zdtYm-W`BeAvvvzpE3p1n&xUM8jRga&j>1&$A7D)rmQRBQ919y@J+IlY0cXO7Snp~! zZNTNQ;nsOS`z36obyc&x0n>uUSk)VG4Egi|*m!H6X8Q&_5j4>{soA$+KFiTqY5qFk z_pr%UdeefG1%*$yRtmdh@OgNq0@m36fv%hb$xjYXY=(SX5~+-s~H&1Mcx zbg#8~bdeb7@xj`=1Z*T+m25UaQ+70#a@!$^bE!H8gVmAj5 zcf4*DpQtngha}SuYocZ)hPZ4ytmDFR$us0*<4ucvDqQ0s>F(WDBEILyHa%c_t@O!? zr41SFK49&bqS%NbkGhXo-)J^@$Sn5c<-TFHds?v$Loc|0wNjo@Y|PLf-M6e8n#~9M(;D}zlC2;5hx=~}%PvXh zJ42(w?pT}r?7sW174@8w9UE$oxNoIv_QlZ12(q=xXPN5ncH3NGd2$bk-L^(C^oP_4 zyKTRp-FFAsKJ&8y5h1o~eug=w?Y5uIiwLtVU&=A$(Td?KBBE`FG+Q@3nM&K7{2D#T zUK_qOqO`5DW*-gT8BxyG*w514M(TJ+HEt>s4{GEto+busk8d1yE z?s=7W*N9Ie8rYTz%cJNK-$XRAZS%8P?xwa2n$>`;x$Ul>&2qP}RbQ^s*>S`V5v^@$ zewOEMW1FYh@DV>pJYw7AXTL_Yx1H4Nu@Np?N85oF$_lsZPPXDJnW>WRWUDAFk3JX? z_W#lLC2&zz-T(L5h8bKDR8|GVg&@?l#Uy0}R5nEc%@%QlQAP)bRmIGt%(Arf%~VQL za>)f36c=1^7qil`#j=uYvuv@fH`D6>J?D7_P~YBvzt8{o=ku8_=bU@)x%<86-e=}M z-b2*oOIefWrJ?GY2ChIFsvg!k(S1D5bkwI`Ax-?^VZ5Jrs(Q}g632J-PE)%r)59J> zSi0JsIX%6RDk9+yPnzqZyxrVUDQkRh?@>nBQR&I?1H2z<;O37{_qM46*vc$(zX{i* zv1%f7W#*9+E`Uoj!txQ8r9Nnc%|=+3nr(!=im+_eX@ng>ShiYXgq=s2U47ID`yF9+ zb(Rt4Gx3@pt-UxJ5=-BErV2%Z#vGgpF6%7-91emZNSq!YUD#qt+N<#}VdG z4;W$f2y>_>jIiGkHbH&c2=jJc0QZp*7U{euO;j%!VMz#^s9rL{COGlkbM=Z5_Lwu) zWEg+#GPlt2uR1kh{!#lIna-=bp^n=3T0G zTdQ*ma}Rk>Q=6~TxlQ1nP@~uD+_BuV-p{C~4DN&6@4TN^AKIXY{gL~Z_Y3MwgKM2< z_F14_Vs4h`n%B~2p*mwTY0eS@^I9oO)WghSEzS$_S*k|TWtf<0pULa)Q=u+5xbi$a zqgB^zr7*qku2yTA`%*gYit$;kUSLl5U)HGKGNSG31{=!vd zy}FmJEHt;wALdi3zQY{6uKWkVeQ9tZ`B^?2)t{TBw@K~2UC%Y`b2h1qcW~K7zx*N} zgzaq1*=F?`$D^EirEFGPaJ>1V`wLzvRcc3r%X%R+Ws4fE$1~5(Z!K?CIXx>x782Dhna4eqP_?qZwz zqrqKb&bx-oAg(YM&D>$>cjlbT9Tlbme|eiakGX}SRYAGWHnq~=d<&L=JI35Bv$d$T zyj{IyaH-67+r=rEM>99o;0lYjtJ~G54Q>{5iF& zjuwTRx2x#}_W`G{!r;DRZl}Th#hiJMZnH%(<+G>31r}fR*{+T>xE{rSfh#b$xZ-Ql z4z<$YMlu(r{>ORseGoLN?f@W`n`+~V_gZq)W1qOGO zxx>uO5?4yPiyi7ogZq=YGX|$kqOj)sxkREBbAh!w=f_;X13DKz>7wTjb)doB1#YK0 z!r)@S)u`hPE@jeYu}ht4a2c?&Tm8!5#xUn|kV_I-3W zx7v}pFQwI!%02g}y$!BMw{su=+*=p4R2KWA?E^TYoc!T?ClD}N5 zCNpD+GS z&N26;^zP&`?Wk&cox;A9E={(!J*KuWxIbX!nA%$BEN!O{7sy&a;pHf#ET%Y4lq@PyJ zoVva`;eBEJcU0S2I-%{`YW$~^mxbmXrQPtZoMMB+H+|clQQv2dc3D2H&ZxfUN%KpI z;=QYmWlp#GzT0MtsHtUIBX{>yfBA!ku$ZaK+BR}Srmk*#wjt~x#B1c7i1%Sb*ffMS za!(`dqlT~rQ)5ky-14cd<#P>Tl~XI*HgdbCZf*NuumE^uOh6G z^LV7S{Aoj2+ed2JHgchl)V4j}5Z3*XqfNNJ;OZN~5+8Y^?Pm?#gWxVSaIQzrwEet+ zn*r_%H>Z(j^<@J`K0_ntKkahcFV%c*l_$_*zqkF0HQhe+MS~+BT5k7k1NY>3OS?-A z-2CzF+WnwzYOoU2?niZB6YjEltO@ti4JrKGU?ppOSi4^uxF^R)wEMMzqZF>*5byVf zu&nX-w7cHGJvqLAyFVH@iibRj8ok?qbfvl8?7auKbXVzkw`_e+AqnS3=;AnI-*Pb*u8Xe8GwFXC{qlI?T z;AnKT(7rV|8XYaQmY;JzEi^h>YPTC4jgD4Ys=?9dXr&b!9Mw{5tS z(cz`_FgO|=URs*L(dh8fCL0`$jyBp$21lc#jkeF=XmogM>X*7r8Xex+O9n@y!$(_b za5Or6v~vbWqob|n^_5;{`yTaa)lTcd+?N&_EA6!$gQKzHt1UG&k3!Q=+i8T+$nn>H zG&mYL0b1v;b(`-%Gf<0R?n{YUEJ!cumHFb2Ix!+#JI@@Y@Or!3 zv`d|-E7wb#7Ps|_(7JWexxW^NgX>{%k>#!B2yISR4zmm>uV^2kEzmjXx$^EJLR(^R zTbcXb(EPrEE z5|zOnR(bsna+vnb*<${t)6>`JM5y)i4AoW?^lDXt-IVdQoD<5 zN!PqxOVT;~QS`l*t$tFo~TRH38Dqqa8{(qq?UTR{0 z&0{k1wh5?+FCbUNk3bD~s!1mA98J}dF2b9GUru9%A z*RW(OhwfvVN-c>uW>C$%uS)_b_4BN=vxMk1ELp=fsnfdrbJqEmV_jyNa)mo(7_YOO zVqyH1k=z?7i%_O}F>P(2C6UB5m0A`fK`SB)sEQ(>CT0Om;sqe?_XVOIf#|nDRU881 zT^zusp-pLB^Hzx-*DZhdzuKhGTQzT$+-UP-w)quM<=kqVTX!r9ZAvSGG;fvYad9_f z2!$4fv~DenUs=;Fp*qocZXtmZb@*YjFFVlCh{S>AjWIH37p4cQbgJ&l_ zl|8IK8KG!3*7+y&t=9fYtfo4*T5yF@9`yW7=bSvtxth=PKauD&bJLNi_v9sPXEjg} z+kmRr2h@yyew;(kaOims{SGMcFXG*!Sbl;eEt_Cl(6R_($tOI@qF8b-O9nBfuq2J? z@k~2`iYQ{q6HRa_(=M!uvRKoEo(_p(NOrOO5aS1JN%KP>ZX#?#>ykSoDHPYFBJO6O zirWFHypI8K`y|5GBBlwBMtNZ$ z>w+RuAXh~eP!p4ZCh;`TL(Bn6;=gI)R#fQ7qGBe^U^J`CJgX}_tEtal<;<(dBw8e8#b;74XInrmr`_9-Sz4k|?6plT-?SAl`TXWNX|& z84Vh@Q37Q#0jP+{Kvg^o)Wi~?Nvr^Rh>bwA*a@_VQ$TmDi=Y+OQCUahxDsxNB%6P7 zC=PlX^kvYBXaiJ*FHjRf9NH5oi#|Zbu%PFPG!@o#=V}1!>!H;1-PYboCTo;)+~IeN z4yC1vTXo2SEQWI`6c_hCqOK${hAr5EvdG2CtB9N?7AAA(tXo2l|h&~9E#6{NB=MbWClPj;GKe7BeOQ;?3j+DQ_l*d}P#%su*A|3B07zWzy-RUd) z2Gpe7;K`7_-t)sbmR>(SK`SDLB?H;Q5SCE8s5~Au@c<;I|A9^p`+HUZlP*0WxN}N@5P{>y{}+eZ0ux704A%9rwPoWj$1H)3qE+Z~d>a;^1awmNdofEYWK~ulZ(! zNpnBsvN#4*aPK?i{4LNo%IhJ)z5WQ*jL@GUk;T7(iojO|5o!Tyq6HA|m_&Umt; z=de8_@Bx5|=r)^HpB?>ZRq6$a+l$s`QN6e8Gl`Y`YT7#>KkW$bW;?MQi*|xC?viIY z&uRCw`~lXXSxynUWF~8t0TnS8p%^a>vCtMAtC(X=1!9)In{;NfywO)tICWL%sq3@Q zJl3(!pt3CBxG&FcjhD9TeO{l7e!GusQjMuxS6DZPQ7vgahrGe9Oepi5uZRyotKu9` z6JG#vZ!yq=XDu`Cq^I)!&-C$TJ;d@fQmo)ShjN`z&A`)xL=}7ftNaK;WpM(C9I~cv z=K{;WWI2^r<-FBT&Bb$Q5=+t>P!@0VXc`5HEDBhs6sU^1 zKux>^#2Yz)c((}<>lD^U%mAQOaqz#$HF1JNAHaQdc-Is6Mjiiv1UpA=m$R(%B~a$O zkKpftR>iMCO;Daqc>5Ds(0%4VAyGujXGtdzsPRoiCcbkBZx&+9N-F7Cfbav6iiSJ; z$pYm>7FNW9*Ugd)(C|xvvKY^_J|1ijHFoli9yp{wk~gqy3URfWakKw?y7gwide_ib~4U@ zO`HiZt?y6>W!zX#`Trbp6*p~D{x7mlJ@<+qK+ED6pn_KklKuZK@noI9tLF=Rg7iJJ@=Fc+LNl{3TV8?iPO51aR}?^J6S^blkkEtH$tw8hk=?H3p9!G zKo5}%#JdZ)j76YjKAlsm8TkDemlihwx~ zXDlq&QC}VQK_ZI-Kt&t|s^SZfg-?+>Bdx^fY zxLF@>kbr&s5Tz~UCZp+aWs_(mFo6vgy+{-2Xmh<@?w?fnNiXYj+ zKd*mk3wRW4jbdT#m`ml=&mw+At`y@`L{GgDWnpGbLRqw9I*4hy;Y$%c=Tf=)0X32Q zA3`auevrFEGgyb>$}CrmSo-du@8jh2tay_AsEt6{N66?)`i^WQ$Fc*ldSXRZc}3QE zXNUL6aHxwzi-34TBcr}Up|x8vG;fyRtc>Tq|CtpHH5)lZ5V?Q-zZ)7qevtWinDz7q<7pM1gMeJtD;lGief*fn>--O<5M-`tyQxg;mZ@pmD zcLe`i_&sdO;u=s9rst^+XId$(?(ouO;SCAicFPz6l=*xQJ0q41W=RH65u=}{T}&2B zNUjJMP!;dtR9_Q|fb=dk>WyFY|9{n-4$Hbtyq%9zq_hJ8LSR&PXo1knmE zvj>QN$eMi_&tZk7H-Hi9PxSQmjp0xobxG4btU*UotX%X!NeqU*dw1V-r@xl{oOFa@ z$Hz8_mYG%rh2ma+?D8bMcY-jFL#gk%Js;gOX!9e_EtOkxSPajMNFe~n~pWz`_-Q@QMr^G#+0t#6#seLf37(Ld6V$2hDOx$OtnpK z!=M&vKb7cbxfJt(3d?Vd)zrd2r>SOcwDWfoJ@rq}rtZ}BzM=0y{yDAp3deLx_sw!b z^3~}%crb1|4#h3Qo$x;lpU$9r;k^a@@QJ}_jKR(QF--RnR{Xc(hWu1u8a@xvrM5SW{1y^kK9zCIG)~Hw^egI~(xV zb_Ku!sT9~9y+Mh5mAtdjG=t?N5t>g^Su(s8bhKfL^|EHRvr1H@07^ z?qt?8cap1F;}1gazo@Q#z1n-xTkS6zHlr84+y1heu;^TS zyg32CNw}&`Ty(j8v_Tgv^7D-|=qZa5eQ_T@>&#eW^Q~8BE-LoDtd=8gI?Eqo%x09d z6^p8UtJF1%M#~m0deK#-N_BSJ14-SYgT7wc*+ou^m-a2=A3)Nn^Yzo(Ek5N-^g-Vc zd2@?1z9CxQ#UJ|i)P^rU@9Pwo7kBi-O`-TUNrFb-A}JP+m*=%i(C8b@WrBXEpP)UC zZ;1@ks3yJSW-kx&^OA#J_Ebk{eP2%V8>OYZJj$@Luw?Uzs6EU-CR8F5ql@i*2Fbd~L~+)qc}NQsQ>M zi||G}tMy|4l0AME+UrXW0?#aY!>?X^vgCWI9%od9mq4Etzb)}pN#_fMu6Zn8_LDj- z?X1q$?qB!~>_;xW0(tz>dt1%csv@rWmC1vbhMQ|N+fv!TTv`=j_CKJ_SlZH3CeMSs zTw1!+2lA?jVE=kSZ!q$bDwl3YPWCRfi+b_qQuGS(HE1vC*QJ-WdhyrNi;%Q1S6a*SwK224mriT*UPp%D+IaeC1x0Ys)L&O9k>FV7)lSNbf^Jd5P9qE<1&s^jt>yNhZ|pUzX`#CKoQt z@}I9gzU+IcPMfi4wxwRYfY7tz)n$dSzaKbX`*7Js`J(t7I%mbN%S!!636JGZ`TI$2 zmQVI5M-J!uUle}JDKv6G+u*4$OF27f@NbfASizO_l8fX=;fay7`b5&e` z&H|?Ah|9|hKoibnl%(I6hnu}5Q$>dWFUhka9A%+5x_OC^e98~?@HvbN7?&_si*^-p z0SC0uinIVfsaM6QfIVz~52t%s?Nf2C{Z%cwVoJba*2fLn7$ZHU!isePJ*5ZQYzgQi z&8?^l@DeXpRJ89SEvkhWEP8E}T}m3RHP$p+Yxn9xzt2V1t8sylzj|BXFj$E4u2XVf9Sk}PzrN~YdaG4> zpcVK4aN(Ydhq-nrXUUbY=XdO;6BKD|4kw+!h6L^h!_l3Stckx+2mO-wn9V z796I>n~e*)&N|n*C#cAIcX6G29nx(xCFp=kzw0P7Of-w zMH25-=YqVH_NzV*vPqp*nK}$JnOAwL!%Tl7|28Rd72PCy$EsExtWpf<`BMCOq5jqB;=q<1Mqm4GVI2R;gMd&Wd(F$c+1@M6m<{SA8#qb1x0&H-%K0K3p}fL%sIhs&1HJm#C!kVYy6e&Ly2M zwO>v78M$g^hZ@t6Rf{_~Ox;#*1Rh+mwZj1|X7#}ieiF@Nb?AG?L62Siy;Nf|6?6nm zGoha}5t2I73#;GkP-j{SJZsv#x=bURhqMDI-De$UOEs&1>riicV|6C#_9M`B+83)s zEjH7|)zs_$T>U3f{AGpKu}t!R%?sF>u_t3+#(|7!jAIz{fR{~EUt8AJVS4&Ct)mZm z^;`ZvTrS|NL{nS)aH)N`hg>yvT2tJyis>q;W0a>_CH2BpU{zATHBUm`Z_Ts71YnIR zbH}9>EXH6T{lxaQr9UDEl zMFNouZmW=fU-M(fa1VV%kHd&|n3}J>Ehtdp+bblx?V?6%G21R`q_%5mCHi7@v)~%Z z!jcY<)JO``T|n2HdaTX#r<`;No-f6&rCyY@HWGB&+M&T=T&|uTZ?(z^?&8ajl6cUhoAKB+Gm3Oq|erV;wee`dU|#3UzT#o zyzUy>m)0*Ythp}*(+ax*XsXx_^sJ~2mZWy;!p$LC@Va}Y*;?;)??Ms}iI;SBZMeBk zOJ0Y2Gfl(RE$(l8mrEAq4%geOr5dDC`X$)#Ry+^f++rng{Q3_5 zht`WDl~k+mR!$4;qa-EH4DG3WU76+IQ@O@SD^X9ycf+%gcivDS^-;QS_`)xmb89vA z-moULN*%U*e*0+T^WA`GDR#qK{?X`5gMz%U3SZVNQuc;@$WO@z@|tFDz&=8HZo~1= z)6&Zu!p&!;*Eam=Q7>)X5UbWp`!{q}_ptwPRUF;$pn6rjw_!BA{m(XBQR>By8_tKu zNtYM@6q+oNuX|Z)y;19QS=#;FMfs}cxA7Ct%hKZeBSo@A{xIzhJUdmO&L8MRGaJ@Q zzD>UmkHLB^Y2!xBv12!0Q4RoSW6q}C#=)c~osY*S^kU$Hw0}IoYOD+OsjQWu3=i$o*vU2b@yf z#)JNK9;YEGX1bU)i&@i(vX^OA@&3l3Fh6l&V<>R!#yi5SSaJG<(d;oGY#Q<~t)*4E zv@s{_vgwzNtJ_ZF(oN&ig~-1yEeoqMDVr9Ao%Yx_qdd$DZ$P+OW+|OCQwO6P*(T&BOKD z#LeAAA9;!QqRv*iH1MKqm0iHuDBZar%qN@4GoQV=wzDKH+T08N_Uru~!-!b7ndXpv zo5|lk2)ax@LvroC%^R_L{fXS=b}Ao7-8vs-;zxX_DDlbxK&w)2hBj{>!U=>g;8HwF+;lHm|ArcV|EIuByK} z*J}r>x{03hdsTs5ddeSHJ!a}D_ga(XpTPZg4)>4+68)Zc3Ft9h=5Q}s!Z=6zwu<~) z!a34!RRz*Y9*-+|JXUhM%;9#K!ye8Y?t4pkO$o9{0e>;Qx3<^4fKK5=vCD)ISOet1!ud8I6Gnt;r zq0P~+-tw>HJj~=a{alK#KIngjHJi)SLuLx<&&}n_i~HXehII2<&Sbwmj4jt`iPcm; zLmAV7@c*$=M6zZi>sZY9SD(VE%aoO4Bj!u_)#M|MT=i(gS>6%A&xd|**6+>w*Lin5 zUn;4lHEw#fzdT=hzIt0k9}ha6NbsOsVH8(KiUdP)dGV=;XtprSV@<&45mpZx7b>^4 z)nj$_#fag>^1*{?pl7fxNqVw482)(mH!Z&^lXS z{-Qb~vebNe@dJ?$v1XZB+m;tO-yE{-iZb8aZQHYf7SVm%x%Tzq&TWyR%9OBeL0G+b zU>mKo)T{UK&Zyj6ylr+6depX1%zM*1zHdq3wK9S4uq%^iZtLYwrz<}GHQI~Y^plpL z+sbifBKv3a{IG{}>*PFC;8g04sA8tG(Xt2qi#g{`#%!5F)S3U}%Y;ytQ9JaiGu|O``N#|NqffC*-Lp_ANJ4su# zGw(i{CCvU6GWqZoGWqirGI{b9@+&CC5?G7!o{ctY)$cH$x`a#1clO5*_cyl~*l)JB zX=e)Py*tx^$9EP;D8Ja;aBxFAB$LMt2dekgpZ4)bE@UP$Pf8GuGs1 zvDD=CtC8E)l=SnnkRMwk2iKhO^|OT66i9v+TE8Ue-kQ%<>`iJOGfC3On(m@Tb|ADy zo>H^AUma3B*{n{ktl0*7SIth(I{D9MM$2__%V!Dc_oQXg+cn4gl}R51>*PfLxBAUC zeO0rt(`@O-n%}U){T&#BmU=XTcCvT&_flHyI_108oc(ZGfAU5!+bd7M_CWtRT%xP$ zzRl0~zpBny^gJXq!_;YhyD+oK7V|2nWe;?UT8@(JyR!U8N%=sBG;3EpE&-r+If=OAV;s`r zUBxkHSaJ>$I;UC%i9_1Lcx>0an9n)%lA(WQS7+#a542j8HgCt!+57u3S2!nEI1g4! zuiZaGLglhr`hrGUua1v_eXPQ;1NyQ$aCbLxTBch&PRsjn=f`Q8&a|sc5AP1NR++MP zhgdJlIlD*8r`b2QS;}?~v{ad%+Z~V47j~Cvd$>;aaBYxJl5P!GUfLaNx+KWMuSA}w zwOk9FXLVRE?!M?r`FzQG8j|kf3S%|TjS14Ph*ixqZ8e`VRr5KXLu#{!N*Vx!1m_7= zQrMoKtk>luBOEQS%kxG=itC)pb$Q2#5z=*;ZlJs_uNiSK=pRNT$_19_J@*cnZ%Wy- zvqcDxkx|m9Jz4%CJW@tUnV_%B%b;IsnYbr*K&d5mN5X*XGTmKyU8XxLughP+j?GlI z=gq+D@}Ho~q&a&=4=6P)+JmPjre(nEa_fChF4NtXUdqWm&%(|pUFtN4 z>C-*)1~^PV?4dKd?o(C_C^P-BXMX$nmS%e|YqL#3dv_xAmlb;lge$bSlB6zsX^iv& zhA8h<-4R=E8Mb$DEOwfEaV{;5Va#UCVRSO)GZr&WVVuS|gK;L~)4*_L&R*==q*wQb zo9o4fz4zj5Vc%xjJIq-0Qt)YvlpIrYg?dgO)3M}xabqd9S0Hw*+x-F+I-~PZXsz*K zi4SYiuJ&APbJk1{Jsuw|S6HedeujiJdn$E%aqhvPVJxZ8-rn0WG?FbuvW4DE_h$MW z`zm2931dlfrYkJ>FD#2|&UvV0@5P5{oAS-x*W%V%Xop^9Auq1VLZu5=)O|Sp<8*5* zq5Dq61sY|cT;UuWen_-J9!|7EUQ-;04pT<%dr*x-KHu^mra1Q9E5#|~za?{MI%6`I zBAIiQZqU4|RR|-+qsDS+=h{ehK!BgMz}9s(r2HY_{N#YWJOpcY==c zE`|mFz--{V0n<2il=AbwZ{w$N*=I6NQ)phA$tj+-{Jt;C|E$GxKVe(OZj5*B|GMQ_ z%i#UCR?|3F(^&tsG;H}FutqCaHY9_B>Lfa;SRgX@PalY93K&^)Sd&gXHV&M_DK5~@ z2eh31{@CN^@BeV1B+cA^++UKO+y4{jMf$x4=xe?F#*mt3{~*#YI~f#jdeSQKK)O!@F zy=tyK(C9PO9JiXwyGJ1}`Y`vg!`#PKvYnH_x1^J>^J(Hq*!(r|3?v288CZBX;Eck1 zLys}F=h{oMqt;)RIfD~GvbXC1p8Eqd}qEAY5l}4_QN+Z__d3uV~GxcE0mZ!DR2OmfYgtaK|Fm?IPNhx0D zoP&?2M6#qeOA-X#BGc1zO~7c`N2O6eUnxGgJ!QV~D6n2zd~kQlX>HTNTF|uz>ws?^ z%;de>+bQM9^Z68;=U)d;;iR>c0NQW@b@r1{E#IzTBUh1M6(|XOfB$yu7SC;mB1O4!&0`24`~(3i-+&U^UyVi6NaaAO+Lis z&1OtjX^i_xPaNqOny%8U?lj~f+pa_3s3km`s29tQM2Z^Enj?5J?oqcl(;uGywr0U= z%_oku3Xr7tjyz_nkUu`Mrkf;vbEG5QbM)^czjat^&V+yECpAAxUVZ3MIyD-=IEJx= zaUQVTbLG)xZLg|3j_yvQCsuEy(Nlmj&1QP%C_T^m7D#L5nY2+J^mM~vl8#+UbC}v3 z%f)#`@Ub501@fK8?oRiUVvo@Y#?WIMyVh&AW2Z!&=X1xR(@%RYIc7!ZYsXq+E#7tP zw+?4L&m9|>PP>fz(=U3`UZ6tBJ5D$Sm>?D%UyxqRwJ}XyaeRIHOs3~BT`$%jA1z-+ zug0zQp8Jkplh&H+jyDUIn$epFlA&23C95=A;2iq@!yt`P!`Ukk5do^oY7ngBB39Cy3_GTPZSJA#sd8p2oQKMYi zI4NT#VnumZGKMt!v~EX6y?V!qF@C2->mqW|6GCscIrsc@LPbd;od2@*(6o%BR4ul@~O#FsqbS zbCuF+tx{S(>I7NFH!0qO%}CQla|_YK^b@eR=^F5`X^5vRPMbbxCyQ|Ndq6AWD4*%R+N(|ttcnc zT2W4Bw4&V3Y(@E*!=dvybODE!w)RA>Di~`R>lo{SUBx@M?~<6CqiTz7!<_#B@kr7GoiaV4Yr~0+PNgj}@CiCqZr% zyP+Q|whFDijp;1V`F^-N9r6ms1B{0tpBr$V>3YTsED;iEN{qpbA&fDMR>m=mHpUr@ zWsJ)iD;R4T4=|o*tY;K5+h+`B3}K969K)C;Zxs)BoWb;R##+W$g=!;9p`1SfJQ}is zC9#^~W$#p>k>wQ{mHhzI^^CFRcLMFvD?GP~+haO4qqrBEk)4?4q(6o+t2s%Q>vT&> z{R!aQfJ2N=c(G;1PHl*Of^h}oA;t@giZ_ME_>#3Tj58RQGuASmXB2*<6U-RHIEHZs z<8oc%PdYOgmowHfo@W#R6j~A1%UkYzfYH{wmv_+ZWx$NvD}Zxvx8B*y`^fD!;8(Yo z-POzc<){kaSGP-d_wqg!CEfi*K&S3j&^x=AF;*}hV5|qe(LLrKDv|Xb)?qx*hf=I( zwDl!<{e6T|KSC>`tzX~3T~Zli1tcClEBeI-Cibic{qP<2{hkQeaEH{tm-nV#Qh%aD z4D99oM=vYrmwH29Co@b1iNc0%S8H@*9WTBo>$|pL6(Z*QD zSixv5pio;;FK^Ud(Gvj!hLnN6oKgWS9Z~_w(IE#ow4PBaCe08=E2E9EjIjc^v-<(Y zdf*>Jq!PjqMk}L@u?*N|Xa&;;80#6ONxi&NhK2yEhaQ;9rC^jE;ZiVK8EuTgkCHrw zaSY=O9jB9gIb$v3c}DRV$q&pRtbL+cU{30J;K!+AX0yPd!-9cz!(xaYK4#{`Ha=-H zfc?{!1GCd&o}pM{7-ujpXRKvB&nTYdbQckxU-Y1i)?Z8*!#IXw{j#`#V3JL8w;pX2ZJpW*+N zf3twL0o?*p0$c$z0}cj!9B?e~hrl60F9z)hstfu)D56964t+Ze=rFKDa);p^Y#s7D zJkw!Whj%($?9jgB^p5}PxU}P%j=MUZ>G)~KUph*`KEc7ky@KO{6N2v#o*Mi_@VwyF z!6$-$4E7GWBcxAAdWbEgI^=4|(9nN{ZVufQ`ex{v&<{hsI)!z*vs2$rF`eQ&C3i~e zG`-Vnowjy*ztbO`OkvH#28ZQ^m4rPNwk@o<^Zd@sIEC5ym&d!j z+GS0b<6Sy-9n*DI*9Bcyblu+dc-ISEf9)FIEvZ{Uw|U(Tb$hehd)<`q9^qrdCxt&5 zel2|XZNJbWR$kB}aB_PDP{MvrHDZ0xb4$2&bP^tjezSKo7euk>vl z-9EZYbX0U)bYk@6=*Od9iQXDr6Ma7V>*#CI9qyZS-~9VF-S^vle*OCN8{6-(eoyy% zuHV9b8~g3;_d&nU`$_%%`^WaT_g~$AQ~!hgKj`ln6Bx5C=Jy!Y>S^s_z0;aveaJf5 zy3%^Ydd=!HAb7yg0oenV3^+buXlzDocI<@M>9O--H^$b*UWolYHZm?f?vc1>;}*ni zi8~!9#k=C4jejM6d%VZMjsph{%ozCez+D4BA9!_O+d=&Yr3@N9=*2-R2h|KZJm`%< zKMgh~_$Bm7NKBZJFgf902}=?_PWV3I-wCF~=80Vs3lirhZcp5scqH-7#EXf4CHf_G zND58rnRI_rY0{je4M``G-c9-;>93?g$*IYi$&Tb7l9#4@l=4N&w<(dScck`BeJFKo zsz=)MX$#U;q^(celJ@Vk@N|3nvGg=BQm2R|)TF&n?K5aPE-@U?Uyrs3Kl(PEkpu;-&Kq+8|q-4?!ujo*xjW*866#cj9; z=5{>czeBXace{PW-54$Rh#(OSU*jcl8CPMa%_eMZ5qkjG%NMXYAgCQoO4NN%}E8obh2sJye&w?joI;cai?T7?&|_ zjoygKW`A@w@D$@`(Yrujjy_D2(0zoh?t26H&3!)ro2Gs}o~+%O7}1P!?f}k9bOEE1 zs(=HMb^w=q>;)c6rqq=-9a{=fn%)^WVZ;MOkH`eh9FYyoAGsK)wAlxgA13{PhsnMk z_imQl$M|&?$**MH*#^ID&+ZEh$sPdg!7ut)pGTp!jPEl3$Y^qrJcu!xF`d!DIGwTF zMd_|%dMo4Y`3@f;;tEJUq+m7Z5e1dN35;W>kUW=hGUHQIhTwM%ix^i!uZ#e`w`lzlwx&Yj4B-s$vup5j47qrkYq4E#Asv8DW#kQO??re zN}F=vf=50AmOt_-a0Szw7i#$3=^Oi@jcOa{vMF1`oo=ds6ZE#?7b@i^AS z)?$O|33(+@#%`t=B%84(HRHDR=8(+9tY8*f)RvHM10dJE!0wbglU>~UyaER0yI8^EiOvATB@%wox0+=n`4zx?%fm5ZP zz(=HBz-iK*z(=LKfzzcvz8)z!xMdZ~=BqvUpL72fi*10=|oL3|YJ< zB>_K>Qh;Zrp}-HNVZifJ8t^A619RceK>Yq!9tkwz`y{exD?bPvDnAU&l{2A}FWW%7 z7$?hFpr^=oV5vMF_>}Ab?vp11_shA!^Rf$AFBbqmlZ$}YW!-eopMc>-uto&=6no&sj!(g@U&@+@*vji2huVk_e|g?yUrj60S2kndou zQC@(27vmn~MaXvpac_>Y2=rc{Bx;p%(EAw=C@({D5Gad7%2LpW8ILNL)dZ=50IPCyh z)Ez)iwFcNs-3@H6?gh3`_XAt12Y{{AL%`PR5ulfP4A@4kLs~xS>!7_E+p2GXZl}Hl zY_FaM`l{~${nU4X{_6X{0QD>|Q2huPq<##HS3dJOkN0A=A+F9Y+`pCQQw$|7I=1+)t&i$e9^ zpbLPwWdPqZl*L^28t^6c56H`bxE)gc3-rrC+@ynN#FALbxJ*?fSu6)iqC(X`zsk5$ z^?+mrP!_9H3-C3y86>M2*QhNZSqqfJI<*z(^^6Dcy*RY8>WyDsO~-XObHohGv%tqK zbAdB0&jV*!<^!L$ya0U0@*;lK)kgS>5OKcM*X>*S-s?NkcdGC6zRP?~el7eq`7QK+ z#ebFm2LEmTpZebuFg9ROKt;fB0hYjf0z-rP1&t0W44T$qe8-C&#{_>I@cI>h}D_gkDT-Vr}Pet-Ns@gK!si2o&i z<-njpk%R6Uls2ecVu!?;iDweMlJb-8O5UD)I{CBYKa*oql2Ys`c`0*JUQF>xwWcPe zo*4f2@bkle9{y7LiuCR2`_nsQ^vsx^u^=OGL~W)J!K&Gb)m1$|ONdal_613FQq4yt z5vFznc2>`SCW$WUZ+LHGS5=(>e*tr?8Evos^)>!C{(BX^0R0NF@lO(aSk@>Z>NA$P z?dV}+n$!OqW!qcaDvN+8aB~_**q(wl#{DOWZ#ok#VI^w(D;r8Q<Cqy@Xh4T48l*h4rKz{LCo$n7!~@z&r81*?YuLF+>c*ZwrUxlMe541pH4s{LOK| z@%W#E&jjIsujzuXSs+T`drrk?4s!9Fn2X)tTV=PDlszplI=^09JTXqD6>bcITBaylOqdH6ir zxsE>+_Y2Tpbgq(eyB-ro_>^|7l9qOzt9=9d$F6mP+xZ#O zw>|2_slM|)a{3)(ooB3d;u&j|^i9_ls{erb9s^>pnZH0e+YyU1abDUCF8Am*=hFTVn^QiB9UUxD@nJFZ3r7-bC%dyb)eH_D~>HG zoMacVC1V{~Y4)sQhbvE53+=YyB~HYSb>(H*3-kW2fRxQa842_+KHGtk5ff)Ga*WS2 zVipN1Mq07Ws4&AG2}d}JN^DNYRMe&`4-x-CB6>xVuGLXklyA2;l#*m=C57YATqEpG z)VsY2n~~=z7J6Ldq`0JrQ{zSfg_@j9Ex~-8t=LAP)L4aiHfI_og5rsWB3Mht=b}M4 z*XRv-#f2_sS}B?{*JvVlYmak@)SS{HM^;g+&6!mM3x%lB0VNJ+w!JWZO0hk!2nBb` zlkK*N>GmSz(>gpUE!CQx?aE8BIr6CW(3BSX0%sVprD0)IwL5mCEOGWFvKV3Y1`)W2!yX=J>}Y7fmDe9)SMVRB(@5kX~rZ zD;no2%uUEc_du(;M=3Ra*r-7s;mVYCHRoKX#Epb40h?AbIUxx?MF6zS1$ zCAmI1Qo0y~IgTu+o#^b+JXf=Ib1;rc}2yx zykg`PvpXU{A2Z`EvV^?+lH&gqFtntYLK^1IID4UEQZgn0TOpacQT`v5Y3iihx(Y?w zWV=0|q8Xj6VUeQA%V{eW#{cxvd`$lC6^D~VEThO&d*G-UkYNb(O~t5}EGy=H z%-cm=4-|n3E@Y9BI7!hKdQR9_g9It0U~=Ui%F|jRt^7rkPjZ=!BsXraTs?sCFB98-ioVGXch{i6AfM_jhRu*)7; zlBdsHx^O(N>6k~U=MT4)X4#602RqQY;n1-w*0}H*z5*|;+~1u}x2rdFEX_#6?U)Vi z@QvaN$cKR^XjnmuBg@71CjIvB#`17G`X1>fJ21}}uEI!LaaN9K2tv-$A@ZHBQt~;d zdt!;EIi5+8kdAqJtgX;J4cx>g48VX!VcEr@iAKaa9a$6OC&89Z4z}fGJ5g;Zu96~q ziffWx4`Vi-+>0hWJd|6*Z!o|bZb<_Au;C_)LAG2wJ1Rv@gsHCll6-P+$N}Tr8QC>T zL4B!6=rWxqKdw|?)RE&n*8qEtZIZ)PQYdnZvRs8u$5>%_VtOly_`DK$W#sR2$F#yp z&K>J4y*)N9$5xmxQVZ>ROOxYOgo)83I+{_5#ICYczRjdS{{mV=M{@$&PWw zShgmiFBcjPp%IjpWpmmyhugE^`-}9+@b_3E60pBO5Y+&BPZLfguwh$K5iG!+f|V7FTFaVu&Ow9-@XVgS{`QMEI4|NUAA#F zi2u-`6Z8VG%aXup)2SA!1CSHo@D4rG~jQSPWD zj-P^-v1fBSoH~q=yV9VPR+2}0je-HlA4{ww24xNz`oIIp@tGsylQW0MCtK4KM#N{P z56v7nJU%`xeR#YzMckw{&>EXQbhxl4#%CtRr)S0{Thr1q6XIBqI(%qqqa+zU5M3?P z2Iog_+oF+<;vC&+#)gr%!RVD3Sy^^nDl#3s^EA{&!`k8wXb`yL>*KTtsW=J;pqNeE z|Dq<<&Q&r3ozqp=OIY*souzt$?k#RZZMg+abhs%Dd8)mTtIomhNfwS^?8TY7uL4H* z53za{H`$%h=$(Y^BJHbuM!u;QmJiOXp0=B7 zs*#S~ij8bMrV3rDiJ+<80Grc^)^ubw&Du@ErutTw)i6j@(-2yHi=2*pBe;QWs*|2J zFxH(PBAbR`3_G0z3vF3$12^#rd0FTMMVN7I`EmAf#(ZQb$Jzf&AjL4YId0qb;qTN_LSJ&O0bTXGD{KjrvguLq)2y1pD9{_fA>7lM*?$BKJZQn`47lo=r{-dxiR1 zH~?oRQ%fliQP@GHq2h3oz(dE_a3|Z~_+Yv-meU(!vja#|4*Z6!i6R}_M9j_EbZA6t zv2c(tkC|^G(jAUrsRzNGN_7>9bo-Rzl0y3(aUv_(phZ?(1C`>YoS6+mGK$lu%%WmC zVsTBz1Y&2##-oo8rf3?{_h1Qm+4d>IR-8*Sq0U$*52Kdt#lK)44Io z!*os7V>eV1NnkClxD=I2U5=(VDkIT)8Hoc0XPKs9eQ|2=`?1WpWAIK8&LnjKogS|L zcUQ9Bdxp?XhWeS#78%8-vjlhdNwZBtOxmVXD7+jTS(S=O}ZX7qSp^haH z^@kOohAmI|*#h03j?j1;0dt0%BH(+&_tN_ST5Je<9@gPW5IATIL!@s!2B3TBN0{+c zB6fPR;Ajb)py_g(7>n=2W{Z;ie0yOs_KzrtPUOL;o1*&YTPXwd&PmaEIKT9AlF!b^ey9!GBggIvZgzVk#Fc2JX$KN z(2>vkl^cB1G&>w8xWc5{Kx2U}qRl$(kTZ)MIANl#cP89TEUiX*r6Ln&!o}#xu})qf z(;K*kfb1IrvKwOX{N6N77i5kraXL%WaH@(UAbYl9ci_#!o7MDGZc;;HH(R5LfD^q* z)yV-jt7re6x*l+odSi)hG~Ot;=9S)XO0BPV)cN>m-MyQq0p^zRSZrV#>(@A zxiMwb-c15b{x?-67x5;cUc4KHy8XW?fzfBhSl%G&(^V0U&uMmc^7Kp``RmL~GLFBefe-M#^6D6Qo+JTc; zY+9C zUIB2-i{Q8AV*5gFx}D9t8;d2JN46)3bQcd(KX!gL&J(RH`dTK6IA3g~DV^-XNwXg2 zK3v6g&$@26t4P>fR!p%pNrM`Ur)EUb?ikCZ+bO38Ga}MC8YK<)}M61&p0k@!}*p=#Vx{M{b;ZY6+8@>Zq6?|12_SJfA!v!iVrPWqvjn#q+ z!3*(JbQFDEnwTmk#)*jusQRMfcr1;D0%y7|tZ4ic&?%hQPq0fNvayxcsUrB`hD_gf zvX<`Jla@}AmQEEK`v|g??xMZMaBM_fG(36a(H^C#9F;04Hu?G3&Z76{J8<5llR0pX zP|Z4n71^m%*@dMkID!!4Fb^?NOrAg14J^DE_3ZKEQCwF16s*fdskA@}JmtW`XwS>W zqJX7MjKyecvP;20b8l{VAd(GUMBJ_ox z`;*?onr7gJKG$UKpe+a;KHJl8$VB6=pYudJ#{6T+W85`bMS60cc}veVdKG zkB)^Fp<^rk*j1m-2A0_AfV-$9mxn2N&3X*I-Wu&t4L3HCBa6;jVb$1nHtJ#c=-WJQ zu-u}|Y{z&94$p|vM+*LDIdW~zOq_I+tJWkW-6?W3%AqX+;pW z8y1=WK6hQsd69)ejC&1KY`k!k&Lxjh%Br`c4$H=Joxzo8Rq z%$3e;UM^gPlWm3B1F-p`|3h4~DT;Fx>V7X(1QNJaBMpz#`8blkK>#$04=`OuL>3T@6;q1nJE~9sLevZa5jVu`h$3DdYXCLE% zj!OkCA2(VQxhO6lo~64+;#f8tGXXvIWk2qQ-j`3uem6*T_t^dP!B|oBdEh1?Z%&NI z!?5gra%#mRtgIY;lBcQnWjU#zH z7-Od%PoKH7IB;&8%||iB@?#IGSnlEtc~2NJNF>J(8I(RabLha#5kv2fPZk-enJLz^ zBoQ}sjqCYe#)&EWXKfJwtY~9&;=XXfG3^gN4BgzANI#$eqBh1W>HKUh#QzMUk z#TSVd-^`bhG#)Q~$$LrBBJZVmNlKio0TSH+F|Y;_Y<7{N2#OR5>Htpb6e+p^vcLwY zix`N}Eb0O+utl?f-{(2!_j2zgMY+y;EZ*Pmyr1Vh@8>z^=Rck} zzY#o{2hZTavxX&IJ<}dN+a4clY3G`@(2h#Ml5iBb$=IkrmRXKX7b8&s`~uT3-8n1~ zSNci-J?{^l_A;KDMe)>h7?l0JrQh+u1s9GsaH!nLyE2_N%`_N zJgx*33zP*d5DSCn9O}akwV@`x7H7MQuWU%=A$JaLISM?(ux4X*NuoQfRJU8L)oLSd zw2ebGTMv?Kgal{Tn@#hg2K?f}w=7{A0nI!~9@Y+Pd-|%mRmin*;gdIu8=Y`1dOuau z^Y8|2uC|;%gmt_=M6k@UXVk*K8mSS{D9x-+7*oqCMbkYRpon{^0&cc0)YD@NE+||= zI+&}e)vB&AbtG5vb}0rd`3XG zwpZOQKvBx4|NgwMNLo^g$CJE5V6HtRyz<8S}9=utJJS9^t3#ELg&Q;I5VwF}m zFPU`+WkWOBYpnMG1%b`ry6rc8RHc8t%t~2+S4`F)i#i#JPfxpYO4}#}%&1Kk4APpY zKDlpQWUu!=ws-41%S~@&nm5lV8}&@~g(aA+;!o?j(=V_$xmNSNUD*_Lo2wLv26&Rf zEQoCJMPk3UTcY+Xmv*IgBPxNo82flznhR0cH55y6GYFEUhlUJz70@}OuvYz21d(Y# zvkx>_dDR7XZ(ntNXjY_D39SnkyE{19zhKk25R+sJTTU{JGJkK$btJD3LryBac#iF4 z*(ju5KB?CtgT-@cjaZianE9JDa@zrpni>dTh92pTruJr#Lpq7U%UvXJS=v}DLM}LQ zOfBmjrbVpMRHHM^yqpGD!=mW>@PT(G=MlYCr^B}=!?!V` zC!_r)4Xe4a06<*7;CYNFEo>D4AK(o zc)jYCX616|NV@VtO2n9GjIx7na$}=O9H*j))StF0x|(w8I2hGmREh48tF zzS`JfU#pPtfN+ORqIOo7+?`G{G6O<;da@h>o6hF5LfuBC#lwrA*ZGf+BWmlSMtN<} zGZpJm)4DlGwxS+KvwvZlHg6M!b3dci26yhX|x za6or+X?4poijfUZ*j#l$I zF>&on8y&(Hb^39Y%t#3(31z_D*zivqQUsHk0_z~&pobL~Gc2_6PqyB-EtD37BgSZ*D5K4khLfVB#Gq#uw`|H+Lwmf1++Q@g&B&2}uL2lauiJ^Fg429&m%~i## zwg&;TS*sBHe1Jat%#t@%E3!@R&R;xiX{P>&NcZUAv!ZM}X|E>L$X3^O6BRe;s=k-v zWxfGlsm0gGt|G2QTu6A(4F?K~-nPP~k_;iW z2(JrKYRVrfCM=jnR5l405Kz^%=m>~rqR(<%uEH6ej6e~`vWnC;vSz|o0od$gIV-|z zvGh>9)B22LmM123l~P^7U6a92G_PIOuplmI!n!m%<9!S37VjdgMZ&Z^4ck?So5(Lw zv7T;$YMM3 z%{kLDXCc@Jbb*B2u~QXl%DC6+r+PHLD<<85yc3T#{x2*XZ#ExVx|B$b+XP1Rs5-GE zhiX)=8MpQzjHm?i2-cxya}#?^{wGwLd|3C~NkY%s#WgW&9&GdQ6|vlwK*frQSAA*B zwuK|eOJcj$PSR1?$Ws)_hmD!kueud8&%HfG;&+kfO(bf-95%j}A=0gAlDkD+98)2T zq?pVy5Geh)>6vIbc{mIqyisMYH%LJ$)J4F0#-4SrPPUd;YOPA24yCj4R&x?wvpv! z@U#Fs!VOo!XgFCO6Xg32OViVA9@Mso8Qvuh^~nY&C!{q)A1mt3)u^szyn$@&Ief(0 z3=9>52x;B;-CbNfS%!P+56&v`yC|)TNv=XLgHa)-zI5>1TdT2{coky4vdQC@T0>5 zyehsT;zrEjDIZvSdtRIfBh#)*Z9#;L03(%HWs!UuMBq#YyRI#^i40aub(=1i85o}?v;AE9BlJxp?Vi|H~5)+!Zmh0VHRxRLFMhI%beU)roc zruh8i@W{;F%G}5dK9(0Hr9gwZP-yj{5Z&U-{jB=4$-pji(um9$HG&kSLSuz@jkHB0486svxTsUbpm8?f z9gQTPEo_C&=99Elhv<)P2Ds=Frv^}W5RcLb9NW?k zZN}bXy6{yy54#LB9?lSNk;k63b!m~+X;a6GCcTLQm$$LyiZNQl`mBN3)y7?RY^N62 zRwW4pHjZHHbi? z)ZJ2Of`mOxorjIp$_$|=3s?0oRi9X`4H33fv-4}A^rl81SK0S~jaar54H5q`t#;}Q zYAS!zxbiplk26%M*VtFiqk2Sad9;tc0X;ch@#f=lSmUW>Ps`e1$}?6VkNi!cMS2?| z(gQ`sjQ?bggTk903N-Y9Gk178LUmAzi|_qOgl@i7C!u>_L_#3=Wz&E>eoj^E#o z)NEA6;S6fq=FJj%C>ofJQH88A{0I#V4foJykS6KqZ;GTpnrp&*g8n`^kJh?CQuqTtOQUuF`W^S9rY2$f97x3#M%#^}ola6?{<$Bi+ zIrUONu@vEn9mS!iwybOrHZ%MP&GwY3hAKtg<1g4b@`ibD!cHAaFawNMv`T_AI*A@L z@`TUZVL9eTXw1s&D$LC&fU+(F)RK;3Suqbty!!ycE)^)GXCs9n=h}n8xGFbv2?hn* zOsq1iTTr8O3zhTf@CLJ$$44S1Fp4}i>CMAjS>VTFIWvRuEXz7IE$W`00Lk5qFD9pF z?Yu~$Wbd=vi{5L-E1{DDHVz>xo@f^Z21ZOLcWZ)#(&6K|(~l#|%vc0RI8B|5lbB*B zK*6OPpvZb4j7!^Q$(^NrjMVPV+sjv;4d^;9# zn%*-Bp|BKU1sL>ZLx71r7-KCwJAY|$!eVx-rj{@q>pR)ALN}{&ckXh2R=?Wew+D;r z)YC90UzM3Z&PH&8^ZDehyXCi_*bYFjXB}887+Xsg4`v8{9|nVfu;&>DoW0!4huAGm;#qrWCSF`v_<*v)%+n&$ z_>HOtHm1&&NJoh&HXvTnOC(nc1!77n(6p#7bE!}~zD2Or3ER_7U)Um$kS1C>cTsw= zR*Ja^T(%BDu0Z2z80QL7%Pp2n-OQpiBsbUnq#gK@+A)+yhr&R%g^a%w3Ta7!fNgo> z5Ju!u8eYmZOT?lZv7pj{ZRjlK3q75+*`5kqK^roe@>`%)+j>t7nFDFfO0F`*VHesg zWf#Vy{z`diiEiQ~#Ic$V4#G)7Tar698DN#@qB)or|CNkI;7>Wpo1BTx(WVGmTb0EieMW2HPY#vVoK zo}VQKtCvpoFxa^3&4G;SqB)oo?Ai7en_?mz>3LxXjt&Qv%I3)nrm$rN(q$WVNZ73p z3?%c8+vY&G-mXyZA&5J7Mv@evZib& zIqZ@JQ9S1bnrlRyDtvdgxkh9jVC7-k*nyNnMt~rA;$9-|pf$e{N^PSqmfOmn4Atpc zIR;3bM|#)6&$@1aP6@gJAf^jJZo> zCm!9Bt~9hhyJcEr!(5eUZ#dJvxF6ukUeom`rt2}uL}{Q2<)w>N);1nggAbr;&x@!g zVdKFnr}xMjMm{M;za-j^ShGRNSStW_o(h@cf@p-H1<4de!kN2VLE&J?IQ?NebR@=2P;k&3%@jo#u~CoWOinf#BKSEZoO+LS9(9ZJ?LKPnW_(Jq)0H_? zH63DT7?Y4n2oI1NW6VerniYyi66|fY5#Lq`ty_8^9-$LUhDkO6jy;fGd|yW90zPf_ zWyh9;#qDW!OclI`EBZ;*_`E^IX{OF=R9`I)Pa;jy%rM$HDVwTxgHya~$hO!m#YZMU z-Gq)Fx23@Vr7-IzA67=2^EO96H|vj};xu3?OvMin#W@7RlVxb=;Hk7$^|alpqsqv^ zs(4a-$R0^UmObM?l1Hh@=uIG(B6n~hU{me5%S1UJ`BrmpQ9$4NwUbu*qe7yMXikF`Xp_Aoyk zv4(f@*ZA?W9FyxHUxrapi#3GA!Qp-A%}7Wxt~l%#(qbLRv?a<}D&cIWy(!X4n+G0N zGqhP<-nyy7-bAOui<&E@)z}3sg~B@I<4qv@tfrNSg^KqN$X}IcVRnvNUWNicH^;`=bqup(>=}|qytf_p zn3*5fSr0>vwKWa0g@vt+DkHUZ!e0o{HoB_83DYynC$7^A%4tZlbw^7g>x6E2hN&8L$OZE*{Cj4mAUGWPt~mW%_MT5w;4r1$Dr zCd-+5xH;-zLQ`JAJ% zI-{}9HI2!us)yU@$+%+D$YAr)Pd!7d9ReXM5#RBnWJ%1~msM7?QW?)JsjLx@7~knp zhpg-%u7i~GSB{|uw$A8aPwuu<=m;F&O2f_Yfo{9ra2)+w**KD?jJuyUI0?SR8TnOi zvh;S0~5GQ;;_cxf&F(5cWSLMDN!PIKzsVx@ zvczXD)pf;zZbK>-bABokX+=|{Q73}RIBqQJEWeDNkw$aUDl9Tcp>&z+us^xHa~>#K zDr5=`ytA=}^IWBH%zCN1(X#l)IFwi|;Yztq97WyZBw;4&hRD9o%)dP&2Sz0xY%Y)9 zcD@Qp3gPN9(^=DI@N-n|EzI5>8JS*~9G`3ePupk-^CL@?lrv5DNk7EAY^f z!aE|g_-ZC;91_I!0Cok!ONQalkv(rHqPYI-wh6=kqtTGI0}2x`WDJPy%;ZOM8iMj7k0`c4tE>nQJDgvMtWB zW%YZD!{zjiij)HV!(5fCJy#n`s~god`P|Hf;_?ncC)mWgCCEL7)cY{xY_SYeS0;7- z{b4yx-Ay&tcDv6juI$8O?ri=tJ_7q38}hA|FI!?i+Iv3eqN zwQ*2-`o=^tzsze|VN${7_ZH@-`J=l$!hJp8_verG{INfej*XAUyFW}6w>X~&y~~!> z5iA5jG#}$F2pSl%rW;VFKJy|!X|^ZM%M{ym#drDXBntJ0pJO@b8CgtPx zc2gi>;xA(jW9xaWYMwzcoH3Dnh$+*2Ve5ri$NW^qH7n`Qs_Y`I z6>e8`Q^O<|E}BfsddwEDD?jN-6wByH%=tk_mQj31s*`j_a+y{;vLh{aOYa<$D5|4m zPA(l(k-?!Wo(iq12r;%lwX*{Jmy+M#Jf>l+%Qr64<%O}bM^q6wrmH{wn;7P@WGD}Y zaDFJJ%(8S^$UcK{3xDQ@D=mJ{vT);XIZ z=7OOd`V`S5*@Ih{82mS~p?vsoVL=)ZW3&iD#oNR|#y+vOY<#6LmBzzTVT1Usn|cPZ z(9%RZOGL5TFm;YgUK;z=U8BTAFWtuL8L9*b6aH0~hN%*OWm9_{I7AgCV{x|Z%j;Ap zF#$FEk`B+=1J`(=<}SwQF!f69>h@N1XqyW}2+7iMlFI5PhMS!XoNG>Ppa^^YN(w*1 zv1UCjRU6HXUGKEMzUn?cZfwY$+qy$_w=X(&aVkl3IUxpMQ5ZhDW$IcCIUsYrU7~xdmC$|f!J$a+hHZ5 zY)?~P*evmLFWK<0Scx%RUnMf#g8vpd=H!7%s&F%V+r`pn(^Qu=TbK6>@1SpIE6pakWKQ^yYRQ;?Rd265;4MQF-f;Z{l-xC}WE z0j&U01+0vC42@kwMsQCz3-fzF{%Rb?EBKpz6l)zP%5Z&+9etb&7Pa<38)&t-VQdGp z;&pi1R(8nf31C=)PlSXB6rMa<0~xIV0{Lo)=5%=bi>k)tSQ~L5R8`^*?5<`Ma;jtv+Em@L2e#Vv7*3t+eU}E(+$Kv6j{0887L3afTU(Y^P zmGJ}zib-zG67`k)GxIGBjZRWM$>DfFkq=FfW=mR+(FpM(wR$Z^(Qpt{i)@j}XfRDA zq87Gpj+g>-gptPu&YmJu%%JC2{X`hXmo`Rd@G$}^v%C&=m&njH4Z4ggQ($qPVgkoR zK^q&ht_mzHXIe!jmGPyxKz79&T*3HEobXsWA6f$E?40e(OwWuAk4%qG-Di&`dl;JM z``VRJ_I}1@@7xc=mC0Kp+_Eqms(7hZU}N!9Bb6O^mO)y&bKG9sBJ7h-9_=qizz)lXXzGAWmPOIf6er1?%|3JsM1J7V2SEtd{#Oa>0trs z7>l~e-;@V6`1kpgmAwF|1?~*g2L%D7q6o8B&&od{nCBPL3Wdh?Wx=*Wo@Nlv!KkMM zGOdU}lxA0$f0wzZdFM0BCXyz>HLVIA8j(rNfo^;8QK%^U!(>J(cib@iQDBaJZ>aQX zL%;8gOEusCI}U!h3z`(y6Zpgls`e-wG^}r4*Tmudk>_cdjQHXyYfOjU+lm`RB8(8hI>W1V<@mbL z#LZf?2@-NpccdE3Q)<;tdD}2jlEKpueL=F^P;-GDUwQzH>)9Hn7r8{y*mX#=)Xr*| z^es45Zfptn9GObV31=)3YDmA?+L9*aaCNDe;y@%T0({jWWRj9-*eBEsis zj`-Po4v#FUp8Sm&@#k4i^x6ArBK#~R!8A)CWM9DbY4BC@48o-pTQ*NwUJaZb+#;Th z!&DfjGQ*Q^LrEQ%sCk$vhdZudabSNcCRxj+Im9mQvT-3jX<%v2_f6Kfr zO=9ggcWf__U^~w1ZmvSK1nD!BcyucTRok_2QR!XNg*lsHSrIlw2NJKuEjHzbthqJV(%i7jOGIg)S(US;p0G(!#6BRyXB0d-JJeuQr}_)2OXnGk5nzMB2ho@q0t!oroXV zs(DBl@bT+42|8eo`fdkTDC?^K7_hRT4=aNJ@t7=tQ*&^i{F3+>3W6bB)vhrNj%{3f z@^$o0x|&_*?$3BKvfJEk<2c>m9x)RP(8jE&3_GLhKP%g-4hef5tKpyUkGzVIGMeTY z$Cc{Qh%nF2cO{f6U;bEAto071p^gkn5iZ0y;$^vA}! ztdMiK2PY23b$kWvNE_Wo+;;6l;VRfdB3gL7AGVMfmnVyq^p!TkSLar;^Bzef-3SI` zoL?}EqfcMaimQdEZoAgJ)7Y*N|2gTm!?p_73EK)oM)B)+9=&SUn<2dNw{&|Ey)0oG z5=E9)0(N8aM+>pt!Dct27b{-9DBQ8#e?<$>P+w-`_aBjp&%4mJVX`(e%QF9l9ovbb&0a%9Tyy7NNf%Z>QOK5bDtBh@srFCO@5 zNJB)Uh;A88qHu|9sEw|!q3Xq@nFy1pzUAXa)}3vJ%C}gYg4y;kX!}(VhCQ?u;-;FG z#ZUM>FFFtwmZqU}?!`2?Tcu@OVR6G$1vq)e-HDCu(JUF#PREBlLW!?*+Is2anFLHm zdP@$`WljnrxLPx!j#30P{EeFjxA5r^?!h)M5!Dff^3-H^^qMli)s%d(EBA<2*7+qA zD*V?lBkGSe?g;x7%C?*KnyTyTRR-&>TwgJFxFZoQlEo}}*XZoj3YG&G<&<|4v=^|I z-|4eiUpDpx$6(GnIJ?GG4WYKZzP=k8oCgf3*q}~mz)y4?(xa;ZZj2`-s}VT}xR3dQ zykzHCn|^nP2#kRl*=2`zl82aS|Ei@K(;7PRM$nh1->hsrilH*pdY~axhWyUfP$b~O z{TT``vk)XZbGwkeSvWqBod^i!33FO=notLIVbHVj5vguk zM>=FdOtQ#J#1n;Ieqy&6wdBUTF%p05Jg(bzTKDm44f8(jKiF{`7poFhZ5);;Z30!e zzQccu{3WFsn@BI26Gz97waMY<+@V8137pCW8)Xgv&fMnbvZbD0k&uRrpKM)4CG%6U z#LTRIsv|UO?pW4tgKm2EH(T?279s4Y5T6aU_hUS9+c_8=3ler2Z8_G6?$Y_z@UXrc zcEb~k`QmULkzc69a6+PC!-g9YPN3QvHKpEl66rcdlF=qbMe!$2{D~xNJ2}_*)4`@0 zIG9+LHkWkZ3I7ntX@Bq9q9Gl398FA-pK{d0Ip`-JAhgayFCxFrR3fePDaQyFzAY9c+|htQ?8UHg$KDTX5+FS8JR>o zLP74rs9nM%S5fmhK7yQJSI)vQ!-~~RfrL@T3}a88gt6USe)$fuDaKvMBPszleOuU8 zj9_DW6B;P9v0tGoD9zui_V*fGfw)K0rFm4w+$OdUGCyhONL(Hf(9$2_jD%JTp$sF}iDr*l z;})VSF%%*+nGtH!@Q8h>E#Q)3?UHSf8SJlZ<`m-r;M3W&xNkrlLNII2>~!cZx*X~{w;Wf_ zcmmrP_4UQIU2`<#ye%ao;kgRXKDpJIiCp9s-gw_{w`{^C8r%<@TqLPc6hfU$=*-aG zmBs&cX2GUvSnrz;JF|wsI+iof&<#g%S|}pxQS9gW_$zApTPpeyXWKxm&J479+3@Ae zLLcl%NKQ7mTQxe2(3`h8ZM6Fq7-f62vYJw2o|bo&@+ywoc5Zw{{`99S)crsZOm>r+&mb#5ZLmb5tB% z4im8FI-Xtjd$dbtOgjcr@tLX=a29T&nMhQvRk=|67FS){X>!%DC)*N0k+^nMr&s08 zR*Fkq71x`>u<{gFSk(aHaScVGv0{yk=m?9Rted#;;6G9JG@ev!S{Ji)jhmw~L@t#Yv;#&hI<+?n!-1BmRzZ`$@O7g-|M z{pdeitERDs2{cyP^DiM%Id!D=^f@{Xp(#o;*wpkD!?#RMryD`z3)=11I7iN`gZKc3F3FKqL!+5b}=(G2H&B$5^Iu6K)02^N$#dn7} zZH4@eL#AxhA?0-|3Vz4Ojbg$L=2zj<6Iz!KYYPikFDD3LUdAh8xU{MOsq~D&Pb^2_ ztxLtXj9;%Vy_Jd~nQp`tP?sN4fO`&X734rDzr})uffU(9^Udti1@=R3-b2hWVrF++5-3J zS%`>RC}W&aamn0mx@x~TtQ*y+rhND=ONJENvh~vo!bvZdfzbJIeE~w|Sj^h)RpiNs z?=LJo<|?ME$cgM3{$DHxYtOP^+1c~;ZX;}8;0|aW5qhbZYb(;HYiLHf7EzeJ1I(7j zuT83DAcRbYo4RzSxNtEA+=}$O>MY1`K1?=sZLEK=BLBqePW)tBQb9ucD(rmbpi5g) z@$6_Fr^+f$_1I;sq%lZtZ2T1+`NuD}~OpsIuME7&9T z%~GM6Y7LVIi!UqY&Bvg>VfHsVdI21>+YNP*RZ4A>rJF5Ed4A7~EJ}{Bv&d#d7uq+Q zN7Hfp#9p;#$y`C@x4Te8;+}?87Dug)+@^{#MXIQ_3hlc|?=|Jm(~Y+Jnx4*5sc4W4 z86E3fp0K%S$dGw!@90w3Mr%>~Sq#Q5?fxjaa($Y9{4H|~YS+cC`p~#C!xkaRZNTgo zx$3Pv!U!k02h48(WYanZF7iDql5G^+V`ZQEl*lBA*S+i(|K}!uDkpQhkSv2SZ;v;( z2bCnJFuSz4OSqd(pKoJa!^Cu&*dSsG8Bxz%HPnn&Fs0@jgwRdet>#D=ZS*LZEL*vh z;1OqhFT}q8t<)lMWw7Dm0R(hwdl89BRPQu$QG&~ohoc8R%N^crRM!=ffTslu?BO(C z`pzWn4RWDcS`9(?=5}+JI|+BWRIR>=@0rU3>~pjc3S7HZN-kXEkE1vhw(%D#7fQ(? zUo7d{V>1@6r((82VFwl*?2dKai7}#NDKnBYaB4&!4^P7X!Wg_wP&3k}4c9koank8n zxPLyUTdhR5R%b(WQMGUt7DO+s`dFjR0q8aDTddkXZ-yMMHlYqeWre#G@CW$!jx1k` z;IwE@oE2yhhhRH3#J9;Ur%fAsls~vZS8KbG!@$s!uN{uv+}gtD>0?N-P=5CtUw=^J z?4rnf!j1QKcNw+C0-oNT1QqN!9T-Hq=RDuJu zKjq#kO0^~FrWKpHJFiT6mE@39CDv*MbC-zC>Mn&w7JxPTSeKc`Z$9FKobpTOy!c0m z3l*LpD=2s4Ra|_iqBC|s4`2Awv^+Se(4|;aT)F`_vhR8 z)j}p?4Y`PC1jU9|QagI^JI4&ZV#X|2Y{7c-6mMVN`sf=~9x)!Wo2(}8C2jAiJ)CP> zuswThK8Xeej8ONb8jr>2r-*GkRg3~}I~o`wwd~oqH!S~lwgX}fLfleah+B`}%_8Dg zdpmK&G}2aK*>B0S&$YDNa~qXREf*TAu|xnTKFlCnEW--N^9hSxlW+xU$Pca><5B}z zfU4#8;SJN%DtHgUin;2daPI2S%-L(f?ichGoZs@`pj(PA$2BatJ+Z%jzsF;npi&?B z!m^eE(!erYs+*4!=azPfd{VjA>hE`0^6+WAn8^(_%}A!BHl0`b_8~52 zB}ubk@Y(4w!>*3RA#CAI0Up+9SHpQUiA4m-*jTIXiiNx2Zt2WWAr%uaPte(O4i&S!nF6~~|d$^Wu(DAJ>*tO?qbqodKzL(x3cEIXPEF3aN z4A8boUcbyFlWBoOKv(ih7YO7fas+pp9iEOz^l;D#P8g=FuX`kcpaE6kR^GpfZl$EUdS+o*5R(w9Ss9MAbJjbOD0hR_CiT zwQNjK#qqjVT1Y6q`&U&^5e>vG+grQq+`h&FLp0F|SLalYbZcGFsGfN2qA}%taDu#H%ZpwZDz9^tU??%*lY&z&_U?e?~_F@eM9#G!V4=`rb$|2~CKrEy4JJokU=YpCu)*7)Jl}pMeG?;yJXDNLfYbjom zXv=5%cc!d5=;PM7*?ngI9yJ?n-$Ucjq1>Wwn{k;PE26Wnc2T@vzuT60OQPKg%_5dYlZD}jQ1x*NEm@B4 z#+u4WE^+SSxDsrvyu4W13la~W&-VJRgIe2*BJ-9hf)HEl4xt_V!`m~espW!u%Wy6; zg1DMZVFUK9c#COrQ2`kmTyVkQ1c#&rOPC*T4kg>vhk)GNav{Zj7scAmEKFhxVKX)a zL2@o=YSTT)UfBm;@QNzINV$<7)H|Ms7|)C2Sz0x&_9h=W@CUo>3;~tmPz29p(HCq@ zXq!Q!=S6^JG_0#eyk2~F%DGK5Q-(;6lXv9vc*!4TZP;DKpi(ABSkT?8g zdRvBorJEpQvBB?5r#j5Cc3k z`jX2+OF-=9gIK0O!`yYya}+@(D~%9)unl1_iyj1zY*h&x zbcu;Vz7iEi6fhx$jFR|87_=lXoU{JfVLd_JoS(L{1}~sd3yz?jFnSM4P-~JWP>_LD z`n$CCsDwuw#nvB}D6kn8+On*J&Ijh6U(xs`|xSQ48%xE@_d|-S0bQ_#C zJ!&K)g`n4Tf<8AUD|llUrJTBwQ3qZ5V=PwoFJjeQNz|`03~bOT)7^{1&uv6s@&w z@IktgY|A3gfYqAgG$6#0mS_OJ*zpDxdr=@ZvP7ddjW&ZO0ZVT8x(Ekaej|byxMXqD zBL`G*OYT}p9ip1o%-Sf)?5LxQ8`y9%QEzW3gm$VbdJxmTlRHg4%SI>GWj;sz7?LxQ zd3b;W2iv%1+@l`#IY#qgXb|N&F^SlSHMzYS-{J@nJv?bW=olY{m-F2erCKk7z<% zY!TlCd2A9w)eZI@5^fg(+vJwm#}UG0c8-<8i&HrDG=s3Vk6)=}qB(5Ir760Kq9^wW zC||LcFyyJt)Fb2~(pH{|)}id<4nXiGSCjJzlfIWfSk}2k!#7 z&a|tlW6{;{O4nwy?`6$nd9T>QxuqlZ7e3o!T<)vlJcRr41hU73n!4VAH7Bo^a6t1g zOpc-PFb1?spl9BlS?u)7i{ zK&%W!V_yc7Irc_yVe80{JqmDqcU1bUUFs}v)_d=SWjXt~Cq{P~@W+G|7u%s2*>Pen z=4B5;o7Lc?y^L#DV!i<`J=AJPg`WVL1HZE4J2B2AOyfw*#9s32E#gHjk%7_n9M{#f zW7%Sz#o|Nb{=pU;l~5WES@-gx^Fkj&m&~KCD`Ffc+{9-tl3V6x*Ftl^m%qEd8RaAy zgI;WrGv5(`%-XOJ6yrXJ>ghTq{VuYN*IW%C%m|p~4%Na@h4>wpHZaYbi3qWOlR&tJN?zirycib{QeC zVRQnnx+(IJ_zjcw%a_CY&HB}AHUOvG z;-^P6SuAcbNxr+bsy#;#9$i;vQ|8#S%3JcdvIve2U;>^RKxW^@@B-4Z%DX z4Q+xo+{2Si=q9lY=JN4YEAgUxOk~cKd0KM5+^%wjTlwMJ`rHtoG0s);)mHk-0HYU2 zhIPW>Z`u(ixs0ggJj%9$-g}1}qQXQ+dMYt62NK%WGT0jJFQ`w}7>%RmmcLNIH%;9} zvx|VBXs!b?Z$LDmYK9uKb-wW9#u1NmEBZFM46H1dq*Ne*PK*=R4?_p)@#KqOl>ra_ z>B^N>kt=ajE}Hkmfiq|A(8^t9{yOFQgNmEy&ZUK1&+;eX7M+LR;X_!2pV#awg&*#h#hY!cL_;727ff0k8KUi?_)&ftN z9m3~^N5RM%(tMo@m1Wko_r?0n9a8~QG%$*qRjg+el%^fHx}#Vft+w<@8K{k$ z6R}o38d^=d$*nXCYp{97=tBi=2$Il{{>rvT<+Pix^GC=6t+}3M`MbLG-OxP8KRvD- zj%nCI90_Mxch;%h5SVgCVOD;9hY))?dsA&hCp$ZSsg>14)$*A^rz`a_+SZkGoIcl+ zYTPv?5>BZU_#w)os{)b8;Z&wACYmq3`7n^PTczZ9AF95Y>8j5>_~P5HbRssUu zw2;d}4QK^A+&zI4!T#FqjTIH6wg@wru<=WP#c;kk22v!atWyM%iiFVr` zVeNI_>Wba6>8NI=)fAVe_=U7LTn?@G;C=BeUWp~T@uOjD&R&#li6u%!airsPlzMEx0%8`b18_`aW;bad?!9Bi`)xFBK--zCGz(>CCVKOvqf(Mt5Yl858LS1J&46nJx-%M?5HZRak|j zvcMv>&vXB+1jHJ7^J*C0zv zpgl`C$X`A|%fBW2TVt6ALpbpz{r%!$BfAr3!*mG8o)6*i&wo^}7m!N`*>#k!9X7rk zFT$ba_~bk@H>$hf?cJj9u`m_xgqy50kzc?HYV8S+J%2E8Weg+Y_8(iF!7yqxzXBF) zF;+oc5M5#A#1)$SYVCzHg0fTpAgLp;(Pbw8ZWN@5`3gDy4=u ze5^w@I)P%A@;Tn#BE3o<4?_5C&i6Dz^{J7Ex1ViXsmEdJF0v3SCAz!GLaY);{3%Np zR-Ucpx5FH5J^_;3j9Som+ZJ9BUa-Crb?dFrPvm@qAs^Eq93dC4EpWdAB)QL=wj=|J zB};sx{`WU#@d+*#L#&6Febw?&jHjG)?K$DPrqt(97TOiNld*I)$~jZ$kDE{gX{ zk({KSR6(`DeMq+MqIHccyzq_i55p(G{hJ|N@LmomdC`^BHR=mG2b6kEZG4-5;y8n* z1&A)S&XR?xR(Rk0D$Yn4qxB__# zZ{`#=2=@@QB>S`$9US4y75Ym(CVqU$#?CdVHY4#N?{}16VSD0CJ#UZDw=mD~%e9cf zkn>w#DYY-|9Zn2UTYu3I_`4p$bK`Ke;SgS#q7|3W9b^1T8kb~Jc?1b39M9aS*s%E| zi-lhC0T5|nFrBlJ2&=T36-Ficdd%3|;82>&B#lCHP@JPGK3)}sRjbI|--pYH?%7Cxr8&m`x~Vg@21sny6bV z;p^qpR$ila_=Hy_DK$fBGl@=$^A4|W+q{aiD$ggpS&c9$w=UY~fb|>0%zimyvvU%0 zH_cO!$T3s0$RS-;aN5^6e8D+mPVxLKk0n_g}RO}bk-wdR)3ZNsagmZ4b+pM))gtdV%qiea_e zEK>85mc_SD$dN7*ekqrA!r2wdxJ(kik{zYh67|Z0Q>&6PQTvZlQBXZvT`#$WcKftm zgmrn=cE(iy@Zq{&ahBN3UCtB z@;tdpm8>eU9cNFDu*~6GC5{bMpHc!edE;qqWDEP0lC?~c46hy5 z=F^s4s+KFDnuWx;R!OWoPYv&OBiM4yF{>kmCP5^;|MXfTQQh02ma|V(x>vkjg|%HY zMz~{Q(^zL@e`VAyk7U9yKr1#22w{dFbha?LvtFHs;O<2$^c>3~Q$LdiRfpOQxy zfz)SVv{a^1j2ivDhK2vVrx8ziBGSv-$>8TmD6du^CUz}NlNH*u_ZD6e3Q1HJYq@adc=~<`G_UE&%N7>SkEK2`QDLBzJKJBA7BY~;#(Rg&^{y= z2p^IQR1e7ol8591y+d+=*de(<>5yC?b4V`Gc*&tLA1POw9U9azJnU^bcVMhlY?X5P zJ6PcDB`4qvk20@MYFWHs2Zp%GZj+uRn$s3d8e=N!EZlu|h=xdaDK}Zk(+I7{jF%SM zMrFOUr9Fflx0kz#0B`SmqAWnJ9E>eRuT+7u_x|bOY`Z93WGG2;R?$(~+3C+!%eh$W zHTBuvV>sIaoVhzS^vhW*y-UnHjCF!S3+av@nYUc|U?L*dAr8*Ha0iVo zmhQqzQ)!<=Rx)lhbsK2~LXt5pa_YvMQ;S~iHY3n>Qrf!e*5VZ8y&SdjaLDYx4%TZ$ zrJuX$mio$fl(`L_{*p^W)Z%tQ2ll=sx)VN1n_Z)2j`>6K)xzw?sf#n}B~ME;iK!Rl zV$H`gOnvUArZpMe;ryot{U#}L1)Cf4#6#W!e{pQ_cMP5F_YNoi&gscV)O~_~&n%&f zVwy(hBgzpNx%dpFk(19*8oBulrIDl0P#U?~#fUj*mLdQlA+!A%YBB4dp%%0M8EOHA zpP?4eIPXlMYH=UVtiyBi|0BiEUow5YD3^P_;OwmeTtqm@Qz|A@lSp_;I~l&)T&E4+ zM+mRT3#jrbWt2B*|Cqw3l9wwC`B?J3XxS8sR}lGXXF=ZSqBxS@t%mziZz9=IMn3SsKY2Fv}ES$y@@R(NF>_cW^8g_l=jps&su-UW-K4AX22|8 zNG=v2e%9wFK_Dg?-c$fh670hGIeV8UTW=ceu%(~}&aO~W@Rrw6t6HAXIPD3B^5~DY zwK_^`vKECQ+Hn>fjKyD)>qUFQ?(OU>Aw5$)8ryx_OXs5RDdpey@;RhEiYXThYqYNY z)Vj^Z`@!&jv$LN1lq*6zJeqf2R$KHE4G&Dj%<-muPQt$_wOPiux7|gRM2+&bJERs9 zF606QG4q027HwfOv(qcV=&>8V=h7kcz96U6j*UmSoG>S;c;QuXHPMYjze|ZVbIF? zCbYIXoxN_*w};PY%S=qt5lP#Q36b7nOE)nPZHT&dJ%}$X2Z9BE?fp-4P@VA19cEHl zQ=@}4D6SzXpw2bfqC%KDOM5ns-Ag7T5|~7pzBlt0^#`$6o&JR3iaHRmw5Oj? z31=Qt)}LHu)bs=tAImypQF>?Z;ma3EEpygHfzDg=zB;*InCMJXJVDMwwXk`_%q254 zb0bfq&*{6Ta+KEcMZ5}}1#jm8GEKrI?Lv#^Yc15X%WKKxE_h6Ah2Z9UWZHAp(m$l6 z_9i_pLeQ36gFEj1LC!XX8A_HVq$#ws#$O^$pqD}+jMKt8M*0S{4=-OdDJ+hwJ2r3) zWQoDMu=LGMEvMIZN({W>KPgM%-S{M=Yc%+bFp(as)^s#&G=$<(isp z5=WLll!73VAo9Qz7e#~SfECi_t&~+EYvbMdxJ+e4pP?^}R)I8&g%%W6q2S9TG7c^m zE~XY!SVXth()OfUT?29wR8GL!!p(zIoiBNOZ&I&RM-Ufx(L8;Xb3y0CpLT#0=&Us) zsP)2Y{5sM-;3+3+%YCkaN>@c~QYooFjtxBoj>*zjuSvNQ*&H~^X!TaWf@HC31(#{j z8AEPfg^R+qR4VyQI6uxB=3z%+sC%ig5{`3+4vENf>~;d7?c77+dVnL za?bey8{t^FZdm*<^+UxW5oQNd+{F^ItlyDB`b+v+u(+Ro+@ zQTgEor>OL-{VRK>TnpAIE@$uk9x=M+Z*kR%ifo#hIGDs`xad?Qtn)B5=a;#8B6B6& zQdpAMelAc2$!*p^;b=)L-Z8i-RA!A}ijSC=2PrvzVq9EoH`OGx)UPXCq7wLLhHbtI zUCX>b%&bL~9w_Of_Vqk;z7rB$9wH=@&UdJjirhZB;;6(M9cI#fG-?bjcxf^;wFWDc z5${MmU2jR{&!H4v_F(n9rq;+bln9h;3PY3p6*qK_=p!tez-mRZPuib2pzCQ#Ww5oH z7l+mybA9ZvI^Kt*ARkZQpDX`OdzNeykH$xs1)G0_OW>Xb-UzE__-`um$fDHAl@H12 zA|+I;Cz%zlOC~xJRSKKSr4=B@XI;q=Om_H9xYmMV%4Vif0Qg*lxn?Jdm$snvNExpr zI0}Ahy^y#1)kx)uRx|=ZN2~e`8%NI3zX_#{8U(}}Ts9po{Fwm7E3d|$5{4Ihnxi#o zC*tf{?JtFYz$VQn{ChiuN6EBLM&H}d*!$ZhCC%xk+kD?*?KqT{ardK)G@NQMW^+8e zbe~^^lNM(dK6{Tq(JtvP3(Cc?P+^fAHQ|fGm9z=uPMCK1g!40$EeC{#emC)z!}iqM zYApqGYHLZ{tYy%xfx{iOpHq3{#7i>G<W4kPp3GXimzPsWYbpBZ@R5Zpax;~~&{abe-~p|Y7t+WQHHKG2GY8~-w#;YJsKOQT zf@i{uFQgg=V8t6pUFUG+s3kLuc>kz1+VJ5yKY|pR|NmDy>8+v^K|et<*GB3bkcgan zewtEAd)varK0%FL{z-rEKwss`R(AbH=KCfRQM}KOkBR#@*HwV0D6{9n7?dl%qV<+` zs?b<@kwkCu>`1e2PnUyTB_2lYRXTqzOT#OO2ns#eJ5dXiUg@nf?%6FA7~Lz4bYgSpTBe*Pe{~ zgQOzM*W=}5scSNA4k|NiITHCoCqdB0(XW;TQ$aR7w`gMu&-qxxOLOG7D@JJOMp$@7 zE83uc-?tLma>2?r_A3XEK&@%S+AkBDNk}8w&rk3q7F9?a>sB(Mc(G(!k%SNKwe+(A zrnJ7&Y2qfF39odTx>?@&4QA(lv~*@CoZV%lf}fw^3Fltl{_A9!a96v3YDaHUC!Ewmzl21_AkQadt>DPG(5+rpgTU5<9T?;EB4)&n z&1aoqq<%#?ViN7?s-d+C7us2MiK;%^L=E~jxRjTY!4octO1kZzq%$z$8#0UR+)F&^ z=6R)@vkDc?Qv&azj8s?e>&5qTeqN?fVkIeNovr^|RkL#!8AoZXmQot6rIf~d{v!ND zCwvMc{y7M@qW9Q&aOdnZ;dbmxF!pc26TZo10R0%`Bdm(M2jvVNGhQzBUA)>iEZpz! z8yMpB5)J>&v7Tcnd&j`=WB&usm>kEp`G?VP>|gNyA-^}kGeOCBkCTe;ZkR8T>XhSd z7`>}(@hzTZ&y=7%=vgI0*K}0iuIU7{M7)zKpMs}-HNtah?T9yf})_#{rKYPTtQflG?!T7a&FSd0puS2V(A|CE#07zaMsz^Ht~Oq zD2!7&<9XQvqOT|_BRUmF7?(JmXiglRYpHk=*M9)la& z(pMvslFr^nmk|t8>M`X$qSRWkYz)mRwm3@3T4%}VdMuWlwiznK%%zyrx@;7OmLCE# zGHMFtBi0n#|Co^^gEYleiavILsQ7q_ifpgrDq_OJaxOFyV@=!B532=Lb*;s>fT2|A z@KvY#a+{i+9A8y_Q;9T>as;QvqQ>C2gWEWGg!crgE+bU>VYRwL;~q3}Sgr2RxQD~y zU})U4wa%c?Wv=BC2lqcwm}`QjV})XR55f!8I;_p^keE0W5)*RKbb-3k4~E1<84@vi zsXP;($3a+8ZXxy*UC>4B83*(D>=`hLoFPV~70V=TvjwKEg2{)Mo`H`@GwVX{UAWGD z`hVQ5Y!_O;ACPEWV5xMUVNcgu&|cSC8)*f)*4jLv7GGd+dhSwd{D2WE{ooOfi#v1~ zq0$fQtNRGYS;>QIO&%~pr5`-P$pc2H^uzk%;N?ar z$E~=OHP>txS>@$Y2^sRT^SVhuFDc8QfrTi&O0v0u?yU3om%>+YlwaoeI_L2J0Vkb5 zL8=#1-k`)cL(hp@AwTiaPDkr;Q%Lu`xKvKz$A^^^jfN9fb%y9UX%LtBl}>@ybL<-b z`0XM~Wf!>RxKz+AqAe6pUY2|9R$f|_>>_N4r}W`1=eBW(XATbPL)ND>gF=m`j7lYw zZJ265t(Rh*IQIj`wOHV7)9^64kQADcVs$%bQmm0#e(!fm`r=yTI+1vI9;umv2oCS1 z%>ftVXP;JQ#(I)=DZB8fJ&Du%iFq7S2lgc2L=nS;*^j|*(d5BBwbzoHFV=Yq{BkXM znz^{vZ?5nz)(%A?EzQ- zw>_Ubag$xuP2!15$D0D;sVCvJ@JW_evTd}XEsvx;JL$Bxv<-P^(4wOS)UA|brgWWT zGq|-QX(O+m2MTt}QxH&1tw%X6%J6%XawuVab-}ZIPPrpkP!!E{lR|kZVagLMaCw8O zAst9AQhK?pcT>%5$At@Zs#JNiuDPnP2a$<}V&7 z%3&5~+jww)iMxXDvuGW|aL%lSE?Q6Ws~6=-x3Q;kX%ofEFLs@0UN%_)t_dYdD$X*M z&2b`ec=54vjJJDqbz|FO<|df9XBFNSSLo<T@W9r$9jfaLA!yq!y-b@IeY z4{0d~FLImWOcKm<%1^;R#ZqN{5AW!51kQbg!W$jol3itxs%bTlLZ%<2?|zUcLf+S_UQc;Tx*mM%3P}EYf(1K%~jyhz_L5 z$d|Pnk>jB@)$H)x#pOckg3+Yp&@Ht5RjkkG@oy_ti|}bHb*bD|i`uyk#~sh*Hc$L9 z!8<)C2E!j;>|sk!K1c;uxrEfdi&A7SXHxFGAd+aMPFW=DiBakPU;l^L8<)bHSQ%wo zM3zV~mYAGTFg;D zbBb)g36(XE^mRDg{p_1$pz!Kw5El>Uh-Vjx*EvfCrBL=r5E+MGt{MFuZS11Ea z*v)X?c!>G%S?Bwe#a-DDZ(&S+vWX+&Zm~64SK?MjgU%TG8Rwg#-I4megZ35g4mgsf z>8(VpIMS+&!PT(Hj@Y`&K3nU$3G}F~tL(G2{^S|PuCmY8`tCD~U1guG^(W8Jy2{4Z zyZWUh7mFNXTYjA*QJPA|mXB0kduPv9zLv@#3CG-Ojy~>mYj0#p3X6a*K!@!!*6x2r%Smj>9nx# z1M0-qQ(7j%MBYe^O@H%q#JLTfP893NL~bRd3jy2@S2&4$E|tpay(Xw6-%O>WjjS9| zA^FK>c}w%#qjmH2L3tLQbk2jjWF1Q%K}x?-tReng3{6!zja)}m!W*4q$}Q#G8$e0! zKg{8kqL0Ft6&x*_JC9ke{bqE_1j`v=*%b=^_6b9mDws-le)bS_&~l1)Aa;ibniMUTK29eY&P4q~bj#)ubm{$lUKRLxZo_W*MpTtEYWAC$|rhyRxk zPlbMYIkQL@Y*x*1jWL+V1scmSL>j#;S<#W^7Ao%N>=s4VNn7F$f>G&y=V+mHYoW7z zxX`U!hUpiN(r5T)j)i`tOaaiM)*P3#z8*0r&&Y02M1UaOj!)9k%bu|?Rcu}HN@^it zq2que5gr(4(n;%ti?Vq9(26KcQCWt^N5I4Um_@Pg5ymEpNEjkNk4Hbqx{wbz1x6 z{d69COn07sJ=1`_#yBNM@%b%Keu@&K{HMBOJWs~-@wPg{w56kMht(O*e1YDNdQblQ zO13BOc^;d0oBrk*`AtgBWLCD9n6os^O0ydWj=Ift%EqaiTay>hOW(9Inwf5Kbx3rd zUD8LrUWL|g(XQac_p13@p}y{m)jhDuN9ko}X?K{Cvy>krNIgs>s?|EoaWZ&@*{J^o z{!UX;Fm>4Kp4oYufkSYT5}NrmrS6>6l zCzZcSYS{brys*eeS6?d_Nrtx2y7OxU5>E=Il(By2(zuw=9g}iFB(#@vrx@h( zF|CR~lFQ1K1ZQ_*k8g2WtlNl0Ou6xYSdWR&753^%#?emHybZ9$qFijFOuRN`Gm(%G zA!<&(pi0+>T}=t^c9zRSHOpmlwIuBSZsGv?ih-zFoJm|H2Z?te{^V)m1o>ce!KfA@ z$>(&IJdZ^#FNNZZ1$vKlRqeN^Ux`bYM&pOQBrSbcA&>NO&gl|M6UoOV2``L(8(Q&L z=H&5u)`LYFk>aCrT_oumK2y!OIKuqXKC8AUt_kEvuJc*BPfrN(mVNrC+oH)L)nV<| znZ0&e_!`U!`3u6!y4_j4M)W;xeC9q+aI|wBDRz)ZD>r1)$2`(smn_msL(3TvkK?kzftyer!>h8$rJVo`#nuweDus%OFe1! zri;9(@Ar(uRr0hE>I!$HF9|o)nhp*rK3JZ$ykzK~j@;4U^OD-?fYB@8u-40S(_uI` z(v@64@I6$;(Y527lb=Q)3nZ^0UA?nbc)1gjjv2b;Uvn*LUj=XSXEi%fjc{Fa6!zl} z;9DWmRh2HeJjbtCWq8ds4z19z$!gV5EV{JJCwV!8TB*es)RS6eO}^-3(n@Ncg1cHM z!M$H{M7Nq7l-cpnEPQ1z+YU(nj(5J4kMF1S{!ZIFp2)ik$f%$Hf8~CO-6)OY{kC`R znzY!9_W4}rK(k^pzG(l2bH%w^)TiNGg2pV6*MXw&*tq+gd%<%FH1gaw^blTz3sGi7!Y?96}SC2YaO{ zb)!FVW^q8)y$f}wTvp_eTvq3hTvqCkTvqLnTvqUqTvqdtTrm8QT=4ynT(CZ_Zjo2z z&;VM8<^!)t0pdkl=!Lt6Q+Qxwy;)L~BXv#B+Bq?->5}i*Ar7^XVMww5!8uXxJSTZb z-F}yg5$9i$HMS1Udi}(0^NY(%>6a9jAh|Bjg5-MnUGr@4Pf`N;Xm`kppDI=Mad^({ z@$gweRI}y__r`%Wci?ip+}>N6b|XKwIKSvam%wZHt@y3Pa5hhsbr`O-w)xzl4QA^0O&TlE01? zC>V1Z>}+aP91x6tsq1L@UXUXDl1D%uC28P!S;LdFf^Hfw>%i@c(ks-z<1J%D-YJ=WA;0+_h&I_yZ7YjQk8=ItJ1Jp5J^ac!nv8|w zPv79Np3~>{zI*!kV9)8($4(A>hPDPi(>KV7KN;BjUSEh0jI;k_=;US50o9T+^J*B5D1|M-9ZK#fH_s>ph#(TeY{N%viZ}*<; z<#+%8)XVSc&+i>Sd2a9b_4EhFPF^^3?Buz@Gn9Yn+}K|5;1r_4RAWf8jm<1&O^U2E)0%f6dbwd-|Wr z-~YV+3~Gk|+6KS>c@=p*^zzRd_?}vc|Uk-2>JII|CG;78Zbkugq=W6XDDLw|e?~r2pGV;oB$uRA4=S z+y`j%WApq(mHw^%{F~Ie_559j`}at1N3s2IoLPTMZ3CLKgC}Y2S6=M*|N0rovEGxX zdQToZ9ZoPF{(tJ!u~Vl4UE9m^;aEz3AskPSdFj4l>AtLV->IxLC9<|ptMSzK>8$kW zyfh_1`3nPke>w1olC1w<4Ls^Q5qeG!JUSUbu19B{3&-?xx(`gz?`eTTczotKB%nV$ z4F<}CB;Y^mZJ<53_cvN4{r~|GfWIu$BM05Dka6O5r78Pw`Lq8-rT;I_{##yQ5BlHz zud2j8RllQ$|ND8(=bsE*q=ESO9Uj4s9!s+arC8>#<>h{DK&fit-+Lebo<11sXgC;pTDYsddz5*%Un)y5A_fMk0=NSx*e zO8cRu{V=8d_>}mYIMk0%8izWgLf^MS-#_IzNE6=Zk57Q7w5q>9WJzL0d;fkPJf^?j z$nm(S(s20?t)V|mcxn9Lj5W63W7Yl;)EA))?EMStO-$*JA@PCzQ|W!b-z)S}Y9G?> z?K#uOD(s&VC)j`K`I8rnQh0`paUc$^NvR4)%U(gZNYaQcO$x=j!BT z{kfn&K_~&W@c62+hd&p8>DAg$mZj>41;M&_gsc9|bA#et10Q(4_^f!F<>^K9h(81S z7lm1L@H$=p`3nK2NhA7y_B^ovebAm19yEeCK(E(*F6Z|Cm&m9QEl>gr^3%5l&mb-I zzpO)s#B-D?`Z;YxG4SZz-tRCNaP+4J+r6Kj8GOzwQ+{CY@3ffK6yWBU-uM1YL--`E zFnTffgqDCu#f)Ulg2`S&6enQ1lXTM0r=G-_&XUsAd_(zV1 zr)~L>(X7#6&xQWJFRGh3mA2oX`ujegkn3$P^V3s9 zaDV^l!IS-7kqqVc(cs_-73&v9^Y{6|r15Uw+yCWX{N-o1zWY_7-QcB zqo?b_o&D>5;#WUb8rnp^rM&@v?G?XG;G-!Ak~nJbso+Y>qu%G^(|+g$bz|zlBLrX{ z;;Nt4(NPQ}r@~2_v3k&)O~CJ8mlW)y7(ATB7ki%z$E}!XbN{;ieIs$3{lJWU7{~fT zpE$+dU!G)1`GNXONc6=Oe{}M7OBY1Gj2NCU3jPUdl&J*Y?H@dD4?pQgf%>~N(Y=4y zFB!7;cl;l$7OLni)%ppb7l94zSNcA8X?X7cdG%%S{{8>H_vA^G!PKBsIG(kxO6y1F z{N(iDiIm;n+dn9xu&n<6Uidm>yFX$SHAa^ze+rBT9{eY!XNbdJkV1&_BLAKPJ@lj@ zp4->-kU^U5*KN@I^E9i5`XfYp`-0Fs;j@R+uwKkPJX7pH}s+hQm_vVs8?jc`1#S)@2jyFp(a4Z!-allE0Da= zPOow<0F)n{>3xMq>u2xJ{O6~6$AX+N_cUct1z$Y3|BJmyG=5${Te9Ws@9TYGuum)E z{~LThd+zI{-oXCnm{vb*hIOJ(Dh)nwDJtLBtLD!Rg7}}acT3RVznOUKH}zJ15gly* z0|xB>7c)6VA>K}t3)D~uZZKRh;6|@hIk=g4oBrzu#Th<@E$Ix*Du09isiHr_>PSp} z|F-_reJM=mV7y>3wQlo-+&kHGrvJLPWd%GzHNz4@2@XZm>?l((ejecVh>P0blA(qA_=_E(kqf&Pr^&zk;xH34j0Z;xW{ z=l1VuZuh*KZBwWAx6kc=N6Oc^{r!PQ$Q5+O=fy1;9s@J1o#QW^WuobONIisIjeocK zcaMM5{QKZI2>k&MH}r7hIAZ);{2`q`K=s0T>DcFkdIL1)1H9ZHpd9h3{a|E-z-V)TFi^{*sW*8jqbJ;#0__=)o3v%24)qQ|nQ8?fyx7No2pzAACNb~`{d8dOH>I+GTl{4nl(z>NE675I#Vc&O zmmk<6=9_rPar=Eyxsb`g{?@>w7l5^|{J^8LjLx6=OHqvi4qr@Sk^24pc~E%&k9dBu zA2)+N{=_A$L^nD6eeM1#sb7q-5aLi_#g1APp_|$|=Art7vNitZiw;3x9b0MGbaPf4*u@J)bv*@vr)Y zkLWblg_7TOz3g8}!hZg9SU82ObAzDKzf1-HzxK{QMvC*iF4{rGrN1o1>0$y{@k0JdFP$?=kq-8 z^FHtMJnu{xoh_MQMAjEIu>Q`?vhlRZa$BW=nV86!eZ_1c%g75g>|L;XrN=A* zGKZ}YiXEBe*Npjv5hdzHA;Lh6*Toh!1%tE+mlJ`BrgFaGgU@XhLJ85RcNU;Nn0(L%f7kiwBm>)92GGbD8GveGQ;9 zG{3I_%1_)fl4dGrT<&GkhSAFf5ggHXc)5Y!{P)`31HXUj)DEbu3D48-uj=H7{z-(%>V zVZ>+|2q^+?0?^JVY>y>48bDf@x4|J{QI#-1F-tN3MV9~v+QJ~Pj=hNtR*WvEOojMn z+^iDMskn6qa(vpRwl}SP2#=aX&gmv>ty2qI>+B|a%bNR^d*T!wtr2&(n#Kgym~(0X z`P7WJZ0Hx!6=*V4jjo`#O@@Mu-xdYCxEI~UrD$d16fNYlI7KU;#DUPWw!VGErgC(h zg5YZupgt?iT154=?qDk9j)#FVwASh2TMB8qZ;j}*+6h>%k*+hOjqb8dO)9o_ zrL!sT$0S0bYAd{|$xF|t!zv3eAigK8ig__#hE?vM$ut)sO;N2q(kW*a#b^zR+(n#( zCYOqP%NflkIip$S40zCsfjrWv=wRYx4vMWOps%p1W>kx<3f!y&)JDUq5=65BA$Vb_ zG+HvMK!5|&^Gx$WKtkY9TIrJz9vHVjy>=v(miqn{hNC;vyj#5VK#nSMy;uEr z9;8sRmdLCI0_HVg>p8Aj@#IAzaWRT}9?oP`JF6M2HH(xQRvBj{8`RlBA3$ujis2Ki zv|B<5I2!QN=?te#22$g>2dOzS`ZgCbeaGFs=q_hnnN4&E))nOgN7a(!5}(`JN`hfK@u3KgS{J4_lXA zUFT>H3?BiLGc2tytXq?<6-jn``ZTOB7D19{Pg_IYu+aoh6cnOyi@ORs;E<_Qeg)IJ z9?(dZ@~Yh~KNNX3FR+}4QGVG9q}Gcd!c0W2yC>q?D84Qb%`~Y2AFkKr4lpPViBM6@ zIU2tLSL>R~(Yp3wf7s>06m&sy)B5m4FW6jQ_+F!l5RH_38Gj(p(}g^pj#Y zKzX%DBih-1Qxt+kyRbB3QHmUJwM4cKYZr}b+G~t7qqm3p%~~s0rEGx$SJxo`v`6iH zD^0{VYy8J zmq15C=-`~Zvz<2aAfLzPCd61ikmD4GG-wqdANGA@{b;*%iB_)iqJv~{)6FxeI7Z_N zicuP4)@GE+pesVIUFEIwvk2wn$SOeg5Sy(H!P3YH1^Bas^oTgvO{KT&LsVeBO#fcelcg`t#De!qus> z5cmUqk(Mpb>ecWW;{b{&w#!C06$FKLHSlw&T@Y5oc7?MmDYLjF%|Wq5Rcz0L9y7oS z9O6Xn#?_y}83u^kD70MWRgI3k9_ z09Z0l0HAas$771of6gCFvpQ8!1XC)NhJB+XfF*dDajE@f0pP3fe_6#p5nyzMIUs%& zTc3afNaLggCm97c8mx`tNc$C{N=)mh?1p?|fSi7`MrY`*B&m?9f|1xP5m%fEs3hDE z^3x%#P)Rr-v=GDm`MBen^uqQj)&8uCX+IZ;>$Oi20tk#5n_#2uS&^}(fP&3P(syuJ z63jZ%E@)N)f(4gMEWoAD`BERN&4s~{E^~bi*rNSa&S(#ZF@Q*=Mtj^e&pcsbQ~P;q z*y-RFUz%iohBM|0`1QDEjOIdk0(w$&Ti3X#2|y;B%^H`xyut=XW(6?AJnPW8g5i-B zGBvfZ-hzu1+b=+rD6-lw(0Vx73mh&U%}0Dsl-g|1WO`zFr3XorB`UAMuLS&Oh1`2$ zsRBYn1n?vpX=1q&53nl|{#ao)uK)~b;jmp@S?_0MA<(}YVO(4yI;>bIqc--x|H_?aHBOY?L_i}A@EN~Gyi#YQZW0b@bsht5KO_iLi@5n-F{_A zA{_&(^?W#PwSSYTz|9}=2um4GPC_C8GbJVrGcjd~G~5LhO`!Q*K{;%{CXy^^2u4_X z{=$m<3+v~1lZ2!NE@na=4Z^Bxo86~NT6S$tv1|w=g)?OaAM*2>3^Hhh)==|vjA&E+ z&>v#N;+QgQF~T!?19ydq!*ztXsF(+>mQIBXz$;|5YhSg|{j@}|7(_48?o9qc9~y|Q zQ9OgbI8*COToBx5mBAfxWcOYP`ftGQW0J@x)A{P$?n-^GI@c&qH@MFpp0AEiHL9Ph za5LP!x$j`LF~jR+13kZgrhcT{NZuq7#p2P&BL6~`o!W>yy~m$74wKP1&m+%aQN6k%8&U*|K< zWPs~FC!mg6X-`|pXEbjVWU>i6S+Q^=WQifLKk>~_96LJG<$2%%sT#|_gRU#@T$*XL zuMRih{@##-0bVrn5`DSg#8(0tCqF*{>no+eI*+HxTin=O!o+B zKFsG=`?SF=e?Sm3s7A*O4|eVp74ED-;KL-4PL>77p!&|u3`-0L1T6i2 zTh7rjT83mN8{YP!pLIP@Bob%y!Uud@#okuGc&rPn7zTtUR-3R~o2P}rR3#VGH3vcF^Kyvui=Y?+Pj)0s}$gEEUlEilCxZ0AtTM~(G zNxVz^(po=fEn|N1)cE9Ia}5)?k$)i7tf9zaB;!az5kHgc6k@RuEz_S@)q1J?rQJAT zAYU&{5YVxy*NWTVhm;#9BsSyJY%Trv`XDK$VvRS6L8dRb>3%AMNTY2yHfHUl`Jy z*11#a))Xr>dPg(N?f>L6Z}OdU*%i^fb$In$)=!9 zrkyQrGUZC9=5zjot`iy^YIaPD>I)?2naiMsO4_pXV|HVhVUtTLFc)zCbv27@)tEM?V7>OKHOq6hsw7jz0fVG)s zc#~~hj5~)u;+o=3?y=J#f|H8Ox#9xkXsN)o$TdxMXB%_QY0xMgR{ON1?&p{&@Phe> znC+XkwuI72!++A6BzbZbxbDZc94jaZ5Vm znyotb{i+|5mjiQr2KDE5j?qHc8D~LD_w8hjBEEaIzEG6E(vZO-#Vr>lpRb8IPi)46 zX+WFIq#DfVatt&jUw9@W#x11;KC?mZXG|C={|6c0**IoDo5XpK&aLm*lk0^Xsk0dSZt`lr3IZ!*kap&Yy<@(VLV~OVCCf5D5)B*g?mcsSJ6}Mxkrx;2RN$XTU0Q{#&vVQ1DM79W9Ffh=M!hyU zUq3Y2IJmFcs8!y9Oj1$N$mHiw2y4oR4ppWalgE$joSC0)RO&~|^~RhWo8LF8v%-V? z!RlQ30K~Dca;y<90SQr)!BA!TMhPBXJQzp%ir8IkOudVd2#NPC#3E>(wc0Nf#Qnqm z?>^Nx?Ac56*Y879+^{zUEE)Em_eb|kEQY8CaYCn$mw#&sKUjvdEr#bqi%T2sD{b#g zt@d7vyFuf|XU5-aY5eqiS!WIymXzi?zfvKT!#^`Yle_3~#cd*=@xtkmBtTpw7> z>iSC+DcxH+R1>#ZM(43uN0R!lM$p*e(Kz;t9*y27@B8VXyuVgHI(c-aS`&hns*f0$ zJ+79z!6>v+mVo{G;ua6;=w^}4`#`KWn1>ck1Z(=}R2^_ywD+MweXMfvT(x#d3wBMr zHtbnEpcYMO39c6D0pF2>Zd*q3?h~^52bbZp(r6%!-e3qS)&HC!_@|49;Gh2Dhu~<+ zTODItIG&k~2c5L*&Yi3?dtDkNX~9{twdXx(!zCD))*>zj{lrWid2eMo(f{_1*6W4D z`#y(E9v69CRrgk`Dw*|{uj;`HE0gzBRa_(sTP<(H^|q*T*UKO zI`0$Di=7iU`B?;Qlqh|Qav~7jo3EfOM1(FN;Y%1V$XdYCOt%HD*c{P>bv42Tt2)x^ zzw`KN+258ZNUxf9e-GxVfnALXZ>6!tAj)j%wPTHjbakc;Ko!|~fC@1ItZ+u#Jna}= zfmVYYnINw&HZPlhN%Qgu+AFh~BziqtrM#0_!qyM?|mHqeVnP|P%FoLJ4`dd*(+S&-U zAUYNI%b?Z8<96L>VU5p@i1=wQR(ediYd_%M&aMNM*8Q;;1B*I`Tfc!-%9091_;Wwu zB~hMQ>}UxZa2?l~B5;&b$|4P>4r|4D*Fi~V2cLMYqD+#t5VdSWCwov~I+LF`B3CBKSqn za;dVp$gx2^Lo+UWk^ZdY_Hj8fm}yCN-e?2CuzeiWj|<4&wDfsN;ybnA-zss1tKT zG*1b5A%!l0xgnaDza&KwVqXd>3Cik)llYR%SMp{^dh4JF9oQC^u=5<=&+-<;e=_Vm zj|1Llv2!{m$Rmyjk7Q#8!nSDv^;j`cA~JLsK=^1$Z)%&T<`d@;=L~RcI2kkfCN(tN)BVvMysXgYqq|lsrkUHe#QnJtAMJ ze4lf4%UOKrNwob~6wIYUZk6!(u=Ap6R?aGUbWrY=M(LU#+B z+))w8nc=E=cD2XE(slnLUhO1tJ}?ii&R2C`^=}29j@`-3V2P3ry{oHvQ^i=iQHEiU zE;9CCP#3XW8{XtS01lZ(exZXs@?6o84Dh%q2+9#soRUh{aYR`}2uY>Pt^z5*|LYG7{yB?mM z4m+0$%;oqyko;MkEnE%FPF&L&3BKoocPbduaUY7g9FcLwZ9!Aq|OP@Wr0&BUs5rH8S`7ZHlu z$rRYB;8X!^=j0kt$gTC)BqUu(i#Mk+;ImP~WF}g7vS&oJU0O2Y&Qhb8s$JuIRrN;V z3e&mjklc}b1=60nn=rr5RZ!5mN{qqlUm3bxuo!Wn!3RQDg#icU&MPGD^9oRDcl70Y zLpfY>%Xe9|B}dk#g$fMigNa$#Q8rnca6yMFyb0p%WkWbPo8tnWCm-@Ho^;?+FHl*J zEeRLkZZ3Hjwe~Ot$fKzFBi)3ZA3DFR2u$Rh*lC&jEKl%cTp_fxDHDM8zRhIW?w%-7 zkL@?3Xr#F0&IbBdawLnloc*#t?1VqahCO30Y|@(x!UDQ^V1?02uh-jz{JYKaK-Gm3Dq@HEf ziMz^XrfK#>F^NEj-*gB5W=T9EpE%1!&Mst^xL``P(EosfT|=ezkG_GQmbUUcPhomI z0?#oRCP0PNx`-Y&lSjw}t=)J*f{Fw$u&WRGk`)_aYhPbHQ#f8_yNNGh+lprdLDL^{ z@Hfalt*|^49|w0?=7i{RA?qIhcK5h@Hb^TmLWheqq~Ziaf8q!QSt;m(IBkY?E1T_p zk3%V(5l(Huf>1l6?}+uNW;O|aofenkS>PE_He51#X51g@5x6&eqnqjJ}mqhaE3sNEVt20snwBqvraVJ4cr zJ)VNymN*1OGo7e`-2$6GumXugQf*!t#v@$KNp|+&NnkolUdxY?_T_i%!-O+-m+0+JzF~7!j8hkE`=T+P`Cw zz0E2MH^<2qZg$BQZr0kglhtzMRZ8J-b6Y1Xafr7Q6c^TOXv0nx?#!_20V-&rM>KtsGj$m2^?oJ`;1;&ARic`9@`5<;c-~r_upD1vdA&l@5_y zY2;eE&oq{OCWO9XN4mvMl#jiaLc8R;uq`IPZAQm9^As0$Fy$?nrIX;;W=95%=%hQJ|vX;*NyekzJtkRwHjb&?m zAG?VyzJ6rcN`;(>>uLttu>$))3E;hzqvfg3E?cu+O}Fq!0ONVw9K7?NUP_wO-D|~l zcCg+^(r_@y?wdJ$xK`N(F2!NR+PlL~I}Z$b%#!c6)j?z>l1sb~&#P=nJhxif1LWRHtf zA>S;KTv?|o6HGcyQ&_i#tsjlJeIn5~8^dj4(%dwQ=xYmy=yg{DbNRdwr;UvZ>{gcQ z z>N3UMB=N9ijnabYET%}x}dJ5y6+2;aA*hF=Tr!$9mE$;0p@7A3&M~~O5ho5SU z{q^ZFo;_8r)W)osdU@=w&0Bc?HskWA7tG6iO^JPH%DZjquBp4Wm$z-*xMk~sZ5y}V zeb+}fmN#$Svhkzawr=~_!R?!;wjMgfD`k0|z~)U`wr#q56EE0S;S)0l=WFHq{WY~? z7hYM1>t!~EIFq7E&$zw37RXq2x5#C0U;3tBua}QLG&6nQv8l>YSuFQGRiF8-xm5EH zH>H}L$>X^C9oaNlnVPRx8^<@XC*??WPTqra-N;_tc%xCT9)Lw{7&|gIHB+xu5A?hZ z?|Qf1h6g_W@$$B*Z6DjR{i9neoA2JfCbcg;GWpr+QT!IGhpJO$wKDG6pMUKOkE=H_ zXo5ZOTe}9mZ+&FY+dFyhrMU2{zv9;f82k_ z(7biOL-)omzBeWakDqiObmM0Z{O10>m0G1dSNUmaHXS{9K&|@k`TN1I!B*m5@M*$h z$=#Bxo^^kp**R0cw^o}dSEoHgZl$v6V6A4)f3lu3^yZrXBfpe&b{&qli#x0l<>?Co z*TpN{1N=YsQU+X+PwQd zvc58C?{N1X^VX3ksl&ZRUTO4>^ZvHIw~s8TE!nx8F*+dJFntD>3=@hI)CJr%WpbHGPkx z7dPgeW{^3U>Dx_ule<3nq@L)_?D`+`?xH7KJZ2nzPg?sQj?1Xh54Asmt?u;wIIpja zBfO(u<>{Lr?z=n{`(lp1QJ@<1g^gZ6b{nqrO$PT3L4B&KAHTh}y_<49ATJy(E^jHO umc!F0ET8)xxxV9|FB#~IP46bJ0qWhH?iuv*q#OIyca!-4)BJCPz<&ViG4ibd diff --git a/GameData/FerramAerospaceResearch/Plugins/ferramGraph.dll b/GameData/FerramAerospaceResearch/Plugins/ferramGraph.dll deleted file mode 100644 index 57c9fa21d2092c5dd83c04a60f3684f5d2f90456..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14848 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 Q!oEB&nm>I0-$mem06P-*EdT%j diff --git a/GameData/ModularFlightIntegrator/Note.md b/GameData/ModularFlightIntegrator/Note.md new file mode 100644 index 000000000..6c5b2dc88 --- /dev/null +++ b/GameData/ModularFlightIntegrator/Note.md @@ -0,0 +1,3 @@ +## ModularFlightIntegrator by sarbian + +See the [official forum thread](http://forum.kerbalspaceprogram.com/threads/118088). diff --git a/ferramGraph/ferramGraph.csproj b/ferramGraph/ferramGraph.csproj index 649b860d1..e21cd4a87 100644 --- a/ferramGraph/ferramGraph.csproj +++ b/ferramGraph/ferramGraph.csproj @@ -35,15 +35,13 @@ false - - False - ..\..\..\..\Games\KSP 1.3\KSP_x64_Data\Managed\Assembly-CSharp.dll + + ..\..\KSP_x64_Data_v130\Managed\Assembly-CSharp.dll - - False - ..\..\..\..\Games\KSP 1.3\KSP_x64_Data\Managed\UnityEngine.dll + + ..\..\KSP_x64_Data_v130\Managed\UnityEngine.dll From cdbed43a45cb2c3fcc3ef99b2a44fcbdc96e56e3 Mon Sep 17 00:00:00 2001 From: Rodhern Date: Mon, 14 Aug 2017 12:00:00 +0200 Subject: [PATCH 03/13] Add a few explicit format characters. --- .../FARGUI/FARFlightGUI/FlightGUI.cs | 2 +- .../Localization/Localization.cfg | 112 +++++++++--------- .../Localization/Localization_de-de.cfg | 2 +- .../Localization/Localization_ru.cfg | 112 +++++++++--------- .../Localization/Localization_zh-cn.cfg | 112 +++++++++--------- 5 files changed, 170 insertions(+), 170 deletions(-) diff --git a/FerramAerospaceResearch/FARGUI/FARFlightGUI/FlightGUI.cs b/FerramAerospaceResearch/FARGUI/FARFlightGUI/FlightGUI.cs index 394a4d538..a0adfbbb4 100644 --- a/FerramAerospaceResearch/FARGUI/FARFlightGUI/FlightGUI.cs +++ b/FerramAerospaceResearch/FARGUI/FARFlightGUI/FlightGUI.cs @@ -316,7 +316,7 @@ void MainFlightGUIWindow(int windowId) _strBuilder.Append(Localizer.Format("FARAbbrevMach")); _strBuilder.Append(": "); _strBuilder.Concat((float)(_vesselAero.MachNumber),3).AppendLine(); - _strBuilder.AppendFormat(Localizer.Format("FARFlightGUIReynolds",_vesselAero.ReynoldsNumber)); + _strBuilder.AppendFormat(Localizer.Format("FARFlightGUIReynolds"),_vesselAero.ReynoldsNumber); GUILayout.Box(_strBuilder.ToString(), boxStyle, GUILayout.ExpandWidth(true)); GUILayout.EndHorizontal(); diff --git a/GameData/FerramAerospaceResearch/Localization/Localization.cfg b/GameData/FerramAerospaceResearch/Localization/Localization.cfg index 9c6a92cbe..9ca5e24bf 100644 --- a/GameData/FerramAerospaceResearch/Localization/Localization.cfg +++ b/GameData/FerramAerospaceResearch/Localization/Localization.cfg @@ -64,9 +64,9 @@ FARDebugVoxels = Display Debug Voxels FAREditorTitleTransonic = Transonic Area Ruling Analysis - FAREditorTransMaxArea = Max Cross-Section Area: - FAREditorTransMach1DragArea = Mach 1 Wave Drag-Area: - FAREditorTransCritMach = Critical Mach Number: + FAREditorTransMaxArea = Max Cross-Section Area:\u0020 + FAREditorTransMach1DragArea = Mach 1 Wave Drag-Area:\u0020 + FAREditorTransCritMach = Critical Mach Number:\u0020 FAREditorTransMinDragExp1 = Minimal wave drag is achieved by maintaining a\nsmooth, minimal curvature cross-section curve, including the\neffects of intake -> engine ducting. FAREditorTransMinDragExp2 = Minimize curvature to minimize wave drag. FAREditorTransAreaCurve = Show cross-sectional area curve (green) @@ -76,8 +76,8 @@ FAREditorStabDerivFlightCond = Flight Condition: FAREditorStabDerivPlanet = Planet: FAREditorStabDerivAlt = Altitude (km): - FAREditorStabDerivMach = Mach Number: - FAREditorStabDerivFlap = Flap Setting: + FAREditorStabDerivMach = Mach Number:\u0020 + FAREditorStabDerivFlap = Flap Setting:\u0020 FAREditorStabDerivSpoiler = Spoilers: FAREditorStabDerivSDeploy = Deployed FAREditorStabDerivSRetract = Retracted @@ -91,16 +91,16 @@ FAREditorStabDerivPoI = Products of Inertia FAREditorStabDerivLvlFl = Level Flight - FAREditorStabDerivRefArea = Ref Area: - FAREditorStabDerivScaledChord = Scaled Chord: - FAREditorStabDerivScaledSpan = Scaled Span: + FAREditorStabDerivRefArea = Ref Area:\u0020 + FAREditorStabDerivScaledChord = Scaled Chord:\u0020 + FAREditorStabDerivScaledSpan = Scaled Span:\u0020 - FAREditorStabDerivIxx = Ixx: - FAREditorStabDerivIyy = Iyy: - FAREditorStabDerivIzz = Izz: - FAREditorStabDerivIxy = Ixy: - FAREditorStabDerivIyz = Iyz: - FAREditorStabDerivIxz = Ixz: + FAREditorStabDerivIxx = Ixx:\u0020 + FAREditorStabDerivIyy = Iyy:\u0020 + FAREditorStabDerivIzz = Izz:\u0020 + FAREditorStabDerivIxy = Ixy:\u0020 + FAREditorStabDerivIyz = Iyz:\u0020 + FAREditorStabDerivIxz = Ixz:\u0020 FAREditorStabDerivIxxExp = Inertia about X-axis due to rotation about X-axis FAREditorStabDerivIyyExp = Inertia about Y-axis due to rotation about Y-axis @@ -109,7 +109,7 @@ FAREditorStabDerivIyzExp = Inertia about Y-axis due to rotation about Z-axis; is equal to inertia about Z-axis due to rotation about Y-axis FAREditorStabDerivIxzExp = Inertia about X-axis due to rotation about Z-axis; is equal to inertia about Z-axis due to rotation about X-axis - FAREditorStabDerivu0 = u0: + FAREditorStabDerivu0 = u0:\u0020 FAREditorStabDerivu0Exp = Air speed based on this mach number and temperature. FAREditorStabDerivClExp = Required lift coefficient at this mass, speed and air density. FAREditorStabDerivCdExp = Resulting drag coefficient at this mass, speed and air density. @@ -121,20 +121,20 @@ FAREditorPitchRateDeriv = Pitch Rate Derivatives FAREditorPitchCtrlDeriv = Pitch Ctrl Derivatives - FAREditorZw = Zw: - FAREditorZu = Zu: - FAREditorZq = Zq: - FAREditorZDeltae = Zδe: + FAREditorZw = Zw:\u0020 + FAREditorZu = Zu:\u0020 + FAREditorZq = Zq:\u0020 + FAREditorZDeltae = Zδe:\u0020 - FAREditorXw = Xw: - FAREditorXu = Xu: - FAREditorXq = Xq: - FAREditorXDeltae = Xδe: + FAREditorXw = Xw:\u0020 + FAREditorXu = Xu:\u0020 + FAREditorXq = Xq:\u0020 + FAREditorXDeltae = Xδe:\u0020 - FAREditorMw = Mw: - FAREditorMu = Mu: - FAREditorMq = Mq: - FAREditorMDeltae = Mδe: + FAREditorMw = Mw:\u0020 + FAREditorMu = Mu:\u0020 + FAREditorMq = Mq:\u0020 + FAREditorMDeltae = Mδe:\u0020 FAREditorZwExp = Change in Z-direction acceleration with respect to Z-direction velocity; should be negative. FAREditorZuExp = Change in Z-direction acceleration with respect to X-direction velocity; should be negative. @@ -157,17 +157,17 @@ FAREditorRollRateDeriv = Roll Rate Derivatives FAREditorYawRateDeriv = Yaw Rate Derivatives - FAREditorYβ = Yβ: - FAREditorYp = Yp: - FAREditorYr = Yr: + FAREditorYβ = Yβ:\u0020 + FAREditorYp = Yp:\u0020 + FAREditorYr = Yr:\u0020 - FAREditorLβ = Lβ: - FAREditorLp = Lp: - FAREditorLr = Lr: + FAREditorLβ = Lβ:\u0020 + FAREditorLp = Lp:\u0020 + FAREditorLr = Lr:\u0020 - FAREditorNβ = Nβ: - FAREditorNp = Np: - FAREditorNr = Nr: + FAREditorNβ = Nβ:\u0020 + FAREditorNp = Np:\u0020 + FAREditorNr = Nr:\u0020 FAREditorYβExp = Change in Y-direction acceleration with respect to sideslip angle β; should be negative. FAREditorYpExp = Change in Y-direction acceleration with respect to roll-right rate; sign unimportant. @@ -187,8 +187,8 @@ FAREditorSimGraphParams = Params FAREditorSimInit = Init - FAREditorSimEndTime = EndTime: - FAREditorSimTimestep = dt: + FAREditorSimEndTime = EndTime:\u0020 + FAREditorSimTimestep = dt:\u0020 FAREditorSimRunButton = Run Simulation FAREditorStaticGraphAoA = Angle of Attack, degrees @@ -200,11 +200,11 @@ FAREditorStaticSwitchAoA = Switch To AoA Sweep FAREditorStaticSwitchMach = Switch To Mach Sweep - FAREditorStaticPitchSetting = Pitch Setting: + FAREditorStaticPitchSetting = Pitch Setting:\u0020 - FAREditorStaticGraphLowLim = Lower: - FAREditorStaticGraphUpLim = Upper: - FAREditorStaticGraphPtCount = Num Pts: + FAREditorStaticGraphLowLim = Lower:\u0020 + FAREditorStaticGraphUpLim = Upper:\u0020 + FAREditorStaticGraphPtCount = Num Pts:\u0020 FAREditorStaticSweepMach = Sweep Mach FAREditorStaticSweepAoA = Sweep AoA @@ -228,10 +228,10 @@ FARFlightAirspeedIndicated = IAS FARFlightAirspeedEquivalent = EAS - FARFlightInternalAirspeedGroundspeed = Srf.: - FARFlightInternalAirspeedIndicated = IAS: - FARFlightInternalAirspeedEquivalent = EAS: - FARFlightInternalAirspeedMach = Mach: + FARFlightInternalAirspeedGroundspeed = Srf.:\u0020 + FARFlightInternalAirspeedIndicated = IAS:\u0020 + FARFlightInternalAirspeedEquivalent = EAS:\u0020 + FARFlightInternalAirspeedMach = Mach:\u0020 FARFlightAirspeedMeterPerSec = m/s FARFlightAirspeedKnots = knots @@ -253,15 +253,15 @@ FARFlightDataOption7 = Range + Endurance FARFlightDataOption8 = BC and Term Vel - FARFlightData0 = Pitch Angle: \nHeading: \nRoll Angle: - FARFlightData1 = Angle of Attack: \nSideslip Angle: - FARFlightData2 = Dyn Pres: - FARFlightData3 = Lift: \nDrag: \nSideForce: - FARFlightData4 = Cl: \nCd: \nCy: \nRef Area: - FARFlightData5 = L/D: \nV*L/D: + FARFlightData0 = Pitch Angle: \nHeading: \nRoll Angle:\u0020 + FARFlightData1 = Angle of Attack: \nSideslip Angle:\u0020 + FARFlightData2 = Dyn Pres:\u0020 + FARFlightData3 = Lift: \nDrag: \nSideForce:\u0020 + FARFlightData4 = Cl: \nCd: \nCy: \nRef Area:\u0020 + FARFlightData5 = L/D: \nV*L/D:\u0020 FARFlightData6 = Fuel Fraction: \nTSFC: \nAir Req Met: \nSpec. Excess Pwr: - FARFlightData7 = Est. Endurance: \nEst. Range: - FARFlightData8 = BC: \nTerminal V: + FARFlightData7 = Est. Endurance: \nEst. Range:\u0020 + FARFlightData8 = BC: \nTerminal V:\u0020 FARFlightGUIWindowSelect0 = Flt Data @@ -269,8 +269,8 @@ FARFlightGUIWindowSelect2 = Air Spd FARFlightGUIWindowSelect3 = Aero Viz - FARFlightGUIReynolds = Reynolds: <<1:e2>> - FARFlightGUIAtmDens = Atm Density: + FARFlightGUIReynolds = Reynolds: 「0:E2」 + FARFlightGUIAtmDens = Atm Density:\u0020 FARFlightGUIFltDataBtn = Flt Data FARFlightGUIFltSettings = Flt Settings FARFlightGUIFltAssistance = Flight Assistance Toggles: diff --git a/GameData/FerramAerospaceResearch/Localization/Localization_de-de.cfg b/GameData/FerramAerospaceResearch/Localization/Localization_de-de.cfg index 3ffb23691..3e05d7762 100644 --- a/GameData/FerramAerospaceResearch/Localization/Localization_de-de.cfg +++ b/GameData/FerramAerospaceResearch/Localization/Localization_de-de.cfg @@ -271,7 +271,7 @@ FARFlightGUIWindowSelect1 = Stab Aug FARFlightGUIWindowSelect2 = Lufttempo FARFlightGUIWindowSelect3 = Aero Viz -FARFlightGUIReynolds = Reynolds: <<1:e2>> +FARFlightGUIReynolds = Reynolds: 「0:E2」 FARFlightGUIAtmDens = Atm Dichte: FARFlightGUIFltDataBtn = Flt Daten FARFlightGUIFltSettings = Flt Einstellungen diff --git a/GameData/FerramAerospaceResearch/Localization/Localization_ru.cfg b/GameData/FerramAerospaceResearch/Localization/Localization_ru.cfg index 2646ab280..1067b40f2 100644 --- a/GameData/FerramAerospaceResearch/Localization/Localization_ru.cfg +++ b/GameData/FerramAerospaceResearch/Localization/Localization_ru.cfg @@ -46,9 +46,9 @@ FARDebugVoxels = Показать отладочные воксели FAREditorTitleTransonic = Анализ трансзвукового сечения - FAREditorTransMaxArea = Макс. поперечное сечение: - FAREditorTransMach1DragArea = Сечение волнового сопр. при M=1: - FAREditorTransCritMach = Критическое число Маха: + FAREditorTransMaxArea = Макс. поперечное сечение:\u0020 + FAREditorTransMach1DragArea = Сечение волнового сопр. при M=1:\u0020 + FAREditorTransCritMach = Критическое число Маха:\u0020 FAREditorTransMinDragExp1 = Минимальное волновое сопротивление достигается сглаживанием\nи уменьшением кривизны профиля поперечного сечения, включая\nэффекты потоков воздухозаборник -> двигатель. FAREditorTransMinDragExp2 = Снижайте сечение для уменьшения волнового сопротивления. FAREditorTransAreaCurve = Показать профиль поперечного сечения (зел.) @@ -58,8 +58,8 @@ FAREditorStabDerivFlightCond = Условие полёта: FAREditorStabDerivPlanet = Планета: FAREditorStabDerivAlt = Высота (км): - FAREditorStabDerivMach = Число Маха: - FAREditorStabDerivFlap = Положение закрылков: + FAREditorStabDerivMach = Число Маха:\u0020 + FAREditorStabDerivFlap = Положение закрылков:\u0020 FAREditorStabDerivSpoiler = Спойлеры: FAREditorStabDerivSDeploy = Выпущены FAREditorStabDerivSRetract = Убраны @@ -73,16 +73,16 @@ FAREditorStabDerivPoI = Центробежные моменты инерции FAREditorStabDerivLvlFl = Горизонтальный полёт - FAREditorStabDerivRefArea = Эфф. сечение: - FAREditorStabDerivScaledChord = Отн. хорда: - FAREditorStabDerivScaledSpan = Отн. размах: + FAREditorStabDerivRefArea = Эфф. сечение:\u0020 + FAREditorStabDerivScaledChord = Отн. хорда:\u0020 + FAREditorStabDerivScaledSpan = Отн. размах:\u0020 - FAREditorStabDerivIxx = Ixx: - FAREditorStabDerivIyy = Iyy: - FAREditorStabDerivIzz = Izz: - FAREditorStabDerivIxy = Ixy: - FAREditorStabDerivIyz = Iyz: - FAREditorStabDerivIxz = Ixz: + FAREditorStabDerivIxx = Ixx:\u0020 + FAREditorStabDerivIyy = Iyy:\u0020 + FAREditorStabDerivIzz = Izz:\u0020 + FAREditorStabDerivIxy = Ixy:\u0020 + FAREditorStabDerivIyz = Iyz:\u0020 + FAREditorStabDerivIxz = Ixz:\u0020 FAREditorStabDerivIxxExp = Инерция относительно оси X при повороте вокруг оси X FAREditorStabDerivIyyExp = Инерция относительно оси Y при повороте вокруг оси Y @@ -91,7 +91,7 @@ FAREditorStabDerivIyzExp = Инерция относительно оси Y при повороте вокруг оси Z; равна инерции относительно оси Z при повороте вокруг оси Y FAREditorStabDerivIxzExp = Инерция относительно оси X при повороте вокруг оси Z; равна инерции относительно оси Z при повороте вокруг оси X - FAREditorStabDerivu0 = u0: + FAREditorStabDerivu0 = u0:\u0020 FAREditorStabDerivu0Exp = Воздушная скорость при заданных числе Маха и температуре. FAREditorStabDerivClExp = Необходимый коэффициент подъёмной силы при таких массе, скорости и плотности воздуха. FAREditorStabDerivCdExp = Итоговый коэффициент сопротивления при таких массе, скорости и плотности воздуха. @@ -103,20 +103,20 @@ FAREditorPitchRateDeriv = Производные угл. скор. тангажа //?? FAREditorPitchCtrlDeriv = Производные упр. тангажом - FAREditorZw = Zw: - FAREditorZu = Zu: - FAREditorZq = Zq: - FAREditorZDeltae = Zδe: + FAREditorZw = Zw:\u0020 + FAREditorZu = Zu:\u0020 + FAREditorZq = Zq:\u0020 + FAREditorZDeltae = Zδe:\u0020 - FAREditorXw = Xw: - FAREditorXu = Xu: - FAREditorXq = Xq: - FAREditorXDeltae = Xδe: + FAREditorXw = Xw:\u0020 + FAREditorXu = Xu:\u0020 + FAREditorXq = Xq:\u0020 + FAREditorXDeltae = Xδe:\u0020 - FAREditorMw = Mw: - FAREditorMu = Mu: - FAREditorMq = Mq: - FAREditorMDeltae = Mδe: + FAREditorMw = Mw:\u0020 + FAREditorMu = Mu:\u0020 + FAREditorMq = Mq:\u0020 + FAREditorMDeltae = Mδe:\u0020 FAREditorZwExp = Изменение ускорения по оси Z с изменением скорости вдоль оси Z; должно быть отрицательным. FAREditorZuExp = Изменение ускорения по оси Z с изменением скорости вдоль оси X; должно быть отрицательным. @@ -139,17 +139,17 @@ FAREditorRollRateDeriv = Производные угл. скор. крена FAREditorYawRateDeriv = Производные угл. скор. рыскания - FAREditorYβ = Yβ: - FAREditorYp = Yp: - FAREditorYr = Yr: + FAREditorYβ = Yβ:\u0020 + FAREditorYp = Yp:\u0020 + FAREditorYr = Yr:\u0020 - FAREditorLβ = Lβ: - FAREditorLp = Lp: - FAREditorLr = Lr: + FAREditorLβ = Lβ:\u0020 + FAREditorLp = Lp:\u0020 + FAREditorLr = Lr:\u0020 - FAREditorNβ = Nβ: - FAREditorNp = Np: - FAREditorNr = Nr: + FAREditorNβ = Nβ:\u0020 + FAREditorNp = Np:\u0020 + FAREditorNr = Nr:\u0020 FAREditorYβExp = Изменение ускорения по оси Y с изменением угла скольжения β; должно быть отрицательным. FAREditorYpExp = Изменение ускорения по оси Y с изменением угловой скорости крена вправо; знак неважен. @@ -169,8 +169,8 @@ FAREditorSimGraphParams = Парам-ры FAREditorSimInit = Нач. - FAREditorSimEndTime = МаксВр: - FAREditorSimTimestep = dt: + FAREditorSimEndTime = МаксВр:\u0020 + FAREditorSimTimestep = dt:\u0020 FAREditorSimRunButton = Запуск симуляции FAREditorStaticGraphAoA = Угол атаки, градусы @@ -182,11 +182,11 @@ FAREditorStaticSwitchAoA = Перекл. на угол атаки FAREditorStaticSwitchMach = Перекл. на число Маха - FAREditorStaticPitchSetting = Угол тангажа: + FAREditorStaticPitchSetting = Угол тангажа:\u0020 - FAREditorStaticGraphLowLim = От: - FAREditorStaticGraphUpLim = До: - FAREditorStaticGraphPtCount = Точек: + FAREditorStaticGraphLowLim = От:\u0020 + FAREditorStaticGraphUpLim = До:\u0020 + FAREditorStaticGraphPtCount = Точек:\u0020 FAREditorStaticSweepMach = Изм-е ч. Маха FAREditorStaticSweepAoA = Изм-е УгАт @@ -210,10 +210,10 @@ FARFlightAirspeedIndicated = IAS FARFlightAirspeedEquivalent = EAS - FARFlightInternalAirspeedGroundspeed = Путевая: - FARFlightInternalAirspeedIndicated = IAS: - FARFlightInternalAirspeedEquivalent = EAS: - FARFlightInternalAirspeedMach = Ч. Маха: + FARFlightInternalAirspeedGroundspeed = Путевая:\u0020 + FARFlightInternalAirspeedIndicated = IAS:\u0020 + FARFlightInternalAirspeedEquivalent = EAS:\u0020 + FARFlightInternalAirspeedMach = Ч. Маха:\u0020 FARFlightAirspeedMeterPerSec = м/с FARFlightAirspeedKnots = уз @@ -235,15 +235,15 @@ FARFlightDataOption7 = Дальность + Длительность FARFlightDataOption8 = БК и Терм Скор - FARFlightData0 = Тангаж: \nРыскание: \nКрен: - FARFlightData1 = Угол атаки: \nУгол скольж-я: - FARFlightData2 = Дин. давление: - FARFlightData3 = Подъём. сила: \nЛобовое сопр.: \nБоковое сопр.: - FARFlightData4 = Cl: \nCd: \nCy: \nЭфф. сечение: - FARFlightData5 = L/D: \nV*L/D: + FARFlightData0 = Тангаж: \nРыскание: \nКрен:\u0020 + FARFlightData1 = Угол атаки: \nУгол скольж-я:\u0020 + FARFlightData2 = Дин. давление:\u0020 + FARFlightData3 = Подъём. сила: \nЛобовое сопр.: \nБоковое сопр.:\u0020 + FARFlightData4 = Cl: \nCd: \nCy: \nЭфф. сечение:\u0020 + FARFlightData5 = L/D: \nV*L/D:\u0020 FARFlightData6 = Доля топлива: \nПотр-е топлива: \nПоступление возд.: \nУдел. избыт. мощн.: - FARFlightData7 = Оцен. длит.: \nОцен. дальн.: - FARFlightData8 = БК: \nТерм. скорость: + FARFlightData7 = Оцен. длит.: \nОцен. дальн.:\u0020 + FARFlightData8 = БК: \nТерм. скорость:\u0020 FARFlightGUIWindowSelect0 = Полётные данные @@ -251,8 +251,8 @@ FARFlightGUIWindowSelect2 = Возд Скор FARFlightGUIWindowSelect3 = Визуал-ия Аэрод-ки - FARFlightGUIReynolds = Ч. Рейнольдса: <<1:e2>> - FARFlightGUIAtmDens = Плотн. возд.: + FARFlightGUIReynolds = Ч. Рейнольдса: 「0:E2」 + FARFlightGUIAtmDens = Плотн. возд.:\u0020 FARFlightGUIFltDataBtn = Полётные данные FARFlightGUIFltSettings = Установки полёта FARFlightGUIFltAssistance = Перекл помощь пилот-я: diff --git a/GameData/FerramAerospaceResearch/Localization/Localization_zh-cn.cfg b/GameData/FerramAerospaceResearch/Localization/Localization_zh-cn.cfg index 2c6fbe358..a2bbb9b66 100644 --- a/GameData/FerramAerospaceResearch/Localization/Localization_zh-cn.cfg +++ b/GameData/FerramAerospaceResearch/Localization/Localization_zh-cn.cfg @@ -45,9 +45,9 @@ FARDebugVoxels = 显示调试体素 FAREditorTitleTransonic = 跨音速面积律分析 - FAREditorTransMaxArea = 最大截面积: - FAREditorTransMach1DragArea = 马赫1波阻面积: - FAREditorTransCritMach = 临界马赫数: + FAREditorTransMaxArea = 最大截面积:\u0020 + FAREditorTransMach1DragArea = 马赫1波阻面积:\u0020 + FAREditorTransCritMach = 临界马赫数:\u0020 FAREditorTransMinDragExp1 = 为了得到最小的波阻,应保持一个光滑并且曲率\n最小的截面积曲线(考虑进气->引擎的管道效应在内). FAREditorTransMinDragExp2 = 最小的曲率可以得到最小的波阻. FAREditorTransAreaCurve = 显示截面积曲线 (绿色) @@ -57,8 +57,8 @@ FAREditorStabDerivFlightCond = 飞行环境: FAREditorStabDerivPlanet = 星球: FAREditorStabDerivAlt = 高度 (km): - FAREditorStabDerivMach = 马赫数: - FAREditorStabDerivFlap = 襟翼设置: + FAREditorStabDerivMach = 马赫数:\u0020 + FAREditorStabDerivFlap = 襟翼设置:\u0020 FAREditorStabDerivSpoiler = 扰流板: FAREditorStabDerivSDeploy = 展开 FAREditorStabDerivSRetract = 收回 @@ -72,16 +72,16 @@ FAREditorStabDerivPoI = 惯性积 FAREditorStabDerivLvlFl = 水平飞行 - FAREditorStabDerivRefArea = 参考面积: - FAREditorStabDerivScaledChord = 弦长: - FAREditorStabDerivScaledSpan = 翼展: + FAREditorStabDerivRefArea = 参考面积:\u0020 + FAREditorStabDerivScaledChord = 弦长:\u0020 + FAREditorStabDerivScaledSpan = 翼展:\u0020 - FAREditorStabDerivIxx = Ixx: - FAREditorStabDerivIyy = Iyy: - FAREditorStabDerivIzz = Izz: - FAREditorStabDerivIxy = Ixy: - FAREditorStabDerivIyz = Iyz: - FAREditorStabDerivIxz = Ixz: + FAREditorStabDerivIxx = Ixx:\u0020 + FAREditorStabDerivIyy = Iyy:\u0020 + FAREditorStabDerivIzz = Izz:\u0020 + FAREditorStabDerivIxy = Ixy:\u0020 + FAREditorStabDerivIyz = Iyz:\u0020 + FAREditorStabDerivIxz = Ixz:\u0020 FAREditorStabDerivIxxExp = 由绕 X轴旋转而关于 X轴的转动惯量 FAREditorStabDerivIyyExp = 由绕 Y轴旋转而关于 Y轴的转动惯量 @@ -90,7 +90,7 @@ FAREditorStabDerivIyzExp = 由绕 Z轴旋转而关于 Y轴的转动惯量; 等于由绕 Y轴旋转而关于 Z轴的转动惯量 FAREditorStabDerivIxzExp = 由绕 Z轴旋转而关于 X轴的转动惯量; 等于由绕 X轴旋转而关于 Z轴的转动惯量 - FAREditorStabDerivu0 = 空速: + FAREditorStabDerivu0 = 空速:\u0020 FAREditorStabDerivu0Exp = 空速基于马赫数和温度. FAREditorStabDerivClExp = 在这个质量,速度和空气密度下所需的升力系数. FAREditorStabDerivCdExp = 在这个质量,速度和空气密度下导出的阻力系数. @@ -102,20 +102,20 @@ FAREditorPitchRateDeriv = 俯仰速率导数 FAREditorPitchCtrlDeriv = 俯仰控制导数 - FAREditorZw = Zw: - FAREditorZu = Zu: - FAREditorZq = Zq: - FAREditorZDeltae = Zδe: + FAREditorZw = Zw:\u0020 + FAREditorZu = Zu:\u0020 + FAREditorZq = Zq:\u0020 + FAREditorZDeltae = Zδe:\u0020 - FAREditorXw = Xw: - FAREditorXu = Xu: - FAREditorXq = Xq: - FAREditorXDeltae = Xδe: + FAREditorXw = Xw:\u0020 + FAREditorXu = Xu:\u0020 + FAREditorXq = Xq:\u0020 + FAREditorXDeltae = Xδe:\u0020 - FAREditorMw = Mw: - FAREditorMu = Mu: - FAREditorMq = Mq: - FAREditorMDeltae = Mδe: + FAREditorMw = Mw:\u0020 + FAREditorMu = Mu:\u0020 + FAREditorMq = Mq:\u0020 + FAREditorMDeltae = Mδe:\u0020 FAREditorZwExp = Z方向加速度相对于Z方向速度的变化; 应该为负. FAREditorZuExp = Z方向加速度相对于X方向速度的变化; 应该为负. @@ -138,17 +138,17 @@ FAREditorRollRateDeriv = 滚转率导数 FAREditorYawRateDeriv = 偏航率导数 - FAREditorYβ = Yβ: - FAREditorYp = Yp: - FAREditorYr = Yr: + FAREditorYβ = Yβ:\u0020 + FAREditorYp = Yp:\u0020 + FAREditorYr = Yr:\u0020 - FAREditorLβ = Lβ: - FAREditorLp = Lp: - FAREditorLr = Lr: + FAREditorLβ = Lβ:\u0020 + FAREditorLp = Lp:\u0020 + FAREditorLr = Lr:\u0020 - FAREditorNβ = Nβ: - FAREditorNp = Np: - FAREditorNr = Nr: + FAREditorNβ = Nβ:\u0020 + FAREditorNp = Np:\u0020 + FAREditorNr = Nr:\u0020 FAREditorYβExp = Y方向加速度相对于侧滑角β的变化; 应该为负. FAREditorYpExp = Y方向加速度相对于向右滚转率的变化; 符号不重要. @@ -168,8 +168,8 @@ FAREditorSimGraphParams = 参数 FAREditorSimInit = 初始化 - FAREditorSimEndTime = 终止时间: - FAREditorSimTimestep = 步进时间: + FAREditorSimEndTime = 终止时间:\u0020 + FAREditorSimTimestep = 步进时间:\u0020 FAREditorSimRunButton = 运行模拟 FAREditorStaticGraphAoA = 攻角, 度 @@ -181,11 +181,11 @@ FAREditorStaticSwitchAoA = 切换至攻角扫描 FAREditorStaticSwitchMach = 切换至马赫数扫描 - FAREditorStaticPitchSetting = 俯仰设置: + FAREditorStaticPitchSetting = 俯仰设置:\u0020 - FAREditorStaticGraphLowLim = 下限: - FAREditorStaticGraphUpLim = 上限: - FAREditorStaticGraphPtCount = 数据点: + FAREditorStaticGraphLowLim = 下限:\u0020 + FAREditorStaticGraphUpLim = 上限:\u0020 + FAREditorStaticGraphPtCount = 数据点:\u0020 FAREditorStaticSweepMach = 马赫扫描 FAREditorStaticSweepAoA = 攻角扫描 @@ -209,10 +209,10 @@ FARFlightAirspeedIndicated = 指示空速 FARFlightAirspeedEquivalent = 等效空速 - FARFlightInternalAirspeedGroundspeed = 地速.: - FARFlightInternalAirspeedIndicated = 指示空速: - FARFlightInternalAirspeedEquivalent = 等效空速: - FARFlightInternalAirspeedMach = 马赫数: + FARFlightInternalAirspeedGroundspeed = 地速.:\u0020 + FARFlightInternalAirspeedIndicated = 指示空速:\u0020 + FARFlightInternalAirspeedEquivalent = 等效空速:\u0020 + FARFlightInternalAirspeedMach = 马赫数:\u0020 FARFlightAirspeedMeterPerSec = 米/秒 FARFlightAirspeedKnots = 节 @@ -234,15 +234,15 @@ FARFlightDataOption7 = 航程 + 航时 FARFlightDataOption8 = 弹道系数 + 终端速度 - FARFlightData0 = 俯仰角: \n方位角: \n滚转角: - FARFlightData1 = 攻角: \n侧滑角: - FARFlightData2 = 动压: - FARFlightData3 = 升力: \n阻力: \n侧向力: - FARFlightData4 = 升力系数: \n阻力系数: \n侧向力系数: \n参考面积: - FARFlightData5 = 升阻比: \n速度 *升阻比: + FARFlightData0 = 俯仰角: \n方位角: \n滚转角:\u0020 + FARFlightData1 = 攻角: \n侧滑角:\u0020 + FARFlightData2 = 动压:\u0020 + FARFlightData3 = 升力: \n阻力: \n侧向力:\u0020 + FARFlightData4 = 升力系数: \n阻力系数: \n侧向力系数: \n参考面积:\u0020 + FARFlightData5 = 升阻比: \n速度 *升阻比:\u0020 FARFlightData6 = 燃油比: \n推力比油耗: \n空气供给: \n规格. 过剩功率: - FARFlightData7 = 预估航时: \n预估航程: - FARFlightData8 = 弹道系数: \n终端速度: + FARFlightData7 = 预估航时: \n预估航程:\u0020 + FARFlightData8 = 弹道系数: \n终端速度:\u0020 FARFlightGUIWindowSelect0 = 飞行数据 @@ -250,8 +250,8 @@ FARFlightGUIWindowSelect2 = 空速 FARFlightGUIWindowSelect3 = 气动可视化 - FARFlightGUIReynolds = 雷诺数: <<1:e2>> - FARFlightGUIAtmDens = 大气密度: + FARFlightGUIReynolds = 雷诺数: 「0:E2」 + FARFlightGUIAtmDens = 大气密度:\u0020 FARFlightGUIFltDataBtn = 飞行数据 FARFlightGUIFltSettings = 飞行设定 FARFlightGUIFltAssistance = 飞行辅助切换: From dc4bee4fb64a5ea4368f557361c7a692aa29a5e9 Mon Sep 17 00:00:00 2001 From: Rodhern Date: Tue, 7 Nov 2017 16:00:00 +0100 Subject: [PATCH 04/13] Add ModularFlightIntegrator to .gitignore . --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 3de90fceb..2af22e65d 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,8 @@ obj *.mdb /GameData/FerramAerospaceResearch/Custom*.cfg /GameData/FerramAerospaceResearch/FARForceDataUpdate.cfg +/GameData/ModularFlightIntegrator/LICENSE.txt +/GameData/ModularFlightIntegrator/ModularFlightIntegrator.* *.suo *.DotSettings *.user From c51b2d36ccd9b0e7888c76fb3f08472948e129a8 Mon Sep 17 00:00:00 2001 From: Rodhern Date: Fri, 13 Apr 2018 18:00:00 +0200 Subject: [PATCH 05/13] Add stability derivatives export button (not functional). --- .../Simulation/StabilityDerivCalculator.cs | 25 ++++++- .../FARGUI/FAREditorGUI/StabilityDerivGUI.cs | 67 ++++++++----------- .../Localization/Localization.cfg | 3 +- .../Localization/Localization_de-de.cfg | 1 + .../Localization/Localization_ru.cfg | 1 + .../Localization/Localization_zh-cn.cfg | 1 + 6 files changed, 58 insertions(+), 40 deletions(-) diff --git a/FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/StabilityDerivCalculator.cs b/FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/StabilityDerivCalculator.cs index 87cdc475f..c0474cc97 100644 --- a/FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/StabilityDerivCalculator.cs +++ b/FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/StabilityDerivCalculator.cs @@ -58,8 +58,31 @@ public StabilityDerivCalculator(InstantConditionSim instantConditionSim) _instantCondition = instantConditionSim; } - public StabilityDerivOutput CalculateStabilityDerivs(double u0, double q, double machNumber, double alpha, double beta, double phi, int flapSetting, bool spoilers, CelestialBody body, double alt) + public StabilityDerivOutput CalculateStabilityDerivs(CelestialBody body, double alt, double machNumber, int flapSetting, bool spoilers) { + // Rodhern: Only return a result if one is found. + + if (body.GetPressure(alt) > 0) + { + StabilityDerivOutput result = CalculateStabilityDerivs(body, alt, machNumber, flapSetting, spoilers, 0, 0, 0); + if (result.stableAoAState == "") + return result; + else + return null; + } + else + return null; + } + + public StabilityDerivOutput CalculateStabilityDerivs(CelestialBody body, double alt, double machNumber, int flapSetting, bool spoilers, double alpha, double beta, double phi) + { + double pressure = body.GetPressure(alt); + double temperature = body.GetTemperature(alt); + double density = body.GetDensity(pressure, temperature); + double sspeed = body.GetSpeedOfSound(pressure, density); + double u0 = sspeed * machNumber; + double q = u0 * u0 * density * 0.5f; + StabilityDerivOutput stabDerivOutput = new StabilityDerivOutput(); stabDerivOutput.nominalVelocity = u0; stabDerivOutput.altitude = alt; diff --git a/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivGUI.cs b/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivGUI.cs index ad41c0f54..ccf5953f9 100644 --- a/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivGUI.cs +++ b/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivGUI.cs @@ -123,45 +123,12 @@ public void Display() spoilersDeployed = GUILayout.Toggle(spoilersDeployed, spoilersDeployed ? Localizer.Format("FAREditorStabDerivSDeploy") : Localizer.Format("FAREditorStabDerivSRetract"), GUILayout.Width(100)); GUILayout.EndHorizontal(); + GUILayout.BeginHorizontal(); if (GUILayout.Button(Localizer.Format("FAREditorStabDerivCalcButton"), GUILayout.Width(250.0F), GUILayout.Height(25.0F))) - { - CelestialBody body = _bodySettingDropdown.ActiveSelection; - FARAeroUtil.UpdateCurrentActiveBody(body); - //atm_temp_str = Regex.Replace(atm_temp_str, @"[^-?[0-9]*(\.[0-9]*)?]", ""); - //rho_str = Regex.Replace(rho_str, @"[^-?[0-9]*(\.[0-9]*)?]", ""); - machNumber = Regex.Replace(machNumber, @"[^-?[0-9]*(\.[0-9]*)?]", ""); - - altitude = Regex.Replace(altitude, @"[^-?[0-9]*(\.[0-9]*)?]", ""); - double altitudeDouble = Convert.ToDouble(altitude); - altitudeDouble *= 1000; - - - double temp = body.GetTemperature(altitudeDouble); - double pressure = body.GetPressure(altitudeDouble); - if (pressure > 0) - { - //double temp = Convert.ToSingle(atm_temp_str); - double machDouble = Convert.ToSingle(machNumber); - machDouble = FARMathUtil.Clamp(machDouble, 0.001, float.PositiveInfinity); - - double density = body.GetDensity(pressure, temp); - - double sspeed = body.GetSpeedOfSound(pressure, density); - double vel = sspeed * machDouble; - - //UpdateControlSettings(); - - double q = vel * vel * density * 0.5f; - - stabDerivOutput = simManager.StabDerivCalculator.CalculateStabilityDerivs(vel, q, machDouble, 0, 0, 0, _flapSettingDropdown.ActiveSelection, spoilersDeployed, body, altitudeDouble); - simManager.vehicleData = stabDerivOutput; - SetAngleVectors(stabDerivOutput.stableAoA); - } - else - { - PopupDialog.SpawnPopupDialog(new Vector2(0, 0), new Vector2(0, 0), "FARStabDerivError", Localizer.Format("FAREditorStabDerivError"), Localizer.Format("FAREditorStabDerivErrorExp"), Localizer.Format("FARGUIOKButton "), true, HighLogic.UISkin); - } - } + StabDerivCalcButtonAction(false); + if (GUILayout.Button(Localizer.Format("FAREditorStabDerivSaveButton"), GUILayout.Width(250.0F), GUILayout.Height(25.0F))) + StabDerivCalcButtonAction(true); + GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label(Localizer.Format("FAREditorStabDerivAirProp"), GUILayout.Width(180)); @@ -264,6 +231,30 @@ public void Display() DrawTooltip(); } + private void StabDerivCalcButtonAction(bool exportresult) + { + CelestialBody body = _bodySettingDropdown.ActiveSelection; + FARAeroUtil.UpdateCurrentActiveBody(body); + altitude = Regex.Replace(altitude, @"[^-?[0-9]*(\.[0-9]*)?]", ""); + double altitudeDouble = Convert.ToDouble(altitude) * 1000; + machNumber = Regex.Replace(machNumber, @"[^-?[0-9]*(\.[0-9]*)?]", ""); + double machDouble = FARMathUtil.Clamp(Convert.ToSingle(machNumber), 0.001, float.PositiveInfinity); + int flapsettingInt = _flapSettingDropdown.ActiveSelection; + bool spoilersDeployedBool = spoilersDeployed; + + StabilityDerivOutput stabDerivResult = simManager.StabDerivCalculator.CalculateStabilityDerivs(body, altitudeDouble, machDouble, flapsettingInt, spoilersDeployedBool); + if (stabDerivResult != null) + { + stabDerivOutput = stabDerivResult; + simManager.vehicleData = stabDerivResult; + SetAngleVectors(stabDerivResult.stableAoA); + } + else + { + PopupDialog.SpawnPopupDialog(new Vector2(0, 0), new Vector2(0, 0), "FARStabDerivError", Localizer.Format("FAREditorStabDerivError"), Localizer.Format("FAREditorStabDerivErrorExp"), Localizer.Format("FARGUIOKButton"), true, HighLogic.UISkin); + } + } + private void StabilityLabel(String text1, double val, String text2, String tooltip, int width, int sign) { Color color = Color.white; diff --git a/GameData/FerramAerospaceResearch/Localization/Localization.cfg b/GameData/FerramAerospaceResearch/Localization/Localization.cfg index 42cee9650..4dc8195b5 100644 --- a/GameData/FerramAerospaceResearch/Localization/Localization.cfg +++ b/GameData/FerramAerospaceResearch/Localization/Localization.cfg @@ -83,8 +83,9 @@ FAREditorStabDerivSRetract = Retracted FAREditorStabDerivCalcButton = Calculate Stability Derivatives + FAREditorStabDerivSaveButton = Export Stability Derivatives FAREditorStabDerivError = Error! - FAREditorStabDerivErrorExp = Altitude was above atmosphere + FAREditorStabDerivErrorExp = Unable to determine stable angle of attack. Typical problems include insufficient lift at the given speed and altitude. Altitude cannot be above the atmosphere. FAREditorStabDerivAirProp = Aircraft Properties FAREditorStabDerivMoI = Moments of Inertia diff --git a/GameData/FerramAerospaceResearch/Localization/Localization_de-de.cfg b/GameData/FerramAerospaceResearch/Localization/Localization_de-de.cfg index 69afd4dc6..e235dfc86 100644 --- a/GameData/FerramAerospaceResearch/Localization/Localization_de-de.cfg +++ b/GameData/FerramAerospaceResearch/Localization/Localization_de-de.cfg @@ -79,6 +79,7 @@ FAREditorStabDerivSDeploy = Ausgefahren FAREditorStabDerivSRetract = Eingefahren FAREditorStabDerivCalcButton = Berechne Stabilitätswerte +FAREditorStabDerivSaveButton = Stabilitätswerte speichern FAREditorStabDerivError = Fehler! FAREditorStabDerivErrorExp = Höhe war über der Atmosphäre diff --git a/GameData/FerramAerospaceResearch/Localization/Localization_ru.cfg b/GameData/FerramAerospaceResearch/Localization/Localization_ru.cfg index 36d3a5c1e..6278660c0 100644 --- a/GameData/FerramAerospaceResearch/Localization/Localization_ru.cfg +++ b/GameData/FerramAerospaceResearch/Localization/Localization_ru.cfg @@ -65,6 +65,7 @@ FAREditorStabDerivSRetract = Убраны FAREditorStabDerivCalcButton = Вычислить коэфф-ты устойчивости + FAREditorStabDerivSaveButton = Хранить коэфф-ты устойчивости FAREditorStabDerivError = Ошибка! FAREditorStabDerivErrorExp = Введена высота за пределами атмосферы diff --git a/GameData/FerramAerospaceResearch/Localization/Localization_zh-cn.cfg b/GameData/FerramAerospaceResearch/Localization/Localization_zh-cn.cfg index 947469122..28396fa9f 100644 --- a/GameData/FerramAerospaceResearch/Localization/Localization_zh-cn.cfg +++ b/GameData/FerramAerospaceResearch/Localization/Localization_zh-cn.cfg @@ -64,6 +64,7 @@ FAREditorStabDerivSRetract = 收回 FAREditorStabDerivCalcButton = 计算稳定性导数 + FAREditorStabDerivSaveButton = Export Stability Derivatives FAREditorStabDerivError = 错误! FAREditorStabDerivErrorExp = 高度在大气层之外 From eea5af45aee10149dad5b7f179b5692c5b130766 Mon Sep 17 00:00:00 2001 From: Rodhern Date: Sat, 28 Apr 2018 20:00:00 +0200 Subject: [PATCH 06/13] Add stability derivatives export variables. --- .../Simulation/StabilityDerivCalculator.cs | 22 ++++++++++--- .../Simulation/StabilityDerivExportOutput.cs | 32 +++++++++++++++++++ .../FAREditorGUI/StabilityDerivExport.cs | 8 +++++ .../FARGUI/FAREditorGUI/StabilityDerivGUI.cs | 14 ++++---- .../FerramAerospaceResearch.csproj | 2 ++ .../Localization/Localization.cfg | 2 ++ .../Localization/Localization_de-de.cfg | 2 ++ .../Localization/Localization_ru.cfg | 2 ++ .../Localization/Localization_zh-cn.cfg | 2 ++ 9 files changed, 73 insertions(+), 13 deletions(-) create mode 100644 FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/StabilityDerivExportOutput.cs create mode 100644 FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivExport.cs diff --git a/FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/StabilityDerivCalculator.cs b/FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/StabilityDerivCalculator.cs index c0474cc97..208cb5c99 100644 --- a/FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/StabilityDerivCalculator.cs +++ b/FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/StabilityDerivCalculator.cs @@ -58,14 +58,14 @@ public StabilityDerivCalculator(InstantConditionSim instantConditionSim) _instantCondition = instantConditionSim; } - public StabilityDerivOutput CalculateStabilityDerivs(CelestialBody body, double alt, double machNumber, int flapSetting, bool spoilers) + public StabilityDerivExportOutput CalculateStabilityDerivs(CelestialBody body, double alt, double machNumber, int flapSetting, bool spoilers) { // Rodhern: Only return a result if one is found. if (body.GetPressure(alt) > 0) { - StabilityDerivOutput result = CalculateStabilityDerivs(body, alt, machNumber, flapSetting, spoilers, 0, 0, 0); - if (result.stableAoAState == "") + StabilityDerivExportOutput result = CalculateStabilityDerivs(body, alt, machNumber, flapSetting, spoilers, 0, 0, 0); + if (result.outputvals.stableAoAState == "") return result; else return null; @@ -74,7 +74,7 @@ public StabilityDerivOutput CalculateStabilityDerivs(CelestialBody body, double return null; } - public StabilityDerivOutput CalculateStabilityDerivs(CelestialBody body, double alt, double machNumber, int flapSetting, bool spoilers, double alpha, double beta, double phi) + public StabilityDerivExportOutput CalculateStabilityDerivs(CelestialBody body, double alt, double machNumber, int flapSetting, bool spoilers, double alpha, double beta, double phi) { double pressure = body.GetPressure(alt); double temperature = body.GetTemperature(alt); @@ -84,6 +84,7 @@ public StabilityDerivOutput CalculateStabilityDerivs(CelestialBody body, double double q = u0 * u0 * density * 0.5f; StabilityDerivOutput stabDerivOutput = new StabilityDerivOutput(); + StabilityDerivExportVariables stabDerivExport = new StabilityDerivExportVariables(); stabDerivOutput.nominalVelocity = u0; stabDerivOutput.altitude = alt; stabDerivOutput.body = body; @@ -380,7 +381,18 @@ public StabilityDerivOutput CalculateStabilityDerivs(CelestialBody body, double stabDerivOutput.stabDerivs[23] = pertOutput.Cn; //Nr stabDerivOutput.stabDerivs[22] = pertOutput.C_roll; //Lr - return stabDerivOutput; + // Assign values to export variables + stabDerivExport.craftmass = mass; + stabDerivExport.envpressure = pressure; + stabDerivExport.envtemperature = temperature; + stabDerivExport.envdensity = density; + stabDerivExport.envsoundspeed = sspeed; + stabDerivExport.envg = _instantCondition.CalculateAccelerationDueToGravity(body, alt); + stabDerivExport.sitmach = machNumber; + stabDerivExport.sitdynpres = q; + stabDerivExport.siteffG = effectiveG; + + return new StabilityDerivExportOutput(stabDerivOutput, stabDerivExport); } } diff --git a/FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/StabilityDerivExportOutput.cs b/FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/StabilityDerivExportOutput.cs new file mode 100644 index 000000000..e4c75f915 --- /dev/null +++ b/FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/StabilityDerivExportOutput.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace FerramAerospaceResearch.FARGUI.FAREditorGUI.Simulation +{ + class StabilityDerivExportVariables + { + public double craftmass; + + public double envpressure; // in kPa + public double envtemperature; // in Kelvin + public double envdensity; + public double envsoundspeed; + public double envg; + + public double sitmach; + public double sitdynpres; + public double siteffG; // local gravity corrected for speed + } + + class StabilityDerivExportOutput + { + public StabilityDerivOutput outputvals; + public StabilityDerivExportVariables exportvals; + + public StabilityDerivExportOutput(StabilityDerivOutput outputvalues, StabilityDerivExportVariables exportvalues) + { + this.outputvals = outputvalues; + this.exportvals = exportvalues; + } + } +} diff --git a/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivExport.cs b/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivExport.cs new file mode 100644 index 000000000..7d3760b7d --- /dev/null +++ b/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivExport.cs @@ -0,0 +1,8 @@ +using System; +using System.Collections.Generic; +using System.IO; +using UnityEngine; + +namespace FerramAerospaceResearch.FARGUI.FAREditorGUI +{ +} diff --git a/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivGUI.cs b/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivGUI.cs index ccf5953f9..4c489f745 100644 --- a/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivGUI.cs +++ b/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivGUI.cs @@ -242,16 +242,14 @@ private void StabDerivCalcButtonAction(bool exportresult) int flapsettingInt = _flapSettingDropdown.ActiveSelection; bool spoilersDeployedBool = spoilersDeployed; - StabilityDerivOutput stabDerivResult = simManager.StabDerivCalculator.CalculateStabilityDerivs(body, altitudeDouble, machDouble, flapsettingInt, spoilersDeployedBool); - if (stabDerivResult != null) - { - stabDerivOutput = stabDerivResult; - simManager.vehicleData = stabDerivResult; - SetAngleVectors(stabDerivResult.stableAoA); - } + StabilityDerivExportOutput stabDerivResult = simManager.StabDerivCalculator.CalculateStabilityDerivs(body, altitudeDouble, machDouble, flapsettingInt, spoilersDeployedBool); + if (stabDerivResult == null) + PopupDialog.SpawnPopupDialog(new Vector2(0, 0), new Vector2(0, 0), "FARStabDerivError", Localizer.Format("FAREditorStabDerivError"), Localizer.Format("FAREditorStabDerivErrorExp"), Localizer.Format("FARGUIOKButton"), true, HighLogic.UISkin); else { - PopupDialog.SpawnPopupDialog(new Vector2(0, 0), new Vector2(0, 0), "FARStabDerivError", Localizer.Format("FAREditorStabDerivError"), Localizer.Format("FAREditorStabDerivErrorExp"), Localizer.Format("FARGUIOKButton"), true, HighLogic.UISkin); + stabDerivOutput = stabDerivResult.outputvals; + simManager.vehicleData = stabDerivResult.outputvals; + SetAngleVectors(stabDerivResult.outputvals.stableAoA); } } diff --git a/FerramAerospaceResearch/FerramAerospaceResearch.csproj b/FerramAerospaceResearch/FerramAerospaceResearch.csproj index 00104c6c4..c938000ed 100644 --- a/FerramAerospaceResearch/FerramAerospaceResearch.csproj +++ b/FerramAerospaceResearch/FerramAerospaceResearch.csproj @@ -117,6 +117,7 @@ + @@ -126,6 +127,7 @@ + diff --git a/GameData/FerramAerospaceResearch/Localization/Localization.cfg b/GameData/FerramAerospaceResearch/Localization/Localization.cfg index 4dc8195b5..682639620 100644 --- a/GameData/FerramAerospaceResearch/Localization/Localization.cfg +++ b/GameData/FerramAerospaceResearch/Localization/Localization.cfg @@ -86,6 +86,8 @@ FAREditorStabDerivSaveButton = Export Stability Derivatives FAREditorStabDerivError = Error! FAREditorStabDerivErrorExp = Unable to determine stable angle of attack. Typical problems include insufficient lift at the given speed and altitude. Altitude cannot be above the atmosphere. + FAREditorStabDerivSaveError = Error! + FAREditorStabDerivSaveErrorExp = Unable to export stability derivatives. You may need to delete previous exported values. FAREditorStabDerivAirProp = Aircraft Properties FAREditorStabDerivMoI = Moments of Inertia diff --git a/GameData/FerramAerospaceResearch/Localization/Localization_de-de.cfg b/GameData/FerramAerospaceResearch/Localization/Localization_de-de.cfg index e235dfc86..dfc23dfef 100644 --- a/GameData/FerramAerospaceResearch/Localization/Localization_de-de.cfg +++ b/GameData/FerramAerospaceResearch/Localization/Localization_de-de.cfg @@ -82,6 +82,8 @@ FAREditorStabDerivCalcButton = Berechne Stabilitätswerte FAREditorStabDerivSaveButton = Stabilitätswerte speichern FAREditorStabDerivError = Fehler! FAREditorStabDerivErrorExp = Höhe war über der Atmosphäre +FAREditorStabDerivSaveError = Fehler! +FAREditorStabDerivSaveErrorExp = Unable to export stability derivatives. You may need to delete previous exported values. FAREditorStabDerivAirProp = Flugzeug-Eigenschaften FAREditorStabDerivMoI = Trägheitsmoment diff --git a/GameData/FerramAerospaceResearch/Localization/Localization_ru.cfg b/GameData/FerramAerospaceResearch/Localization/Localization_ru.cfg index 6278660c0..6afe51fb7 100644 --- a/GameData/FerramAerospaceResearch/Localization/Localization_ru.cfg +++ b/GameData/FerramAerospaceResearch/Localization/Localization_ru.cfg @@ -68,6 +68,8 @@ FAREditorStabDerivSaveButton = Хранить коэфф-ты устойчивости FAREditorStabDerivError = Ошибка! FAREditorStabDerivErrorExp = Введена высота за пределами атмосферы + FAREditorStabDerivSaveError = Ошибка! + FAREditorStabDerivSaveErrorExp = Unable to export stability derivatives. You may need to delete previous exported values. FAREditorStabDerivAirProp = Параметры судна FAREditorStabDerivMoI = Моменты инерции diff --git a/GameData/FerramAerospaceResearch/Localization/Localization_zh-cn.cfg b/GameData/FerramAerospaceResearch/Localization/Localization_zh-cn.cfg index 28396fa9f..10b0d32cb 100644 --- a/GameData/FerramAerospaceResearch/Localization/Localization_zh-cn.cfg +++ b/GameData/FerramAerospaceResearch/Localization/Localization_zh-cn.cfg @@ -67,6 +67,8 @@ FAREditorStabDerivSaveButton = Export Stability Derivatives FAREditorStabDerivError = 错误! FAREditorStabDerivErrorExp = 高度在大气层之外 + FAREditorStabDerivSaveError = Error! + FAREditorStabDerivSaveErrorExp = Unable to export stability derivatives. You may need to delete previous exported values. FAREditorStabDerivAirProp = 飞行器属性 FAREditorStabDerivMoI = 惯性力矩 From 8a91640f19972cb3562d8cefb7d17a04f688798b Mon Sep 17 00:00:00 2001 From: Rodhern Date: Mon, 30 Apr 2018 14:00:00 +0200 Subject: [PATCH 07/13] Prepare stability derivatives file export (not functional). --- .../Simulation/StabilityDerivCalculator.cs | 2 +- .../FAREditorGUI/StabilityDerivExport.cs | 42 +++++++++++++++++++ .../FARGUI/FAREditorGUI/StabilityDerivGUI.cs | 3 ++ FerramAerospaceResearch/FARMathUtil.cs | 21 ++++++---- .../Plugins/PluginData/sdexport.txt | 0 5 files changed, 59 insertions(+), 9 deletions(-) create mode 100644 GameData/FerramAerospaceResearch/Plugins/PluginData/sdexport.txt diff --git a/FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/StabilityDerivCalculator.cs b/FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/StabilityDerivCalculator.cs index 208cb5c99..f71fd8d10 100644 --- a/FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/StabilityDerivCalculator.cs +++ b/FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/StabilityDerivCalculator.cs @@ -234,7 +234,7 @@ public StabilityDerivExportOutput CalculateStabilityDerivs(CelestialBody body, d //Longitudinal Mess _instantCondition.SetState(machNumber, neededCl, CoM, 0, input.flaps, input.spoilers); - alpha = FARMathUtil.BrentsMethod(_instantCondition.FunctionIterateForAlpha, -30d, 30d, 0.001, 500); + alpha = FARMathUtil.SillySearchMethod(_instantCondition.FunctionIterateForAlpha); input.alpha = alpha; nominalOutput = _instantCondition.iterationOutput; //alpha_str = (alpha * Mathf.PI / 180).ToString(); diff --git a/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivExport.cs b/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivExport.cs index 7d3760b7d..db8bd1c06 100644 --- a/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivExport.cs +++ b/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivExport.cs @@ -5,4 +5,46 @@ namespace FerramAerospaceResearch.FARGUI.FAREditorGUI { + class StabilityDerivativeExportFileElement + { + } + + class StructElement : StabilityDerivativeExportFileElement + { + } + + class StringElement : StabilityDerivativeExportFileElement + { + } + + class ScalarElement : StabilityDerivativeExportFileElement + { + } + + class StabilityDerivativeExportFile + { + private StructElement cellelement; + + public StabilityDerivativeExportFile() + { + } + + static public string TextFilePath + { + get + { + string path = KSPUtil.ApplicationRootPath; + path += "GameData/FerramAerospaceResearch/Plugins/PluginData/"; + path += "sdexport.txt"; + return path; + } + } + + static public bool Export(Simulation.StabilityDerivExportOutput output) + { + StabilityDerivativeExportFile body = new StabilityDerivativeExportFile(); + Debug.Log("[Rodhern] FAR: Pretend to export data to file (" + TextFilePath + ")."); + return true; + } + } } diff --git a/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivGUI.cs b/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivGUI.cs index 4c489f745..3fb234988 100644 --- a/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivGUI.cs +++ b/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivGUI.cs @@ -250,6 +250,9 @@ private void StabDerivCalcButtonAction(bool exportresult) stabDerivOutput = stabDerivResult.outputvals; simManager.vehicleData = stabDerivResult.outputvals; SetAngleVectors(stabDerivResult.outputvals.stableAoA); + + if (exportresult && !StabilityDerivativeExportFile.Export(stabDerivResult)) + PopupDialog.SpawnPopupDialog(new Vector2(0, 0), new Vector2(0, 0), "FARStabDerivSaveError", Localizer.Format("FAREditorStabDerivSaveError"), Localizer.Format("FAREditorStabDerivSaveErrorExp"), Localizer.Format("FARGUIOKButton"), true, HighLogic.UISkin); } } diff --git a/FerramAerospaceResearch/FARMathUtil.cs b/FerramAerospaceResearch/FARMathUtil.cs index a7512a23a..868d61f9b 100644 --- a/FerramAerospaceResearch/FARMathUtil.cs +++ b/FerramAerospaceResearch/FARMathUtil.cs @@ -60,7 +60,7 @@ public static double Lerp(double x1, double x2, double y1, double y2, double x) y += y1; return y; } - + public static T Clamp(this T val, T min, T max) where T : IComparable { if (val.CompareTo(min) < 0) return min; @@ -81,7 +81,7 @@ public static bool Approximately(double p, double q, double error) return true; return false; } - + public static double ArithmeticGeometricMean(double a, double b, double error) { while (!Approximately(a, b, error)) @@ -101,7 +101,7 @@ public static double ModifiedArithmeticGeometricMean(double a, double b, double double tmpA = 0.5 * (a + b); double tmpSqrt = Math.Sqrt((a - c) * (b - c)); b = c + tmpSqrt; - c = c - tmpSqrt; + c = c - tmpSqrt; a = tmpA; } return (a + b) * 0.5; @@ -133,7 +133,7 @@ public static double BrentsMethod(Func function, double a, doubl if (fa * fb >= 0) return 0; - if(Math.Abs(fa) < Math.Abs(fb)) + if (Math.Abs(fa) < Math.Abs(fb)) { double tmp = fa; fa = fb; @@ -146,13 +146,13 @@ public static double BrentsMethod(Func function, double a, doubl double c = a, d = a, fc = function(c); - double s = b, fs = fb; + double s = b, fs = fb; bool flag = true; int iter = 0; - while(fs != 0 && Math.Abs(a - b) > epsilon && iter < maxIter) + while (fs != 0 && Math.Abs(a - b) > epsilon && iter < maxIter) { - if((fa - fc) > double.Epsilon && (fb - fc) > double.Epsilon) //inverse quadratic interpolation + if ((fa - fc) > double.Epsilon && (fb - fc) > double.Epsilon) //inverse quadratic interpolation { s = a * fc * fb / ((fa - fb) * (fa - fc)); s += b * fc * fa / ((fb - fa) * (fb - fc)); @@ -165,7 +165,7 @@ public static double BrentsMethod(Func function, double a, doubl s = b - s; } - double b_s = Math.Abs(b - s), b_c = Math.Abs(b-c), c_d = Math.Abs(c - d); + double b_s = Math.Abs(b - s), b_c = Math.Abs(b - c), c_d = Math.Abs(c - d); //Conditions for bisection method bool condition1; @@ -248,5 +248,10 @@ public static double BrentsMethod(Func function, double a, doubl } return s; } + + public static double SillySearchMethod(Func function) + { + return FARMathUtil.BrentsMethod(function, -30d, 30d, 0.001, 500); + } } } diff --git a/GameData/FerramAerospaceResearch/Plugins/PluginData/sdexport.txt b/GameData/FerramAerospaceResearch/Plugins/PluginData/sdexport.txt new file mode 100644 index 000000000..e69de29bb From fa53a87b5477a0c7a3b0274975c5430332a6a8c3 Mon Sep 17 00:00:00 2001 From: Rodhern Date: Wed, 2 May 2018 20:00:00 +0200 Subject: [PATCH 08/13] Enable stability derivatives file export. Change default AoA search method to one better suited for slow flight scenarios. --- .../FAREditorGUI/StabilityDerivExport.cs | 276 +++++++++++++++++- FerramAerospaceResearch/FARMathUtil.cs | 123 +++++++- 2 files changed, 396 insertions(+), 3 deletions(-) diff --git a/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivExport.cs b/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivExport.cs index db8bd1c06..2fb7a7bba 100644 --- a/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivExport.cs +++ b/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivExport.cs @@ -7,26 +7,128 @@ namespace FerramAerospaceResearch.FARGUI.FAREditorGUI { class StabilityDerivativeExportFileElement { + public string name; + + public StabilityDerivativeExportFileElement(string name) + { + this.name = name; + } + + public virtual List Lines + { get { return new List(); } } } class StructElement : StabilityDerivativeExportFileElement { + public List subelems; + + public StructElement(string name) : base(name) + { + subelems = new List(); + } + + public void AddElement(StabilityDerivativeExportFileElement element) + { + subelems.Add(element); + } + + public void AddScalar(string name, double value) + { + ScalarElement scalar = new ScalarElement(name, value); + this.AddElement(scalar); + } + + public override List Lines + { + get + { + List result = new List(); + result.Add("# name: " + this.name); + result.Add("# type: scalar struct"); + result.Add("# ndims: 2"); + result.Add(" 1 1"); + result.Add("# length: " + subelems.Count); + foreach (StabilityDerivativeExportFileElement elem in subelems) + { + result.Add(""); + foreach (string s in elem.Lines) + result.Add(s); + } + return result; + } + } } class StringElement : StabilityDerivativeExportFileElement { + public string value; + + static public string OnlyASCII(string s) + { + if (s == null || s == "") + return ""; + var sb = new System.Text.StringBuilder(s.Length, s.Length); + foreach (char c in s) + if (31 < (int)c && (int)c < 127) + sb.Append(c); + return sb.ToString(); + } + + public StringElement(string name, string value) : base(name) + { + this.value = OnlyASCII(value); + } + + public override List Lines + { + get + { + List result = new List(); + result.Add("# name: " + this.name); + result.Add("# type: string"); + result.Add("# elements: 1"); + result.Add("# length: " + value.Length); + result.Add(value); + return result; + } + } } class ScalarElement : StabilityDerivativeExportFileElement { + public double value; + private System.Globalization.CultureInfo enus; + + public ScalarElement(string name, double value) : base(name) + { + this.value = value; + this.enus = System.Globalization.CultureInfo.CreateSpecificCulture("en-US"); + } + + public override List Lines + { + get + { + List result = new List(); + result.Add("# name: " + this.name); + result.Add("# type: scalar"); + result.Add(value.ToString("E16", enus)); + return result; + } + } } class StabilityDerivativeExportFile { private StructElement cellelement; + private List bodytext; + private int bodytextcount; public StabilityDerivativeExportFile() { + cellelement = new StructElement(""); + bodytext = new List(); + bodytextcount = -1; } static public string TextFilePath @@ -40,11 +142,181 @@ static public string TextFilePath } } + static public string[] LoadTextFile() + { + string path = TextFilePath; + if (File.Exists(path)) + return File.ReadAllLines(path, System.Text.Encoding.Default); + else + return new string[] {}; + } + + static public void SaveTextFile(List lines) + { + string path = TextFilePath; + File.WriteAllLines(path, lines.ToArray()); + } + + public void LoadBodyText() + { + bodytext = new List(); + string[] lines = LoadTextFile(); + if (lines.Length == 0) + bodytextcount = 0; + else if (lines.Length < 5) + bodytextcount = -1; + else + { + bool b1 = lines[0].StartsWith("# Created by"); + bool b2 = lines[1] == "# name: data"; + bool b3 = lines[2] == "# type: cell"; + bool b4 = lines[3] == "# ndims: 3"; + bool b5 = lines[4].StartsWith(" 1 1 "); + if (b1 && b2 && b3 && b4 && b5) + { + bodytextcount = int.Parse(lines[4].Remove(0, 5)); + int firstidx = 5; + int lastidx = lines.Length - 1; + for (int i = firstidx; i == firstidx && i < lastidx; i++) + if (lines[i] == "") + firstidx = i + 1; + for (int i = lastidx; i == lastidx && i > firstidx; i--) + if (lines[i] == "") + lastidx = i - 1; + for (int i = firstidx; i <= lastidx; i++) + bodytext.Add(lines[i]); + } + else + bodytextcount = -1; + } + } + + public bool BodyTextLoaded() + { + return bodytextcount >= 0; + } + + public void AddElement(StabilityDerivativeExportFileElement element) + { + cellelement.AddElement(element); + } + + public List GetAllLines() + { + List result = new List(); + result.Add("# Created by Ferram Aerospace Research plugin for Kerbal Space Program"); + result.Add("# name: data"); + result.Add("# type: cell"); + result.Add("# ndims: 3"); + result.Add(" 1 1 " + (bodytextcount + 1)); + result.Add(""); + foreach (string s in bodytext) + result.Add(s); + result.Add(""); + foreach (string s in cellelement.Lines) + result.Add(s); + return result; + } + + public void SaveAllText() + { + if (BodyTextLoaded()) + SaveTextFile(GetAllLines()); + else + throw new InvalidOperationException("Cannot save result file because the file was not loaded properly in the first place."); + } + + static public string EditorShipName + { + get + { + EditorLogic logic = EditorLogic.fetch; + if (logic == null || logic.shipNameField == null || logic.shipNameField.text == null) + return ""; + else + return logic.shipNameField.text; + } + } + + public void AddResultElements(Simulation.StabilityDerivExportOutput output) + { + if (cellelement.subelems.Count > 0) + throw new InvalidOperationException("Cannot add result elements; top cell element was not empty."); + else + { + StructElement craft = new StructElement("craft"); + StructElement env = new StructElement("env"); + StructElement deriv = new StructElement("deriv"); + StructElement inertia = new StructElement("inertia"); + + craft.AddElement(new StringElement("name", EditorShipName)); + craft.AddScalar("mass", output.exportvals.craftmass); + craft.AddScalar("span", output.outputvals.b); + craft.AddScalar("chord", output.outputvals.MAC); + craft.AddScalar("area", output.outputvals.area); + craft.AddElement(inertia); + inertia.AddScalar("lxx", output.outputvals.stabDerivs[0]); + inertia.AddScalar("lyy", output.outputvals.stabDerivs[1]); + inertia.AddScalar("lzz", output.outputvals.stabDerivs[2]); + inertia.AddScalar("lxy", output.outputvals.stabDerivs[24]); + inertia.AddScalar("lyz", output.outputvals.stabDerivs[25]); + inertia.AddScalar("lxz", output.outputvals.stabDerivs[26]); + + env.AddElement(new StringElement("body", output.outputvals.body.name)); + env.AddScalar("altitude", output.outputvals.altitude); + env.AddScalar("mach", output.exportvals.sitmach); + env.AddScalar("pressure", output.exportvals.envpressure); + env.AddScalar("temperature", output.exportvals.envtemperature); + env.AddScalar("density", output.exportvals.envdensity); + env.AddScalar("soundspeed", output.exportvals.envsoundspeed); + env.AddScalar("g", output.exportvals.envg); + env.AddScalar("speed", output.outputvals.nominalVelocity); + env.AddScalar("dynpres", output.exportvals.sitdynpres); + env.AddScalar("effG", output.exportvals.siteffG); + + deriv.AddScalar("Cl", output.outputvals.stableCl); + deriv.AddScalar("Cd", output.outputvals.stableCd); + deriv.AddScalar("AoA", output.outputvals.stableAoA); + deriv.AddScalar("Zw", output.outputvals.stabDerivs[3]); + deriv.AddScalar("Xw", output.outputvals.stabDerivs[4]); + deriv.AddScalar("Mw", output.outputvals.stabDerivs[5]); + deriv.AddScalar("Zu", output.outputvals.stabDerivs[6]); + deriv.AddScalar("Xu", output.outputvals.stabDerivs[7]); + deriv.AddScalar("Mu", output.outputvals.stabDerivs[8]); + deriv.AddScalar("Zq", output.outputvals.stabDerivs[9]); + deriv.AddScalar("Xq", output.outputvals.stabDerivs[10]); + deriv.AddScalar("Mq", output.outputvals.stabDerivs[11]); + deriv.AddScalar("Ze", output.outputvals.stabDerivs[12]); + deriv.AddScalar("Xe", output.outputvals.stabDerivs[13]); + deriv.AddScalar("Me", output.outputvals.stabDerivs[14]); + deriv.AddScalar("Yb", output.outputvals.stabDerivs[15]); + deriv.AddScalar("Lb", output.outputvals.stabDerivs[16]); + deriv.AddScalar("Nb", output.outputvals.stabDerivs[17]); + deriv.AddScalar("Yp", output.outputvals.stabDerivs[18]); + deriv.AddScalar("Lp", output.outputvals.stabDerivs[19]); + deriv.AddScalar("Np", output.outputvals.stabDerivs[20]); + deriv.AddScalar("Yr", output.outputvals.stabDerivs[21]); + deriv.AddScalar("Lr", output.outputvals.stabDerivs[22]); + deriv.AddScalar("Nr", output.outputvals.stabDerivs[23]); + + AddElement(craft); + AddElement(env); + AddElement(deriv); + } + } + static public bool Export(Simulation.StabilityDerivExportOutput output) { StabilityDerivativeExportFile body = new StabilityDerivativeExportFile(); - Debug.Log("[Rodhern] FAR: Pretend to export data to file (" + TextFilePath + ")."); - return true; + body.LoadBodyText(); + if (body.BodyTextLoaded()) + { + body.AddResultElements(output); + body.SaveAllText(); + return true; + } + else + return false; } } } diff --git a/FerramAerospaceResearch/FARMathUtil.cs b/FerramAerospaceResearch/FARMathUtil.cs index 868d61f9b..275c411ae 100644 --- a/FerramAerospaceResearch/FARMathUtil.cs +++ b/FerramAerospaceResearch/FARMathUtil.cs @@ -249,9 +249,130 @@ public static double BrentsMethod(Func function, double a, doubl return s; } + private const double rightedge = 30d; + private const double leftedge = -rightedge; + private const double xstepinitial = 5d; + private const double xstepsize = 10d; + private const double minpart = 1d / 8d; + private const double maxpart = 7d / 8d; + private const double tol_triangle = 1E-3; + private const double tol_linear = 3E-4; + private const double tol_brent = 1E-3; + private const int iterlim = 500; + public static double SillySearchMethod(Func function) { - return FARMathUtil.BrentsMethod(function, -30d, 30d, 0.001, 500); + double x0 = 0d; + double f0 = function(x0); + MirroredFunction mfobj = new MirroredFunction(function, f0 > 0d); + if (mfobj.IsMirrored) f0 = -f0; + Func f = mfobj.Delegate; + double x1 = xstepinitial; + double f1 = f(x1); + if (f1 < f0) return mfobj.BrentSolve("Negative initial gradient."); + + LblSkipRight: + if (f1 > 0) return mfobj.LinearSolution(x0, f0, x1, f1); + double x2 = Clamp(x1 + xstepsize, 0d, rightedge); + if (x2 == x1) return mfobj.BrentSolve("Reached far right edge."); + double f2 = f(x2); + if (f2 > f1) + { // skip right + x0 = x1; f0 = f1; + x1 = x2; f1 = f2; + goto LblSkipRight; + } + + LblTriangle: + if (f1 > 0) return mfobj.LinearSolution(x0, f0, x1, f1); + if (x2 - x0 < tol_triangle) return mfobj.BrentSolve("Local maximum is negative (search point x= " + x0 + ")."); + double x01 = (x0 + x1) / 2d; + double x12 = (x1 + x2) / 2d; + double f01 = f(x01); + double f12 = f(x12); + if (f01 >= f1 && f01 >= f12) + { // maximum at x01 + x1 = x01; f1 = f01; + x2 = x1; f2 = f1; + goto LblTriangle; + } + else if (f12 > f1 && f12 > f01) + { // maximum at x12 + x0 = x1; f0 = f1; + x1 = x12; f1 = f12; + goto LblTriangle; + } + else + { // shrink around x1 + x0 = x01; f0 = f01; + x2 = x12; f2 = f12; + goto LblTriangle; + } + } + + public class MirroredFunction + { + private Func F; + private bool mirror; + + public MirroredFunction(Func original, bool mirrored) + { + F = original; + mirror = mirrored; + } + + public Func Delegate + { + get + { + if (mirror) + return this.InvokeMirrored; + else + return this.F; + } + } + + public bool IsMirrored { get { return this.mirror; } } + + private double InvokeMirrored(double x) + { + return -F.Invoke(-x); + } + + public double LinearSolution(double x0, double f0, double x1, double f1) + { + if (this.IsMirrored) + { + double oldx0 = x0; + double oldf0 = f0; + x0 = -x1; f0 = -f1; + x1 = -oldx0; f1 = -oldf0; + } + + LblLoop: + double x = x0 + (x0 - x1) * f0 / (f1 - f0); + if (x1 - x0 < tol_linear) return x; + x = Clamp(x, maxpart * x0 + minpart * x1, minpart * x0 + maxpart * x1); + double fx = F(x); + if (fx < 0d) + { + x0 = x; f0 = fx; + goto LblLoop; + } + else if (fx > 0d) + { + x1 = x; f1 = fx; + goto LblLoop; + } + else + return x; + } + + public double BrentSolve(string dbgmsg) + { + Debug.Log("[Rodhern] FAR: MirroredFunction (mirrored= " + mirror + ") reverting to BrentsMethod: " + dbgmsg); + return FARMathUtil.BrentsMethod(this.F, leftedge, rightedge, tol_brent, iterlim); + } } } } From 02f4fdefe65e701c883e32098a68cb649d8b7aae Mon Sep 17 00:00:00 2001 From: Rodhern Date: Thu, 3 May 2018 15:00:00 +0200 Subject: [PATCH 09/13] Shorten stability derivatives panel shadow in the 'Longitudinal Derivatives' section (minor graphical tweak to GUI). Rename 'siteffG' (situation effective gravity) to 'siteffg' (named 'env.effg' when exported to Octave text file). --- .../FARGUI/FAREditorGUI/Simulation/StabilityDerivCalculator.cs | 2 +- .../FAREditorGUI/Simulation/StabilityDerivExportOutput.cs | 2 +- .../FARGUI/FAREditorGUI/StabilityDerivExport.cs | 2 +- .../FARGUI/FAREditorGUI/StabilityDerivGUI.cs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/StabilityDerivCalculator.cs b/FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/StabilityDerivCalculator.cs index f71fd8d10..65927ddec 100644 --- a/FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/StabilityDerivCalculator.cs +++ b/FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/StabilityDerivCalculator.cs @@ -390,7 +390,7 @@ public StabilityDerivExportOutput CalculateStabilityDerivs(CelestialBody body, d stabDerivExport.envg = _instantCondition.CalculateAccelerationDueToGravity(body, alt); stabDerivExport.sitmach = machNumber; stabDerivExport.sitdynpres = q; - stabDerivExport.siteffG = effectiveG; + stabDerivExport.siteffg = effectiveG; return new StabilityDerivExportOutput(stabDerivOutput, stabDerivExport); } diff --git a/FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/StabilityDerivExportOutput.cs b/FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/StabilityDerivExportOutput.cs index e4c75f915..504303cbf 100644 --- a/FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/StabilityDerivExportOutput.cs +++ b/FerramAerospaceResearch/FARGUI/FAREditorGUI/Simulation/StabilityDerivExportOutput.cs @@ -15,7 +15,7 @@ class StabilityDerivExportVariables public double sitmach; public double sitdynpres; - public double siteffG; // local gravity corrected for speed + public double siteffg; // local gravity corrected for speed } class StabilityDerivExportOutput diff --git a/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivExport.cs b/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivExport.cs index 2fb7a7bba..a26169a26 100644 --- a/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivExport.cs +++ b/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivExport.cs @@ -272,7 +272,7 @@ public void AddResultElements(Simulation.StabilityDerivExportOutput output) env.AddScalar("g", output.exportvals.envg); env.AddScalar("speed", output.outputvals.nominalVelocity); env.AddScalar("dynpres", output.exportvals.sitdynpres); - env.AddScalar("effG", output.exportvals.siteffG); + env.AddScalar("effg", output.exportvals.siteffg); deriv.AddScalar("Cl", output.outputvals.stableCl); deriv.AddScalar("Cd", output.outputvals.stableCd); diff --git a/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivGUI.cs b/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivGUI.cs index 3fb234988..80e6e86ef 100644 --- a/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivGUI.cs +++ b/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivGUI.cs @@ -175,13 +175,13 @@ public void Display() GUIStyle BackgroundStyle = new GUIStyle(GUI.skin.box); BackgroundStyle.hover = BackgroundStyle.active = BackgroundStyle.normal; - GUILayout.BeginVertical(BackgroundStyle); GUILayout.BeginHorizontal(); GUILayout.Label(Localizer.Format("FAREditorDownVelDeriv"), GUILayout.Width(W160)); GUILayout.Label(Localizer.Format("FAREditorFwdVelDeriv"), GUILayout.Width(W160)); GUILayout.Label(Localizer.Format("FAREditorPitchRateDeriv"), GUILayout.Width(W160)); GUILayout.Label(Localizer.Format("FAREditorPitchCtrlDeriv"), GUILayout.Width(W160)); GUILayout.EndHorizontal(); + GUILayout.BeginVertical(BackgroundStyle); GUILayout.BeginHorizontal(); StabilityLabel(Localizer.Format("FAREditorZw"), stabDerivOutput.stabDerivs[3], " " + Localizer.Format("FARUnitInvSec"), Localizer.Format("FAREditorZwExp"), W160, -1); StabilityLabel(Localizer.Format("FAREditorZu"), stabDerivOutput.stabDerivs[6], " " + Localizer.Format("FARUnitInvSec"), Localizer.Format("FAREditorZuExp"), W160, -1); From 8bb48f91329c55bca7d77d235b8a228bcfd7a2eb Mon Sep 17 00:00:00 2001 From: Rodhern Date: Sun, 6 May 2018 20:00:00 +0200 Subject: [PATCH 10/13] Add stability derivatives export loop button. --- .../FAREditorGUI/StabilityDerivExport.cs | 52 ++++++++++++++ .../FARGUI/FAREditorGUI/StabilityDerivGUI.cs | 37 ++++++---- .../Localization/Localization.cfg | 3 + .../Localization/Localization_de-de.cfg | 3 + .../Localization/Localization_ru.cfg | 3 + .../Localization/Localization_zh-cn.cfg | 3 + .../FerramAerospaceResearch/sdexpcfg.txt | 70 +++++++++++++++++++ 7 files changed, 158 insertions(+), 13 deletions(-) create mode 100644 GameData/FerramAerospaceResearch/Plugins/PluginData/FerramAerospaceResearch/sdexpcfg.txt diff --git a/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivExport.cs b/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivExport.cs index a26169a26..fe326b083 100644 --- a/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivExport.cs +++ b/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivExport.cs @@ -131,6 +131,58 @@ public StabilityDerivativeExportFile() bodytextcount = -1; } + static public string ConfigFilePath + { + get + { + string path = KSPUtil.ApplicationRootPath; + path += "GameData/FerramAerospaceResearch/Plugins/PluginData/FerramAerospaceResearch/"; + path += "sdexpcfg.txt"; + return path; + } + } + + static public List LoadConfigList() + { + var resultlist = new List(); + string path = ConfigFilePath; + if (File.Exists(path)) + { + string[] lines = File.ReadAllLines(path, System.Text.Encoding.Default); + if (lines.Length >= 6) + { + bool b1 = lines[0].StartsWith("# Created by"); + bool b2 = lines[1] == "# name: altmach"; + bool b3 = lines[2] == "# type: matrix"; + bool b4 = lines[3].StartsWith("# rows: "); + bool b5 = lines[4] == "# columns: 2"; + if (b1 && b2 && b3 && b4 && b5) + { + var enus = System.Globalization.CultureInfo.CreateSpecificCulture("en-US"); + var floatstyle = System.Globalization.NumberStyles.Float; + int n = int.Parse(lines[3].Remove(0, 8)); + if (lines.Length >= 5 + n) + { + for (int i = 5; i < 5 + n; i++) + { + string[] line = lines[i].Trim().Split(new char[]{' '}); + if (line.Length == 2) + { + float alt; float mach; + if (float.TryParse(line[0], floatstyle, enus, out alt) + && float.TryParse(line[1], floatstyle, enus, out mach)) + { + resultlist.Add(new Vector2(alt, mach)); + } + } + } + } + } + } + } + return resultlist; + } + static public string TextFilePath { get diff --git a/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivGUI.cs b/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivGUI.cs index 80e6e86ef..b6a7eaf8f 100644 --- a/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivGUI.cs +++ b/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivGUI.cs @@ -107,13 +107,10 @@ public void Display() GUILayout.BeginHorizontal(); GUILayout.Label(Localizer.Format("FAREditorStabDerivPlanet")); _bodySettingDropdown.GUIDropDownDisplay(); - GUILayout.Label(Localizer.Format("FAREditorStabDerivAlt")); altitude = GUILayout.TextField(altitude, GUILayout.ExpandWidth(true)); - GUILayout.Label(Localizer.Format("FAREditorStabDerivMach")); machNumber = GUILayout.TextField(machNumber, GUILayout.ExpandWidth(true)); - GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); @@ -125,9 +122,11 @@ public void Display() GUILayout.BeginHorizontal(); if (GUILayout.Button(Localizer.Format("FAREditorStabDerivCalcButton"), GUILayout.Width(250.0F), GUILayout.Height(25.0F))) - StabDerivCalcButtonAction(false); + StabDerivCalcButtonAction(CalcAndExportEnum.CalculateOnly); if (GUILayout.Button(Localizer.Format("FAREditorStabDerivSaveButton"), GUILayout.Width(250.0F), GUILayout.Height(25.0F))) - StabDerivCalcButtonAction(true); + StabDerivCalcButtonAction(CalcAndExportEnum.CalculateAndExport); + if (GUILayout.Button(Localizer.Format("FAREditorStabDerivLoopButton"), GUILayout.Width(175.0F), GUILayout.Height(25.0F))) + StabDerivCalcButtonAction(CalcAndExportEnum.LoopExport); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); @@ -144,7 +143,6 @@ public void Display() GUILayout.Label(Localizer.Format("FAREditorStabDerivScaledSpan") + stabDerivOutput.b.ToString("G3") + " " + Localizer.Format("FARUnitM")); GUILayout.EndVertical(); - GUILayout.BeginVertical(GUILayout.Width(W160)); GUILayout.Label(new GUIContent(Localizer.Format("FAREditorStabDerivIxx") + stabDerivOutput.stabDerivs[0].ToString("G6") + " " + Localizer.Format("FARUnitKgMSq"), Localizer.Format("FAREditorStabDerivIxxExp"))); GUILayout.Label(new GUIContent(Localizer.Format("FAREditorStabDerivIyy") + stabDerivOutput.stabDerivs[1].ToString("G6") + " " + Localizer.Format("FARUnitKgMSq"), Localizer.Format("FAREditorStabDerivIyyExp"))); @@ -165,16 +163,14 @@ public void Display() GUILayout.EndHorizontal(); GUILayout.Label(new GUIContent(Localizer.Format("FARAbbrevAoA") + ": " + stabDerivOutput.stableAoAState + stabDerivOutput.stableAoA.ToString("G6") + " " + Localizer.Format("FARUnitDeg"), Localizer.Format("FAREditorStabDerivAoAExp"))); GUILayout.EndVertical(); - - GUILayout.EndHorizontal(); - - GUILayout.BeginHorizontal(); - GUILayout.Label(Localizer.Format("FAREditorLongDeriv"), GUILayout.Width(W160)); GUILayout.EndHorizontal(); GUIStyle BackgroundStyle = new GUIStyle(GUI.skin.box); BackgroundStyle.hover = BackgroundStyle.active = BackgroundStyle.normal; + GUILayout.BeginHorizontal(); + GUILayout.Label(Localizer.Format("FAREditorLongDeriv"), GUILayout.Width(W160)); + GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label(Localizer.Format("FAREditorDownVelDeriv"), GUILayout.Width(W160)); GUILayout.Label(Localizer.Format("FAREditorFwdVelDeriv"), GUILayout.Width(W160)); @@ -231,7 +227,9 @@ public void Display() DrawTooltip(); } - private void StabDerivCalcButtonAction(bool exportresult) + private enum CalcAndExportEnum { CalculateOnly, CalculateAndExport, LoopExport }; + + private void StabDerivCalcButtonAction(CalcAndExportEnum exportflag) { CelestialBody body = _bodySettingDropdown.ActiveSelection; FARAeroUtil.UpdateCurrentActiveBody(body); @@ -242,6 +240,19 @@ private void StabDerivCalcButtonAction(bool exportresult) int flapsettingInt = _flapSettingDropdown.ActiveSelection; bool spoilersDeployedBool = spoilersDeployed; + if (exportflag == CalcAndExportEnum.LoopExport) + { + int n = 0; + foreach (Vector2 altmach in StabilityDerivativeExportFile.LoadConfigList()) + { + StabilityDerivExportOutput output = simManager.StabDerivCalculator.CalculateStabilityDerivs(body, (double)altmach.x, (double)altmach.y, flapsettingInt, spoilersDeployedBool); + if (output != null && StabilityDerivativeExportFile.Export(output)) + n++; + } + PopupDialog.SpawnPopupDialog(new Vector2(0, 0), new Vector2(0, 0), "FARStabDerivLoopCount", Localizer.Format("FAREditorStabDerivLoopDone"), Localizer.Format("FAREditorStabDerivLoopDoneExp", n), Localizer.Format("FARGUIOKButton"), true, HighLogic.UISkin); + return; // in the LoopExport case skip the usual calculation + } + StabilityDerivExportOutput stabDerivResult = simManager.StabDerivCalculator.CalculateStabilityDerivs(body, altitudeDouble, machDouble, flapsettingInt, spoilersDeployedBool); if (stabDerivResult == null) PopupDialog.SpawnPopupDialog(new Vector2(0, 0), new Vector2(0, 0), "FARStabDerivError", Localizer.Format("FAREditorStabDerivError"), Localizer.Format("FAREditorStabDerivErrorExp"), Localizer.Format("FARGUIOKButton"), true, HighLogic.UISkin); @@ -251,7 +262,7 @@ private void StabDerivCalcButtonAction(bool exportresult) simManager.vehicleData = stabDerivResult.outputvals; SetAngleVectors(stabDerivResult.outputvals.stableAoA); - if (exportresult && !StabilityDerivativeExportFile.Export(stabDerivResult)) + if (exportflag == CalcAndExportEnum.CalculateAndExport && !StabilityDerivativeExportFile.Export(stabDerivResult)) PopupDialog.SpawnPopupDialog(new Vector2(0, 0), new Vector2(0, 0), "FARStabDerivSaveError", Localizer.Format("FAREditorStabDerivSaveError"), Localizer.Format("FAREditorStabDerivSaveErrorExp"), Localizer.Format("FARGUIOKButton"), true, HighLogic.UISkin); } } diff --git a/GameData/FerramAerospaceResearch/Localization/Localization.cfg b/GameData/FerramAerospaceResearch/Localization/Localization.cfg index 682639620..bab98791e 100644 --- a/GameData/FerramAerospaceResearch/Localization/Localization.cfg +++ b/GameData/FerramAerospaceResearch/Localization/Localization.cfg @@ -84,10 +84,13 @@ FAREditorStabDerivCalcButton = Calculate Stability Derivatives FAREditorStabDerivSaveButton = Export Stability Derivatives + FAREditorStabDerivLoopButton = Run Export Loop FAREditorStabDerivError = Error! FAREditorStabDerivErrorExp = Unable to determine stable angle of attack. Typical problems include insufficient lift at the given speed and altitude. Altitude cannot be above the atmosphere. FAREditorStabDerivSaveError = Error! FAREditorStabDerivSaveErrorExp = Unable to export stability derivatives. You may need to delete previous exported values. + FAREditorStabDerivLoopDone = Calculation loop complete + FAREditorStabDerivLoopDoneExp = The stability derivatives export loop calculated and exported <<1>> solution result(s). FAREditorStabDerivAirProp = Aircraft Properties FAREditorStabDerivMoI = Moments of Inertia diff --git a/GameData/FerramAerospaceResearch/Localization/Localization_de-de.cfg b/GameData/FerramAerospaceResearch/Localization/Localization_de-de.cfg index dfc23dfef..343dab1db 100644 --- a/GameData/FerramAerospaceResearch/Localization/Localization_de-de.cfg +++ b/GameData/FerramAerospaceResearch/Localization/Localization_de-de.cfg @@ -80,10 +80,13 @@ FAREditorStabDerivSRetract = Eingefahren FAREditorStabDerivCalcButton = Berechne Stabilitätswerte FAREditorStabDerivSaveButton = Stabilitätswerte speichern +FAREditorStabDerivLoopButton = Run Export Loop FAREditorStabDerivError = Fehler! FAREditorStabDerivErrorExp = Höhe war über der Atmosphäre FAREditorStabDerivSaveError = Fehler! FAREditorStabDerivSaveErrorExp = Unable to export stability derivatives. You may need to delete previous exported values. +FAREditorStabDerivLoopDone = Calculation loop complete +FAREditorStabDerivLoopDoneExp = The stability derivatives export loop calculated and exported <<1>> solution result(s). FAREditorStabDerivAirProp = Flugzeug-Eigenschaften FAREditorStabDerivMoI = Trägheitsmoment diff --git a/GameData/FerramAerospaceResearch/Localization/Localization_ru.cfg b/GameData/FerramAerospaceResearch/Localization/Localization_ru.cfg index 6afe51fb7..40a2a354b 100644 --- a/GameData/FerramAerospaceResearch/Localization/Localization_ru.cfg +++ b/GameData/FerramAerospaceResearch/Localization/Localization_ru.cfg @@ -66,10 +66,13 @@ FAREditorStabDerivCalcButton = Вычислить коэфф-ты устойчивости FAREditorStabDerivSaveButton = Хранить коэфф-ты устойчивости + FAREditorStabDerivLoopButton = Run Export Loop FAREditorStabDerivError = Ошибка! FAREditorStabDerivErrorExp = Введена высота за пределами атмосферы FAREditorStabDerivSaveError = Ошибка! FAREditorStabDerivSaveErrorExp = Unable to export stability derivatives. You may need to delete previous exported values. + FAREditorStabDerivLoopDone = Calculation loop complete + FAREditorStabDerivLoopDoneExp = The stability derivatives export loop calculated and exported <<1>> solution result(s). FAREditorStabDerivAirProp = Параметры судна FAREditorStabDerivMoI = Моменты инерции diff --git a/GameData/FerramAerospaceResearch/Localization/Localization_zh-cn.cfg b/GameData/FerramAerospaceResearch/Localization/Localization_zh-cn.cfg index 10b0d32cb..febf49230 100644 --- a/GameData/FerramAerospaceResearch/Localization/Localization_zh-cn.cfg +++ b/GameData/FerramAerospaceResearch/Localization/Localization_zh-cn.cfg @@ -65,10 +65,13 @@ FAREditorStabDerivCalcButton = 计算稳定性导数 FAREditorStabDerivSaveButton = Export Stability Derivatives + FAREditorStabDerivLoopButton = Run Export Loop FAREditorStabDerivError = 错误! FAREditorStabDerivErrorExp = 高度在大气层之外 FAREditorStabDerivSaveError = Error! FAREditorStabDerivSaveErrorExp = Unable to export stability derivatives. You may need to delete previous exported values. + FAREditorStabDerivLoopDone = Calculation loop complete + FAREditorStabDerivLoopDoneExp = The stability derivatives export loop calculated and exported <<1>> solution result(s). FAREditorStabDerivAirProp = 飞行器属性 FAREditorStabDerivMoI = 惯性力矩 diff --git a/GameData/FerramAerospaceResearch/Plugins/PluginData/FerramAerospaceResearch/sdexpcfg.txt b/GameData/FerramAerospaceResearch/Plugins/PluginData/FerramAerospaceResearch/sdexpcfg.txt new file mode 100644 index 000000000..50da1d6ad --- /dev/null +++ b/GameData/FerramAerospaceResearch/Plugins/PluginData/FerramAerospaceResearch/sdexpcfg.txt @@ -0,0 +1,70 @@ +# Created by Ferram Aerospace Research plugin for Kerbal Space Program +# name: altmach +# type: matrix +# rows: 65 +# columns: 2 + 0 0.10 + 0 0.25 + 0 0.35 + 0 0.50 + 0 0.70 + 0 0.85 + 0 0.95 + 0 1.20 + 0 1.50 + 0 2 + 0 3 + 0 5 + 2E3 0.10 + 2E3 0.35 + 2E3 0.50 + 2E3 0.70 + 2E3 0.95 + 2E3 1.20 + 2E3 2 + 2E3 5 + 5E3 0.35 + 5E3 0.70 + 5E3 0.95 + 5E3 1.20 + 5E3 1.50 + 5E3 3 + 8E3 0.35 + 8E3 0.85 + 8E3 0.95 + 8E3 1.20 + 8E3 1.50 + 8E3 5 + 12E3 0.35 + 12E3 0.50 + 12E3 0.70 + 12E3 0.85 + 12E3 0.95 + 12E3 1.20 + 12E3 1.50 + 12E3 2 + 12E3 3 + 12E3 5 + 18E3 0.35 + 18E3 0.85 + 18E3 1.20 + 18E3 2 + 24E3 0.50 + 24E3 0.95 + 24E3 1.20 + 24E3 3 + 30E3 0.70 + 30E3 1.20 + 30E3 2 + 30E3 3 + 30E3 5 + 40E3 0.85 + 40E3 1.20 + 40E3 2 + 40E3 3 + 40E3 5 + 60E3 0.85 + 60E3 1.20 + 60E3 2 + 60E3 3 + 60E3 5 From b1d675151635db640f4c594cb3eea046432890ad Mon Sep 17 00:00:00 2001 From: Rodhern Date: Wed, 9 May 2018 20:00:00 +0200 Subject: [PATCH 11/13] Add file cache for stability derivatives export loop. --- .../FAREditorGUI/StabilityDerivExport.cs | 114 ++++++++++++------ .../FARGUI/FAREditorGUI/StabilityDerivGUI.cs | 11 +- 2 files changed, 85 insertions(+), 40 deletions(-) diff --git a/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivExport.cs b/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivExport.cs index fe326b083..c6015e9bb 100644 --- a/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivExport.cs +++ b/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivExport.cs @@ -118,6 +118,67 @@ public override List Lines } } + class ExportTextFileCache + { + private string[] filetext; + + /// + /// Physical file read. + /// + public ExportTextFileCache () + { + filetext = LoadTextFile(); + } + + /// + /// Access text cache. + /// + public string[] TextFileLines + { get { return filetext; } } + + /// + /// Overwrite text cache with new content. + /// + public void UpdateTextFileLines(List lines) + { + filetext = lines.ToArray(); + } + + /// + /// Write cache to disk. + /// + public void FlushTextFileLines() + { + SaveTextFile(filetext); + } + + static public string TextFilePath + { + get + { + string path = KSPUtil.ApplicationRootPath; + path += "GameData/FerramAerospaceResearch/Plugins/PluginData/"; + path += "sdexport.txt"; + return path; + } + } + + static public string[] LoadTextFile() + { + string path = TextFilePath; + if (File.Exists(path)) + return File.ReadAllLines(path, System.Text.Encoding.Default); + else + return new string[] { }; + } + + static public void SaveTextFile(string[] lines) + { + string path = TextFilePath; + File.WriteAllLines(path, lines); + } + } + class StabilityDerivativeExportFile { private StructElement cellelement; @@ -135,10 +196,10 @@ static public string ConfigFilePath { get { - string path = KSPUtil.ApplicationRootPath; - path += "GameData/FerramAerospaceResearch/Plugins/PluginData/FerramAerospaceResearch/"; - path += "sdexpcfg.txt"; - return path; + string path = KSPUtil.ApplicationRootPath; + path += "GameData/FerramAerospaceResearch/Plugins/PluginData/FerramAerospaceResearch/"; + path += "sdexpcfg.txt"; + return path; } } @@ -183,36 +244,10 @@ static public List LoadConfigList() return resultlist; } - static public string TextFilePath - { - get - { - string path = KSPUtil.ApplicationRootPath; - path += "GameData/FerramAerospaceResearch/Plugins/PluginData/"; - path += "sdexport.txt"; - return path; - } - } - - static public string[] LoadTextFile() - { - string path = TextFilePath; - if (File.Exists(path)) - return File.ReadAllLines(path, System.Text.Encoding.Default); - else - return new string[] {}; - } - - static public void SaveTextFile(List lines) - { - string path = TextFilePath; - File.WriteAllLines(path, lines.ToArray()); - } - - public void LoadBodyText() + public void LoadBodyText(ExportTextFileCache cache) { bodytext = new List(); - string[] lines = LoadTextFile(); + string[] lines = cache.TextFileLines; if (lines.Length == 0) bodytextcount = 0; else if (lines.Length < 5) @@ -270,12 +305,12 @@ public List GetAllLines() return result; } - public void SaveAllText() + public void UpdateAllText(ExportTextFileCache cache) { if (BodyTextLoaded()) - SaveTextFile(GetAllLines()); + cache.UpdateTextFileLines(GetAllLines()); else - throw new InvalidOperationException("Cannot save result file because the file was not loaded properly in the first place."); + throw new InvalidOperationException("Cannot save result file to cache because the file was not loaded properly from cache in the first place."); } static public string EditorShipName @@ -357,14 +392,17 @@ public void AddResultElements(Simulation.StabilityDerivExportOutput output) } } - static public bool Export(Simulation.StabilityDerivExportOutput output) + static public bool Export(Simulation.StabilityDerivExportOutput output, ExportTextFileCache filecache = null) { StabilityDerivativeExportFile body = new StabilityDerivativeExportFile(); - body.LoadBodyText(); + ExportTextFileCache cache = (filecache != null) ? filecache : new ExportTextFileCache(); + body.LoadBodyText(cache); if (body.BodyTextLoaded()) { body.AddResultElements(output); - body.SaveAllText(); + body.UpdateAllText(cache); + if (filecache == null) + cache.FlushTextFileLines(); return true; } else diff --git a/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivGUI.cs b/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivGUI.cs index b6a7eaf8f..5d11ce1bb 100644 --- a/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivGUI.cs +++ b/FerramAerospaceResearch/FARGUI/FAREditorGUI/StabilityDerivGUI.cs @@ -243,13 +243,20 @@ private void StabDerivCalcButtonAction(CalcAndExportEnum exportflag) if (exportflag == CalcAndExportEnum.LoopExport) { int n = 0; + ExportTextFileCache filecache = new ExportTextFileCache(); foreach (Vector2 altmach in StabilityDerivativeExportFile.LoadConfigList()) { StabilityDerivExportOutput output = simManager.StabDerivCalculator.CalculateStabilityDerivs(body, (double)altmach.x, (double)altmach.y, flapsettingInt, spoilersDeployedBool); - if (output != null && StabilityDerivativeExportFile.Export(output)) + if (output != null && StabilityDerivativeExportFile.Export(output, filecache)) n++; } - PopupDialog.SpawnPopupDialog(new Vector2(0, 0), new Vector2(0, 0), "FARStabDerivLoopCount", Localizer.Format("FAREditorStabDerivLoopDone"), Localizer.Format("FAREditorStabDerivLoopDoneExp", n), Localizer.Format("FARGUIOKButton"), true, HighLogic.UISkin); + if (n > 0) + { + filecache.FlushTextFileLines(); + PopupDialog.SpawnPopupDialog(new Vector2(0, 0), new Vector2(0, 0), "FARStabDerivLoopCount", Localizer.Format("FAREditorStabDerivLoopDone"), Localizer.Format("FAREditorStabDerivLoopDoneExp", n), Localizer.Format("FARGUIOKButton"), true, HighLogic.UISkin); + } + else + PopupDialog.SpawnPopupDialog(new Vector2(0, 0), new Vector2(0, 0), "FARStabDerivSaveError", Localizer.Format("FAREditorStabDerivSaveError"), Localizer.Format("FAREditorStabDerivSaveErrorExp"), Localizer.Format("FARGUIOKButton"), true, HighLogic.UISkin); return; // in the LoopExport case skip the usual calculation } From 8e9c2c43afedb6fcd10e790919d5a1d9a6c04500 Mon Sep 17 00:00:00 2001 From: Rodhern Date: Sun, 11 Nov 2018 19:45:00 +0100 Subject: [PATCH 12/13] Remove 'note.txt' from .gitignore. --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 227703572..94b976cd9 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,6 @@ obj *.mdb /GameData/FerramAerospaceResearch/Custom*.cfg /GameData/FerramAerospaceResearch/FARForceDataUpdate.cfg -/note.txt *.suo *.DotSettings *.user From 508aa93e25e1031a65da3c3cf40621dfd02ee438 Mon Sep 17 00:00:00 2001 From: Rodhern Date: Sun, 11 Nov 2018 21:00:00 +0100 Subject: [PATCH 13/13] Reverted update to FAR.version. --- GameData/FerramAerospaceResearch/FAR.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GameData/FerramAerospaceResearch/FAR.version b/GameData/FerramAerospaceResearch/FAR.version index 668944240..2e6f1e16b 100644 --- a/GameData/FerramAerospaceResearch/FAR.version +++ b/GameData/FerramAerospaceResearch/FAR.version @@ -10,7 +10,7 @@ "MAJOR" : 0, "MINOR" : 15, "PATCH" : 9, - "BUILD" : 6 + "BUILD" : 5 }, "KSP_VERSION_MIN" : { "MAJOR" : 1,