From f9cd59a3907909dae4809f79611bca78c61e07ec Mon Sep 17 00:00:00 2001
From: ningshuxia <ningshuxia0927@outlook.com>
Date: 星期三, 30 四月 2025 22:08:05 +0800
Subject: [PATCH] 代码修改

---
 02-desktop/Desktop/IStation.Test/Station1Helper.cs                                                    |    3 
 02-desktop/Calculation/IStation.Dispatch/Model/AnaSchemeItem.cs                                       |   15 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/扩展类/TreeListExtend.cs                               |    6 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/00-core/CacheHelper.cs                      |   57 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/SetPumpRunConfigDlg.Designer.cs               |  276 ++
 02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipForm.Designer.cs                          |   98 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/00-core/ConfigHelper.cs                     |   42 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisParameterCacheHelper.cs |   53 
 01-api/Service/IStation.Service/07-helper/01-analysis/AnalysisHelper.cs                               |    3 
 02-desktop/Model/IStation.Model.Curve/曲线表达式/CurvePoint_Extensions.cs                                  |  427 +++
 02-desktop/Desktop/IStation.Desktop.Ch2/IStation.Desktop.Ch2.csproj                                   |    1 
 02-desktop/Model/IStation.Model.Curve/相似换算/CutSimuCalculer.cs                                         |    5 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipForm.cs                                   |   70 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/04-dal/01-analysis/AnalysisPump.cs                     |  212 +
 02-desktop/BLL/IStation.BLL.Basic/Equipment/Equipment/Equipment.cs                                    |   19 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/01-analysis/AnalysisHelper_Model.cs          |  133 +
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/IStation.WinFrmUI.Schedule.csproj                      |   46 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/02-model/00-basic/02-config/ScheduleConfig.cs          |  125 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/01-analysis/AnalysisHelper.cs                |  291 ++
 02-desktop/Desktop/IStation.Desktop.Ch2/Func/FuncCreater.cs                                           |   19 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/02-model/00-basic/02-config/WaterSupplyLimit.cs        |   69 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/eTipStatus.cs                                |   32 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ParallelCurveViewDlg.Designer.cs              |   61 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/000/AnaCurveItem.cs                           |   68 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/02-model/00-basic/02-config/FrequencyLimit.cs          |   69 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ParallelCurveViewDlg.cs                       |   81 
 02-desktop/Model/IStation.Model.Curve/曲线表达式/CurveExpress_Extensions.cs                                |  527 +++
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Resources/datasource.svg                               |   18 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ParallelCurveViewDlg.resx                     |  123 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/SetPumpRunConfigDlg.cs                        |   51 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Curve/Import/Excel/ImportCurveByExcelCtrl.cs                    |   11 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisPump.cs                 |   35 
 02-desktop/Model/IStation.Model.Basic/Equipment/paras/3-beng/Pump.cs                                  |   73 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ScheduleAnalyPage.Designer.cs                 |  584 ++++
 02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipFormHelper.cs                             |   85 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/000/AnaSchemeItem.cs                          |   73 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ScheduleAnalyPage.cs                          |  290 ++
 02-desktop/IStation.Desktop.Ch.sln                                                                    |   18 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Properties/Resources.resx                              |  124 
 02-desktop/Desktop/IStation.Test/Program.cs                                                           |    4 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/04-dal/ConfigHelper.cs                                 |   71 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/02-schedule/ScheduleHelper.cs                |  918 ++++++
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ScheduleAnalyPage.resx                        |  209 +
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisPumpCacheHelper.cs      |   53 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/04-dal/01-analysis/AnalysisParameter.cs                |  184 +
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/01-entity/01-analysis/AnalysisPump.cs                  |   93 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/01-entity/01-analysis/AnalysisParameter.cs             |   90 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/SetPumpRunConfigDlg.resx                      |  123 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/右下弹窗/AlertTool.cs                                   |    1 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisParameter_Instance.cs   |   65 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/00-core/CacheKeyHelper.cs                   |   27 
 02-desktop/Calculation/IStation.Dispatch/Model/AnaScheme.cs                                           |    5 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisParameter.cs            |  208 +
 02-desktop/WinFrmUI/IStation.WinFrmUI.Core/GlobalUsings.cs                                            |   25 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Core/IStation.WinFrmUI.Core.csproj.user                         |    6 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/RunFlagHelper.cs                            |   20 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/GlobalUsing.cs                                         |    8 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Properties/Resources.Designer.cs                       |   73 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Core/IStation.WinFrmUI.Core.csproj                              |   10 
 02-desktop/Model/IStation.Model.Curve/曲线表达式/CurveExpress.cs                                           |    2 
 02-desktop/Component/IStation.Newtonsoft/JsonHelper.cs                                                |   30 
 /dev/null                                                                                             |  837 ------
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/000/AnaScheme.cs                              |  103 
 02-desktop/Model/IStation.Model.Curve/曲线计算/CurveCalcuHelper.cs                                        |   18 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/扩展类/GridViewExtend.cs                               |   27 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Analy/Dispatch/DispatchAnalyPage.cs                             |   26 
 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/02-schedule/ScheduleHelper_Model.cs          |  167 +
 02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipForm.resx                                 |  177 +
 68 files changed, 6,947 insertions(+), 926 deletions(-)

diff --git a/01-api/Service/IStation.Service/07-helper/01-analysis/AnalysisHelper.cs b/01-api/Service/IStation.Service/07-helper/01-analysis/AnalysisHelper.cs
index fdbd9fa..3b2b451 100644
--- a/01-api/Service/IStation.Service/07-helper/01-analysis/AnalysisHelper.cs
+++ b/01-api/Service/IStation.Service/07-helper/01-analysis/AnalysisHelper.cs
@@ -158,8 +158,7 @@
         /// <summary>
         /// 鍒嗘瀽娉�
         /// </summary>
-        /// <param name="pumps"></param>
-        /// <param name="analysis_factor_list"></param>
+        /// <param name="pumps"></param> 
         /// <exception cref="Exception"></exception>
         public void AnalysisNew(List<Model.Pump> pumps, Dictionary<int, Dictionary<int, List<CurvePoint>>> flagHzCurveDict)
         {
diff --git a/02-desktop/BLL/IStation.BLL.Basic/Equipment/Equipment/Equipment.cs b/02-desktop/BLL/IStation.BLL.Basic/Equipment/Equipment/Equipment.cs
index af50225..9d7a202 100644
--- a/02-desktop/BLL/IStation.BLL.Basic/Equipment/Equipment/Equipment.cs
+++ b/02-desktop/BLL/IStation.BLL.Basic/Equipment/Equipment/Equipment.cs
@@ -261,11 +261,26 @@
         public List<Model.Equipment<Model.PumpModel>> GetPumpModelListByBelongTypeAndBelongID(string belongType, long belongId)
         {
             var all = GetByBelongTypeAndBelongID(belongType, belongId);
-            var engine_pump_list = all?.Where(x => x.Catalog == IStation.Equipment.Pump).OrderBy(x => x.SortCode).ToList();
+            var engine_pump_list = all?.Where(x => x.Catalog == IStation.Equipment.EnginePump).OrderBy(x => x.SortCode).ToList();
             if (engine_pump_list == null || engine_pump_list.Count < 1)
                 return default;
-            return engine_pump_list.Select(x => new Model.Equipment<Model.PumpModel>(x)).ToList();
+            var pump_list = all?.Where(x => x.Catalog == IStation.Equipment.Pump).OrderBy(x => x.SortCode).ToList();
+            if (pump_list == null || pump_list.Count < 1)
+                return default;
+            var list = new List<Model.Equipment<Model.PumpModel>>();
+            foreach (var engine_pump in engine_pump_list)
+            {
+                var pump = pump_list.Find(x => x.ParentIds.Contains(engine_pump.ID));
+                if (pump != null)
+                {
+                    var pumpModel = new Model.Equipment<Model.PumpModel>(pump);
+                    pumpModel.SortCode = engine_pump.SortCode;
+                    list.Add(pumpModel);
+                }
+            }
+            return list;
         }
+
         #endregion
 
         #region Insert
diff --git a/02-desktop/Calculation/IStation.Dispatch/Model/AnaScheme.cs b/02-desktop/Calculation/IStation.Dispatch/Model/AnaScheme.cs
index 27a7dd0..e11d8ba 100644
--- a/02-desktop/Calculation/IStation.Dispatch/Model/AnaScheme.cs
+++ b/02-desktop/Calculation/IStation.Dispatch/Model/AnaScheme.cs
@@ -1,4 +1,5 @@
-锘縰sing System.Collections.Generic;
+锘縰sing System;
+using System.Collections.Generic;
 using System.Linq;
 
 namespace IStation.Dispatch.Model
@@ -91,6 +92,8 @@
         /// 
         /// </summary>
         public string ItemsParas { get; set; }
+
+
     }
 
 
diff --git a/02-desktop/Calculation/IStation.Dispatch/Model/AnaSchemeItem.cs b/02-desktop/Calculation/IStation.Dispatch/Model/AnaSchemeItem.cs
index efe6553..63e5941 100644
--- a/02-desktop/Calculation/IStation.Dispatch/Model/AnaSchemeItem.cs
+++ b/02-desktop/Calculation/IStation.Dispatch/Model/AnaSchemeItem.cs
@@ -1,4 +1,6 @@
-锘縩amespace IStation.Dispatch.Model
+锘縰sing System;
+
+namespace IStation.Dispatch.Model
 {
     /// <summary>
     /// 
@@ -121,5 +123,16 @@
 
         public long PumpCurveID { get; set; }
 
+
+
+
+        public void Round()
+        {
+            this.WorkPointQ = Math.Round(this.WorkPointQ, 1);
+            this.WorkPointH = Math.Round(this.WorkPointH, 1);
+            this.WorkPointE = Math.Round(this.WorkPointE, 1);
+            this.WorkPointP = Math.Round(this.WorkPointP, 1); 
+            this.Speed = Math.Round(this.Speed, 1);
+        }
     }
 }
diff --git a/02-desktop/Component/IStation.Newtonsoft/JsonHelper.cs b/02-desktop/Component/IStation.Newtonsoft/JsonHelper.cs
index 8b08327..e69e043 100644
--- a/02-desktop/Component/IStation.Newtonsoft/JsonHelper.cs
+++ b/02-desktop/Component/IStation.Newtonsoft/JsonHelper.cs
@@ -59,11 +59,34 @@
         /// <summary>
         /// 瀵硅薄杞负json
         /// </summary>
-        public static string Object2Json<T>(T t)
+        public static string Object2JsonCustom<T>(T t)
         {
             if (t == null)
                 return default;
             return JsonConvert.SerializeObject(t, new JsonSerializerSettings
+            {
+                Converters = new[] { new CustomFloatConverter() }
+            });
+        }
+
+        /// <summary>
+        /// 瀵硅薄杞负json
+        /// </summary>
+        public static string Object2Json<T>(T t)
+        {
+            if (t == null)
+                return default;
+            return JsonConvert.SerializeObject(t);
+        }
+
+        /// <summary>
+        /// 瀵硅薄杞负鏍煎紡 json
+        /// </summary>
+        public static string Object2FormatJsonCustom<T>(T t)
+        {
+            if (t == null)
+                return default;
+            return JsonConvert.SerializeObject(t, Formatting.Indented, new JsonSerializerSettings
             {
                 Converters = new[] { new CustomFloatConverter() }
             });
@@ -76,10 +99,7 @@
         {
             if (t == null)
                 return default;
-            return JsonConvert.SerializeObject(t, Formatting.Indented, new JsonSerializerSettings
-            {
-                Converters = new[] { new CustomFloatConverter() }
-            });
+            return JsonConvert.SerializeObject(t, Formatting.Indented);
         }
 
         /// <summary>
diff --git a/02-desktop/Desktop/IStation.Desktop.Ch2/Func/FuncCreater.cs b/02-desktop/Desktop/IStation.Desktop.Ch2/Func/FuncCreater.cs
index c15579d..7650bc8 100644
--- a/02-desktop/Desktop/IStation.Desktop.Ch2/Func/FuncCreater.cs
+++ b/02-desktop/Desktop/IStation.Desktop.Ch2/Func/FuncCreater.cs
@@ -16,10 +16,12 @@
             var station = new FuncElement("娉电珯", dll, "IStation.WinFrmUI.Basic.StationMgrPage", modular, Resources.Station);
             var equipment = new FuncElement("璁惧", dll, "IStation.WinFrmUI.Basic.EquipmentMgrPage", modular, Resources.EnginePump);
             var pumpCurveMgr = new FuncElement("娉垫洸绾�", dll, "IStation.WinFrmUI.Basic.PumpCurveMgrPage", modular, Resources.PumpCurve);
-            var monitorPoint = new FuncElement("鐩戞祴鐐�", dll, "IStation.WinFrmUI.Basic.MonitorPointMgrPage", modular, Resources.MonitorPoint);
-            var equipmentMonitorMapping = new FuncElement("娴嬬偣鍏宠仈", dll, "IStation.WinFrmUI.Basic.EquipmentMonitorMappingMgrPage", modular, Resources.Mapping);
-            return new List<FuncElement>() { station, equipment, pumpCurveMgr, monitorPoint, equipmentMonitorMapping };
+            //var monitorPoint = new FuncElement("鐩戞祴鐐�", dll, "IStation.WinFrmUI.Basic.MonitorPointMgrPage", modular, Resources.MonitorPoint);
+            //var equipmentMonitorMapping = new FuncElement("娴嬬偣鍏宠仈", dll, "IStation.WinFrmUI.Basic.EquipmentMonitorMappingMgrPage", modular, Resources.Mapping);
+            return new List<FuncElement>() { station, equipment, pumpCurveMgr};
+           // return new List<FuncElement>() { station, equipment, pumpCurveMgr, monitorPoint, equipmentMonitorMapping };
         }
+
         public static List<FuncElement> CurveAnaly()
         {
             var modular = WinFrmUI.eModular.Analy;
@@ -29,7 +31,9 @@
             var multiSpeedCurvePage = new FuncElement("鏇茬嚎鍙橀��", dataDLL, $"{nameSpace}.MultiSpeedCurvePage", modular, Resources.MultiSpeed);
             var compareCurvePage = new FuncElement("鏇茬嚎瀵规瘮", dataDLL, $"{nameSpace}.CompareCurvePage", modular, Resources.Compare);
             var parallelCurvePage = new FuncElement("鏇茬嚎骞惰仈", dataDLL, $"{nameSpace}.ParallelCurvePage", modular, Resources.Parallel);
-            return new List<FuncElement>() { multiSpeedCurvePage, compareCurvePage, parallelCurvePage };
+            var dispatchPage = new FuncElement("浼樺寲璋冨害", dataDLL, $"{nameSpace}.DispatchAnalyPage", modular, Resources.Dispatch);
+            var scheduleAnalyPage = new FuncElement("浼樺寲璋冨害2", "IStation.WinFrmUI.Schedule.dll", $"IStation.WinFrmUI.Schedule.ScheduleAnalyPage", modular, Resources.Dispatch);
+            return new List<FuncElement>() { multiSpeedCurvePage, compareCurvePage, parallelCurvePage, dispatchPage, scheduleAnalyPage };
         }
 
         public static List<FuncElement> Monitor()
@@ -75,9 +79,10 @@
         {
             var basic = new FuncElement("鍩虹鏁版嵁", Basic(), Resources.Menu);
             var analy = new FuncElement("鏇茬嚎鍒嗘瀽", CurveAnaly(), Resources.Menu);
-            var monitor = new FuncElement("鐩戞祴鏁版嵁", Monitor(), Resources.Menu);
-            var monitor_analysis = new FuncElement("宸ュ喌鍒嗘瀽", WorkingConditionAnalysis(), Resources.Menu);
-            return new List<FuncElement>() { basic, analy, monitor, monitor_analysis };
+             return new List<FuncElement>() { basic, analy};
+            //var monitor = new FuncElement("鐩戞祴鏁版嵁", Monitor(), Resources.Menu);
+            //var monitor_analysis = new FuncElement("宸ュ喌鍒嗘瀽", WorkingConditionAnalysis(), Resources.Menu);
+            //return new List<FuncElement>() { basic, analy, monitor, monitor_analysis };
         }
 
     }
diff --git a/02-desktop/Desktop/IStation.Desktop.Ch2/IStation.Desktop.Ch2.csproj b/02-desktop/Desktop/IStation.Desktop.Ch2/IStation.Desktop.Ch2.csproj
index ccc7c37..34edbfc 100644
--- a/02-desktop/Desktop/IStation.Desktop.Ch2/IStation.Desktop.Ch2.csproj
+++ b/02-desktop/Desktop/IStation.Desktop.Ch2/IStation.Desktop.Ch2.csproj
@@ -43,6 +43,7 @@
     <ProjectReference Include="..\..\WinFrmUI\IStation.WinFrmUI.Core\IStation.WinFrmUI.Core.csproj" />
     <ProjectReference Include="..\..\WinFrmUI\IStation.WinFrmUI.Hydro\IStation.WinFrmUI.Hydro.csproj" />
     <ProjectReference Include="..\..\WinFrmUI\IStation.WinFrmUI.Monitor\IStation.WinFrmUI.Monitor.csproj" />
+    <ProjectReference Include="..\..\WinFrmUI\IStation.WinFrmUI.Schedule\IStation.WinFrmUI.Schedule.csproj" />
   </ItemGroup>
   <ItemGroup>
     <Content Include="App.ico" />
diff --git a/02-desktop/Desktop/IStation.Desktop.Ch2/IStation.Desktop.Ch2.csproj.bak b/02-desktop/Desktop/IStation.Desktop.Ch2/IStation.Desktop.Ch2.csproj.bak
deleted file mode 100644
index 8211d87..0000000
--- a/02-desktop/Desktop/IStation.Desktop.Ch2/IStation.Desktop.Ch2.csproj.bak
+++ /dev/null
@@ -1,176 +0,0 @@
-锘�<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
-  <PropertyGroup>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProjectGuid>{97F1B9B2-7E24-47A3-B0F5-494C25F31F5F}</ProjectGuid>
-    <OutputType>WinExe</OutputType>
-    <RootNamespace>IStation.Desktop.Ch2</RootNamespace>
-    <AssemblyName>IStation.Desktop.Ch2</AssemblyName>
-    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
-    <FileAlignment>512</FileAlignment>
-    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
-    <Deterministic>true</Deterministic>
-    <PublishUrl>publish\</PublishUrl>
-    <Install>true</Install>
-    <InstallFrom>Disk</InstallFrom>
-    <UpdateEnabled>false</UpdateEnabled>
-    <UpdateMode>Foreground</UpdateMode>
-    <UpdateInterval>7</UpdateInterval>
-    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
-    <UpdatePeriodically>false</UpdatePeriodically>
-    <UpdateRequired>false</UpdateRequired>
-    <MapFileExtensions>true</MapFileExtensions>
-    <ApplicationRevision>0</ApplicationRevision>
-    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
-    <IsWebBootstrapper>false</IsWebBootstrapper>
-    <UseApplicationTrust>false</UseApplicationTrust>
-    <BootstrapperEnabled>true</BootstrapperEnabled>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <PlatformTarget>AnyCPU</PlatformTarget>
-    <DebugSymbols>true</DebugSymbols>
-    <DebugType>full</DebugType>
-    <Optimize>false</Optimize>
-    <OutputPath>bin\Debug\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <PlatformTarget>AnyCPU</PlatformTarget>
-    <DebugType>pdbonly</DebugType>
-    <Optimize>true</Optimize>
-    <OutputPath>bin\Release\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-  </PropertyGroup>
-  <PropertyGroup>
-    <ApplicationManifest>app.manifest</ApplicationManifest>
-  </PropertyGroup>
-  <PropertyGroup>
-    <ApplicationIcon>App.ico</ApplicationIcon>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="DevExpress.Data.Desktop.v22.2, Version=22.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
-    <Reference Include="DevExpress.Data.v22.2, Version=22.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
-    <Reference Include="DevExpress.Drawing.v22.2, Version=22.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
-    <Reference Include="DevExpress.Printing.v22.2.Core, Version=22.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
-    <Reference Include="DevExpress.Utils.v22.2, Version=22.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
-    <Reference Include="DevExpress.XtraBars.v22.2, Version=22.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
-    <Reference Include="DevExpress.XtraEditors.v22.2, Version=22.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
-    <Reference Include="DevExpress.XtraLayout.v22.2, Version=22.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
-    <Reference Include="System" />
-    <Reference Include="System.Core" />
-    <Reference Include="System.Xml.Linq" />
-    <Reference Include="System.Data.DataSetExtensions" />
-    <Reference Include="Microsoft.CSharp" />
-    <Reference Include="System.Data" />
-    <Reference Include="System.Deployment" />
-    <Reference Include="System.Drawing" />
-    <Reference Include="System.Net.Http" />
-    <Reference Include="System.Windows.Forms" />
-    <Reference Include="System.Xml" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="Func\FuncCreater.cs" />
-    <Compile Include="Func\FuncElement.cs" />
-    <Compile Include="frmMain.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="frmMain.Designer.cs">
-      <DependentUpon>frmMain.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Program.cs" />
-    <Compile Include="Properties\AssemblyInfo.cs" />
-    <EmbeddedResource Include="frmMain.resx">
-      <DependentUpon>frmMain.cs</DependentUpon>
-    </EmbeddedResource>
-    <EmbeddedResource Include="Properties\Resources.resx">
-      <Generator>ResXFileCodeGenerator</Generator>
-      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <Compile Include="Properties\Resources.Designer.cs">
-      <AutoGen>True</AutoGen>
-      <DependentUpon>Resources.resx</DependentUpon>
-      <DesignTime>True</DesignTime>
-    </Compile>
-    <None Include="app.config" />
-    <None Include="app.manifest" />
-    <None Include="Properties\Settings.settings">
-      <Generator>SettingsSingleFileGenerator</Generator>
-      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
-    </None>
-    <Compile Include="Properties\Settings.Designer.cs">
-      <AutoGen>True</AutoGen>
-      <DependentUpon>Settings.settings</DependentUpon>
-      <DesignTimeSharedInput>True</DesignTimeSharedInput>
-    </Compile>
-    <None Include="test.json" />
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\BLL\IStation.BLL.Basic\IStation.BLL.Basic.csproj">
-      <Project>{3b7b39da-835b-4975-bd88-977e1870fe32}</Project>
-      <Name>IStation.BLL.Basic</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\Component\IStation.SnowflakeId\IStation.SnowflakeId.csproj">
-      <Project>{7cb8c9a8-a6de-4742-b7c7-1f8bcc6c3eea}</Project>
-      <Name>IStation.SnowflakeId</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\Model\IStation.Model.Basic\IStation.Model.Basic.csproj">
-      <Project>{768DFBA7-383A-4780-BB29-D3F73997EE6B}</Project>
-      <Name>IStation.Model.Basic</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\Model\IStation.Model.Core\IStation.Model.Core.csproj">
-      <Project>{BA30A79A-7D4E-4063-A2A3-D7C30DD4A752}</Project>
-      <Name>IStation.Model.Core</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\Settings\IStation.Settings\IStation.Settings.csproj">
-      <Project>{37082337-850e-4dc9-9df5-da0218da6db8}</Project>
-      <Name>IStation.Settings</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\Utils\IStation.Untity\IStation.Untity.csproj">
-      <Project>{a8c1bb64-0119-48b3-aa8e-0bd346f9467d}</Project>
-      <Name>IStation.Untity</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\WinFrmUI\IStation.WinFrmUI.Analy\IStation.WinFrmUI.Analy.csproj">
-      <Project>{c79733bb-7fa3-43a8-aacf-097ea697973c}</Project>
-      <Name>IStation.WinFrmUI.Analy</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\WinFrmUI\IStation.WinFrmUI.Basic\IStation.WinFrmUI.Basic.csproj">
-      <Project>{3810ADB6-0D50-4E85-AA92-DF639B48871A}</Project>
-      <Name>IStation.WinFrmUI.Basic</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\WinFrmUI\IStation.WinFrmUI.Core\IStation.WinFrmUI.Core.csproj">
-      <Project>{ae19abb8-6f6a-4598-b3eb-5ef40d11dc46}</Project>
-      <Name>IStation.WinFrmUI.Core</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\WinFrmUI\IStation.WinFrmUI.Hydro\IStation.WinFrmUI.Hydro.csproj">
-      <Project>{e7d9741f-c312-473c-a84b-f905eba7eb0c}</Project>
-      <Name>IStation.WinFrmUI.Hydro</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\WinFrmUI\IStation.WinFrmUI.Monitor\IStation.WinFrmUI.Monitor.csproj">
-      <Project>{e36da053-8441-442d-b482-c2c4e021fb49}</Project>
-      <Name>IStation.WinFrmUI.Monitor</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <Content Include="App.ico" />
-  </ItemGroup>
-  <ItemGroup>
-    <BootstrapperPackage Include=".NETFramework,Version=v4.6.2">
-      <Visible>False</Visible>
-      <ProductName>Microsoft .NET Framework 4.6.2 %28x86 鍜� x64%29</ProductName>
-      <Install>true</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 3.5 SP1</ProductName>
-      <Install>false</Install>
-    </BootstrapperPackage>
-  </ItemGroup>
-  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
-</Project>
\ No newline at end of file
diff --git a/02-desktop/Desktop/IStation.Desktop.Ch2/frmMain.resx.bak b/02-desktop/Desktop/IStation.Desktop.Ch2/frmMain.resx.bak
deleted file mode 100644
index 6e75ecf..0000000
--- a/02-desktop/Desktop/IStation.Desktop.Ch2/frmMain.resx.bak
+++ /dev/null
@@ -1,837 +0,0 @@
-锘�<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 2.0
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used for serialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <metadata name="documentManager1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </metadata>
-  <metadata name="barManager1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>259, 17</value>
-  </metadata>
-  <metadata name="dockManager1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>442, 17</value>
-  </metadata>
-  <assembly alias="DevExpress.Data.v22.2" name="DevExpress.Data.v22.2, Version=22.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
-  <data name="barBtnPorject.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v22.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIyLjIsIFZlcnNpb249MjIuMi40
-        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
-        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAFsDAAAC77u/
-        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
-        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
-        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
-        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
-        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5H
-        cmVlbntmaWxsOiMwMzlDMjM7fQoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQoJLkJsYWNre2ZpbGw6Izcy
-        NzI3Mjt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5SZWR7ZmlsbDojRDExQzFDO30KCS5zdDB7b3Bh
-        Y2l0eTowLjc1O30KPC9zdHlsZT4NCiAgPGcgaWQ9IkJyaWVmY2FzZSI+DQogICAgPHJlY3QgeD0iMTQi
-        IHk9IjE0IiB3aWR0aD0iNCIgaGVpZ2h0PSI0IiBjbGFzcz0iQmxhY2siIC8+DQogICAgPHBhdGggZD0i
-        TTIwLDE5YzAsMC41LTAuNSwxLTEsMWgtNmMtMC41LDAtMS0wLjUtMS0xdi0zSDJ2MTFjMCwwLjUsMC41
-        LDEsMSwxaDI2YzAuNSwwLDEtMC41LDEtMVYxNkgyMFYxOXoiIGNsYXNzPSJCbGFjayIgLz4NCiAgICA8
-        cGF0aCBkPSJNMjksOGgtN1Y1YzAtMC41LTAuNS0xLTEtMUgxMWMtMC41LDAtMSwwLjUtMSwxdjNIM0My
-        LjUsOCwyLDguNSwyLDl2NWgxMHYtMWMwLTAuNSwwLjUtMSwxLTFoNiAgIGMwLjUsMCwxLDAuNSwxLDF2
-        MWgxMFY5QzMwLDguNSwyOS41LDgsMjksOHogTTIwLDhoLThWNmg4Vjh6IiBjbGFzcz0iQmxhY2siIC8+
-        DQogIDwvZz4NCjwvc3ZnPgs=
-</value>
-  </data>
-  <data name="barBtnProjectName.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v22.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIyLjIsIFZlcnNpb249MjIuMi40
-        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
-        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAPACAAAC77u/
-        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
-        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
-        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
-        Y2U9InByZXNlcnZlIiBpZD0iRGVmaW5lX05hbWUiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcg
-        MCAwIDMyIDMyIj4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5CbGFja3tmaWxsOiM3MjcyNzI7
-        fQoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQo8L3N0eWxlPg0KICA8cGF0aCBkPSJNMjIsMTZoLTh2LTJo
-        OFYxNnogTTE0LDIwaDh2LTJoLThWMjB6IE0yNy42LDE1LjRMMjcsMTQuOGwtMC42LDAuNkwyNiwxNS44
-        VjI0SDhsLTYtNnYtMmw2LTZoMTIuMmwwLjQtMC40ICBMMjEuMiw5bC0wLjYtMC42TDIwLjIsOEg3bC03
-        LDd2NGw3LDdsMjAsMGMwLjYsMCwxLTAuNCwxLTF2LTkuMkwyNy42LDE1LjR6IE02LDE3YzAsMS4xLDAu
-        OSwyLDIsMmMxLjEsMCwyLTAuOSwyLTJzLTAuOS0yLTItMiAgQzYuOSwxNSw2LDE1LjksNiwxN3oiIGNs
-        YXNzPSJCbGFjayIgLz4NCiAgPHBvbHlnb24gcG9pbnRzPSIyNyw2IDI5LDQgMjksNyAzMiw3IDMwLDkg
-        MzIsMTEgMjksMTEgMjksMTQgMjcsMTIgMjUsMTQgMjUsMTEgMjIsMTEgMjQsOSAyMiw3IDI1LDcgMjUs
-        NCAiIGNsYXNzPSJZZWxsb3ciIC8+DQo8L3N2Zz4L
-</value>
-  </data>
-  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-  <data name="tabbedView1.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        iVBORw0KGgoAAAANSUhEUgAAAlgAAAC1CAYAAACDI4GpAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL
-        DAAACwwBP0AiyAAAAAd0SU1FB+YEEgEdLM8vASMAAJoxSURBVHhe7Z0HnBtFlv9hb/dud+82/Y/b2+VY
-        FoeRupU1Yy+7gEdSS5pxxgmWYBtsnDA4ATbGDDbJozhZM57xOOecE8nALjknk2GXnMMSjcGf/r9XXa1p
-        SS2NWmpNcv0+n/cZe6a7qrq6uurbr15XncTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTE
-        xMTE1HmqONkmVJ1q98RMxd4Gi8Vb3cs5tOVn9I9MTExMTExMTEzZ6PTyun93ehtGObwNqx3e+iNgn4OJ
-        Tl+D6BBqv4V//9Ppb9hX7GuYZSprPI2exsTExMTExMTEpCaHv3Gi09f4fEl5q9hv4DKxuGyJ6PTHJLjy
-        IWTFxGJ/kyj9fTn8rfFTh68pahZqf0uTYGJiYmJiYmJiQhX76z0AS3+ToKpZdHjrsjI4R+w3aAWAV+O7
-        Tm/DlU7n5B/TJJmYmJiYmJiYTkzZvNGiYl9sDXqqSsqXqkJUNoZeLYQzhy/2KNggmjwTExMTExMT04mj
-        Xv3rfmH3Nixy+hq+IFN9OAWoAk5araS8RSwubxad/qbNdk+1iWbHxMTExMTExNSz5fTXX+z0N77UbxCJ
-        oVIFpbzMV0+8WU5f49dOb2OlZUjg1zRrJiYmJiYmJqaeJbu//iyHv/GOkoGtmuKscjUMiMf4LIev4R92
-        X/0kWgwmJiYmJiYmpu4vhydyutPfuBS9Vfj1Hy65oAZEhTIS30U8WrG/2/z1HlosJiYmJiYmJqbupzPP
-        jP7U4Ytd6/Q1fKJnnFWuhkH0GAwPZVrjdMX60GIyMTExMTExMXUPOYTYaKev8dmCxVnlaAh5Euw1fu7w
-        NdzAuWL/SYvMxMTExMTExNQ1VeypKwag2ke8RR0QZ5WrIfRJ8Bd7ye6tu4gWn4mJiYmJiYmp68g5oPp3
-        Dl+sDsDlGAax6xVnhau4Y3r4VaD8E2Oq1I7NxRACSXn9jXc4PHV/oZfDxMTExMTExNR54riFP3H4GmYC
-        CL1HPEI6xVlJU3kYmN7wqUOoX2vz1s2xC3XT7d66GodQ9yL5EhHjqVTO1W71BLLgGo4DILYU+2r/QC+P
-        iYmJiYmJialj5RQahzp9jY8hWBUCdgDcljg8sdNpdnGdNmDhf+C2OA5f7B0J6mIq6Wg3OT7L4Wv8qNgb
-        uwY3naZZMjExMTExMTEVVhZvlcXhj20rKWshK6erwUouRqbrygGufI23FfuazqTZpRXvCv8vQFEtlOUY
-        LsOg37RkkxSf5Ys94xDqRtPsmJiYmJiYmJj0V1Fp9L8BaEJOf+wbad8/vYCGBpz7Gl90eBsupNllLRJY
-        720ggfV6Ah+mhWli0D7mQbNjYmJiYmJiYtJFJzuF2BSHL/Ymroyu/5Rc7F8Of6zC8JfQf9H8cpLd3zDC
-        4W98GtPUd8oSYNIf+w4AsBa9ZjQ7JiYmJiYmJqbcBIDhBWi5X++v9+RFPwHWVjo9db1pdnkL47Mcvsar
-        ocwf6rm4KUIletkw7gv+fcVJAxb9G82SiYmJiYmJiSk72bwNRU5/43qyzQzAkBp05GLStjWtGEh+j8NX
-        V0qz010mX+0fHP5YM04/kvxUypKLIRRK06ONj9m99YNpdkxMTExMTExM6eX0Bn/p9MduBDD5Qpq+0289
-        Kxo4/rrT13Apza7gcpY3/NlZFru9ZHCrWDywGa4HyoOmUkYthvFZxeWYXmwrBv3T7JiYmJiYmJiYEuXw
-        NowHYHiVgJBe29sAoEken9jXdl9sseXswK9pdh0qR3nsAufAxhf6DV0hOsubRIcfy6YwtbK3a9K1ATR+
-        A9cX5MuqfkOzY2JiYmJiYjrRZRXqzwGgOkwW79RxexsSZ4VeHn9so8lXw9HsOk2ca+F/OgY1VTgHNX3W
-        bxiCVgzKVk+tTrTnCFtyfBbU4esOX8NlNDsmJiYmJiamE1F2V80fnb6mVhKnVK5fnJIT46wGLRMd5bGH
-        bOUNZTS7LiNnWVUfx6Alq4uHtIj9hi4D0GoQHWUAWWhK2FK5tkyG8WWSR6vx705frUCzY2JiYmJiYjoR
-        5By66GcOX+xapy/2ia5f2mGc1RBIryz2lqMsNu2kioqTaZZdUvbBjW7n4Ka/9Ru+UiwZshSAEOqhnIIW
-        gS24LnkqUeV60xnx3OEXl76GtfixAM2OiYmJiYmJqafK6a0/Hwb+F/SOsyoZvAzAqvGoY2AsavNH/odm
-        1y3kHNR8afGQ5tf6n7taLB68RHQORNBSwFYOXi15jS+A2H85vQ2L+vdf9AuaHVMHyeCJ/oX3RQWjEHLn
-        YgZPxGPyVHss/sjPaZInlExCsL/J3zCecwc1m6ms4VLeF+pLk2Ji6rHq6wnYTN7qW4zu0E3ZGuervpnz
-        BCbTJDpNI0du/hE34NbfGXyh32drfUqD/3ei9olpZRfq+zu8sYOSd0WnOCsAjuJBLWLJoKUYOL4DYMRG
-        s+t2sp1b8yvn0JZbi4c2f9n/3FWicxDAJ4AWmT5MmEKUrlu1PlQMIZbC7Et2b+wimh1TBwgG+mVWaJ+8
-        twqsOiezDFwiGjzBCprkCaMBAxb9G9Tfq1Z4ts1lDZrMUt4EP+tFozfQ7te1MNhchION0RNYlLW5Aot4
-        X/Vizh1qd5mXIlfUyHvCATxHNa0MZvbV3GTyBTs9dlSrcNB0Opt/jDMVuHgzf+ai3+BLb5Fw66lmT7i3
-        0Rst4rwBBwzwxbwnMADqxsW5A4M5b2iIyVt7YZErXE6T6jSZhPAYU1mshvOENZmprL7G4Al4aDIdIk4I
-        XWYbvDzlOchk1kGtotETfJ4m0WniPZHTOU/wfV6I/IvzhD7PxqCNfMm5gpNoEie2HECcDl9jg9MX+15a
-        DwogQQUEtJgdDL/EI9OB5UseB3gYSrPr9nIObuScQ5s3lQxfJvYbvgJAK0ZAS4ItGbLANE4bkn0Wsf79
-        jXfY3fVn0ex6mLrWlDB0HCboOI7zQlSEzjcnM/lqRRjI3zrR3th4b9hrgjYu1UNIk+EAAj9306TSqg8M
-        9nhvEGKTB6BMJgEc5hFtd/sq3HnB6Al9Zx3UnJJOe2aD/s3oDuygSekugyvwR3NZ3V+K3OGzDKXBgQRy
-        XMG/wu8vhvqbzAnBKwzu4Fy4BxXwb4DQUBR+X8u5w8uM7uAqsO0wSO8AEL4T7C74+4PQ5h8BaH0W/v8C
-        /P0f8PNt+P9HkMa/4P9fwb+PwnHHyH0VwvASIb18mODFEQ2BGo55nBYxLoO38v8ZvOHhpIwazFxWO8RS
-        Gvw/mkzWgmtcbRu6Cu5DTJPZhq7s8Bci3hMaa4YxQW7/2Rj2K3DvHqRJdJqKvIFe0Ea+N/lqRHwWszFL
-        eSOUPXAlTeLElNM5+cfFvoZZAD/vSetPASSoDPxaDMHKQeKsADwGNr5fPLBpFr4p0Sx7lJyDm8uLhy19
-        uP/I1WLJMAAjClrS9GEbaGkNhkfIQq+W0x9b6oC3B5pdjxB02uPgDfJR7OjzMejocZC4iiabl6Dz2IWD
-        pVonl61hx827gxNpkrqqyBMaZPbXPQTX+5BaXWRrvK/mYQDB5TTZvAXl2ZBrveFADWUaRpNKKxjwl2Ld
-        qqWRyczlMYCA4FKaTLuCsiwyw6CgllYmAzgHCIl8ZzwnWpA4Sshjq6V8iWhCwIEBDgddGXRwwJZAD8Gh
-        kf5EU0AgHgMmn0POJ4ZpwYBJvLAIUGDxATISN7g2AllKiCb3zh26hxYxrt5nLz4FnqUvsQxt+bRv6EFG
-        EKTJZC1oy405tQ2oFwCXq2kyHaJuDVj+yBkA5V9j21Arp5qRa3UHptMkTjwBTA1z+hqfQLDSbU8+Oc6q
-        vOkHsJhNqDqVZtdzVVFxcvGw5mkAWm/1H7lGLB7SDICFoBWTpg7ptKEdOiVN04YYnyVNG34ENhe396E5
-        dmsZXKGSeKef1NFqMfRQwAP89unldf9Ok85ZJI4K0lQOIlqNnO8OPlUID53RHTiAXgPl9ediNng2YWBc
-        TJPNS4azQr+H6/5SS6crGw7s6Dlpr03jVBXviXyrNQ8KCd/yrso+NKl2hTEmRk/4C96r/XoQbuBnLU1K
-        VxmF0DazHyFWhpzc26helg6wUACqUfReSMcqy5zeyP0VwkfRU0KTyUoMsDpGDLA0yOGptwFY7SwubyEr
-        jasN7loNvVbFAyG9wa0AFY37HQMb+9HsThjZy+tOKR7WEgXQ+rb/iFWiczBAK502jMdnQcek1ZslbbuD
-        3sXGZ+D80TS7bi148P5mhrpQezC1GOnoSwO6TD1znsAjmJ5aPtkanl/kqRxEk9RFOEXGeSJHiSdBJc9s
-        jXgjPOGjCC006bwEMDknl8ENjZznDt5Mk0orAMvVuQ2g6L0KtNBkshack9OAjd4fqNtPikqj/02T0k2Q
-        /hatA3OhLRNgmUqDHLTX76X2pn6+mqHHMZs2oVS3AiwhcDEDrB6sEnj4nf7GCAzU35bgquk6xFmhOeHt
-        rQTjrAY2Pevwx3oEAOQj2+CY3Tm8ZWe/c1eI/YZDvZBpw1jStCGdStVgxWUIxEtFp79hn9PVUEKz65bi
-        XKHLcukYk40ESbuD+2iyeQkAaxx2vGr5ZGvYqcDAcxtNUhdBx3arRfKQ5GVYVzCAHaDJ5qeKipOh438G
-        BwC1vDKaNO10zOitzDilZhIiPCdENQ/UZKrLE/noDG/wlzSprEWmuITI51o9ZmhkSrIAgzak3a0AC4Xt
-        jLQ3lXPTmeTVDLz5O+ein9Fk2lV3AixoV3/NEbDup0l0mhhgtSOAqqkAV29KcVYw4KsM4FoNp7BKBkN6
-        5U0fOwc2zjvzzOhPaXZMIMewJcOLh7U8idOGJUOXio5BcmyW7M0C0+jNkrfdcXhj3zv8jfXO8urf0ey6
-        lXArJOigP5Le/NUf0GwMB1946H8wlrb/JVp7OnV09KfQmb3Be2tU88rKpPIc5wbc6qTJ5iXOFftPKNO7
-        GCejmp8Gkzr34EiadF7ihdA5OCBKUzzq+aUzOsgcpEmlFecKrM1l8KTTj+9gTBUnhBdC/d2oavgZvBCa
-        B8fO4FzBWWgGT2Aa/P+VXNolOccdfB+sDv5fm7XB8dDmGvp6qlS/roZjuh1gGdyB4bmUmbzguIJ/pcm0
-        q84ELPwwDNK4A9rYPfDz7kwGz91dkO/zWl8WyMuIJ4hf7h1WSzfZ5LKg15sWUxcxwEojm6+mDODqQRyU
-        yaKWqoO2VquXgrDhrdpR3rjMXl7zR5pdwXXm6M0/tVy0vpf14pWCbeyaceaLV11nuXh1lWXcqlbz2NWb
-        zGNX7TSPW73DMnbVNrCV8O9689g1N1rGr51iuWTlYMul6yzOyVs0v9nmKo5b+BPn0JbZxcOWvo+B8M4h
-        cA/kacOcIQvhNr7tzrsAWzPwc3maZbcRdAQNZFpA5eHUYqSD1SlwG78syrdMWB4YpFfRJPMSdlC5DCDJ
-        RmDIHXxNj3g1FF5frt4+7HiNQmAMTUpV0JmbOG/VMc3eKzIABD8Ae1v+ilCrSYOaevqZLUjyV0uzPbMO
-        XoZpXEAvP0Hw++7nwYJ+D9rIqxKEq6ehZtTLepgm0646E7D40lBffPHBtLA+2rOcX5KgPaqlp2ZyWfoI
-        +rzgyTp9SODXUJavtAEW1LErcAlNomcJGjbn8DVsRKjCaSW1QToXiy8jUBY7bPPVnk2zK5icF6/9HYDU
-        UNvY1bdaxq0+YBm75nXr2DXf2i7dJNov2yY6Ju0QHZN3ivbJO0T7pO2JBr9zTMG/0b9ftlW0jF9z3Dx+
-        7ftg91suWRczX7JxrG3cxoKvom4bvORU5/ClseKhLd/3O3elYv0sACwCWtqnDNHk+KxiX9OjDl9M19if
-        QovzVJtwCij3AU0yyYsV+ba3hoDmdCKBzkJugc6ykXOF8Nems4N/oMnmpNPLZ/w7elO0DlJqJkFjcD5N
-        Oi9hnBEMbJ/l5OXxwSDjDr6Fay/R5FQFYLkut4ETznEHFxo9ob0mfw7Tl51kOCga3eFR9PITBH/vdoCF
-        gntwPQ3+z97Isxw93tcVttNkMqozAYusFeYOHdXslSqgyWXBRU2xjBgPx/trIlBP4dwtGDIKoRa4n/DC
-        k73HWuofgncYXcGAerrZG++tiRhcwVmk4jtTttJFv3L4Gm92+hu/IFNJPhi8VQZmrQbpSR6TssaX7P7G
-        i2l2BZHjwvV9rRevnQkwdTvYZ/YJmwlIIVDZJmwSrZesFy2XrE20SyWzXroubhaFxX8/YYNomwhwNhng
-        jMDXDvz9UeulGx61XLo+aBq3/mxcgI8WRXcVD27+k3No80GErJJhcH8IZMneLPW6z8bwYwX8aAEga6vN
-        X2um2XV5wcOb9/IIaNjJYkA0TTYvAdTktCyA0nBggfJU0iRzEq7gnG850CgIfd5Lp50TOHc4Z6+aFKcU
-        CtKkVAWdMq5LllPsFYDtpzj9DGncxQArW8Ov+AjYSAb12Gby0hB0eQg0KKu0Dlb4MVpEVeFK3pC2Jq8H
-        GnmWPcEYTSajYPBlgKWwZMDiXaFz0TuKdZSX5dT+gqTdqKan0ciCq+7Qq6TiO0t2b91FAEKv9hu0AtdP
-        Uh2ItVrbVi6NnzvKYgtxxV+ana6yXNj0a9u4tRNs49bcYR239lvHZdtF+8StAD8AU+MBnsavicOUEqCs
-        E9DWt9nENrMoTPn7hOPx/IkbJeCaupvAl2XChqdtl25YaJm42UCLp7sAss4vHtp8pP+I1WRZh4TtdnKY
-        MiQGME03kf7W4Y8FusOil/nE8iiNDBDeqh9w5WmadM4qEsJWSO94Ph0nDkwAau/nEmiN4lwL/xPSeUMX
-        7xV0UFCWKpp03uJcwUelxUXV80trZBCP/IAARZNSVc7eK1zYkC5BAYPngz0IsHZbBzYnAA4aDnrEABYk
-        kwckfGHR+Dy5Q9/Dffka6u8raCsfo8H/34bfvwV1+RL8/gj87jGA4wfg3/fw/tqD6FmgRUwrOGe91hco
-        BDvI52P+zKrf0GTSigFWoslliQOWJzQI20rycd3NSLA/tD9S8R0tXEsGQGiVFGel0/Y2YMrNiB2+2oLs
-        F2a5aHkv68XrA9axa952TKRQdQnAEwJVHKokoJJgigIVgaUNovWyJJuEtjGDJR2PhunI4AX/JrA1bTf8
-        e+M31gkbNpsnrnPT4uoqnCYpHrJkPoDWJ/2HrxKdAxvjkKV1KQelYXxW/0Er8eeTdk91xsGsK8jgDtyl
-        xxs66TTdAV2+4ONcgYP5lol0/ELwCpqkJhldgev1+HKQTld+03vALafRpPMS5wueKcWS5Bjc7g7eSZNS
-        FcIXlPmY1mljHJShTJ/1+rPkpYMBugcBVrAGBpgXYTB/HIDiITgeA57vANsB/94CdboC/tYCA1AVek3h
-        34vh319mM/DTpVK29BEW80UDImfgqvH4JSVOA+ML2mkDVv4Hie/McUN+KG9pLi8J5Nlxhy6nyaQVA6xE
-        Y4Cls/AhALi6HQdUvZZdQKiSPCGx+4r99QXZr4kf09rHOnZtk23cui9w+s926UbRMk4BVfJ0XzqgUoCU
-        bTL8BJN/xm3KJtEGhj8Tfk+NHK8GXpAX8XpdtglAa5dom7RFtE3ceDuUw0uLr6vwI4Hiwc3L0JPVb+iy
-        tpisPCALja4G/6HTVd2ll3QwuiIu0glrmN9XtzAZxA2u0Lk06ZxlEIID8+2YaKfwotYPEHBqBTrKf0nQ
-        oJ52tkam5NyBRpp03oLrac71IwAc1HhXIGN4QV7eK1cgQJPpUYB10siRP8Kgcfq/LCQilL2fTfuRQCNU
-        T08siABkntB6L/DZAXB8Eq8lkxhgJRoDLJ3l8NbukOBKfZDVYvKXacX+xn84hMaCbPkBYPUb69h1lQSs
-        LtshxVONWx0HqxSoUgCVjcKUbAScZJuKtjlLo8crzlemi/nEgYuWwTF1l2ifvBWnEHfaLlmXVQCmVhUP
-        aTrHObj5cL9hK8jm2PlDVq30gYMv9k6xrzavgOtCy+gJ3KF13Rw1Ix2zJ/Rq/tOjFSfDYP80TS9nI14b
-        ITyCJpqVjK7gxlwGjWSTAvXDXyKw0aTzkmVI7ktrEK+XO/hephAD9F7l8tGD7L0yC4t/S5PqWYClUeQj
-        BE/ww2wBC34uoacWROiJ0t6ecX/PGoRmF01GVQywEo0Blo6yeWvmYLyV+uCqweTYHX/j1w5vLIBBojQL
-        XWW5eNXF1nHrX3emAysCV8lgRWFKCVRKmJommYXYFtFyefsmHy+fmwBeCuAiecoeLlKejaLj8t2i7bJN
-        R20TNoQMw5YVJB7NMWjJuOKBja/2G7pSdMKbueo9y9pqCTTbhdqMUzOdLc4b/jP5wkyHzopsMqrwZuQq
-        GKQmkd3vIT3sxHMxPB/K9Hy2yyPwnkqpQ8zbmweDCNaDJ5AxoFyLoLOegNeklld7Rr1eGbeS0SP2ShYD
-        rK4DWBhLBffjE61gTiFoI01GVQywEo0Blk4qKWs8zeFt+NKZ5x6C5OuzsmYMjN5SqHgd03ktfwCw2uyY
-        sE3E5RUSwQos2WOFQIOeJDWoonAkw5JZtuloW1PtCpXfEWs7Nw5fCcBFQUuGLQVo2SZtFp3T9yJoPWce
-        v9ZPL1NXOb3BXzrLm24E+wJXyc/va1AEaEjDU3shTb5LCgaFrbkO4EqTvoaq+p7zRItp0jmJLPLpCi3i
-        PFW3QLo5WgQsfKvBW/n/aLJp1Wtg3S8AMF/P12uGRuOkPswm32wFHdz9OW1vBLCIn95n+gCBeK9yWfcK
-        B20h/GkvhfcKxQCr6wAWCkBEMwhJXx+GvzYNiKaNH+x0wMKlC6Q4x/Ytnw951NJTMbksDLDylMNbW52P
-        90qOs3L4Y484hPqBNFndZbp41WjbuHXv4XQgibEicKX4GjAJrBK8VSpQJcEUhSSEJ6VduY2Yif7M9O+U
-        c+U0M8BWQtwWlNc+dQf8f5tombgxeNJJIwuytAN+XOAsb1znHJjfemYlZS2i3VvzXFdekBQ6KwMnROGN
-        EDtW9QctWzP563HAeqw7LcBqdAVa0Rujdj1ajaTjDs6hSecthCNyX7AjV8kvkyGUGV3Bv9OkVGV0Bzbk
-        NFCS+xy4iiYTl8EdfME6uBUGUnXPYiYzoSfVE0zJq33Dz9JrVdNsz6SFRqOqC41qVVcELK4U2o8XIFsj
-        QGPdwLVU0GRS1JmAhRuJY1rYXhBsMhp56cvV0yVthq2abpLJZZHXEWOAlYMs/jU/t3tr3y0u0+69InFW
-        uDClv/HtYn/DdAygpMnqLstFa0L2SzereK3WiRYVsIp7rNJBlRKIKDCZZqBtF00zd4imWTup7SI/+Vk7
-        RB5+z8/c3mZ4LJj0k6aRDF1JsEVAS4YtJWhRb5Zj+j64hk2H+YuWnU4vXXc5yuu9Dn/j/biHZG4r8tfD
-        eS2iQ6j10SS7pDhXZcSiJ2S4Km+lSXdpGV2LR5OOMAeASTaSDgAGN0ZLYHRmQXp1uQxkaHgewPMEmlSK
-        OCHk5IWqHzQPQKSuwj/AoB02esJXKuPuioTwCJO/Zgp0ypoNrnVXLl5EsjSHJ9SqlmZ7hmXFr/ho8fMS
-        8YRqASyAFHpqQQVAc7fWwZ58/JJhB4LOBCz8ep9zBc/E8AauNLMVCcH+vCd8o9Z2hcBkdIeeJfmUVqqm
-        nWC0LPKzwLvDw6UXjcSdAzQbxpKqlC+zyetgqaSn0aR114KvkIovtHD7GzJYavxqkGwU7Gs86vA1Vtl0
-        WnRQTTSQfZ/zsp2iFb1V1GuFyy8QrxWCFX4RSAPXCbQowYqCTRx0CFBtpUC1QzTP3iOarzkoWq69g5h5
-        3m2i6ZoDIj9nt8gBVKHxswGyrt5P/mbG4+bfCT9vTzguGcAIqFHoigMXLUOKVwvKa5sMRr1Zjul74Xo2
-        v2Udv2oArYaCqLisYTJA8hvS2mTa7j/GYjm8NQX9YihfkT0KPaF3c/m0O9mkt77qH/jSxefQ5LukyFeD
-        nshHelwzvu2SQcxVOYQmn7cwMB06t6y+Sks26Zzgh5nWA4O0d+QKb2gY3wWDl2g4K/R7mmReQo+Y5hXI
-        wYjXVAgMpcnoIhwoEZi0GIIaDMpZfYwgbU0TWq6WTnum1TsM+V2Qy4cs0uCuvodmZwKWVpmE4GitoIJA
-        ZnAH7qNJaJbRG7Dw3prlBPxztuBSqOdN8Jx+r+UFENsfnHM/tEVcBV4l3ewN+vHlnDtwA72swsoh1N1A
-        YmpUBtF0Rj7Z98Xusnnr8l6IMZMso5b3so1d+zSZEhwLYIXTgsqvA5OnAwlYgVF4iYMV9SYR2Jm1U7RQ
-        oDJdtRfgaOe7xpk77uFmbW8Cm8fP2nk+N3uHn5ux/Uz4t70vGHf1zmLjjG1ufvaO4QBS04yzdwWMV+3e
-        zs3e+Tw3Z+e3JoAtM0AXAhcHMBYHMwpcCbBFyyKDllxW5dQhwqJj2k64pi3fmi9Zk/VmpbmopDT63w5f
-        fZ0UO5f9grIYb2cX6jp9Z/b2xHkC47ADzCtmgZq0IGb4tTOcuS342RGCDuR2aZDIZVoq0SRvUXAnTVoX
-        8ULgYul+qOeZyaTrCqSdgoK/FUNHrHnqSGk4JQI/P+Vd4f+lyeYluA8VuQzaCLZGT0DXOEfeHdwOg+yH
-        CKnZGsIVlOeH5PKpG3nGvlFLJ72FPoSXgQ+LXOFyWsysxbmDz2t9kZCmgYOHaBIJ6k6AxXtCY3MBLCjn
-        gzSJThPGckJ5tO9F6AleSpPoPrILtWRRUbVBVM1KylsxSHpPoeNRuNFLTdax6//pmLhNgquEpReo1+oy
-        BVglea2UYGUGwLFcfUC0zrtdBGj6ipu16w4AoWuLrtl91h9n7fwVzVK7KsSTi67efYZx7r4x3FV7mwC6
-        XuLnHRTN190l8lfvQ3hL8W5lBC3ZmzVFgiz71G1g2/F6J9McCya7r26WFJeVnSdLmlKufdM5tCXjPnBd
-        QdKyDbkN6slmgQ6Yd4c20KS7lPCtTK8pUeKxECJf4GKRNHldBIPi4ZymCOBtF8tk8Eb60aSSJOK00e3W
-        QS1kKgEHk2y8LsnWkwEL6v5enOrGetFiauVLawC3ammkN9zgOCYahNT15nA7JqMncinCRLJh3eDLhNZp
-        Mpw6BlPdAYABVseoyB85A+r/a22ABdfqDkynSXQfAWDtJBsuqwyiyYabAcMA/G422w7kI+4ChKt1bzsm
-        AHyMXZUIV6peq3RgtUO0zj0kmq/aJ5pm73yQn7NnhmHWTl0HDKVOn7H/3/lr9nn5a/YuNV6z9yPz9YdF
-        fu5BkZstgVaiV0sBWljm6YoYrfi0IVzjlK2i4/JdomXCupTgW70FwLSjX5ZtAfeTtAt1H6IHjJ7eZQUd
-        sQEe5m+wQ1d7eLVZWPLsuIMzaPJdQlCeMgQLLZ1WJkOQ5HTeEJVzLTbD4JbThtwEONyBh2hSKeJdVX0A
-        wp4k5g49Cff8caiTf2jNq4cD1p1kylclv84zXKMKB/7QMFrMuIpKF/03/P5r3NoHISbZpLau3VNLgM4T
-        rKHZxMUAq2N0QgGWQ6g/lO0XZcTTJdTeTE8tiEx/beWs49a9bdcAV/EAdhmurtwuWq45JJrm7AGw2r3D
-        NHt/QVaQzyRu9sHfcXP3zuOu2feaBFr7CWgRb1YSaCljtPA6SHxWEmTZAbKsE9YU1JPl9Nb8GcDpeDZe
-        LAmwaj/o523Q7dP9QopzV87Tz7sTFXlf9bGiLhKPZfIF/wDg8oE+cVfxAUP36V8AtkguAxgagVohNJUm
-        lSKns/nHJyVtrM67Q+drjdNhgNXRlh6wUEZ3aLEe2zwpTVp2JPRBciwfA6yO0QkGWHUHswMs/HJsCQyq
-        VQXZSw9VNGbJqdaL174mTQsq4CpdvBWCFRj5MpB6rSxX7SMxVqbZe/aYZ+8+iybdaep15YFfcHMPzOPn
-        7vsAQYu7aneqRwtjtJTeLIQs2ZtFIcs+FSBr2g6oi7WjadK6a8CAlf9h89a+JXkq1dpAm3U3wCJbhHiC
-        j+ixwjsadla8J/J2kXDrqTSHThFue2L0RO7HTj6Xt/lkI4AhRI9CWrquY+d0LvoZDPBv0cFNk1HP46da
-        1+EyucJjGGC1qTsCFl8a6ssJke80fxXajpHnRQhcRrMhYoDVMWKApWJOXwP+PG5z1ZrpqbrqzNHRn1ou
-        Xv2Qc+L2tHAV/0pQbUoQIMU67w70WL1kmr2rYBCSq3pftfM0bu7eFabrbhf5aw+JxjkAWdSjJYFWmzfL
-        pPBmxacMEbKmbUdv1reWiav/TJPVVRUVFSdDe3g2m6Ubuh1ggXDBPE6oOkoH0TwtSLwqvBC+T9vebvrK
-        4A4u08szh0ZWMvcErqHJ6yaDJ3hernBLBj13aDlNKmsxD1aiuiNgoaAe9kovEGrnZ7Ig8VZh/SebbfAy
-        nOb/B25ATbNhgNVBYoClYhJg1R63C0t4eqqusly4ch0uxZAQ0J4CV2AqcGWZs1c0X70fYGV3Q68r1/6C
-        JtklZbhqz7ncvAP/NFfcLRqv2iVyFLRkbxb54jBpylAJWY7pu0RcwsExcZkun5ErNXLk5h/ZhbojPRWw
-        UAgPuXw2n84IkLiDq2nyHSppCQAcEPL/QhKNesHuosnrKs4TOKh1QCAmBU1/B+XS7FHrCoDFC8EFuQza
-        BISEoK5fEHdXwOK8oSFSubW1c5wyh3Rvh+dzAYJuooUrAKhuUHpFez5gIbRnXqS3I9RnYPD/4B5oBiy4
-        j1NoEt1HmgHLE9N9CxzTBctnOybuEK1kdfbUmKtMniurFGv1QVf0WqUTN3v77/h5B/aYb7hH5K7ZIxrn
-        AGjJ04bK2Kw0kOW8EhcjXX8YPU40SV1EAMvfswELBQ/qnVJHmv+UGnb6lnJcziCwiCbfIeJKAyNIULsu
-        3jjsfKtF3hP9zOCq0f0jEN6X+zQPmR50B98yuMPDiblC56oZJ4RHwKAz6CTFM9ElAMsTuD5nwPJU6rIa
-        u6zuClgYXwdg8LLWGEO8VnjWb6fJtKueDlj4LEF9/ANezGZqNc5bPdvgCUz7Y+miX+G6ZRi/lovhOnhF
-        QtiaG2CFruJcC/9TLV2thunQqiysOhuwTBeu6m8dt/6YbTzdsFmGK1yKIQ1ckSm0K7ZJyy7M2fOEcdZm
-        A02uW4mbuy8oB8CTKcMEb1YGTxbUR/GMA6JlwlpdPziIA1Z5zwas3gNuOQ0G/I/1CgpHcCCdnSsxpqNQ
-        wpWYAQS+NuUQz6RqAgxyUH5DafA8moWuAtC5KV+vId4rHIjTGS7PAMcdplkS6QVY0LGv4n3VT8LghF8m
-        arHHABzeyQkspXNeJ2mop53WeF/Nk3DtAi1+XDCoPYrb6CBEZG/o1czWc4RTclUqaWSyRrh3raJRCGZ8
-        QYa05+Px6vmmM4S3arHIHc4qFrenAxa5P9hXJdR/+2Ypb5I2vXcH90Gdvo1tGq733VwMIP9tKMsHUJbj
-        qeXLZNAG3cHP4R69pZauFuO9Ne/Ctaiuhaa7OhOwLBev+bn1opVH7BO2tK3QroCreEB7sucKwAPjrfjZ
-        uw7YZq3MfR2rLiDTNbuvJHFZ8w6IHJkybPNmtcVlbRVNSsgCwLJP3YLrZB03X7ZJt0B+AlhlAFgDm1Pu
-        f7J1Z8BCwVvZKLLZcA6Dn5rhwAIP7g/G0sq0b+J6yHhOZRHnjb4nbT6shwcOBgjSeQYKssUJbksCneLr
-        +cMsDvLpjQxyQngMzZZIL8AyuENPWwYuSYG6bExKL7f7hG1KLc32zALPL147LX5cMLhcClB+CwxUN2dj
-        AJY3wWAahbJ8lQ0kYrwTDFwIlYvU0lO38M1YpiJX1EiLqaoioepUyEOT1wMNAQHKlNUUfs8HrNxMivEM
-        VuDWObmso6Zmavm0Z3jvsY2ppafFEOqhbT9Lq7Kw6kzAMl+4YqZz0k4KV2sAruS4q9SvBdv2ENwm2ubd
-        CXC1c1t32nw3k7hrdo0zXXdbHLKUU4ZpPVlQL44rdkM9bTpy2vi2QM18hIDlKKs/UjwIAMun3g5k6+6A
-        hQKoqNYzQBw9StABfF2o7XQMZy36PSdEX5Y6Vp3gingoQg/rudegUkYhMpSArEreehkd2N9R7h+I0s2D
-        5Qk9KAGt+jldzaSpsfAoWvw8VXEytLWstjaS4CScsr6UXoJ7vJ6216wN76fRE/4imylfBljJJn3IA/Vy
-        D8nTG/B2vSlm7YYvIfgiQCqy0OpUD9ZFKx8k613JU4NyUPskACwFXMU9VxhzhV8Kztq5c8CingFXsoxX
-        7Zpgvh7AEdfL0gBZxTMPiOYJ63WJ/yGAVU4BCx4ktXYgW08ALAR0TgjfJ3XaegALbkgKA7G36hNuwK1O
-        mo0ukraXiDyuX1mlaTcAtk/6eG7pTbPRXZw7uLvQA4HkpQil7IvJACt/FZVG/xvaW/abPXtCabcyyldG
-        V8AleULRa6leBjXD9sG7g3NpMmnFACvRSF8mRN+Vl6Lh3IHBDLA0qrMA6y8Tlv2X5eKV79su3ZAa1C7D
-        1VSAK/ReyXA19zaAq133njp7809pMj1Khmt2zzUvlALf24UsBCyoH9u0baJtypZvnJdt7kOTyVkEsAY2
-        HCkZ3AKAVS/aM3ixegJgoaRFOqMfkM5E5WHUbgBZ0AnxQtW7uHI5zSYvYUAm74ncT1ZXV81Tu+GUD0KD
-        0VO4KU3cZgcGw29ziUHK2ugWOry78k8027gYYKmL99xyutFXU8a7Al41M7qjZZwrQtpuPoBV5FpsNPqi
-        GfPBDYTp4VlIRGB/SuuzilAGA+qLTufkH9OEVMUAq83wOTB5q48bPIH4It2Q5yAGWBrVWYBlG7/yV+ax
-        qz60XrpRtJCpwba4K+VyDLiFDIGrqw6Iptm7Xu81bfv/0CR6pIxz97SYF/1N5K7eHYcsXoYs5RIOshdr
-        6ibROXM/1N36zTSJnCUDVvEQaA8wMGWaJuwpgIUiHT50JlrjO9JbkAS9A2S9UeQN9KLZ5CT86gbKdTiX
-        jj+TkaDzAu8oD/VQYS7Xt9zJRmPRnqBZJogBlrqgvm61DloKA021quEHA0ZXaCUemw9gwXk17eUDwLSL
-        Hp6VOCF4RU4QhGDgDgymyaiKAZZs8nZggYTt2Rhg5aBOmyKsqDjZMnbNs7bLAJ7UvFcIVzg1CDBhmbVL
-        NM/Z861h5qY0G732HDknN//YeO3+B8033B2HLDnwXV71Pb61Thyytoj2y7eLzikbSmgyOYkA1qDYkZKh
-        S0VnOQAWPExqbQGtJwEWCj9FljpXbdMP6Q09WQhZ0VdznYJDuDIKkbsxsFQ9j9yMBrVvo9kURDj9il6D
-        /IPbMxsZCDxh1cGNAZa6pC2LsE0lfiggG9Yp1F01HpsXYAmVC9ueqVQz4b1xhw7Qw7OSVB64P1mUR2kE
-        gtyBPTQZVTHAkgy3JoJndz3NKi4GWDmoU4Pcx6+pdF6+T4q9Qu+VcmpQjrsCmMDlGLgZW7vfKq45ip+7
-        ty9/3aF/8fMPKSBLnirExUiT4rGgvpwz9om2Ses1vQ0mSwlYjnK43xm8WD0NsFDYweoZ9I6QZfaTTWlf
-        xS0/aDZZiUwLIlyRgVAt7VwMg1ahPJ7wMwhvNKuCqMgVLpemcnAwVStL/kY8jkL4G5zmpdkmiAGWuuCY
-        JRSGVI1Aqzt0Ex6bD2AZPKHZmfKhg3XC0hrZCGBmqVYQItPUuBabL/1zyACLet6hf0j+YATFACsHdSZg
-        2SdsPsU6ccNbjsv3tAW2I1wppgZt8w+L/Ixte+kpJ4z4ebunmRfdK3Jz97RBVqZ4rGlbRDvGY03c4KBJ
-        aBYBrCEAWMNaRcdACljwQKm2hx4IWNIXU6GDuHBo8kOZu9FOyxt9q+icxVaaUUbhYn6cEL1HX9jDjqUG
-        py0/wqUeaFYFk9Ed2I9TQJhnJstnWpYObGm9Egyw1AV1tibT4Ewgw105D4/Nc4pwUqZ8pIEu9DA9PGsZ
-        vJF+Unm0wTtOVxuFQCVNJkUnOmDRJRD+ZTp7sepuLSTIHZ8nAeq9q5mGtnDCABbKPHF1iW3KtteLZx0U
-        7VfsEm3Td4jWK3eK1jn7RTsuxzBr552Wy/f9mh7eoeq9+G+ncJG7C7L3Yjbi5+29Wwp6B8BCyFIEvcv7
-        Fsa9WABZJBZr8gbNe7bJkgCriQJWjE4Tgqm1hx4JWCedZCutAbiJPCsNFvp8rYfp4HQh5616lz8nNRhb
-        KZs/8j8AVw/n0tFnMhyQwL4vcgW8NKuCqXf54lM4d/ARrEdcbyadwYD2JPx8L9cgeBxgTEIk7QKVegEW
-        /P9RbA8Ig1pN6vzV82rXoF7U0mzPsO0YXYlrgikFwLi9XcASKq/AY/MBLNxLMTNgkeDz5+jhmgRAc79W
-        bwrGfUG7fNs5tOVnNJkEndCABW0N49Rwz1CaRYo4d2Qw1o9am+tcw/4j+4VLiWcd+h56WYVVZwMWyj5h
-        +Sn2qVtusk3b9oTl8q0fmq/Y/q555q57LTN3TVVufdHR4qv+XsXXPPAifr3SGeIX7LPzC277nr92f2I8
-        ltpUIQCW7fLtGMP2hfmyDb+lSWgSAayhAFjDl4mOQbGM04Q9FbBQGDMFA+170hSXnpCFXxdWf2ZQWWUb
-        VTQAN0GNPkcHKv2MdJ71osG9eCLNqqDCdtS2Rh0+O+kMBsoct2+ha1+9qzaVIUs3D5Y7fC/vqzkKv/9G
-        mwW/Bpg5Bv9OyScbg0Eb92D8Gv6tknZ64321R7nS8Aha/BRBvR3KCFjwN8j7Ujw2P8AKDct0bxGwAHhe
-        wfZCT8laRiF8SS7PCYEhd+gimkyCTmTAQm+5wR0M0eRVZTk78GuTL3o2QNhfupR5I/0A5qPZ9iNSvQXv
-        oJdVWHUFwFKqZM6e/7bNurvTV2cvqr/3DK7+ka8sK18VjTX3T6C/7nDxc/cut9z4N2nphgxThW1erAMA
-        WRtm0NM1iQDWMACsc5eJzsEAWBmmCXsyYKG40so/46Khum1HQwzXycL9A6u+5VyJG/lyA0JO/OpQz06T
-        mCAFLXPuyoU0qy4j09kRHoDmGAKgatkzGF4TDGoxmpSq9AIsw1mh3/fxhHsjAGsxXKaCdwerMA4vOZ/2
-        TJrGCMzENNTSzmRY1kzgCen+Lf2Up7Q3IE89GfkAFtShF8AUfqfuxUNIBsB6K5d94cgHIOj91Ph8opcG
-        2s29NJkEnaiARa/5dvmlpzsK7t3D0gux+jUqjfQdLvUPY3RXVwOsriJj9f0bTcteFLklT4mG+offOaPl
-        sV/SP3Woiq7efQZ/3cFv+PkH6FShwoslTxUqvFiOGXtEy6T1D9LTNQkByz5sCQDWcgCsRjJNSLxY8CAn
-        e7F6OmChcBNhaXX29geX7A33a8PP1HF6JDAT8+FKgz7I41PpDUwvj5lk9M20iVxQFxNcaySXAY1AAA6s
-        AME0KVXpBVj5CK7x2lyuEduC0ZV5f75cBek/avKn+7oTAQteAnDjbFA+gIV7AOIUTnrAgjTdoQ9wEV16
-        iiYZEV611i28cMA9Ps4JoZSFgE9EwCJQIkTeNAuLs5r1wLXEnM5FP+O4hT/B3R/as9MGLNRll5FMgnaw
-        INv7htOJRk/4O0uey+dkLQZYqepT90Ap1/yMaIw9KhoaHhZNq14RDbUPhOmfO1zGeftWES9WUsA7AhZ6
-        seRlG9CLZbt8q2ibuuW4beIazbFjccAaAYA1pFF0DsI4LOrFOgEBC4UbOGNHJg0U6g9tLoYDOX373gkD
-        2NdkuqQAcAWD2xZ6KV1KGAeD3otcPIRkUHAHnmrvjbuLAFZFzoDlCVxIk9FPI0f+yOgJPSe1N7W8EUDg
-        pWJAZAAenleQuzfgIOml8VBKgBX83OAL/Z6eokkmIcLznsj3Wj2g0v1Ifek40QAL6x/u9TGDK3g2TbZd
-        9cIYUU/oaU6IvgLt6OX2DPJ4He7xCnq67kJQ5rxVR7Ptn0kb1bj2Wl5igJWkioqTi+ofeoRf/oJoiD0i
-        GhofEY3NT4qG5ieOGpseMdCjOlTc/H3FputvO85hLJY8VUi8WNLaWEovFpkmnHUAF2y9hp6etQhgDV9y
-        pJgAVhMBLHma0J40TXiiABbK4A7OJQ9mDlNZmS1M47L0hTc0ae2syO2nl8/4d3oZXUpGV2CMVviRDQdB
-        vCc0qbRigJWqM0fP/imk/3raqTX08AgAPtTDk2cMlgHsWFrAktr9NzitSU/RLACb27WCBl4LlOvTZM9Z
-        dwIskxAekxdgyaEDLuljBi2Ca92IC8hKnvj2rEZ60SutvJyerptwGhz60Oey3+tUmv42CiE3TaLw0gJY
-        dgSs8p4NWIbGhybyq18RDU2PUnuM/OTXvCoWNT7aceSbJO7avX8333A47bINSi+WY+ZeXPLiTnpq1ooD
-        1sgVonMoANbgRtFJpgkxDgtM2R5OIMBCwVvPzdgh5frFW0cagSsh8vde/Rf9gha/y8ngCRzMBbDIoCyE
-        v+E9kdNpUmnFACtV/QfW/cLoTr95M0++egz/AOUm/Xw+gIXrk8H/v077AkGepfAPuKUOPUWzjO7AqFxA
-        A+8J1O+VNBmi7gRYkO+WfJYOIYsNe6TV+rUK2wbcu++z7QtJ20Evk8p2VvkI7tc6LesEYiwkvNjdTU/v
-        GGkCLF/PBqzTm575ddGSx9/llj8nGpYAWKE1P07M2PKkyK9+STQ2PVZGD+9Q8fP3T7XceK/Izdsb36uw
-        bfHRxC10bNO343ZD/7LP2HwKPT0rSYDVnABY+DUhmSZEwFJME55ogIUyukPV5G2MDELqD3FnG4FAT/Sx
-        otJF/02L3eXEuyr7cJ7I0VxgFYEJAGEfTSqjGGClCpfQgIH1s/SAhfck+K3ZEya7D+QDWGS5Dk/o8/SA
-        RacPSwM5r92HMT7QHt7BNdcw/2wNPTA4RY3xRDSpbgNYnGtxTnF9kknr8sG/nzj1zGjOe/oCqLRq2WGC
-        wKAQeYMbUP07mkRegns1T9qbNcu+GNoZetQwLpAm0THSNEXoq+vRgFXU9FCUX/c6ASsjgaonJFsq/eTX
-        viwaWh5/1tn8aMZNQwuhogV7T+Xm7/+av+6gaiyWSd5CB6cJAbLsV+4WbVM2lNPTsxIBrHMlwHIMA8Ci
-        cVjxrwlPcMBCQadcR2ObUh/iTjYZrnqfvVgTWHe0YDC6MdcBgqyM7w2dT5PKKAZYqTL5av8AZUrrVSLX
-        7w59XiRUnYrH5wNYZziDv4R7/W7acxGw4G/5DnpQ3lKzt26a0RWamrUJoamcOzAdlx6gyXQLwAKYLON9
-        ue+bKn20E/3U6M1vsWFsH9AHfp5Nu5AsvovEA/mAHQq9ljjVp6UO0NNlcAXW0iQ6TtkClqOHA1ZR44Oc
-        ofWZ74zLniYwZVj6pGhole0p0bBMMtPmN0Rj6xM5LYOQr7j5+w6bF94NgIVeLApYyV4suvCoY/YB0TJ5
-        o6bNfOOANSoNYEGnL7eHExWwUPDA1nY1T5YMVzgg0mJ2STmdzT+GQeLV9EHW6Q1jPuDc97Ld5ocBVqpw
-        Og5eEtJO70gDZvBDOT4pH8DCgRTyeg09B8nHSoYxMfi3sJ+e0qnq6oDFe245He7bh+QjD5VytGvQXwFg
-        fWtwB4bTJPMS3Ns50sumSl5pjHq9dtIkNKvIvfgs6Ae+ThtDqGLkWCHyCVeuj/dMkzQBlr/nApZhyaN7
-        TOtfl7xVCFUUqAzLn5ZsxdNiEfw0rn1JLFrx7Ee91jz1P/TUDhM/f98Cy01/a5smlIPd0Ys1UxHsjoA1
-        C1d137yDnpqVCGCNlAFrSds0IQJW0ubPJzJgoWBQqOkqkEXgSog+2tU9Vyj8/B/hQe062jMy+MEgSJNq
-        V10EsObnDFhCIO1q7LmKK406OAGuMxNguUPxtanyASxcbBbSOpLpi0UCC6WBtIuidqS6MmDhiwnk9aBU
-        x7l9bYx1DXD1CE0yb+F4YXSHHtIaA0f6TXdI844j3Nk3m6AdfiABZrZ1IAXzG0sDnbOWJQMsgKumRwby
-        a14WifdKAVZFK56RbCXas9SeEfltb8Pvn866o9dL3HUHSk033CmSrwlVpwkpYE3fItpm7BYtUza+cBI8
-        BPT0dhUHrNErkwBLDnRvaw8nOmCh4OEl6zilG6w6wsiAIEQf7g5whTK6g9vpQKzNyHRStWgYEPwLTapd
-        6QVY6M3Bt1/8nRajn7QHc1po1I+DYeXluHWSWtqZDMuabv0hyQMA15jmxYB4lNyhV7EvIMfnAVgouN+P
-        ZfK44BZS6VZW72h1ZcDi3MEmLTFPaob3wegJPECT1EVFwmIrJ1QdzaZ9tFlYXkKmhibTrnCzfM5b9Q/p
-        5SxbuMJpSYArd/r9SguurAELOgkELFNZ42n01B6hAYfFfzO0PPEst+6VNo+VEqpWoT0n2Wrpp2HtC6Jh
-        3Us/9F3zrI0m0yGyX3fgFO7avZ+bFhxKnCaUvyac0TZNaL1ih2iduulflqtvS7uis5rsI1qeIYA1vA2w
-        yDRhUqA7AyxJRk/4Ruxg6cDcoYYdLi9ED5/hDXbKIrha1ac0+H/Qqab/qiyDkUHaHXwKN+SmybUrvQDL
-        6AndzvtrPoOfn2iz4MfQyX+DA0pyPu1bGAeGLzEN9bTTG++vxbIOo8VPEG7TlGl6Fv8G+T5DD88bsODc
-        v2fyWErnBCbTwztV0F6qtXyVJhuBMm9I92UIZBlwLT6spzy95RJgBXNahDqTDK7KWdrrjXqWoM5pMmnV
-        e8Atp8FL5EtSW8neeye188h7yme5w5U9YBEPBnqwpjgHx8qJDWsmZhuJ1lpuG0PtgpWSjV1Zbhq7Bn6u
-        KTddAj8v29BmUzaX22bsLjdN3ay6c3dHydD82Cx+0z8JXOEUIAErGaoAqPqirTmSaPA74/a3xL4rn9G8
-        FEK+4q7b97h54V2p04RJXxNayJpYW0Tr5E2Xx+v8kg3kPsj3BO8PuU9j0FrL7SObB9tGtrzhHLWcAJYc
-        h6W2LyEDrDZxruAk3lv9eUd6siC/HyC/VbhaMi1GlxfnDs3LxUOAZi6H81zBa2lSWUk3wHKHH8P88W/a
-        rCov7yaeS9JQTTu9kU/wBfXNnhG8MgFP8iCcvwcrdCgzYJH7OoseTmR0B64zeWuWwrktHWXoIYL2eUSb
-        J0YyPAfrDNNQSxvN5K9dyrnDc+glZi2TEOwP6X+bS7mSrVCAhSKeaa0eNgBGAlme9JCFcWcAV0e0whU+
-        OwhYRa6wpg+9dFf2U4Rg0FmVDFkq9hu2TOx37gqxZORKsWTUKrF4zGqx+Py1YvEF60TnRetF59iNomPc
-        JtFxySbRPmGLaJ+4VbRN2iY6pmwX7dN2io7pu8hXbo5Z+0TLlTu/N8/Ytc45eUuHv4X3an3wt4ZlT3/K
-        rX6hbUqQeK0ArtZQsFp7ROyz7vkE60vsBQJZRaufHUmT6xBx1+0/YL7xHhXAwjis1L0J7Vfskuob6t0O
-        9Y/3wQb3g9wXuD+OcXCv4H6R+3bBWtE+ulW0j2gBwGqWpgnTfEnIAKtNnDfqgAf6dT06weyMfH11DAb+
-        KbQIXV8jR/4IBqDniCdK9ZrSmwQp4aNaF6TU0YP1YD5rDnW0kfgtd3gULX6CMHA+I2Dh34Rg/MVRhynC
-        7ZlidMgA6wpcTw8ngnNetA5qJel1nCFA4zXmEt8k7TGKaain3SBaBy+D48Ka4p9wahr7lUz3S4sVErBs
-        pYt+xXkiL0ll1VCHMmQJoRaaVFzGs2428EL09VzWOZOmIIMVNKnOU/YeLDAcYGGgxQHXOQQ9HDAIn9tM
-        BmT7qKWibUyraDtvmWj960rReuEq0XoR2NjVomXcGtFyyVrROmG9aL1so2ibvEm0TgEDALBcAdB17d0I
-        BncMWHSY7sDfMTK0PNaMXwUalj8V91zFPVZrJZjqvR7tBbH3BoXh/+FvRdveEPusff6VUzc/kNdnp1rE
-        X7c/Zrn57yJ37b7McVgUsEg9Y31DvWP9432wjAOD+0Luz4Vwr+B+4X3D+4f3kQAW3FcJsJoYYKUR54qY
-        eaFqLXbMHQdXskmrwMPb3YOcNzSEFqnLCgZRl+Sy1z7NQWKY3MEDNKmsxQArVfD3yRmBB/5m8IR208Pz
-        nyJ0h9bQ36sa/g0G10p6OBHc66w37u0uRp5Vd0jTjIfRHdqP8KGWXi5WSMBCwTNjh/7wKy1f+EmGkIVe
-        18h6DObHtHCbJUiHbn6vDXqJB9cd2EYK1dnKCbAGA2ANbSIDsBKw7AhY5y8XbX9dIQ3cMmCNB8C6VAas
-        DTDgw2A/dRPZnBjjhXD9Juu1d4r87B1kB/eOUJ9lTzmMK4/8YFz5XILnKgGuCFC9KPba+KJ4BjX8NzH4
-        PYKWYc8HYp9VR66jyRZc3PUHrrXccp/IE8DamwBYOE1I1sOige5Yv1jPpL6x3mXAgvuB9wXvjw3uE94v
-        vG94/9IBllMGLGwH0B5OZMDq4wn35ryRJbwn8i3pADtwajDZsOMmg5EQPQBAIdAidjkZ3cGMA216Q5Cs
-        h85X+8bHDLBSBX+f3S7weIIb6eE6xGCFm9rLD37W0sOJGGDByz/uHKF1yq0dKzRgoXJZo0o2CYxC23EZ
-        Cd4T/ojUmSa4ktbagjb3OG6jQ4vUudIKWDjQksBnJWCNzAaw1onWiekAa6tomXcHAsJqWqyCy9D8+F38
-        htcV3iuEKzA6JYhwFQerTS+Jf9z8ctzw/wS2ALL6bH1N7LPhpS96r3i2Q4L/uQWHZqEHKw5YikB3svmz
-        YsFRVcAC0I0D1sWyB0sCrLgHC+4nA6xUkTWEhGgtdB7/IlMKOS72p7/BGyBACHqIoEx7TZ6Ihxa5S6jX
-        n8nXdJ9TeNFkOLAD4LzDl1X9Bt9u2zPc5R/3E8V8GWClinMHbmgXeNzhZfRwPYLcyZe2ycfKJuUXjOeH
-        OtEBC5etIO1N5xe3jgAsFEDWVdKLp3ZvNenDvLgYqtbpWlyhnuzr+qbp7OAfaFE6X9o9WDDYpgEs25hl
-        ZKDGAZsM3DCA41QUGdAVgGUjgLWZxAnJHizLvNsRsLbSYhVUxpbHxvDrX0uMu6JTg3G4Ang6Y9OLElRt
-        eUWyrfQnGgEthKwXxKK974u91zy3hiZfUPELDk3AtbD4+QBYatvmKAELpwmhnkl9U8CyUsAiU4TZAFZ8
-        qYYTF7DIju1C1TJeiHzTtcAqyUg8QwN0UtUi543uM3mrOjfAkwpXzM40yGY0uCajO/gl/PsIDA4vtWcw
-        kL1qFAKXYL4MsFLFeQLB9oDHILR5lPKOwWpn1X48B46Je8xQJzJg4QrrvFD1mTSdrp5WrtZRgIUyegJR
-        uhRDSjnaN63nYAwces2qPuMG3Eo2Ke8yyh6wYHDFL8kyAhb1YF2QAbAmwWCPMUEKwMLAbAQs46wdG2ix
-        CiZny2M/M7Y88Sq39qU2wMKvBhGw1h4hMVcErjYq4ArBatur4hlg+DMOWghZcFzvTS+Lfbe+LvZZ82zW
-        a/TkKlPFbaMxyJ2fvz8OWEYALGOaFd2xnokHaxIAFtY/3IdkwJKnCAlgjZYAy64GWPJSDdAeTgTAQkDh
-        vFU7OCH6Q5cGq2RD0CIeLeh0PJEHOG9kfL7bU+Qj6AAfNfnQ3a9S1mwMrgcHnGwM96TjPYFrMF8GWKmC
-        ATZGQUjVpL+Fb6WH5w1YvDs4tz3AAqCKx3yhTlTAcg5d9DNo609K9ZhLsH1m60jAQsH1LreUN6mWRT+T
-        PjCA9vkNxnnSrLuOcgUsBwIWfsovAxYMzCRQGgdqpQdrHALW2uwAa/aOhDeZQsi45LGZpo3/lLa/iS/L
-        oPBeradTgzgtSOHqjO0AV9tfE3vteI38JKBFIQuPQyAr2v2u2GftEU1BjLmIW3BonPmmexMAK8GDlfwl
-        YRywwJSABfclE2DJHiy8zycSYJFFJb3RySah6kHskLCzk75iU3u4u7pJgfCkwxYiL8N1VRT5tX2Jl694
-        d+RP0uCc3xo+2Zp0rdJn/wywUmV0hVZKA7j6ufg3ozu4gB6uR5D75ZnyI2X1BO+ghxOdqIAF171G77gr
-        pXU0YKHgmtdJniz1MuVr1Fv/Heep7BLbLaWoUwALv2yTAQtAoA2wthc08h83aS5a8tgL/OqX2lZrTwNY
-        svcKYYrA1c7Xxd5g+DMOWcSLBYAFx/fZ+JLYd9OrYp/VR3LeGT4bcdcfvMBMpggVgJW0FhaZItQJsGQP
-        lpOs5t4g2qEd2KE99DTAwvVmAELqAKbewQFB8rh0DBR0hOFbHvEkCJEv4BrXm7zhci2r/OcqGKybM3kw
-        9DYymOsNWO7Qk5aBTaQOtVo+Xk+EGrU02zPLwCXouVT9YAjS3ZLxK0ICWKGZ9PC8AavIExhH4ELleDQC
-        UkLoPno4EecOPNIzASt4F73EFHFksU58TgrX53QGYJ100sgfQd479Ycs9FxhrFb1saLSxR26VJIm5TVF
-        qCNgma85KBpnbr+fFqsg6t3w+J+5Fc+JRnnzZtxfUPH1IAGsDS8kTA8SwNqRBFjoyYoDFp0mhPMMu98H
-        wHruZppdQWS+/kBvfsHB4zyu5l5owFKu5t4DAcuGO8J7qy7nPJF7cSAk04BZDCTd2aTrRIDEmIXI05wQ
-        XgidVUG2v7KV1vwKBuuPOrJOCwFYBoASk7/mJYDFHCz0UU7Byhh75gm+q55mZoPBHH+W0eInyOgJ7c8E
-        PFh/vDs4kR6uR5D7SAmW1MFB+lvwCXo4EYDI89aBLWSau6MMv1SVrjGXqbkgDvQkDbW00ayDlqIH6yF6
-        iQmC35fC+T8U+jnpHMCie1J6Imuk6UI9AFKeFqz+2lAaHEiz6ZrqdA8WnSI0Xb1P5GbueLmQb9VFSx67
-        ml/3GtnQub0pwnj8lezB2iHBlTxNSGKxFB4sPK9ox1uYTtq3FL3Ez9/XYq18WFoLSwWw9Jwi7GmAxQ24
-        9XecOzIeHvQd8NB/RmADBxwY0NQf5gJbZ+ULHR12UtSr9R2AxV0wKM8weqNFtKryFnTml3ak9wqtEIB1
-        0kliziZ9tae9DrBNGt2VF6mlmZ2pC+7JvRkBC55v3hs6nx6uA2CF/ZkBqwY9Oy/gIExPIRuCY9wg/Bzb
-        UWZwBS6G67xDKmtqOTMZXoPRE9iAaailjWYUopdwpUEfvcS4TKVBjhOiXyJQ4n1JBjM1w+PI1JhGGOws
-        wJIFbaCW91UfS9cWsjVsi7xQ9XrfAYEBNOmuK62AVTJshdh/xGqx36g1Yr8xa8V+560TSy5YL5ZctEEs
-        HrtJLB63RSwev1V0XrpNdE7cLlrHSwN6AmCpxGCZ5uwRjbO2f8TPOfQbWjTdBYC1jF/7anrAWpsmBgtg
-        qhdOCyJokZ+pMVgEsDa/Duk89/ppK/+hutGqXjp19uaf8tcd2GpZdI9oXnivaL7+sGhecJdomX+naLn2
-        DtE693bRdvVtomPOIdE566DonLFfdF65T3RO3yM6p+0WHVN2io5JO8j9wfuE94vct4s3io4xywCwAK6S
-        AKs7x2Dxrqo+8EBO5D3R7fBwf0w6Khh4OzdoXYqPwvgu+af6cYU3uQw4QBo94aMAfffw3sg1nDfq0LL3
-        X7IA2DIO5oWwwgBW7uKF4IJcAYtzBf9Kk9FNcE8ybL6M0A2DsBAZSg/Pf4qQbC6NMKA+qOLfYNB/I93m
-        1B0p3h2uynUvQoM7t70IOU+gmPfWTAPIHJ+tEWBzh5sJnKqUJ511NmAVCaFzoB39K9++ToqHjOykyXZt
-        aQIs6Kzs5bF1jkFNdY6haEvq7MPBRrTU2UeBjW6ts563vM564QrJLlpVZ7l41UfWSyXPSSbA4nGrl9m7
-        xL5z9hZsA+Wipkd386tfFo0tT4jG1icTviIkK7grviIkkLX5ZfF0BWTJhv/H3+PfpenBF4n3q2jTq2Lf
-        Vc+9f/r6Z35NsyyoTPMPlXPzDkS4q/fUcXN21HGzdtTxM7fV8Vduq4N6rTNP21oH9VxnnbyxznrZ+jrr
-        BLBL19WZx6+pM49dRe4PuU9/BYP7ZhvT2gD38RPHqGXdGrBwzSQYIL3Qqd/Ke8IPwM9vsfNHsKIDaKea
-        5DmCwcgd2s27K/8EP8NQruNYPrXjO9LaYAu/moyAhZ8B2GowuqtG4WbNtIrbVZEQtsL5x3OaHsvDuhpg
-        AZxU5OzB8gQupMnoo4qKk6E8z6UdmAXcgqlahHqLL1ibtweLLHGC7Ui9HdB0P+g1sO4X9JROEzyHjbnc
-        K7xuAJeraTIdIrhXI8gOByrlSWedBViGv4T+C15uI/CS+4NeL7V4LZDWERJL2pWVLWA5oREBYB13+Bp+
-        T0/NSpaxqw7aJ21PWGhUbR0s08wdonnuIdE8c3fBtv0oij26m1v9EgDW46IBAUsZh6VcBwu9WLhUg7wO
-        ljxdqDQKV7L3igDWxlcQ1t63NHUMYBVC1lEtzzjHrFYHLBisuuI6WDgImIUqN+eNzIfOfB88gO9LEBMj
-        bzv5vjHpZST+qbwRf76Ob6G0+EQGT/Av8Pu7sbPW+mZaMKPLI0j1iJ6oCLx9hu+D34d4b3i4wRX4Y7rp
-        KBiUa+Lr4OA0aAcZ2RTaE5qNZWCAlSj0EnHu4KvS9JJKvlB/ZAB0Bc+kp+QNWH2ECA/gghuTpxyPpnd9
-        56PuBFjYf2h9IesMwDJ6QsOgTb0g9Xv69sN4Pdg/8Z7IUgz9oFl2LWkFLHt5TFNArHns6iX2yTvaXcmd
-        LJA5/04MdL+Rnqq7ihofXcaveVU0ND+eZppQ8mIRyKKLjcrThWTKcLP0k0wLJsEVnmfYiB6sZ18/beXh
-        Tnd356KRIzf/yDaq5YhzzKo2wOriK7kb3aGrTP76j3DQwM5R8lLhYAADrspD2SmGAz8OPkLVUbDwH0tr
-        fkWLnyIo9ySAxDcQTrIZ1DrScPBFYJWBC8r3DQy+dzidi35Gi09kOTvwawzulo6JdqjhF3RGIXAVloMB
-        VqLO8AZ/CeV5W5qyU8mXDIBh0XJO2EpPyX+K0B85A373DQE3lXPw90Z38CsYJE+np3SaGGDpJ4zl5D3R
-        DRIEaY9ry9qgzeJLFbSjdwDgptLsu46yniLMEbAsY1ddIQFW216ExINFN3smgIVfEiJgzbsN18K6jZ6q
-        u4xNj1wTB6z4NOFTSXsRImTJGz1LmzvLoBU3/D/8XoYrjN3C87gt/8S0DtPsup3SAtZgxWbPXQ+wGi0D
-        m+Fh60JApTAcKEkH463aAYO2nRY7o3AtLqMQXswJ0S+ww+8qHrhko4uHftyr/6KE6R1pSiAwAL1yHW0m
-        X/RsrryavM0ywEpU7/LFp8AA+zG9xhTDdgbP0/d9zgr3pqfkDVh/gHth9IQ+S3c+ASxP8DuLp8ZAT+k0
-        McDKX6efPf/XvFB1E9xvsp0Y8SyrlEVvw5cGvA/Qnu6HsaDrrIlVaMCyjl81wDYBYAo9WBPAZA+WDFg4
-        TUgAa5vIX7UHv4T7xDJ/X0Gm2IqWPHoW1/osANYT1ItFpwnlWCwKWUUKT1YctJIsDlZwHMIVnsdte0fs
-        u/Kp+CrI3U1tgLUyxYMVBywYVLE9dCHAqs6lUyy0YWcmPfBV98HAldOnxHxpqC/njbYCaH0vdVZdC7So
-        J+RNBCpa5C4lBliJKhKqToUB9ut0wC55k0JfKWPt8gUs9GZmPB/LgoOwN1DQ9QOzEQOs3IXTzyah6gro
-        r/6BHwqkg/hCm/RCi0s4RLcbvJF+tHidp+yD3HMDLP6y1t+Yx67+1DYBoAoBayIAlrxUAwAWicOia2Hx
-        GIc17zaRn717OD1dV3ELt/zE0PDwy8blR+JerHgsljxVKHuyaEwWAS3q0ULrmwBWYHAcgbLVR0Tj2hdF
-        btUzxTS7bicCWCMBsEYDYA1HwAK4GtKYOEXIACujyWAFUPSEyRu9iBYzL2GgsNEbWY+dlgRtXQO0GGC1
-        r64EWGZPuLfRHfw+LWDBtcPz9JH97MWn0FPyBqwzz5z9U84dfCv9+RhYD3/ztcV9dZa6E2CZ3KGLugJg
-        9Rq46BfQnqZCf3cE6y7f+FFsm1hOtb9lbTQkA14Y8CObjVxp+M+0uB0vTYDlr9MMWCgArHvsk7ZRwKJf
-        EqoCFo3DmrVrNT1Vdxljj1zDr31dNCx5TBGL9aRopJBlUHqyCDghbFGYkg2hSgYr3McQwIzb/E+xb+uT
-        99BsuqVkwComgLUkDlgO9GDhF4QMsNJam8cq+gx0EhOdzsk/pkXUTTgFBh3GVsiD7o3YuaDFAKt98Z7Q
-        Nbl8+o+LVhrcAV1fNPHLTkw7PWDB/XSH3lJO+eYLWCcNWPRvAIovpR94paUhTJ6Ah57RaepOgIX5aS0r
-        Aaw0i51qldFTY4B2dBPcv3/i9ecLVmjkpcIdOgr/fhT/jR7V5GO0GLZz2ifjvw+YhKoxnGvhf9JL6Bh1
-        BGBZx61e5JiyK2mpBrCkLwkx0N101V7ROHvnx6cXaJrQELrvvwyNj/yDW/F8CmShJ6soDlkyaClgK8EQ
-        rCS4MsD/ufWviH2XPd71Fz7LIAQsuwKw4l8QyoAFnT4DLIXBmxJxSUO9wMD8GC6OyHELf0KLVjCRT9+9
-        Vauh0/iWgFYWg18h7EQBLIMreLbRFx3GuUJDtFgRLpjpCa7NZaNrHgcsXL4D01BJO5ORsg6Q4tCUQi8R
-        ub40cTF0kHyZG7Ml3obzBqyTRPTiPdEeYCnX3uosdRfAIiujC+EntUKNBDDBe2kymmX21PU2ClVTeE/4
-        Nrhv32FdmaQ+ID9DECIf9URf4IXQOZgXpH8t/P87rV46VcP0IR28fk6Ivgblr4f0/U5v8JfkwgqprAHL
-        l4cH66KVZ0lxWABXNNA98UtCRRzWrB3Ei2W4audl9HTdVRR7cBC3/HnR2AJQJUMWThdiTJa8jQ4BLTk2
-        S8Xw9/B3PM607R2xqPXxBpp8t5UEWM0SYCUs0YCA1RbgjnYiA5b8ZkT2whKih2FwGA2VV/B9/ZJlEiK8
-        0RNqgA7kY9LZ6fAWqcXSAZbFG+gFHVirkVioQ81U1tDKCdKK2XoBFrSxp/DrRKxfrSall8v2K1iWXPci
-        bMa1rOKrscuC3wnknmUALKjDZ0SxbemN/AELwSV8X6ZpHzMZ+CK6L6qqVd0BsHhfqC88W7vxpU6tLJmM
-        3B93eDNNKjtBv8a5gzdz3uhDkC9ZT5C8UKbxgmo1/CoZ2x30o7E/li5K+Loa94flheoHKHypnq/VsP3L
-        fSW09Xd4X+1uY2nITbPUXx0BWKeX1/27Zdzq12yXbckc6E6nCU1zD+HXhAn7U+ktY/3D15vWviYam58U
-        ixSQpfRmSaBFYSvZ6N9Nm9/E6cXbT6/b/+806W6rOGCNWpEEWHR68AQHLPnhRM8RvAltMnojLlqMTpXh
-        rNDvjUL0OhikXsI3NfLWp1MHmMnSAZbJFTwb9x3DjhHrqyPNNmQFlCk4H8uhH2CFHyJvv+RLVa2mnk/2
-        ppZmZsMBEMo8ihY/LmNpZKgEOnhcal7S34KP0MOJ9AAseEZvl+ovzXk4YHtCE+jhnaauClhGV7DB5Kt7
-        EPJ4AvL7hgCpSjnaM1zOwOgOLqDJZqVTMYbOE/xU73WssD1JaVY9Y3RHVffNRGGoBS+EFwCAfSXdG/W2
-        q92k2D/sL6B+C7Y0lDbA8uUGWChcObxtmlAR6C5PEyoAi5u9UzRde7vIXVW4RUdRhoZHbuZXvgiA9JwE
-        WQmgBZBFPFpPSss5tD4lbRJNDH634lmAq7fg308fskSe+jlNsluLANa5MmC1BbifyIBFvFVt0PJPeNAX
-        w5tPp39SriaykKQnegHA3+2Slw2nD3Vw4aexdICFC1WSzjiNp6SQRgZ5nVdyh/v9oLQ9h/o5Xc2kqaBU
-        wDK0Ux90CikhjlQfD1ZwF3l+VM5BI4DirpxBD+80dUXA6usJ2NDbgnkgAGM8kVoZ2jd5lf7In2jSWUnq
-        U4Kv6daP0H4J+qkvoZ9amLyGXjpxrsVmkxDdiW00kzdUq5GyuILX0mz0V7aA5cwTsKwXrzyTTBPiFCGJ
-        w5KnCQGwpslxWDhNCIA1cwcBLOPsnboE5GVS34aHLzQuffpd4s1qfSYOWXFD2MLpQ+rdMi57RuTXvyZy
-        y587blj+TOikRYfjm5R2d8UBa2QawKLxV6Q99GjAalvBHDqEYxhzAG9aF3OuWMcGSOYhjNOCMkeh/G/I
-        gJh756xuDLC6pqUHrOBECkGqRgFrHz2cSBcPlhBcnylf6fmVvI6dqa4IWACnK/To3wjgugOPZNoIXE36
-        ARb9sg/bkVC12nhOZU6bykOfMoL3RJ/COsE+Wj2v7I3UbVcBLLu3NmfAwhtrHrvqcftk/JpQisNKWHBU
-        zYt13Z0if9XOlFgCvWVouO/3XPOTEUPzU+9yK18UcTFSbtWLIrfyecng37hJNL/uNfRqHTW2Pru9b/Oj
-        mt4EchU/Z/Nv+IW3T+MW3LaWu3b/Pv7agyuN1x685HeTW7Iify0igDVcAqxMAe6kPfQ0wAIYkKFK6kwi
-        Txm94Rs5f8RMs+qWwtW7ydcznsgOuEaycKkUQ5E/bDHA6pqWDrCM7sDMjKBDBuFgQoyOLoDlCS7NmC8+
-        c+7QTfTwTlNXAyzT2cE/wDP0df7PKsJNPe5woPlDgrwBC/oAbFeS961qL34wQpPOWfghESdEp0Mf8zp+
-        oZsPaJH73TMA66STLONWT3VM3UWXa1CZJpyuAKxZO0TTvEMid9Wu1y1Xr+mQKThDw8P/z7DksfMMSx6t
-        NTQ9dlvRkscfhZ9P9G189F7D0qeXG5c+M9XY8HBO5J2LuPkH/OYbD79uufUB0XLT30TzwrvB7hHNN9wj
-        cnP3P9t3+lZdIU8CrCWJgKUS4E7aQw8ALIQAfPBJB0/erMIv4KakuBo4Tb5HyeSDDttXNYnzRPdLsNVA
-        Bgdp8NQOQwywuqalAyzeHVyQGXTwb8EV9HAiPQCL9+AzmhmwjO5gFT2809TVAAuAuBLjlNTy1GIYDwlp
-        baLJalKugIXPP9YLOU+oOlhUgE2Z8eWRd0fnSqCFHi18RrX1OeR+d5kpQgQsT+6A1euitb8wj1/9vu2y
-        zUnThIp9CeWvCWfuIJBlvv5ukZuzI0yTOGHE37DvT+aFdx01A1jx8/eJ/LX7RG7eXpG7Zo/IXb1bNC1A
-        797eT42zdukWDxQHrBHL4yu4J+9BGG8P3RGwYMDHBx4ffKnDD3/LeyL3gy0C8DizEGtXdVUhbGFgMdTL
-        Vl4IvyODpvSmmd0bMwOsrmkZPFiVUrtXPw//Btea8DW0PjFY4ZvbzdcdbKaHd5q6EmBJ+0aGPtAKNslG
-        VlX3hJ/G9GjSmqQNsBSzAORDoKqNUKelNKmCCfsfyA8XO30Sl0TB+5FtH9ajAAtlHrvmRse0PW3LNSQv
-        OiqviUW9WLh9Dj/3wA+GmTt6pFdBTc5Fu39muuH25y23/F3kr9tPAIvA1VwJroxX7SJTqJb5d4n8ldsO
-        0dPyFgGsYUuOlBDAUkwPwiBlV0wPkvbQDQALB3npgaeeGhz0PeFXwdYiXPCuqj40mRNattKaX3Geaj/v
-        iQYANh+A+vkKB2kCXAAWEnSkwhIDrK5p6QCLcwfrSP2onIMmPUeBID2cSBfAEkLz0j2jaPS8NfTwTlNX
-        AixpOld7WeIGzx96rqA9P6bc+kir2gcs+aUV+wqyztRL8Ltbi1xRI02i4wTjF+eNDuGFqm3Q93wtlykT
-        bJE67lGA9dfW31ouWfdJmxcLAIt6sUgsluzFUk4VXnsbgMXeV/44a2fCOhk9VfyCg8utlQ+K/IIDbd6r
-        uei92o1TpiI3Bwzhc/Yu0YQfBMzYzNNT81IcsM5dFl+ewSnHXyW3hy4FWNInxPigt4EBDqzh7+BBex7+
-        to5zRy6Hh8+BS4bQU5nSyOCq+aNJCGPcVg3AxQMw8Hwmv5niYIL/xk6L95LYBwZYXczSA1ZoE36WLn/0
-        kGy2IctFgyeYsJdq77PrToEB9hhZdkPlHKXh+XDPU3bhALCbkzHfwcug3ME76OGdJmgvq2xDVpI2pMXw
-        2qDeKmgyeYsbs/An0OZexudM7f5mMnzusEzkXKFqWfJG7FqVAlhkFqCqrZ8l+UT/AUC3DBeLPfXM6E/p
-        qZ0q7MPg+mdBfdwNZf5GvldS30VetMn19DjAQpnHrrpe8mJJa2Ipg93lJRuUXiz01pivP4xwsZMm0WPF
-        X39gmuXW+0X++kMAV/tTpgYJYEF9EPCcsV20XnNItFy59WJ6el6SAKtJAqwM04OkPXQdwGqROujQD/Ag
-        /cMohA4ZPeEADq64nQOuekwPZcpRZmHxbw2eiIcXwhjvsB7q/FkYAKR1adzBL3v1r0voxE1kHaxGsu6O
-        3LF1lNF1sEiHCZ3oOBz0JTDMznBBUeyAcW0xcjEguNbnrYNbVY/vimaVnocLaPHjgoFkFgyM2+BvW9QM
-        /5YcCI3wzLkDywGot6qdozSa9mR6alwGd0jIlC/vrd2mdX2mQgj39zP5GlqhLEu1mMlX1wptzU+TyVvQ
-        h03FPo20aRUgTTHS9vHeN4i8B6fmIvvgJYMstpuvJMAKfWIZ2CKlL8VrfgB2FzwnN+FagM6h+n9wpaf6
-        4B6cQvgShH8o9xF4no/iCxPWGQK10RVYRA/VX50BWIYJy/7LMn7tG/bJW5O8WLhkQ9LK7jJkzdklmivu
-        Fo1zdiS4sHuSjAsOlplvPPy96YY7VKcGE7xXUC/o5bNdfZtovnzzRJpEXkLAcgwFwBq+jEwPEu+VyvQg
-        aQ9dBbBKQ27eW3N+UWmQ6+oPek8STjvAm6sPAGt88ltrkVB1KucNV0BnBhbsUDP5ahfy7kry8QeuBA0D
-        0HLOHcrevNHlvCfUoIxZgQ75et5fo358FzTeX7ec80S77abzJ7oAjhaafPXb4UUGwLNd2w7gsAleKut5
-        T3SC0Zvb8gfphB5/nFo2eavCRk9gAsaqGryVndrn56WKipNxpwn0tnHu8BzeV70C+o2R9K/6qzMAC2Ua
-        v/YCx9SdEmApvVgq+xOSgHf02ly9RzQvuEs0zNlNpgB6kkwL9vYHuPocLA5XbVODAFhxuNpJthPiAT6x
-        fqyz94mWqZt1eVshgDUEAGtYK/16EO45vCGptocuAlhMTExMTExdUp0FWCjL+DUHHdN2ixalF2vKZhqL
-        Rb1YSVOF/DX7RNOCOwA69k6iyXR7cfP3FZtvvOt98033JsKVcmoQ4YpODWJ9SHC1VzRN2/ym5WJ9lrGQ
-        ACt2pGQoApbkvVKbHiTtgQEWExMTExNTenUmYBWNXXOGbcKGL2yTt4jWyyhkJXuxkpZtIJA1V4as7u/J
-        Ml5/0AVw9bElDlepcVfyV4PxqUHqvbJffZtombZVtz28CGANQsCC9qCyuGhCe2CAxcTExMTElF6dCVgo
-        8yVrJpLFR3HJBrWAdzpVSCALAYtCFoeerOvvEvl5+wI0qW4n0/UHLjLdePhr8433pMKVatwVBrYDXAF0
-        SnC1eTdNShcRwBrYcKRkCLSHDN4rNAZYTExMTExMGdTZgIWyXLJmnXP63njAuwRZNOBd8VWhvE8hApZx
-        DkLWHrKqOX/t/m2GK3Z0q4Ger7it0nLzvaJpIUAiwBWnNi0owxUCJYErnBrcKsVdTd/+tm3a9v+hyemi
-        NsBqkQArjfcKjQEWExMTExNTBnUFwMKvCq2Xrn/WMW0XgayEgHcSjyVNFSJkYdB73IuFkAUggpBluu7Q
-        i/w1u7w0yS4rY8VBg3nhHXdaFz8omipuS425SvJc8cqpQbh+y8xdomXGru+hfgbQJHWTDFjFgwGw0gS3
-        y8YAi4mJiYmJKYM0A5ZQp8uilsmyXLzWYJ246VP7lO3pvypMCnon8IEeHoAR03W3A6gcAlA5EO2aC5JW
-        nGxeeOdM08I7P7Xcch9dRFQBV/LXghngynzldtF21SHRPG3jNJqorqqoqDjZWVb/XPGgFtGeYXoQjQEW
-        ExMTExNTBmULWA5vPQyqTaLNXaPrBsNKWcet9tombf7ehutjTUoTj5UEWdJ04S4SCI7B7+aF9wK0HHyF
-        W3BoHE2208VXHBjE33D7Q7hpMwBWHKy4uNcqEa7welLhCoPab4d62Byiyeou9GDZ/fWvFA9cknF6EI0B
-        FhMTExMTUwY5hPpD2QFWndhv4DLR5q27kp5aEAFkXYheLPJlYRJkkXishC8LldOFEmTJ3izzDXeL3HUH
-        H+SvP3Q+t3DLT2jyHSrzDbeXmRfesd980z2i+WYAv2SvlTwliFvgXE3Ljx652XBNSri6YpvouOYOXFA0
-        Yad7vWXzNhQ5yhq+c5TFVO+/0ro6YOEK1LjQJO+Nns+5w9M5T/ja5EUpUy1cwXsC15OF9CoqTja6Q1dx
-        3mjiMd7qCqN78RSaTc7CRftM/uqktKMVRk/ommy28+l99uJTcMV0XghfbHQHZ4AtSEhLzci1hGanLgwa
-        7G/y16ceD0Z+L4Sc9NB2ZXQFRyemFa7g3KF5+W7ZkUl4PUZP+OqUe6WXecMVvQdET6PZpRVZ9dobdZBt
-        htyB6XjdquklG5QbN9+myWShipN5X21fqFs/tJcJnCcwWzXdJDNBPkUDImfQRIh4T/A8k7826bjqiiLX
-        4uz2koOXMny+MO22NMLwjASu48+s+g09Ki5MF9NX5icbthtcOJge2q54b9ib2m6hvQ2o/h09JCvhbg9F
-        Qq2V80QvkNII1UqLtgZXwL+XcEL4ZngGLuPdkT8lbwvVnrDdSIvutpURn3ujK3wJPaQgwi2OjK6Ii2wR
-        5gnfSq4DrwevyxOuhXLM53yRkbjbBT1FF3FjtvyE81SbeE/VIMhjEuQ5R3nt7Rm2DdwnFtPC+4Ln4+9w
-        K6K246B9CdHrtG5gjf0q7w7PJW0kKT3eE72x158jusY0EzmEuj3ZAlZJWTP+fIqeWjBZLl09gUDWFPRk
-        yUHvqZ4sEpMlQ5bszaKQhR4h0/V3AmgdFrn5B5/jrzs413r9bQmdSyHEL7r7fy2L7pzKV9z2kARWfwew
-        OkjASg5k55O9VjJcQfnlLyWTPVfWK7atPekkkeZSGNl9tdGSwctT7ruaSYBV92FJact/09O7hAyuwB85
-        IVLHC1Vv4LYOiVtJZDZL+RL42SAWCWErpgUP3wH70FWJxwxcQvbhMgmRnKfK+dJQX9wTC9NSpm3HbRvc
-        oTtxAKWHpsjgCpUANG7gPZGPoOPRdn2DWkQYkI8ZkqDYACBgH4p7sKWeg9uuALw9eZKYXduD9G9XpmUp
-        byZ7RPbSBBDahNdDNreF61OWXRcrb4R0m0UcrGh2KeolLP4ttLdKaG+v4F6GWu6JlH6LaPJEPDS5tOJd
-        YTsvRKs4IfosDPrfmXy1GvJqhHu5VORLKwfR5IiMnuDddtwnMOG4Zbif41/pIRmFUAn3/GNMW04DnyN8
-        RtQ2/MV0MX3Mpy1PyayDlmL7fMfij2S1rh+A5ZKE5xPrEvLGvTDpIRmF9cl5IzVQpy/g9khSXcrlwTqV
-        Tfo/2SZGiLwJ7Xk57w4JNJmMwnaD7QfLJqdtHQL16w4/Sw/RURUnI9xDW9wFLxwfYx+jLH/i9YDBPYLr
-        OQb2OCdU3VB0TqAXTUizoD8aAPXYAm3zFQCW43j/NT0H1EjbcwdfosliH3yrdI8V7QXqkuyb6QrW0MOy
-        Erz03IBbEJFtvBR5YvrQ7x4qyD61dm/t+pKBraqDqJr1g2Ntvtqb6ekFEy7fYJ+yDSBrW5snaypdhDR5
-        upB+XUjgRDFliOBCQGvB7aJl0b0AOAe+NM0/sN903YErjfP2W0ZuFn9Es8tLfMXtfU3XH7qUrzi0HcDq
-        E4yxIksvyJs1xz1WNNaKeK0S462IFw7Lj9cxYxuFq+10WnB7ygaqesteVud2ljcddfjb916hFfubELDe
-        6T8wcR+6zpTRE7gQOr8PpV3kcXNSbZsNS5uABo9zrogZ0+O8lX9GiIHBLOE43GMPBoKct2yCDuRm7DCU
-        aWIeJm8Nbhr7F3pYiuDN7nro5L/HToHuCZaYRjuG50BH8h5fluhZQA8YdoRq56Dh37Bu6eEZBelvU6aF
-        m0JD+l/ms6N/e8LrgfvxiVQnqeXPy8jmtlGxyB0+i2aXIM5VOQTa2hvY5ky+1LbSrpH0q6CeQufQJFP0
-        v/6rf062QhHw3jembFibnUH7gvLxrkDCh0DQFnfhQJh4XC2UKzCCHpJROChB3b9Mrp2mgWUDcPsOXyTo
-        YXFhuiT9NGXHwdPgDs6lh2cUPKsRfBbi52NdQt74EkIPURV6UzlPtAnq/RjmJ21YnE1d4r2ClxrIE68B
-        zt/Nuyr70GRVhe2GbCCuSJ9uHP53eoguAtg4G/J5CDc3x+dPehbavyasL7wWhA5oX58DKF1Pk8xKvf68
-        6H8A0DYS2Md6If0ltk31/Noz0jbcoYdo8kQARvcl90+k/cP9M3oDFnpYRkEbNcA538I1JqRD2+JbfNmi
-        FG+rLoLBMthvYHZeC2K+BrEYPVn+WODMAu+cbb10zRjbpC3f2qftTIGsFE8WnTKUIYt8YYighZCFIHPN
-        bgyAJx4tM8LWtfuOc/P3H+EX7N8AP+eb5u8dhiuq95l34P8Mc+/7r9MWHv6PkypE4kngFj73E0vktp/b
-        F//tFO6628zc9Qf8fMXBmVzFweXcggNPcgsOHkVPleXmv4mmCgy2V0wDZgIrAlcIVnT7G/Ra4TpXV24V
-        LTN2inYMaL98Wy2pjALKOajxfOegps9J7JW3NvWeqxi2Abu3puDezGxlcAemm2CgIJ2l4gHSYuShVQAW
-        CsDiAXwbSzgOBhOAhjdy2Tked8qHQe215HKSt0noSOhhKYJjlkjgCJ214jwthp1uLoCFnRAc8xKWnZ6S
-        VicSYAFcXYADitRJq5ybjbUDWDhdDXV4P7n3eQxcEjh1fcAiL0ZC+MOi0mi7nvFcAIv33HI61OeTmesT
-        ygZ/I39PC15hAAqAEm/1B0Wli9PCcUcAltEVuATKcSzxPiYZrRsJftLVfRWAVhP8O7wbPZM0+bTC+8sJ
-        0ZfJOWnrSZuRtpEEWCZhMQ91+E1y34f9DLSz2+lhGQV90KGUPg7qAvPjPYleXV1l89afX1KevQcLDb8o
-        xHgspy/2jNPXWLiNEkHW8esGWCdteccxfQ+ZLpS201GfLiTerKQpQ+IdkmGGgBaFnGv3i6br7wDYuke0
-        3Pg30bwQ9wA8IAJsfQGg9R78fA1A6RmwJ7nr9r8Mf3sL7FP+uv0/mBcdBphCoPo7Oc+04FACVMW9Vcqp
-        QApW8SlMhdcKFxCNwxVci3XWHtE2c49onrolqze5XOUYUm8DsNpZMqRVRLiyQ2NTu99qJsXj1ayhSXWq
-        jO7AKIQg1QEWHnziKo+7q9MbdhTkDdBTZaNJ4wA0Hv+WnK7UmWnfJBQGo2HJwEbSwzxc6tMyUIaF6Tox
-        7DSzvr6BzQg73yVPEbYHWGhkIHOHLqenpFVnAJY0RRgm16e83gRLO/jgQKlyvGzl0rQwXHspzY4IBjUX
-        DGo/ECBQSROBA4FfNU2lkfSbRZMnkDJFSGJQPMG7pEEvOQ8pH2zzWeUD9886qEXkS4MDafJEXQ2w0NCr
-        BPXbrodYK2Bxrth/8p7w05i+Mj/ZyHOEXhjy8iOVD+sX6096ZpPLHIRjod8Rqj6Df6suX1RowEI4IJCg
-        1g6x74NyY/nb4IT2h3Cd6m03BO0R21twJ81CVRj/xAvhFxLqX2mYd5b9ktKsg1rhWQu+QLOJC72a6GVL
-        zAeeXUjf6A6PooepCvtVTDv5/pH03IEmelhh5PA1/N7urfvameXUkNJKylpEjN9y+hv3FAvVWQfCapXl
-        ouW9rJM23+e8cr9om7y5LSaLrpOV6s3CDaKpNysJtKSpQ4x7UsAWQhAAEQ/QxV93EIDpNgJfphswhusu
-        0VQB/664HX4HIAV/T/FQyYZAlQxVJICdeqywDEqwInCFYCXtLYjlt111ULReuetjy9TNWXVwucheXneK
-        c/CSiHNI87f9hq0QHdD42luWIdlKALAc3tqspo0KqSLh1lPhLeoTqVNUPnzYkWHnBx0LPLAwyO+DwX8V
-        /H4J/LsKBoXqZIMHsMboCVRzA26NB8liPAic/3ZyZ0QebFdgLz0sa0Hee8z+RJjhSdmDr6nFAGBsA14b
-        uQ7FOWjSwBg+BoP/k9ghwjWshA6jEToc9esTwrXQUd3sHLroZzR5omwAC6cvIa+3DX9ZljHItzMAC68H
-        8l2M16d23fC3aqij5VBHxxM6WQQBKBv8vVH1PDADtAlMVxkcbjk78GtI5w01UJYGOwB9d/AVyO8AD20O
-        8mhOd0/i6XurU+JfMFA8HVxhPmSghrYJ/z/AucPLDJ4gtN/UPNCkfCJ1Rm9lEU2eCM7vcoAlwUD0y/YC
-        /6F+NQEWlLNBgofE/PA8bLNGT/hFsBt5ITjQ7AnYis5ZbOU9gQH4fMBxh+P3FsCq7fwgnBvDdvQYAjHN
-        Kq5CAhZ6NyGd96T6lMsjlQk9q7TPOmB0habiFGKRsNiK18W5I4Oh/m+FMr2mBh74f2x30P5m0qxSZHRV
-        NqvWJRi2J9pfPc97Qtuh3lvxGZTbYiYDWK2D82bTbNo0cuSPIA0yBarMi177a8l9mqw/li76FVzP28nj
-        AwXmlzjXwv+khxZODm/NdvRIqA2k7Vu9NNj6Y8cA0mp4V+x/abK6Ch9k68RN9Thd6Lh8ZwJkpfVmEdCS
-        QKYNtFS8WgmwJRsFJRmawEhwutLkY+Rz5DTkNGWgI2AF+SaAlbQyO4m1wjLP2CHFW03f8XfjpI0JnaCe
-        cg5vnlo8tOXN/iNWi85BTXRLnMyLiiYbib/y1n1oK63p9PXGAHJWpr7ZUPgQIn/DDk6t49Mi6GgqLeWJ
-        b2rYkcMDelRtYEwnHKQ5T+SodK6irDhICKF59LA2kS8Zg48lDoBo9M1NiKxXTmfmKhxA2gMsNEtZI8aI
-        VdDTVAWdYIcDVjY6fUjg11CO75V1Tz2eb9FDshZAbFgNfKQ2F30Cv27LZjo1k8zC4t9Cmp/TMqbkA/X6
-        DMDb+b3yjIHsioCFRuIc3YEWepqqtAAWHGuCe/ND8rOH59AXsSrn0BbVQVoWPGt/hTS+Ur0n6HXzBC+l
-        h8ZVSMCCZ22xWt9HX8g+gvsyjB6qKhvAB7zALUUPaHIaGAYBPz8pKl2UMlXLuRabIf3UusS2g23TE96t
-        R7+bLGNpwAIA9i32Kcp8sV/i3JUL6WEJgnvSkOKxhHIjfPIDbtF9sW5VOb01fy4uw7WPcDFR9UG1PXP6
-        YmK/Qcvx53uQzkync/KPafK6ynzZupG2KVv/QbxZUwCuSFyWYspQAVoIL2Q5B+rRIpAlg5YqbKFROFJC
-        VyZTHo/ny2lBumQ7HzkvmjfxrFGwMl0pldM254BonbHre8vlW2/Wu1HKcgxr9TmHtzzQb+RqkWzmPBDu
-        dbkEV/Z21rxKtv6DVmKA+0006U4T78MYgMix5AdO+jomfN/p5TN0+SoEIQryOYoPZkI+BLoyA4dSeKx0
-        TlsaUmcd/qyXP/UTYYM7MDwVrvD6AGCE8DJ6WN5KB1i0bIn/F8Kf4uBPT01RVwWsIm+glxpgwSD0Dr7l
-        0sPalQQ+4X8lD7LSoBl9DgctemhegjyuVR08CQxE7tb6iXo6dRXASoYQcp+E6HcYf0NPTZE2wArUqr6I
-        SW11CT2sXZFwBPSGKMqKJnlEgo/Sw+IqFGDhdCe05/dIULmiHHj90Da/6zsgkDU8wHk71Z5/BBejJ5yy
-        LBPc74Z0dQn5Z4TifAUv1Ncn5y31S5Gvk5cgwa9J4W/HSVtSHI/n865gx+5hbBdqVvYbtEJ1QNVi6N1A
-        0HKUNT1qL28cTJPXVbaxa/7HOmnTMvvU7aLjit3q3qwE0Gr72pAAzkwKWgmwJUFRAnApDD1Rsqn9PeH8
-        FKiSwUryrMlgZZm5mwSyW6/YcZ956ibVr5TylWVovdExfOnGkhHLxX4jVorOwY2iY1BMdJYDYBHvlfp9
-        TGcl5S34859Ob4suHXw+gsFhodrbCeetOopvO/QwXQSd2fbkTgg7WuhwX8rmZcLpbP4xHPtKsqtaGiCC
-        qnEA8PeUjk9y+4ff1NO1nQ6wYJB8JnkgwcBeuI5qemqKejpgwdv5tIRBnRhAibf6OMZl0cPylIj35DE6
-        EMdNmjqLfIbT4vTAvNUVAIu8ILlDz0E6x+TfoZF6dge20FNTlC1g0Q9LXk1+9uj9f1fr2lbQ/velvPhg
-        uxIix5O/aisYYLkDg9WmqMmzpzGuiC5t81XyiyqmD8/zPfQwIvywB/72ZjLYSSEEodf0eqlNJykuMfRo
-        cv2TduCq3EoPA1WcDO3jkWTvHDkPQyry9DBrFn6J4/DVvyoFvGcf7JzOige2iLjlirO8aYvNX5v3NIaa
-        rBM3CrZJW+5zXLFXdEzfKdoQsmgAfNu0IRhOwaERuJG8WiYCWkmwpQQu2YiXK40lH6tIR4KqHSQfkh/k
-        K8dZWWbsArC6TbRcsfNNAMF2A4dz0RljWn7pGLnsFueI1i/7jV4jOocuicMV8V7lAFe49hUA9HGbp7rd
-        NXs6QvCgPJTcyZD/Z/gaL1fhujepb97S9ALnqfTTw9IK4x6Sy4qDAXRqP6DLnR4WF8b5wCCV8mUcdiRG
-        V7CBHqaL1AALBwEYfCaA3S9dt1xmHCyi36RbM6enAxa0uf3JnbsE2sHn6SF5C+sWyvWdsqxo0uAZ1M1z
-        ieoKgIXXxXtC15C2oywLPh84kKdZ1ypbwCLrXWFdprwskPqso4dlLXh5Gyo9y8np4fItgQSPT8EAK/na
-        0cj1R49rWRhYFrTf7cntmjy7nuAXuM4bPewkrrTyz1KfpHLt7soF9LCCivMGHFCGpJkL2m5Lgz48xuAK
-        zkquHzwez+M8gWKSUEfL4q2ywAD6gdavCtOar17sN2S56BzY9HXxoKZA8ufhesl62ebx1slbnnFeCaB1
-        xW6ALACsDB6tZNhq82xJwCXHbMVjt9KY8ri4l4oAlQRVBKgoVBGwavNYfQxwdbPhitUFWQXdMbp1vGPU
-        slf6nbdedJ67FOCqqc1zFYcrMA1Tg+iZxPXS7EJN3quY6yHoNP8XB+7Eh4x2mp5A1i7/7AVvRO7A08le
-        BcwPBoZN9KC0grfeHVLZlOfiFzCB/fSQBMFAXioNWiqDgic4iR6mi6AeUwCL/B/eknGhxOSgfNKZukIr
-        6ekJ6smAJX3wEHpLGmCU9YF1FUrradEqnBpWHcBxAMxyAdBslRawvIGsZx9gEH4pP8DCwTk4A+6FgXzw
-        obhHWLfwN9VP8bMFLGiTFyW3bzSsY6xreljWIsHl7tBnau0AypqwZmGhAAuu6bZkICL3wB18neO0e2fg
-        /MmpdYRtoUY0DGj7whXvUzK44HF4jbgjBD2s4IJ+86bkqUK8n9CGHiwqDXKq9weOh/J3CASmFUKW09/4
-        Ak4XShs8qw+42RrG9zjhwvoPWyk6By15o3jQEl0HB1m4RL9t8uax1qlbHsQgeOeMfaJt2jYJshSgJXm1
-        AHiSYEsJXJJJoJQIXwqjf2s7HoymoYQqskHz7P2ifc5B0TJ92xvWy7cvskzaXpDBxjZi+dmOUcsPl5y3
-        ViwetVJ0DAOwQrga0gh1Tz1X8tSgBrhCsII2cdTuq00J4uws4YKc0gOkAiDu0A24r2KuRrNIEa61pfZW
-        BD+/MvhCv6eHpch0dvAP0MF+k/LGhR2CO1hGD0sQ/H5KcgcqdXi1ZFBQK3c2hlub0CzikjrNxM4V/4/b
-        8ODfAVj/riwLDmJwLT/gV0kkAYV6MmAhAEDbSgnupW2uTq2+szWaBZFRCFyVMohReND77VsdsDBIOjiR
-        K6/+HU5HpjNs80V+/HAj9Hq+gAWwRGIZ4R5tTrx2LA+BzRQvcdaA5QktSm7fEsSFfyjyBTl6mCZBOR+T
-        rqMtTQmKE8GpEICF02QS1CaFG8B9hGu9jR6mSZw3nMYzBdDoCk2lh+HzXZ/SB5LnKPgp2WJMIWzXuBAr
-        PjdGb7QoG8PV/7PZNgohEtruU6l9ZAj6m9B7iX0t1g15Ru8r9G4oWQkryumPLcXA92y30clo0PBwUC8e
-        3CL2G75CLB7SfJ9jSFPCgnd6ynLZBp9t8pY11imbPnNeuU90XLlXtF1OYUsxfajq2VIahSUZnJQm/03t
-        PAtC1ay9AFWHII9tP4Adtk3fMQGn7WgRdZVlVFMvx+jlK5yjoW7PWyM6hjcTuHIkwFVb3FW2Qe14//Hr
-        0mJ/4/2F3OQ7F8EbDFn7SvkQESMdWfBDeJhe1WyeMPwMvoIPOs0mQfyZi34DHevHKW9G2OG4g3PoYSmC
-        cxYkd0pk0MAtaCrUt8XB5RSSz5EMrg8/zVcrf3smRF+Fzueh5K8/oXyqgGV0Bch+aUXuxWeRGAsFWEhQ
-        EdhFElCoJwMW1GEpjYGLp0EM2hwMMB+n1Hc25gGD+2L2RvrRbABCQuGUQUyqx6N4HfQwXQRtKQmwJIN6
-        +QrK9xn8/fP0Bn/3hPDnD8pzcwIsd5B8BYbnwPkJX4qR59wdeCR5cNTgwWpJqU+AHqjPT5TTX1oE5U2p
-        N+pBekUZk1kIwMIPKeD8D1P7IXzugjntV2vxVsPzETqaAiZQb0YhFP+gCe5r6lQi9A3w+5cxzpQeRoQf
-        7kAdvw/t+3toT8eyMUjrezjnfppERplLK/vxQhU808oyozctsV7w/3DM11nvr9lRcvjqSgG07sVlGMhX
-        hiqDcNZGIQsH+ZJhy8WSoa0IWutsgxoKtiSBY+KG31umbLnUOnnzbuuUzZ/i9KFz5n4Arj2ibfp2AK0t
-        EmylAJdsAExZmOXKHWRhUPvsA8Qs07d+B/awZfr2CsvlW1Pe8vWS5eLIz+1jli+wj17xWclfN4jOEQDD
-        w+E+DQNL57nC+6B2fxQmfRG6QoR7/5bT14BvL2n3xuss4YagyVAQf6DggSMrbGs0M3R8JngYi86R9iJU
-        E3SgdclfApIBwx14Wm0PQRrcnvq2STr89FN90NmlvCnKhh2GWvnbM2lKMvR58psmdGhppgiD4+khcExg
-        U/JgJnk6Elcg78mAxZOpu0Q4iKcF6arVebvmx0UfYcDytS1kKgFB4v2QBo3g5zaVr03zkRookPzgehAM
-        2rWkAVk+N1fAQhk9gSj59F6RJtYHLktBDyHKHrCCa9TqE+99rstcwLkrVe8RAIVyY/NCABau0wf5fE7S
-        VeRP61FzTBkK2xW0O9WXR7iX8ZhP+PcdyYHjUt+G/V8iACNgYTmlfgK93u0btkXo21O+xkwn6Jcqk6cK
-        k41cgysxNq5LySHUT3T6Gl+nyzCoDsrtmR1/UsjCwd45qFHsf+4q0Tm05V/Fw5cuLPSedtzktb+zT9o8
-        wjp5U61t8qb7wT6xXb5ddMzYR6CLgNeMvaJ9xm7RfuUu0XblTtF2BYATGv4bf4d/mwnHzIZjZx8EA6CC
-        3wGgfQNw9ox12tZVtsu3TbRM26XrDuVqso1pPd9+3oojJRdsFB2jV4iOc5up5yoZrsAUcEXuQ1qrl1bo
-        9zd+4/TGwiVZbFfRWeJcocuSO7h8DR9w6LQTtspJFvwd19P5XunNwcGCdCIqW2bA3/zJnjay1Y4nmPHr
-        JYMruEz368NBJcutcsj/FYDFu6r6QP18q+zUsTOEcxO+MurJgMWVBkemA6ycDaEAyqEE1bSA5Q59ls0W
-        MloE91gVsPIxrON8AEtaQDP8AV0ok5j0EhN8QRlflC1gwXmbU70ueO+D7+a63AXvCsbU7hGk+anSK1YI
-        wML4U2wLaoAFbaeeHqZJTmfwl1Cf75J2lpAm9gOh5fQwzYAFz1wKtGUy6T4nbpWTSeQjC3foWdXZDDCp
-        ToKH6OFdV/yZVb9x+hsqHb7Y12RRUh8M2KqDdDumgCz0rBQPaRb7j1wjOoctfcUxfMk4ml3BZZ+w+RTH
-        5K1/sU7aeIl18oaAdeqmNZYpm+60Ttn0lHXy5lfg5z/A3rNO3fwh/HzDMnXTa/D356xTNv/dOnXLVji+
-        1j5t63TbtE1ljunbTj9J7Ji5XfuY1v6O81cdKP7rOtF53mrRPgKgisCV5LlKjLlqg6v2VmrH5ReKy1oA
-        oJt2OIXagnnd9JLRFbw0uYNrM6mj1WroveKhI2xviQd8YJNXFJYGibaOSBbp3JPKSdfPupUeoirOFaxJ
-        GDyURgcSrYYdIQDFh7kAFop4FhLeFgEssWNztwVE92TAMgr49Vg6wMrtnuAgSeDc07ZukdEdXpp8PyRP
-        UfAb3hM5nR6mi+Aep/FgoYcKnocsLLk+8LryASwU7w7NTPYUk8FSEQ+ULWDBfV+fUp9Q7nw8WPisp0nz
-        k97li0+hhxXIg1WtuwfLfvbiU+DZ/Ui6n8o0ST8Q/3IVjrlTHbCCz5+UtIYjgibU/Vdk8VGA5VRLBS+t
-        gIWi6119g/demRamD7/7MJuYri4ju1DHO/2xzbjZb87xWQmQFSMwUDJ8mYiLYDrPXXqXbWjL2TS7TpFz
-        cvOPnZNbfsZftvk3CGKWq9f8/LTxK9vd/LKQso1Zcqr9/BWNjvNW/FB8wXrRPhLqPgGuAKzSTAtmgitp
-        3TLcV7LxCaevIePKv11J0GGNSPfWApYQE5KtSQ9oZg8WCjrRYdKg1NZp0s4iIdAToQJ+97VyGkX6d/jr
-        9h56GGBuSgtYZMsXtd9nNiwjdJA5ebBQqp4FuAdw/hPy22tPBqwiIXSOdJ/VACu3NkeggAwEbR4s+H1t
-        8r2n5YY81Pe8y1Vwj9PEYAW/gLw+hDr7OL2FPgLD2LPvlediWfMFLFynCPJ4UTpWOo6utfQmLrJJjskW
-        sFyh1pT6BDiBsuceg+UJ7lD1irmD71gsV/+cHpYBsMJ/o4doFj6/WO+pgEWeu5xisMjHCu5gyirpWG+8
-        JxRf9w6uL2UNMHrdCVOjKPS2Gt2BZ6Gcb0HaqeYJfaBMBy0XwEIZ3ZXbU156/fhVZ+Aqekj3UrGvoczp
-        b3xICoJuUh28MxqFLGc5GIUs52AY7EeuEovPbRWdI1pbHaNiur6tdUehC9Q2ZsUc+5iVH5RchNOBywCu
-        WtThanD204Jkw25pyvd9p7d+di6f9nam4l+9KDou6aFCj0qoDhf8KxLCVi3WF/cfExZb29tJXoqrwq94
-        2jp/krfUiU+mh8FgEpqX3LHj/w2e4Fp6SFphOsnQg4OSFEgbnp7r9fURInzyl4RwLVkBFop3B2aqxcdA
-        h38R/h3SSliQtScBltFzswHOS/2KkAw4wbW53BM0vC+4BATNBiH1uuR2g0Y8BXSdH70E9zgJsKTpbs4b
-        HI8Dee+zF5+SznAALRKqToVrfy3vrwiTAAsF6Y6UytZ2LGl7rsr5+Hf0qCbUUxrAgr/dklKf5B6GcwZW
-        6GMepp6ouBEPsTv4nDIWE/cATAEsuH447jF6iGZJXxHi2mMEOONG+j5PSHVJi/aESyyQ/lRR1yRN6dm+
-        jh6GfVqq506qy2MWVzQliBz70tMGrFQ19NqSc5PqJhfAMrgCKTFxpO0IEV2XNelgVZzs8MamYTC01vgs
-        ZUwW+bptIMZlIWQ1isVDm8X+o9eiN+tjx/DWa88cHf0pzfCEknXMqmG281Y+ScDqvJUErOwjKFzReCvJ
-        ayXBlbyIaOZV2nHvSLLswjGHv7HeOaA6vrFxdxIGeuLAnfrGRTqEgm7XgIIO7prkTlvy5gQekI4gq3E/
-        lwBhOAB4q0VTFuvF4Krg0qCV3OFhnuEOWgcrFbBwORT4/QvK66L/fhn/DgPrRmVaPQmwcPV8uPa3pYFI
-        UVcSYO2kh+UthNXkaRiSD9x7bHf0MF2kDlhwP72VQ+gh7Qrued7rYKkBFgru2T3K8mHd857IR/jiCS8a
-        iV/apgEsgxC4OHktNzSsY6MQHE0Py1r4FS6UKyW2iN6zA/QwIlz0E4xCCD2OgFjoxXRfEGcjOD91HSz0
-        LLsDb7b3gqgmgNUJanVE8nC1rb1mdOGSF0mwSo8zurTVJS45ohdgwf1I+ZBBqp9wh4UdFUz4BYKjrLHK
-        4Yt9J20arSE+i0IW2RcPp7UoZOFUV/HwpWK/MWtFx7lLjxSPWHoeza7HyzK61Wo7b9UO5wUAmX9dK9pH
-        LVXxWqXCFVlENANcydO6AFf7HN7a+Gfh3VUwqD2qHOjRpI4+8Fqh9nSURQJNcU86JeARgKoSrQMiZxhK
-        K/ulDCTYCbkD99IkMgo9BNBZ/itlGgA7DXdwNz1MF0HnlDVgoYhnAdpY8iCJYMC5Qkt6KmCh1AY2aaAN
-        fthrYOIUSa5qW3m8raxoBAh0DthNC1gAQvSQjNJnJff0gIXxNQQcFHWBcYBGIXQVDMSJHuI0gIVT/pif
-        8t6jSe1U+6LERa5wefI1SOmR6wjRw4iKyqJG+F1Su0MQCr6dj+MA2mFlcowauX64D7hGID0sa0G7So1T
-        I2UOJ4RM4LOvFppB67KVHpaVeHfln0geDLCyk80bdTj8sV0YME33rMvKyLpMUBnEm4WQEJ8yBNACiCgZ
-        uUIsGb1aLB6x7IB9xJIOWy22o2Ub2fQ/9vNXRh3nrzhafOEGAKtW6rWSwUryWqlNCbZ5rcCS1rkCoJKn
-        A5+Duu4xoCqtF5T6iS7pAEqzGyDyEXQEy5Pf5qSHPHwrdKBNag+8lrc86EQPpQzm0CEBtHzT21XZhx6W
-        t6Bz0gRYKHjjvVsZ84CDBgy0z8O/DyunLnocYMHAnnzP0bC+jK7KeAB2PkIPBID4P5XQQowMRtHvYJDT
-        LQ4L7nGXBiyUNPi31Tl5qZHieHYlTJOlASxp/7rg81K+9FhMh4Bx+INe/bUFugP0bU1+XtCw3zEIwYH0
-        MCJ0PsDfPueFNm8XbYPf4h6A9DDNUt+6S26H2kDHcFbo91CmxJdFMOJp8wRfUr6sYuwo9HspsVpYl7wn
-        /BF+DEcPbVcMsHIUDOrDMWi638DlWcdnJUAWmTIEcFB4s5wAFghZjhGtx5zntjY4RzZ3y6ktVY0c+SPb
-        mOXTAKzeKrlok+gYvVwCK/RaIVhl8Folw5VyEVFFnNWnDn/DfKdz0c9ojj1CxMWMnaTiAUXDjgEe3Nd7
-        D7jlNHpoQWQujfRLyR8HFwAK6NC/VnZ+tLN6WUusGy70qTqYkzfI8OFTz5yty9Q5lFczYElf7iR6FpI9
-        Lmg9DbAMrpo/Qt2nLMiIdQFpf2g6ezFPD81LkGZKYDYaeXkQwn9DsKGH5qXuAFh476BtfaP05irvY9zS
-        ABYKynOj2npJBEg0LG1gKL11oMlbfTy1z5G8UspYOpQULxVWWQcP88192xbpIwDcPD4JGrFevFXfFZ2z
-        +Cx6aLsCoFmX/PyjEU+hJxClh8UFfzuc/OKHRutyFT2sXTHAykM4kDj9jXMwiFoa5AECFEClakmQRbxZ
-        CFloCFlow1vEfmPWic4Ry951jFg2s9BTQYWWbdTSMsd5Kx9Ej5XzvFXxOKvk5ReI1wrBSv5KEOskOd4q
-        Dlf1Iu4niZ4rqP9WOwwKNLseJ+jUDqQOREFpIPJE/sl5I+OTF9bUUwB5CdvIoGGnkTwAYBmh89H0RQvZ
-        +w53rk/qnEl6JM/owzC4DZO/qspVuQAWCjr4BM+CZIkDT08DLBTUC3TmyYM1tDm8T0L0fc4duRzXAKKH
-        5yTeHfkTGbSTBnI0cu+90Xt5T2SA2tZHWgTX0uUBCwXPWTAVkJLqJgNgceW3/g7+/i/yQqQ4B5dlwb4C
-        IOhGfNGlh6vK5A2XQ3v+jExZKtJAs5Q34TXfSA9NkAQwSc8JtkMhehTu84xc+ydOCF6hBo1SO6x61yiE
-        3PRQVeGK83D9VVLsWOpzC+U7prarBfRjF6U+92hh8vJnFMLrOU91u15Wi2uxkTyPDLByl6W07v8c/lgT
-        DPQ/YHB1NvFZSm+WtJRDWwA8AYyhTWLxiFYKWq2PA3R1m+UFZFlGtRid569c7zx/tViMcVYjl7YFsKtN
-        B+J1x71WUCcKr5VySpDEWWEQu6/xTpsv1qnLXXSEMIgU3myPJ8cqSQMers5OvD34OfBh6ACXwmAQhL/d
-        Cp3E4hQTQpX4N7NQm/Wn2/CGd2Hyg51stFP/NJdFImFgGSfFWqQOtPgVE4WvN6FT2g/WqHpd1KAzq4Sf
-        1515ZmLsR66ART0LCctQJFtPBCyzJ9wbBoWviQdPca3Y5jBN7NhhwP4Y2tu9nDu8DOoxlLbNgeF9UZsu
-        gr9tww1qMd3EfPDe18nlP2IUgjCgBSOZ8kCDZySAe8PR5Im6C2BZzg78Go59P7XOFZYBsFBQpqsRhFLP
-        k1YQh/MfBWiZhV8omwZET8MvJE1ChDcJ4THwt01Y31L+ifdDup7QW39M2oJKFrS7MjrYJ5yHZaWB8e+D
-        HSZthdzH0C0p9w6fXVfoevzQgibbth8feXaVZZJgH845znvCG3hP8Dz4nQmvB59DrrTyz7wQmgnX/SQJ
-        bFeBeKwngydQS7NKEH5FDX0NnKtsN21Gr/U7aBcPQPmWQR+Z0ueS/3tCK5PrhAFWjsK97Jz+2EH0rCAE
-        KIFKzRKnDOFncmwWenNIfNZKsWTUStF5butOx5AlNppdl5Xt3Jpf2ccsv9UxZsWXJRdsEB0YZ4VQpeax
-        UkwHxmOtCFxJ9YJeK3lKUI6zcvhirwDMjqXZnRDiXMH5pONU6SjQsGPEAQkfwEyGaWBckdlTlXU7+t3Q
-        RT+DPN5UDjDJhoAEnUpOKyyjYGDYqDowEINBBTp97KhxoFK7LtksA5sRdr4zeBs0b5WTTkZXMCBBgLJM
-        bdYTAQsFA8QkrG9lekpD4G9rcxnuC7QNvC8mT8RDk47LgoOhEPlA8samQha2dxxIpbQy33v8u3VQi8iX
-        JsYIdRfAQnEqm60nWDuAhYJ63GkpX6J6PpYL64q8MLiD38Kx38DvfyD3EetI5V6TZw9fctpZPgPa3u1q
-        3iYpDWX/pH4fsY3gsae7wv9LkyTCRZGhrX2q1kawLrDc9G/H6fWQTecxTfpylmL0he7x5OlOpXDvTLj2
-        Y2rePDTMW67PdCaVK/E8Blh5yu6Lnefwx46QaUOAgmSwUlp8KQeoKAm0krxZcY/WErHf6DW4rMO3zhFL
-        IyVDW7rkFi/2kcsvdYxe9jpub+MctTwxeD0TWFGvVXw6EA3AitQPxlkNhLr0xr4EgL0x15WJu7ugQ2zC
-        Dgw7K+VDpsWkwbL9hUaTBfB0U1rIIGlGvjfluGs/6tQzoz+FN9HbLAOX0DKq5JOFEaDIY6FRNZFP1j3h
-        99J11j0VsFCcK0DWV8oE1+0aQgGUI3lPR1n8gMAA3lf9WfL90W4ITtUi7wokbLLfnQCLeE48oSPJ60/F
-        LQvAwg8I4HncgS8sab1hJB1pn8VMzxt6x+HeHYc6vZgmn1YYHA7pvZkREDOY9OwGP1abekaPFOetfpf0
-        QVB21fPhOuRrSncM/l56UY0+WSTceipNPq2M7sqLELDS3o8cjAGWDnI6W35W7Itd5/TFPiFw0E58luTN
-        AqNwIYNWPD6LglbxsBa6flbrm8UjWuMLPna2nKOWDbCPXn5PyfnrROeYlQqoUgMrCo7pwArqQfZa4ZIL
-        ZBNuX8Nam8pc+Ykmzh2eAx3R5wha1EWOD1jCQ5fJpOO1AxZuXwIgRd4Mk9MkLngYxOihOev08hn/znkj
-        Ndih4xsmGRwydP5qJnXS+gIWCj0LljQDB9ZJTwUsFO6JCel8gIMbDg5a2xwZzDMAFoobcKuTF6oewfuO
-        b/3Ka8jeuj9goQxkw21leRVGwCgzYMmCZ/YaqNP3JUCW75tKmkmGxxFvE8KMt+q55PrMJOM5lUVwzoOk
-        f9J4H6VnVx2wUDjFDLCzGfsFvCYJHrNph1L7k+sB4HMNTsfSZNuVoTQ4EM5/3QxgRl6y0sFblkbKwABL
-        H1m81b2K/bHlTn8TCcpOBiulobcmGbQIfKiAFtl2ZxTxaD1oH9rop9l1uKzD6s9wjGxd4Ry1QiwZs6Zt
-        CjAZqpLACle2JwCJYJU0HYj1gFBFNmX2xe4r9tenTC2cyMIYE+g4K+Et7Fl42L/DBxYfNHz4sBPJZDh1
-        gMfhOkQ0uawFYLbVNmRFUnpNInqdDCrTP7kKBw/omJvh+l6DzuM46eyzvb5BLQgUx5KnCA3u0Dz70JUJ
-        x+L/odOaQg/JKCkmI/iCdVBrQhpolvJm0tn36uT9wHr5bu6LA7N0j2nZpPo4erqGAUVN+LZvEqILAXif
-        hHvyrZY2hwM1lkNtilApDEg2CVVT4N4/AHl8R+57NunHrVG0Dl4q8qWVg2iSRABCd9sT2i0etwwGyrbF
-        JTOJLCnhCX2MactpYB1j+YpUVvbGdDF9zEc+3j50FQJWwvpRmQTt8h7b4OXx8+OGdYnTf67gmfTQjDIL
-        i38LcHANwNZjcO+OJUyzw79Tni34N3qj4dl7GI6/4nfOyZq/ysb7CC9Kl8OLx6NSntk9v9hGEIaSpwiT
-        RbfmWQJl/IcEW3K6ydckpUuh6mNOqNpkFKoyBsWnE3/mot9w3mgF5HkEoTGb60lnpO25gy/RpLMWAOau
-        lD4M2jWAVpdxtHSaHO66Uqc/dncJbruTRXyW8mtDYsqpQwJaEmz1G7FSLDkX0hzWstEytCXlYS+UcO7a
-        Obx1QfHIZZ/2O28dgF4LBSoFVJEvAsEQqmSwAouDlXxt8EDE46x8MWnZBX/jP4u9TazhZNLIkT8yemoM
-        0BmXwQAwweAOzwUIutUohBOCR5XG079pCXKXhV4vs68ezm9Ln/dVLza4g3PpIboKt5qwCGEr544Mxk4E
-        rm2+lG+m64viz+uSFzjEhQmhQ0o4Fv+PHxDQQ9oVTlMkp4FG8vQEbzzDG/wlPbRTxJfBIAD3X77Hctmw
-        3nJZ+TqdzJ663hiPA+3sEqMnfDXnCt2Sqc3h37AcWtZEwnYNLw8jwGbBYHRzxvTjBvlAe0wOcuc9obFS
-        u1UeV4v1ktVaW2QZAiF0FaYtp4F1DG3yFrWPOjBdTF/ZTrHd4LpO9JB21UdYzJvLEp81YqQuw4sxmJse
-        mrUsZVEjgNZ5uAcogEwrpLcd+o5DUL+74D6uxPThxe1iDHqnp+Qtk6+GA9gaDNcxBerlWmyf6e4lbasV
-        yiD3TCJfIPuqzuQ90Wn4pSCcuxaewz1wXw6CbQG4awSwmo9fRiJo0tPyE7QFc1mVzeytGsV5ArNxpf3s
-        2mabkbbnDl1OU8xa0Iedl9KHQbvW0of1eGFwtsPX+HI28VlokkdLBbRoMDzxbAHE9B+xGiHrS7CbMcic
-        ZlcQOYYtvcB57tIXcAV63FMx0UuFRoGKQpU8DZgKVtKaViTOylsve6y+cfgaQoVcdoCJiYmJiYmpBwp3
-        5MZgbQCsL8i2Oz6AjSSwSjECWmgyaCnitHC6bVCDWDykWQKtoS2vwr+zii3RouJhTWc6hy89hJtVl4wA
-        QFQCVRyq2sBPCVXkK0kKVUqPFRquiF9c3gzXGNtqz2JtESYmJiYmJiamtLJ4agwAWesx3giDuROAKp0h
-        mMherThs0SBxCjQlQ5eK/YavFB1DltzjGNhYSrPLWbbBS04tHrq0EcDth34jVgFEAVQle6iUQEWhqi22
-        Cg3LTMtOrwVXwCeA6W98BOAqIW6CiYmJiYmJiSkvOYQGn8MfewBhg3wxpwSqTBb3aoEhyMhGvVv9hi4X
-        iwc3AwQ1reg3pLoXzS5r4VYFzkHNc4qHNH+AnjEEK/SUyUAVD1SPAxWYshwyUCmgCk2Os3L4Gt9xeGMz
-        uvtK9UxMTExMTExdWHZvw2QM7ibxWQAhSihpz8iUWxy42iDHWQ4wM3QFwNCST+wDGxdkWlhNKfugxnOL
-        By15qv/wVQTSEKKkBUCVpoApAlRoUjmUU4BthnFWrXBM7JjDF6vjBlT3nL0WmZiYmJiYmLqu8PNyp68h
-        5PTHvsk6PivZZMChwGUHc5Y3EdAqLm86UlweO49mlyKbv8buGNi4q2Rwq1gyeGkiQCWAFJqUfnqgarPi
-        shYyDer0xvYWe+qKaXZMTExMTExMTB2nYm+DxeGLbS8uRzBpUYUWzQYQhMHkxQMRnGJ32n21l9q8dQ4L
-        5GX11Qyz+euXO/yxoyWDMS6KApQMT8mmlr6KSXFW5IvJp4v9DVkt7MfExMTExMTEVFDZvLVDnP7Y4wgp
-        CCtqEKPd6gm0kY2p6QrzCF7SBsrS//M1TIfEWfkbP7R7Y9fouQ4PExMTExMTE1PewiBwp7fhSqev8V1p
-        2x1t8VmZDEFIgqr6lL/lZgBvBNQaRae3scXkq+3U1a2ZmJiYmJiYmDKqnyv8vxgc7vQ3HiPeJ92gSB/D
-        FeqlcjXc4fDU/YUWm4mJiYmJiYmp66u4rK4YIGsfBo2XlOkUn5WHQVnk7W1eBAC8gBaTiYmJiYmJian7
-        yeltGOX0NT6rb3xW9kbirCBvhz/2GYDVQs4Vy2oPKSYmJiYmJiamLi0MHncK9XOd/saPpPWz9AlSb8/I
-        kgtlAHX+htVOT11vWhwmJiYmJiYmpp4j04DoaQ5vYwuA1vFCxmeRbX1wU2Zv49/sQp2bZs/ExMTExMTE
-        1HOFweUOf+MdCFkYdK4GSbmYtL3NCvw68DWnr+FSmh0TExMTExMT04kjuzd2kdMfe4kGn6tCU1bmw+1t
-        cEX52FdOX9Niy9mBX9MsmJiYmJiYmJhOPBn+Evovh6/hBqev8fNc4rMwzgq9YABqm+1CHU+TZWJiYmJi
-        YmJisnirewFkrXD6YscRtDCOSn1x0Xri7cLpxZJyXCw09pDTGyunyTAxMTExMTExMSULN1l2+mM1AE4v
-        4tSfvF2OBFRL6VIP9R86vLFtbN9AJiYmJiYmJiYN4riFP8HNpO1ljefaffWT7ELNFIe34UIMkO/nbfh/
-        9DAmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYm
-        JiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYm
-        JiYmJiYmJiYmJiYmJiYmJiYmJqacdNJJ/x9kf0SNN9RY1wAAAABJRU5ErkJggg==
-</value>
-  </data>
-</root>
\ No newline at end of file
diff --git a/02-desktop/Desktop/IStation.Test/Program.cs b/02-desktop/Desktop/IStation.Test/Program.cs
index fa0a2cc..1ca80d8 100644
--- a/02-desktop/Desktop/IStation.Test/Program.cs
+++ b/02-desktop/Desktop/IStation.Test/Program.cs
@@ -23,13 +23,13 @@
 
             // AnalysisDeviation(); // 6 鍒嗘瀽娉甸璋辩郴鏁�
 
-            // 7 
+            // 7 AnalysisHelper
             // Station2TotalFlowDiffHelper.Start();// 8 C# 瀵煎嚭鏁版嵁 琛ュ叏娴侀噺鍋忓樊 + python
 
 
             //test
 
-            StationTotalFlowPressureHelper.Start();
+            //StationTotalFlowPressureHelper.Start();
             Console.WriteLine();
             Console.WriteLine("ok");
             Console.ReadKey();
diff --git a/02-desktop/Desktop/IStation.Test/Station1Helper.cs b/02-desktop/Desktop/IStation.Test/Station1Helper.cs
index 87100bc..153b6a2 100644
--- a/02-desktop/Desktop/IStation.Test/Station1Helper.cs
+++ b/02-desktop/Desktop/IStation.Test/Station1Helper.cs
@@ -27,7 +27,6 @@
         /// </summary>
         public static void Start()
         {
-
             var projectId = 661070185922629;
             IStation.SettingsD.Project.ID = projectId;
             var monitorDataSourcesId = 663976941449285;//2024-202504
@@ -73,8 +72,6 @@
             foreach (var item in pump_model_mapping_list)
             {
                 var flag = item.Flag;
-                 
-
                 if (EpanetMethods.ENgetlinkindex(item.PumpId, out int pump_index) != ErrorCode.Ok)
                     throw new Exception($"ENgetlinkindex锛歿err}");
 
diff --git a/02-desktop/IStation.Desktop.Ch.sln b/02-desktop/IStation.Desktop.Ch.sln
index 284ad88..ca9b9f1 100644
--- a/02-desktop/IStation.Desktop.Ch.sln
+++ b/02-desktop/IStation.Desktop.Ch.sln
@@ -101,12 +101,11 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IStation.Desktop.Ch2", "Desktop\IStation.Desktop.Ch2\IStation.Desktop.Ch2.csproj", "{97F1B9B2-7E24-47A3-B0F5-494C25F31F5F}"
 EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{F2BEBFF5-AAA3-49B4-81CF-E07416F93365}"
-	ProjectSection(SolutionItems) = preProject
-		.editorconfig = .editorconfig
-	EndProjectSection
-EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IStation.Test", "Desktop\IStation.Test\IStation.Test.csproj", "{C075AE87-67FC-4006-8DB7-5D512BA3142E}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IStation.WinFrmUI.Schedule", "WinFrmUI\IStation.WinFrmUI.Schedule\IStation.WinFrmUI.Schedule.csproj", "{E996E89E-BA4C-46BF-AA08-8DFD2314045C}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WinFrmUI2", "WinFrmUI2", "{87BFA0F8-AE12-4E42-8DFD-65D26336F248}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -420,6 +419,14 @@
 		{C075AE87-67FC-4006-8DB7-5D512BA3142E}.Release|Any CPU.Build.0 = Release|Any CPU
 		{C075AE87-67FC-4006-8DB7-5D512BA3142E}.Release|x86.ActiveCfg = Release|Any CPU
 		{C075AE87-67FC-4006-8DB7-5D512BA3142E}.Release|x86.Build.0 = Release|Any CPU
+		{E996E89E-BA4C-46BF-AA08-8DFD2314045C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{E996E89E-BA4C-46BF-AA08-8DFD2314045C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{E996E89E-BA4C-46BF-AA08-8DFD2314045C}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{E996E89E-BA4C-46BF-AA08-8DFD2314045C}.Debug|x86.Build.0 = Debug|Any CPU
+		{E996E89E-BA4C-46BF-AA08-8DFD2314045C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{E996E89E-BA4C-46BF-AA08-8DFD2314045C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{E996E89E-BA4C-46BF-AA08-8DFD2314045C}.Release|x86.ActiveCfg = Release|Any CPU
+		{E996E89E-BA4C-46BF-AA08-8DFD2314045C}.Release|x86.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -462,6 +469,7 @@
 		{E7D9741F-C312-473C-A84B-F905EBA7EB0C} = {6ABBE52D-1E54-4C3D-8C49-56C3F7A7013E}
 		{27109AE7-B1D4-4EB5-9101-4470404D1861} = {0BE62CB9-1E6E-4E63-A782-7252D085A664}
 		{ADE71241-23D9-4F31-B6A0-3B11A8DD9E3C} = {47F45E59-D66B-4B5A-B705-64F9C1715548}
+		{E996E89E-BA4C-46BF-AA08-8DFD2314045C} = {87BFA0F8-AE12-4E42-8DFD-65D26336F248}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {04D92980-B7F3-4AC8-B744-D6A674322C27}
diff --git a/02-desktop/Model/IStation.Model.Basic/Equipment/paras/3-beng/Pump.cs b/02-desktop/Model/IStation.Model.Basic/Equipment/paras/3-beng/Pump.cs
index 97ab62c..5948138 100644
--- a/02-desktop/Model/IStation.Model.Basic/Equipment/paras/3-beng/Pump.cs
+++ b/02-desktop/Model/IStation.Model.Basic/Equipment/paras/3-beng/Pump.cs
@@ -1,4 +1,6 @@
-锘縰sing System;
+锘縰sing Microsoft.AspNetCore.Components;
+using System;
+using System.ComponentModel.DataAnnotations;
 
 namespace IStation.Model
 {
@@ -146,7 +148,34 @@
         /// 
         /// </summary>
         public PumpModel() { }
-
+        public PumpModel(Model.Equipment<Model.PumpModel> pump, Model.PumpCurve pumpCurve)
+        {
+            Flag = pump.SortCode;
+            Name = pump.Name;
+            if (pump.RatedParas != null)
+            {
+                Qr = pump.RatedParas.Qr;
+                Hr = pump.RatedParas.Hr;
+                Nr = pump.RatedParas.Nr;
+                Pr = pump.RatedParas.Pr;
+                Er = pump.RatedParas.Er;
+                NPSHr = pump.RatedParas.NPSHr;
+                StNumr = pump.RatedParas.StNumr;
+                Ic = pump.RatedParas.Ic;
+                Oc = pump.RatedParas.Oc;
+                IOd = pump.RatedParas.IOd;
+                IsBp = pump.RatedParas.IsBp;
+                IsSxp = pump.RatedParas.IsSxp;
+                Oc = pump.RatedParas.Oc;
+                Ic = pump.RatedParas.Ic;
+            }
+            if (pumpCurve != null)
+            {
+                CurveQH = pumpCurve.CurveInfo?.CurveQH;
+                CurveQP = pumpCurve.CurveInfo?.CurveQP;
+                CurveQE = pumpCurve.CurveInfo?.CurveQE;
+            }
+        }
         /// <summary>
         /// 
         /// </summary>
@@ -166,6 +195,9 @@
             IOd = rhs.IOd;
             IsBp = rhs.IsBp;
             IsSxp = rhs.IsSxp;
+            this.CurveQH = rhs.CurveQH;
+            this.CurveQP = rhs.CurveQP;
+            this.CurveQE = rhs.CurveQE;
         }
 
         /// <summary>
@@ -187,12 +219,23 @@
             IOd = rhs.IOd;
             IsBp = rhs.IsBp;
             IsSxp = rhs.IsSxp;
+            this.CurveQH = rhs.CurveQH;
+            this.CurveQP = rhs.CurveQP;
+            this.CurveQE = rhs.CurveQE;
+            this.Percentage = rhs.Percentage;
+            this.MachineRunStatus = rhs.MachineRunStatus;
         }
 
-        public int Flag { get; set; }   
+        /// <summary>
+        /// 娴侀噺(m鲁/h)
+        /// </summary>	
+        public int Flag { get; set; }
+
+        /// <summary>
+        /// 娴侀噺(m鲁/h)
+        /// </summary>	
         public string Name { get; set; }
-
-
+         
 
         /// <summary>
         /// 娴侀噺(m鲁/h)
@@ -263,9 +306,13 @@
         /// 鏄惁鏄弻鍚告车
         /// </summary>	 
         public bool IsSxp { get; set; }
+
+        public Model.CurveExpress CurveQH { get; set; }
+        public Model.CurveExpress CurveQP { get; set; }
+        public Model.CurveExpress CurveQE { get; set; }
+        public double Percentage { get; set; } = 125;//寤堕暱鐧惧垎姣�
+        public  eMachineRunStatus MachineRunStatus { get; set; } =  eMachineRunStatus.Open;// 鏈烘车杩愯鐘舵��  
          
-
-
         /// <summary>
         ///
         /// </summary>
@@ -278,5 +325,17 @@
         {
             return Clone();
         }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public enum eMachineRunStatus
+        {
+            [Display(Name = "鍏抽棴")]
+            Close = 0,
+
+            [Display(Name = "寮�鍚�")]
+            Open = 1
+        }
     }
 }
\ No newline at end of file
diff --git "a/02-desktop/Model/IStation.Model.Curve/\346\233\262\347\272\277\350\241\250\350\276\276\345\274\217/CurveExpress.cs" "b/02-desktop/Model/IStation.Model.Curve/\346\233\262\347\272\277\350\241\250\350\276\276\345\274\217/CurveExpress.cs"
index 7b8dce5..8a1d6da 100644
--- "a/02-desktop/Model/IStation.Model.Curve/\346\233\262\347\272\277\350\241\250\350\276\276\345\274\217/CurveExpress.cs"
+++ "b/02-desktop/Model/IStation.Model.Curve/\346\233\262\347\272\277\350\241\250\350\276\276\345\274\217/CurveExpress.cs"
@@ -12,7 +12,7 @@
     /// 鏇茬嚎琛ㄨ揪寮�
     /// </summary>
     [DataContract]
-    public class CurveExpress : ICloneable
+    public class CurveExpress :JsonModel<CurveExpress> ,ICloneable
     {
         #region 鏋勯�犲嚱鏁�
 
diff --git "a/02-desktop/Model/IStation.Model.Curve/\346\233\262\347\272\277\350\241\250\350\276\276\345\274\217/CurveExpress_Extensions.cs" "b/02-desktop/Model/IStation.Model.Curve/\346\233\262\347\272\277\350\241\250\350\276\276\345\274\217/CurveExpress_Extensions.cs"
new file mode 100644
index 0000000..7c6b9c2
--- /dev/null
+++ "b/02-desktop/Model/IStation.Model.Curve/\346\233\262\347\272\277\350\241\250\350\276\276\345\274\217/CurveExpress_Extensions.cs"
@@ -0,0 +1,527 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace IStation.Model
+{
+    public static class CurveExpress_Extensions
+    {
+        #region  List<CurvePoint>  Extend
+
+        /// <summary>
+        /// 鑾峰彇鎷熷悎鐐�
+        /// </summary>
+        public static List<CurvePoint> GetFitPointsByExtend(this CurveExpress express, double ratioExtend, int pointNumber)
+        {
+            if (express == null)
+                return default; 
+            return express.GetFitPointsByRange(express.Min, express.Max * ratioExtend, pointNumber);
+        }
+
+        /// <summary>
+        /// 鑾峰彇鎷熷悎鐐�
+        /// </summary>
+        public static List<CurvePoint> GetFitPointsByExtend(this CurveExpress express, double ratioExtendmin, double ratioExtendmax, int pointNumber)
+        {
+            if (express == null)
+                return default; 
+            return express.GetFitPointsByRange(express.Min * ratioExtendmin, express.Max * ratioExtendmax, pointNumber);
+        }
+
+        #endregion
+
+        #region CurveFunction
+
+        /// <summary>
+        /// 鑾峰彇鏇茬嚎鏂圭▼
+        /// </summary>
+        public static string GetCurveFunction(this CurveExpress express, string xName = "Q")
+        {
+
+            StringBuilder sb = new StringBuilder();
+            sb.Append(Math.Abs(express.Index0).ToString("0.00"));
+
+            if (express.Index1 > 0)
+                sb.Append(" + ");
+            else
+                sb.Append(" - ");
+            sb.Append(Math.Abs(express.Index1).ToString("0.0000"));
+            sb.Append(" * ");
+            sb.Append(xName);
+
+            if (express.Index2 > 0)
+                sb.Append(" + ");
+            else
+                sb.Append(" - ");
+            sb.Append(Math.Abs(express.Index2).ToString("0.000000000"));
+            sb.Append(" * ");
+            sb.Append(xName);
+            sb.Append("^2 ");
+
+
+            if (express.Index3 > 0)
+                sb.Append("  +  ");
+            else
+                sb.Append("  -  ");
+            sb.Append(Math.Abs(express.Index3).ToString("0.000000000000"));
+            sb.Append(" * ");
+            sb.Append(xName);
+            sb.Append("^3 ");
+
+            return sb.ToString();
+        }
+
+        /// <summary>
+        /// 鑾峰彇
+        /// </summary>
+        /// <param name="functionIndex"></param>
+        /// <param name="functionCoeff"></param>
+        /// <param name="signValue"></param>
+        /// <param name="IndexValue"></param>
+        private static void GetFuncScientificValue(int functionIndex, double functionCoeff, ref double signValue, ref int IndexValue)
+        {
+            string strList = "";
+            if (functionIndex == 0)
+            {
+                strList = functionCoeff.ToString("0.000e+000");
+            }
+            else if (functionIndex == 1)
+            {
+                strList = functionCoeff.ToString("0.000000e+000");
+            }
+            else if (functionIndex == 2)
+            {
+                strList = functionCoeff.ToString("#.#########e+000");
+            }
+            else if (functionIndex == 3)
+            {
+                strList = functionCoeff.ToString("#.############e+000");
+            }
+            string[] st1 = null;
+            st1 = strList.Split('e');
+            signValue = Convert.ToDouble(st1[0]);
+            IndexValue = Convert.ToInt32(st1[1]);
+        }
+
+        #endregion
+         
+
+        #region 鑾峰緱X鍊�
+
+        /// <summary>
+        /// 鑾峰緱Y鍊肩殑鍧愭爣浣嶇疆,澶氫釜鐐归噷鍙栨渶鍚庝竴涓偣(鏄嚎褰㈡彃鍊�,涓嶆槸鏇茬嚎涓婄殑鐐�)
+        /// </summary>
+        /// <param name="curve"></param>
+        /// <param name="y"></param>
+        /// <param name="interPointNum"></param>
+        /// <returns></returns>
+        public static double? GetInterPointLastX(this CurveExpress curve, double y, int interPointNum = 20)
+        {
+            if (curve == null)
+                return null;
+            var points = curve.GetFitPoints( interPointNum);
+            if (points == null)
+                return null;
+
+            //鍦ㄨ寖鍥村唴
+            double maxY = (from yyy in points select yyy.Y).Max();
+            double minY = (from yyy in points select yyy.Y).Min();
+
+            if (double.IsNaN(maxY) || double.IsNaN(minY))
+                return null;
+            if (y < minY || y > maxY)
+                return null;
+
+            var list = points.GetPointsByInterPointX(y);
+            if (list == null || list.Count < 1)
+                return null;
+
+            return list.Last().X;
+        }
+
+
+        
+
+
+        /// <summary>
+        /// 鑾峰緱Y鍊肩殑鍧愭爣浣嶇疆,鍙兘鏈夊涓偣(鏄嚎褰㈡彃鍊�,涓嶆槸鏇茬嚎涓婄殑鐐�):浼氳绠楀欢闀块儴鍒�:鑰屼笖瑕佹眰points鐐规寜鐓т粠灏忓埌澶ф帓搴�
+        /// </summary>
+        /// <param name="curve"></param>
+        /// <param name="y"></param>
+        /// <param name="interPointNum"></param>
+        /// <param name="extendRatio"></param>
+        /// <returns></returns>
+        public static List<CurvePoint> GetInterPointExX(this CurveExpress curve, double y, int interPointNum, double extendRatio)
+        {
+            if (curve == null)
+                return null;
+            var points = GetFitPointsByExtend(curve, extendRatio, interPointNum);
+            if (points == null)
+                return null;
+
+            //鍦ㄨ寖鍥村唴
+            double maxY = (from yyy in points select yyy.Y).Max();
+            double minY = (from yyy in points select yyy.Y).Min();
+            if (y > minY && y < maxY)
+            {
+                return points.GetPointsByInterPointX(y);
+            }
+
+            List<CurvePoint> ptList = new List<CurvePoint>();
+            //鍒ゆ柇鏄惁鍦ㄥ墠闈㈢殑寤堕暱閮ㄥ垎
+            double x_start = CurveLineHelper.GetXbyY(points[0].X, points[0].Y, points[1].X, points[1].Y, y);
+            if (x_start <= points[0].X)
+            {
+                if (x_start > 0 && x_start > points[0].X * 0.9)//鏀句竴鐐逛綑閲�
+                    ptList.Add(new CurvePoint(x_start, y));
+            }
+
+            //鍒ゆ柇鏄惁鍦ㄥ悗闈㈢殑寤堕暱閮ㄥ垎:U鍨嬫洸绾� 鏄墠鍚庨兘鏈�
+            double x_end = CurveLineHelper.GetXbyY(points[points.Count - 2].X, points[points.Count - 2].Y, points[points.Count - 1].X, points[points.Count - 1].Y, y);
+            if (x_end >= points[points.Count - 1].X && x_end < points[points.Count - 1].X * extendRatio)//鏀句竴鐐逛綑閲�
+            {
+                ptList.Add(new CurvePoint(x_end, y));
+            }
+
+            if (ptList.Count == 0)
+                return null;
+            return ptList;
+        }
+
+        #endregion 鑾峰緱X鍊�
+
+        #region 鑾峰緱Y鍊�
+
+        /// <summary>
+        /// 鑾峰彇Y鍊兼渶澶у�肩殑鐐�
+        /// </summary> 
+        public static CurvePoint GetMaxPoint(this CurveExpress express, int pointNumber = 200)
+        {
+            if (express == null)
+                return null;
+            if (express.FitType <= 0 && express.DefinePoints != null)
+            {
+                return express.DefinePoints.GetPointByMaxY();
+            }
+            else if (express.FitType ==  eCurveFitType.LinearCurve)
+            {
+                return express.DefinePoints.GetPointByMaxY();
+            }
+            else
+            {
+                var points = express.GetFitPoints(pointNumber);
+                return points.GetPointByMaxY();
+            }
+        }
+
+        /// <summary>
+        /// 鑾峰彇Y鍊兼渶澶у�肩殑鐐�
+        /// </summary> 
+        public static CurvePoint GetMaxPointByRange(this CurveExpress express, double rangeMin, double rangeMax, int pointNumber = 200)
+        {
+            if (express == null)
+                return null;
+            var points = express.GetFitPointsByRange(rangeMin, rangeMax, pointNumber);
+            return points.GetPointByMaxY();
+        }
+
+
+        /// <summary>
+        /// 鑾峰彇鏈�澶ф渶灏廦
+        /// </summary>
+        /// <param name=""></param> 
+        public static bool GetMinMaxPointY(this CurveExpress express, out double maxY, out double minY)
+        {
+            if (express == null)
+            {
+                maxY = minY = 0;
+                return false;
+            }
+            var fitPoints = express.GetFitPoints(50); 
+            if (fitPoints == null)
+            {
+                maxY = minY = 0;
+                return false;
+            }
+            maxY = fitPoints.Max(x => x.Y);
+            minY = fitPoints.Min(x => x.Y);
+
+            if (express.DefinePoints != null && express.DefinePoints.Any())
+            { 
+                var defMaxY = express.DefinePoints.Max(x => x.Y);
+                var defMinY = express.DefinePoints.Min(x => x.Y); 
+                maxY = Math.Max(maxY,defMaxY);
+                minY = Math.Min(minY, defMinY);
+            }
+            return true;
+        }
+
+        #endregion 鍙朰鐨勬渶澶ф渶灏忓��
+
+        #region SimuValue
+
+        /// <summary>
+        /// 鐭ラ亾鍘熷閫熷害,浠ュ強鍘熷鐨勬潹绋婬浠ュ強瀵瑰簲鐨勫彉閫熷悗鐨勬潹绋�,姹傚彉閫熷悗鐨勯�熷害
+        /// </summary>
+        /// <param name="originSpeend"></param>
+        /// <param name="originH"></param>
+        /// <param name="changeH"></param>
+        /// <returns></returns>
+        public static double CalculateSimuByH(double originSpeend, double originH, double changeH)
+        {
+            double ratio = Math.Pow(originH / changeH, 1.0 / 2.0);
+            return originSpeend / ratio;
+        }
+
+        /// <summary>
+        /// 鏍规嵁鐩镐技鐐硅缃浉浼兼洸绾�,鐩镐技鐐�(閫夋嫨鐐�)鐨剎:娴侀噺y:鏉ㄧ▼
+        /// </summary> 
+        public static double GetSimuValue(this CurveExpress express, CurvePoint simularPoint, double originValue, double extendRatio = 1)
+        {
+            if (express == null)
+                return -3;
+            if (simularPoint.X < 0.1 || simularPoint.Y < 0.1)
+                return -2;
+            if (simularPoint.X > express.Max * extendRatio * 1.5)
+                return -4;
+
+            CurvePoint sectPoint = GetSectPoint(express, simularPoint, extendRatio);
+            if (sectPoint == null || sectPoint.IsZeroPoint())
+                return -5;
+
+            //璁$畻鐩镐技鐐圭殑杞��/鐩村緞
+            return CalculateSimuByH(originValue, sectPoint.Y, simularPoint.Y);
+        }
+
+        //ratioIgnore:浣滅敤 褰搒imularPoint瓒呭嚭鏇茬嚎鑼冨洿鏃�,鏇茬嚎鎵╁ぇ鐨勫�嶆暟
+        public static CurvePoint GetSectPoint(this CurveExpress CurveExpress, CurvePoint simularPoint, double ratioIgnore)
+        {
+            return GetSectPointGeneral(CurveExpress, simularPoint, 2, ratioIgnore);
+        }
+
+        #endregion
+
+        #region 鏇茬嚎涓嶩=K*Q^i鐨勪氦鐐�  
+
+
+        //閫氳繃鐐箂imularPoint鍜岀偣(0,0)鐨勭洿绾�,涓庢洸绾緾urve鐨勪氦鐐�(娌℃湁,杩斿洖Point(0,0))
+        public static CurvePoint GetSectPointLine(List<CurvePoint> CurvePoints, CurvePoint simularPoint)
+        {
+            CurvePoint sectPoint = new CurvePoint(0, 0);
+            if (CurvePoints == null || CurvePoints.Count < 2)
+                return sectPoint;
+
+            //璁$畻鐩寸嚎鐨凨
+            if (simularPoint.X < 1)
+                return sectPoint;
+            double a = simularPoint.Y / simularPoint.X;
+            if (a < 0.0001)
+                return sectPoint;
+
+            //涓�2鐐硅繛鎴愮洿绾跨殑浜ょ偣,鍒ゆ柇浜ょ偣鏄惁鍦�2鐐逛箣闂�,鍗冲彲鏄洸绾跨殑浜ょ偣
+            double b, c;
+            double x;
+            for (int i = 0; i < CurvePoints.Count - 1; i++)
+            {
+                CurveLineHelper.GetKandB(CurvePoints[i], CurvePoints[i + 1], out b, out c);
+
+                /*瑙f柟绋�
+                 * y=ax
+                 * y=bx+c
+                 */
+                if (Math.Abs(a - b) < 0.001)
+                    continue;
+
+                x = c / (a - b);
+                if ( IsMiddle(CurvePoints[i].X, CurvePoints[i + 1].X, x))
+                {
+                    sectPoint.X = x;
+                    sectPoint.Y = a * x;
+                    return sectPoint;
+                }
+            }
+
+            return sectPoint;
+        }
+
+        /// <summary>
+        /// 鏄惁涓轰腑闂存暟
+        /// </summary>
+        public static bool IsMiddle(this double x, double x1, double x2)
+        {
+            return (x >= x1 && x <= x2) || (x <= x1 && x >= x2);
+        }
+
+        //閫氳繃鐐箂imularPoint鍜岀偣(0,0)鐨勬姏鐗╃嚎,涓庢洸绾緾urve鐨勪氦鐐�(娌℃湁,杩斿洖Point(0,0))
+        //鏇茬嚎鍏紡:H=K*Q^2
+        public static CurvePoint GetSectPointParabola(List<CurvePoint> CurvePoints, CurvePoint simularPoint)
+        {
+            return ParabolaCurveHelper_H.GetSectPoint(CurvePoints, simularPoint, 0);
+        }
+
+        public static CurvePoint GetSectPointParabola(CurveExpress CurveExpress, CurvePoint simularPoint)
+        {
+            CurvePoint sectPoint = new CurvePoint(0, 0);
+            if (CurveExpress == null)
+                return sectPoint;
+
+            return GetSectPointParabola(CurveExpress.GetFitPointsByExtend(1.2, 50), simularPoint);
+        }
+
+        public static CurvePoint GetSectPointLine(this CurveExpress CurveExpress, CurvePoint simularPoint)
+        {
+            CurvePoint sectPoint = new CurvePoint(0, 0);
+            if (CurveExpress == null)
+                return sectPoint;
+
+            //璁$畻鐩寸嚎鐨凨
+            if (simularPoint.X < 1)
+                return sectPoint;
+            double a = simularPoint.Y / simularPoint.X;
+            if (a < 0.0001)
+                return sectPoint;
+
+            //鐐硅秺澶氳秺绮剧‘
+            return GetSectPointLine(CurveExpress.GetFitPoints(100), simularPoint);
+        }
+
+        //鏇茬嚎H=K*Q^i 涓庢洸绾緾urve鐨勪氦鐐�(娌℃湁,杩斿洖Point(0,0))
+        public static CurvePoint GetSectPointGeneral(List<CurvePoint> CurvePoints, CurvePoint simularPoint, double index)
+        {
+            CurvePoint sectPoint = new CurvePoint(0, 0);
+            if (CurvePoints == null || CurvePoints.Count < 2)
+                return sectPoint;
+
+            if (simularPoint.X < 0.1)
+                return sectPoint;
+
+            if (Math.Abs(index - 1) < 0.01)
+                return GetSectPointLine(CurvePoints, simularPoint);
+            if (Math.Abs(index - 2) < 0.01)
+                return GetSectPointParabola(CurvePoints, simularPoint);
+
+            //璁$畻绯绘暟K
+            double fixK = simularPoint.Y / Math.Pow(simularPoint.X, index);
+            if (fixK < 0.000001)
+                return sectPoint;
+
+            //鎬濊矾鏄粠simularPoint寮�濮嬮�愪釜澧炲姞0.1,鐩村埌k鍊兼渶鎺ヨ繎fixK
+            double space = (CurvePoints.Last().X - simularPoint.X) / 1200;
+            double x = simularPoint.X;
+            double y, k;
+            do
+            {
+                x = x + space;
+                y = 0;
+                if (!CurvePoints.GetInterPointY(x, out y))
+                {
+                    break;
+                }
+
+                k = y / Math.Pow(x, index);
+            } while (k > fixK);
+
+            sectPoint.X = x;
+            sectPoint.Y = y;
+            return sectPoint;
+        }
+
+        //鏇茬嚎H=K*Q^i 涓庢洸绾緾urve鐨勪氦鐐�(娌℃湁,杩斿洖Point(0,0))
+        public static CurvePoint GetSectPointGeneral(this CurveExpress express, CurvePoint simularPoint, double index)
+        {
+            CurvePoint sectPoint = new CurvePoint(0, 0);
+            if (express == null)
+                return sectPoint;
+
+            if (simularPoint.X < 1)
+                return sectPoint;
+
+            //妫�鏌ユ槸鍚﹀湪鏇茬嚎鐨勫尯鍩熻寖鍥村唴
+            double maxQ = express.Max;
+            double maxH = express.GetFitPointY(maxQ);
+            double k1 = maxH / Math.Pow(maxQ, index);
+            double k2 = simularPoint.Y / Math.Pow(simularPoint.X, index);
+            if (k1 > k2)
+            {
+                return sectPoint;
+            }
+
+            if (Math.Abs(index - 1) < 0.01)
+                return GetSectPointLine(express, simularPoint);
+            if (Math.Abs(index - 2) < 0.01)
+                return GetSectPointParabola(express, simularPoint);
+
+            //璁$畻绯绘暟K
+            double fixK = simularPoint.Y / Math.Pow(simularPoint.X, index);
+            if (fixK < 0.000001)
+                return sectPoint;
+
+            //鎬濊矾鏄粠simularPoint寮�濮嬮�愪釜澧炲姞0.1,鐩村埌k鍊兼渶鎺ヨ繎fixK
+            double space = (express.Max - simularPoint.X) / 1000;
+            double x = simularPoint.X;
+            double y, k;
+            do
+            {
+                x = x + space;
+                y = express.GetFitPointY(x);
+                k = y / Math.Pow(x, index);
+            } while (k > fixK);
+
+            sectPoint.X = x;
+            sectPoint.Y = y;
+            return sectPoint;
+        }
+
+        //ratioIgnore:浣滅敤 褰搒imularPoint瓒呭嚭鑼冨洿鏃�,鎵╁ぇ鐨勫�嶆暟
+        public static CurvePoint GetSectPointGeneral(this CurveExpress curveExpress, CurvePoint simularPoint, double index, double ratioIgnore)
+        {
+            CurvePoint sectPoint = new CurvePoint(0, 0);
+            if (curveExpress == null)
+                return sectPoint;
+
+            if (simularPoint.X < 1)
+                return sectPoint;
+            var CurveExpressEx = curveExpress.Clone();
+            //妫�鏌ユ槸鍚﹀湪鏇茬嚎鐨勫尯鍩熻寖鍥村唴
+            double maxQ = CurveExpressEx.Max;
+            double maxH = CurveExpressEx.GetFitPointY(maxQ);
+            double k1 = maxH / Math.Pow(maxQ, index);
+            double k2 = simularPoint.Y / Math.Pow(simularPoint.X, index);
+            if (k1 > k2)
+            {
+                CurveExpressEx.Max = CurveExpressEx.Max * ratioIgnore;//鏀惧ぇ1.2鍊�
+            }
+
+            if (Math.Abs(index - 1) < 0.01)
+                return GetSectPointLine(CurveExpressEx, simularPoint);
+            if (Math.Abs(index - 2) < 0.01)
+                return GetSectPointParabola(CurveExpressEx, simularPoint);
+
+            //璁$畻绯绘暟K
+            double fixK = simularPoint.Y / Math.Pow(simularPoint.X, index);
+            if (fixK < 0.000001)
+                return sectPoint;
+
+            //鎬濊矾鏄粠simularPoint寮�濮嬮�愪釜澧炲姞0.1,鐩村埌k鍊兼渶鎺ヨ繎fixK
+            double space = (CurveExpressEx.Max - simularPoint.X) / 1000;
+            double x = simularPoint.X;
+            double y, k;
+            do
+            {
+                x = x + space;
+                y = CurveExpressEx.GetFitPointY(x);
+                k = y / Math.Pow(x, index);
+            } while (k > fixK);
+
+            sectPoint.X = x;
+            sectPoint.Y = y;
+            return sectPoint;
+        }
+
+        #endregion 鏇茬嚎涓嶩=K*Q^i鐨勪氦鐐� protect绫诲瀷,缁欏瓙绫昏皟鐢�,鎬庝箞瑕嗙洊GetSectPoint
+    }
+
+
+
+}
diff --git "a/02-desktop/Model/IStation.Model.Curve/\346\233\262\347\272\277\350\241\250\350\276\276\345\274\217/CurvePoint_Extensions.cs" "b/02-desktop/Model/IStation.Model.Curve/\346\233\262\347\272\277\350\241\250\350\276\276\345\274\217/CurvePoint_Extensions.cs"
new file mode 100644
index 0000000..9702ba1
--- /dev/null
+++ "b/02-desktop/Model/IStation.Model.Curve/\346\233\262\347\272\277\350\241\250\350\276\276\345\274\217/CurvePoint_Extensions.cs"
@@ -0,0 +1,427 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace IStation.Model
+{
+    public static class CurvePoint_Extensions
+    {
+
+        #region Point
+
+        /// <summary>
+        /// 鍒ゆ柇鏄惁鏄�0鐐�,鐢ㄤ簬鍒ゆ柇鍑芥暟鏄惁鎴愬姛杩斿洖
+        /// </summary> 
+        public static bool IsZeroPoint(this CurvePoint pt)
+        {
+            if (pt.X < 0.01 && pt.Y < 0.01)
+                return true;
+            else
+                return false;
+        }
+
+        /// <summary>
+        /// 鐐瑰埌绾跨殑璺濈
+        /// </summary> 
+        public static double GetDistance(this CurvePoint pt1, List<CurvePoint> CurvePoints)
+        {
+            if (CurvePoints == null)
+                return 10000;
+
+            double min_dis = double.MaxValue;
+            double dis = 0;
+            foreach (CurvePoint pt in CurvePoints)
+            {
+                dis = GetDistance(pt1, pt);
+                if (dis < min_dis)
+                    min_dis = dis;
+            }
+
+            return min_dis;
+        }
+
+        /// <summary>
+        /// 涓ょ偣涔嬮棿鐨勮窛绂�
+        /// </summary> 
+        public static double GetDistance(CurvePoint pt1, CurvePoint pt2)
+        {
+            return Math.Sqrt((pt1.X - pt2.X) * (pt1.X - pt2.X) + (pt1.Y - pt2.Y) * (pt1.Y - pt2.Y));
+        }
+
+
+        /// <summary>
+        /// 璁$畻鎬婚暱搴�
+        /// </summary>
+        public static double CalcuTotalLength(this List<CurvePoint> ptList)
+        {
+            if (ptList == null || ptList.Count < 1)
+            {
+                return default;
+            }
+            double length = 0;
+            for (int i = 1; i < ptList.Count; i++)
+            {
+                length += ptList[i].Distance(ptList[i - 1]);
+            }
+            return length;
+        }
+
+        #endregion
+
+        #region List<CurvePoint>
+
+        /// <summary>
+        /// 鑾峰彇Y鏈�灏忕殑鐐�
+        /// </summary>
+        public static CurvePoint GetPointByMinY(this List<CurvePoint> ptList)
+        {
+            if (ptList == null || ptList.Count < 1)
+            {
+                return default;
+            }
+            return ptList.OrderBy(x => x.Y).FirstOrDefault();
+        }
+
+        /// <summary>
+        /// 鑾峰彇Y鏈�澶х殑鐐�
+        /// </summary>
+        public static CurvePoint GetPointByMaxY(this List<CurvePoint> ptList)
+        {
+            if (ptList == null || !ptList.Any())
+            {
+                return default;
+            }
+            return ptList.OrderBy(x => x.Y).LastOrDefault();
+        }
+
+        /// <summary>
+        /// 鑾峰彇Y鏈�灏忕殑鐐圭储寮�
+        /// </summary>
+        public static int GetPointIndexByMinY(this List<CurvePoint> ptList)
+        {
+            var pt = GetPointByMinY(ptList);
+            return ptList.IndexOf(pt);
+        }
+
+        /// <summary>
+        /// 鑾峰彇Y鏈�澶х殑鐐圭储寮�
+        /// </summary>
+        public static int GetPointIndexByMaxY(this List<CurvePoint> ptList)
+        {
+            var pt = GetPointByMaxY(ptList);
+            return ptList.IndexOf(pt);
+        }
+
+        /// <summary>
+        /// 鏍规嵁X 鑾峰彇鐐圭储寮�
+        /// </summary>
+        public static int GetPointIndexByX(this List<CurvePoint> ptList, double x)
+        {
+            if (ptList == null || !ptList.Any())
+            {
+                return -1;
+            }
+            int index = 0;
+            foreach (var pt in ptList)
+            {
+                if (Math.Abs(pt.X - x) < 0.0001)
+                {
+                    return index;
+                }
+                index++;
+            }
+            return -1;
+        }
+
+        /// <summary>
+        /// 鑾峰彇X鏂瑰悜璺濈鏈�灏忕殑鐐�
+        /// </summary>
+        public static CurvePoint GetClosestPointByX(this List<CurvePoint> ptList, double x)
+        {
+            if (ptList == null || ptList.Count < 1)
+            {
+                return default;
+            }
+            var pt = ptList.OrderBy(t => Math.Abs(t.X - x)).FirstOrDefault();
+            return pt;
+        }
+
+        /// <summary>
+        /// 鑾峰彇X鏂瑰悜璺濈鏈�灏忕殑鐐圭储寮�
+        /// </summary>
+        public static int GetClosestPointIndexByX(this List<CurvePoint> ptList, double x)
+        {
+            var pt = GetClosestPointByX(ptList, x);
+            return ptList.IndexOf(pt);
+        }
+
+
+        /// <summary>
+        /// 鑾峰緱Y鍊肩殑鍧愭爣浣嶇疆,鍙兘鏈夊涓偣(鏄嚎褰㈡彃鍊�,涓嶆槸鏇茬嚎涓婄殑鐐�)
+        /// </summary> 
+        public static List<double> GetInterPointX(this List<CurvePoint> ptList, double y)
+        {
+            if (ptList == null || ptList.Count < 1)
+            {
+                return default;
+            }
+            var list = ptList.ToList();
+            var equalPoints = new List<double>();
+            int num = list.Count();
+            for (int i = 0; i < num - 1; i++)//灏戜竴涓偣
+            {
+                if ((y >= list[i].Y && y <= list[i + 1].Y) || (y <= list[i].Y && y >= list[i + 1].Y))
+                {//鐩寸嚎鎻掑��
+                    double x;
+                    if (Math.Abs(list[i].Y - list[i + 1].Y) < 0.01)
+                        x = (list[i].X + list[i + 1].X) * 0.5;
+                    else
+                        x = list[i].X + (list[i + 1].X - list[i].X) * (y - list[i].Y) / (list[i + 1].Y - list[i].Y);
+
+                    equalPoints.Add(x);
+                }
+            }
+            return equalPoints;
+        }
+
+        /// <summary>
+        /// 鑾峰緱Y鍊肩殑鍧愭爣浣嶇疆,鍙兘鏈夊涓偣(鏄嚎褰㈡彃鍊�,涓嶆槸鏇茬嚎涓婄殑鐐�)
+        /// </summary> 
+        public static List<CurvePoint> GetPointsByInterPointX(this List<CurvePoint> ptList, double y)
+        {
+            if (ptList == null || ptList.Count < 1)
+            {
+                return default;
+            }
+            var list = ptList.ToList();
+            var equalPoints = new List<CurvePoint>();
+            int num = list.Count();
+            for (int i = 0; i < num - 1; i++)//灏戜竴涓偣
+            {
+                if ((y >= list[i].Y && y <= list[i + 1].Y) || (y <= list[i].Y && y >= list[i + 1].Y))
+                {//鐩寸嚎鎻掑��
+                    double x;
+                    if (Math.Abs(list[i].Y - list[i + 1].Y) < 0.01)
+                        x = (list[i].X + list[i + 1].X) * 0.5;
+                    else
+                        x = list[i].X + (list[i + 1].X - list[i].X) * (y - list[i].Y) / (list[i + 1].Y - list[i].Y);
+
+                    equalPoints.Add(new CurvePoint(x, y));
+                }
+            }
+            return equalPoints;
+        }
+
+        /// <summary>
+        /// 鑾峰緱X鍊肩殑鍧愭爣浣嶇疆,鍙兘鏈夊涓偣(鏄嚎褰㈡彃鍊�,涓嶆槸鏇茬嚎涓婄殑鐐�)
+        /// </summary>
+        public static List<double> GetInterPointY(this List<CurvePoint> ptList, double x)
+        {
+            if (ptList == null || ptList.Count < 1)
+            {
+                return default;
+            }
+            var list = ptList.ToList();
+            var equalPoints = new List<double>();
+            int num = ptList.Count;
+            for (int i = 0; i < num - 1; i++)//灏戜竴涓偣
+            {
+                if ((x >= list[i].X && x <= list[i + 1].X) || (x <= list[i].X && x >= list[i + 1].X))
+                {//鐩寸嚎鎻掑��
+                    double y;
+                    if (Math.Abs(list[i].X - list[i + 1].X) < 0.01)
+                        y = (list[i].Y + list[i + 1].Y) * 0.5;
+                    else
+                        y = list[i].Y + (list[i + 1].Y - list[i].Y) * (x - list[i].X) / (list[i + 1].X - list[i].X);
+
+                    equalPoints.Add(y);
+                }
+            }
+            return equalPoints;
+        }
+
+        /// <summary>
+        /// 鑾峰緱X鍊肩殑鍧愭爣浣嶇疆,鍙兘鏈夊涓偣(鏄嚎褰㈡彃鍊�,涓嶆槸鏇茬嚎涓婄殑鐐�)
+        /// </summary>
+        public static List<CurvePoint> GetPointsByInterPointY(this List<CurvePoint> ptList, double x)
+        {
+            if (ptList == null || ptList.Count < 1)
+            {
+                return default;
+            }
+            var list = ptList.ToList();
+            var equalPoints = new List<CurvePoint>();
+            int num = ptList.Count;
+            for (int i = 0; i < num - 1; i++)//灏戜竴涓偣
+            {
+                if ((x >= list[i].X && x <= list[i + 1].X) || (x <= list[i].X && x >= list[i + 1].X))
+                {//鐩寸嚎鎻掑��
+                    double y;
+                    if (Math.Abs(list[i].X - list[i + 1].X) < 0.01)
+                        y = (list[i].Y + list[i + 1].Y) * 0.5;
+                    else
+                        y = list[i].Y + (list[i + 1].Y - list[i].Y) * (x - list[i].X) / (list[i + 1].X - list[i].X);
+
+                    equalPoints.Add(new CurvePoint(x, y));
+                }
+            }
+            return equalPoints;
+        }
+
+
+
+        /// <summary>
+        /// 鑾峰緱X鍊肩殑鍧愭爣浣嶇疆,鍙兘鏈夊涓偣,鍙栫涓�涓偣(鏄嚎褰㈡彃鍊�,涓嶆槸鏇茬嚎涓婄殑鐐�)
+        /// </summary> 
+        public static bool GetInterPointY(this List<CurvePoint> points, double x, out double y)
+        {
+            y = 0;
+            if (points == null)
+                return false;
+
+            int num = points.Count();
+            for (int i = 0; i < num - 1; i++)//灏戜竴涓偣
+            {
+                if ((x >= points[i].X && x <= points[i + 1].X) || (x <= points[i].X && x >= points[i + 1].X))
+                {//鐩寸嚎鎻掑��
+                    if (Math.Abs(points[i].X - points[i + 1].X) < 0.01)
+                        y = (points[i].Y + points[i + 1].Y) * 0.5;
+                    else
+                        y = points[i].Y + (points[i + 1].Y - points[i].Y) * (x - points[i].X) / (points[i + 1].X - points[i].X);
+
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// ptList 鏄竴涓杈瑰舰,鍒ゆ柇鐐规槸鍚﹀湪澶氳竟褰㈤噷
+        /// 鍘熺悊鏄� 閫氳繃p鍋氫竴涓�+X鏂瑰悜鐨勫皠绾�, 鍋舵暟涓氦鐐� 灏辨槸鍦ㄥ閮�,濂囨暟涓氨鏄湪鍐呴儴
+        /// </summary>
+        public static bool IsInPolygon(this IEnumerable<CurvePoint> ptList, CurvePoint p, bool isClosed = true)
+        {
+            if (ptList == null || ptList.Count() < 1)
+                return default;
+            var list = ptList.ToList();
+            int crossNum = 0;
+
+            for (int i = 0; i < list.Count() - 1; i++)
+            {
+                if (p.IsIntersectLineLeft(list[i], list[i + 1]))
+                {
+                    crossNum++;
+                }
+            }
+
+            if (isClosed)
+            {
+                if (p.IsIntersectLineLeft(list[list.Count - 1], list[0]))
+                {
+                    crossNum++;
+                }
+            }
+
+            if ((crossNum % 2) == 0)
+                return false;
+            else
+                return true;
+        }
+
+        /// <summary>
+        ///  鏄惁瀹屽叏鐩稿悓
+        /// </summary> 
+        public static bool IsEqualValueX(this List<CurvePoint> ptList, List<CurvePoint> comparerPtList)
+        {
+            if (ptList == null || ptList.Count() == 0)
+            {
+                if (comparerPtList == null || comparerPtList.Count() == 0)
+                {
+                    return true;
+                }
+
+                return false;
+            }
+
+            if (comparerPtList == null || comparerPtList.Count() == 0)
+            {
+                if (ptList == null || ptList.Count() == 0)
+                {
+                    return true;
+                }
+
+                return false;
+            }
+
+            if (ptList.Count != comparerPtList.Count)
+            {
+                return false;
+            }
+
+            for (int i = 0; i < ptList.Count; i++)
+            {
+                if (Math.Abs(ptList[i].X - comparerPtList[i].X) > 0.001)
+                {
+                    return false;
+                }
+            }
+
+            return true;
+        }
+
+
+        #region 鑾峰彇鎷熷悎鐐�
+
+        /// <summary>
+        /// 鑾峰彇鎷熷悎鐐筜
+        /// </summary>
+        public static double GetFitPointY(this List<CurvePoint> ptList, double x)
+        {
+            if (ptList == null)
+                return default;
+            var express = new CurveExpress(ptList);
+            if (express == null)
+                return default;
+            return express.GetFitPointY(x);
+        }
+   
+
+        #endregion
+
+        #region 鍙朰鐨勬渶澶ф渶灏忓��
+
+
+        /// <summary>
+        /// 鍙朰鐨勬渶澶ф渶灏忓��
+        /// </summary> 
+        public static bool GetMinMaxPointY(this List<CurvePoint> ptList, out double maxY, out double minY)
+        {
+            if (ptList == null || !ptList.Any())
+            {
+                maxY = minY = 0;
+                return false;
+            }
+            var fitPoints = ptList.ToList();
+            maxY = fitPoints.Max(x => x.Y);
+            minY = fitPoints.Min(x => x.Y); ;
+            return true;
+        }
+
+        /// <summary>
+        /// 鍙杙oints涓璝鐨勬渶澶у��(涓�瀹氬湪points涓�)
+        /// </summary> 
+        public static CurvePoint GetMaxPointY(this List<CurvePoint> ptList)
+        {
+            if (ptList == null || !ptList.Any())
+            {
+                return new CurvePoint(0, 0);
+            }
+            return ptList.OrderByDescending(x => x.Y).First();
+        }
+
+        #endregion 鍙朰鐨勬渶澶ф渶灏忓��
+
+
+        #endregion
+    }
+}
diff --git "a/02-desktop/Model/IStation.Model.Curve/\346\233\262\347\272\277\350\256\241\347\256\227/CurveCalcuHelper.cs" "b/02-desktop/Model/IStation.Model.Curve/\346\233\262\347\272\277\350\256\241\347\256\227/CurveCalcuHelper.cs"
index 2543634..ea702d7 100644
--- "a/02-desktop/Model/IStation.Model.Curve/\346\233\262\347\272\277\350\256\241\347\256\227/CurveCalcuHelper.cs"
+++ "b/02-desktop/Model/IStation.Model.Curve/\346\233\262\347\272\277\350\256\241\347\256\227/CurveCalcuHelper.cs"
@@ -307,9 +307,9 @@
             if (changeHz < 1)
                 return null;
             List<CurvePoint> fitPoints = null;
-            if (express.DefinePoints != null && express.DefinePoints.Any())
-                fitPoints = express.DefinePoints;
-            else
+            //if (express.DefinePoints != null && express.DefinePoints.Any())
+            //    fitPoints = express.DefinePoints;
+            //else
                 fitPoints = FitCurveHelper.GetFitPoints(express, pointNumber);
 
             var ratio = changeHz / originHz;
@@ -339,9 +339,9 @@
             if (changeHz < 1)
                 return null;
             List<CurvePoint> fitPoints = null;
-            if (express.DefinePoints != null && express.DefinePoints.Any())
-                fitPoints = express.DefinePoints;
-            else
+            //if (express.DefinePoints != null && express.DefinePoints.Any())
+            //    fitPoints = express.DefinePoints;
+            //else
                 fitPoints = FitCurveHelper.GetFitPoints(express, pointNumber);
 
             var ratio = changeHz / originHz;
@@ -371,9 +371,9 @@
             if (changeHz < 1)
                 return null;
             List<CurvePoint> fitPoints = null;
-            if (express.DefinePoints != null && express.DefinePoints.Any())
-                fitPoints = express.DefinePoints;
-            else
+            //if (express.DefinePoints != null && express.DefinePoints.Any())
+            //    fitPoints = express.DefinePoints;
+            //else
                 fitPoints = FitCurveHelper.GetFitPoints(express, pointNumber);
 
             var ratio = changeHz / originHz;
diff --git "a/02-desktop/Model/IStation.Model.Curve/\347\233\270\344\274\274\346\215\242\347\256\227/CutSimuCalculer.cs" "b/02-desktop/Model/IStation.Model.Curve/\347\233\270\344\274\274\346\215\242\347\256\227/CutSimuCalculer.cs"
index 99ecf7c..5862c25 100644
--- "a/02-desktop/Model/IStation.Model.Curve/\347\233\270\344\274\274\346\215\242\347\256\227/CutSimuCalculer.cs"
+++ "b/02-desktop/Model/IStation.Model.Curve/\347\233\270\344\274\274\346\215\242\347\256\227/CutSimuCalculer.cs"
@@ -31,8 +31,9 @@
                 return null;
             var ratio = change / origin;
 
-            List<IStation.Model.CurvePoint> simularPoints = new List<IStation.Model.CurvePoint>();
-            foreach (IStation.Model.CurvePoint pt in IStation.Model.FitCurveHelper.GetFitPoints(OriginExpress, pointNum))
+            List<IStation.Model.CurvePoint> simularPoints = new();
+            var ptList = IStation.Model.FitCurveHelper.GetFitPoints(OriginExpress, pointNum);
+            foreach (IStation.Model.CurvePoint pt in ptList)
             {
                 simularPoints.Add(new IStation.Model.CurvePoint(
                   pt.X * ratio,
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Analy/Dispatch/DispatchAnalyPage.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Analy/Dispatch/DispatchAnalyPage.cs
index 1ca1fce..6a54333 100644
--- a/02-desktop/WinFrmUI/IStation.WinFrmUI.Analy/Dispatch/DispatchAnalyPage.cs
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Analy/Dispatch/DispatchAnalyPage.cs
@@ -30,13 +30,15 @@
             public CurrentViewModel() { }
             public CurrentViewModel(IStation.Dispatch.Model.AnaScheme rhs)
             {
+                rhs.Items.ForEach(x => x.Round());
+
                 ID = rhs.ID;
-                TotalWrkQ = rhs.TotalWrkQ;
-                TotalWrkH = rhs.TotalWrkH;
-                TotalWrkE = rhs.TotalWrkE;
-                TotalWrkP = rhs.TotalWrkP;
-                UWP = rhs.UWP;
-                WP = rhs.WP;
+                TotalWrkQ = Math.Round(rhs.TotalWrkQ,1);
+                TotalWrkH =Math.Round(rhs.TotalWrkH, 1);
+                TotalWrkE =Math.Round(rhs.TotalWrkE, 1);
+                TotalWrkP = Math.Round(rhs.TotalWrkP, 1);
+                UWP = Math.Round(rhs.UWP, 1);
+                WP = Math.Round(rhs.WP, 1);
                 RunNumber = rhs.RunNumber;
                 SpanQ = rhs.SpanQ;
                 Items = rhs.Items.ToList();
@@ -172,7 +174,6 @@
             IStation.Dispatch.IOptAnaCalc calcHelper = IStation.Dispatch.DispatchAnalyCalculatorFactory.CreateOptAnaCalculator();
 
             //鏋勫缓鍙傛暟
-            string errorInfo = null;
             var complexRequestPras = new IStation.Dispatch.Model.RequestParasComplex()
             {
                 StationID = _station.ID,
@@ -189,12 +190,9 @@
                 {
                     var pipe_model = new IStation.Dispatch.Model.OutletPipePara();
                     pipe_model.TargetFlow = _targetQ;
-                    pipe_model.TargetPress = _targetH;
-                    if (range != null)
-                    {
-                        pipe_model.TargetFlowRangeMin = $"{range.Minimum}%";
-                        pipe_model.TargetFlowRangeMax = $"{range.Maximum}%";
-                    }
+                    pipe_model.TargetPress = _targetH; 
+                    pipe_model.TargetFlowRangeMin = $"{range.Minimum}%";
+                    pipe_model.TargetFlowRangeMax = $"{range.Maximum}%"; 
                     complexRequestPras.OutletPipePara.Add(pipe_model);
                 }
             }
@@ -210,7 +208,7 @@
                 }).ToList();
 
             //璁$畻
-            var anaSchemes = calcHelper.CalcSchemes(complexRequestPras, null, machineRunStatus, out errorInfo);
+            var anaSchemes = calcHelper.CalcSchemes(complexRequestPras, null, machineRunStatus, out string errorInfo);
             if (anaSchemes == null || anaSchemes.Count() == 0)
             {
                 if (string.IsNullOrEmpty(errorInfo))
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/GlobalUsings.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/GlobalUsings.cs
new file mode 100644
index 0000000..d5dc20e
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/GlobalUsings.cs
@@ -0,0 +1,25 @@
+锘縢lobal using DevExpress.Utils;
+global using DevExpress.Utils.Animation;
+global using DevExpress.XtraBars.Alerter;
+global using DevExpress.XtraEditors;
+global using DevExpress.XtraGrid;
+global using DevExpress.XtraGrid.Columns;
+global using DevExpress.XtraGrid.Views.BandedGrid;
+global using DevExpress.XtraGrid.Views.Grid;
+global using DevExpress.XtraLayout;
+global using DevExpress.XtraSplashScreen;
+global using DevExpress.XtraTreeList;
+global using DevExpress.XtraTreeList.Columns;
+global using DevExpress.XtraTreeList.Nodes;
+global using System;
+global using System.Collections;
+global using System.Collections.Generic;
+global using System.ComponentModel;
+global using System.ComponentModel.DataAnnotations;
+global using System.Drawing;
+global using System.Reflection;
+global using System.Runtime.InteropServices;
+
+global using DevExpress.XtraGrid.Views.Grid.ViewInfo;
+global using System.Linq;
+global using System.Windows.Forms;
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/IStation.WinFrmUI.Core.csproj b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/IStation.WinFrmUI.Core.csproj
index d2f0d48..54500af 100644
--- a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/IStation.WinFrmUI.Core.csproj
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/IStation.WinFrmUI.Core.csproj
@@ -60,5 +60,15 @@
   <ItemGroup>
     <Compile Remove="UICore\UserControl\VerifySliderPanel.cs" />
     <Compile Remove="UICore\UserControl\VerifySliderPanel.Designer.cs" />
+    <Compile Remove="UICore\鎻愮ず妗哱eTipStatus.cs" />
+    <Compile Remove="UICore\鎻愮ず妗哱NormalTipFrm.cs" />
+    <Compile Remove="UICore\鎻愮ず妗哱NormalTipFrm.Designer.cs" />
+    <Compile Remove="UICore\鎻愮ず妗哱TipFrmHelper.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Remove="UICore\鎻愮ず妗哱NormalTipFrm.resx" />
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="UICore\鎻愮ず妗哱" />
   </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/IStation.WinFrmUI.Core.csproj.user b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/IStation.WinFrmUI.Core.csproj.user
index a868fc4..afef5fb 100644
--- a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/IStation.WinFrmUI.Core.csproj.user
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/IStation.WinFrmUI.Core.csproj.user
@@ -4,6 +4,9 @@
     <ProjectView>ProjectFiles</ProjectView>
   </PropertyGroup>
   <ItemGroup>
+    <Compile Update="UICore\01-tip\TipForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
     <Compile Update="Basic\DocumentPage\MainForm.cs">
       <SubType>Form</SubType>
     </Compile>
@@ -59,9 +62,6 @@
       <SubType>Form</SubType>
     </Compile>
     <Compile Update="UICore\InputDialog\SetRefLineValue2Dlg.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Update="UICore\鎻愮ず妗哱NormalTipFrm.cs">
       <SubType>Form</SubType>
     </Compile>
     <Compile Update="UICore\绛夊緟妗哱WaitFormStyle1.cs">
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipForm.Designer.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipForm.Designer.cs
new file mode 100644
index 0000000..c32da59
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipForm.Designer.cs
@@ -0,0 +1,98 @@
+锘�
+using System.Drawing;
+using System.Windows.Forms;
+namespace IStation.WinFrmUI
+{
+    partial class TipForm
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            components = new Container();
+            ComponentResourceManager resources = new ComponentResourceManager(typeof(TipForm));
+            labText = new LabelControl();
+            img32 = new ImageCollection(components);
+            timer1 = new System.Windows.Forms.Timer(components);
+            ((ISupportInitialize)img32).BeginInit();
+            SuspendLayout();
+            // 
+            // labText
+            // 
+            labText.AllowHtmlString = true;
+            labText.Appearance.BackColor = Color.White;
+            labText.Appearance.FontSizeDelta = 1;
+            labText.Appearance.Options.UseBackColor = true;
+            labText.Appearance.Options.UseFont = true;
+            labText.Appearance.Options.UseTextOptions = true;
+            labText.Appearance.TextOptions.HAlignment = HorzAlignment.Center;
+            labText.Appearance.TextOptions.VAlignment = VertAlignment.Center;
+            labText.AutoSizeMode = LabelAutoSizeMode.None;
+            labText.Dock = DockStyle.Fill;
+            labText.ImageAlignToText = ImageAlignToText.LeftCenter;
+            labText.ImageOptions.ImageIndex = 0;
+            labText.ImageOptions.Images = img32;
+            labText.ImageOptions.SvgImageSize = new Size(24, 24);
+            labText.Location = new Point(1, 1);
+            labText.Name = "labText";
+            labText.Size = new Size(298, 78);
+            labText.TabIndex = 0;
+            // 
+            // img32
+            // 
+            img32.ImageSize = new Size(32, 32);
+            img32.ImageStream = (ImageCollectionStreamer)resources.GetObject("img32.ImageStream");
+            img32.Images.SetKeyName(0, "info32.png");
+            img32.Images.SetKeyName(1, "success32.png");
+            img32.Images.SetKeyName(2, "warning32.png");
+            img32.Images.SetKeyName(3, "error32.png");
+            // 
+            // timer1
+            // 
+            timer1.Interval = 2000;
+            timer1.Tick += timer_Tick;
+            // 
+            // TipForm
+            // 
+            AutoScaleDimensions = new SizeF(7F, 14F);
+            AutoScaleMode = AutoScaleMode.Font;
+            ClientSize = new Size(300, 80);
+            Controls.Add(labText);
+            FormBorderStyle = FormBorderStyle.None;
+            Name = "TipForm";
+            Padding = new Padding(1);
+            StartPosition = FormStartPosition.CenterScreen;
+            TopMost = true;
+            ((ISupportInitialize)img32).EndInit();
+            ResumeLayout(false);
+        }
+
+        #endregion
+
+        private DevExpress.XtraEditors.LabelControl labText;
+        private System.Windows.Forms.Timer timer1;
+        private DevExpress.Utils.ImageCollection img32;
+    }
+}
\ No newline at end of file
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipForm.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipForm.cs
new file mode 100644
index 0000000..72eaae3
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipForm.cs
@@ -0,0 +1,70 @@
+锘縰sing System;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace IStation.WinFrmUI
+{
+    /// <summary>
+    /// 鎻愮ず绐椾綋
+    /// </summary>
+    public partial class TipForm : DevExpress.XtraEditors.XtraForm
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public TipForm()
+        {
+            InitializeComponent();
+        }
+
+        /// <summary>
+        /// 璁剧疆
+        /// </summary>
+        public void Set(eTipStatus status, string caption, int interval)
+        {
+            this.timer1.Enabled = false;
+            this.labText.ImageOptions.ImageIndex = (int)status;
+            this.labText.Text = caption;
+            this.timer1.Interval = interval;
+            this.timer1.Enabled = true;
+            AdaptSize();
+        }
+
+        //鑷�傚簲灏哄
+        private void AdaptSize()
+        {
+            int width = 300;
+            int height = 80;
+            var bestSize = this.labText.CalcBestSize();
+            if (width < bestSize.Width + 20)
+            {
+                width = bestSize.Width + 20;
+            }
+            if (height < bestSize.Height + 20)
+            {
+                height = bestSize.Height + 20;
+            }
+            this.Size = new Size(width, height);
+        }
+
+        /// <summary>
+        /// 缁樺埗杈规
+        /// </summary>
+        /// <param name="e"></param>
+        protected override void OnPaint(PaintEventArgs e)
+        {
+            base.OnPaint(e);
+            this.DrawBorder(e, Color.Gray, 1);
+        }
+
+        //浜嬩欢
+        private void timer_Tick(object sender, EventArgs e)
+        {
+            this.timer1.Enabled = false;
+            this.Close();
+        }
+
+
+
+    }
+}
\ No newline at end of file
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipForm.resx b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipForm.resx
new file mode 100644
index 0000000..c4353b7
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipForm.resx
@@ -0,0 +1,177 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!--
+    Microsoft ResX Schema 
+
+    Version 2.0
+
+    The primary goals of this format is to allow a simple XML format
+    that is mostly human readable. The generation and parsing of the
+    various data types are done through the TypeConverter classes
+    associated with the data types.
+
+    Example:
+
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+
+    There are any number of "resheader" rows that contain simple
+    name/value pairs.
+
+    Each data row contains a name, and value. The row also contains a
+    type or mimetype. Type corresponds to a .NET class that support
+    text/value conversion through the TypeConverter architecture.
+    Classes that don't support this are serialized and stored with the
+    mimetype set.
+
+    The mimetype is used for serialized objects, and tells the
+    ResXResourceReader how to depersist the object. This is currently not
+    extensible. For a given mimetype the value must be set accordingly:
+
+    Note - application/x-microsoft.net.object.binary.base64 is the format
+    that the ResXResourceWriter will generate, however the reader can
+    read any of the formats listed below.
+
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="img32.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>107, 17</value>
+  </metadata>
+  <assembly alias="DevExpress.Utils.v23.2" name="DevExpress.Utils.v23.2, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
+  <data name="img32.ImageStream" type="DevExpress.Utils.ImageCollectionStreamer, DevExpress.Utils.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFpEZXZFeHByZXNzLlV0aWxzLnYyMy4yLCBWZXJzaW9uPTIzLjIu
+        NC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI4OGQxNzU0ZDcwMGU0OWEMAwAAAFFT
+        eXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRv
+        a2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAAChEZXZFeHByZXNzLlV0aWxzLkltYWdlQ29sbGVjdGlvblN0
+        cmVhbWVyAgAAAAlJbWFnZVNpemUERGF0YQQHE1N5c3RlbS5EcmF3aW5nLlNpemUDAAAAAgIAAAAF/P//
+        /xNTeXN0ZW0uRHJhd2luZy5TaXplAgAAAAV3aWR0aAZoZWlnaHQAAAgIAwAAACAAAAAgAAAACQUAAAAP
+        BQAAADsJAAACogEAAIlQTkcNChoKAAAADUlIRFIAAAAgAAAAIAgGAAAAc3p69AAAAARnQU1BAACxjwv8
+        YQUAAAFZSURBVFhH7VfLDcIwDO0o7RTcWYAjQ3BkFQoswIkJWAEG4N4zF1ohJC7FDo5K0Wv+gIR40pOi
+        xvaz6sRJsj98kK/rSbFqymJZ74tlcyK2QhrTN5pjGzFPh6Ks5yRSPQnaWLGPuIcjX5xHFOgABNxIvhxD
+        wvkhL5spDBpAjiVh3ZBSXNM5CfXbQYAUdCpHVM1tpNgig8ErFzoCjjeXdnu8KfIY2UCadgcZOG81Ftbg
+        MbIZYCVyfagmgx0gIxJoYbN6dDjsgBhcAiZpiWwHaa/YITnrvch2oInn3m7lbHftEdkYeBLZDsDISBbV
+        CEigFdkOyMjEdyTgXQKNgARQCfwWYVwCaBF6bsOoBNA29G1EMQkM3ppo0rkVRySAWzHD5zAKpu2qxkcm
+        dExB23HM+PqFhPHVK5lGyiS8xTVUOWLWBPk6/3YTeOVSwM8/TF6hmpXqmB9+mv0wsuwO9tDFc6Lhhy0A
+        AAAASUVORK5CYILfAgAAiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGP
+        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
+</value>
+  </data>
+  <metadata name="timer1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
\ No newline at end of file
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipFormHelper.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipFormHelper.cs
new file mode 100644
index 0000000..5f2ecb6
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipFormHelper.cs
@@ -0,0 +1,85 @@
+锘縩amespace IStation.WinFrmUI
+{
+    /// <summary>
+    /// 鎻愮ず妗嗚緟鍔╃被
+    /// </summary>
+    public class TipFormHelper
+    {
+        //鑾峰彇鎻愮ず绐椾綋
+        private static TipForm GetTipForm()
+        {
+            if (_tipForm == null || _tipForm.IsDisposed)
+            {
+                lock (_locker)
+                {
+                    if (_tipForm == null || _tipForm.IsDisposed)
+                    {
+                        _tipForm = new TipForm();
+                    }
+                }
+            }
+            return _tipForm;
+        }
+        private static TipForm _tipForm = null;
+        private static object _locker = new();//閿佸璞�
+
+        /// <summary>
+        /// 鏄剧ず鎻愮ず绐椾綋
+        /// </summary>
+        /// <param name="status">鎻愮ず鐘舵��</param>
+        /// <param name="caption">鎻愮ず淇℃伅</param>
+        /// <param name="interval">鎸佺画鏃堕棿锛堟绉掞級</param>
+        public static void Show(eTipStatus status, string caption, int interval = 2000)
+        {
+            var frm = GetTipForm();
+            frm.Set(status, caption, interval);
+            frm.Show();
+        }
+
+        /// <summary>
+        /// 鏄剧ず淇℃伅鎻愮ず绐椾綋
+        /// </summary>
+        /// <param name="caption">鎻愮ず淇℃伅</param>
+        /// <param name="interval">鎸佺画鏃堕棿锛堟绉掞級</param>
+        public static void ShowInfo(string caption, int interval = 2000)
+        {
+            Show(eTipStatus.Info, caption, interval);
+        }
+
+        /// <summary>
+        /// 鏄剧ず鎴愬姛鎻愮ず绐椾綋
+        /// </summary>
+        /// <param name="caption">鎻愮ず淇℃伅</param>
+        /// <param name="interval">鎸佺画鏃堕棿锛堟绉掞級</param>
+        public static void ShowSucceed(string caption, int interval = 2000)
+        {
+            Show(eTipStatus.Succeed, caption, interval);
+        }
+
+        /// <summary>
+        /// 鏄剧ず璀﹀憡鎻愮ず绐椾綋
+        /// </summary>
+        /// <param name="caption">鎻愮ず淇℃伅</param>
+        /// <param name="interval">鎸佺画鏃堕棿锛堟绉掞級</param>
+        public static void ShowWarn(string caption, int interval = 2000)
+        {
+            Show(eTipStatus.Warn, caption, interval);
+        }
+
+        /// <summary>
+        /// 鏄剧ず閿欒鎻愮ず绐椾綋
+        /// </summary>
+        /// <param name="caption">鎻愮ず淇℃伅</param>
+        /// <param name="interval">鎸佺画鏃堕棿锛堟绉掞級</param>
+        public static void ShowError(string caption, int interval = 2000)
+        {
+            Show(eTipStatus.Error, caption, interval);
+        }
+
+
+
+
+
+
+    }
+}
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/eTipStatus.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/eTipStatus.cs
new file mode 100644
index 0000000..bfb5a9f
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/eTipStatus.cs
@@ -0,0 +1,32 @@
+锘縩amespace IStation.WinFrmUI
+{
+    /// <summary>
+    /// 鎻愮ず鐘舵��
+    /// </summary>
+    public enum eTipStatus
+    {
+
+        /// <summary>
+        /// 淇℃伅
+        /// </summary>
+        Info = 0,
+
+        /// <summary>
+        /// 鎴愬姛
+        /// </summary>
+        Succeed = 1,
+
+        /// <summary>
+        /// 璀﹀憡
+        /// </summary>
+        Warn = 2,
+
+        /// <summary>
+        /// 閿欒
+        /// </summary>
+        Error = 3,
+
+
+
+    }
+}
diff --git "a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/\345\217\263\344\270\213\345\274\271\347\252\227/AlertTool.cs" "b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/\345\217\263\344\270\213\345\274\271\347\252\227/AlertTool.cs"
index b6e10b6..df0c636 100644
--- "a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/\345\217\263\344\270\213\345\274\271\347\252\227/AlertTool.cs"
+++ "b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/\345\217\263\344\270\213\345\274\271\347\252\227/AlertTool.cs"
@@ -34,6 +34,7 @@
             AlertTool.Alert.Show(owner, info);
         }
 
+    
 
     }
 }
diff --git "a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/\346\211\251\345\261\225\347\261\273/GridViewExtend.cs" "b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/\346\211\251\345\261\225\347\261\273/GridViewExtend.cs"
index 226b834..d7993eb 100644
--- "a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/\346\211\251\345\261\225\347\261\273/GridViewExtend.cs"
+++ "b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/\346\211\251\345\261\225\347\261\273/GridViewExtend.cs"
@@ -1,15 +1,4 @@
-锘縰sing DevExpress.Utils;
-using DevExpress.XtraEditors;
-using DevExpress.XtraGrid.Columns;
-using DevExpress.XtraGrid.Views.Grid;
-using DevExpress.XtraGrid.Views.Grid.ViewInfo;
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Drawing;
-using System.Linq;
-using System.Windows.Forms;
-
+锘�
 namespace IStation.WinFrmUI
 {
     /// <summary>
@@ -32,7 +21,7 @@
             grid.OptionsSelection.EnableAppearanceFocusedCell = false;
             grid.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
             grid.Appearance.Row.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
-            grid.FocusRectStyle = DrawFocusRectStyle.RowFullFocus;
+            grid.FocusRectStyle = DevExpress.XtraGrid.Views.Grid.DrawFocusRectStyle.RowFullFocus;
             grid.OptionsCustomization.AllowFilter = false;
             grid.OptionsCustomization.AllowSort = true;
             grid.OptionsCustomization.AllowQuickHideColumns = false;
@@ -72,7 +61,7 @@
             grid.OptionsSelection.EnableAppearanceFocusedCell = false;
             grid.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
             grid.Appearance.Row.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
-            grid.FocusRectStyle = DrawFocusRectStyle.RowFullFocus;
+            grid.FocusRectStyle = DevExpress.XtraGrid.Views.Grid.DrawFocusRectStyle.RowFullFocus;
             grid.OptionsCustomization.AllowFilter = false;
             grid.OptionsCustomization.AllowSort = false;
             grid.OptionsCustomization.AllowQuickHideColumns = false;
@@ -110,7 +99,7 @@
             grid.OptionsSelection.EnableAppearanceFocusedCell = false;
             grid.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
             grid.Appearance.Row.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
-            grid.FocusRectStyle = DrawFocusRectStyle.RowFullFocus;
+            grid.FocusRectStyle = DevExpress.XtraGrid.Views.Grid.DrawFocusRectStyle.RowFullFocus;
             grid.OptionsCustomization.AllowFilter = true;
             grid.OptionsCustomization.AllowSort = true;
             grid.OptionsCustomization.AllowQuickHideColumns = false;
@@ -155,7 +144,7 @@
             grid.OptionsSelection.EnableAppearanceFocusedCell = false;
             grid.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
             grid.Appearance.Row.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
-            grid.FocusRectStyle = DrawFocusRectStyle.RowFullFocus;
+            grid.FocusRectStyle = DevExpress.XtraGrid.Views.Grid.DrawFocusRectStyle.RowFullFocus;
             grid.OptionsCustomization.AllowFilter = false;
             grid.OptionsCustomization.AllowSort = false;
             grid.OptionsCustomization.AllowQuickHideColumns = false;
@@ -193,7 +182,7 @@
             grid.OptionsSelection.EnableAppearanceFocusedCell = false;
             grid.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
             grid.Appearance.Row.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
-            grid.FocusRectStyle = DrawFocusRectStyle.RowFullFocus;
+            grid.FocusRectStyle = DevExpress.XtraGrid.Views.Grid.DrawFocusRectStyle.RowFullFocus;
             grid.OptionsCustomization.AllowFilter = true;
             grid.OptionsCustomization.AllowSort = true;
             grid.OptionsCustomization.AllowQuickHideColumns = false;
@@ -224,7 +213,7 @@
             grid.OptionsSelection.EnableAppearanceFocusedCell = false;
             grid.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
             grid.Appearance.Row.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
-            grid.FocusRectStyle = DrawFocusRectStyle.RowFullFocus;
+            grid.FocusRectStyle = DevExpress.XtraGrid.Views.Grid.DrawFocusRectStyle.RowFullFocus;
             grid.OptionsCustomization.AllowFilter = false;
             grid.OptionsCustomization.AllowSort = false;
             grid.OptionsCustomization.AllowQuickHideColumns = false;
@@ -496,7 +485,7 @@
             grid.OptionsSelection.EnableAppearanceFocusedCell = false;
             grid.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
             grid.Appearance.Row.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
-            grid.FocusRectStyle = DrawFocusRectStyle.RowFullFocus;
+            grid.FocusRectStyle = DevExpress.XtraGrid.Views.Grid.DrawFocusRectStyle.RowFullFocus;
             grid.OptionsCustomization.AllowFilter = true;
             grid.OptionsCustomization.AllowSort = true;
             grid.OptionsCustomization.AllowQuickHideColumns = false;
diff --git "a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/\346\211\251\345\261\225\347\261\273/TreeListExtend.cs" "b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/\346\211\251\345\261\225\347\261\273/TreeListExtend.cs"
index a9afb76..462a449 100644
--- "a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/\346\211\251\345\261\225\347\261\273/TreeListExtend.cs"
+++ "b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/\346\211\251\345\261\225\347\261\273/TreeListExtend.cs"
@@ -39,7 +39,7 @@
             rhs.OptionsBehavior.ReadOnly = true;
             rhs.OptionsSelection.EnableAppearanceFocusedCell = false;
             rhs.OptionsMenu.EnableNodeMenu = false;
-            rhs.OptionsView.FocusRectStyle = DrawFocusRectStyle.None;
+            rhs.OptionsView.FocusRectStyle = DevExpress.XtraTreeList.DrawFocusRectStyle.None;
             rhs.OptionsSelection.SelectNodesOnRightClick = true;
             rhs.ViewStyle = TreeListViewStyle.TreeView;
             rhs.RowHeight = height;
@@ -69,7 +69,7 @@
         {
             rhs.OptionsSelection.EnableAppearanceFocusedCell = false;
             rhs.OptionsMenu.EnableNodeMenu = false;
-            rhs.OptionsView.FocusRectStyle = DrawFocusRectStyle.None;
+            rhs.OptionsView.FocusRectStyle = DevExpress.XtraTreeList.DrawFocusRectStyle.None;
             rhs.OptionsSelection.SelectNodesOnRightClick = true;
             rhs.OptionsMenu.EnableColumnMenu = false;
             rhs.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
@@ -88,7 +88,7 @@
             rhs.OptionsBehavior.ReadOnly = true;
             rhs.OptionsSelection.EnableAppearanceFocusedCell = false;
             rhs.OptionsMenu.EnableNodeMenu = false;
-            rhs.OptionsView.FocusRectStyle = DrawFocusRectStyle.None;
+            rhs.OptionsView.FocusRectStyle = DevExpress.XtraTreeList.DrawFocusRectStyle.None;
             rhs.OptionsSelection.SelectNodesOnRightClick = true;
             rhs.OptionsMenu.EnableColumnMenu = false;
             rhs.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Curve/Import/Excel/ImportCurveByExcelCtrl.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Curve/Import/Excel/ImportCurveByExcelCtrl.cs
index cd82b44..e8d5d33 100644
--- a/02-desktop/WinFrmUI/IStation.WinFrmUI.Curve/Import/Excel/ImportCurveByExcelCtrl.cs
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Curve/Import/Excel/ImportCurveByExcelCtrl.cs
@@ -1,4 +1,5 @@
-锘縰sing DevExpress.Utils;
+锘縰sing DevExpress.CodeParser;
+using DevExpress.Utils;
 using DevExpress.XtraEditors;
 using DevExpress.XtraGrid.Views.Grid;
 using NPOI.HSSF.UserModel;
@@ -304,14 +305,18 @@
                     else
                         power = -1;
 
-                    if (eta > 0)
+                    if (eta > 0&& power<0.1)
                     {
                         power = Model.CurveCalcuHelper.CalculateP(q, h, eta);
                     }
-                    else
+                    else if (eta<1&&power>0.1)
                     {
                         eta = Model.CurveCalcuHelper.CalculateE(q, h, power);
                     }
+                    //else
+                    //{
+                    //    eta = Model.CurveCalcuHelper.CalculateE(q, h, power);
+                    //}
 
                     if (eta > 99)
                     {
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/01-entity/01-analysis/AnalysisParameter.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/01-entity/01-analysis/AnalysisParameter.cs
new file mode 100644
index 0000000..9650e18
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/01-entity/01-analysis/AnalysisParameter.cs
@@ -0,0 +1,90 @@
+锘縩amespace IStation.Entity
+{
+    /// <summary>
+    /// 鍒嗘瀽鍙傛暟
+    /// </summary>  
+    public class AnalysisParameter : BaseEntity, System.ICloneable
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public AnalysisParameter() { } 
+
+        /// <summary>
+        /// 
+        /// </summary> 
+        public AnalysisParameter(AnalysisParameter rhs)
+        {
+            this.ID = rhs.ID;
+            this.PumpID = rhs.PumpID;
+            this.Hz = rhs.Hz;
+            this.Head = rhs.Head;
+            this.PressureDiff = rhs.PressureDiff;
+            this.Flow = rhs.Flow;
+            this.Power = rhs.Power;
+            this.Eff = rhs.Eff;
+            this.WP = rhs.WP;
+            this.UWP = rhs.UWP;
+        }
+
+        /// <summary>
+        /// 娉垫爣璇�
+        /// </summary> 
+        public long PumpID { get; set; }
+
+        /// <summary>
+        /// 棰戠巼
+        /// </summary>
+        public double Hz { get; set; }
+
+        /// <summary>
+        /// 鎵▼
+        /// </summary>
+        public double Head { get; set; }
+
+        /// <summary>
+        /// 鍘嬪樊
+        /// </summary>
+        public double PressureDiff { get; set; }
+
+        /// <summary>
+        /// 鎬绘祦閲�
+        /// </summary>
+        public double Flow { get; set; }
+
+        /// <summary>
+        /// 鎬诲姛鐜�
+        /// </summary>
+        public double Power { get; set; }
+         
+        /// <summary>
+        /// 鎬诲姛鐜�
+        /// </summary>
+        public double Eff { get; set; }
+
+        /// <summary>
+        /// 鍗冨惃姘磋兘鑰� 
+        /// </summary>
+        public double WP { get; set; }
+
+        /// <summary>
+        /// 鍗曚綅鑳借��
+        /// </summary>
+        public double UWP { get; set; }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <returns></returns>
+        public AnalysisParameter Clone()
+        {
+            return (AnalysisParameter)this.MemberwiseClone();
+        }
+
+        object ICloneable.Clone()
+        {
+            return this.MemberwiseClone();
+        }
+
+    }
+}
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/01-entity/01-analysis/AnalysisPump.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/01-entity/01-analysis/AnalysisPump.cs
new file mode 100644
index 0000000..d48d7b2
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/01-entity/01-analysis/AnalysisPump.cs
@@ -0,0 +1,93 @@
+锘縩amespace IStation.Entity
+{
+    /// <summary>
+    /// 鍒嗘瀽娉�
+    /// </summary>   
+    public class AnalysisPump : BaseEntity, System.ICloneable
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public AnalysisPump()
+        {
+
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>  
+        public AnalysisPump(AnalysisPump rhs)
+        {
+            this.ID = rhs.ID;
+            this.Flag = rhs.Flag;
+            this.Hz = rhs.Hz;
+            this.CurveQH = rhs.CurveQH;
+            this.CurveQP = rhs.CurveQP;
+            this.CurveQE = rhs.CurveQE;
+            this.MinFlow = rhs.MinFlow;
+            this.MaxFlow = rhs.MaxFlow;
+            this.MaxHead = rhs.MaxHead;
+            this.MinHead = rhs.MinHead;
+        }
+
+        /// <summary>
+        /// 鏍囧織
+        /// </summary>
+        public int Flag { get; set; }
+
+        /// <summary>
+        /// 棰戠巼
+        /// </summary>
+        public double Hz { get; set; }
+
+        /// <summary>
+        /// 娴侀噺鎵▼绾�
+        /// </summary>
+        public string CurveQH { get; set; }
+
+        /// <summary>
+        /// 娴侀噺鍔熺巼绾�
+        /// </summary>
+        public string CurveQP { get; set; }
+
+        /// <summary>
+        /// 娴侀噺鏁堢巼绾�
+        /// </summary>
+        public string CurveQE { get; set; }
+
+        /// <summary>
+        /// 鏈�澶ф祦閲�
+        /// </summary>
+        public double MaxFlow { get; set; }
+
+        /// <summary>
+        /// 鏈�灏忔祦閲�
+        /// </summary>
+        public double MinFlow { get; set; }
+
+        /// <summary>
+        /// 鏈�澶ф壃绋�
+        /// </summary>
+        public double MaxHead { get; set; }
+
+        /// <summary>
+        /// 鏈�灏忔壃绋�
+        /// </summary>
+        public double MinHead { get; set; }
+ 
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <returns></returns>
+        public AnalysisPump Clone()
+        {
+            return (AnalysisPump)this.MemberwiseClone();
+        }
+
+        object ICloneable.Clone()
+        {
+            return this.MemberwiseClone();
+        }
+    }
+}
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/02-model/00-basic/02-config/FrequencyLimit.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/02-model/00-basic/02-config/FrequencyLimit.cs
new file mode 100644
index 0000000..46e0db7
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/02-model/00-basic/02-config/FrequencyLimit.cs
@@ -0,0 +1,69 @@
+锘縩amespace IStation.Model
+{
+    /// <summary>
+    /// 棰戠巼闄愬埗
+    /// </summary> 
+    public class FrequencyLimit : System.ICloneable
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public FrequencyLimit() { }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="rhs"></param>
+        public FrequencyLimit(FrequencyLimit rhs)
+        {
+            this.Flag = rhs.Flag;
+            this.Min = rhs.Min;
+            this.Max = rhs.Max;
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="rhs"></param>
+        public void Reset(FrequencyLimit rhs)
+        {
+            this.Flag = rhs.Flag;
+            this.Min = rhs.Min;
+            this.Max = rhs.Max;
+        }
+
+
+        /// <summary>
+        /// 杩愯鏍囧織
+        /// </summary>
+        public int Flag { get; set; }
+
+        /// <summary>
+        /// 鏈�灏�
+        /// </summary>
+        public double Min { get; set; }
+
+        /// <summary>
+        /// 鏈�澶�
+        /// </summary>
+        public double Max { get; set; }
+
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <returns></returns>
+        public FrequencyLimit Clone()
+        {
+            return (FrequencyLimit)this.MemberwiseClone();
+        }
+
+        object ICloneable.Clone()
+        {
+            return this.MemberwiseClone();
+        }
+    }
+
+
+
+}
\ No newline at end of file
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/02-model/00-basic/02-config/ScheduleConfig.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/02-model/00-basic/02-config/ScheduleConfig.cs
new file mode 100644
index 0000000..f5c98f3
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/02-model/00-basic/02-config/ScheduleConfig.cs
@@ -0,0 +1,125 @@
+锘縰sing System.Dynamic;
+
+namespace IStation.Model
+{
+    /// <summary>
+    /// 璋冨害閰嶇疆
+    /// </summary>
+    public class ScheduleConfig : System.ICloneable
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public ScheduleConfig() { }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="rhs"></param>
+        public ScheduleConfig(ScheduleConfig rhs)
+        {
+            this.MinOpenCount = rhs.MinOpenCount;
+            this.MaxOpenCount = rhs.MaxOpenCount;
+            this.MustOpenFlagList = rhs.MustOpenFlagList?.ToList();
+            this.MustCloseFlagList = rhs.MustCloseFlagList?.ToList();
+            this.ForbiddenFlagCombineList = rhs.ForbiddenFlagCombineList?.ToList();
+            this.AssociativeFlagCombineList = rhs.AssociativeFlagCombineList?.ToList();
+            this.SameSectionFlagCombineList = rhs.SameSectionFlagCombineList?.ToList();
+            this.WaterSupplyLimitList = rhs.WaterSupplyLimitList?.ToList();
+            this.FrequencyLimitList = rhs.FrequencyLimitList?.ToList(); 
+            this.PriorityOpenFlagList = rhs.PriorityOpenFlagList?.ToList();
+            this.MaintenanceFlagList=rhs.MaintenanceFlagList?.ToList();
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="rhs"></param>
+        public void Reset(ScheduleConfig rhs)
+        {
+            this.MinOpenCount = rhs.MinOpenCount;
+            this.MaxOpenCount = rhs.MaxOpenCount;
+            this.MustOpenFlagList = rhs.MustOpenFlagList?.ToList();
+            this.MustCloseFlagList = rhs.MustCloseFlagList?.ToList();
+            this.ForbiddenFlagCombineList = rhs.ForbiddenFlagCombineList?.ToList();
+            this.AssociativeFlagCombineList = rhs.AssociativeFlagCombineList?.ToList();
+            this.SameSectionFlagCombineList = rhs.SameSectionFlagCombineList?.ToList();
+            this.WaterSupplyLimitList = rhs.WaterSupplyLimitList?.ToList();
+            this.FrequencyLimitList = rhs.FrequencyLimitList?.ToList(); 
+            this.PriorityOpenFlagList = rhs.PriorityOpenFlagList?.ToList();
+            this.MaintenanceFlagList=rhs.MaintenanceFlagList?.ToList();
+        }
+
+
+        /// <summary>
+        /// 鏈�灏忓紑娉垫暟閲�
+        /// </summary>
+        public int MinOpenCount { get; set; }
+
+        /// <summary>
+        /// 鏈�澶у紑娉垫暟閲�
+        /// </summary>
+        public int MaxOpenCount { get; set; }
+
+        /// <summary>
+        /// 蹇呭紑娉靛垪琛�
+        /// </summary>
+        public List<int> MustOpenFlagList { get; set; }
+
+        /// <summary>
+        /// 蹇呭叧娉靛垪琛�
+        /// </summary>
+        public List<int> MustCloseFlagList { get; set; }
+
+        /// <summary>
+        /// 绂佺敤娉电粍鍚堝垪琛�
+        /// </summary>
+        public List<List<int>> ForbiddenFlagCombineList { get; set; }
+
+        /// <summary>
+        /// 鍏宠仈娉电粍鍚堝垪琛�
+        /// </summary>
+        public List<List<int>> AssociativeFlagCombineList { get; set; }
+
+        /// <summary>
+        /// 鍚屾娉电粍鍚堝垪琛�
+        /// </summary>
+        public List<List<int>> SameSectionFlagCombineList { get; set; }
+
+        /// <summary>
+        /// 渚涙按闄愬埗鍒楄〃
+        /// </summary>
+        public List<WaterSupplyLimit> WaterSupplyLimitList { get; set; }
+
+        /// <summary>
+        /// 棰戠巼闄愬埗鍒楄〃
+        /// </summary> 
+        public List<FrequencyLimit> FrequencyLimitList { get; set; }
+         
+         
+        /// <summary>
+        /// 浼樺厛寮�娉靛垪琛�
+        /// </summary>
+        public List<int> PriorityOpenFlagList { get; set; }
+
+        /// <summary>
+        /// 妫�淇垪琛�
+        /// </summary>
+        public List<int> MaintenanceFlagList { get; set; }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <returns></returns>
+        public ScheduleConfig Clone()
+        {
+            return (ScheduleConfig)this.MemberwiseClone();
+        }
+
+        object ICloneable.Clone()
+        {
+            return this.MemberwiseClone();
+        }
+
+    }
+}
\ No newline at end of file
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/02-model/00-basic/02-config/WaterSupplyLimit.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/02-model/00-basic/02-config/WaterSupplyLimit.cs
new file mode 100644
index 0000000..3f4f386
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/02-model/00-basic/02-config/WaterSupplyLimit.cs
@@ -0,0 +1,69 @@
+锘縩amespace IStation.Model
+{
+    /// <summary>
+    /// 渚涙按闄愬埗
+    /// </summary>
+    public class WaterSupplyLimit : System.ICloneable
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public WaterSupplyLimit() { }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="rhs"></param>
+        public WaterSupplyLimit(WaterSupplyLimit rhs)
+        {
+            this.PumpCount = rhs.PumpCount;
+            this.Min = rhs.Min;
+            this.Max = rhs.Max;
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="rhs"></param>
+        public void Reset(WaterSupplyLimit rhs)
+        {
+            this.PumpCount = rhs.PumpCount;
+            this.Min = rhs.Min;
+            this.Max = rhs.Max;
+        }
+
+
+        /// <summary>
+        /// 娉垫暟閲�
+        /// </summary>
+        public int PumpCount { get; set; }
+
+        /// <summary>
+        /// 鏈�灏�
+        /// </summary>
+        public double Min { get; set; }
+
+        /// <summary>
+        /// 鏈�澶�
+        /// </summary>
+        public double Max { get; set; }
+
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <returns></returns>
+        public WaterSupplyLimit Clone()
+        {
+            return (WaterSupplyLimit)this.MemberwiseClone();
+        }
+
+        object ICloneable.Clone()
+        {
+            return this.MemberwiseClone();
+        }
+    }
+
+
+
+}
\ No newline at end of file
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/04-dal/01-analysis/AnalysisParameter.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/04-dal/01-analysis/AnalysisParameter.cs
new file mode 100644
index 0000000..aa85856
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/04-dal/01-analysis/AnalysisParameter.cs
@@ -0,0 +1,184 @@
+锘縰sing SqlSugar;
+
+namespace IStation.DAL.SQLite
+{
+    /// <summary>
+    /// 
+    /// </summary>
+    public partial class AnalysisParameter :  DAL.BaseDAL<Entity.AnalysisParameter>
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public override ConnectionConfig ConnectionConfig
+        {
+            get { return ConfigHelper.AnalysisConnectionConfig; }
+
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        private string TableNamePrefix
+        {
+            get { return "AnalysisParameter_"; }
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="runFlag"></param>
+        /// <returns></returns>
+        public string GetTableName(string runFlag)
+        {
+            return $"{this.TableNamePrefix}{runFlag}";
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="tableName"></param>
+        /// <returns></returns>
+        private string GetCreateTableSql(string tableName)
+        {
+            var sql = $"CREATE TABLE  {tableName} (ID   BIGINT NOT NULL\r\n   PRIMARY KEY,\r\n    PumpID  BIGINT,\r\n    Hz   REAL,\r\n    Head   REAL,\r\n    PressureDiff REAL,\r\n    Flow  REAL,\r\n    Power   REAL,\r\n    Eff   REAL,\r\n    WP    REAL,\r\n    UWP REAL\r\n);";
+            return sql;
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="tableName"></param>
+        /// <returns></returns>
+        private string GetExistTableSql(string tableName)
+        {
+            var sql = $"select count(*)  from sqlite_master where type = 'table' and name = '{tableName}';";
+            return sql;
+        }
+
+
+        /// <summary>
+        /// 鑾峰彇鍏ㄩ儴琛ㄥ悕
+        /// </summary>
+        public List<string> GetAllTableName()
+        {
+            using (SqlSugarClient db = new SqlSugarClient(ConnectionConfig))
+            {
+                var list = new List<string>();
+                var sql = $"select name from sqlite_master where type='table' and name like '%{this.TableNamePrefix}%';";
+                using (var reader = db.Ado.GetDataReader(sql))
+                {
+                    while (reader.Read())
+                    {
+                        var tableName = reader["name"].ToString();
+                        list.Add(tableName);
+                    }
+                }
+                return list;
+            }
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍏ㄩ儴琛�
+        /// </summary> 
+        public Dictionary<string, List<Entity.AnalysisParameter>> GetAllTable()
+        {
+            var tableNames = GetAllTableName();
+            if (tableNames == null || !tableNames.Any())
+                return default;
+
+            var dict = new Dictionary<string, List<Entity.AnalysisParameter>>();
+            using (SqlSugarClient db = new SqlSugarClient(ConnectionConfig))
+            {
+                foreach (var tableName in tableNames)
+                {
+                    var sql = $"select * from {tableName}";
+                    var list = db.Queryable<Entity.AnalysisParameter>().AS(tableName).ToList();
+                    if (list == null || !list.Any())
+                        continue;
+                    dict.Add(tableName, list);
+                }
+                return dict;
+            }
+        }
+
+
+        /// <summary>
+        /// 澶ф壒閲忔彃鍏�(琛ㄤ笉瀛樺湪灏辨柊寤�)
+        /// </summary>
+        public bool BulkInsertsEx(string runFlag, List<Entity.AnalysisParameter> list)
+        {
+            if (list == null || list.Count < 1)
+                return default;
+            var tableName = GetTableName(runFlag);
+            using (SqlSugarClient db = new SqlSugarClient(ConnectionConfig))
+            {
+                var exist_sql = GetExistTableSql(tableName);
+                if (db.Ado.GetInt(exist_sql) < 1)
+                {
+                    var sql_create_table = GetCreateTableSql(tableName);
+                    db.Ado.ExecuteCommand(sql_create_table);
+                }
+                //澶ф暟鎹啓鍏�
+                return db.Fastest<Entity.AnalysisParameter>().AS(tableName).BulkCopy(list) > 0;
+            }
+        }
+
+        /// <summary>
+        /// 鍒ゆ柇鏁版嵁搴撴槸鍚﹀瓨鍦ㄨ〃
+        /// </summary> 
+        public bool ExistTable(string runFlag)
+        {
+            using (SqlSugarClient db = new SqlSugarClient(ConnectionConfig))
+            {
+                var tableName = GetTableName(runFlag);
+                var sql = GetExistTableSql(tableName);
+                var bol = db.Ado.ExecuteCommand(sql) > 0;
+                return bol;
+            }
+        }
+
+        /// <summary>
+        /// 鍒犻櫎鎵�鏈夎〃
+        /// </summary>
+        public bool DeleteAllTable()
+        {
+            var tables = GetAllTableName();
+            if (tables == null || !tables.Any())
+                return false;
+            using (SqlSugarClient db = new SqlSugarClient(ConnectionConfig))
+            {
+                db.BeginTran();
+                foreach (var table in tables)
+                {
+                    var sql = $"drop table {table};";
+                    db.Ado.ExecuteCommand(sql);
+                }
+                db.CommitTran();
+            }
+            return true;
+        }
+
+
+        /// <summary>
+        /// 鏌ヨ
+        /// </summary>
+        public List<Entity.AnalysisParameter> GetList(string runFlag, double targetHead)
+        {
+            var tableName = GetTableName(runFlag);
+            using (SqlSugarClient db = new SqlSugarClient(ConnectionConfig))
+            {
+                var sql = GetExistTableSql(tableName);
+                if (db.Ado.GetInt(sql) < 1)
+                {
+                    return default;
+                }
+                var list = db.Queryable<Entity.AnalysisParameter>().AS(tableName)
+                      .Where(x => x.Head == targetHead)
+                      .OrderBy(x => x.Power)
+                      .ToList();
+                return list;
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/04-dal/01-analysis/AnalysisPump.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/04-dal/01-analysis/AnalysisPump.cs
new file mode 100644
index 0000000..77e7500
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/04-dal/01-analysis/AnalysisPump.cs
@@ -0,0 +1,212 @@
+锘縰sing SqlSugar;
+
+namespace IStation.DAL.SQLite
+{
+    /// <summary>
+    /// 
+    /// </summary>
+    public partial class AnalysisPump : DAL.BaseDAL<Entity.AnalysisPump>
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public override ConnectionConfig ConnectionConfig
+        {
+            get { return ConfigHelper.AnalysisConnectionConfig; }
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        private string TableNamePrefix
+        {
+            get { return "AnalysisPump_"; }
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="runFlag"></param>
+        /// <returns></returns>
+        public string GetTableName(string runFlag)
+        {
+            return $"{this.TableNamePrefix}{runFlag}";
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="tableName"></param>
+        /// <returns></returns>
+        private string GetCreateTableSql(string tableName)
+        {
+            var sql = $"CREATE TABLE {tableName}  (ID   BIGINT   NOT NULL\r\n   PRIMARY KEY,\r\n    Flag    INTEGER,\r\n    Hz  REAL,\r\n    CurveQH VARCHAR (255),\r\n    CurveQP VARCHAR (255),\r\n    CurveQE VARCHAR (255),\r\n    MaxFlow REAL,\r\n    MinFlow REAL,\r\n    MaxHead REAL,\r\n    MinHead REAL\r\n);";
+            return sql;
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="tableName"></param>
+        /// <returns></returns>
+        private string GetExistTableSql(string tableName)
+        {
+            var sql = $"select count(*)  from sqlite_master where type = 'table' and name = '{tableName}';";
+            return sql; 
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="tableName"></param>
+        /// <returns></returns>
+        public string GetRunFlag(string tableName)
+        {
+            return tableName.Replace(this.TableNamePrefix, null);
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍏ㄩ儴琛ㄥ悕
+        /// </summary>
+        public List<string> GetAllTableName()
+        {
+            using (SqlSugarClient db = new SqlSugarClient(ConnectionConfig))
+            {
+                var list = new List<string>();
+                var sql = $"select name from sqlite_master where type='table' and name like '%{this.TableNamePrefix}%';";
+                using (var reader = db.Ado.GetDataReader(sql))
+                {
+                    while (reader.Read())
+                    {
+                        var tableName = reader["name"].ToString(); 
+                        list.Add(tableName);
+                    }
+                }
+                return list;
+            }
+        }
+
+
+
+        /// <summary>
+        /// 鑾峰彇鍏ㄩ儴琛�
+        /// </summary> 
+        public Dictionary<string, List<Entity.AnalysisPump>> GetAllTable()
+        {
+            //using (SqlSugarClient db = new SqlSugarClient(ConnectionConfig))
+            //{
+            //    var tableNames = new List<string>();
+            //    var sql_sel_table = $"select name from sqlite_master where type='table' and name like '%{this.TableNamePrefix}%';";
+            //    var reader = db.Ado.GetDataReader(sql_sel_table);
+            //    while (reader.Read())
+            //    {
+            //        var tableName = reader["name"].ToString();
+            //        tableNames.Add(tableName);
+            //    }
+            //    if (tableNames == null || !tableNames.Any())
+            //        return default;
+
+            //    var dict = new Dictionary<string, List<Entity.AnalysisPump>>();
+            //    foreach (var tableName in tableNames)
+            //    {
+            //        var sql = $"select * from {tableName}";
+            //        var list = db.Ado.SqlQuery<Entity.AnalysisPump>(sql);
+            //        if (list == null || !list.Any())
+            //            continue;
+            //        dict.Add(tableName, list);
+            //    }
+            //    return dict;
+            //}
+
+            var tableNames = GetAllTableName();
+            if (tableNames == null || !tableNames.Any())
+                return default;
+
+            var dict = new Dictionary<string, List<Entity.AnalysisPump>>();
+            using (SqlSugarClient db = new SqlSugarClient(ConnectionConfig))
+            {
+                foreach (var tableName in tableNames)
+                {
+                    var sql = $"select * from {tableName}";
+                    var list = db.Queryable<Entity.AnalysisPump>().AS(tableName).ToList();
+                    if (list == null || !list.Any())
+                        continue;
+                    dict.Add(tableName, list);
+                }
+                return dict;
+            }
+        }
+
+        /// <summary>
+        /// 閫氳繃琛ㄥ悕鑾峰彇鍏ㄩ儴
+        /// </summary>
+        public List<Entity.AnalysisPump> GetAllByTableName(string tableName)
+        {
+            using (SqlSugarClient db = new SqlSugarClient(ConnectionConfig))
+            {
+                var sql = $"select * from {tableName}";
+                var list = db.Ado.SqlQuery<Entity.AnalysisPump>(sql);
+                return list;
+            }
+        }
+
+        /// <summary>
+        /// 澶ф壒閲忔彃鍏�(琛ㄤ笉瀛樺湪灏辨柊寤�)
+        /// </summary>
+        public bool BulkInsertsEx(string runFlag, List<Entity.AnalysisPump> list)
+        {
+            if (list == null || list.Count < 1)
+                return default;
+            var tableName = GetTableName(runFlag);
+            using (SqlSugarClient db = new SqlSugarClient(ConnectionConfig))
+            {
+                var exist_sql = GetExistTableSql(tableName);
+                if (db.Ado.GetInt(exist_sql) < 1)
+                {
+                    var sql_create_table = GetCreateTableSql(tableName);
+                    db.Ado.ExecuteCommand(sql_create_table);
+                }
+                //澶ф暟鎹啓鍏�
+                return db.Fastest<Entity.AnalysisPump>().AS(tableName).BulkCopy(list) > 0;
+            }
+        }
+
+         
+
+        /// <summary>
+        /// 鍒ゆ柇鏁版嵁搴撴槸鍚﹀瓨鍦ㄨ〃
+        /// </summary> 
+        public bool ExistTable(string runFlag)
+        {
+            using (SqlSugarClient db = new SqlSugarClient(ConnectionConfig))
+            {
+                var tableName = GetTableName(runFlag);
+                var sql = GetExistTableSql(tableName);
+                var bol = db.Ado.ExecuteCommand(sql) > 0;
+                return bol;
+            }
+        }
+
+        /// <summary>
+        /// 鍒犻櫎鎵�鏈夎〃
+        /// </summary>
+        public bool DeleteAllTable()
+        {
+            var tables = GetAllTableName();
+            if (tables == null || !tables.Any())
+                return false;
+            using (SqlSugarClient db = new SqlSugarClient(ConnectionConfig))
+            {
+                db.BeginTran();
+                foreach (var table in tables)
+                {
+                    var sql = $"drop table {table};";
+                    db.Ado.ExecuteCommand(sql);
+                }
+                db.CommitTran();
+            }
+            return true;
+        }
+
+    }
+}
\ No newline at end of file
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/04-dal/ConfigHelper.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/04-dal/ConfigHelper.cs
new file mode 100644
index 0000000..e0483a7
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/04-dal/ConfigHelper.cs
@@ -0,0 +1,71 @@
+锘縰sing System.Data.SQLite;
+
+namespace IStation
+{
+    /// <summary>
+    /// 
+    /// </summary>
+    public class ConfigHelper
+    {
+        public static string AnalysisDbFilePath { get => $"{IStation.DAL.FileHelper.GetProjectFolder(SettingsD.Project.ID)}\\analysis.db"; } 
+
+        private static ConnectionConfig GetConnectionConfig(string filePath)
+        {
+     
+            if (!System.IO.File.Exists(filePath))
+            {
+                try
+                {
+                    SQLiteConnection.CreateFile(filePath);
+                }
+                catch (Exception ex)
+                {
+                    var errMsg = $" 鏂囦欢涓嶅瓨鍦�!Path:{filePath}\r\n{ex.Message}";
+                    //LogHelper.Debug(errMsg);
+                    throw new Exception(errMsg);
+                }
+            }
+
+            var config = new ConnectionConfig();
+            config.ConnectionString = $"DataSource={filePath}";
+            config.IsAutoCloseConnection = true;
+            config.DbType = SqlSugar.DbType.Sqlite;
+            config.ConfigureExternalServices = new ConfigureExternalServices()
+            {
+                EntityService = (property, column) =>
+                {
+                    //闄や富閿閮藉彲绌�
+                    if (!column.IsPrimarykey)
+                    {
+                        column.IsNullable = true;
+                    }
+                }
+            };
+ 
+            return config;
+        }
+      
+
+        #region SQLite-ConnectionConfig
+         
+
+        /// <summary>
+        /// Analysis SQLite杩炴帴閰嶇疆
+        /// </summary>
+        internal static ConnectionConfig AnalysisConnectionConfig
+        {
+            get
+            {
+                return GetConnectionConfig(AnalysisDbFilePath);
+            }
+        }
+
+      
+          
+
+        #endregion
+
+         
+
+    }
+}
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/00-core/CacheHelper.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/00-core/CacheHelper.cs
new file mode 100644
index 0000000..b5003af
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/00-core/CacheHelper.cs
@@ -0,0 +1,57 @@
+锘縩amespace IStation.Service
+{
+    /// <summary>
+    /// 缂撳瓨杈呭姪绫�
+    /// </summary>
+    public class CacheHelper<T>
+    {
+        #region Default
+
+        // 鏌ヨ缂撳瓨閿�
+        private static string GetCacheKey()
+        {
+            var t = typeof(T);
+            return CacheKeyHelper.GetCacheKey(t.Name);
+        }
+
+        /// <summary>
+        /// 璁剧疆缂撳瓨
+        /// </summary>
+        public static void Set(List<T> list, int minutes = 30, int randomSeconds = 0)
+        {
+            var cacheKey = GetCacheKey();
+            MemoryCacheHelper.Set(cacheKey, list, minutes * 60 + randomSeconds);
+        }
+
+        /// <summary>
+        /// 鏌ヨ缂撳瓨
+        /// </summary>
+        public static List<T> Get()
+        {
+            var cacheKey = GetCacheKey();
+            return MemoryCacheHelper.Get<List<T>>(cacheKey);
+        }
+
+        /// <summary>
+        /// 鏌ヨ璁剧疆缂撳瓨
+        /// </summary>
+        public static List<T> GetSet(Func<List<T>> func, int minutes = 30, int randomSeconds = 0)
+        {
+            var cacheKey = GetCacheKey();
+            return MemoryCacheHelper.GetSet(cacheKey, func, minutes * 60 + randomSeconds);
+        }
+
+        /// <summary>
+        /// 绉婚櫎缂撳瓨
+        /// </summary>
+        public static void Remove()
+        {
+            var cacheKey = GetCacheKey();
+            MemoryCacheHelper.Remove(cacheKey);
+        }
+
+        
+
+        #endregion 
+    }
+}
\ No newline at end of file
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/00-core/CacheKeyHelper.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/00-core/CacheKeyHelper.cs
new file mode 100644
index 0000000..45ba3b2
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/00-core/CacheKeyHelper.cs
@@ -0,0 +1,27 @@
+锘縩amespace IStation.Service
+{
+    internal class CacheKeyHelper
+    {
+        private const string _cacheKeyPrefix = "*Default_Basic_Prefix*";//缂撳瓨閿墠缂�
+
+        /// <summary>
+        /// 鏌ヨ缂撳瓨閿�
+        /// </summary>
+        public static string GetCacheKey(string keyContent)
+        {
+            return string.Format("{0}_{1}", _cacheKeyPrefix, keyContent);
+        }
+
+        /// <summary>
+        /// 娓呴櫎鍏ㄩ儴
+        /// </summary>
+        public static void Clear()
+        {
+            MemoryCacheHelper.Remove((key) =>
+            {
+                return key.StartsWith(_cacheKeyPrefix);
+            });
+        }
+
+    }
+}
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/00-core/ConfigHelper.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/00-core/ConfigHelper.cs
new file mode 100644
index 0000000..725ecbb
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/00-core/ConfigHelper.cs
@@ -0,0 +1,42 @@
+锘縩amespace IStation.Service
+{
+    /// <summary>
+    /// 閰嶇疆杈呭姪绫�
+    /// </summary>
+    public class ConfigHelper
+    {
+        /// <summary>
+        /// 缂撳瓨淇濇寔鏃堕棿 锛堝垎閽燂級
+        /// </summary>
+        public static int CacheKeepTime
+        {
+            get
+            {
+                return 30;
+            }
+        }
+
+        /// <summary>
+        /// 缂撳瓨闅忔満鏃堕棿 锛堢锛�
+        /// </summary>
+        public static int CacheRandomTime
+        {
+            get
+            {
+                return Random(0, 60);
+            }
+        }
+
+
+        /// <summary>
+        /// 闅忔満鐢熸垚鏁存暟
+        /// </summary>
+        public static int Random(int Min, int Max)
+        {
+            if (Min > Max)
+                return Min;
+            var rad = new Random();
+            return rad.Next(Min, Max + 1);
+        }
+    }
+}
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisParameter.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisParameter.cs
new file mode 100644
index 0000000..7bf54ef
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisParameter.cs
@@ -0,0 +1,208 @@
+锘縩amespace IStation.Service
+{
+    /// <summary>
+    /// 
+    /// </summary>
+    public partial class AnalysisParameter
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <returns></returns>
+        public static Dictionary<string, List<Entity.AnalysisParameter>> GetDictCache()
+        {
+            return AnalysisParameterCacheHelper.GetSet(() =>
+            {
+                var dal = new IStation.DAL.SQLite.AnalysisParameter();
+                var entity_dict = dal.GetAllTable();
+                if (entity_dict == null || !entity_dict.Any())
+                {
+                    return new Dictionary<string, List<Entity.AnalysisParameter>>();
+                }
+
+                var model_dict = new Dictionary<string, List<Entity.AnalysisParameter>>();
+                for (int i = 0; i < entity_dict.Count; i++)
+                {
+                    var entity_item = entity_dict.ElementAt(i);
+                    model_dict[entity_item.Key] = Entity2Models(entity_item.Value);
+                }
+                return model_dict;
+            }, ConfigHelper.CacheKeepTime, ConfigHelper.CacheRandomTime);
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <returns></returns>
+        public static void RemoveDictCache()
+        {
+            AnalysisParameterCacheHelper.Remove();
+        }
+
+
+
+        /// <summary>
+        /// 鏌ヨ
+        /// </summary>
+        public List<Entity.AnalysisParameter> GetList(string run_flag)
+        {
+            var dal = new IStation.DAL.SQLite.AnalysisParameter();
+            var tableName = dal.GetTableName(run_flag);
+            var dict = GetDictCache();
+            if (!dict.ContainsKey(tableName))
+                return default;
+
+            return dict[tableName]?.OrderBy(x => x.Power).ToList();
+        }
+
+        ///// <summary>
+        ///// 鏌ヨ
+        ///// </summary>
+        //public List<Entity.AnalysisParameter> GetPressureDiffList(string run_flag, double pressure_diff)
+        //{
+        //    var dal = new IStation.DAL.SQLite.AnalysisParameter();
+        //    var tableName = dal.GetTableName(run_flag);
+        //    var dict = GetDictCache();
+        //    if (!dict.ContainsKey(tableName))
+        //        return default;
+
+        //    for (int i = 0; i < 3; i++)
+        //    {
+        //        pressure_diff += i * 0.1;
+        //        var list = dict[tableName]?
+        //           .Where(x => x.PressureDiff == pressure_diff)
+        //           .OrderBy(x => x.Power)
+        //           .ToList();
+        //        if (list != null && list.Any())
+        //        {
+        //            return list;
+        //        }
+        //    }
+
+        //    return null;
+        //}
+
+        /// <summary>
+        /// 鏌ヨ
+        /// </summary>
+        public List<Entity.AnalysisParameter> GetHeadList(string run_flag, double head)
+        {
+            var dal = new IStation.DAL.SQLite.AnalysisParameter();
+            var tableName = dal.GetTableName(run_flag);
+            var dict = GetDictCache();
+            if (!dict.ContainsKey(tableName))
+                return default;
+
+            for (int i = 0; i < 3; i++)
+            {
+                head += i * 0.1;
+                var list = dict[tableName]?
+                   .Where(x => x.Head == head)
+                   .OrderBy(x => x.Power)
+                   .ToList();
+                if (list != null && list.Any())
+                {
+                    return list;
+                }
+            }
+
+            return null;
+        }
+
+        ///// <summary>
+        ///// 鏌ヨ
+        ///// </summary>
+        //public List<Entity.AnalysisParameter> GetPressureDiffList(string run_flag, double min_hz, double max_hz, double pressure_diff)
+        //{
+        //    var dal = new IStation.DAL.SQLite.AnalysisParameter();
+        //    var tableName = dal.GetTableName(run_flag);
+        //    var dict = GetDictCache();
+        //    if (!dict.ContainsKey(tableName))
+        //        return default;
+
+
+        //    for (int i = 0; i < 3; i++)
+        //    {
+        //        pressure_diff += i * 0.1;
+        //        var list = dict[tableName]?
+        //        .Where(x => x.Hz >= min_hz && x.Hz <= max_hz && x.PressureDiff == pressure_diff)
+        //        .OrderBy(x => x.Power)
+        //        .ToList();
+        //        if (list == null || !list.Any())
+        //        {
+
+        //        }
+        //        if (list != null && list.Any())
+        //        {
+        //            return list;
+        //        }
+        //    }
+
+
+        //    return null;
+        //}
+
+
+
+        /// <summary>
+        /// 鏌ヨ
+        /// </summary>
+        public List<Entity.AnalysisParameter> GetHeadList(string run_flag, double min_hz, double max_hz, double head)
+        {
+            var dal = new IStation.DAL.SQLite.AnalysisParameter();
+            var tableName = dal.GetTableName(run_flag);
+            var dict = GetDictCache();
+            if (!dict.ContainsKey(tableName))
+                return default;
+
+
+            for (int i = 0; i < 3; i++)
+            {
+                head += i * 0.1;
+                var list = dict[tableName]?
+                .Where(x => x.Hz >= min_hz && x.Hz <= max_hz && x.Head == head)
+                .OrderBy(x => x.Power)
+                .ToList();
+                if (list == null || !list.Any())
+                {
+
+                }
+                if (list != null && list.Any())
+                {
+                    return list;
+                }
+            }
+
+
+            return null;
+        }
+
+
+        /// <summary>
+        /// 鏌ヨ
+        /// </summary>
+        public Entity.AnalysisParameter GetMinPressureDiff(string run_flag)
+        {
+            var dal = new IStation.DAL.SQLite.AnalysisParameter();
+            var tableName = dal.GetTableName(run_flag);
+            var dict = GetDictCache();
+            if (!dict.ContainsKey(tableName))
+                return default;
+            return dict[tableName]?.OrderBy(x => x.PressureDiff).FirstOrDefault();
+        }
+
+        /// <summary>
+        /// 鏌ヨ
+        /// </summary>
+        public Entity.AnalysisParameter GetMinHead(string run_flag)
+        {
+            var dal = new IStation.DAL.SQLite.AnalysisParameter();
+            var tableName = dal.GetTableName(run_flag);
+            var dict = GetDictCache();
+            if (!dict.ContainsKey(tableName))
+                return default;
+            return dict[tableName]?.OrderBy(x => x.Head).FirstOrDefault();
+        }
+
+    }
+}
\ No newline at end of file
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisParameterCacheHelper.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisParameterCacheHelper.cs
new file mode 100644
index 0000000..d2c7a73
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisParameterCacheHelper.cs
@@ -0,0 +1,53 @@
+锘縩amespace IStation.Service
+{
+    /// <summary>
+    /// 缂撳瓨杈呭姪绫�
+    /// </summary>
+    public class AnalysisParameterCacheHelper
+    {
+        private const string _contentKey = "AnalysisParameterDictKey";
+
+        // 鏌ヨ缂撳瓨閿�
+        private static string GetCacheKey()
+        {
+            return CacheKeyHelper.GetCacheKey(_contentKey);
+        }
+
+        /// <summary>
+        /// 璁剧疆缂撳瓨
+        /// </summary>
+        public static void Set(Dictionary<string, List<Entity.AnalysisParameter>> list, int minutes = 30, int randomSeconds = 0)
+        {
+            var cacheKey = GetCacheKey();
+            MemoryCacheHelper.Set(cacheKey, list, minutes * 60 + randomSeconds);
+        }
+
+        /// <summary>
+        /// 鏌ヨ缂撳瓨
+        /// </summary>
+        public static Dictionary<string, List<Entity.AnalysisParameter>> Get()
+        {
+            var cacheKey = GetCacheKey();
+            return MemoryCacheHelper.Get<Dictionary<string, List<Entity.AnalysisParameter>>>(cacheKey);
+        }
+
+        /// <summary>
+        /// 鏌ヨ璁剧疆缂撳瓨
+        /// </summary>
+        public static Dictionary<string, List<Entity.AnalysisParameter>> GetSet(Func<Dictionary<string, List<Entity.AnalysisParameter>>> func, int minutes = 30, int randomSeconds = 0)
+        {
+            var cacheKey = GetCacheKey();
+            return MemoryCacheHelper.GetSet(cacheKey, func, minutes * 60 + randomSeconds);
+        }
+
+        /// <summary>
+        /// 绉婚櫎缂撳瓨
+        /// </summary>
+        public static void Remove()
+        {
+            var cacheKey = GetCacheKey();
+            MemoryCacheHelper.Remove(cacheKey);
+        }
+         
+    }
+}
\ No newline at end of file
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisParameter_Instance.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisParameter_Instance.cs
new file mode 100644
index 0000000..adc7c20
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisParameter_Instance.cs
@@ -0,0 +1,65 @@
+锘縰sing AutoMapper;
+
+namespace IStation.Service
+{
+    public partial class AnalysisParameter
+    {
+
+        //Entity to GetModel
+        private static Entity.AnalysisParameter Entity2Model(Entity.AnalysisParameter entity)
+        {
+            if (entity == null)
+                return default;
+            var mapper = new MapperConfiguration(cfg => cfg.CreateMap<Entity.AnalysisParameter, Entity.AnalysisParameter>())
+            .CreateMapper();
+            var model = mapper.Map<Entity.AnalysisParameter, Entity.AnalysisParameter>(entity);
+            return model;
+        }
+
+        //Entities to GetModels
+        private static List<Entity.AnalysisParameter> Entity2Models(List<Entity.AnalysisParameter> entities)
+        {
+            if (entities == null || entities.Count() < 1)
+                return default;
+            var mapper = new MapperConfiguration(cfg => cfg.CreateMap<Entity.AnalysisParameter, Entity.AnalysisParameter>())
+            .CreateMapper();
+            var models = mapper.Map<List<Entity.AnalysisParameter>, List<Entity.AnalysisParameter>>(entities);
+            return models;
+        }
+
+        //Model to Entity
+        private static Entity.AnalysisParameter Model2Entity(Entity.AnalysisParameter model)
+        {
+            if (model == null)
+                return default;
+            var mapper = new MapperConfiguration(cfg => cfg.CreateMap<Entity.AnalysisParameter, Entity.AnalysisParameter>()
+            ).CreateMapper();
+            var entity = mapper.Map<Entity.AnalysisParameter, Entity.AnalysisParameter>(model);
+            return entity;
+        }
+
+        //Models to Entities
+        private static List<Entity.AnalysisParameter> Model2Entities(List<Entity.AnalysisParameter> models)
+        {
+            if (models == null || models.Count < 1)
+                return default;
+            var mapper = new MapperConfiguration(cfg => cfg.CreateMap<Entity.AnalysisParameter, Entity.AnalysisParameter>()
+            ).CreateMapper();
+            var entities = mapper.Map<List<Entity.AnalysisParameter>, List<Entity.AnalysisParameter>>(models);
+            return entities;
+        }
+
+        //Model to Entity
+        private static void Model2Entity(Entity.AnalysisParameter model, Entity.AnalysisParameter entity)
+        {
+            if (model == null || entity == null)
+                return;
+            var mapper = new MapperConfiguration(cfg => cfg.CreateMap<Entity.AnalysisParameter, Entity.AnalysisParameter>()
+            ).CreateMapper();
+            mapper.Map(model, entity);
+        }
+
+
+
+    }
+}
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisPump.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisPump.cs
new file mode 100644
index 0000000..9b894ca
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisPump.cs
@@ -0,0 +1,35 @@
+锘縩amespace IStation.Service
+{
+    /// <summary>
+    /// 
+    /// </summary>
+    public partial class AnalysisPump
+    {
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <returns></returns>
+        public static Dictionary<string, List<Entity.AnalysisPump>> GetDictCache()
+        {
+            return AnalysisPumpCacheHelper.GetSet(() =>
+            {
+                var dal = new IStation.DAL.SQLite. AnalysisPump();
+                var entity_dict = dal.GetAllTable();
+                if (entity_dict == null || !entity_dict.Any())
+                {
+                    return new Dictionary<string, List<Entity.AnalysisPump>>();
+                }
+
+                var model_dict = new Dictionary<string, List<Entity.AnalysisPump>>();
+                for (int i = 0; i < entity_dict.Count; i++)
+                {
+                    var entity_item = entity_dict.ElementAt(i);
+                    model_dict[entity_item.Key] = entity_item.Value;
+                }
+                return model_dict;
+            }, ConfigHelper.CacheKeepTime, ConfigHelper.CacheRandomTime);
+        }
+
+    }
+}
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisPumpCacheHelper.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisPumpCacheHelper.cs
new file mode 100644
index 0000000..2dadcd4
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisPumpCacheHelper.cs
@@ -0,0 +1,53 @@
+锘縩amespace IStation.Service
+{
+    /// <summary>
+    /// 缂撳瓨杈呭姪绫�
+    /// </summary>
+    public class AnalysisPumpCacheHelper
+    {
+        private const string _contentKey = "AnalysisPumpDictKey";
+
+        // 鏌ヨ缂撳瓨閿�
+        private static string GetCacheKey()
+        {
+            return CacheKeyHelper.GetCacheKey(_contentKey);
+        }
+
+        /// <summary>
+        /// 璁剧疆缂撳瓨
+        /// </summary>
+        public static void Set(Dictionary<string, List<Entity.AnalysisPump>> list, int minutes = 30, int randomSeconds = 0)
+        {
+            var cacheKey = GetCacheKey();
+            MemoryCacheHelper.Set(cacheKey, list, minutes * 60 + randomSeconds);
+        }
+
+        /// <summary>
+        /// 鏌ヨ缂撳瓨
+        /// </summary>
+        public static Dictionary<string, List<Entity.AnalysisPump>> Get()
+        {
+            var cacheKey = GetCacheKey();
+            return MemoryCacheHelper.Get<Dictionary<string, List<Entity.AnalysisPump>>>(cacheKey);
+        }
+
+        /// <summary>
+        /// 鏌ヨ璁剧疆缂撳瓨
+        /// </summary>
+        public static Dictionary<string, List<Entity.AnalysisPump>> GetSet(Func<Dictionary<string, List<Entity.AnalysisPump>>> func, int minutes = 30, int randomSeconds = 0)
+        {
+            var cacheKey = GetCacheKey();
+            return MemoryCacheHelper.GetSet(cacheKey, func, minutes * 60 + randomSeconds);
+        }
+
+        /// <summary>
+        /// 绉婚櫎缂撳瓨
+        /// </summary>
+        public static void Remove()
+        {
+            var cacheKey = GetCacheKey();
+            MemoryCacheHelper.Remove(cacheKey);
+        }
+          
+    }
+}
\ No newline at end of file
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/RunFlagHelper.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/RunFlagHelper.cs
new file mode 100644
index 0000000..3fa9375
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/RunFlagHelper.cs
@@ -0,0 +1,20 @@
+锘縩amespace IStation
+{
+    /// <summary>
+    /// 杩愯鏍囪瘑杈呭姪绫�
+    /// </summary>
+    public class RunFlagHelper
+    {
+        /// <summary>
+        /// 鑾峰彇
+        /// </summary>
+        /// <param name="flag">鏍囧織</param>
+        /// <param name="is_bp">鏄惁鍙橀</param>
+        /// <returns></returns>
+        public static string Get(int flag, bool is_bp)
+        {
+            return (is_bp ? "B" : "G") + flag;
+        }
+
+    }
+}
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/01-analysis/AnalysisHelper.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/01-analysis/AnalysisHelper.cs
new file mode 100644
index 0000000..00331a9
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/01-analysis/AnalysisHelper.cs
@@ -0,0 +1,291 @@
+锘縰sing IStation.Model;
+using System.Diagnostics;
+
+namespace IStation.Service
+{
+    /// <summary>
+    /// 璋冨害鍒嗘瀽杈呭姪绫�
+    /// </summary>
+    public partial class AnalysisHelper
+    {
+        private readonly decimal _frequency_def = 50m;
+        private readonly decimal _frequency_min = 25m;
+        private readonly decimal _frequency_max = 50m;
+        private readonly decimal _frequency_space = 0.1m;//棰戠巼闂撮殧  
+        private readonly decimal _head_space = 0.1m;//鎵▼闂撮殧
+
+        private readonly DAL.SQLite.AnalysisPump _dal_analysis_pump = new();
+        private readonly DAL.SQLite.AnalysisParameter _dal_analysis_conclusion = new();
+
+        #region AnalysisPump
+
+        /// <summary>
+        /// 鍒嗘瀽娉�
+        /// </summary>
+        /// <param name="pumps"></param>
+        /// <param name="analysis_factor_list"></param>
+        /// <exception cref="Exception"></exception>
+        public void AnalysisPump(List<Model.PumpModel> pumps)
+        { 
+            if (pumps == null || pumps.Count < 1)
+            { 
+                return;
+            } 
+            var ana_pump_list = new List<AnaPump>();
+            foreach (var pump in pumps)
+            {
+                var ana_pump = new AnaPump(pump);
+                if (!ana_pump.AllowCalc)
+                {
+                    throw new Exception("鏇茬嚎鏁版嵁寮傚父!");
+                }
+                var ana_pump_fre_item_list = new List<AnaPumpFreItem>();
+                if (!pump.IsBp)
+                {
+                    ana_pump_fre_item_list = GetAnaPumpFreItems(_frequency_def, _frequency_def, _frequency_def, _frequency_space, pump);
+                }
+                else
+                {
+                     ana_pump_fre_item_list = GetAnaPumpFreItems(_frequency_def, _frequency_min, _frequency_max, _frequency_space, pump);
+                }
+
+                ana_pump.AnaPumpFreItems = ana_pump_fre_item_list;
+                ana_pump_list.Add(ana_pump);
+            }
+
+            if (!ana_pump_list.Any())
+            { 
+                return;
+            }
+            for (int i = 0; i < ana_pump_list.Count; i++)
+            {
+                var pump = ana_pump_list[i];
+                var ana_pump_fre_items = pump.AnaPumpFreItems;
+                if (ana_pump_fre_items == null || !ana_pump_fre_items.Any())
+                    continue;
+
+                var run_flag = Get(pump.Flag, pump.IsBp); 
+
+                var list = new List<Entity.AnalysisPump>(pump.AnaPumpFreItems.Count);
+                foreach (var freItem in ana_pump_fre_items)
+                {
+                    if (freItem.Frequency==47.6)
+                    {
+
+                    }
+                    var analysis_pump = new Entity.AnalysisPump();
+                    analysis_pump.ID = SnowflakeIdHelper.NextId();
+                    analysis_pump.Flag = pump.Flag;
+                    analysis_pump.Hz = freItem.Frequency;
+                    analysis_pump.CurveQH = freItem.CurveQH.ToJson();
+                    analysis_pump.CurveQP = freItem.CurveQP.ToJson();
+                    analysis_pump.CurveQE = freItem.CurveQE.ToJson();
+
+                    freItem.CurveQH.GetMinMaxPointY(out double maxHead, out double minHead);
+                    analysis_pump.MinFlow = Math.Round(freItem.CurveQH.Min, 4);
+                    analysis_pump.MaxFlow = Math.Round(freItem.CurveQH.Max, 4);
+                    analysis_pump.MaxHead = Math.Round(maxHead, 4);
+                    analysis_pump.MinHead = Math.Round(minHead, 4);
+                    list.Add(analysis_pump);
+                }
+                Inserts(i + 1, run_flag, list);
+            }
+             
+        }
+
+
+        /// <summary>
+        /// 鑾峰彇鍒嗘瀽娉靛彉棰戦」
+        /// </summary>
+        /// <param name="fre_def"></param>
+        /// <param name="fre_min"></param>
+        /// <param name="fre_max"></param>
+        /// <param name="fre_space"></param>
+        /// <param name="pump"></param>
+        /// <param name="hz_head_dev_dict"></param>
+        /// <returns></returns>
+        private static List<AnaPumpFreItem> GetAnaPumpFreItems(
+             decimal fre_def,
+             decimal fre_min,
+             decimal fre_max,
+             decimal fre_space,
+            Model.PumpModel pump)
+        {
+            if (pump == null)
+            {
+                return default;
+            }
+            if (pump.CurveQH == null || pump.CurveQP == null)
+            {
+                return default;
+            }
+            var list = new List<AnaPumpFreItem>();
+            for (decimal fre = fre_max; fre >= fre_min; fre -= fre_space)
+            {
+                Model.CurveExpress qh = pump.CurveQH, qp = pump.CurveQP, qe = pump.CurveQE;
+                var freItem = new AnaPumpFreItem(); 
+                freItem.Frequency = (double)fre;
+                freItem.CurveQH = CurveCalcuHelper.CalculateSimilarQH(qh, (double)fre_def, (double)fre);
+                freItem.CurveQP = CurveCalcuHelper.CalculateSimilarQP(qp, (double)fre_def, (double)fre);
+                freItem.CurveQE = CurveCalcuHelper.CalculateSimilarQE(qe, (double)fre_def, (double)fre);
+                list.Add(freItem);
+            }
+
+            return list;
+
+        }
+
+         
+ 
+
+        #endregion
+
+        #region AnalysisParameter
+
+        /// <summary>
+        /// 鍒嗘瀽鍙傛暟
+        /// </summary>
+        public void AnalysisParameter(List<Model.PumpModel> pumps)
+        { 
+            if (pumps == null || pumps.Count < 1)
+            { 
+                return;
+            }
+
+            _dal_analysis_conclusion.DeleteAllTable();
+            for (int pump_index = 0; pump_index < pumps.Count; pump_index++)
+            {
+                var pump = pumps[pump_index];
+                var flag = pump.Flag;
+                var run_flag = Get(flag, pump.IsBp);
+                var table_name = _dal_analysis_pump.GetTableName(run_flag);
+                var analysis_pump_list = _dal_analysis_pump.GetAllByTableName(table_name);
+                if (analysis_pump_list == null || !analysis_pump_list.Any())
+                { 
+                    continue;
+                }
+
+                var analysis_pump_list_count = analysis_pump_list.Count();
+                var analysis_conclusion_list = new List<List<Entity.AnalysisParameter>>(analysis_pump_list_count);
+                for (int analysis_pump_index = 0; analysis_pump_index < analysis_pump_list_count; analysis_pump_index++)
+                {
+                    var analysis_pump = analysis_pump_list[analysis_pump_index]; 
+                    var curveQH = JsonHelper.Json2Object<Model.CurveExpress>(analysis_pump.CurveQH);
+                    var curveQP = JsonHelper.Json2Object<Model.CurveExpress>(analysis_pump.CurveQP);
+                    var curveQE = JsonHelper.Json2Object<Model.CurveExpress>(analysis_pump.CurveQE);
+                    var bol = curveQH.GetMinMaxPointY(out double maxY, out double minY);
+                    if (!bol)
+                        throw new Exception("鏇茬嚎寮傚父");
+
+                    decimal max_head = (decimal)Math.Ceiling(maxY);
+                    decimal min_head = (decimal)Math.Floor(minY);
+
+                    var current_list_count = (int)((max_head - min_head) / _head_space) + 1;
+                    var current_analysis_conclusion_list = new List<Entity.AnalysisParameter>(current_list_count);
+                    for (decimal head = min_head; head <= max_head; head += _head_space)
+                    {
+                        if (head==20)
+                        {
+
+                        }
+                        var flow = curveQH.GetInterPointLastX((double)head) ?? 0;
+                        if (flow < 1)
+                        {
+                            continue;
+                        }
+
+                        double differV = 0;
+                        if (pump.Oc != null)
+                        {
+                            //1杈撳拰2杈撻兘鏄敤鐨勮繘鍙f恫浣嶏紝涓嶈�冭檻杩涘彛鍙e緞
+                            differV =  CurveCalcuHelper.CalculateOtherPress(flow, null, pump.Oc, null, null);
+                        }
+
+                        var analysis_conclusion = new Entity.AnalysisParameter();
+                        analysis_conclusion.ID = SnowflakeIdHelper.NextId();
+                        analysis_conclusion.PumpID = analysis_pump.ID;
+                        analysis_conclusion.Hz = analysis_pump.Hz;
+                        analysis_conclusion.Head = (double)head;
+                        analysis_conclusion.PressureDiff = (double)head - differV;
+                        analysis_conclusion.Flow = flow;
+                        analysis_conclusion.Power = curveQP.GetFitPointY(flow);
+                        analysis_conclusion.Eff = curveQE.GetFitPointY(flow);
+                        analysis_conclusion.UWP = CurveCalcuHelper.CalculateUWP(analysis_conclusion.Power, analysis_conclusion.Flow, analysis_conclusion.Head);
+                        analysis_conclusion.WP = CurveCalcuHelper.CalculateWP(analysis_conclusion.Power, analysis_conclusion.Flow);
+
+
+
+                        int digits = 1;
+                        analysis_conclusion.Hz = Math.Round(analysis_conclusion.Hz, digits);
+                        analysis_conclusion.Head = Math.Round(analysis_conclusion.Head, digits);
+                        analysis_conclusion.PressureDiff = Math.Round(analysis_conclusion.PressureDiff, digits);
+                        analysis_conclusion.Flow = Math.Round(analysis_conclusion.Flow, digits);
+                        analysis_conclusion.Power = Math.Round(analysis_conclusion.Power, digits);
+                        analysis_conclusion.Eff = Math.Round(analysis_conclusion.Eff, digits);
+                        analysis_conclusion.WP = Math.Round(analysis_conclusion.WP, digits);
+                        analysis_conclusion.UWP = Math.Round(analysis_conclusion.UWP, digits);
+                        current_analysis_conclusion_list.Add(analysis_conclusion);
+                    }
+                    analysis_conclusion_list.Add(current_analysis_conclusion_list);
+                }
+                var list = analysis_conclusion_list.SelectMany(x => x.ToList()).ToList();
+                Inserts(pump_index + 1, run_flag, list);
+            }
+        }
+
+
+        #endregion
+
+        #region Insert 
+ 
+
+        /// <summary>
+        /// 鎵归噺鎻掑叆
+        /// </summary> 
+        public void Inserts(int index, string runFlag, List<Entity.AnalysisPump> list)
+        {
+            string log;
+            if (list == null || !list.Any())
+            {
+                log = $"{runFlag}:涓嬫爣:{index},鏃犳暟鎹�"; 
+                return;
+            }
+
+            var sw = Stopwatch.StartNew();
+            _dal_analysis_pump.BulkInsertsEx(runFlag, list);
+            log = $"{runFlag}:涓嬫爣:{index},鏁伴噺:{list.Count},鎻掑叆鑰楁椂:{sw.ElapsedMilliseconds / 1000}m"; 
+        }
+
+        /// <summary>
+        /// 鎵归噺鎻掑叆
+        /// </summary> 
+        public void Inserts(int index, string runFlag, List<Entity.AnalysisParameter> list)
+        {
+            string log;
+            if (list == null || !list.Any())
+            {
+                log = $"{runFlag}:涓嬫爣:{index},鏃犳暟鎹�";
+                return;
+            }
+
+            var sw = Stopwatch.StartNew();
+            _dal_analysis_conclusion.BulkInsertsEx(runFlag, list);
+            log = $"鍒嗘瀽杩涘害:{runFlag},涓嬫爣:{index},鏁伴噺:{list.Count},鎻掑叆鑰楁椂:{sw.ElapsedMilliseconds / 1000}m";
+            
+        }
+
+        #endregion
+
+        /// <summary>
+        /// 鑾峰彇
+        /// </summary>
+        /// <param name="flag">鏍囧織</param>
+        /// <param name="is_bp">鏄惁鍙橀</param>
+        /// <returns></returns>
+        public static string Get(int flag, bool is_bp)
+        {
+            return (is_bp ? "B" : "G") + flag;
+        }
+    }
+}
+
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/01-analysis/AnalysisHelper_Model.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/01-analysis/AnalysisHelper_Model.cs
new file mode 100644
index 0000000..b0e4924
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/01-analysis/AnalysisHelper_Model.cs
@@ -0,0 +1,133 @@
+锘縩amespace IStation.Service
+{
+    /// <summary>
+    /// 璋冨害鍒嗘瀽杈呭姪绫� Model
+    /// </summary>
+    public partial class AnalysisHelper
+    {
+        /// <summary>
+        /// 鍒嗘瀽娉�
+        /// </summary>
+        public class AnaPump
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            public AnaPump() { }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="rhs"></param>
+            public AnaPump(Model.PumpModel rhs)
+            {
+                this.Flag = rhs.Flag;
+                this.Name = rhs.Name; 
+                this.IsBp = rhs.IsBp;
+                this.Qr = rhs.Qr;
+                this.Hr = rhs.Hr;
+                this.Nr = rhs.Nr;
+                this.Pr = rhs.Pr;
+                this.Er = rhs.Er;
+                if (rhs.CurveQH != null && rhs.CurveQP != null)
+                {
+                    this.CurveQH = rhs.CurveQH.Clone();
+                    this.CurveQP = rhs.CurveQP.Clone();
+                    this.AllowCalc = true;
+                }
+            }
+
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public int Flag { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public string Code { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public string Name { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public double Qr { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public double Hr { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public double Nr { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public double Pr { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public double Er { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public bool IsBp { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public Model.CurveExpress CurveQH { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public Model.CurveExpress CurveQP { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public List<AnaPumpFreItem> AnaPumpFreItems { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public bool AllowCalc { get; set; }
+
+        }
+
+        /// <summary>
+        /// 鍒嗘瀽娉靛彉棰戦」
+        /// </summary>
+        public class AnaPumpFreItem
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            public double Frequency { get; set; }
+            /// <summary>
+            /// 
+            /// </summary>
+            public Model.CurveExpress CurveQH { get; set; }
+            /// <summary>
+            /// 
+            /// </summary>
+            public Model.CurveExpress CurveQP { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public Model.CurveExpress CurveQE { get; set; }
+        }
+
+    }
+}
\ No newline at end of file
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/02-schedule/ScheduleHelper.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/02-schedule/ScheduleHelper.cs
new file mode 100644
index 0000000..793240a
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/02-schedule/ScheduleHelper.cs
@@ -0,0 +1,918 @@
+锘縰sing IStation.Untity;
+
+namespace IStation.Service
+{
+    /// <summary>
+    /// 璋冨害鍒嗘瀽杈呭姪绫�
+    /// </summary>
+    public partial class ScheduleHelper
+    {
+
+        #region ViewModel 
+        private class AnalysisConclusionViewModel : Entity.AnalysisParameter
+        {
+            public AnalysisConclusionViewModel() { }
+            public AnalysisConclusionViewModel(Entity.AnalysisParameter rhs) : base(rhs) { }
+            public AnalysisConclusionViewModel(Entity.AnalysisParameter rhs, int flag) : base(rhs)
+            {
+                this.Flag = flag;
+            }
+            public int Flag { get; set; }
+        }
+        #endregion
+
+        #region Private Variable
+
+        private readonly decimal _frequency_min = 25;
+        private readonly decimal _frequency_max = 50;
+        private readonly decimal _frequency_space = 1;//棰戠巼闂撮殧 
+
+        private readonly double _start_stop_loss_coefficient = 0.9;//娉靛惎鍋滄崯澶辩郴鏁�
+
+        private double _sel_opt_flow_excess = 1;//鍙�夋柟妗堢殑娴侀噺浣欓噺
+        private readonly double _sel_opt_pump_pressure_excess = 0;//鍙�夋柟妗堢殑鍗曟车鎵▼榛樿鎶崌浣欓噺
+        private double _station_target_flow_diff = 0; // 绔欑偣鐩爣娴侀噺宸��
+
+
+        private readonly double _sel_opt_flow_deviation_ratio = 0.05;//鍙�夋柟妗堢殑娴侀噺鍋忓樊姣�
+        private readonly double _sel_opt_reasonable_flow_deviation_ratio = 0.005;//鍚堢悊鐨勬柟妗堢殑娴侀噺鍋忓樊姣�
+
+        private readonly Service.AnalysisParameter _service_analysis_parameter = new();
+
+        private int _min_open_count;//鏈�灏忓紑娉垫暟閲�
+        private int _max_open_count;//鏈�澶у紑娉垫暟閲�
+        private List<int> _current_open_flag_list = null;// 褰撳墠寮�娉靛垪琛�
+        private List<int> _must_open_flag_list = null; // 蹇呭紑娉靛垪琛�  
+        private List<int> _must_close_flag_list = null; // 蹇呭叧娉靛垪琛�
+        private List<List<int>> _forbidden_flag_combine_list = null; // 绂佺敤娉电粍鍚� 
+        private List<List<int>> _associative_flag_combine_list = null; // 鍏宠仈娉电粍鍚� 
+        private List<List<int>> _same_section_flag_combine_list = null; // 鍚屾娉电粍鍚�  
+        private List<Model.WaterSupplyLimit> _water_supply_limit_list = null; //渚涙按闄愬埗鍒楄〃
+        private List<Model.FrequencyLimit> _frequency_limit_list = null; // 棰戠巼闄愬埗鍒楄〃 
+        private List<int> _priority_open_flag_list = null; // 浼樺厛寮�娉靛垪琛�
+        private List<int> _maintenance_flag_list = null; // 妫�淇垪琛�
+
+         
+
+
+
+        #endregion
+
+        /// <summary>
+        /// 鍒濆鍖�
+        /// </summary>
+        public void Initial(List<int> current_open_flag_list, Model.ScheduleConfig schedule_config)
+        {
+            _current_open_flag_list = current_open_flag_list;
+            _min_open_count = 1;
+            _max_open_count = 0;
+            _must_open_flag_list = null;
+            _must_close_flag_list = null;
+            _forbidden_flag_combine_list = null;
+            _associative_flag_combine_list = null;
+            _same_section_flag_combine_list = null;
+            _water_supply_limit_list = null;
+            _frequency_limit_list = null; 
+            _priority_open_flag_list = null;
+            _maintenance_flag_list = null;
+            _station_target_flow_diff = 0;
+            if (schedule_config != null)
+            {
+                _min_open_count = schedule_config.MinOpenCount;
+                _max_open_count = schedule_config.MaxOpenCount;
+                _must_open_flag_list = schedule_config.MustOpenFlagList;
+                _must_close_flag_list = schedule_config.MustCloseFlagList;
+                _forbidden_flag_combine_list = schedule_config.ForbiddenFlagCombineList;
+                _associative_flag_combine_list = schedule_config.AssociativeFlagCombineList;
+                _same_section_flag_combine_list = schedule_config.SameSectionFlagCombineList;
+                _water_supply_limit_list = schedule_config.WaterSupplyLimitList;
+                _frequency_limit_list = schedule_config.FrequencyLimitList; 
+                _priority_open_flag_list = schedule_config.PriorityOpenFlagList;
+                _maintenance_flag_list = schedule_config.MaintenanceFlagList;
+            } 
+        }
+
+
+        #region OptAnaCombine
+
+        /// <summary>
+        /// 鑾峰彇鏈�浼樼粍鍚�
+        /// </summary>
+        /// <param name="pump_list"></param> 
+        /// <param name="flag_inlet_water_level_dict"></param> 
+        /// <param name="target_flow"></param>
+        /// <param name="target_head"></param> 
+        /// <returns></returns>
+        public List<AnaCombine> GetAnaCombineList
+            (
+            List<Model.PumpModel> pump_list, 
+            double target_flow,
+            double target_head
+            )
+        {
+            //鑾峰彇鏂规鏃剁敤琛ュ樊鐨勬祦閲忥紝渚涙按闄愬埗鐢ㄧ洰鏍囨祦閲忓垽鏂�
+            var target_flow_compensation = target_flow + _station_target_flow_diff;
+            #region 鍒濆鍖栧弬鏁� 
+            if (pump_list == null || !pump_list.Any())
+            {
+                return default;
+            }
+
+            var current_open_flag_list = _current_open_flag_list;
+            var min_open_count = _min_open_count;
+            var max_open_count = _max_open_count < 1 ? pump_list.Count : _max_open_count;
+            var must_open_flag_list = _must_open_flag_list;
+            var must_close_flag_list = _must_close_flag_list;
+            var forbidden_flag_combine_list = _forbidden_flag_combine_list;
+            var associative_flag_combine_list = _associative_flag_combine_list;
+            var same_section_flag_combine_list = _same_section_flag_combine_list;
+            var water_supply_limit_list = _water_supply_limit_list;
+            var frequency_limit_list = _frequency_limit_list; 
+            var priority_open_flag_list = _priority_open_flag_list;
+            var maintenance_flag_list = _maintenance_flag_list;
+
+            var pump_bp_dict = pump_list.ToDictionary(x => x.Flag, x => x.IsBp);
+            var pump_nr_dict = pump_list.ToDictionary(x => x.Flag, x => x.Nr);
+            var pump_flag_list = pump_list.Select(x => x.Flag).ToList();
+
+            var combine_merit_ratio = 1d;//缁勫悎鎷╀紭鐜� 
+
+            target_flow = Math.Round(target_flow, 1);
+            target_flow_compensation = Math.Round(target_flow_compensation,1);
+            target_head = Math.Round(target_head, 1);
+
+            #endregion
+
+            #region 鍒濆鍖栬鍒�
+
+            #region 瀛樺湪-蹇呭紑娉靛垪琛�
+
+            var must_open_flag_list_remark = string.Empty;
+            var exist_must_open_flag_list = must_open_flag_list != null && must_open_flag_list.Count > 0;
+            if (exist_must_open_flag_list)
+            {
+                must_open_flag_list = must_open_flag_list.OrderBy(x => x).ToList();
+                must_open_flag_list_remark = IntListHelper.ToString(must_open_flag_list);
+            }
+
+            #endregion
+
+            #region 瀛樺湪-蹇呭叧娉靛垪琛�
+
+            var exist_must_close_flag_list = must_close_flag_list != null && must_close_flag_list.Count > 0;
+
+            #endregion
+
+            #region 瀛樺湪-绂佺敤缁勫悎
+
+            var exist_forbidden_flag_combine_list = forbidden_flag_combine_list != null && forbidden_flag_combine_list.Count > 0;
+
+            #endregion
+
+            #region 瀛樺湪-鍏宠仈缁勫悎
+
+            var exist_associative_flag_combine_list = associative_flag_combine_list != null && associative_flag_combine_list.Count > 0;
+
+            #endregion 
+
+            #region 瀛樺湪-鍚屾娉电粍鍚�
+
+            Dictionary<int, List<int[]>> same_section_combine_dict = new();
+            var exist_same_section_flag_combine_list = same_section_flag_combine_list != null && same_section_flag_combine_list.Count > 0;
+            if (exist_same_section_flag_combine_list)
+            {
+                same_section_combine_dict = GetSameSectionCombineDict(same_section_flag_combine_list, pump_list.Count);
+            }
+
+            #endregion
+
+            #region 瀛樺湪-渚涙按闄愬埗
+
+            var exist_water_supply_limit_list = water_supply_limit_list != null && water_supply_limit_list.Count > 0;
+            if (exist_water_supply_limit_list)
+            {
+                var water_supply_min = water_supply_limit_list.Min(x => x.Min);
+                var water_supply_max = water_supply_limit_list.Max(x => x.Max);
+
+#if DEBUG
+                water_supply_min = 0;
+#endif
+                if (target_flow < water_supply_min || target_flow > water_supply_max)
+                {
+                    return default;
+                }
+            }
+
+            #endregion
+
+            #region 瀛樺湪-棰戠巼闄愬埗
+
+            var frequency_limit_flag_dict = new Dictionary<int, Model.FrequencyLimit>();
+            var exist_frequency_limit_list = frequency_limit_list != null && frequency_limit_list.Count > 0;
+            if (exist_frequency_limit_list)
+            {
+                frequency_limit_flag_dict = frequency_limit_list.ToDictionary(x => x.Flag, x => x);
+            }
+
+            #endregion
+             
+
+            #region 瀛樺湪-浼樺厛寮�娉靛垪琛�
+
+            var priority_open_flag_list_remark = string.Empty;
+            var exist_priority_open_flag_list = priority_open_flag_list != null && priority_open_flag_list.Count > 0;
+            if (exist_priority_open_flag_list)
+            {
+                priority_open_flag_list = priority_open_flag_list.OrderBy(x => x).ToList();
+                priority_open_flag_list_remark = IntListHelper.ToString(priority_open_flag_list);
+            }
+
+            #endregion
+
+            #region 瀛樺湪-妫�淇垪琛�
+
+            var exist_maintenance_flag_list = maintenance_flag_list != null && maintenance_flag_list.Count > 0;
+             
+            #endregion
+
+            #region 瀛樺湪-褰撳墠寮�娉靛垪琛� (鏄惁鍒囨车)
+
+            var exist_current_open_flag_list = current_open_flag_list != null && current_open_flag_list.Count > 0;
+            if (exist_current_open_flag_list)
+            {
+                //渚涙按闄愬埗
+                var exist_limit = false;
+                if (exist_water_supply_limit_list)
+                {
+                    var limit = water_supply_limit_list.Find(x => x.PumpCount == current_open_flag_list.Count);
+                    if (limit != null)
+                    {
+                        if (target_flow < limit.Min || target_flow > limit.Max)
+                        {
+                            exist_limit = true;
+                        }
+                    }
+                }
+                if (!exist_limit)
+                {
+                    var current_ana_combine_list = GetOptAnaCombine
+                       (
+                       current_open_flag_list,
+                       combine_merit_ratio,
+                       pump_nr_dict,
+                       pump_bp_dict,
+                       exist_frequency_limit_list,
+                       frequency_limit_flag_dict,
+                       target_flow_compensation,
+                       target_head
+                       );
+                    if (current_ana_combine_list != null)
+                        return current_ana_combine_list;
+                }
+            }
+
+            #endregion
+
+
+            #endregion
+
+            #region 璋冨害鍒嗘瀽
+
+            var ana_combine_list = new List<AnaCombine>();
+            for (int pump_count = min_open_count; pump_count <= max_open_count; pump_count++)
+            {
+                if (pump_count == 1)
+                {
+                    var max_total_flow = pump_list.Max(x => x.Qr);
+                    if (max_total_flow < target_flow)
+                        continue;
+                }
+
+                #region 渚涙按闄愬埗
+
+                //渚涙按闄愬埗
+                if (exist_water_supply_limit_list)
+                {
+                    var exist_limit = false;
+                    foreach (var limit in water_supply_limit_list)
+                    {
+                        if (limit.PumpCount == pump_count)
+                        {
+                            if (target_flow < limit.Min || target_flow > limit.Max)
+                            {
+                                exist_limit = true;
+                                break;
+                            }
+                        }
+                    }
+                    if (exist_limit)
+                        continue;
+                }
+
+                #endregion
+
+                var combine_list = GetCombineList(pump_flag_list, pump_count);//鎺掑垪缁勫悎
+                foreach (var combine in combine_list)
+                {
+                    combine_merit_ratio = 1;
+
+                    #region 瑙勫垯杩囨护
+                    //蹇呭紑
+                    if (exist_must_open_flag_list)
+                    {
+                        var combine_remark = IntListHelper.ToString(combine.OrderBy(x => x));
+                        if (!combine_remark.Contains(must_open_flag_list_remark))
+                            continue;
+                    }
+
+                    //蹇呭叧
+                    if (exist_must_close_flag_list)
+                    {
+                        var exist_intersected = combine.Intersect(must_close_flag_list).Count() > 0;
+                        if (exist_intersected)
+                            continue;
+                    }
+
+                    //绂佺敤缁勫悎
+                    if (exist_forbidden_flag_combine_list)
+                    {
+                        var exist_equal = false;
+                        foreach (var flag_list in forbidden_flag_combine_list)
+                        {
+                            if (combine.SequenceEqual(flag_list))
+                            {
+                                exist_equal = true;
+                                break;
+                            }
+                        }
+                        if (exist_equal)
+                            continue;
+                    }
+
+                    //鍚屾娉电粍鍚�
+                    if (exist_same_section_flag_combine_list)
+                    {
+                        var exist_equal = false;
+                        foreach (var flag_list in same_section_combine_dict[pump_count])
+                        {
+                            //鐩稿悓
+                            if (combine.SequenceEqual(flag_list))
+                            {
+                                exist_equal = true;
+                                break;
+                            }
+
+                            //鍖呭惈
+                            if (flag_list.Intersect(combine).Count() == flag_list.Length)
+                            {
+                                exist_equal = true;
+                                break;
+                            }
+                        }
+                        if (exist_equal)
+                            continue;
+                    }
+
+                    //鍏宠仈缁勫悎
+                    if (exist_associative_flag_combine_list)
+                    {
+                        var exist_intersected = false;
+                        foreach (var flag_list in associative_flag_combine_list)
+                        {
+                            var except_count = combine.Except(flag_list).Count();
+                            if (except_count != flag_list.Count && except_count > 0)
+                            {
+                                exist_intersected = true;
+                            }
+                        }
+                        if (exist_intersected)
+                            continue;
+                    }
+
+                    //褰撳墠寮�娉靛垪琛� 
+                    int start_stop_count = 0;//鍚仠鏁伴噺 
+                    if (exist_current_open_flag_list)
+                    {
+                        var start_pump_count = combine.Except(current_open_flag_list).Count();
+                        var close_pump_count = current_open_flag_list.Except(combine).Count();
+                        start_stop_count = start_pump_count + close_pump_count;//鍚仠鏁伴噺 
+                    }
+                    else
+                    {
+                        start_stop_count = combine.Count();
+                        if (exist_must_open_flag_list)
+                        {
+                            start_stop_count = combine.Except(must_open_flag_list).Count();
+                        }
+                    }
+
+                    //浼樺厛寮�娉靛垪琛�
+                    if (exist_priority_open_flag_list)
+                    {
+                        //鐩墠閫昏緫 浼樺厛寮�娉�==蹇呭紑鏂规
+                        var combine_remark = IntListHelper.ToString(combine.OrderBy(x => x));
+                        if (!combine_remark.Contains(priority_open_flag_list_remark))
+                            continue;
+                    }
+
+                    //妫�淇垪琛� 
+                    if (exist_maintenance_flag_list)
+                    {
+                        var exist_intersected = combine.Intersect(maintenance_flag_list).Count() > 0;
+                        if (exist_intersected)
+                            continue;
+                    }
+
+
+                    #endregion
+
+                    var total_loss_ratio = Math.Pow(_start_stop_loss_coefficient, start_stop_count);//鍚仠涓�娆℃崯澶变簺鑳借��
+                    combine_merit_ratio *= total_loss_ratio;
+
+                    var current_ana_combine_list = GetOptAnaCombine
+                        (
+                        combine,
+                        combine_merit_ratio,
+                        pump_nr_dict,
+                        pump_bp_dict,
+                        exist_frequency_limit_list,
+                        frequency_limit_flag_dict,
+                        target_flow_compensation,
+                        target_head
+                        );
+                    if (current_ana_combine_list == null)
+                        continue;
+                    ana_combine_list.AddRange(current_ana_combine_list);
+                }
+
+                // 20250422 娉ㄩ噴鍘熷洜锛氫緵姘磋寖鍥翠細鏈夐噸鍙狅紝鑰冭檻鍒囨车鎿嶄綔
+                //濡傛灉褰撳墠寰幆宸茬粡婊¤冻锛屼笉闇�瑕佸啀鍔犳车
+                //if (opt_ana_combine_list.Any())
+                //{
+                //    break;
+                //}
+            }
+
+            if (ana_combine_list.Count < 1)
+                return default;
+
+            ana_combine_list = ana_combine_list.OrderBy(x => x.TotalPower).OrderByDescending(x => x.MeritRatio).ToList(); 
+            return ana_combine_list;
+
+            #endregion
+
+        }
+
+
+        /// <summary>
+        /// 鑾峰彇鏈�浼樼粍鍚�
+        /// </summary>
+        /// <param name="combine"></param>
+        /// <param name="combine_merit_ratio"></param>
+        /// <param name="flag_inlet_water_level_dict"></param>
+        /// <param name="pump_nr_dict"></param>
+        /// <param name="pump_bp_dict"></param>
+        /// <param name="exist_frequency_limit_list"></param>
+        /// <param name="frequency_limit_flag_dict"></param>
+        /// <param name="target_flow"></param>
+        /// <param name="target_head"></param>
+        /// <returns></returns>
+        private List<AnaCombine> GetOptAnaCombine
+            (
+            IEnumerable<int> combine,
+            double combine_merit_ratio,
+            Dictionary<int, double> pump_nr_dict,
+            Dictionary<int, bool> pump_bp_dict,
+            bool exist_frequency_limit_list,
+            Dictionary<int, Model.FrequencyLimit> frequency_limit_flag_dict,
+            double target_flow,
+            double target_head
+            )
+        {
+            if (combine == null || !combine.Any())
+                return default;
+
+            //鍏堜慨姝g粍鍚堟洸绾垮拰妯″瀷鐨勫亸宸壃绋�
+
+            var conclusion_ex_list_list = new List<List<AnalysisConclusionViewModel>>();
+            var conclusion_ex_list_dict = new Dictionary<int, List<AnalysisConclusionViewModel>>();
+            double max_supply_flow = 0;
+            foreach (var flag in combine)
+            {
+                var run_flag = RunFlagHelper.Get(flag, pump_bp_dict[flag]);
+
+                //杩涘彛姘翠綅
+                var inlet_water_level = 0;
+
+                //缁勫悎鍋忓樊绯绘暟 
+                var current_head = target_head - inlet_water_level + _sel_opt_pump_pressure_excess;
+
+                current_head = Math.Round(current_head, 1);
+
+                //棰戠巼闄愬埗
+                var conclusion_list = new List<Entity.AnalysisParameter>();
+                if (exist_frequency_limit_list && frequency_limit_flag_dict.ContainsKey(flag))
+                {
+                    var limit = frequency_limit_flag_dict[flag];
+                    conclusion_list = _service_analysis_parameter.GetHeadList(run_flag, limit.Min, limit.Max, current_head);
+                }
+                else
+                {
+
+                    //瀹氶娉� 鍙兘鏈�灏忓帇宸秴杩囩洰鏍囧帇宸�
+                    var min_head_conclusion = _service_analysis_parameter.GetMinHead(run_flag);
+                    if (min_head_conclusion != null && min_head_conclusion.Head > current_head)
+                    {
+                        conclusion_list = new List<Entity.AnalysisParameter>() { min_head_conclusion };
+                    }
+                    else
+                    {
+                        var is_bp = pump_bp_dict[flag];
+                        if (is_bp)
+                        {
+                            conclusion_list = _service_analysis_parameter.GetHeadList(run_flag, current_head);
+                        }
+                        else
+                        {
+                            var list = _service_analysis_parameter.GetList(run_flag);
+                            conclusion_list = _service_analysis_parameter.GetHeadList(run_flag, current_head);
+                        }
+                    }
+                }
+                if (conclusion_list == null || !conclusion_list.Any())
+                {
+                    break;
+                }
+                max_supply_flow += conclusion_list.Max(x => x.Flow);
+                var conclusion_ex_list = conclusion_list.Select(x => new AnalysisConclusionViewModel(x, flag)).ToList();
+                conclusion_ex_list_list.Add(conclusion_ex_list);
+                conclusion_ex_list_dict[flag] = conclusion_ex_list;
+            }
+
+            if (conclusion_ex_list_list.Count != combine.Count())
+                return default;
+
+            if (max_supply_flow < target_flow * _sel_opt_flow_excess)
+            { 
+                var flow_excess = target_flow * _sel_opt_flow_excess;
+                if (max_supply_flow < flow_excess)
+                    return default;
+            }
+
+            var temp_ana_combine_list = GetOptAnaCombine(conclusion_ex_list_dict, pump_nr_dict, pump_bp_dict, target_flow);
+            if (temp_ana_combine_list == null || !temp_ana_combine_list.Any())
+                return default; 
+            temp_ana_combine_list = temp_ana_combine_list.OrderBy(x => x.TotalFlow).ToList();
+
+            var ana_combine_list = new List<AnaCombine>();
+            foreach (var ana_combine in temp_ana_combine_list)
+            {
+                var total_flow = ana_combine.TotalFlow;
+                var total_power = ana_combine.TotalPower;
+                if (total_flow < target_flow * _sel_opt_flow_excess)
+                    return default;
+
+
+                var total_flow_deviation_ratio = Math.Abs(1 - Math.Abs(total_flow / target_flow));
+                if (total_flow_deviation_ratio > _sel_opt_flow_deviation_ratio)
+                    continue;
+                if (total_flow_deviation_ratio > _sel_opt_reasonable_flow_deviation_ratio)
+                {
+                    combine_merit_ratio -= total_flow_deviation_ratio;
+                }
+
+                double eff = 0, wp = 0, uwp = 0;
+                wp = Model.CurveCalcuHelper.CalculateWP(total_power, total_flow);
+                foreach (var ana_pump in ana_combine.AnaFrePumps)
+                {
+                    var pump_flow = ana_pump.Flow;
+                    var pump_eff = ana_pump.Eff;
+                    var pump_uwp = ana_pump.UWP;
+
+                    eff += pump_eff * pump_flow / total_flow;
+                    uwp += pump_uwp * pump_flow / total_flow;
+                }
+
+                ana_combine.TotalFlow = total_flow;
+                ana_combine.TotalHead = target_head;
+                ana_combine.TotalPower = total_power;
+                ana_combine.TotalEfficiency = eff;
+                ana_combine.WP = wp;
+                ana_combine.UWP = uwp;
+                ana_combine.MeritRatio = combine_merit_ratio;
+                ana_combine_list.Add(ana_combine);
+            }
+            return  ana_combine_list;
+
+        }
+
+
+        /// <summary>
+        /// 鑾峰彇鏈�浼樼粍鍚�
+        /// </summary>
+        /// <param name="conclusion_ex_list_dict"></param>
+        /// <param name="pump_nr_dict"></param>
+        /// <param name="pump_bp_dict"></param>
+        /// <param name="target_flow"></param>
+        /// <returns></returns>
+        private List<AnaCombine> GetOptAnaCombine(
+            Dictionary<int, List<AnalysisConclusionViewModel>> conclusion_ex_list_dict,
+            Dictionary<int, double> pump_nr_dict,
+            Dictionary<int, bool> pump_bp_dict,
+            double target_flow
+            )
+        {
+            if (conclusion_ex_list_dict == null || !conclusion_ex_list_dict.Any())
+                return default;
+            var frequency_min = (double)_frequency_min;
+            var frequency_max = (double)_frequency_max;
+            var frequency_space = (double)_frequency_space;
+
+            var all_fre_conclusion_ex_list_list = new List<List<AnalysisConclusionViewModel>>();
+            var all_fix_conclusion_ex_list_list = new List<List<AnalysisConclusionViewModel>>();
+            foreach (var item in conclusion_ex_list_dict)
+            {
+                var flag = item.Key;
+                var cl_list = item.Value;
+                if (pump_bp_dict[flag])
+                {
+                    all_fre_conclusion_ex_list_list.Add(cl_list);
+                }
+                else
+                {
+                    all_fix_conclusion_ex_list_list.Add(cl_list);
+                }
+            }
+            var cl_ex_list_list_list = new List<List<List<AnalysisConclusionViewModel>>>();
+
+
+            //榛樿1hz鍐呰兘姹傚嚭婊¤冻鐩爣闇�姹傜殑鎺掑垪缁勫悎锛屼笉婊¤冻缁х画杩唬
+            var frequency_iteration_count = 5;//棰戠巼杩唬娆℃暟
+            var frequency_iteration_space = 1d;//棰戠巼杩唬闂撮殧
+            for (int i = 0; i < frequency_iteration_count; i++)
+            {
+                var current_frequency_space = frequency_space + (i * frequency_iteration_space);
+                cl_ex_list_list_list = FrequencyFilters(target_flow, frequency_min, frequency_max, current_frequency_space, all_fre_conclusion_ex_list_list, all_fix_conclusion_ex_list_list);
+                if (cl_ex_list_list_list.Any())
+                {
+                    break;
+                }
+            }
+
+            if (!cl_ex_list_list_list.Any())
+            {
+                return default;
+            }
+
+            //鍒嗙粍鎺掑垪缁勫悎姹傛渶浼�
+            var ana_combine_list = new List<AnaCombine>();
+            foreach (var item_cl_ex_list_list in cl_ex_list_list_list)
+            {
+                var cl_ex_list_list = CartesianProduct(item_cl_ex_list_list, target_flow);
+                var opt_cl_ex_list = cl_ex_list_list.OrderBy(x => x.Sum(x => x.Power)).FirstOrDefault();
+                if (opt_cl_ex_list != null && opt_cl_ex_list.Any())
+                {
+                    var ana_combine = new AnaCombine();
+                    ana_combine.Flags = new List<int>();
+                    ana_combine.AnaFrePumps = new List<AnaFrePump>();
+                    foreach (var opt_cl_ex in opt_cl_ex_list)
+                    {
+                        var flag = opt_cl_ex.Flag;
+                        ana_combine.Flags.Add(flag);
+                        ana_combine.TotalFlow += opt_cl_ex.Flow;
+                        ana_combine.TotalPower += opt_cl_ex.Power;
+
+                        var ana_fre_pump = new AnaFrePump();
+                        ana_fre_pump.Flag = flag;
+                        ana_fre_pump.Flow = opt_cl_ex.Flow;
+                        ana_fre_pump.Head = opt_cl_ex.Head;
+                        ana_fre_pump.Power = opt_cl_ex.Power;
+                        ana_fre_pump.Eff = opt_cl_ex.Eff;
+                         ana_fre_pump.WP = Model.CurveCalcuHelper.CalculateWP(ana_fre_pump.Power, ana_fre_pump.Flow);
+                        ana_fre_pump.UWP = Model.CurveCalcuHelper.CalculateUWP(ana_fre_pump.Power, ana_fre_pump.Flow, ana_fre_pump.Head);
+                        ana_fre_pump.Frequency = opt_cl_ex.Hz;
+                        ana_fre_pump.Speed = opt_cl_ex.Hz / 50 * pump_nr_dict[flag];
+                        ana_combine.AnaFrePumps.Add(ana_fre_pump);
+                    }
+
+                    ana_combine.FlagCount = opt_cl_ex_list.Count;
+                    ana_combine.Remark = IntListHelper.ToString(ana_combine.Flags);
+                    ana_combine_list.Add(ana_combine);
+                }
+            }
+            if (!ana_combine_list.Any())
+                return default;
+            ana_combine_list = ana_combine_list.ToList();
+            return ana_combine_list;
+            //var opt_ana_combine = ana_combine_list.OrderBy(x => x.TotalFlow).OrderBy(x => x.TotalPower).First();
+            //return opt_ana_combine;
+        }
+
+
+        /// <summary>
+        /// 鑾峰彇鍚屾娉电粍鍚�
+        /// </summary>
+        /// <param name="same_section_flag_combine_list"></param>
+        /// <param name="pump_list_count"></param>
+        /// <returns></returns>
+        public Dictionary<int, List<int[]>> GetSameSectionCombineDict(List<List<int>> same_section_flag_combine_list, int pump_list_count)
+        {
+            Dictionary<int, List<int[]>> same_section_combine_dict = new();
+            for (int pump_count = 1; pump_count <= pump_list_count; pump_count++)
+            {
+                same_section_combine_dict[pump_count] = new List<int[]>();
+                switch (pump_count)
+                {
+                    case 2:
+                        {
+                            foreach (var same_section_flag_combine in same_section_flag_combine_list)
+                            {
+                                var combine_list = GetCombineList(same_section_flag_combine, 2);
+                                same_section_combine_dict[pump_count].AddRange(combine_list);
+                            }
+                        }
+                        break;
+                    case 3:
+                        {
+                            foreach (var same_section in same_section_flag_combine_list)
+                            {
+                                var combine_list = GetCombineList(same_section, 3);
+                                same_section_combine_dict[pump_count].AddRange(combine_list);
+                            }
+                        }
+                        break;
+                    case 4:
+                        {
+                            foreach (var same_section in same_section_flag_combine_list)
+                            {
+                                var combine_list3 = GetCombineList(same_section, 3);
+                                same_section_combine_dict[pump_count].AddRange(combine_list3);
+                                if (same_section.Count > 3)
+                                {
+                                    var combine_list = GetCombineList(same_section, 4);
+                                    same_section_combine_dict[pump_count].AddRange(combine_list);
+                                }
+                            }
+                        }
+                        break;
+                    case 5:
+                        {
+                            foreach (var same_section in same_section_flag_combine_list)
+                            {
+                                if (same_section.Count > 3)
+                                {
+                                    var combine_list = GetCombineList(same_section, 4);
+                                    same_section_combine_dict[pump_count].AddRange(combine_list);
+                                }
+                            }
+                        }
+                        break;
+                    case 6:
+                        {
+                            foreach (var same_section in same_section_flag_combine_list)
+                            {
+                                if (same_section.Count > 3)
+                                {
+                                    var combine_list = GetCombineList(same_section, 4);
+                                    same_section_combine_dict[pump_count].AddRange(combine_list);
+                                }
+                            }
+                        }
+                        break;
+                    default:
+                        break;
+                }
+            }
+
+            return same_section_combine_dict;
+        }
+
+        /// <summary>
+        /// 鑾峰彇娉电疮璁¤繍琛屾椂闀挎崯澶辩郴鏁板瓧鍏�
+        /// </summary>
+        /// <param name="flag_cumulative_runtime_dict"></param>
+        /// <returns></returns>
+        public Dictionary<int, double> GetFlagCumulativeRuntimeLossRatioDict(Dictionary<int, double> flag_cumulative_runtime_dict)
+        {
+            var rating_value = 24 * 5;
+            var flag_cumulative_runtime_loss_ratio_dict = new Dictionary<int, double>();
+            foreach (var item in flag_cumulative_runtime_dict)
+            {
+                var flag = item.Key;
+                var cumulative_runtime = item.Value;
+                var level = cumulative_runtime / rating_value / 100;
+                var loss_ratio = 1 - level;
+                flag_cumulative_runtime_loss_ratio_dict.Add(flag, loss_ratio);
+            }
+            return flag_cumulative_runtime_loss_ratio_dict;
+        }
+
+        /// <summary>
+        /// 杩囨护棰戠巼鍒嗙粍
+        /// </summary>
+        /// <param name="target_flow"></param>
+        /// <param name="frequency_min"></param>
+        /// <param name="frequency_max"></param>
+        /// <param name="frequency_space"></param>
+        /// <param name="all_fre_conclusion_ex_list_list"></param>
+        /// <param name="all_fix_conclusion_ex_list_list"></param> 
+        /// <returns></returns>
+        private List<List<List<AnalysisConclusionViewModel>>> FrequencyFilters(
+            double target_flow,
+            double frequency_min,
+            double frequency_max,
+            double frequency_space,
+            List<List<AnalysisConclusionViewModel>> all_fre_conclusion_ex_list_list,
+            List<List<AnalysisConclusionViewModel>> all_fix_conclusion_ex_list_list)
+        {
+            double fix_total_flow = 0;
+            var exist_all_fix_conclusion_ex_list_list = all_fix_conclusion_ex_list_list.Any();
+            if (exist_all_fix_conclusion_ex_list_list)
+            {
+                fix_total_flow = all_fix_conclusion_ex_list_list.Sum(x => x.Sum(x => x.Flow));
+            }
+
+            //棰戠巼鎸夐棿闅斿垎缁�
+            var cl_ex_list_list_list = new List<List<List<AnalysisConclusionViewModel>>>();
+            for (double fre_current_min = frequency_min; fre_current_min <= frequency_max; fre_current_min++)
+            {
+                var fre_current_max = fre_current_min + frequency_space;
+                var skip_current = false;
+                var total_flow_current = 0d;
+                var cl_ex_list_list = new List<List<AnalysisConclusionViewModel>>();
+                foreach (var conclusion_ex_list in all_fre_conclusion_ex_list_list)
+                {
+                    var cl_ex_list = conclusion_ex_list.Where(x => x.Hz <= fre_current_max && x.Hz >= fre_current_min).ToList();
+                    if (cl_ex_list == null || !cl_ex_list.Any())
+                    {
+                        skip_current = true;
+                        break;
+                    }
+                    total_flow_current += cl_ex_list.Max(x => x.Flow);
+                    cl_ex_list_list.Add(cl_ex_list);
+                }
+                if (skip_current)
+                    continue;
+                if (exist_all_fix_conclusion_ex_list_list)
+                {
+                    total_flow_current += fix_total_flow;
+                    cl_ex_list_list.AddRange(all_fix_conclusion_ex_list_list);
+                }
+                if (total_flow_current < target_flow * _sel_opt_flow_excess)
+                    continue;
+                cl_ex_list_list_list.Add(cl_ex_list_list);
+            }
+            return cl_ex_list_list_list;
+        }
+
+
+        /// <summary>
+        /// 鑾峰彇鎺掑垪缁勫悎鍒楄〃(绗涘崱灏斾箻绉�)
+        /// </summary>
+        private List<List<AnalysisConclusionViewModel>> CartesianProduct(List<List<AnalysisConclusionViewModel>> lstSplit, double target_flow)
+        {
+            long count = 1;
+            lstSplit.ForEach(item => count *= item.Count);
+            var lstResult = new List<List<AnalysisConclusionViewModel>>();
+            for (long i = 0; i < count; ++i)
+            {
+                var lstTemp = new List<AnalysisConclusionViewModel>();
+                long j = 1;
+                var lstFre = new List<double>();
+                double totalFlow = 0;
+                lstSplit.ForEach(item =>
+                {
+                    j *= item.Count;
+                    var index = (i / (count / j)) % item.Count;
+                    var index_int = (int)index;
+                    var obj = item[index_int];
+                    totalFlow += obj.Flow;
+                    lstTemp.Add(obj);
+                });
+                if (totalFlow < target_flow * _sel_opt_flow_excess)
+                    continue;
+                lstResult.Add(lstTemp);
+            }
+            return lstResult;
+        }
+
+
+        /// <summary>
+        /// 鑾峰彇鎺掑垪缁勫悎
+        /// </summary>
+        /// <param name="flags"></param>
+        /// <param name="count"></param>
+        /// <returns></returns>
+        private List<int[]> GetCombineList(List<int> flags, int count)
+        {
+            var combine = Model.PermutationAndCombination<int>.GetCombination(flags.ToArray(), count);
+            return combine;
+        }
+
+ 
+
+        #endregion
+         
+
+    }
+}
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/02-schedule/ScheduleHelper_Model.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/02-schedule/ScheduleHelper_Model.cs
new file mode 100644
index 0000000..bb540d7
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/02-schedule/ScheduleHelper_Model.cs
@@ -0,0 +1,167 @@
+锘縩amespace IStation.Service
+{
+    /// <summary>
+    /// 璋冨害鍒嗘瀽杈呭姪绫� Model
+    /// </summary>
+    public partial class ScheduleHelper
+    {
+        /// <summary>
+        /// 鍒嗘瀽鍙橀娉�
+        /// </summary>
+        public class AnaFrePump
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            public int Flag { get; set; } 
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public double Flow { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public double Head { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public double PressureDiff { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public double Power { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public double Eff { get; set; }
+             
+            /// <summary>
+            /// 
+            /// </summary>
+            public double WP { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public double UWP { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public double Frequency { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public double Speed { get; set; } 
+
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public void Round()
+            {
+                this.Flow = Math.Round(this.Flow, 1);
+                this.Head = Math.Round(this.Head, 3);
+                this.Power = Math.Round(this.Power, 1);
+                this.Eff = Math.Round(this.Eff, 1);
+                this.Frequency = Math.Round(this.Frequency, 1);
+                this.Speed = Math.Round(this.Speed, 1);
+            }
+
+        }
+
+        /// <summary>
+        /// 鍒嗘瀽缁勫悎
+        /// </summary>
+        public class AnaCombine
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            public double TotalFlow { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public double TotalHead { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public double TotalPower { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public double TotalEfficiency { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public double WP { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public double UWP { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public List<AnaFrePump> AnaFrePumps { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public List<int> Flags { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public int FlagCount { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public string Remark { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public double MeritRatio { get; set; }
+
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public void Round()
+            {
+                this.TotalFlow = Math.Round(this.TotalFlow, 1);
+                this.TotalHead = Math.Round(this.TotalHead, 3);
+                this.TotalPower = Math.Round(this.TotalPower, 1);
+                this.TotalEfficiency = Math.Round(this.TotalEfficiency, 1);
+                this.WP = Math.Round(this.WP, 2);
+                this.UWP = Math.Round(this.UWP, 2);
+
+                if (this.AnaFrePumps != null && this.AnaFrePumps.Any())
+                {
+                    foreach (var anaFrePump in AnaFrePumps)
+                    {
+                        anaFrePump.Round();
+
+                    }
+                }
+            }
+
+
+        }
+
+
+    }
+}
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/GlobalUsing.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/GlobalUsing.cs
new file mode 100644
index 0000000..a0d5aaa
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/GlobalUsing.cs
@@ -0,0 +1,8 @@
+锘縢lobal using SqlSugar;
+
+
+
+
+global using System;
+global using System.Collections.Generic;
+global using System.Drawing;
\ No newline at end of file
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/IStation.WinFrmUI.Schedule.csproj b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/IStation.WinFrmUI.Schedule.csproj
new file mode 100644
index 0000000..c6d6531
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/IStation.WinFrmUI.Schedule.csproj
@@ -0,0 +1,46 @@
+锘�<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0-windows</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <Compile Remove="Schedule\000\AnaScheme.cs" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\IStation.WinFrmUI.Basic\IStation.WinFrmUI.Basic.csproj" />
+    <ProjectReference Include="..\IStation.WinFrmUI.Core\IStation.WinFrmUI.Core.csproj" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Compile Update="Properties\Resources.Designer.cs">
+      <DesignTime>True</DesignTime>
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Update="Schedule\ScheduleAnalyPage.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Update="Schedule\ParallelCurveViewDlg.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Update="Schedule\SetPumpRunConfigDlg.cs">
+      <SubType>Form</SubType>
+    </Compile>
+  </ItemGroup>
+
+  <ItemGroup>
+    <EmbeddedResource Update="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+  </ItemGroup>
+
+  <ItemGroup>
+    <Folder Include="05-service\00-basic\" />
+  </ItemGroup>
+
+</Project>
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Properties/Resources.Designer.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..94ee139
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Properties/Resources.Designer.cs
@@ -0,0 +1,73 @@
+锘�//------------------------------------------------------------------------------
+// <auto-generated>
+//     姝や唬鐮佺敱宸ュ叿鐢熸垚銆�
+//     杩愯鏃剁増鏈�:4.0.30319.42000
+//
+//     瀵规鏂囦欢鐨勬洿鏀瑰彲鑳戒細瀵艰嚧涓嶆纭殑琛屼负锛屽苟涓斿鏋�
+//     閲嶆柊鐢熸垚浠g爜锛岃繖浜涙洿鏀瑰皢浼氫涪澶便��
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace IStation.WinFrmUI.Schedule.Properties {
+    using System;
+    
+    
+    /// <summary>
+    ///   涓�涓己绫诲瀷鐨勮祫婧愮被锛岀敤浜庢煡鎵炬湰鍦板寲鐨勫瓧绗︿覆绛夈��
+    /// </summary>
+    // 姝ょ被鏄敱 StronglyTypedResourceBuilder
+    // 绫婚�氳繃绫讳技浜� ResGen 鎴� Visual Studio 鐨勫伐鍏疯嚜鍔ㄧ敓鎴愮殑銆�
+    // 鑻ヨ娣诲姞鎴栫Щ闄ゆ垚鍛橈紝璇风紪杈� .ResX 鏂囦欢锛岀劧鍚庨噸鏂拌繍琛� ResGen
+    // (浠� /str 浣滀负鍛戒护閫夐」)锛屾垨閲嶆柊鐢熸垚 VS 椤圭洰銆�
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+        
+        /// <summary>
+        ///   杩斿洖姝ょ被浣跨敤鐨勭紦瀛樼殑 ResourceManager 瀹炰緥銆�
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("IStation.WinFrmUI.Schedule.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   閲嶅啓褰撳墠绾跨▼鐨� CurrentUICulture 灞炴�э紝瀵�
+        ///   浣跨敤姝ゅ己绫诲瀷璧勬簮绫荤殑鎵�鏈夎祫婧愭煡鎵炬墽琛岄噸鍐欍��
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        /// <summary>
+        ///   鏌ユ壘 DevExpress.Utils.Svg.SvgImage 绫诲瀷鐨勬湰鍦板寲璧勬簮銆�
+        /// </summary>
+        internal static DevExpress.Utils.Svg.SvgImage datasource {
+            get {
+                object obj = ResourceManager.GetObject("datasource", resourceCulture);
+                return ((DevExpress.Utils.Svg.SvgImage)(obj));
+            }
+        }
+    }
+}
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Properties/Resources.resx b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Properties/Resources.resx
new file mode 100644
index 0000000..4c89dde
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Properties/Resources.resx
@@ -0,0 +1,124 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="datasource" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\datasource.svg;DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
+  </data>
+</root>
\ No newline at end of file
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Resources/datasource.svg b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Resources/datasource.svg
new file mode 100644
index 0000000..7f70648
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Resources/datasource.svg
@@ -0,0 +1,18 @@
+锘�<?xml version='1.0' encoding='UTF-8'?>
+<svg x="0px" y="0px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" id="Layer_1" style="enable-background:new 0 0 32 32">
+  <style type="text/css">
+	.Black{fill:#727272;}
+	.Yellow{fill:#FFB115;}
+	.Blue{fill:#1177D7;}
+	.Green{fill:#039C23;}
+	.Red{fill:#D11C1C;}
+	.White{fill:#FFFFFF;}
+	.st0{opacity:0.75;}
+	.st1{opacity:0.5;}
+	.st2{opacity:0.25;}
+</style>
+  <g id="Datasource">
+    <path d="M6,6h12v2H6V6z M14,24H4V2h16v10.2c0.6-0.1,1.3-0.2,2-0.2V1c0-0.5-0.5-1-1-1H3C2.5,0,2,0.5,2,1v24   c0,0.5,0.5,1,1,1h11V24z M6,20h8v-2H6V20z M6,16h8.2c0.2-0.8,0.7-1.4,1.5-2H6V16z" class="Black" />
+    <path d="M18,12H6v-2h12V12z M23,14c-3.9,0-7,1.3-7,3v12c0,1.7,3.1,3,7,3s7-1.3,7-3V17C30,15.3,26.9,14,23,14z" class="Yellow" />
+  </g>
+</svg>
\ No newline at end of file
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/000/AnaCurveItem.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/000/AnaCurveItem.cs
new file mode 100644
index 0000000..8c3f47c
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/000/AnaCurveItem.cs
@@ -0,0 +1,68 @@
+锘縩amespace IStation.WinFrmUI.Schedule
+{
+    /// <summary>
+    /// 鍙橀娉靛崟棰戠巼鏁版嵁
+    /// </summary>
+    public class AnaCurveItem
+    {
+        public AnaCurveItem() { }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public IStation.Model.CurveExpress CurveInfoQH;
+        /// <summary>
+        /// 
+        /// </summary>
+        public IStation.Model.CurveExpress CurveInfoQP;
+        /// <summary>
+        /// 
+        /// </summary>
+        public double Frequence = 50;
+        /// <summary>
+        /// 
+        /// </summary>
+        public double Speed { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public double WorkPointQ { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public double WorkPointH { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public double WorkPointP { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public double WorkPointE { get; set; }
+        /// <summary>
+        /// 宸茶秴杩囨渶澶ф壃绋�
+        /// </summary>
+        public bool IsOverMaxH = false;//
+
+        /// <summary>
+        /// 鏄惁寤堕暱绾夸笂 
+        /// </summary>
+        public bool IsExtendCurve = false;//
+
+        /// <summary>
+        /// 寤堕暱姣斾緥
+        /// </summary>
+        public double RatioExtend { get; set; }
+
+        /// <summary>
+        /// 澶囨敞
+        /// </summary>
+        public string Note { get; set; }
+
+        /// <summary>
+        /// 1 姝e父  2 瓒呰繃鎵�闇�鎵▼
+        /// </summary>
+        public int Status { get; set; } = 1;
+    }
+
+}
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/000/AnaScheme.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/000/AnaScheme.cs
new file mode 100644
index 0000000..aa523c3
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/000/AnaScheme.cs
@@ -0,0 +1,103 @@
+锘縰sing System.Collections.Generic;
+using System.Linq;
+
+namespace IStation.WinFrmUI.Schedule
+{
+
+    /// <summary>
+    /// 
+    /// </summary>
+    public class AnaScheme
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public int ID { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public double TotalWrkQ { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public double TotalWrkH { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public double TotalWrkE { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public double TotalWrkP { get; set; }
+
+        /// <summary>
+        /// 鍗冨惃姘磋兘鑰�
+        /// </summary>
+        public double UWP { get; set; }
+
+        /// <summary>
+        /// 鑳借��
+        /// </summary>
+        public double WP { get; set; }
+
+        /// <summary>
+        /// 寮�娉垫暟閲�
+        /// </summary>
+        public int RunNumber
+        {
+            get
+            {
+                if (Items == null)
+                    return 0;
+
+                return Items.Count();
+            }
+            set => value = RunNumber;
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public double SpanQ { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public List<AnaSchemeItem> Items { get; set; }
+
+        /// <summary>
+        ///  缁撹鍙俊搴� 1 姝e父  2 鎻愰珮浜嗘壃绋�  3 涓嶇敤寮�娉�
+        /// </summary>
+        public int ResultStatus { get; set; } = 1;
+
+        /// <summary>
+        /// 缁撹鍙俊搴︿俊鎭�
+        /// </summary>
+        public string ResultStatusInfo { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public void CalcItemParas()
+        {
+            if (Items == null || Items.Count() == 0)
+                return;
+            List<string> sss = new List<string>();
+            foreach (var item in Items)
+            {
+                sss.Add(string.Format("M{0}P{1}F{2}", item.MachineID, item.PumpID, item.Frequence));
+            }
+            ItemsParas = string.Join(",", sss);
+        }
+        /// <summary>
+        /// 
+        /// </summary>
+        public string ItemsParas { get; set; }
+    }
+
+
+
+
+
+
+
+
+}
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/000/AnaSchemeItem.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/000/AnaSchemeItem.cs
new file mode 100644
index 0000000..5ecbc58
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/000/AnaSchemeItem.cs
@@ -0,0 +1,73 @@
+锘縩amespace IStation.WinFrmUI.Schedule
+{
+    /// <summary>
+    /// 
+    /// </summary>
+    public class AnaSchemeItem
+    {
+       銆�
+        /// <summary>
+        /// 
+        /// </summary>
+        public long PumpID { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public long MachineID { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public string MachineName { get; set; }
+        /// <summary>
+        /// 鏄惁鏄彉棰戞车
+        /// </summary>
+        public bool IsFrequency { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public double WorkPointQ { get; set; }
+        /// <summary>
+        /// /
+        /// </summary>
+        public double WorkPointH { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public double WorkPointE { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public double WorkPointP { get; set; }
+        /// <summary>
+        /// 鏄惁寤堕暱绾夸笂
+        /// </summary>
+        public bool IsCurveExtend { get; set; }//
+
+        /// <summary>
+        /// 寤堕暱姣斾緥
+        /// </summary>
+        public double RatioExtend { get; set; }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public double Frequence { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public double Speed { get; set; }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public IStation.Model.CurveExpress CurveInfoQH { get; set; }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public IStation.Model.CurveExpress CurveInfoQP { get; set; }
+
+        public long PumpCurveID { get; set; }
+
+    }
+}
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ParallelCurveViewDlg.Designer.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ParallelCurveViewDlg.Designer.cs
new file mode 100644
index 0000000..9f9e1ad
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ParallelCurveViewDlg.Designer.cs
@@ -0,0 +1,61 @@
+锘縰sing IStation.WinFrmUI.Curve;
+
+namespace IStation.WinFrmUI.Schedule
+{
+    partial class ParallelCurveViewDlg
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.chartMultiCurveParallelCtrl1 = new IStation.WinFrmUI.Curve.MultiCurveExpressChart();
+            this.SuspendLayout();
+            // 
+            // chartMultiCurveParallelCtrl1
+            //  
+            this.chartMultiCurveParallelCtrl1.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.chartMultiCurveParallelCtrl1.Location = new System.Drawing.Point(0, 0);
+            this.chartMultiCurveParallelCtrl1.Name = "chartMultiCurveParallelCtrl1";
+            this.chartMultiCurveParallelCtrl1.Size = new System.Drawing.Size(732, 547);
+            this.chartMultiCurveParallelCtrl1.TabIndex = 0;
+            // 
+            // ParallelCurveViewDlg
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 14F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(732, 547);
+            this.Controls.Add(this.chartMultiCurveParallelCtrl1);
+            this.Name = "ParallelCurveViewDlg";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+            this.Text = "骞惰仈鏇茬嚎";
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private MultiCurveExpressChart chartMultiCurveParallelCtrl1;
+    }
+}
\ No newline at end of file
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ParallelCurveViewDlg.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ParallelCurveViewDlg.cs
new file mode 100644
index 0000000..4f137a2
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ParallelCurveViewDlg.cs
@@ -0,0 +1,81 @@
+锘縰sing System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Windows.Forms;
+
+namespace IStation.WinFrmUI.Schedule
+{
+    public partial class ParallelCurveViewDlg : DevExpress.XtraEditors.XtraForm
+    {
+        public ParallelCurveViewDlg()
+        {
+            InitializeComponent();
+            IconOptions.Icon = WinFrmUI.Properties.Resources.App;
+        }
+
+        private List<Color> ColorArray = new List<Color>()
+          { Color.Red,
+            Color.Blue, Color.Green, Color.DodgerBlue,
+            Color.Fuchsia,Color.MidnightBlue,Color.Maroon,
+            Color.Aquamarine, Color.Bisque ,Color.BurlyWood };
+
+
+        public void SetBindingData(double workQ, List<AnaSchemeItem> anaSchemes)
+        {
+            if (anaSchemes == null || !anaSchemes.Any())
+                return;
+            if (anaSchemes.Count > 10)
+                return;
+
+            if (anaSchemes.Count == 1)
+            {
+                var scheme = anaSchemes[0];
+                Model.CurveExpress QH = scheme.CurveInfoQH, QP = scheme.CurveInfoQP;
+
+                var QE = Common.LxpFeatCurveHelper.CalculateE(Model.eCurveFitType.FourM, QH, QP);
+                chartMultiCurveParallelCtrl1.AddCurve(-1, scheme.MachineName, QH, QE, QP, System.Drawing.Color.Black);
+
+                chartMultiCurveParallelCtrl1.LineVisible = true;
+                chartMultiCurveParallelCtrl1.CalcWorkPointByQ(workQ);
+                return;
+            }
+
+            var theConnectCurve = new Model.ConnectCurveHelper();
+            for (int i = 0; i < anaSchemes.Count; i++)
+            {
+                var anaScheme = anaSchemes[i];
+                var QH = anaScheme.CurveInfoQH;
+                var QP = anaScheme.CurveInfoQP;
+                var QE = Common.LxpFeatCurveHelper.CalculateE(Model.eCurveFitType.CubicCurve, QH, QP);
+
+
+                theConnectCurve.AddSinglePumpCurve(QH, QP);
+                chartMultiCurveParallelCtrl1.AddCurve(anaScheme.PumpCurveID,
+                                                           anaScheme.MachineName,
+                                                           QH,
+                                                           QE,
+                                                           QP,
+                                                           ColorArray[i]);
+            }
+
+
+            if (!theConnectCurve.CalculateParallel(out List<IStation.Model.CurvePoint> ConnectCurveQH,
+                                                   out List<IStation.Model.CurvePoint> ConnectCurveQE,
+                                                   out List<IStation.Model.CurvePoint> ConnectCurveQP))
+
+            {
+                chartMultiCurveParallelCtrl1.CalcWorkPointByQ(workQ);
+                MessageBox.Show("杩欎簺娉典笉閫傚悎骞惰仈");
+                return;
+            }
+
+            var curveExpressQH = new Model.CurveExpress(ConnectCurveQH);
+            var curveExpressQE = new Model.CurveExpress(ConnectCurveQE);
+            var curveExpressQP = new Model.CurveExpress(ConnectCurveQP);
+            chartMultiCurveParallelCtrl1.AddCurve(-1, "骞惰仈鏇茬嚎", curveExpressQH, curveExpressQE, curveExpressQP, System.Drawing.Color.Black);
+            chartMultiCurveParallelCtrl1.LineVisible = true;
+            chartMultiCurveParallelCtrl1.CalcWorkPointByQ(workQ);
+        }
+
+    }
+}
\ No newline at end of file
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ParallelCurveViewDlg.resx b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ParallelCurveViewDlg.resx
new file mode 100644
index 0000000..61bc649
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ParallelCurveViewDlg.resx
@@ -0,0 +1,123 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="$this.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+</root>
\ No newline at end of file
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ScheduleAnalyPage.Designer.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ScheduleAnalyPage.Designer.cs
new file mode 100644
index 0000000..06fa17b
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ScheduleAnalyPage.Designer.cs
@@ -0,0 +1,584 @@
+锘縩amespace IStation.WinFrmUI.Schedule
+{
+    partial class ScheduleAnalyPage
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            components = new System.ComponentModel.Container();
+            DevExpress.XtraEditors.Controls.EditorButtonImageOptions editorButtonImageOptions1 = new DevExpress.XtraEditors.Controls.EditorButtonImageOptions();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ScheduleAnalyPage));
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject1 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject2 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject3 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject4 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.XtraGrid.GridLevelNode gridLevelNode1 = new DevExpress.XtraGrid.GridLevelNode();
+            gridView2 = new DevExpress.XtraGrid.Views.Grid.GridView();
+            colPumpID = new DevExpress.XtraGrid.Columns.GridColumn();
+            colMachineID = new DevExpress.XtraGrid.Columns.GridColumn();
+            colMachineName = new DevExpress.XtraGrid.Columns.GridColumn();
+            colIsFrequency = new DevExpress.XtraGrid.Columns.GridColumn();
+            colWorkPointQ = new DevExpress.XtraGrid.Columns.GridColumn();
+            colWorkPointH = new DevExpress.XtraGrid.Columns.GridColumn();
+            colWorkPointE = new DevExpress.XtraGrid.Columns.GridColumn();
+            colWorkPointP = new DevExpress.XtraGrid.Columns.GridColumn();
+            colIsCurveExtend = new DevExpress.XtraGrid.Columns.GridColumn();
+            colFrequence = new DevExpress.XtraGrid.Columns.GridColumn();
+            colSpeed = new DevExpress.XtraGrid.Columns.GridColumn();
+            colPumpCurve = new DevExpress.XtraGrid.Columns.GridColumn();
+            repositoryItemButtonEditCurve = new DevExpress.XtraEditors.Repository.RepositoryItemButtonEdit();
+            gridControl1 = new DevExpress.XtraGrid.GridControl();
+            currentViewModelBindingSource = new System.Windows.Forms.BindingSource(components);
+            gridView1 = new DevExpress.XtraGrid.Views.Grid.GridView();
+            colCaptain = new DevExpress.XtraGrid.Columns.GridColumn();
+            colID = new DevExpress.XtraGrid.Columns.GridColumn();
+            colTotalWrkQ = new DevExpress.XtraGrid.Columns.GridColumn();
+            colTotalWrkH = new DevExpress.XtraGrid.Columns.GridColumn();
+            colTotalWrkE = new DevExpress.XtraGrid.Columns.GridColumn();
+            colTotalWrkP = new DevExpress.XtraGrid.Columns.GridColumn();
+            colUWP = new DevExpress.XtraGrid.Columns.GridColumn();
+            colWP = new DevExpress.XtraGrid.Columns.GridColumn();
+            colRunNumber = new DevExpress.XtraGrid.Columns.GridColumn();
+            colSpanQ = new DevExpress.XtraGrid.Columns.GridColumn();
+            colResultStatus = new DevExpress.XtraGrid.Columns.GridColumn();
+            colResultStatusInfo = new DevExpress.XtraGrid.Columns.GridColumn();
+            colItemsParas = new DevExpress.XtraGrid.Columns.GridColumn();
+            colParallelCurve = new DevExpress.XtraGrid.Columns.GridColumn();
+            ribbonControl1 = new DevExpress.XtraBars.Ribbon.RibbonControl();
+            barBtnTargetH = new DevExpress.XtraBars.BarEditItem();
+            repositoryItemSpinEditH = new DevExpress.XtraEditors.Repository.RepositoryItemSpinEdit();
+            barBtnSetPumpRunConfig = new DevExpress.XtraBars.BarButtonItem();
+            barBtnDispatchAnaly = new DevExpress.XtraBars.BarButtonItem();
+            barBtnTargetQ = new DevExpress.XtraBars.BarEditItem();
+            repositoryItemSpinEditQ = new DevExpress.XtraEditors.Repository.RepositoryItemSpinEdit();
+            ribbonPage1 = new DevExpress.XtraBars.Ribbon.RibbonPage();
+            ribbonPageGroup1 = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
+            ribbonPageGroup3 = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
+            dockManager1 = new DevExpress.XtraBars.Docking.DockManager(components);
+            dockLeftPanel = new DevExpress.XtraBars.Docking.DockPanel();
+            dockPanel1_Container = new DevExpress.XtraBars.Docking.ControlContainer();
+            stationListCtrl1 = new Basic.StationListCtrl();
+            barStaticItem1 = new DevExpress.XtraBars.BarStaticItem();
+            ((System.ComponentModel.ISupportInitialize)gridView2).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)repositoryItemButtonEditCurve).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)gridControl1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)currentViewModelBindingSource).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)gridView1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)ribbonControl1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)repositoryItemSpinEditH).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)repositoryItemSpinEditQ).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)dockManager1).BeginInit();
+            dockLeftPanel.SuspendLayout();
+            dockPanel1_Container.SuspendLayout();
+            SuspendLayout();
+            // 
+            // gridView2
+            // 
+            gridView2.Columns.AddRange(new DevExpress.XtraGrid.Columns.GridColumn[] { colPumpID, colMachineID, colMachineName, colIsFrequency, colWorkPointQ, colWorkPointH, colWorkPointE, colWorkPointP, colIsCurveExtend, colFrequence, colSpeed, colPumpCurve });
+            gridView2.DetailHeight = 450;
+            gridView2.GridControl = gridControl1;
+            gridView2.Name = "gridView2";
+            gridView2.OptionsEditForm.PopupEditFormWidth = 640;
+            // 
+            // colPumpID
+            // 
+            colPumpID.FieldName = "PumpID";
+            colPumpID.MinWidth = 23;
+            colPumpID.Name = "colPumpID";
+            colPumpID.Width = 86;
+            // 
+            // colMachineID
+            // 
+            colMachineID.FieldName = "MachineID";
+            colMachineID.MinWidth = 23;
+            colMachineID.Name = "colMachineID";
+            colMachineID.Width = 86;
+            // 
+            // colMachineName
+            // 
+            colMachineName.Caption = "鏈烘车";
+            colMachineName.FieldName = "MachineName";
+            colMachineName.MinWidth = 23;
+            colMachineName.Name = "colMachineName";
+            colMachineName.Visible = true;
+            colMachineName.VisibleIndex = 0;
+            colMachineName.Width = 86;
+            // 
+            // colIsFrequency
+            // 
+            colIsFrequency.Caption = "鏄惁鍙橀";
+            colIsFrequency.FieldName = "IsFrequency";
+            colIsFrequency.MinWidth = 23;
+            colIsFrequency.Name = "colIsFrequency";
+            colIsFrequency.Visible = true;
+            colIsFrequency.VisibleIndex = 1;
+            colIsFrequency.Width = 86;
+            // 
+            // colWorkPointQ
+            // 
+            colWorkPointQ.Caption = "娴侀噺";
+            colWorkPointQ.FieldName = "WorkPointQ";
+            colWorkPointQ.MinWidth = 23;
+            colWorkPointQ.Name = "colWorkPointQ";
+            colWorkPointQ.Visible = true;
+            colWorkPointQ.VisibleIndex = 2;
+            colWorkPointQ.Width = 86;
+            // 
+            // colWorkPointH
+            // 
+            colWorkPointH.Caption = "鎵▼";
+            colWorkPointH.FieldName = "WorkPointH";
+            colWorkPointH.MinWidth = 23;
+            colWorkPointH.Name = "colWorkPointH";
+            colWorkPointH.Visible = true;
+            colWorkPointH.VisibleIndex = 3;
+            colWorkPointH.Width = 86;
+            // 
+            // colWorkPointE
+            // 
+            colWorkPointE.Caption = "鏁堢巼";
+            colWorkPointE.FieldName = "WorkPointE";
+            colWorkPointE.MinWidth = 23;
+            colWorkPointE.Name = "colWorkPointE";
+            colWorkPointE.Visible = true;
+            colWorkPointE.VisibleIndex = 4;
+            colWorkPointE.Width = 86;
+            // 
+            // colWorkPointP
+            // 
+            colWorkPointP.Caption = "鍔熺巼";
+            colWorkPointP.FieldName = "WorkPointP";
+            colWorkPointP.MinWidth = 23;
+            colWorkPointP.Name = "colWorkPointP";
+            colWorkPointP.Visible = true;
+            colWorkPointP.VisibleIndex = 5;
+            colWorkPointP.Width = 86;
+            // 
+            // colIsCurveExtend
+            // 
+            colIsCurveExtend.Caption = "鏄惁寤堕暱鏇茬嚎";
+            colIsCurveExtend.FieldName = "IsCurveExtend";
+            colIsCurveExtend.MinWidth = 23;
+            colIsCurveExtend.Name = "colIsCurveExtend";
+            colIsCurveExtend.Visible = true;
+            colIsCurveExtend.VisibleIndex = 6;
+            colIsCurveExtend.Width = 86;
+            // 
+            // colFrequence
+            // 
+            colFrequence.Caption = "棰戠巼";
+            colFrequence.FieldName = "Frequence";
+            colFrequence.MinWidth = 23;
+            colFrequence.Name = "colFrequence";
+            colFrequence.Visible = true;
+            colFrequence.VisibleIndex = 7;
+            colFrequence.Width = 86;
+            // 
+            // colSpeed
+            // 
+            colSpeed.Caption = "杞��";
+            colSpeed.FieldName = "Speed";
+            colSpeed.MinWidth = 23;
+            colSpeed.Name = "colSpeed";
+            colSpeed.Visible = true;
+            colSpeed.VisibleIndex = 8;
+            colSpeed.Width = 86;
+            // 
+            // colPumpCurve
+            // 
+            colPumpCurve.Caption = "鏇茬嚎";
+            colPumpCurve.ColumnEdit = repositoryItemButtonEditCurve;
+            colPumpCurve.MaxWidth = 46;
+            colPumpCurve.MinWidth = 46;
+            colPumpCurve.Name = "colPumpCurve";
+            colPumpCurve.Width = 46;
+            // 
+            // repositoryItemButtonEditCurve
+            // 
+            repositoryItemButtonEditCurve.AutoHeight = false;
+            editorButtonImageOptions1.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("editorButtonImageOptions1.SvgImage");
+            editorButtonImageOptions1.SvgImageSize = new Size(20, 20);
+            repositoryItemButtonEditCurve.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Glyph, "", -1, true, true, false, editorButtonImageOptions1, new DevExpress.Utils.KeyShortcut(System.Windows.Forms.Keys.None), serializableAppearanceObject1, serializableAppearanceObject2, serializableAppearanceObject3, serializableAppearanceObject4, "鏇茬嚎", null, null, DevExpress.Utils.ToolTipAnchor.Default) });
+            repositoryItemButtonEditCurve.Name = "repositoryItemButtonEditCurve";
+            repositoryItemButtonEditCurve.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.HideTextEditor;
+            // 
+            // gridControl1
+            // 
+            gridControl1.DataSource = currentViewModelBindingSource;
+            gridControl1.Dock = System.Windows.Forms.DockStyle.Fill;
+            gridControl1.EmbeddedNavigator.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+            gridLevelNode1.LevelTemplate = gridView2;
+            gridLevelNode1.RelationName = "Items";
+            gridControl1.LevelTree.Nodes.AddRange(new DevExpress.XtraGrid.GridLevelNode[] { gridLevelNode1 });
+            gridControl1.Location = new Point(250, 128);
+            gridControl1.MainView = gridView1;
+            gridControl1.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+            gridControl1.MenuManager = ribbonControl1;
+            gridControl1.Name = "gridControl1";
+            gridControl1.RepositoryItems.AddRange(new DevExpress.XtraEditors.Repository.RepositoryItem[] { repositoryItemButtonEditCurve });
+            gridControl1.Size = new Size(630, 601);
+            gridControl1.TabIndex = 5;
+            gridControl1.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] { gridView1, gridView2 });
+            // 
+            // gridView1
+            // 
+            gridView1.Columns.AddRange(new DevExpress.XtraGrid.Columns.GridColumn[] { colCaptain, colID, colTotalWrkQ, colTotalWrkH, colTotalWrkE, colTotalWrkP, colUWP, colWP, colRunNumber, colSpanQ, colResultStatus, colResultStatusInfo, colItemsParas, colParallelCurve });
+            gridView1.DetailHeight = 450;
+            gridView1.GridControl = gridControl1;
+            gridView1.Name = "gridView1";
+            gridView1.OptionsEditForm.PopupEditFormWidth = 640;
+            gridView1.ViewCaption = "娉佃繍琛岃缁�";
+            gridView1.RowCellClick += gridView1_RowCellClick;
+            // 
+            // colCaptain
+            // 
+            colCaptain.Caption = "寮�娉垫儏鍐�";
+            colCaptain.FieldName = "Captain";
+            colCaptain.MinWidth = 23;
+            colCaptain.Name = "colCaptain";
+            colCaptain.Visible = true;
+            colCaptain.VisibleIndex = 0;
+            colCaptain.Width = 86;
+            // 
+            // colID
+            // 
+            colID.FieldName = "ID";
+            colID.MinWidth = 23;
+            colID.Name = "colID";
+            colID.Width = 86;
+            // 
+            // colTotalWrkQ
+            // 
+            colTotalWrkQ.Caption = "娴侀噺";
+            colTotalWrkQ.FieldName = "TotalWrkQ";
+            colTotalWrkQ.MinWidth = 23;
+            colTotalWrkQ.Name = "colTotalWrkQ";
+            colTotalWrkQ.Visible = true;
+            colTotalWrkQ.VisibleIndex = 1;
+            colTotalWrkQ.Width = 86;
+            // 
+            // colTotalWrkH
+            // 
+            colTotalWrkH.Caption = "鎵▼";
+            colTotalWrkH.FieldName = "TotalWrkH";
+            colTotalWrkH.MinWidth = 23;
+            colTotalWrkH.Name = "colTotalWrkH";
+            colTotalWrkH.Visible = true;
+            colTotalWrkH.VisibleIndex = 2;
+            colTotalWrkH.Width = 86;
+            // 
+            // colTotalWrkE
+            // 
+            colTotalWrkE.Caption = "鏁堢巼";
+            colTotalWrkE.FieldName = "TotalWrkE";
+            colTotalWrkE.MinWidth = 23;
+            colTotalWrkE.Name = "colTotalWrkE";
+            colTotalWrkE.Visible = true;
+            colTotalWrkE.VisibleIndex = 3;
+            colTotalWrkE.Width = 86;
+            // 
+            // colTotalWrkP
+            // 
+            colTotalWrkP.Caption = "鍔熺巼";
+            colTotalWrkP.FieldName = "TotalWrkP";
+            colTotalWrkP.MinWidth = 23;
+            colTotalWrkP.Name = "colTotalWrkP";
+            colTotalWrkP.Visible = true;
+            colTotalWrkP.VisibleIndex = 4;
+            colTotalWrkP.Width = 86;
+            // 
+            // colUWP
+            // 
+            colUWP.Caption = "鍗冨惃姘磋兘鑰�";
+            colUWP.FieldName = "UWP";
+            colUWP.MinWidth = 23;
+            colUWP.Name = "colUWP";
+            colUWP.Visible = true;
+            colUWP.VisibleIndex = 5;
+            colUWP.Width = 86;
+            // 
+            // colWP
+            // 
+            colWP.Caption = "鑳借��";
+            colWP.FieldName = "WP";
+            colWP.MinWidth = 23;
+            colWP.Name = "colWP";
+            colWP.Visible = true;
+            colWP.VisibleIndex = 6;
+            colWP.Width = 86;
+            // 
+            // colRunNumber
+            // 
+            colRunNumber.FieldName = "RunNumber";
+            colRunNumber.MinWidth = 23;
+            colRunNumber.Name = "colRunNumber";
+            colRunNumber.Width = 86;
+            // 
+            // colSpanQ
+            // 
+            colSpanQ.FieldName = "SpanQ";
+            colSpanQ.MinWidth = 23;
+            colSpanQ.Name = "colSpanQ";
+            colSpanQ.Width = 86;
+            // 
+            // colResultStatus
+            // 
+            colResultStatus.FieldName = "ResultStatus";
+            colResultStatus.MinWidth = 23;
+            colResultStatus.Name = "colResultStatus";
+            colResultStatus.Width = 86;
+            // 
+            // colResultStatusInfo
+            // 
+            colResultStatusInfo.FieldName = "ResultStatusInfo";
+            colResultStatusInfo.MinWidth = 23;
+            colResultStatusInfo.Name = "colResultStatusInfo";
+            colResultStatusInfo.Width = 86;
+            // 
+            // colItemsParas
+            // 
+            colItemsParas.FieldName = "ItemsParas";
+            colItemsParas.MinWidth = 23;
+            colItemsParas.Name = "colItemsParas";
+            colItemsParas.Width = 86;
+            // 
+            // colParallelCurve
+            // 
+            colParallelCurve.Caption = "鏇茬嚎";
+            colParallelCurve.ColumnEdit = repositoryItemButtonEditCurve;
+            colParallelCurve.ImageOptions.SvgImageSize = new Size(20, 20);
+            colParallelCurve.MaxWidth = 46;
+            colParallelCurve.MinWidth = 46;
+            colParallelCurve.Name = "colParallelCurve";
+            colParallelCurve.Visible = true;
+            colParallelCurve.VisibleIndex = 7;
+            colParallelCurve.Width = 46;
+            // 
+            // ribbonControl1
+            // 
+            ribbonControl1.DrawGroupsBorderMode = DevExpress.Utils.DefaultBoolean.False;
+            ribbonControl1.EmptyAreaImageOptions.ImagePadding = new System.Windows.Forms.Padding(34, 38, 34, 38);
+            ribbonControl1.ExpandCollapseItem.Id = 0;
+            ribbonControl1.ItemPanelStyle = DevExpress.XtraBars.Ribbon.RibbonItemPanelStyle.Classic;
+            ribbonControl1.Items.AddRange(new DevExpress.XtraBars.BarItem[] { ribbonControl1.ExpandCollapseItem, barBtnTargetH, barBtnSetPumpRunConfig, barBtnDispatchAnaly, barBtnTargetQ });
+            ribbonControl1.Location = new Point(0, 0);
+            ribbonControl1.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+            ribbonControl1.MaxItemId = 26;
+            ribbonControl1.Name = "ribbonControl1";
+            ribbonControl1.OptionsMenuMinWidth = 377;
+            ribbonControl1.Pages.AddRange(new DevExpress.XtraBars.Ribbon.RibbonPage[] { ribbonPage1 });
+            ribbonControl1.RepositoryItems.AddRange(new DevExpress.XtraEditors.Repository.RepositoryItem[] { repositoryItemSpinEditQ, repositoryItemSpinEditH });
+            ribbonControl1.ShowApplicationButton = DevExpress.Utils.DefaultBoolean.False;
+            ribbonControl1.ShowExpandCollapseButton = DevExpress.Utils.DefaultBoolean.False;
+            ribbonControl1.ShowPageHeadersMode = DevExpress.XtraBars.Ribbon.ShowPageHeadersMode.Hide;
+            ribbonControl1.Size = new Size(880, 128);
+            ribbonControl1.ToolbarLocation = DevExpress.XtraBars.Ribbon.RibbonQuickAccessToolbarLocation.Hidden;
+            // 
+            // barBtnTargetH
+            // 
+            barBtnTargetH.Caption = "鐩爣鎵▼:";
+            barBtnTargetH.Edit = repositoryItemSpinEditH;
+            barBtnTargetH.EditWidth = 100;
+            barBtnTargetH.Id = 15;
+            barBtnTargetH.Name = "barBtnTargetH";
+            // 
+            // repositoryItemSpinEditH
+            // 
+            repositoryItemSpinEditH.AutoHeight = false;
+            repositoryItemSpinEditH.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Combo) });
+            repositoryItemSpinEditH.Name = "repositoryItemSpinEditH";
+            // 
+            // barBtnSetPumpRunConfig
+            // 
+            barBtnSetPumpRunConfig.Caption = "璋冨害閰嶇疆";
+            barBtnSetPumpRunConfig.Id = 16;
+            barBtnSetPumpRunConfig.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnSetPumpRunConfig.ImageOptions.SvgImage");
+            barBtnSetPumpRunConfig.Name = "barBtnSetPumpRunConfig";
+            barBtnSetPumpRunConfig.ItemClick += barBtnSetPumpRunConfig_ItemClick;
+            // 
+            // barBtnDispatchAnaly
+            // 
+            barBtnDispatchAnaly.Caption = "璋冨害鍒嗘瀽";
+            barBtnDispatchAnaly.Id = 17;
+            barBtnDispatchAnaly.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnDispatchAnaly.ImageOptions.SvgImage");
+            barBtnDispatchAnaly.Name = "barBtnDispatchAnaly";
+            barBtnDispatchAnaly.ItemClick += barBtnDispatchAnaly_ItemClick;
+            // 
+            // barBtnTargetQ
+            // 
+            barBtnTargetQ.Caption = "鐩爣娴侀噺:";
+            barBtnTargetQ.Edit = repositoryItemSpinEditQ;
+            barBtnTargetQ.EditWidth = 100;
+            barBtnTargetQ.Id = 18;
+            barBtnTargetQ.Name = "barBtnTargetQ";
+            // 
+            // repositoryItemSpinEditQ
+            // 
+            repositoryItemSpinEditQ.AutoHeight = false;
+            repositoryItemSpinEditQ.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Combo) });
+            repositoryItemSpinEditQ.Name = "repositoryItemSpinEditQ";
+            // 
+            // ribbonPage1
+            // 
+            ribbonPage1.Groups.AddRange(new DevExpress.XtraBars.Ribbon.RibbonPageGroup[] { ribbonPageGroup1, ribbonPageGroup3 });
+            ribbonPage1.Name = "ribbonPage1";
+            ribbonPage1.Text = "鍩虹鎿嶄綔";
+            // 
+            // ribbonPageGroup1
+            // 
+            ribbonPageGroup1.ItemLinks.Add(barBtnTargetQ);
+            ribbonPageGroup1.ItemLinks.Add(barBtnTargetH);
+            ribbonPageGroup1.Name = "ribbonPageGroup1";
+            ribbonPageGroup1.Text = "閰嶇疆";
+            // 
+            // ribbonPageGroup3
+            // 
+            ribbonPageGroup3.ItemLinks.Add(barBtnSetPumpRunConfig, true);
+            ribbonPageGroup3.ItemLinks.Add(barBtnDispatchAnaly);
+            ribbonPageGroup3.Name = "ribbonPageGroup3";
+            ribbonPageGroup3.Text = "ribbonPageGroup3";
+            // 
+            // dockManager1
+            // 
+            dockManager1.Form = this;
+            dockManager1.RootPanels.AddRange(new DevExpress.XtraBars.Docking.DockPanel[] { dockLeftPanel });
+            dockManager1.Style = DevExpress.XtraBars.Docking2010.Views.DockingViewStyle.Light;
+            dockManager1.TopZIndexControls.AddRange(new string[] { "DevExpress.XtraBars.BarDockControl", "DevExpress.XtraBars.StandaloneBarDockControl", "System.Windows.Forms.MenuStrip", "System.Windows.Forms.StatusStrip", "System.Windows.Forms.StatusBar", "DevExpress.XtraBars.Ribbon.RibbonStatusBar", "DevExpress.XtraBars.Ribbon.RibbonControl", "DevExpress.XtraBars.Navigation.OfficeNavigationBar", "DevExpress.XtraBars.Navigation.TileNavPane", "DevExpress.XtraBars.TabFormControl", "DevExpress.XtraBars.FluentDesignSystem.FluentDesignFormControl", "DevExpress.XtraBars.ToolbarForm.ToolbarFormControl" });
+            // 
+            // dockLeftPanel
+            // 
+            dockLeftPanel.Controls.Add(dockPanel1_Container);
+            dockLeftPanel.Dock = DevExpress.XtraBars.Docking.DockingStyle.Left;
+            dockLeftPanel.ID = new Guid("fb87a574-0a5b-48af-8cc2-555feb8cde7a");
+            dockLeftPanel.Location = new Point(0, 128);
+            dockLeftPanel.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+            dockLeftPanel.Name = "dockLeftPanel";
+            dockLeftPanel.Options.ShowCloseButton = false;
+            dockLeftPanel.OriginalSize = new Size(250, 200);
+            dockLeftPanel.Size = new Size(250, 601);
+            dockLeftPanel.Text = "娉电珯鍒楄〃";
+            // 
+            // dockPanel1_Container
+            // 
+            dockPanel1_Container.Controls.Add(stationListCtrl1);
+            dockPanel1_Container.Location = new Point(0, 28);
+            dockPanel1_Container.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+            dockPanel1_Container.Name = "dockPanel1_Container";
+            dockPanel1_Container.Size = new Size(249, 573);
+            dockPanel1_Container.TabIndex = 0;
+            // 
+            // stationListCtrl1
+            // 
+            stationListCtrl1.Appearance.BackColor = SystemColors.Control;
+            stationListCtrl1.Appearance.Options.UseBackColor = true;
+            stationListCtrl1.Dock = System.Windows.Forms.DockStyle.Fill;
+            stationListCtrl1.Location = new Point(0, 0);
+            stationListCtrl1.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+            stationListCtrl1.Name = "stationListCtrl1";
+            stationListCtrl1.Size = new Size(249, 573);
+            stationListCtrl1.TabIndex = 0;
+            // 
+            // barStaticItem1
+            // 
+            barStaticItem1.Caption = "barStaticItem1";
+            barStaticItem1.Id = 12;
+            barStaticItem1.Name = "barStaticItem1";
+            // 
+            // ScheduleAnalyPage
+            // 
+            AutoScaleDimensions = new SizeF(8F, 18F);
+            AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            Controls.Add(gridControl1);
+            Controls.Add(dockLeftPanel);
+            Controls.Add(ribbonControl1);
+            Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+            Name = "ScheduleAnalyPage";
+            Size = new Size(880, 729);
+            ((System.ComponentModel.ISupportInitialize)gridView2).EndInit();
+            ((System.ComponentModel.ISupportInitialize)repositoryItemButtonEditCurve).EndInit();
+            ((System.ComponentModel.ISupportInitialize)gridControl1).EndInit();
+            ((System.ComponentModel.ISupportInitialize)currentViewModelBindingSource).EndInit();
+            ((System.ComponentModel.ISupportInitialize)gridView1).EndInit();
+            ((System.ComponentModel.ISupportInitialize)ribbonControl1).EndInit();
+            ((System.ComponentModel.ISupportInitialize)repositoryItemSpinEditH).EndInit();
+            ((System.ComponentModel.ISupportInitialize)repositoryItemSpinEditQ).EndInit();
+            ((System.ComponentModel.ISupportInitialize)dockManager1).EndInit();
+            dockLeftPanel.ResumeLayout(false);
+            dockPanel1_Container.ResumeLayout(false);
+            ResumeLayout(false);
+            PerformLayout();
+        }
+
+        #endregion
+
+        private DevExpress.XtraBars.Ribbon.RibbonControl ribbonControl1;
+        private DevExpress.XtraBars.Ribbon.RibbonPage ribbonPage1;
+        private DevExpress.XtraBars.Ribbon.RibbonPageGroup ribbonPageGroup1;
+        private DevExpress.XtraBars.Docking.DockManager dockManager1;
+        private DevExpress.XtraBars.Docking.DockPanel dockLeftPanel;
+        private DevExpress.XtraBars.Docking.ControlContainer dockPanel1_Container; 
+        private DevExpress.XtraBars.BarEditItem barBtnTargetH;
+        private DevExpress.XtraBars.BarStaticItem barStaticItem1;
+        private DevExpress.XtraBars.BarButtonItem barBtnSetPumpRunConfig;
+        private DevExpress.XtraBars.BarButtonItem barBtnDispatchAnaly;
+        private DevExpress.XtraBars.Ribbon.RibbonPageGroup ribbonPageGroup3;
+        private DevExpress.XtraBars.BarEditItem barBtnTargetQ;
+        private System.Windows.Forms.BindingSource currentViewModelBindingSource;
+        private DevExpress.XtraGrid.GridControl gridControl1;
+        private DevExpress.XtraGrid.Views.Grid.GridView gridView1;
+        private DevExpress.XtraGrid.Columns.GridColumn colCaptain;
+        private DevExpress.XtraGrid.Columns.GridColumn colID;
+        private DevExpress.XtraGrid.Columns.GridColumn colTotalWrkQ;
+        private DevExpress.XtraGrid.Columns.GridColumn colTotalWrkH;
+        private DevExpress.XtraGrid.Columns.GridColumn colTotalWrkE;
+        private DevExpress.XtraGrid.Columns.GridColumn colTotalWrkP;
+        private DevExpress.XtraGrid.Columns.GridColumn colUWP;
+        private DevExpress.XtraGrid.Columns.GridColumn colWP;
+        private DevExpress.XtraGrid.Columns.GridColumn colRunNumber;
+        private DevExpress.XtraGrid.Columns.GridColumn colSpanQ;
+        private DevExpress.XtraGrid.Columns.GridColumn colResultStatus;
+        private DevExpress.XtraGrid.Columns.GridColumn colResultStatusInfo;
+        private DevExpress.XtraGrid.Columns.GridColumn colItemsParas;
+        private DevExpress.XtraGrid.Views.Grid.GridView gridView2;
+        private DevExpress.XtraGrid.Columns.GridColumn colPumpID;
+        private DevExpress.XtraGrid.Columns.GridColumn colMachineID;
+        private DevExpress.XtraGrid.Columns.GridColumn colMachineName;
+        private DevExpress.XtraGrid.Columns.GridColumn colIsFrequency;
+        private DevExpress.XtraGrid.Columns.GridColumn colWorkPointQ;
+        private DevExpress.XtraGrid.Columns.GridColumn colWorkPointH;
+        private DevExpress.XtraGrid.Columns.GridColumn colWorkPointE;
+        private DevExpress.XtraGrid.Columns.GridColumn colWorkPointP;
+        private DevExpress.XtraGrid.Columns.GridColumn colIsCurveExtend;
+        private DevExpress.XtraGrid.Columns.GridColumn colFrequence;
+        private DevExpress.XtraGrid.Columns.GridColumn colSpeed;
+        private DevExpress.XtraGrid.Columns.GridColumn colParallelCurve;
+        private DevExpress.XtraEditors.Repository.RepositoryItemButtonEdit repositoryItemButtonEditCurve;
+        private DevExpress.XtraGrid.Columns.GridColumn colPumpCurve;
+        private DevExpress.XtraEditors.Repository.RepositoryItemSpinEdit repositoryItemSpinEditH;
+        private DevExpress.XtraEditors.Repository.RepositoryItemSpinEdit repositoryItemSpinEditQ;
+        private Basic.StationListCtrl stationListCtrl1;
+    }
+}
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ScheduleAnalyPage.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ScheduleAnalyPage.cs
new file mode 100644
index 0000000..144009b
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ScheduleAnalyPage.cs
@@ -0,0 +1,290 @@
+锘縰sing DevExpress.XtraEditors;
+using System.Windows.Forms;
+
+namespace IStation.WinFrmUI.Schedule
+{
+    public partial class ScheduleAnalyPage : DocumentPage
+    {
+        public ScheduleAnalyPage()
+        {
+            InitializeComponent();
+            PageTitle.Caption = "浼樺寲璋冨害2";
+            gridView1.SetNormalView();
+            gridView1.RegistCustomDrawRowIndicator(40);
+            gridView1.OptionsView.ShowDetailButtons = true;
+            gridView1.OptionsDetail.ShowDetailTabs = false;
+            gridView2.SetNormalView();
+             
+            stationListCtrl1.FocusedChangedEvent += StationListCtrl1_FocusedChangedEvent;
+        }
+ 
+
+
+        public class CurrentViewModel   
+        { 
+
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public int ID { get; set; }
+            /// <summary>
+            /// 
+            /// </summary>
+            public double TotalWrkQ { get; set; }
+            /// <summary>
+            /// 
+            /// </summary>
+            public double TotalWrkH { get; set; }
+            /// <summary>
+            /// 
+            /// </summary>
+            public double TotalWrkE { get; set; }
+            /// <summary>
+            /// 
+            /// </summary>
+            public double TotalWrkP { get; set; }
+
+            /// <summary>
+            /// 鍗冨惃姘磋兘鑰�
+            /// </summary>
+            public double UWP { get; set; }
+
+            /// <summary>
+            /// 鑳借��
+            /// </summary>
+            public double WP { get; set; }
+
+            /// <summary>
+            /// 寮�娉垫暟閲�
+            /// </summary>
+            public int RunNumber
+            {
+                get
+                {
+                    if (Items == null)
+                        return 0;
+
+                    return Items.Count();
+                }
+                set => value = RunNumber;
+            }
+             
+            /// <summary>
+            /// 
+            /// </summary>
+            public List<AnaSchemeItem> Items { get; set; }
+             
+            public string Captain { get; set; }
+        }
+
+
+
+        private Model.Station _station = null;
+        private List<Model.PumpModel> _dispatchPumps = null; 
+        private List<Model.PumpCurve> _allPumpCurves = null;
+        private List<CurrentViewModel> _allBindingList = null;
+
+        private double _targetQ, _targetH;
+        private Service.AnalysisParameter _serviceAnalysisParameter = new Service.AnalysisParameter();
+
+        /// <summary>
+        /// 鍒濆鍖栨暟鎹�
+        /// </summary>
+        public override void InitialDataSource()
+        {
+            _station = null;
+            _dispatchPumps = new List<Model.PumpModel>();
+            _allPumpCurves = new BLL.PumpCurve().GetAll();
+            _allPumpCurves = new BLL.PumpCurve().GetAll();
+            stationListCtrl1.SetBindingData();
+        }
+
+
+        //娉电珯鍒楄〃鍙樻崲
+        private void StationListCtrl1_FocusedChangedEvent(Model.Station obj)
+        {
+            _station = obj;
+            _dispatchPumps = new List<Model.PumpModel>();
+            if (_station != null)
+            {
+                var pumps = new BLL.Equipment().GetPumpModelListByBelongTypeAndBelongID(IStation.ObjectType.Station, _station.ID);
+                if (pumps != null && pumps.Any())
+                {
+                    var bll = new BLL.PumpCurveMapping();
+                    foreach (var pump in pumps)
+                    {
+                        Model.PumpModel dispatchPump = null;
+                        var mapping = bll.GetWorkCurveByPumpID(pump.ID);
+                        if (mapping != null)
+                        {
+                            var pumpCurve = _allPumpCurves?.Find(x => x.ID == mapping?.CurveID);
+                            if (pumpCurve==null)
+                            {
+                                TipFormHelper.ShowError($"{pump.Name}:娌℃湁鏇茬嚎锛�");
+                            } 
+                            dispatchPump = new Model.PumpModel(pump, pumpCurve);
+                        }
+                        else
+                        {
+                            dispatchPump = new Model.PumpModel(pump, null);
+                        }
+                        _dispatchPumps.Add(dispatchPump);
+                    }
+                }
+            }
+        }
+
+        //娉佃繍琛岄厤缃�
+        private void barBtnSetPumpRunConfig_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
+        {
+            if (_station == null)
+                return;
+            var dlg = new SetPumpRunStatusDlg(); 
+            dlg.SetBindingData(_dispatchPumps);
+            if (dlg.ShowDialog() != System.Windows.Forms.DialogResult.OK)
+                return; 
+        }
+
+         
+        //璋冨害鍒嗘瀽
+        private void barBtnDispatchAnaly_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
+        {
+            _allBindingList = new List<CurrentViewModel>();
+            currentViewModelBindingSource.DataSource = _allBindingList;
+            try
+            {
+                
+                ScheduleAnaly();
+                WaitFrmHelper.HideWaitForm();
+            }
+            catch (Exception ex)
+            {
+
+                throw ex;
+            }
+            finally
+            {
+                WaitFrmHelper.HideWaitForm(); 
+            }
+
+        }
+
+        /// <summary>
+        /// 璋冨害鍒嗘瀽
+        /// </summary>
+        private void ScheduleAnaly()
+        {
+            _allBindingList = new List<CurrentViewModel>();
+            currentViewModelBindingSource.DataSource = _allBindingList;
+            if (_station == null) return;
+            if (_dispatchPumps == null || !_dispatchPumps.Any()) return;
+
+            WaitFrmHelper.ShowWaitForm("璁$畻涓�...");
+            if (File.Exists(ConfigHelper.AnalysisDbFilePath))
+            {
+                File.Delete(ConfigHelper.AnalysisDbFilePath);
+            }
+
+            var all_pump_list = _dispatchPumps;
+            var flags = all_pump_list.Select(x => x.Flag);
+            if (flags.Distinct().Count() != flags.Count())
+            {
+                TipFormHelper.ShowError("璇风‘瀹氭満缁勭殑鎺掑簭鐮佹槸鍞竴鐨�");
+                return;
+            }
+            IStation.Service.AnalysisParameter.RemoveDictCache();
+            var helperAnalysis = new IStation.Service.AnalysisHelper();
+            helperAnalysis.AnalysisPump(all_pump_list);
+            helperAnalysis.AnalysisParameter(all_pump_list);
+ 
+
+            _targetQ = Convert.ToDouble(barBtnTargetQ.EditValue);
+            _targetH = Convert.ToDouble(barBtnTargetH.EditValue);
+
+            var config = new Model.ScheduleConfig();
+            config.MinOpenCount = 1;
+            config.MaxOpenCount = all_pump_list.Count;
+            config.MustCloseFlagList = all_pump_list.Where(x => x.MachineRunStatus == Model.PumpModel.eMachineRunStatus.Close)
+                                                    .Select(x => x.Flag).ToList();
+
+            var helper = new Service.ScheduleHelper();   
+            helper.Initial(null, config);
+            var ana_combine_list = helper.GetAnaCombineList(all_pump_list, _targetQ, _targetH); 
+            if (ana_combine_list == null || ana_combine_list.Count() == 0)
+            {
+                TipFormHelper.ShowError("鏃犺绠楁柟妗�");
+                return;
+            }
+
+            var dict = _dispatchPumps.ToDictionary(x => x.Flag, y => y);
+            var bllPump = new BLL.Equipment();
+            foreach (var rhs in ana_combine_list)
+            {
+
+                var vm = new CurrentViewModel();
+                vm.TotalWrkQ = Math.Round(rhs.TotalFlow, 1);
+                vm.TotalWrkH = Math.Round(rhs.TotalHead, 1);
+                vm.TotalWrkE = Math.Round(rhs.TotalEfficiency, 1);
+                vm.TotalWrkP = Math.Round(rhs.TotalPower, 1);
+                vm.UWP = Math.Round(rhs.UWP, 1);
+                vm.WP = Math.Round(rhs.WP, 1);
+                vm.RunNumber = rhs.AnaFrePumps.Count;
+                vm.Items = new List<AnaSchemeItem>();
+
+                foreach (var item in rhs.AnaFrePumps)
+                {
+                    var pump = dict[item.Flag];
+                    var qh = pump.CurveQH;
+                    var qp = pump.CurveQP;
+                    var qe = pump.CurveQE;
+                    var sItem = new AnaSchemeItem();
+                    sItem.PumpCurveID = pump.Flag;
+                    sItem.WorkPointQ = Math.Round(item.Flow, 1);
+                    sItem.WorkPointH = Math.Round(item.Head, 1);
+                    sItem.WorkPointE = Math.Round(item.Eff, 1);
+                    sItem.WorkPointP = Math.Round(item.Power, 1);
+
+                    sItem.Frequence = item.Frequency;
+                    sItem.Speed = Math.Round(item.Speed, 1);
+                    sItem.MachineName = dict[item.Flag].Name;
+                    sItem.CurveInfoQH = Model.CurveCalcuHelper.CalculateSimilarQH(qh, 50, item.Frequency);
+                    sItem.CurveInfoQP = Model.CurveCalcuHelper.CalculateSimilarQP(qp, 50, item.Frequency);
+                    var similarQe = Model.CurveCalcuHelper.CalculateSimilarQP(qe, 50, item.Frequency);
+                    var eff = similarQe.GetFitPointY(item.Flow);
+                    vm.Items.Add(sItem);
+                }
+                var names = vm.Items.Select(x => x.MachineName);
+                 
+                vm.Captain = string.Join(",", names);
+                _allBindingList.Add(vm);
+            }
+            this.currentViewModelBindingSource.ResetBindings(false);
+        }
+
+
+
+
+        //鍗曞厓鏍肩偣鍑讳簨浠�
+        private void gridView1_RowCellClick(object sender, DevExpress.XtraGrid.Views.Grid.RowCellClickEventArgs e)
+        {
+            if (_allPumpCurves == null || !_allPumpCurves.Any())
+                return;
+
+            if (e.Column == colParallelCurve)
+            {
+                var row = gridView1.GetCurrentViewModel(_allBindingList);
+                if (row == null)
+                    return;
+
+                var dlg = new ParallelCurveViewDlg();
+                dlg.SetBindingData(row.TotalWrkQ, row.Items);
+                dlg.ShowDialog();
+            }
+        }
+
+  
+
+    
+    }
+}
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ScheduleAnalyPage.resx b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ScheduleAnalyPage.resx
new file mode 100644
index 0000000..b8cad7a
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ScheduleAnalyPage.resx
@@ -0,0 +1,209 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!--
+    Microsoft ResX Schema
+
+    Version 2.0
+
+    The primary goals of this format is to allow a simple XML format
+    that is mostly human readable. The generation and parsing of the
+    various data types are done through the TypeConverter classes
+    associated with the data types.
+
+    Example:
+
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+
+    There are any number of "resheader" rows that contain simple
+    name/value pairs.
+
+    Each data row contains a name, and value. The row also contains a
+    type or mimetype. Type corresponds to a .NET class that support
+    text/value conversion through the TypeConverter architecture.
+    Classes that don't support this are serialized and stored with the
+    mimetype set.
+
+    The mimetype is used for serialized objects, and tells the
+    ResXResourceReader how to depersist the object. This is currently not
+    extensible. For a given mimetype the value must be set accordingly:
+
+    Note - application/x-microsoft.net.object.binary.base64 is the format
+    that the ResXResourceWriter will generate, however the reader can
+    read any of the formats listed below.
+
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="DevExpress.Data.v23.2" name="DevExpress.Data.v23.2, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
+  <data name="editorButtonImageOptions1.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAHoGAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iQ3JlYXRlX1NjYXR0ZXJfQ2hhcnRfU21vb3RoX0xpbmVzIiBzdHlsZT0i
+        ZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAzMiAzMiI+DQogIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+
+        CgkuQmx1ZXtmaWxsOiMxMTc3RDc7fQoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQo8L3N0eWxlPg0KICA8
+        cGF0aCBkPSJNMywyNGMwLTMuNSwyLjQtNS42LDQuNi02LjZsMCwwYzIuMi0xLjEsNC4zLTEuMyw0LjQt
+        MS40bDAsMGMwLDAsMC45LTAuMSwyLjQtMC4zbDAsMCAgYzEuNS0wLjIsMy40LTAuNyw1LjMtMS40bDAs
+        MEMyMy41LDEyLjgsMjcsMTAuNCwyNyw2bDAsMGgyYzAsNS42LTQuNSw4LjctOC42LDEwLjJsMCwwYy00
+        LjIsMS42LTguMiwxLjgtOC4yLDEuOGwwLDAgIGMwLDAtMC40LDAuMS0xLjEsMC4ybDAsMGMtMC43LDAu
+        Mi0xLjYsMC41LTIuNSwwLjlsMCwwQzYuNiwyMC4xLDUsMjEuNSw1LDI0bDAsMEgzTDMsMjR6IiBjbGFz
+        cz0iQmx1ZSIgLz4NCiAgPHBhdGggZD0iTTE5LjksMjhMMTkuOSwyOGMwLjEsMCwwLjEsMCwwLjEsMGww
+        LDBoMGMwLDAsMC4xLDAsMC4xLDBsMCwwYzAsMC0wLjEsMC0wLjEsMGwwLDBDMjAsMjgsMTkuOSwyOCwx
+        OS45LDI4ICBMMTkuOSwyOHogTTIwLDI4QzE5LjksMjgsMTkuOSwyOCwyMCwyOEwyMCwyOEMxOS45LDI4
+        LDE5LjksMjgsMjAsMjhMMjAsMjhoLTAuM2wwLDBjLTIuMi0wLjEtMy45LTEuMi01LjEtMi43bDAsMCAg
+        Yy0xLjMtMS42LTItMy42LTIuNi01LjVsMCwwYy0xLTMuOS0xLTcuNy0xLTcuOGwwLDBjMCwwLDAtMC45
+        LTAuMi0ybDAsMGMtMC4yLTEuMS0wLjYtMi41LTEuMi0zLjJsMCwwQzkuMSw2LjMsOC43LDYsOCw2bDAs
+        MCAgQzcuMyw2LDYuOSw2LjMsNi40LDYuN2wwLDBDNiw3LjIsNS43LDgsNS41LDguOGwwLDBDNSwxMC40
+        LDUsMTIsNSwxMmwwLDBIM2MwLTAuMS0wLjEtNC4xLDEuOS02LjZsMCwwQzUuNiw0LjYsNi43LDQsOCw0
+        bDAsMCAgYzEuMywwLDIuNCwwLjYsMy4xLDEuNGwwLDBjMC43LDAuOCwxLjEsMS44LDEuNCwyLjhsMCww
+        QzEzLDEwLjEsMTMsMTEuOSwxMywxMmwwLDBjMCwwLDAsMiwwLjQsNC42bDAsMGMwLjQsMi42LDEuMyw1
+        LjYsMi43LDcuNCAgbDAsMGMxLDEuMiwyLjIsMiwzLjgsMmwwLDB2MGwwLDBsMCwwdjBjMi42LDAsNC4x
+        LTEuMyw1LjItM2wwLDBjMS4xLTEuNywxLjUtMy45LDEuNy01LjRsMCwwQzI3LDE2LjYsMjcsMTYsMjcs
+        MTZsMCwwaDIgIGMwLDAuMSwwLDIuOS0xLjEsNS44bDAsMGMtMSwyLjktMy40LDYuMS03LjgsNi4ybDAs
+        MGMwLDAsMC4xLDAsMC4xLDBsMCwwQzIwLjEsMjgsMjAuMSwyOCwyMCwyOEwyMCwyOEwyMCwyOEwyMCwy
+        OHogTTIwLjcsMjcuNyAgQzIwLjcsMjcuNywyMC43LDI3LjcsMjAuNywyNy43TDIwLjcsMjcuN2MwLjEt
+        MC4xLDAuMi0wLjIsMC4yLTAuM2wwLDBsMCwwQzIwLjksMjcuNSwyMC44LDI3LjYsMjAuNywyNy43TDIw
+        LjcsMjcuN3oiIGNsYXNzPSJZZWxsb3ciIC8+DQo8L3N2Zz4L
+</value>
+  </data>
+  <metadata name="currentViewModelBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>187, 17</value>
+  </metadata>
+  <data name="barBtnSetPumpRunConfig.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAPsDAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iX3gzM19fVHJhZmZpY19MaWdodHNfUmltbWVkIiBzdHlsZT0iZW5hYmxl
+        LWJhY2tncm91bmQ6bmV3IDAgMCAzMiAzMiI+DQogIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CgkuWWVs
+        bG93e2ZpbGw6I0ZGQjExNTt9CgkuUmVke2ZpbGw6I0QxMUMxQzt9CgkuR3JlZW57ZmlsbDojMDM5QzIz
+        O30KCS5CbGFja3tmaWxsOiM3MjcyNzI7fQo8L3N0eWxlPg0KICA8Y2lyY2xlIGN4PSI5IiBjeT0iOSIg
+        cj0iMyIgY2xhc3M9IkdyZWVuIiAvPg0KICA8Y2lyY2xlIGN4PSIyNSIgY3k9IjkiIHI9IjMiIGNsYXNz
+        PSJZZWxsb3ciIC8+DQogIDxjaXJjbGUgY3g9IjkiIGN5PSIyNSIgcj0iMyIgY2xhc3M9IlJlZCIgLz4N
+        CiAgPHBhdGggZD0iTTE1LDJIM0MyLjQsMiwyLDIuNCwyLDN2MTJjMCwwLjYsMC40LDEsMSwxaDEyYzAu
+        NiwwLDEtMC40LDEtMVYzQzE2LDIuNCwxNS42LDIsMTUsMnogTTksMTQgIGMtMi44LDAtNS0yLjItNS01
+        czIuMi01LDUtNXM1LDIuMiw1LDVTMTEuOCwxNCw5LDE0eiBNMzEsMkgxOWMtMC41LDAtMSwwLjUtMSwx
+        djEyYzAsMC41LDAuNSwxLDEsMWgxMmMwLjUsMCwxLTAuNSwxLTFWMyAgQzMyLDIuNSwzMS41LDIsMzEs
+        MnogTTI1LDE0Yy0yLjgsMC01LTIuMi01LTVzMi4yLTUsNS01czUsMi4yLDUsNVMyNy44LDE0LDI1LDE0
+        eiBNMTUsMThIM2MtMC41LDAtMSwwLjUtMSwxdjEyYzAsMC41LDAuNSwxLDEsMWgxMiAgYzAuNSwwLDEt
+        MC41LDEtMVYxOUMxNiwxOC41LDE1LjUsMTgsMTUsMTh6IE05LDMwYy0yLjgsMC01LTIuMi01LTVzMi4y
+        LTUsNS01czUsMi4yLDUsNVMxMS44LDMwLDksMzB6IiBjbGFzcz0iQmxhY2siIC8+DQo8L3N2Zz4L
+</value>
+  </data>
+  <data name="barBtnDispatchAnaly.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAALMDAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
+        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5H
+        cmVlbntmaWxsOiMwMzlDMjM7fQoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQoJLkJsYWNre2ZpbGw6Izcy
+        NzI3Mjt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5SZWR7ZmlsbDojRDExQzFDO30KCS5zdDB7b3Bh
+        Y2l0eTowLjc1O30KPC9zdHlsZT4NCiAgPGcgaWQ9IkNhbGN1bGF0b3IiPg0KICAgIDxwYXRoIGQ9Ik0y
+        OSwwSDE2djE0aDE0VjFDMzAsMC41LDI5LjUsMCwyOSwweiBNMjgsOEgxOFY2aDEwVjh6IiBjbGFzcz0i
+        QmxhY2siIC8+DQogICAgPHBhdGggZD0iTTAsMjljMCwwLjUsMC41LDEsMSwxaDEzVjE2SDBWMjl6IE0y
+        LjgsMjAuMmwxLjQtMS40TDcsMjEuNmwyLjgtMi44bDEuNCwxLjRMOC40LDIzbDIuOCwyLjhsLTEuNCwx
+        LjQgICBMNywyNC40bC0yLjgsMi44bC0xLjQtMS40TDUuNiwyM0wyLjgsMjAuMnoiIGNsYXNzPSJCbGFj
+        ayIgLz4NCiAgICA8cGF0aCBkPSJNMCwxdjEzaDE0VjBIMUMwLjUsMCwwLDAuNSwwLDF6IE0yLDZoNFYy
+        aDJ2NGg0djJIOHY0SDZWOEgyVjZ6IiBjbGFzcz0iQmxhY2siIC8+DQogICAgPHBhdGggZD0iTTE2LDE2
+        djE0aDEzYzAuNSwwLDEtMC41LDEtMVYxNkgxNnogTTI4LDI2SDE4di0yaDEwVjI2eiBNMjgsMjJIMTh2
+        LTJoMTBWMjJ6IiBjbGFzcz0iWWVsbG93IiAvPg0KICA8L2c+DQo8L3N2Zz4L
+</value>
+  </data>
+  <metadata name="dockManager1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
\ No newline at end of file
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/SetPumpRunConfigDlg.Designer.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/SetPumpRunConfigDlg.Designer.cs
new file mode 100644
index 0000000..82ee133
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/SetPumpRunConfigDlg.Designer.cs
@@ -0,0 +1,276 @@
+锘縩amespace IStation.WinFrmUI.Schedule
+{
+    partial class SetPumpRunStatusDlg
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            components = new System.ComponentModel.Container();
+            gridControl1 = new DevExpress.XtraGrid.GridControl();
+            currentViewModelBindingSource = new System.Windows.Forms.BindingSource(components);
+            gridView1 = new DevExpress.XtraGrid.Views.Grid.GridView();
+            colIsBP = new DevExpress.XtraGrid.Columns.GridColumn();
+            colQr = new DevExpress.XtraGrid.Columns.GridColumn();
+            colHr = new DevExpress.XtraGrid.Columns.GridColumn();
+            colNr = new DevExpress.XtraGrid.Columns.GridColumn();
+            colOc = new DevExpress.XtraGrid.Columns.GridColumn();
+            colIc = new DevExpress.XtraGrid.Columns.GridColumn();
+            colMachineRunStatus = new DevExpress.XtraGrid.Columns.GridColumn();
+            colName = new DevExpress.XtraGrid.Columns.GridColumn();
+            repositoryItemSpinEditPipeNO = new DevExpress.XtraEditors.Repository.RepositoryItemSpinEdit();
+            repositoryItemImageComboBox1 = new DevExpress.XtraEditors.Repository.RepositoryItemImageComboBox();
+            repositoryItemTextEditPercentage = new DevExpress.XtraEditors.Repository.RepositoryItemTextEdit();
+            layoutControl2 = new DevExpress.XtraLayout.LayoutControl();
+            layoutControlGroup3 = new DevExpress.XtraLayout.LayoutControlGroup();
+            layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem();
+            ((System.ComponentModel.ISupportInitialize)gridControl1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)currentViewModelBindingSource).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)gridView1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)repositoryItemSpinEditPipeNO).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)repositoryItemImageComboBox1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)repositoryItemTextEditPercentage).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControl2).BeginInit();
+            layoutControl2.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)layoutControlGroup3).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem1).BeginInit();
+            SuspendLayout();
+            // 
+            // gridControl1
+            // 
+            gridControl1.DataSource = currentViewModelBindingSource;
+            gridControl1.EmbeddedNavigator.Margin = new System.Windows.Forms.Padding(3, 5, 3, 5);
+            gridControl1.Location = new Point(13, 2);
+            gridControl1.MainView = gridView1;
+            gridControl1.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+            gridControl1.Name = "gridControl1";
+            gridControl1.RepositoryItems.AddRange(new DevExpress.XtraEditors.Repository.RepositoryItem[] { repositoryItemSpinEditPipeNO, repositoryItemImageComboBox1, repositoryItemTextEditPercentage });
+            gridControl1.Size = new Size(997, 470);
+            gridControl1.TabIndex = 4;
+            gridControl1.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] { gridView1 });
+            // 
+            // gridView1
+            // 
+            gridView1.Columns.AddRange(new DevExpress.XtraGrid.Columns.GridColumn[] { colIsBP, colQr, colHr, colNr, colOc, colIc, colMachineRunStatus, colName });
+            gridView1.DetailHeight = 450;
+            gridView1.GridControl = gridControl1;
+            gridView1.Name = "gridView1";
+            gridView1.OptionsDetail.EnableMasterViewMode = false;
+            gridView1.OptionsEditForm.PopupEditFormWidth = 914;
+            gridView1.SortInfo.AddRange(new DevExpress.XtraGrid.Columns.GridColumnSortInfo[] { new DevExpress.XtraGrid.Columns.GridColumnSortInfo(colIsBP, DevExpress.Data.ColumnSortOrder.Ascending) });
+            // 
+            // colIsBP
+            // 
+            colIsBP.Caption = "鏄惁鍙橀";
+            colIsBP.FieldName = "IsBp";
+            colIsBP.MinWidth = 23;
+            colIsBP.Name = "colIsBP";
+            colIsBP.Visible = true;
+            colIsBP.VisibleIndex = 6;
+            colIsBP.Width = 95;
+            // 
+            // colQr
+            // 
+            colQr.Caption = "棰濆畾娴侀噺";
+            colQr.FieldName = "Qr";
+            colQr.MinWidth = 23;
+            colQr.Name = "colQr";
+            colQr.OptionsColumn.AllowEdit = false;
+            colQr.OptionsColumn.ReadOnly = true;
+            colQr.Visible = true;
+            colQr.VisibleIndex = 1;
+            colQr.Width = 95;
+            // 
+            // colHr
+            // 
+            colHr.Caption = "棰濆畾鎵▼";
+            colHr.FieldName = "Hr";
+            colHr.MinWidth = 23;
+            colHr.Name = "colHr";
+            colHr.OptionsColumn.AllowEdit = false;
+            colHr.OptionsColumn.ReadOnly = true;
+            colHr.Visible = true;
+            colHr.VisibleIndex = 2;
+            colHr.Width = 95;
+            // 
+            // colNr
+            // 
+            colNr.Caption = "棰濆畾杞��";
+            colNr.FieldName = "Nr";
+            colNr.MinWidth = 23;
+            colNr.Name = "colNr";
+            colNr.OptionsColumn.AllowEdit = false;
+            colNr.OptionsColumn.ReadOnly = true;
+            colNr.Visible = true;
+            colNr.VisibleIndex = 3;
+            colNr.Width = 95;
+            // 
+            // colOc
+            // 
+            colOc.Caption = "鍑哄彛鍙e緞";
+            colOc.FieldName = "Oc";
+            colOc.MinWidth = 23;
+            colOc.Name = "colOc";
+            colOc.OptionsColumn.AllowEdit = false;
+            colOc.OptionsColumn.ReadOnly = true;
+            colOc.Visible = true;
+            colOc.VisibleIndex = 4;
+            colOc.Width = 95;
+            // 
+            // colIc
+            // 
+            colIc.Caption = "杩涘彛鍙e緞";
+            colIc.FieldName = "Ic";
+            colIc.MinWidth = 23;
+            colIc.Name = "colIc";
+            colIc.OptionsColumn.AllowEdit = false;
+            colIc.OptionsColumn.ReadOnly = true;
+            colIc.Visible = true;
+            colIc.VisibleIndex = 5;
+            colIc.Width = 109;
+            // 
+            // colMachineRunStatus
+            // 
+            colMachineRunStatus.Caption = "杩愯鐘舵��";
+            colMachineRunStatus.FieldName = "MachineRunStatus";
+            colMachineRunStatus.MinWidth = 23;
+            colMachineRunStatus.Name = "colMachineRunStatus";
+            colMachineRunStatus.Visible = true;
+            colMachineRunStatus.VisibleIndex = 7;
+            colMachineRunStatus.Width = 96;
+            // 
+            // colName
+            // 
+            colName.Caption = "鍚嶇О";
+            colName.FieldName = "Name";
+            colName.MinWidth = 23;
+            colName.Name = "colName";
+            colName.OptionsColumn.AllowEdit = false;
+            colName.OptionsColumn.ReadOnly = true;
+            colName.Visible = true;
+            colName.VisibleIndex = 0;
+            colName.Width = 96;
+            // 
+            // repositoryItemSpinEditPipeNO
+            // 
+            repositoryItemSpinEditPipeNO.AllowNullInput = DevExpress.Utils.DefaultBoolean.False;
+            repositoryItemSpinEditPipeNO.AutoHeight = false;
+            repositoryItemSpinEditPipeNO.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Combo) });
+            repositoryItemSpinEditPipeNO.MaskSettings.Set("mask", "d");
+            repositoryItemSpinEditPipeNO.MaxValue = new decimal(new int[] { 10, 0, 0, 0 });
+            repositoryItemSpinEditPipeNO.MinValue = new decimal(new int[] { 1, 0, 0, 0 });
+            repositoryItemSpinEditPipeNO.Name = "repositoryItemSpinEditPipeNO";
+            repositoryItemSpinEditPipeNO.NullText = "1";
+            repositoryItemSpinEditPipeNO.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.DisableTextEditor;
+            // 
+            // repositoryItemImageComboBox1
+            // 
+            repositoryItemImageComboBox1.AutoHeight = false;
+            repositoryItemImageComboBox1.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Combo) });
+            repositoryItemImageComboBox1.Name = "repositoryItemImageComboBox1";
+            // 
+            // repositoryItemTextEditPercentage
+            // 
+            repositoryItemTextEditPercentage.AutoHeight = false;
+            repositoryItemTextEditPercentage.MaskSettings.Set("MaskManagerType", typeof(DevExpress.Data.Mask.NumericMaskManager));
+            repositoryItemTextEditPercentage.MaskSettings.Set("MaskManagerSignature", "allowNull=False");
+            repositoryItemTextEditPercentage.MaskSettings.Set("mask", "P0");
+            repositoryItemTextEditPercentage.Name = "repositoryItemTextEditPercentage";
+            // 
+            // layoutControl2
+            // 
+            layoutControl2.Controls.Add(gridControl1);
+            layoutControl2.Dock = System.Windows.Forms.DockStyle.Fill;
+            layoutControl2.Location = new Point(0, 0);
+            layoutControl2.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+            layoutControl2.Name = "layoutControl2";
+            layoutControl2.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = new Rectangle(489, 405, 650, 400);
+            layoutControl2.Root = layoutControlGroup3;
+            layoutControl2.Size = new Size(1023, 487);
+            layoutControl2.TabIndex = 0;
+            layoutControl2.Text = "layoutControl2";
+            // 
+            // layoutControlGroup3
+            // 
+            layoutControlGroup3.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True;
+            layoutControlGroup3.GroupBordersVisible = false;
+            layoutControlGroup3.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlItem1 });
+            layoutControlGroup3.Name = "Root";
+            layoutControlGroup3.Padding = new DevExpress.XtraLayout.Utils.Padding(11, 11, 0, 13);
+            layoutControlGroup3.Size = new Size(1023, 487);
+            layoutControlGroup3.TextVisible = false;
+            // 
+            // layoutControlItem1
+            // 
+            layoutControlItem1.Control = gridControl1;
+            layoutControlItem1.Location = new Point(0, 0);
+            layoutControlItem1.Name = "layoutControlItem1";
+            layoutControlItem1.Size = new Size(1001, 474);
+            layoutControlItem1.TextSize = new Size(0, 0);
+            layoutControlItem1.TextVisible = false;
+            // 
+            // SetPumpRunStatusDlg
+            // 
+            AutoScaleDimensions = new SizeF(8F, 18F);
+            AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            ClientSize = new Size(1023, 487);
+            Controls.Add(layoutControl2);
+            Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+            Name = "SetPumpRunStatusDlg";
+            StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+            Text = "璋冨害閰嶇疆";
+            ((System.ComponentModel.ISupportInitialize)gridControl1).EndInit();
+            ((System.ComponentModel.ISupportInitialize)currentViewModelBindingSource).EndInit();
+            ((System.ComponentModel.ISupportInitialize)gridView1).EndInit();
+            ((System.ComponentModel.ISupportInitialize)repositoryItemSpinEditPipeNO).EndInit();
+            ((System.ComponentModel.ISupportInitialize)repositoryItemImageComboBox1).EndInit();
+            ((System.ComponentModel.ISupportInitialize)repositoryItemTextEditPercentage).EndInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControl2).EndInit();
+            layoutControl2.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)layoutControlGroup3).EndInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem1).EndInit();
+            ResumeLayout(false);
+        }
+
+        #endregion
+        private DevExpress.XtraGrid.GridControl gridControl1;
+        private DevExpress.XtraGrid.Views.Grid.GridView gridView1;
+        private DevExpress.XtraGrid.Columns.GridColumn colIsBP;
+        private DevExpress.XtraGrid.Columns.GridColumn colQr;
+        private DevExpress.XtraGrid.Columns.GridColumn colHr;
+        private DevExpress.XtraGrid.Columns.GridColumn colNr;
+        private DevExpress.XtraGrid.Columns.GridColumn colOc;
+        private DevExpress.XtraGrid.Columns.GridColumn colIc;
+        private DevExpress.XtraGrid.Columns.GridColumn colMachineRunStatus;
+        private DevExpress.XtraGrid.Columns.GridColumn colName;
+        private DevExpress.XtraEditors.Repository.RepositoryItemSpinEdit repositoryItemSpinEditPipeNO;
+        private DevExpress.XtraEditors.Repository.RepositoryItemImageComboBox repositoryItemImageComboBox1;
+        private DevExpress.XtraLayout.LayoutControl layoutControl2;
+        private DevExpress.XtraLayout.LayoutControlGroup layoutControlGroup3;
+        private DevExpress.XtraEditors.Repository.RepositoryItemTextEdit repositoryItemTextEditPercentage;
+        private System.Windows.Forms.BindingSource currentViewModelBindingSource;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem1;
+    }
+}
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/SetPumpRunConfigDlg.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/SetPumpRunConfigDlg.cs
new file mode 100644
index 0000000..fc2bde2
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/SetPumpRunConfigDlg.cs
@@ -0,0 +1,51 @@
+锘縰sing DevExpress.XtraEditors;
+using DevExpress.XtraEditors.Controls;
+using System.ComponentModel;
+
+namespace IStation.WinFrmUI.Schedule
+{
+    public partial class SetPumpRunStatusDlg : XtraForm
+    {
+        public SetPumpRunStatusDlg()
+        {
+            InitializeComponent();
+            IconOptions.Icon = WinFrmUI.Properties.Resources.App;
+            gridView1.SetNormalEditView();
+            gridView1.ClearSorting();
+            gridView1.BorderStyle = BorderStyles.NoBorder;
+        }
+
+        private BindingList<Model.PumpModel> _allBindingList = null;
+        public void SetBindingData(List<Model.PumpModel> list)
+        {
+            _allBindingList = new BindingList<Model.PumpModel>();
+
+            if (list != null && list.Any())
+            {
+                list = list.OrderBy(x => x.Name).ToList();
+                _allBindingList = new BindingList<Model.PumpModel>(list);
+            }
+
+            currentViewModelBindingSource.DataSource = _allBindingList;
+        }
+
+        public List<Model.PumpModel> GetDispatchPumps()
+        {
+            return _allBindingList.ToList();
+        }
+
+
+
+        private void btnOk_Click(object sender, System.EventArgs e)
+        {
+            gridView1.UpdateCurrentRow();
+            gridView1.CloseEditor();
+            DialogResult = System.Windows.Forms.DialogResult.OK;
+            Close();
+        }
+
+
+
+
+    }
+}
diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/SetPumpRunConfigDlg.resx b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/SetPumpRunConfigDlg.resx
new file mode 100644
index 0000000..c28dce1
--- /dev/null
+++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/SetPumpRunConfigDlg.resx
@@ -0,0 +1,123 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!--
+    Microsoft ResX Schema
+
+    Version 2.0
+
+    The primary goals of this format is to allow a simple XML format
+    that is mostly human readable. The generation and parsing of the
+    various data types are done through the TypeConverter classes
+    associated with the data types.
+
+    Example:
+
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+
+    There are any number of "resheader" rows that contain simple
+    name/value pairs.
+
+    Each data row contains a name, and value. The row also contains a
+    type or mimetype. Type corresponds to a .NET class that support
+    text/value conversion through the TypeConverter architecture.
+    Classes that don't support this are serialized and stored with the
+    mimetype set.
+
+    The mimetype is used for serialized objects, and tells the
+    ResXResourceReader how to depersist the object. This is currently not
+    extensible. For a given mimetype the value must be set accordingly:
+
+    Note - application/x-microsoft.net.object.binary.base64 is the format
+    that the ResXResourceWriter will generate, however the reader can
+    read any of the formats listed below.
+
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="currentViewModelBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
\ No newline at end of file

--
Gitblit v1.9.3