diff --git a/.gitignore b/.gitignore
index f32b7ed..a4c5101 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,9 +4,6 @@
##
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
-#======================Custom
-.svn
-
# User-specific files
*.rsuser
*.suo
@@ -401,3 +398,6 @@ FodyWeavers.xsd
# JetBrains Rider
*.sln.iml
+#======================Custom
+.svn
+!SystemX.Net.CP.Middleware.Log
\ No newline at end of file
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.CP.Middleware.Log.sln b/SystemX.Net.CP.Middleware.Log/SystemX.Net.CP.Middleware.Log.sln
new file mode 100644
index 0000000..0ae386a
--- /dev/null
+++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.CP.Middleware.Log.sln
@@ -0,0 +1,32 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.30225.117
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SystemX.Net.CP.Middleware.Log", "SystemX.Net.Middleware.UI\SystemX.Net.CP.Middleware.Log.csproj", "{3658FBE5-9A84-4F76-8E19-867DB9F4484D}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Debug|x64 = Debug|x64
+ Release|Any CPU = Release|Any CPU
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Debug|x64.ActiveCfg = Debug|x64
+ {3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Debug|x64.Build.0 = Debug|x64
+ {3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Release|x64.ActiveCfg = Release|x64
+ {3658FBE5-9A84-4F76-8E19-867DB9F4484D}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {68CD108D-837F-47FF-A153-70C328D18A84}
+ VisualSVNWorkingCopyRoot = .
+ EndGlobalSection
+EndGlobal
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/ALIS ICON.ico b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/ALIS ICON.ico
new file mode 100644
index 0000000..14a4223
Binary files /dev/null and b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/ALIS ICON.ico differ
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/App.config b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/App.config
new file mode 100644
index 0000000..369c5d6
--- /dev/null
+++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/App.config
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+ System
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/AppIcon.ico b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/AppIcon.ico
new file mode 100644
index 0000000..cbb016c
Binary files /dev/null and b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/AppIcon.ico differ
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Commons.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Commons.cs
new file mode 100644
index 0000000..7c6a820
--- /dev/null
+++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Commons.cs
@@ -0,0 +1,547 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Runtime.InteropServices;
+using System.IO;
+using System.Security.Cryptography;
+using System.Data;
+using System.Text.RegularExpressions;
+using System.Net.Sockets;
+using System.Globalization;
+using System.Threading;
+using System.Diagnostics;
+using System.Net;
+
+using SystemX.Net.BaseProtocol;
+using System.Xml.Linq;
+using static SystemX.Net.Platform.Common.Util.LogMessage;
+using System.Data.SqlClient;
+
+namespace SystemX.Net.Middleware.Log.Commons
+{
+ using ParamElement = Tuple;
+
+ public class HISTTesterSummary
+ {
+ public string StationName { set; get; }
+ public string TestType { set; get; }
+ public string Version { set; get; }
+ public string ProdCode { set; get; }
+ public int TestListFileNo { set; get; }
+ public int TestListVariantNo { set; get; }
+ public string TestListCntID { set; get; }
+
+ public int StepVersion { set; get; }
+ public string Host { set; get; }
+ public string Section { set; get; }
+ public string ProdNoC { set; get; }
+ public string ProdNoP { set; get; }
+ public string TestCode { set; get; }
+ public string TestListFileName { set; get; }
+ public string ProductID { set; get; }
+ public string Result { set; get; }
+ public string Duration { set; get; }
+ public DateTime TestDT { set; get; }
+ }
+
+ public class HISTLogSummary
+ {
+ public string StationName { set; get; }
+ public string TestType { set; get; }
+ public string Version { set; get; }
+ public string ProdCode { set; get; }
+ public int TestListFileNo { set; get; }
+ public int TestListVariantNo { set; get; }
+ public string TestListCntID { set; get; }
+
+ public int StepVersion { set; get; }
+ public string Host { set; get; }
+ public string Section { set; get; }
+ public string ProdNoC { set; get; }
+ public string ProdNoP { set; get; }
+ public string TestCode { set; get; }
+ public string TestListFileName { set; get; }
+ public string ProductID { set; get; }
+ public string Result { set; get; }
+ public string Duration { set; get; }
+ public DateTime TestDT { set; get; }
+ }
+
+ public static class ShortLogParamInfo
+ {
+ public static readonly int MessageLength = 4096;
+ public static readonly int MessageValLength = 2024;
+
+ public static string STEP = "";
+ public static string POSITION = "";
+ public static string MO = "";
+ public static string FNC_NAME = "";
+ public static string MIN = "";
+ public static string MEASURE = "";
+ public static string MAX = "";
+ public static string DIM = "";
+ public static string CHECK = "";
+ public static string SPENT_TIME = "";
+ public static string INFO = "";
+
+ public static bool GLOBAL_SPEC = false;
+ public static string VRFY_MIN = "";
+ public static string VRFY_MAX = "";
+ }
+
+ public static class LongLogParamInfo
+ {
+ public static readonly int MessageLength = 4096;
+ public static readonly int MessageValLength = 2024;
+
+ public static string STEP = "";
+ public static string POSITION = "";
+ public static string MO = "";
+ public static string FNC_NAME = "";
+ public static string MIN = "";
+ public static string MEASURE = "";
+ public static string MAX = "";
+ public static string DIM = "";
+ public static string CHECK = "";
+ public static string SPENT_TIME = "";
+ public static string INFO = "";
+
+ public static bool GLOBAL_SPEC = false;
+ public static string VRFY_MIN = "";
+ public static string VRFY_MAX = "";
+ }
+
+ public static class ParamSet
+ {
+ public static Dictionary fParam = new Dictionary();
+
+ public static void TestResultField()
+ {
+ fParam.Clear();
+ fParam = new Dictionary();
+ fParam.Add("No", new ParamElement(SqlDbType.BigInt, 0, 0, 0));
+ fParam.Add("TestDT", new ParamElement(SqlDbType.DateTime2, 7, 0, 0));
+ fParam.Add("LogData", new ParamElement(SqlDbType.NVarChar, -1, 0, 0));
+ }
+
+ public static void TesterSummaryField()
+ {
+ fParam.Clear();
+ fParam = new Dictionary();
+ fParam.Add("StationName", new ParamElement(SqlDbType.NVarChar, 128, 0, 0));
+ fParam.Add("TestType", new ParamElement(SqlDbType.NVarChar, 8, 0, 0));
+ fParam.Add("Version", new ParamElement(SqlDbType.NVarChar, 4, 0, 0));
+ fParam.Add("ProdCode", new ParamElement(SqlDbType.NVarChar, 4, 0, 0));
+ fParam.Add("TestListFileNo", new ParamElement(SqlDbType.Int, 0, 0, 0));
+ fParam.Add("TestListVariantNo", new ParamElement(SqlDbType.Int, 0, 0, 0));
+ fParam.Add("TestListCntID", new ParamElement(SqlDbType.NVarChar, 256, 0, 0));
+ fParam.Add("StepVersion", new ParamElement(SqlDbType.Int, 0, 0, 0));
+ fParam.Add("HostID", new ParamElement(SqlDbType.NVarChar, 64, 0, 0));
+ fParam.Add("Section", new ParamElement(SqlDbType.NVarChar, 64, 0, 0));
+ fParam.Add("ProdNo_C", new ParamElement(SqlDbType.NVarChar, 32, 0, 0));
+ fParam.Add("ProdNo_P", new ParamElement(SqlDbType.NVarChar, 32, 0, 0));
+ fParam.Add("Testcode", new ParamElement(SqlDbType.NVarChar, 16, 0, 0));
+ fParam.Add("TestListFileName", new ParamElement(SqlDbType.NVarChar, 256, 0, 0));
+ fParam.Add("ProductID", new ParamElement(SqlDbType.NVarChar, 64, 0, 0));
+ fParam.Add("Result", new ParamElement(SqlDbType.NVarChar, 16, 0, 0));
+ fParam.Add("Duration", new ParamElement(SqlDbType.NVarChar, 16, 0, 0));
+ fParam.Add("TestDT", new ParamElement(SqlDbType.DateTime2, 7, 0, 0));
+ }
+
+ public static void LogSummaryField()
+ {
+ fParam.Clear();
+ fParam = new Dictionary();
+ fParam.Add("StationName", new ParamElement(SqlDbType.NVarChar, 128, 0, 0));
+ fParam.Add("TestType", new ParamElement(SqlDbType.NVarChar, 8, 0, 0));
+ fParam.Add("Version", new ParamElement(SqlDbType.NVarChar, 4, 0, 0));
+ fParam.Add("ProdCode", new ParamElement(SqlDbType.NVarChar, 4, 0, 0));
+ fParam.Add("TestListFileNo", new ParamElement(SqlDbType.Int, 0, 0, 0));
+ fParam.Add("TestListVariantNo", new ParamElement(SqlDbType.Int, 0, 0, 0));
+ fParam.Add("TestListCntID", new ParamElement(SqlDbType.NVarChar, 256, 0, 0));
+ fParam.Add("StepVersion", new ParamElement(SqlDbType.Int, 0, 0, 0));
+ fParam.Add("HostID", new ParamElement(SqlDbType.NVarChar, 64, 0, 0));
+ fParam.Add("Section", new ParamElement(SqlDbType.NVarChar, 64, 0, 0));
+ fParam.Add("ProdNo_C", new ParamElement(SqlDbType.NVarChar, 32, 0, 0));
+ fParam.Add("ProdNo_P", new ParamElement(SqlDbType.NVarChar, 32, 0, 0));
+ fParam.Add("Testcode", new ParamElement(SqlDbType.NVarChar, 16, 0, 0));
+ fParam.Add("TestListFileName", new ParamElement(SqlDbType.NVarChar, 256, 0, 0));
+ fParam.Add("ProductID", new ParamElement(SqlDbType.NVarChar, 64, 0, 0));
+ fParam.Add("Result", new ParamElement(SqlDbType.NVarChar, 16, 0, 0));
+ fParam.Add("Duration", new ParamElement(SqlDbType.NVarChar, 16, 0, 0));
+ fParam.Add("TestDT", new ParamElement(SqlDbType.DateTime2, 7, 0, 0));
+ }
+
+ public static SqlParameter GetMakeSqlParameterInfo(Dictionary refField, string strSetName, object objValue)
+ {
+ if (refField.ContainsKey(strSetName))
+ {
+ SqlParameter param = null;
+
+ if (refField[strSetName].Item2 != 0)
+ param = new SqlParameter("@" + strSetName, refField[strSetName].Item1, refField[strSetName].Item2);
+ else
+ param = new SqlParameter("@" + strSetName, refField[strSetName].Item1);
+
+ if (refField[strSetName].Item1 == SqlDbType.Decimal)
+ {
+ param.Precision = refField[strSetName].Item3;
+ param.Scale = refField[strSetName].Item4;
+ }
+
+ param.Value = objValue;
+ return param;
+ }
+ else
+ return null;
+ }
+ }
+
+ public class CommonProtocol
+ {
+ public SqlCommand LogDataResultInsert(string strTableName, DataRow itemData)
+ {
+ string columns = string.Empty;
+ columns = "No,TestDT,LogData";
+
+ string values = string.Join(",", columns.Split(',').Select(c => string.Format("@{0}", c)));
+ string sqlCommand = string.Format("INSERT INTO [" + strTableName + "] ({0}) VALUES ({1})", columns, values);
+
+ ParamSet.TestResultField();
+
+ SqlCommand cmd = new SqlCommand(sqlCommand);
+
+ SqlParameter[] setParams = new SqlParameter[columns.Split(',').Count()];
+
+ setParams[0] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "No", Convert.ToInt64(itemData["No"]));
+ setParams[1] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestDT", Convert.ToDateTime(itemData["TestDT"]));
+ setParams[2] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "LogData", Convert.ToString(itemData["LogData"]));
+
+ cmd.Parameters.AddRange(setParams);
+
+ return cmd;
+ }
+
+ public SqlCommand LogDataSummaryInsert(string strTableName, HISTLogSummary itemSummary)
+ {
+ string columns = string.Empty;
+ if (itemSummary.TestListCntID == string.Empty)
+ columns = "StationName,TestType,Version,ProdCode,TestListFileNo,TestListVariantNo,StepVersion,HostID,Section,ProdNo_C,ProdNo_P,Testcode,TestListFileName,ProductID,Result,Duration,TestDT";
+ else
+ columns = "StationName,TestType,Version,ProdCode,TestListFileNo,TestListVariantNo,TestListCntID,StepVersion,HostID,Section,ProdNo_C,ProdNo_P,Testcode,TestListFileName,ProductID,Result,Duration,TestDT";
+
+ string values = string.Join(",", columns.Split(',').Select(c => string.Format("@{0}", c)));
+ string sqlCommand = string.Format("INSERT INTO [" + strTableName + "] ({0}) VALUES ({1})", columns, values);
+
+ ParamSet.LogSummaryField();
+
+ SqlCommand cmd = new SqlCommand(sqlCommand);
+
+ SqlParameter[] setParams = new SqlParameter[columns.Split(',').Count()];
+
+ if (itemSummary.TestListCntID == string.Empty)
+ {
+ setParams[0] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "StationName", itemSummary.StationName);
+ setParams[1] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestType", itemSummary.TestType);
+ setParams[2] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Version", itemSummary.Version);
+ setParams[3] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProdCode", itemSummary.ProdCode);
+ setParams[4] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestListFileNo", itemSummary.TestListFileNo);
+ setParams[5] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestListVariantNo", itemSummary.TestListVariantNo);
+ setParams[6] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "StepVersion", itemSummary.StepVersion);
+ setParams[7] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "HostID", itemSummary.Host);
+ setParams[8] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Section", itemSummary.Section);
+ setParams[9] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProdNo_C", itemSummary.ProdNoC);
+ setParams[10] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProdNo_P", itemSummary.ProdNoP);
+ setParams[11] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Testcode", itemSummary.TestCode);
+ setParams[12] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestListFileName", itemSummary.TestListFileName);
+ setParams[13] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProductID", itemSummary.ProductID);
+ setParams[14] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Result", itemSummary.Result);
+ setParams[15] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Duration", itemSummary.Duration);
+ setParams[16] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestDT", itemSummary.TestDT);
+ }
+ else
+ {
+ setParams[0] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "StationName", itemSummary.StationName);
+ setParams[1] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestType", itemSummary.TestType);
+ setParams[2] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Version", itemSummary.Version);
+ setParams[3] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProdCode", itemSummary.ProdCode);
+ setParams[4] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestListFileNo", itemSummary.TestListFileNo);
+ setParams[5] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestListVariantNo", itemSummary.TestListVariantNo);
+ setParams[6] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestListCntID", itemSummary.TestListCntID);
+ setParams[7] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "StepVersion", itemSummary.StepVersion);
+ setParams[8] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "HostID", itemSummary.Host);
+ setParams[9] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Section", itemSummary.Section);
+ setParams[10] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProdNo_C", itemSummary.ProdNoC);
+ setParams[11] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProdNo_P", itemSummary.ProdNoP);
+ setParams[12] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Testcode", itemSummary.TestCode);
+ setParams[13] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestListFileName", itemSummary.TestListFileName);
+ setParams[14] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "ProductID", itemSummary.ProductID);
+ setParams[15] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Result", itemSummary.Result);
+ setParams[16] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "Duration", itemSummary.Duration);
+ setParams[17] = ParamSet.GetMakeSqlParameterInfo(ParamSet.fParam, "TestDT", itemSummary.TestDT);
+ }
+
+ cmd.Parameters.AddRange(setParams);
+
+ return cmd;
+ }
+ }
+
+ public static class COMMON
+ {
+ [DllImport("winmm.dll")]
+ public static extern uint timeGetTime();
+
+ public const string Png = "PNG Portable Network Graphics (*.png)|" + "*.png";
+ public const string Jpg = "JPEG File Interchange Format (*.jpg *.jpeg *jfif)|" + "*.jpg;*.jpeg;*.jfif";
+ public const string Bmp = "BMP Windows Bitmap (*.bmp)|" + "*.bmp";
+ public const string Tif = "TIF Tagged Imaged File Format (*.tif *.tiff)|" + "*.tif;*.tiff";
+ public const string Gif = "GIF Graphics Interchange Format (*.gif)|" + "*.gif";
+ public const string AllImages = "Image file|" + "*.png; *.jpg; *.jpeg; *.jfif; *.bmp;*.tif; *.tiff; *.gif";
+ public const string AllFiles = "All files (*.*)" + "|*.*";
+
+ public static string[] mediaExtensions = {
+ ".PNG", ".JPG", ".JPEG", ".BMP", ".GIF", //etc
+ ".WAV", ".MID", ".MIDI", ".WMA", ".MP3", ".OGG", ".RMA", //etc
+ ".AVI", ".MP4", ".DIVX", ".WMV", //etc
+ };
+
+ public static DataTable ConvertCSVtoDataTable(string strFilePath, string strSetHeader)
+ {
+ DataTable dt = null;
+ try
+ {
+ using (StreamReader sr = new StreamReader(strFilePath))
+ {
+ string[] headers = null;
+
+ if (strSetHeader.Length > 0)
+ headers = strSetHeader.Split(',');
+ else
+ headers = sr.ReadLine().Split(',');
+
+ dt = new DataTable();
+ foreach (string header in headers)
+ {
+ dt.Columns.Add(header);
+ }
+ while (!sr.EndOfStream)
+ {
+ string strReadData = sr.ReadLine().Trim();
+ if (strReadData.Length <= 0)
+ break;
+
+ string[] rows = Regex.Split(strReadData, ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");
+ DataRow dr = dt.NewRow();
+ for (int i = 0; i < headers.Length; i++)
+ {
+ dr[i] = rows[i];
+ }
+ dt.Rows.Add(dr);
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ dt = null;
+ }
+
+ return dt;
+ }
+
+ public static T ConvertTextToTryValue(string strText, object objFailValue)
+ {
+ object obj;
+ obj = typeof(T);
+
+ int iGetValue = 0;
+ uint uiGetValue = 0;
+ double dGetValue = 0;
+
+ if (obj.ToString().IndexOf("Int") >= 0)
+ {
+ if (!int.TryParse(strText, out iGetValue))
+ obj = objFailValue;
+ else
+ obj = iGetValue;
+ }
+ if (obj.ToString().IndexOf("UInt") >= 0)
+ {
+ if (!uint.TryParse(strText, out uiGetValue))
+ obj = objFailValue;
+ else
+ obj = uiGetValue;
+ }
+ else if (obj.ToString().IndexOf("Double") >= 0)
+ {
+ if (!double.TryParse(strText, out dGetValue))
+ obj = objFailValue;
+ else
+ obj = dGetValue;
+ }
+
+ return (T)Convert.ChangeType(obj, typeof(T));
+ }
+
+ public static T FindByName(this object targetClass, string name) where T : class
+ {
+ System.Reflection.FieldInfo fi = targetClass.GetType().GetField(name, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
+
+ return fi.GetValue(targetClass) as T;
+ }
+
+ public static T FindByName(this string name, object targetClass) where T : class
+ {
+ System.Reflection.FieldInfo fi = targetClass.GetType().GetField(name, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
+
+ return fi.GetValue(targetClass) as T;
+ }
+
+ public class LogProcessInfo
+ {
+ public bool READ_INFO_STATE { set; get; }
+
+ private string strInfoFilePos;
+
+ public string TITLE;
+
+ public string SERVER_SAVE_POS;
+ public string MES_SAVE_POS;
+
+ //TODO : Server ALIS FTP
+ public bool FTP_Use;
+
+ public string FTP_IPAddress;
+ public string FTP_Port;
+ public string FTP_Account;
+ public string FTP_Password;
+
+ public long FTP_ScanTime_ms;
+
+ public long BULK_ProcessTime_ms;
+
+ public LogProcessInfo(string strGetInfoPath)
+ {
+ strInfoFilePos = strGetInfoPath;
+ }
+ public bool Load()
+ {
+ READ_INFO_STATE = true;
+
+ try
+ {
+ XDocument xDoc = XDocument.Load(strInfoFilePos);
+ var xElement = xDoc.Element("ROOT");
+
+ if (xElement != null)
+ {
+ var xGetElement = xElement.Element("Configure");
+
+ TITLE = xGetElement.Element("Title").Value;
+
+ SERVER_SAVE_POS = @xGetElement.Element("LogFileSavePos").Value;
+ MES_SAVE_POS = @xGetElement.Element("MESFileSavePos").Value;
+
+ //TODO : Server ALIS FTP
+ XElement xEle = xGetElement.Element("UseFTP");
+
+ bool bValue;
+ long lValue;
+ //string strValue;
+
+ if (xEle?.IsEmpty == false)
+ {
+ if (bool.TryParse(xEle.Value, out bValue))
+ FTP_Use = bValue;
+ }
+ else
+ FTP_Use = false;
+
+ xEle = xGetElement.Element("IPAddressFTP");
+
+ if (xEle?.IsEmpty == false)
+ FTP_IPAddress = xEle.Value;
+ else
+ FTP_IPAddress = "0.0.0.0";
+
+ xEle = xGetElement.Element("PortFTP");
+
+ if (xEle?.IsEmpty == false)
+ FTP_Port = xEle.Value;
+ else
+ FTP_Port = "21";
+
+ xEle = xGetElement.Element("AccountFTP");
+
+ if (xEle?.IsEmpty == false)
+ FTP_Account = xEle.Value;
+ else
+ FTP_Account = "";
+
+ xEle = xGetElement.Element("PasswordFTP");
+
+ if (xEle?.IsEmpty == false)
+ FTP_Password = xEle.Value;
+ else
+ FTP_Password = "";
+
+ xEle = xGetElement.Element("ScanTimeFTPms");
+
+ if (xEle?.IsEmpty == false)
+ {
+ if (long.TryParse(xEle.Value, out lValue))
+ FTP_ScanTime_ms = lValue;
+ }
+ else
+ FTP_ScanTime_ms = 30000;
+
+ xEle = xGetElement.Element("ScanTimeBULKms");
+
+ if (xEle?.IsEmpty == false)
+ {
+ if (long.TryParse(xEle.Value, out lValue))
+ BULK_ProcessTime_ms = lValue;
+ }
+ else
+ BULK_ProcessTime_ms = 30000;
+
+ if (Base.CheckPath(SERVER_SAVE_POS))
+ {
+ if (Directory.Exists(SERVER_SAVE_POS) == false)
+ Directory.CreateDirectory(SERVER_SAVE_POS);
+ }
+ else
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"ServerInfo read failed.(SERVER SAVE POS - Folder name error)[SystemX.Common : SystemX.Net.ServerInfo]", ConsoleColor.Yellow, LogMessageLevel.DEBUG);
+
+ throw new Exception();
+ }
+
+ if (Base.CheckPath(MES_SAVE_POS))
+ {
+ if (Directory.Exists(MES_SAVE_POS) == false)
+ Directory.CreateDirectory(MES_SAVE_POS);
+ }
+ else
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"ServerInfo read failed.(MES SAVE POS - Folder name error)[SystemX.Common : SystemX.Net.ServerInfo]", ConsoleColor.Yellow, LogMessageLevel.DEBUG);
+
+ throw new Exception();
+ }
+
+ }
+ }
+ catch (Exception e)
+ {
+ READ_INFO_STATE = false;
+
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"LogProcessInfo read failed. [LogProcessInfo : SystemX.Net.Middleware.Commons]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
+ }
+
+ return READ_INFO_STATE;
+ }
+ }
+ }
+}
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/DeleteProc.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/DeleteProc.cs
new file mode 100644
index 0000000..0cd3610
--- /dev/null
+++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/DeleteProc.cs
@@ -0,0 +1,169 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Runtime.InteropServices;
+using System.IO;
+using System.Security.Cryptography;
+using System.Data;
+using System.Text.RegularExpressions;
+using System.Net.Sockets;
+using System.Globalization;
+using System.Threading;
+using System.Diagnostics;
+using System.Net;
+
+using SystemX.Net.BaseProtocol;
+using System.Xml.Linq;
+using static SystemX.Net.Platform.Common.Util.LogMessage;
+using System.Data.SqlClient;
+
+namespace SystemX.Net.Middleware.Log.DeleteProc
+{
+ public class DeleteProcSystem
+ {
+ public Stopwatch stDeleteLogScanTimer;
+
+ public DeleteProcSystem()
+ {
+ stDeleteLogScanTimer = new Stopwatch();
+ }
+
+ protected void ScanTimerStart()
+ {
+ stDeleteLogScanTimer.Start();
+ }
+
+ protected void ScanTimerRestart()
+ {
+ stDeleteLogScanTimer.Restart();
+ }
+
+ protected long GetTimerTime()
+ {
+ return stDeleteLogScanTimer.ElapsedMilliseconds;
+ }
+
+ protected bool GetTimeOverState(long lLimitTime)
+ {
+ return (stDeleteLogScanTimer.ElapsedMilliseconds >= lLimitTime) ? true : false;
+ }
+ }
+
+ public class DeleteProcOption
+ {
+ public enum eLogCheckItem
+ {
+ Summary = 0,
+ ShortTerm = 1,
+ LongTerm = 2
+ }
+
+ //Option
+ public eLogCheckItem ProcChkItem;
+
+ public long lLogScanTimeVal;
+
+ public int nSummaryScanItemCnt;
+ public int nShortLogScanItemCnt;
+ public int nLongLogScanItemCnt;
+
+ public int nSummaryDeleteNum;
+
+ public DeleteProcOption()
+ {
+ ProcChkItem = eLogCheckItem.Summary;
+
+ //3 Minute
+ //Test 10000
+ lLogScanTimeVal = 10000; //180000;
+
+ nSummaryScanItemCnt = 100;
+ nShortLogScanItemCnt = 100;
+ nLongLogScanItemCnt = 100;
+
+ nSummaryDeleteNum = 5;
+ }
+ }
+
+ public class DeleteProcInfo : DeleteProcSystem
+ {
+ public int[] nHistSummaryDeleteList;
+ public int nHistSummaryDeleteSize;
+ public int nHistSummaryDeletePos;
+ //
+ public int[] nShortLogSummaryDeleteListNo;
+ public int[] nShortLogSummaryDeleteListAccessSt;
+ public int[] nShortLogSummaryDeleteListAccessEn;
+
+ public int nShortLogSummaryDeleteSize;
+ public int nShortLogSummaryDeletePos;
+
+ public bool bShortLogDataCheckResult;
+ public int nShortLogDeleteProcPos;
+ public bool bShortLogDataDeleteResult;
+ //
+ public int[] nLongLogSummaryDeleteListNo;
+ public int[] nLongLogSummaryDeleteListAccessSt;
+ public int[] nLongLogSummaryDeleteListAccessEn;
+
+ public int nLongLogSummaryDeleteSize;
+ public int nLongLogSummaryDeletePos;
+
+ public bool bLongLogDataCheckResult;
+ public int nLongLogDeleteProcPos;
+ public bool bLongLogDataDeleteResult;
+ //
+ //Option
+ public DeleteProcOption DeleteProcOp;
+
+ public DeleteProcInfo()
+ {
+ ScanTimerStart();
+
+ InitMember();
+ }
+
+ private void InitMember()
+ {
+ nHistSummaryDeleteList = new int[1];
+ nHistSummaryDeleteSize = 0;
+ nHistSummaryDeletePos = 0;
+
+ nShortLogSummaryDeleteListNo = new int[1];
+ nShortLogSummaryDeleteListAccessSt = new int[1];
+ nShortLogSummaryDeleteListAccessEn = new int[1];
+
+ nShortLogSummaryDeleteSize = 0;
+ nShortLogSummaryDeletePos = 0;
+
+ bShortLogDataCheckResult = false;
+ nShortLogDeleteProcPos = 0;
+ bShortLogDataDeleteResult = false;
+
+ nLongLogSummaryDeleteListNo = new int[1];
+ nLongLogSummaryDeleteListAccessSt = new int[1];
+ nLongLogSummaryDeleteListAccessEn = new int[1];
+
+ nLongLogSummaryDeleteSize = 0;
+ nLongLogSummaryDeletePos = 0;
+
+ bLongLogDataCheckResult = false;
+ nLongLogDeleteProcPos = 0;
+ bLongLogDataDeleteResult = false;
+
+ DeleteProcOp = new DeleteProcOption();
+ }
+
+ public bool GetScanTimeState()
+ {
+ return GetTimeOverState(DeleteProcOp.lLogScanTimeVal);
+ }
+
+ public void ResetScanTimeState()
+ {
+ ScanTimerRestart();
+ }
+ }
+}
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/MainForm.Designer.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/MainForm.Designer.cs
new file mode 100644
index 0000000..60b1fa2
--- /dev/null
+++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/MainForm.Designer.cs
@@ -0,0 +1,849 @@
+using DevExpress.XtraBars;
+using DevExpress.XtraBars.Ribbon;
+
+namespace SystemX.Net.MiddlewareUI
+{
+ partial class MainForm
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
+ this.fluentDesignFormContainer1 = new DevExpress.XtraBars.FluentDesignSystem.FluentDesignFormContainer();
+ this.panel2 = new System.Windows.Forms.Panel();
+ this.panelMain = new System.Windows.Forms.Panel();
+ this.panelProcess = new System.Windows.Forms.Panel();
+ this.richTextBoxProcess = new System.Windows.Forms.RichTextBox();
+ this.panelRecv = new System.Windows.Forms.Panel();
+ this.richTextBoxRecv = new System.Windows.Forms.RichTextBox();
+ this.paneldDBConn = new System.Windows.Forms.Panel();
+ this.panelDBPath = new System.Windows.Forms.Panel();
+ this.labelDBPath = new System.Windows.Forms.Label();
+ this.panelFTP = new System.Windows.Forms.Panel();
+ this.panel4 = new System.Windows.Forms.Panel();
+ this.labelFTP = new System.Windows.Forms.Label();
+ this.panelDBLongTerm2 = new System.Windows.Forms.Panel();
+ this.panelDBLongTerm1 = new System.Windows.Forms.Panel();
+ this.labelDBLongTerm = new System.Windows.Forms.Label();
+ this.panel7 = new System.Windows.Forms.Panel();
+ this.panel8 = new System.Windows.Forms.Panel();
+ this.labelShortTermLogTableName = new System.Windows.Forms.Label();
+ this.panel5 = new System.Windows.Forms.Panel();
+ this.panel6 = new System.Windows.Forms.Panel();
+ this.labelShortTermSummaryTableName = new System.Windows.Forms.Label();
+ this.panelDBShortTerm2 = new System.Windows.Forms.Panel();
+ this.panelDBShortTerm1 = new System.Windows.Forms.Panel();
+ this.labelDBShortTerm = new System.Windows.Forms.Label();
+ this.panelDBMain2 = new System.Windows.Forms.Panel();
+ this.panelDBMain1 = new System.Windows.Forms.Panel();
+ this.labelDBMain = new System.Windows.Forms.Label();
+ this.progressBarProgram = new System.Windows.Forms.ProgressBar();
+ this.panelSubFunc = new System.Windows.Forms.Panel();
+ this.buttonDbConnect = new System.Windows.Forms.Button();
+ this.panel3 = new System.Windows.Forms.Panel();
+ this.labelFTPTime = new System.Windows.Forms.Label();
+ this.labelBulkTime = new System.Windows.Forms.Label();
+ this.labelBulkCntInfo1 = new System.Windows.Forms.Label();
+ this.labelBulkCntInfo2 = new System.Windows.Forms.Label();
+ this.labelBulkCntInfo3 = new System.Windows.Forms.Label();
+ this.buttonBulkInsertStart = new System.Windows.Forms.Button();
+ this.panelSub1 = new System.Windows.Forms.Panel();
+ this.panelSub2 = new System.Windows.Forms.Panel();
+ this.panel1 = new System.Windows.Forms.Panel();
+ this.pictureBox1 = new System.Windows.Forms.PictureBox();
+ this.pictureBox3 = new System.Windows.Forms.PictureBox();
+ this.pictureBox2 = new System.Windows.Forms.PictureBox();
+ this.Title_label = new System.Windows.Forms.Label();
+ this.AlisPictureBox = new System.Windows.Forms.PictureBox();
+ this.fluentDesignFormControl1 = new DevExpress.XtraBars.FluentDesignSystem.FluentDesignFormControl();
+ this.barCheckItemShowCpLogTime = new DevExpress.XtraBars.BarCheckItem();
+ this.Chktimer = new System.Windows.Forms.Timer(this.components);
+ this.UItimer = new System.Windows.Forms.Timer(this.components);
+ this.notifyIcon = new System.Windows.Forms.NotifyIcon(this.components);
+ this.contextMenuSubStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
+ this.toolStripMenuItemExit = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripComboBox1 = new System.Windows.Forms.ToolStripComboBox();
+ this.fluentDesignFormContainer1.SuspendLayout();
+ this.panel2.SuspendLayout();
+ this.panelMain.SuspendLayout();
+ this.panelProcess.SuspendLayout();
+ this.panelRecv.SuspendLayout();
+ this.paneldDBConn.SuspendLayout();
+ this.panelDBPath.SuspendLayout();
+ this.panelFTP.SuspendLayout();
+ this.panel4.SuspendLayout();
+ this.panelDBLongTerm2.SuspendLayout();
+ this.panelDBLongTerm1.SuspendLayout();
+ this.panel7.SuspendLayout();
+ this.panel8.SuspendLayout();
+ this.panel5.SuspendLayout();
+ this.panel6.SuspendLayout();
+ this.panelDBShortTerm2.SuspendLayout();
+ this.panelDBShortTerm1.SuspendLayout();
+ this.panelDBMain2.SuspendLayout();
+ this.panelDBMain1.SuspendLayout();
+ this.panelSubFunc.SuspendLayout();
+ this.panel3.SuspendLayout();
+ this.panel1.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.AlisPictureBox)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.fluentDesignFormControl1)).BeginInit();
+ this.contextMenuSubStrip.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // fluentDesignFormContainer1
+ //
+ this.fluentDesignFormContainer1.Controls.Add(this.panel2);
+ this.fluentDesignFormContainer1.Controls.Add(this.panel1);
+ this.fluentDesignFormContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.fluentDesignFormContainer1.Location = new System.Drawing.Point(0, 46);
+ this.fluentDesignFormContainer1.Name = "fluentDesignFormContainer1";
+ this.fluentDesignFormContainer1.Size = new System.Drawing.Size(1979, 958);
+ this.fluentDesignFormContainer1.TabIndex = 0;
+ //
+ // panel2
+ //
+ this.panel2.Controls.Add(this.panelMain);
+ this.panel2.Controls.Add(this.panelSubFunc);
+ this.panel2.Controls.Add(this.panelSub1);
+ this.panel2.Controls.Add(this.panelSub2);
+ this.panel2.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.panel2.Location = new System.Drawing.Point(0, 74);
+ this.panel2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.panel2.Name = "panel2";
+ this.panel2.Size = new System.Drawing.Size(1979, 884);
+ this.panel2.TabIndex = 3;
+ //
+ // panelMain
+ //
+ this.panelMain.Controls.Add(this.panelProcess);
+ this.panelMain.Controls.Add(this.panelRecv);
+ this.panelMain.Controls.Add(this.paneldDBConn);
+ this.panelMain.Controls.Add(this.progressBarProgram);
+ this.panelMain.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.panelMain.Location = new System.Drawing.Point(0, 0);
+ this.panelMain.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.panelMain.Name = "panelMain";
+ this.panelMain.Size = new System.Drawing.Size(1979, 592);
+ this.panelMain.TabIndex = 18;
+ //
+ // panelProcess
+ //
+ this.panelProcess.Controls.Add(this.richTextBoxProcess);
+ this.panelProcess.Dock = System.Windows.Forms.DockStyle.Bottom;
+ this.panelProcess.Location = new System.Drawing.Point(433, 306);
+ this.panelProcess.Margin = new System.Windows.Forms.Padding(20);
+ this.panelProcess.Name = "panelProcess";
+ this.panelProcess.Padding = new System.Windows.Forms.Padding(20);
+ this.panelProcess.Size = new System.Drawing.Size(1546, 286);
+ this.panelProcess.TabIndex = 23;
+ //
+ // richTextBoxProcess
+ //
+ this.richTextBoxProcess.BackColor = System.Drawing.Color.White;
+ this.richTextBoxProcess.BorderStyle = System.Windows.Forms.BorderStyle.None;
+ this.richTextBoxProcess.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.richTextBoxProcess.Font = new System.Drawing.Font("Times New Roman", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.richTextBoxProcess.Location = new System.Drawing.Point(20, 20);
+ this.richTextBoxProcess.Margin = new System.Windows.Forms.Padding(10);
+ this.richTextBoxProcess.Name = "richTextBoxProcess";
+ this.richTextBoxProcess.ReadOnly = true;
+ this.richTextBoxProcess.Size = new System.Drawing.Size(1506, 246);
+ this.richTextBoxProcess.TabIndex = 1;
+ this.richTextBoxProcess.Text = "";
+ //
+ // panelRecv
+ //
+ this.panelRecv.Controls.Add(this.richTextBoxRecv);
+ this.panelRecv.Dock = System.Windows.Forms.DockStyle.Top;
+ this.panelRecv.Location = new System.Drawing.Point(433, 60);
+ this.panelRecv.Margin = new System.Windows.Forms.Padding(20);
+ this.panelRecv.Name = "panelRecv";
+ this.panelRecv.Padding = new System.Windows.Forms.Padding(20);
+ this.panelRecv.Size = new System.Drawing.Size(1546, 233);
+ this.panelRecv.TabIndex = 22;
+ //
+ // richTextBoxRecv
+ //
+ this.richTextBoxRecv.BackColor = System.Drawing.Color.White;
+ this.richTextBoxRecv.BorderStyle = System.Windows.Forms.BorderStyle.None;
+ this.richTextBoxRecv.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.richTextBoxRecv.Font = new System.Drawing.Font("Times New Roman", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.richTextBoxRecv.Location = new System.Drawing.Point(20, 20);
+ this.richTextBoxRecv.Margin = new System.Windows.Forms.Padding(10);
+ this.richTextBoxRecv.Name = "richTextBoxRecv";
+ this.richTextBoxRecv.ReadOnly = true;
+ this.richTextBoxRecv.Size = new System.Drawing.Size(1506, 193);
+ this.richTextBoxRecv.TabIndex = 0;
+ this.richTextBoxRecv.Text = "";
+ //
+ // paneldDBConn
+ //
+ this.paneldDBConn.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224)))));
+ this.paneldDBConn.Controls.Add(this.panelDBPath);
+ this.paneldDBConn.Controls.Add(this.panelFTP);
+ this.paneldDBConn.Controls.Add(this.panelDBLongTerm2);
+ this.paneldDBConn.Controls.Add(this.panel7);
+ this.paneldDBConn.Controls.Add(this.panel5);
+ this.paneldDBConn.Controls.Add(this.panelDBShortTerm2);
+ this.paneldDBConn.Controls.Add(this.panelDBMain2);
+ this.paneldDBConn.Dock = System.Windows.Forms.DockStyle.Left;
+ this.paneldDBConn.Location = new System.Drawing.Point(0, 60);
+ this.paneldDBConn.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.paneldDBConn.Name = "paneldDBConn";
+ this.paneldDBConn.Size = new System.Drawing.Size(433, 532);
+ this.paneldDBConn.TabIndex = 21;
+ //
+ // panelDBPath
+ //
+ this.panelDBPath.Controls.Add(this.labelDBPath);
+ this.panelDBPath.Dock = System.Windows.Forms.DockStyle.Top;
+ this.panelDBPath.Location = new System.Drawing.Point(0, 228);
+ this.panelDBPath.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.panelDBPath.Name = "panelDBPath";
+ this.panelDBPath.Size = new System.Drawing.Size(433, 39);
+ this.panelDBPath.TabIndex = 33;
+ //
+ // labelDBPath
+ //
+ this.labelDBPath.BackColor = System.Drawing.Color.White;
+ this.labelDBPath.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.labelDBPath.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.labelDBPath.Location = new System.Drawing.Point(0, 0);
+ this.labelDBPath.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.labelDBPath.Name = "labelDBPath";
+ this.labelDBPath.Size = new System.Drawing.Size(433, 39);
+ this.labelDBPath.TabIndex = 23;
+ this.labelDBPath.Text = "Path";
+ this.labelDBPath.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // panelFTP
+ //
+ this.panelFTP.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.panelFTP.Controls.Add(this.panel4);
+ this.panelFTP.Dock = System.Windows.Forms.DockStyle.Top;
+ this.panelFTP.Location = new System.Drawing.Point(0, 190);
+ this.panelFTP.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.panelFTP.Name = "panelFTP";
+ this.panelFTP.Size = new System.Drawing.Size(433, 38);
+ this.panelFTP.TabIndex = 32;
+ this.panelFTP.Visible = false;
+ //
+ // panel4
+ //
+ this.panel4.Controls.Add(this.labelFTP);
+ this.panel4.Dock = System.Windows.Forms.DockStyle.Left;
+ this.panel4.Location = new System.Drawing.Point(0, 0);
+ this.panel4.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.panel4.Name = "panel4";
+ this.panel4.Size = new System.Drawing.Size(408, 36);
+ this.panel4.TabIndex = 26;
+ //
+ // labelFTP
+ //
+ this.labelFTP.BackColor = System.Drawing.Color.White;
+ this.labelFTP.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.labelFTP.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.labelFTP.Location = new System.Drawing.Point(0, 0);
+ this.labelFTP.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.labelFTP.Name = "labelFTP";
+ this.labelFTP.Size = new System.Drawing.Size(408, 36);
+ this.labelFTP.TabIndex = 23;
+ this.labelFTP.Text = "FTP";
+ this.labelFTP.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // panelDBLongTerm2
+ //
+ this.panelDBLongTerm2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.panelDBLongTerm2.Controls.Add(this.panelDBLongTerm1);
+ this.panelDBLongTerm2.Dock = System.Windows.Forms.DockStyle.Top;
+ this.panelDBLongTerm2.Location = new System.Drawing.Point(0, 152);
+ this.panelDBLongTerm2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.panelDBLongTerm2.Name = "panelDBLongTerm2";
+ this.panelDBLongTerm2.Size = new System.Drawing.Size(433, 38);
+ this.panelDBLongTerm2.TabIndex = 31;
+ //
+ // panelDBLongTerm1
+ //
+ this.panelDBLongTerm1.Controls.Add(this.labelDBLongTerm);
+ this.panelDBLongTerm1.Dock = System.Windows.Forms.DockStyle.Left;
+ this.panelDBLongTerm1.Location = new System.Drawing.Point(0, 0);
+ this.panelDBLongTerm1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.panelDBLongTerm1.Name = "panelDBLongTerm1";
+ this.panelDBLongTerm1.Size = new System.Drawing.Size(408, 36);
+ this.panelDBLongTerm1.TabIndex = 26;
+ //
+ // labelDBLongTerm
+ //
+ this.labelDBLongTerm.BackColor = System.Drawing.Color.White;
+ this.labelDBLongTerm.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.labelDBLongTerm.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.labelDBLongTerm.Location = new System.Drawing.Point(0, 0);
+ this.labelDBLongTerm.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.labelDBLongTerm.Name = "labelDBLongTerm";
+ this.labelDBLongTerm.Size = new System.Drawing.Size(408, 36);
+ this.labelDBLongTerm.TabIndex = 23;
+ this.labelDBLongTerm.Text = "LongTerm";
+ this.labelDBLongTerm.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // panel7
+ //
+ this.panel7.BackColor = System.Drawing.Color.WhiteSmoke;
+ this.panel7.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.panel7.Controls.Add(this.panel8);
+ this.panel7.Dock = System.Windows.Forms.DockStyle.Top;
+ this.panel7.Location = new System.Drawing.Point(0, 114);
+ this.panel7.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.panel7.Name = "panel7";
+ this.panel7.Size = new System.Drawing.Size(433, 38);
+ this.panel7.TabIndex = 29;
+ //
+ // panel8
+ //
+ this.panel8.Controls.Add(this.labelShortTermLogTableName);
+ this.panel8.Dock = System.Windows.Forms.DockStyle.Left;
+ this.panel8.Location = new System.Drawing.Point(0, 0);
+ this.panel8.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.panel8.Name = "panel8";
+ this.panel8.Size = new System.Drawing.Size(408, 36);
+ this.panel8.TabIndex = 26;
+ //
+ // labelShortTermLogTableName
+ //
+ this.labelShortTermLogTableName.BackColor = System.Drawing.Color.White;
+ this.labelShortTermLogTableName.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.labelShortTermLogTableName.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.labelShortTermLogTableName.Location = new System.Drawing.Point(0, 0);
+ this.labelShortTermLogTableName.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.labelShortTermLogTableName.Name = "labelShortTermLogTableName";
+ this.labelShortTermLogTableName.Size = new System.Drawing.Size(408, 36);
+ this.labelShortTermLogTableName.TabIndex = 23;
+ this.labelShortTermLogTableName.Text = "ShortTermLogTableName";
+ this.labelShortTermLogTableName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // panel5
+ //
+ this.panel5.BackColor = System.Drawing.Color.WhiteSmoke;
+ this.panel5.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.panel5.Controls.Add(this.panel6);
+ this.panel5.Dock = System.Windows.Forms.DockStyle.Top;
+ this.panel5.Location = new System.Drawing.Point(0, 76);
+ this.panel5.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.panel5.Name = "panel5";
+ this.panel5.Size = new System.Drawing.Size(433, 38);
+ this.panel5.TabIndex = 28;
+ //
+ // panel6
+ //
+ this.panel6.Controls.Add(this.labelShortTermSummaryTableName);
+ this.panel6.Dock = System.Windows.Forms.DockStyle.Left;
+ this.panel6.Location = new System.Drawing.Point(0, 0);
+ this.panel6.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.panel6.Name = "panel6";
+ this.panel6.Size = new System.Drawing.Size(408, 36);
+ this.panel6.TabIndex = 26;
+ //
+ // labelShortTermSummaryTableName
+ //
+ this.labelShortTermSummaryTableName.BackColor = System.Drawing.Color.White;
+ this.labelShortTermSummaryTableName.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.labelShortTermSummaryTableName.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.labelShortTermSummaryTableName.Location = new System.Drawing.Point(0, 0);
+ this.labelShortTermSummaryTableName.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.labelShortTermSummaryTableName.Name = "labelShortTermSummaryTableName";
+ this.labelShortTermSummaryTableName.Size = new System.Drawing.Size(408, 36);
+ this.labelShortTermSummaryTableName.TabIndex = 23;
+ this.labelShortTermSummaryTableName.Text = "ShortTermSummaryTableName";
+ this.labelShortTermSummaryTableName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // panelDBShortTerm2
+ //
+ this.panelDBShortTerm2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.panelDBShortTerm2.Controls.Add(this.panelDBShortTerm1);
+ this.panelDBShortTerm2.Dock = System.Windows.Forms.DockStyle.Top;
+ this.panelDBShortTerm2.Location = new System.Drawing.Point(0, 38);
+ this.panelDBShortTerm2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.panelDBShortTerm2.Name = "panelDBShortTerm2";
+ this.panelDBShortTerm2.Size = new System.Drawing.Size(433, 38);
+ this.panelDBShortTerm2.TabIndex = 23;
+ //
+ // panelDBShortTerm1
+ //
+ this.panelDBShortTerm1.Controls.Add(this.labelDBShortTerm);
+ this.panelDBShortTerm1.Dock = System.Windows.Forms.DockStyle.Left;
+ this.panelDBShortTerm1.Location = new System.Drawing.Point(0, 0);
+ this.panelDBShortTerm1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.panelDBShortTerm1.Name = "panelDBShortTerm1";
+ this.panelDBShortTerm1.Size = new System.Drawing.Size(408, 36);
+ this.panelDBShortTerm1.TabIndex = 26;
+ //
+ // labelDBShortTerm
+ //
+ this.labelDBShortTerm.BackColor = System.Drawing.Color.White;
+ this.labelDBShortTerm.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.labelDBShortTerm.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.labelDBShortTerm.Location = new System.Drawing.Point(0, 0);
+ this.labelDBShortTerm.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.labelDBShortTerm.Name = "labelDBShortTerm";
+ this.labelDBShortTerm.Size = new System.Drawing.Size(408, 36);
+ this.labelDBShortTerm.TabIndex = 23;
+ this.labelDBShortTerm.Text = "ShortTerm";
+ this.labelDBShortTerm.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // panelDBMain2
+ //
+ this.panelDBMain2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.panelDBMain2.Controls.Add(this.panelDBMain1);
+ this.panelDBMain2.Dock = System.Windows.Forms.DockStyle.Top;
+ this.panelDBMain2.Location = new System.Drawing.Point(0, 0);
+ this.panelDBMain2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.panelDBMain2.Name = "panelDBMain2";
+ this.panelDBMain2.Size = new System.Drawing.Size(433, 38);
+ this.panelDBMain2.TabIndex = 22;
+ //
+ // panelDBMain1
+ //
+ this.panelDBMain1.Controls.Add(this.labelDBMain);
+ this.panelDBMain1.Dock = System.Windows.Forms.DockStyle.Left;
+ this.panelDBMain1.Location = new System.Drawing.Point(0, 0);
+ this.panelDBMain1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.panelDBMain1.Name = "panelDBMain1";
+ this.panelDBMain1.Size = new System.Drawing.Size(408, 36);
+ this.panelDBMain1.TabIndex = 25;
+ //
+ // labelDBMain
+ //
+ this.labelDBMain.BackColor = System.Drawing.Color.White;
+ this.labelDBMain.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.labelDBMain.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.labelDBMain.Location = new System.Drawing.Point(0, 0);
+ this.labelDBMain.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.labelDBMain.Name = "labelDBMain";
+ this.labelDBMain.Size = new System.Drawing.Size(408, 36);
+ this.labelDBMain.TabIndex = 22;
+ this.labelDBMain.Text = "Information";
+ this.labelDBMain.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // progressBarProgram
+ //
+ this.progressBarProgram.Dock = System.Windows.Forms.DockStyle.Top;
+ this.progressBarProgram.ForeColor = System.Drawing.SystemColors.HotTrack;
+ this.progressBarProgram.Location = new System.Drawing.Point(0, 0);
+ this.progressBarProgram.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.progressBarProgram.Name = "progressBarProgram";
+ this.progressBarProgram.Size = new System.Drawing.Size(1979, 60);
+ this.progressBarProgram.Style = System.Windows.Forms.ProgressBarStyle.Marquee;
+ this.progressBarProgram.TabIndex = 20;
+ //
+ // panelSubFunc
+ //
+ this.panelSubFunc.BackColor = System.Drawing.Color.MidnightBlue;
+ this.panelSubFunc.Controls.Add(this.buttonDbConnect);
+ this.panelSubFunc.Controls.Add(this.panel3);
+ this.panelSubFunc.Controls.Add(this.buttonBulkInsertStart);
+ this.panelSubFunc.Dock = System.Windows.Forms.DockStyle.Bottom;
+ this.panelSubFunc.Location = new System.Drawing.Point(0, 592);
+ this.panelSubFunc.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.panelSubFunc.Name = "panelSubFunc";
+ this.panelSubFunc.Size = new System.Drawing.Size(1979, 58);
+ this.panelSubFunc.TabIndex = 17;
+ //
+ // buttonDbConnect
+ //
+ this.buttonDbConnect.BackColor = System.Drawing.SystemColors.Control;
+ this.buttonDbConnect.Dock = System.Windows.Forms.DockStyle.Right;
+ this.buttonDbConnect.Location = new System.Drawing.Point(683, 0);
+ this.buttonDbConnect.Name = "buttonDbConnect";
+ this.buttonDbConnect.Size = new System.Drawing.Size(229, 58);
+ this.buttonDbConnect.TabIndex = 2;
+ this.buttonDbConnect.Text = "Database Connect Try";
+ this.buttonDbConnect.UseVisualStyleBackColor = false;
+ this.buttonDbConnect.Visible = false;
+ this.buttonDbConnect.Click += new System.EventHandler(this.buttonDbConnect_Click);
+ //
+ // panel3
+ //
+ this.panel3.Controls.Add(this.labelFTPTime);
+ this.panel3.Controls.Add(this.labelBulkTime);
+ this.panel3.Controls.Add(this.labelBulkCntInfo1);
+ this.panel3.Controls.Add(this.labelBulkCntInfo2);
+ this.panel3.Controls.Add(this.labelBulkCntInfo3);
+ this.panel3.Dock = System.Windows.Forms.DockStyle.Right;
+ this.panel3.Location = new System.Drawing.Point(912, 0);
+ this.panel3.Name = "panel3";
+ this.panel3.Size = new System.Drawing.Size(851, 58);
+ this.panel3.TabIndex = 1;
+ //
+ // labelFTPTime
+ //
+ this.labelFTPTime.BackColor = System.Drawing.Color.WhiteSmoke;
+ this.labelFTPTime.Dock = System.Windows.Forms.DockStyle.Right;
+ this.labelFTPTime.Font = new System.Drawing.Font("Times New Roman", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.labelFTPTime.Location = new System.Drawing.Point(121, 0);
+ this.labelFTPTime.Name = "labelFTPTime";
+ this.labelFTPTime.Size = new System.Drawing.Size(146, 58);
+ this.labelFTPTime.TabIndex = 4;
+ this.labelFTPTime.Text = "-";
+ this.labelFTPTime.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ this.labelFTPTime.Visible = false;
+ //
+ // labelBulkTime
+ //
+ this.labelBulkTime.BackColor = System.Drawing.Color.Snow;
+ this.labelBulkTime.Dock = System.Windows.Forms.DockStyle.Right;
+ this.labelBulkTime.Font = new System.Drawing.Font("Times New Roman", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.labelBulkTime.Location = new System.Drawing.Point(267, 0);
+ this.labelBulkTime.Name = "labelBulkTime";
+ this.labelBulkTime.Size = new System.Drawing.Size(146, 58);
+ this.labelBulkTime.TabIndex = 3;
+ this.labelBulkTime.Text = "-";
+ this.labelBulkTime.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelBulkCntInfo1
+ //
+ this.labelBulkCntInfo1.BackColor = System.Drawing.Color.Silver;
+ this.labelBulkCntInfo1.Dock = System.Windows.Forms.DockStyle.Right;
+ this.labelBulkCntInfo1.Font = new System.Drawing.Font("Times New Roman", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.labelBulkCntInfo1.Location = new System.Drawing.Point(413, 0);
+ this.labelBulkCntInfo1.Name = "labelBulkCntInfo1";
+ this.labelBulkCntInfo1.Size = new System.Drawing.Size(146, 58);
+ this.labelBulkCntInfo1.TabIndex = 2;
+ this.labelBulkCntInfo1.Text = "-";
+ this.labelBulkCntInfo1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelBulkCntInfo2
+ //
+ this.labelBulkCntInfo2.BackColor = System.Drawing.Color.Silver;
+ this.labelBulkCntInfo2.Dock = System.Windows.Forms.DockStyle.Right;
+ this.labelBulkCntInfo2.Font = new System.Drawing.Font("Times New Roman", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.labelBulkCntInfo2.Location = new System.Drawing.Point(559, 0);
+ this.labelBulkCntInfo2.Name = "labelBulkCntInfo2";
+ this.labelBulkCntInfo2.Size = new System.Drawing.Size(146, 58);
+ this.labelBulkCntInfo2.TabIndex = 1;
+ this.labelBulkCntInfo2.Text = "-";
+ this.labelBulkCntInfo2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // labelBulkCntInfo3
+ //
+ this.labelBulkCntInfo3.BackColor = System.Drawing.Color.Silver;
+ this.labelBulkCntInfo3.Dock = System.Windows.Forms.DockStyle.Right;
+ this.labelBulkCntInfo3.Font = new System.Drawing.Font("Times New Roman", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.labelBulkCntInfo3.Location = new System.Drawing.Point(705, 0);
+ this.labelBulkCntInfo3.Name = "labelBulkCntInfo3";
+ this.labelBulkCntInfo3.Size = new System.Drawing.Size(146, 58);
+ this.labelBulkCntInfo3.TabIndex = 0;
+ this.labelBulkCntInfo3.Text = "-";
+ this.labelBulkCntInfo3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // buttonBulkInsertStart
+ //
+ this.buttonBulkInsertStart.BackColor = System.Drawing.SystemColors.Control;
+ this.buttonBulkInsertStart.Dock = System.Windows.Forms.DockStyle.Right;
+ this.buttonBulkInsertStart.Location = new System.Drawing.Point(1763, 0);
+ this.buttonBulkInsertStart.Name = "buttonBulkInsertStart";
+ this.buttonBulkInsertStart.Size = new System.Drawing.Size(216, 58);
+ this.buttonBulkInsertStart.TabIndex = 0;
+ this.buttonBulkInsertStart.Text = "Direct Bulk Insert Try";
+ this.buttonBulkInsertStart.UseVisualStyleBackColor = false;
+ this.buttonBulkInsertStart.Click += new System.EventHandler(this.buttonBulkInsertStart_Click);
+ //
+ // panelSub1
+ //
+ this.panelSub1.Dock = System.Windows.Forms.DockStyle.Bottom;
+ this.panelSub1.Location = new System.Drawing.Point(0, 650);
+ this.panelSub1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.panelSub1.Name = "panelSub1";
+ this.panelSub1.Size = new System.Drawing.Size(1979, 94);
+ this.panelSub1.TabIndex = 14;
+ //
+ // panelSub2
+ //
+ this.panelSub2.Dock = System.Windows.Forms.DockStyle.Bottom;
+ this.panelSub2.Location = new System.Drawing.Point(0, 744);
+ this.panelSub2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.panelSub2.Name = "panelSub2";
+ this.panelSub2.Size = new System.Drawing.Size(1979, 140);
+ this.panelSub2.TabIndex = 2;
+ //
+ // panel1
+ //
+ this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.panel1.Controls.Add(this.pictureBox1);
+ this.panel1.Controls.Add(this.pictureBox3);
+ this.panel1.Controls.Add(this.pictureBox2);
+ this.panel1.Controls.Add(this.Title_label);
+ this.panel1.Controls.Add(this.AlisPictureBox);
+ this.panel1.Dock = System.Windows.Forms.DockStyle.Top;
+ this.panel1.Location = new System.Drawing.Point(0, 0);
+ this.panel1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.panel1.Name = "panel1";
+ this.panel1.Size = new System.Drawing.Size(1979, 74);
+ this.panel1.TabIndex = 2;
+ //
+ // pictureBox1
+ //
+ this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Left;
+ this.pictureBox1.Image = global::SystemX.Net.MiddlewareUI.Log.Properties.Resources.AppIcon;
+ this.pictureBox1.Location = new System.Drawing.Point(353, 0);
+ this.pictureBox1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.pictureBox1.Name = "pictureBox1";
+ this.pictureBox1.Size = new System.Drawing.Size(60, 72);
+ this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
+ this.pictureBox1.TabIndex = 5;
+ this.pictureBox1.TabStop = false;
+ //
+ // pictureBox3
+ //
+ this.pictureBox3.Dock = System.Windows.Forms.DockStyle.Left;
+ this.pictureBox3.Image = global::SystemX.Net.MiddlewareUI.Log.Properties.Resources.ALIS;
+ this.pictureBox3.Location = new System.Drawing.Point(220, 0);
+ this.pictureBox3.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.pictureBox3.Name = "pictureBox3";
+ this.pictureBox3.Size = new System.Drawing.Size(133, 72);
+ this.pictureBox3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
+ this.pictureBox3.TabIndex = 4;
+ this.pictureBox3.TabStop = false;
+ //
+ // pictureBox2
+ //
+ this.pictureBox2.Dock = System.Windows.Forms.DockStyle.Right;
+ this.pictureBox2.Image = global::SystemX.Net.MiddlewareUI.Log.Properties.Resources.CI;
+ this.pictureBox2.Location = new System.Drawing.Point(1770, 0);
+ this.pictureBox2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.pictureBox2.Name = "pictureBox2";
+ this.pictureBox2.Size = new System.Drawing.Size(207, 72);
+ this.pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
+ this.pictureBox2.TabIndex = 3;
+ this.pictureBox2.TabStop = false;
+ //
+ // Title_label
+ //
+ this.Title_label.BackColor = System.Drawing.Color.White;
+ this.Title_label.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.Title_label.Font = new System.Drawing.Font("Times New Roman", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.Title_label.Location = new System.Drawing.Point(220, 0);
+ this.Title_label.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.Title_label.Name = "Title_label";
+ this.Title_label.Size = new System.Drawing.Size(1757, 72);
+ this.Title_label.TabIndex = 2;
+ this.Title_label.Text = "CP ALIS";
+ this.Title_label.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ this.Title_label.DoubleClick += new System.EventHandler(this.label1_DoubleClick);
+ //
+ // AlisPictureBox
+ //
+ this.AlisPictureBox.Dock = System.Windows.Forms.DockStyle.Left;
+ this.AlisPictureBox.Image = global::SystemX.Net.MiddlewareUI.Log.Properties.Resources.Kefico_CI;
+ this.AlisPictureBox.Location = new System.Drawing.Point(0, 0);
+ this.AlisPictureBox.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.AlisPictureBox.Name = "AlisPictureBox";
+ this.AlisPictureBox.Size = new System.Drawing.Size(220, 72);
+ this.AlisPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
+ this.AlisPictureBox.TabIndex = 1;
+ this.AlisPictureBox.TabStop = false;
+ //
+ // fluentDesignFormControl1
+ //
+ this.fluentDesignFormControl1.FluentDesignForm = this;
+ this.fluentDesignFormControl1.Items.AddRange(new DevExpress.XtraBars.BarItem[] {
+ this.barCheckItemShowCpLogTime});
+ this.fluentDesignFormControl1.Location = new System.Drawing.Point(0, 0);
+ this.fluentDesignFormControl1.Name = "fluentDesignFormControl1";
+ this.fluentDesignFormControl1.Size = new System.Drawing.Size(1979, 46);
+ this.fluentDesignFormControl1.TabIndex = 2;
+ this.fluentDesignFormControl1.TabStop = false;
+ this.fluentDesignFormControl1.TitleItemLinks.Add(this.barCheckItemShowCpLogTime);
+ //
+ // barCheckItemShowCpLogTime
+ //
+ this.barCheckItemShowCpLogTime.CheckBoxVisibility = DevExpress.XtraBars.CheckBoxVisibility.BeforeText;
+ this.barCheckItemShowCpLogTime.Id = 0;
+ this.barCheckItemShowCpLogTime.Name = "barCheckItemShowCpLogTime";
+ this.barCheckItemShowCpLogTime.CheckedChanged += new DevExpress.XtraBars.ItemClickEventHandler(this.barCheckItemShowCpLogTime_CheckedChanged);
+ //
+ // Chktimer
+ //
+ this.Chktimer.Interval = 1000;
+ this.Chktimer.Tick += new System.EventHandler(this.Chktimer_Tick);
+ //
+ // UItimer
+ //
+ this.UItimer.Interval = 500;
+ this.UItimer.Tick += new System.EventHandler(this.UItimer_Tick);
+ //
+ // notifyIcon
+ //
+ this.notifyIcon.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info;
+ this.notifyIcon.BalloonTipText = "v20230510 Middleware Log Process";
+ this.notifyIcon.BalloonTipTitle = "For [ALIS] Middleware Program.";
+ this.notifyIcon.ContextMenuStrip = this.contextMenuSubStrip;
+ this.notifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon.Icon")));
+ this.notifyIcon.Text = "Middleware Log";
+ this.notifyIcon.Visible = true;
+ this.notifyIcon.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.notifyIcon_MouseDoubleClick);
+ //
+ // contextMenuSubStrip
+ //
+ this.contextMenuSubStrip.Font = new System.Drawing.Font("Times New Roman", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.contextMenuSubStrip.ImageScalingSize = new System.Drawing.Size(24, 24);
+ this.contextMenuSubStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.toolStripSeparator1,
+ this.toolStripMenuItemExit});
+ this.contextMenuSubStrip.Name = "contextMenuSubStrip";
+ this.contextMenuSubStrip.Size = new System.Drawing.Size(207, 42);
+ this.contextMenuSubStrip.Text = "Menu";
+ this.contextMenuSubStrip.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.contextMenuSubStrip_ItemClicked);
+ //
+ // toolStripSeparator1
+ //
+ this.toolStripSeparator1.Name = "toolStripSeparator1";
+ this.toolStripSeparator1.Size = new System.Drawing.Size(203, 6);
+ //
+ // toolStripMenuItemExit
+ //
+ this.toolStripMenuItemExit.BackColor = System.Drawing.Color.Khaki;
+ this.toolStripMenuItemExit.Name = "toolStripMenuItemExit";
+ this.toolStripMenuItemExit.Size = new System.Drawing.Size(206, 32);
+ this.toolStripMenuItemExit.Text = "Program Exit";
+ //
+ // toolStripComboBox1
+ //
+ this.toolStripComboBox1.Margin = new System.Windows.Forms.Padding(1, 0, 1, 0);
+ this.toolStripComboBox1.Name = "toolStripComboBox1";
+ this.toolStripComboBox1.Size = new System.Drawing.Size(121, 23);
+ //
+ // MainForm
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 22F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(1979, 1004);
+ this.ControlContainer = this.fluentDesignFormContainer1;
+ this.Controls.Add(this.fluentDesignFormContainer1);
+ this.Controls.Add(this.fluentDesignFormControl1);
+ this.FluentDesignFormControl = this.fluentDesignFormControl1;
+ this.IconOptions.Icon = ((System.Drawing.Icon)(resources.GetObject("MainForm.IconOptions.Icon")));
+ this.IconOptions.Image = global::SystemX.Net.MiddlewareUI.Log.Properties.Resources.AppIcon1;
+ this.Name = "MainForm";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "SystemX.Net.Middleware.UI - Log CPX v240529";
+ this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
+ this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing);
+ this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.MainForm_FormClosed);
+ this.fluentDesignFormContainer1.ResumeLayout(false);
+ this.panel2.ResumeLayout(false);
+ this.panelMain.ResumeLayout(false);
+ this.panelProcess.ResumeLayout(false);
+ this.panelRecv.ResumeLayout(false);
+ this.paneldDBConn.ResumeLayout(false);
+ this.panelDBPath.ResumeLayout(false);
+ this.panelFTP.ResumeLayout(false);
+ this.panel4.ResumeLayout(false);
+ this.panelDBLongTerm2.ResumeLayout(false);
+ this.panelDBLongTerm1.ResumeLayout(false);
+ this.panel7.ResumeLayout(false);
+ this.panel8.ResumeLayout(false);
+ this.panel5.ResumeLayout(false);
+ this.panel6.ResumeLayout(false);
+ this.panelDBShortTerm2.ResumeLayout(false);
+ this.panelDBShortTerm1.ResumeLayout(false);
+ this.panelDBMain2.ResumeLayout(false);
+ this.panelDBMain1.ResumeLayout(false);
+ this.panelSubFunc.ResumeLayout(false);
+ this.panel3.ResumeLayout(false);
+ this.panel1.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.AlisPictureBox)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.fluentDesignFormControl1)).EndInit();
+ this.contextMenuSubStrip.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+ private DevExpress.XtraBars.FluentDesignSystem.FluentDesignFormContainer fluentDesignFormContainer1;
+ private DevExpress.XtraBars.FluentDesignSystem.FluentDesignFormControl fluentDesignFormControl1;
+ private System.Windows.Forms.PictureBox AlisPictureBox;
+ private System.Windows.Forms.Panel panel1;
+ private System.Windows.Forms.Label Title_label;
+ private System.Windows.Forms.Panel panel2;
+ private System.Windows.Forms.Timer Chktimer;
+ private System.Windows.Forms.Timer UItimer;
+ private System.Windows.Forms.Panel panelSub2;
+ private System.Windows.Forms.NotifyIcon notifyIcon;
+ private System.Windows.Forms.PictureBox pictureBox2;
+ private System.Windows.Forms.PictureBox pictureBox3;
+ private System.Windows.Forms.ContextMenuStrip contextMenuSubStrip;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
+ private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExit;
+ private System.Windows.Forms.ToolStripComboBox toolStripComboBox1;
+ private System.Windows.Forms.Panel panelSub1;
+ private System.Windows.Forms.Panel panelSubFunc;
+ private BarCheckItem barCheckItemShowCpLogTime;
+ private System.Windows.Forms.Panel panelMain;
+ private System.Windows.Forms.ProgressBar progressBarProgram;
+ private System.Windows.Forms.PictureBox pictureBox1;
+ private System.Windows.Forms.Panel paneldDBConn;
+ private System.Windows.Forms.Panel panelDBShortTerm2;
+ private System.Windows.Forms.Panel panelDBShortTerm1;
+ private System.Windows.Forms.Label labelDBShortTerm;
+ private System.Windows.Forms.Panel panelDBMain2;
+ private System.Windows.Forms.Panel panelDBMain1;
+ private System.Windows.Forms.Label labelDBMain;
+ private System.Windows.Forms.Panel panelProcess;
+ private System.Windows.Forms.RichTextBox richTextBoxProcess;
+ private System.Windows.Forms.Panel panelRecv;
+ private System.Windows.Forms.RichTextBox richTextBoxRecv;
+ private System.Windows.Forms.Button buttonBulkInsertStart;
+ private System.Windows.Forms.Panel panel3;
+ private System.Windows.Forms.Label labelBulkCntInfo1;
+ private System.Windows.Forms.Label labelBulkCntInfo2;
+ private System.Windows.Forms.Label labelBulkCntInfo3;
+ private System.Windows.Forms.Label labelBulkTime;
+ private System.Windows.Forms.Panel panelDBPath;
+ private System.Windows.Forms.Label labelDBPath;
+ private System.Windows.Forms.Panel panelFTP;
+ private System.Windows.Forms.Panel panel4;
+ private System.Windows.Forms.Label labelFTP;
+ private System.Windows.Forms.Panel panelDBLongTerm2;
+ private System.Windows.Forms.Panel panelDBLongTerm1;
+ private System.Windows.Forms.Label labelDBLongTerm;
+ private System.Windows.Forms.Panel panel7;
+ private System.Windows.Forms.Panel panel8;
+ private System.Windows.Forms.Label labelShortTermLogTableName;
+ private System.Windows.Forms.Panel panel5;
+ private System.Windows.Forms.Panel panel6;
+ private System.Windows.Forms.Label labelShortTermSummaryTableName;
+ private System.Windows.Forms.Button buttonDbConnect;
+ private System.Windows.Forms.Label labelFTPTime;
+ }
+}
+
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/MainForm.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/MainForm.cs
new file mode 100644
index 0000000..9195322
--- /dev/null
+++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/MainForm.cs
@@ -0,0 +1,604 @@
+using System;
+using System.Net;
+using System.Net.Sockets;
+using System.Runtime.InteropServices;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Data.SqlClient;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using System.Xml.Linq;
+using System.IO;
+using System.Diagnostics;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Data.SqlTypes;
+
+using DevExpress.Utils.DPI;
+using DevExpress.Utils.Helpers;
+using DevExpress.Data;
+using DevExpress.Data.Helpers;
+using DevExpress.XtraBars;
+using DevExpress.XtraBars.Navigation;
+
+using SystemX.Net;
+using SystemX.Common;
+using SystemX.Net.BaseProtocol;
+using SystemX.Net.Comm;
+using SystemX.Net.Schedule;
+using SystemX.Net.DB.LogProcess;
+using SystemX.Common.Serialization;
+using SystemX.Common.Archive;
+using SystemX.Net.Platform.Common.Util;
+using SystemX.Net.Platform.Common.ExtensionMethods;
+
+//using SystemX.Common.Protocol.SIA;
+
+using static SystemX.Net.Platform.Common.Util.LogMessage;
+using static SystemX.Net.DB.LogProcess.XLogDBConnManager;
+
+using SystemX.Net.Middleware.Log.Commons;
+using SystemX.Net.Platform.SystemX.Common;
+using System.Collections.Concurrent;
+using SystemX.Net.Comm.IIS_FTP;
+using SystemX.Net.Platform.SystemX.Net.XEFCore.DBContext.CPXV2LogJson;
+using SystemX.Net.Platform.SystemX.Net.XEFCore;
+
+namespace SystemX.Net.MiddlewareUI
+{
+ public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm
+ {
+ internal class ConnectInfoStore : ICloneable
+ {
+ ///
+ /// Last Query Info
+ ///
+ public int nLastQueryTLStepVersion;
+ public int nLastQueryTLFileNumber;
+ public int nLastQueryTLVariantNumber;
+
+ public bool bQueryVRFYLoaded;
+
+ public DataSet getLatestStepVer;
+ public DataSet geyLatestTestListInfo;
+
+ public DataSet dsLatestVRFYRel;
+ public DataSet dsLongTermLatestVRFYRel;
+
+ public object Clone()
+ {
+ return this;
+ }
+
+ public void Initialize()
+ {
+ nLastQueryTLStepVersion = int.MinValue;
+ nLastQueryTLFileNumber = int.MinValue;
+ nLastQueryTLVariantNumber = int.MinValue;
+
+ bQueryVRFYLoaded = false;
+
+ getLatestStepVer = null;
+ geyLatestTestListInfo = null;
+
+ dsLatestVRFYRel = null;
+ dsLongTermLatestVRFYRel = null;
+ }
+
+ public void InitVRFYStatus()
+ {
+ nLastQueryTLStepVersion = int.MinValue;
+ nLastQueryTLFileNumber = int.MinValue;
+ nLastQueryTLVariantNumber = int.MinValue;
+
+ bQueryVRFYLoaded = false;
+
+ getLatestStepVer = null;
+ geyLatestTestListInfo = null;
+
+ dsLatestVRFYRel = null;
+ dsLongTermLatestVRFYRel = null;
+ }
+
+ public ConnectInfoStore()
+ {
+ nLastQueryTLStepVersion = int.MinValue;
+ nLastQueryTLFileNumber = int.MinValue;
+ nLastQueryTLVariantNumber = int.MinValue;
+
+ bQueryVRFYLoaded = false;
+
+ getLatestStepVer = null;
+ geyLatestTestListInfo = null;
+
+ dsLatestVRFYRel = null;
+ dsLongTermLatestVRFYRel = null;
+ }
+ }
+
+ private const int SC_CLOSE = 0xF060;
+ private const int MF_ENABLED = 0x0;
+ private const int MF_GRAYED = 0x1;
+ private const int MF_DISABLED = 0x2;
+
+ [DllImport("user32.dll")]
+ private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
+
+ [DllImport("user32.dll")]
+ private static extern int EnableMenuItem(IntPtr hMenu, int wIDEnableItem, int wEnable);
+
+ private const int MF_BYCOMMAND = 0x00000000;
+
+ [DllImport("user32.dll")]
+ public static extern int DeleteMenu(IntPtr hMenu, int nPosition, int wFlags);
+
+ [DllImport("kernel32.dll", ExactSpelling = true)]
+ private static extern IntPtr GetConsoleWindow();
+
+ ///
+ /// Base Variable
+ ///
+ private const int ALL_MANAGE_NUM = 110;
+
+ private const int PORT_DISTRIBUTION_NUM = 10;
+
+ private COMMON.LogProcessInfo LoadInfo;
+
+ private bool MiddlewareLogStartState { set; get; }
+
+ private bool bShowCpLogProcessTime { set; get; } = false;
+
+ //RecvCommandQueue Task
+ private Stopwatch stCheckReleaseTime;
+
+ private Task taskRecvCommandProcess;
+ private bool m_bTaskCommandBlock;
+
+ //RecvStreamQueue Task
+ private Task taskRecvStreamProcess;
+ private bool m_bTaskStreamBlock;
+ //
+ CancellationTokenSource CTS;
+ CancellationToken CT;
+ //
+ private static bool bTaskCommandWaitLock = false;
+ private static bool bTaskStreamWaitLock = false;
+ //
+ //DataBase
+ private XLogDBConnManager MngDBLogConn;
+
+ private ConnectInfoStore[] thisConnInfo;
+
+ public ConcurrentQueue[] LogDataQueue;
+
+ public ConcurrentQueue LogDataRecvText;
+ public ConcurrentQueue LogDataProcessText;
+
+ private MapLogOption OptionMapLog;
+
+ private CMapParameter ParamterMapLog;
+ private CMapParameter ParamterMapInfoLog;
+
+ Int64 nEnqueueCount;
+ Int64 nDequeueCount;
+
+ private static object objMappedLogDataInOutLock = new object();
+
+ private static object objMappedLogTextInOutLock = new object();
+ private static object objMappedProcessTextInOutLock = new object();
+
+ private bool[] bBeforeLogReadyState;
+ private bool[] bCompareLogReadyState;
+
+ // TODO : for Bulk Insert Log
+ private Stopwatch stCheckTermBulkWaitTime;
+
+ private List lstBulkTermLogInfo;
+ private List lstBulkShortTermLog;
+ private List lstBulkLongTermLog;
+
+ private bool bTryBulkInsertBuffer { set; get; } = false;
+ private int nBulkLogCount { set; get; } = 0;
+ private int nBulkShortTermCount { set; get; } = 0;
+ private int nBulkLongTermCount { set; get; } = 0;
+ private long nBulkTimeValue { set; get; } = 0;
+ private long nFTPTimeValue { set; get; } = 0;
+ private bool bDatabaseConnResult { set; get; } = false;
+
+ public object GetConnectInfo(int iPos)
+ {
+ return thisConnInfo[iPos];
+ }
+
+ public XLogDBConnManager GetDBConn()
+ {
+ return MngDBLogConn;
+ }
+
+ ///
+ /// TimerLock
+ ///
+ private enum TIMER_LOCK
+ {
+ CHK_TIMER = 0,
+ UI_TIMER = 1,
+ }
+
+ private bool[] m_bTimerLock;
+ //
+ private static object objMainCommandWait = new object();
+ private static object objShortTermCommandWait = new object();
+ private static object objLongTermCommandWait = new object();
+
+ private static object objMainStreamWait = new object();
+ private static object objShortTermStreamWait = new object();
+ private static object objLongTermStreamWait = new object();
+
+ private static object objExcuteMainCommandWait = new object();
+ private static object objExcuteShortTermCommandWait = new object();
+ private static object objExcuteLongTermCommandWait = new object();
+
+ private static object objExcuteMainStreamWait = new object();
+ private static object objExcuteShortTermStreamWait = new object();
+ private static object objExcuteLongTermStreamWait = new object();
+ //
+ //private static object objSingleTransactionDataAccessWait = new object();
+
+ private static object objClearServerInstanceWait = new object();
+
+ // TODO : FTP ALIS
+ public eFTPServiceStatus StateFTP { set; get; } = eFTPServiceStatus.None;
+
+ private CtrlFTP ControlFTP;
+
+ private Stopwatch stProcessCheckFTPTime;
+
+ // TODO : SHM JSON
+ //private XEFCore CpxShorTermLogJson;
+ public MainForm()//(XEFCore cpxShorTermLogJson)
+ {
+ //CpxShorTermLogJson = cpxShorTermLogJson;
+
+ InitializeComponent();
+
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") +
+ @"Use CP-Server[X] Middleware [LOG] Version for [CPXV2][v240529] " +
+ "[SystemX.Net.Middleware.Log : MainForm]", ConsoleColor.Green, LogMessageLevel.FATAL);
+ //
+ EnableMenuItem(GetSystemMenu(this.Handle, false), SC_CLOSE, MF_GRAYED);
+
+ IntPtr hMenu = GetSystemMenu(GetConsoleWindow(), false);
+ //EnableMenuItem(hMenu, SC_CLOSE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
+ DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND);
+
+ ConsoleUtil.ConsoleHide();
+
+ MessageOutput.PrintLogLevel = LogMessageLevel.INFO;
+
+ nEnqueueCount = 0;
+ nDequeueCount = 0;
+
+ bBeforeLogReadyState = new bool[SharedMemory.nMaxInfoFullAccessSize];
+ bCompareLogReadyState = new bool[SharedMemory.nMaxInfoFullAccessSize];
+
+ CTS = new CancellationTokenSource();
+ CT = CTS.Token;
+ //
+ string strExcutePos = Environment.CurrentDirectory;
+ string strServerInfoPos = strExcutePos + @"\Configure\LogInformation.xml";
+ string strDBInfoPos = strExcutePos + @"\Configure\DBConnInfo.xml";
+ string strMapLogOptionPos = strExcutePos + @"\Configure\MapLogOption.xml";
+
+ LoadInfo = new COMMON.LogProcessInfo(strServerInfoPos);
+
+ MiddlewareLogStartState = true;
+
+ OptionMapLog = new MapLogOption(strMapLogOptionPos);
+
+ if (OptionMapLog.Load() == false)
+ {
+ MiddlewareLogStartState = false;
+
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"Failed to load map-log option information. [SystemX.Net.Middleware.UI.Log : MainForm.MainForm]", ConsoleColor.Yellow, LogMessageLevel.DEBUG);
+
+ return;
+ }
+ else
+ {
+ ParamterMapLog = new CMapParameter();
+ ParamterMapInfoLog = new CMapParameter();
+
+ ParamterMapLog.strSetEnterMutexName = OptionMapLog.strMapLogEnterMutexName;
+ ParamterMapLog.strSetAccessMutexName = OptionMapLog.strMapLogAccessMutexName;
+ ParamterMapLog.strSetPath = OptionMapLog.strMapLogPath;
+ ParamterMapLog.strSetFileName = OptionMapLog.strMapLogFileName;
+ ParamterMapLog.strSetMapName = OptionMapLog.strMapLogName;
+
+ ParamterMapInfoLog.strSetEnterMutexName = OptionMapLog.strMapInfoLogEnterMutexName;
+ ParamterMapInfoLog.strSetAccessMutexName = OptionMapLog.strMapInfoLogAccessMutexName;
+ ParamterMapInfoLog.strSetPath = OptionMapLog.strMapInfoLogPath;
+ ParamterMapInfoLog.strSetFileName = OptionMapLog.strMapInfoLogFileName;
+ ParamterMapInfoLog.strSetMapName = OptionMapLog.strMapInfoLogName;
+ }
+
+ if (LoadInfo.Load() == false)
+ {
+ MiddlewareLogStartState = false;
+
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"Failed to load server information. [SystemX.Net.Middleware.UI.Log : MainForm.MainForm]", ConsoleColor.Yellow, LogMessageLevel.DEBUG);
+
+ return;
+ }
+ else
+ {
+ string strGetTitle = this.Text;
+
+ //this.Text = strGetTitle + " " + (LoadInfo.LOOP_BACK ? " [LocalHost]" : " [" + LoadInfo.SERVER_IP + "]");
+
+ Title_label.Text = "CP ALIS" + ((LoadInfo.TITLE.Length > 0) ? " [" + LoadInfo.TITLE + "]" : "");
+ }
+
+ thisConnInfo = new ConnectInfoStore[ALL_MANAGE_NUM];
+ LogDataQueue = new ConcurrentQueue[ALL_MANAGE_NUM];
+
+ LogDataRecvText = new ConcurrentQueue();
+ LogDataProcessText = new ConcurrentQueue();
+
+ for (int i = 0; i < ALL_MANAGE_NUM; i++)
+ {
+ thisConnInfo[i] = new ConnectInfoStore();
+ LogDataQueue[i] = new ConcurrentQueue();
+ }
+
+ MngDBLogConn = new XLogDBConnManager();
+ MngDBLogConn.SetConfigFilePath(strDBInfoPos, true);
+
+ string strGetFileName = Path.GetFileName(MngDBLogConn.GetConfigFilePath());
+ string strGetFilePath = Path.GetDirectoryName(MngDBLogConn.GetConfigFilePath()).Split('\\').Last();
+
+ labelDBPath.Text = @"\" + strGetFilePath + @"\" + strGetFileName;
+
+ bDatabaseConnResult = MngDBLogConn.OpenConnection();
+
+ if (bDatabaseConnResult)
+ {
+ labelDBMain.Text = "Information [" + MngDBLogConn.GetDBConnectInfo().ConnMain.SCHEMA + "]";
+ labelDBShortTerm.Text = "ShortTerm [" + MngDBLogConn.GetDBConnectInfo().ConnShortTerm.SCHEMA + "]";
+ labelShortTermSummaryTableName.Text = "ShortTerm [" + MngDBLogConn.GetDBConnectInfo().ConnShortTerm.SUMMARY_TABLE + "]";
+ labelShortTermLogTableName.Text = "ShortTerm [" + MngDBLogConn.GetDBConnectInfo().ConnShortTerm.LOG_TABLE + "]";
+ labelDBLongTerm.Text = "LongTerm [" + MngDBLogConn.GetDBConnectInfo().ConnLongTerm.SCHEMA + "]";
+
+ panelDBMain2.BackColor = Color.LimeGreen;
+ panelDBShortTerm2.BackColor = Color.LimeGreen;
+ panelDBLongTerm2.BackColor = Color.LimeGreen;
+
+ //옵션 확인 및 ON
+ //DECLARE @ARITHABORT VARCHAR(3) = 'OFF'; IF ( (64 & @@OPTIONS) = 64 ) SET @ARITHABORT = 'ON'; SELECT @ARITHABORT AS ARITHABORT;
+ string strGetQuery1 = "DECLARE @ARITHABORT VARCHAR(3) = 'OFF'; IF ( (64 & @@OPTIONS) = 64 ) SET @ARITHABORT = 'ON'; SELECT @ARITHABORT AS ARITHABORT;";
+ string strGetQuery2 = "DECLARE @ARITHIGNORE VARCHAR(3) = 'OFF'; IF ( (128 & @@OPTIONS) = 128 ) SET @ARITHIGNORE = 'ON'; SELECT @ARITHIGNORE AS ARITHIGNORE;";
+ /*
+ SET ARITHIGNORE ON
+
+ - 쿼리 실행 중 오버플로 또는 0으로 나누기 오류에서 오류 메시지를 반환할지 여부를 제어
+
+ 오류 메시지가 반환될지 여부만 제어하며 이 설정에 상관 없이 오버플로 또는 0으로 나누기 오류를
+ 발생시킨 계산에 NULL을 반환한다. 없는 값 처리를 해야하므고 오류를 발생시킨 것에서 null 반환을 받아야 한다!
+
+ SET ARITHABORT ON이면 오버플로 또는 0으로 나누기 오류 발생 시 쿼리나 일괄 처리가 종료
+ 트랜잭션에서 해당 오류가 발생하면 트랜잭션이 롤백시킨다. 그러나 이 설정이 INSERT, UPDATE, DELETE 문 실행 중에
+ 발생한 오류에는 영향을 주지 않는다.
+ */
+ DataSet ds1 = MngDBLogConn.CurrentConnection(eConnCategory.Main).QueryDataSet(strGetQuery1);
+ DataSet ds2 = MngDBLogConn.CurrentConnection(eConnCategory.Main).QueryDataSet(strGetQuery2);
+
+ if (XCommons.isHasRow(ds1))
+ {
+ bool bOptionState = ds1.Tables[0].Rows[0]["ARITHABORT"].ToString() == "ON" ? true : false;
+
+ if (bOptionState == false)
+ MngDBLogConn.CurrentConnection(eConnCategory.Main).QueryDataSet("SET ARITHABORT ON");
+ }
+ if (XCommons.isHasRow(ds2))
+ {
+ bool bOptionState = ds2.Tables[0].Rows[0]["ARITHIGNORE"].ToString() == "ON" ? true : false;
+
+ if (bOptionState == false)
+ MngDBLogConn.CurrentConnection(eConnCategory.Main).QueryDataSet("SET ARITHIGNORE ON");
+ }
+ //
+ ds1 = MngDBLogConn.CurrentConnection(eConnCategory.ShortTerm).QueryDataSet(strGetQuery1);
+ ds2 = MngDBLogConn.CurrentConnection(eConnCategory.ShortTerm).QueryDataSet(strGetQuery2);
+
+ if (XCommons.isHasRow(ds1))
+ {
+ bool bOptionState = ds1.Tables[0].Rows[0]["ARITHABORT"].ToString() == "ON" ? true : false;
+
+ if (bOptionState == false)
+ MngDBLogConn.CurrentConnection(eConnCategory.ShortTerm).QueryDataSet("SET ARITHABORT ON");
+ }
+ if (XCommons.isHasRow(ds2))
+ {
+ bool bOptionState = ds2.Tables[0].Rows[0]["ARITHIGNORE"].ToString() == "ON" ? true : false;
+
+ if (bOptionState == false)
+ MngDBLogConn.CurrentConnection(eConnCategory.ShortTerm).QueryDataSet("SET ARITHIGNORE ON");
+ }
+ //
+ ds1 = MngDBLogConn.CurrentConnection(eConnCategory.LongTerm).QueryDataSet(strGetQuery1);
+ ds2 = MngDBLogConn.CurrentConnection(eConnCategory.LongTerm).QueryDataSet(strGetQuery2);
+
+ if (XCommons.isHasRow(ds1))
+ {
+ bool bOptionState = ds1.Tables[0].Rows[0]["ARITHABORT"].ToString() == "ON" ? true : false;
+
+ if (bOptionState == false)
+ MngDBLogConn.CurrentConnection(eConnCategory.LongTerm).QueryDataSet("SET ARITHABORT ON");
+ }
+ if (XCommons.isHasRow(ds2))
+ {
+ bool bOptionState = ds2.Tables[0].Rows[0]["ARITHIGNORE"].ToString() == "ON" ? true : false;
+
+ if (bOptionState == false)
+ MngDBLogConn.CurrentConnection(eConnCategory.LongTerm).QueryDataSet("SET ARITHIGNORE ON");
+ }
+
+ if (MiddlewareLogStartState == false)
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"The table registered in the configuration file does not exist in the actual database. [SystemX.Net.MiddlewareUI : MainForm.MainForm]", ConsoleColor.Yellow, LogMessageLevel.DEBUG);
+ }
+ else
+ {
+ panelDBMain2.BackColor = Color.Red;
+ panelDBShortTerm2.BackColor = Color.Red;
+ panelDBLongTerm2.BackColor = Color.Red;
+
+ MiddlewareLogStartState = false;
+
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"Failed to connect to DB and to get table information. [SystemX.Net.MiddlewareUI : MainForm.MainForm]", ConsoleColor.Yellow, LogMessageLevel.DEBUG);
+
+ return;
+ }
+
+ m_bTimerLock = new bool[10];
+ Array.Clear(m_bTimerLock, 0, 10);
+
+ if (LoadInfo.FTP_Use)
+ {
+ panelFTP.Visible = true;
+ labelFTP.Text = "FTP " + IPAddress.Parse(LoadInfo.FTP_IPAddress).ToString() + "@" + LoadInfo.FTP_Port + "@" + LoadInfo.FTP_Account;
+ labelFTPTime.Visible = true;
+
+ StateFTP = StartFTPService();
+
+ if (StateFTP == eFTPServiceStatus.Connected)
+ {
+ stProcessCheckFTPTime = new Stopwatch();
+ stProcessCheckFTPTime.Start();
+
+ panelFTP.BackColor = Color.LimeGreen;
+ }
+ else
+ {
+ if (MessageBox.Show("FTP server connection is not confirmed. Do you still want to proceed with running the middleware log handler?", "SystemX.Net.Middleware.UI.Log", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
+ MiddlewareLogStartState = false;
+
+ panelFTP.BackColor = Color.Red;
+ }
+ }
+ else
+ StateFTP = eFTPServiceStatus.Unused;
+
+ if (MiddlewareLogStartState)
+ {
+ stCheckTermBulkWaitTime = new Stopwatch();
+
+ lstBulkTermLogInfo = new List();
+ lstBulkShortTermLog = new List();
+ lstBulkLongTermLog = new List();
+
+ stCheckReleaseTime = new Stopwatch();
+ stCheckReleaseTime.Start();
+
+ taskRecvCommandProcess = null;
+ m_bTaskCommandBlock = false;
+
+ taskRecvCommandProcess = new Task(new Action(WatchRecvCommandQueue), CT);
+ taskRecvCommandProcess.Start();
+ //
+ taskRecvStreamProcess = null;
+ m_bTaskStreamBlock = false;
+
+ taskRecvStreamProcess = new Task(new Action(WatchRecvStreamQueue), CT);
+ taskRecvStreamProcess.Start();
+ //
+ UItimer.Enabled = true;
+
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"MiddlewareUI start success. [SystemX.Net.MiddlewareUI : MainForm.MainForm]", ConsoleColor.White, LogMessageLevel.INFO);
+ }
+
+ Chktimer.Enabled = true;
+ }
+
+ private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
+ {
+ if (MiddlewareLogStartState == true)
+ {
+ if (MessageBox.Show("You want to program exit?", "SystemX.Net.Middleware.UI.Log", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
+ e.Cancel = true;
+ else
+ e.Cancel = false;
+ }
+ else
+ e.Cancel = false;
+ }
+
+ private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
+ {
+ CTS.Cancel();
+
+ if (taskRecvCommandProcess != null)
+ {
+ m_bTaskCommandBlock = true;
+
+ taskRecvCommandProcess.Wait();
+ taskRecvCommandProcess.ContinueWith(t => {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") +
+ @"taskRecvCommandProcess END. [SystemX.Net.MiddlewareUI : MainForm.MainForm_FormClosed]",
+ ConsoleColor.White,
+ LogMessageLevel.DEBUG);
+ });
+ }
+
+ if (taskRecvStreamProcess != null)
+ {
+ m_bTaskStreamBlock = true;
+
+ taskRecvStreamProcess.Wait();
+ taskRecvStreamProcess.ContinueWith(t => {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") +
+ @"taskRecvStreamProcess END. [SystemX.Net.MiddlewareUI : MainForm.MainForm_FormClosed]",
+ ConsoleColor.White,
+ LogMessageLevel.DEBUG);
+ });
+ }
+ }
+
+ private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
+ {
+ if (this.Visible)
+ this.Visible = false;
+ else
+ this.Visible = true;
+ }
+
+ private void label1_DoubleClick(object sender, EventArgs e)
+ {
+ ConsoleUtil.ConsoleVisibleControl();
+ }
+
+ private void contextMenuSubStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
+ {
+ ToolStripItem tsi = e.ClickedItem;
+
+ this.Close();
+ }
+
+ private void barCheckItemShowCpLogTime_CheckedChanged(object sender, ItemClickEventArgs e)
+ {
+ bShowCpLogProcessTime = barCheckItemShowCpLogTime.Checked;
+ }
+
+ private void buttonBulkInsertStart_Click(object sender, EventArgs e)
+ {
+ if (bTryBulkInsertBuffer == false)
+ bTryBulkInsertBuffer = true;
+ }
+
+ private void buttonDbConnect_Click(object sender, EventArgs e)
+ {
+ bDatabaseConnResult = MngDBLogConn.CheckDatabaseConnection();
+ }
+ }
+}
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/MainForm.resx b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/MainForm.resx
new file mode 100644
index 0000000..61edbda
--- /dev/null
+++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/MainForm.resx
@@ -0,0 +1,973 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+
+ AAABAAUAEBAAAAEAIABoBAAAVgAAABgYAAABACAAiAkAAL4EAAAgIAAAAQAgAKgQAABGDgAAMDAAAAEA
+ IACoJQAA7h4AAAAAAAABACAAQUMAAJZEAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAADDDgAAww4AAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAMAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAA
+ AAQAAAAEAAAABAAAAAQAAAACAAAAAQAAABIAAAAmAAAALQAAAC0AAAAtAAAALQAAAC0AAAAtAAAALQAA
+ AC0AAAAtAAAALQAAAC0AAAAqAAAAGwAAAAfQz8+MsK+uo6urq6urq6urrKysq6ysrKusrKyrrKysq6ys
+ rKusrKyrrKysq6usrKusrKysoKCgoC4uLk0AAAAS+vj4/76onf/p4t7//Pr6//Pv7v/28/H/9fLw//Pu
+ 7P/z7+3/8+7s//Lu7P/39PP//////+/v7+9NTU1mAAAAF//////BrKL/tp6S/9bIwv+RbVv/rpOG/5t6
+ av+ggXL/nXxs/6GBcv+lhnj/o4V2/9fJw//w8PDvTExMZwAAABf/////7+rn/5x7bP/bz8n/m3lp/8i2
+ rf+beWn/6eLf/6qOgP/Vx8H/4dfT/6qOgP+vlIb/7/Dw701NTWcAAAAX//////////+8pZv/jmhW/6uP
+ gf/o4d3/nXxs//Tx7/+1nZH/x7Wr/5t5af+0m4//6ODc//Dw8O9MTExnAAAAF///////////6+Th/4lh
+ Tv/Zzcb/7ujl/6KCc//18vH/uLTg/8m/yv+cemn/uKGW/7ylmv/Uy8buUlNUYwAAABX///////////38
+ /P/e087/+fj3//v5+P/o4Nz//Pz8/+Hg9v/z8vr/5dzX/9HCuv/Sw7z/493Z6WxtbkoAAAAN////Y///
+ /2P///9j////Y////2P///9j////Y////2P///9j////Y////2P///9j////ZPr6+lmbm5sUAAAAAgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP//AAD//wAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAD//wAA//8AAP//AAAoAAAAGAAAADAAAAABACAAAAAAAAAJAADDDgAAww4AAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA
+ AAQAAAAFAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAA
+ AAYAAAAGAAAABgAAAAYAAAAFAAAABAAAAAIAAAAAAAAACwAAABYAAAAeAAAAIQAAACEAAAAhAAAAIQAA
+ ACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAeAAAAFgAA
+ AAoAAAADDg4OHwcHBzsFBgZQBQUFVgUFBVYFBQVWBQUFVgUFBVYFBQVWBQUFVgUFBVYFBQVWBQUFVgUF
+ BVYFBQVWBQUFVgUFBVYFBQVWBQUFVgUFBVYFBQVQAQEBOgAAABsAAAAH6+vrstnZ2cDPz8/KzMzMzcvL
+ y83Ly8vNy8vLzcvLy83Ly8vNy8vLzcvLy83Ly8vNy8vLzcvLy83Ly8vNy8vLzcvLy83Ly8vNy8vLzczM
+ zM6/v7+/NDQ0ZAAAACkAAAAL/////+Tb1v+4n5P/8u3r////////////////////////////////////
+ ///////////////////////////////////////////////////v7+/vRkZGdQAAAC8AAAAN/////+zm
+ 4/+EW0f/wKug///////g1dD/xrOq/8i1rP/azcj/0MC4/8azqv/Gs6r/xrOq/8ezq//Gs6r/xrOq/8az
+ qv/Zzcb/+ff2///////u7u7vREREdwAAADAAAAAO//////////+5oZb/imNQ/+/q5/+2npL/gVdD/3BB
+ Kv+8ppv/gFZB/4NZRv+Qa1r/i2VS/4piUP+Qaln/kGpa/5BrWf+DWkb/spiL//38/P/v7+/vREREdwAA
+ ADAAAAAO///////////r5OH/glhF/8Swp//6+fj/poh6/5FsW//j2tX/gVVB/8y6sv/8+vr/u6Sa/6WI
+ ef/28/H/+fj3//by8f+3n5P/g1lF//Pv7P/v8PDvREREdwAAADAAAAAO////////////////r5WI/49p
+ V//c0Mr/gVdD/8u6sv/u6Ob/gFVB/9DAuf//////rZOG/5FuXP/08O//vqid/5ZzY/9/Uz//pYd4//z7
+ +v/v7+/vREREdwAAADAAAAAO////////////////5NvX/39UP/+EW0b/jWZU//Xx8P/t5+T/gFVB/9DA
+ uf//////wayg/62Rgf/SxLz/e1A6/7Sajv/Sw7v/9fHw///////u7u7vREREdwAAADAAAAAO////////
+ /////////v39/6uOgf9nNRz/wq2k///////s5uP/f1M//9C/uP//////y8jm/7+64v/UxsD/f1VA/8e0
+ q//XysP/1Ma//9rNx//o5uXuRkZGdQAAAC4AAAAN/////////////////////93SzP+Vc2H/8Ovo////
+ ///y7ev/o4R1/93SzP//////s7Hm/5mX3v/18vL/tZyQ/41nVP+LZFL/imRR/5p4Z//f2dbsT1BRaQAA
+ ACgAAAAL//////////////////////r5+P/q5OD//v7+///////+/v7/+/n4//39/P//////+/v+//r6
+ /f///////v39//bz8f/08O7/9PDu//bz8f/19PToampqTQAAABgAAAAH////jv///47///+O////jv//
+ /47///+O////jv///47///+O////jv///47///+O////jv///47///+O////jv///47///+O////jv//
+ /4/7+/t+lpaWHgAAAAYAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8AKAAAACAA
+ AABAAAAAAQAgAAAAAAAAEAAAww4AAMMOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAQAAAAFAAAABwAAAAcAAAAHAAAABwAA
+ AAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAA
+ AAcAAAAHAAAABwAAAAcAAAAHAAAABgAAAAUAAAADAAAAAQAAAAAAAAAIAAAADwAAABUAAAAZAAAAGwAA
+ ABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAA
+ ABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABoAAAAYAAAAEwAAAAwAAAAFAAAAAgAAABIAAAAiAAAAMwAA
+ ADwAAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAA
+ AD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPgAAADoAAAAvAAAAHQAAAA0AAAAEZmZmLkND
+ Q0cxMTFgKysrbikpKXIpKSlzKSkpcykpKXMpKSlzKSkpcykpKXMpKSlzKSkpcykpKXMpKSlzKSkpcykp
+ KXMpKSlzKSkpcykpKXMpKSlzKSkpcykpKXMpKSlzKSkpcykpKXMqKipxJycnaQgICE8AAAAwAAAAFQAA
+ AAf39/fU8PDw2urr6+Dn6Ojk5eXl5eTk5OXk5OTl5OTk5eTk5OXk5OTl5OTk5eTk5OXk5OTl5OTk5eTk
+ 5OXk5OTl5OTk5eTk5OXk5OTl5OTk5eTk5OXk5OTl5OTk5eTk5OXk5OTl5OTk5ebm5ubX19fVOzs7cAAA
+ AD0AAAAbAAAACf/////8+vr/zr61/8e0qv/39PP/////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////////+/v
+ 7+5DQ0N8AAAAQwAAAB4AAAAK//////7+/v+0m4//bz8n/86+tv////////////v6+f/49fT/+PX0//j1
+ 9P/6+Pf/+ff2//j29P/49vT/+Pb0//j19P/49fT/+Pb0//j29P/49fT/+PX0//j29f/+/f3/////////
+ ////////7u7u7kFBQX4AAABEAAAAHgAAAAr//////////+ff3P99UT3/lHFf//f08//59/b/rpOF/45o
+ Vv+Ra1r/lHBf/8e0q/+ihHT/j2tY/49pWP+PaVf/j2lY/5BqWP+Qaln/kGlY/49pWP+PaVj/kWxa/7KX
+ iv/o4N3////////////u7u7vQUFBfgAAAEQAAAAeAAAACv///////////v7+/7KYjf9wQCn/08S9//Ht
+ 6/+jhXb/jGZU/2k3H/+AV0L/18rD/3xQO/90RjD/k29f/5RwYP+SbVz/jWhV/5JtXP+UcWD/lHBg/5Vw
+ YP+SbVz/dUcw/49pV//v6uf//////+7u7u9BQUF+AAAARAAAAB4AAAAK////////////////5dzY/3lN
+ OP+YdmX/+PX0//38+//EsKf/bTwl/7efk//s5uP/e086/5p3Z//49vT//Pv7/9HCu/+Palj/1Ma///z7
+ +//7+vr//fz8//z7+v+zmY3/bTwk/9TGvv//////7u7u70FBQX4AAABEAAAAHgAAAAr/////////////
+ ///9/Pz/qIt9/3FBKv/ZzMb/9vPx/49qWP9/VED/6uPg/+3o5f97Tjr/nHlq//z7+///////xbOq/2o5
+ If/KubD///////Hs6v/Yy8X/vqmf/41mVP91Ri//4NXQ///////u7u7vQUFBfgAAAEQAAAAeAAAACv//
+ ///////////////////e087/dEUv/55+bv/Jt67/bz8o/7WckP//////7Obj/3tPOv+beWr//Pv7////
+ ///Fs6n/ajkg/8q6sf/s5uP/kW1b/3FBKv9xQSr/fFA7/7efk//6+fj//////+7u7u9BQUF+AAAARAAA
+ AB4AAAAK//////////////////////r5+P+ff3D/bz8n/3tPN/95TDb/49rV///////s5uP/e086/5t5
+ av/8+/v//////9TGvv+Ra1X/2c3F/8e2rf9tPCT/sJWI/9zQyv/r5OH//fz8////////////7u7u70FB
+ QX4AAABEAAAAHgAAAAr//////////////////////////9nMxv9zRC7/ZDEY/6mMfv/9/Pv//////+zm
+ 4/97Tzr/m3lq//z7+///////6ujz/8C63v/y8fn/yLWs/29AKP/Esaf/8Ovp/+/q5//u6OX/7ejk//Tx
+ 7//u7u7uQkJCfAAAAEMAAAAeAAAACv//////////////////////////+vj3/5p5aP91SDL/4NbR////
+ ////////7ebk/31RPP+ce2v//Pv7//////+6uOj/QTzA/8bE7f/s5N//jGZT/3JELf98UT3/fVI9/31S
+ Pf98UDr/qY19/+zr6u1GRkZ2AAAAPwAAABwAAAAJ////////////////////////////////zb20/6+V
+ h//8+/r////////////49fT/zLuz/9jMxf/+/v3//////+bm9/+tq+T/6ur4///////r5eL/wq6k/7GY
+ iv+xl4v/sZiL/7CWif/NvbT/8PDv61FRUWYAAAAzAAAAFwAAAAf/////////////////////////////
+ ///6+Pf/9vPx////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////39/fnbGxsTQAAAB8AAAAOAAAABf///7b///+2////tv//
+ /7b///+2////tv///7b///+2////tv///7b///+2////tv///7b///+2////tv///7b///+2////tv//
+ /7b///+2////tv///7b///+2////tv///7b///+2////t/v7+6KUlJQoAAAACwAAAAYAAAAC////Bv//
+ /wb///8G////Bv///wb///8G////Bv///wb///8G////Bv///wb///8G////Bv///wb///8G////Bv//
+ /wb///8G////Bv///wb///8G////Bv///wb///8G////Bv///wb///8G/v7+BdPT0wEAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
+ ////////////////////////AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////////////////////////////////ygA
+ AAAwAAAAYAAAAAEAIAAAAAAAACQAAMMOAADDDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAQAA
+ AAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAA
+ AAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAA
+ AAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAABAAA
+ AAUAAAAHAAAACAAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAA
+ AAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAA
+ AAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAgAAAAHAAAABQAAAAQAAAACAAAAAQAA
+ AAAAAAAFAAAACQAAAA0AAAARAAAAEwAAABUAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAA
+ ABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAA
+ ABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFQAAABMAAAARAAAADQAA
+ AAkAAAAFAAAAAwAAAAEAAAAKAAAAEQAAABoAAAAhAAAAJgAAACkAAAAqAAAAKwAAACsAAAArAAAAKwAA
+ ACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAA
+ ACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAAqAAAAKQAA
+ ACYAAAAhAAAAGgAAABEAAAAKAAAABQAAAAIAAAARAAAAHAAAACsAAAA3AAAAPwAAAEQAAABGAAAARwAA
+ AEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABHAAAARwAA
+ AEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABHAAAARwAAAEcAAABHAAAARwAA
+ AEcAAABGAAAARAAAAD8AAAA3AAAAKwAAAB0AAAAQAAAACAAAAAMAAAAVAAAAJQAAADkAAABLAAAAVwAA
+ AF4AAABhAAAAYgAAAGIAAABiAAAAYgAAAGIAAABiAAAAYgAAAGIAAABiAAAAYgAAAGIAAABiAAAAYgAA
+ AGIAAABiAAAAYgAAAGIAAABiAAAAYgAAAGIAAABiAAAAYgAAAGIAAABiAAAAYgAAAGIAAABiAAAAYgAA
+ AGIAAABiAAAAYgAAAGIAAABhAAAAXgAAAFgAAABNAAAAPAAAACkAAAAXAAAACwAAAATW1tZswMDAeaur
+ q4ibm5uVkpKSn42OjqSMjIymi4uLp4uLi6eLi4uni4uLp4uLi6eLi4uni4uLp4uLi6eLi4uni4uLp4uL
+ i6eLi4uni4uLp4uLi6eLi4uni4uLp4uLi6eLi4uni4uLp4uLi6eLi4uni4uLp4uLi6eLi4uni4uLp4uL
+ i6eLi4uni4uLp4uLi6eLi4uni4uLp4uLi6eMjIymjo6OpIWFhZgfHx9mAAAASgAAADIAAAAdAAAADQAA
+ AAb+/v78/v7+/P7+/vz+///9/////f7+//39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39
+ /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39
+ /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/v7+/u3t7etFRUV9AAAAUwAA
+ ADkAAAAgAAAADwAAAAb///////////z7+//j2tX/2MvE/+Xc2P/9/Pz/////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////////+7u
+ 7u1DQ0OCAAAAWAAAADwAAAAiAAAAEAAAAAf///////////v6+v+1nJD/dUcw/4ZeSf/f1M//////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////+3t7e1CQkKEAAAAWQAAAD0AAAAjAAAAEQAAAAf////////////////bz8n/eEo1/2Y0
+ G/+zmYz//fz8//////////////7+//v5+f/6+Pf/+vj3//r49//6+Pf/+vj3//z7+//7+fn/+vj3//r4
+ 9//6+Pf/+vj3//r49//6+Pf/+vj3//r49//6+Pf/+vj3//r49//6+Pf/+vj3//r49//6+Pf//Pv7////
+ /////////////////////////////+3t7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAAAAf/////////////
+ ///59/b/pod5/2czG/+BVkL/5NvW////////////7ejl/6uPgf+efW7/n35w/59+cP+efW//p4p9/9jL
+ xf+wl4n/nn9u/5+AcP+ff2//nn5v/59+b/+ffm//n35v/59+b/+ff3D/oH9w/6B/cP+ffnD/n35w/59+
+ cP+efm7/r5SH/9fJw//28/H//////////////////////+3t7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAA
+ AAf/////////////////////2s7I/3hLNv9oNh3/s5mM//38+///////wa6j/2s6Iv9lMRn/ZTMa/2Yz
+ G/9lMhn/lHFf/9zRy/+AVkH/ZTEY/2YyGv9lMhr/ZTEZ/2UxGf9lMhr/ZjIa/2YyGv9mMhr/ZjIa/2Uy
+ Gv9lMhr/ZjEa/2YxGv9lMhn/aDUc/3RFL/+ninz/8Ozp/////////////////+3t7e5BQUGFAAAAWgAA
+ AD4AAAAjAAAAEQAAAAf/////////////////////+ff2/6WHef9mMxv/hFtI/+nh3v/+/v7/zLyz/6aJ
+ ev+ninz/hl5L/2c0G/9uPyf/yLat/+vl4v+BVkL/ZjIa/4ZeSv+niXz/p4l8/6eKe/+miXv/o4R1/6KD
+ dP+khnn/p4p8/6eKfP+ninz/p4l8/6eKfP+ninz/lXFg/207JP9qOSD/tp6R//38+////////////+3t
+ 7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAAAAf//////////////////////////9fJxP90RjD/aTcf/7ig
+ lf/+/f3//v79//7+/f/r5eL/jmZV/2UxGP+Qa1n/8Ozq/+zl4v+BVkL/ZjIZ/7CVif/8/Pv//f38//79
+ /f/u6OX/qY1//5t7av/Ov7f//f39//39/P/9/fz//fz8//39/P/+/v3/8ezq/5l2Zv9kMRf/jmhV//Lu
+ 7P///////////+3t7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAAAAf///////////////////////////bz
+ 8v+ce2z/ZTAY/4ZcSf/r5eH////////////Fsaj/bTwk/209Jv/Fsqn//////+vk4f+AVUL/ZjEZ/7GW
+ iv/+/v7////////////m39v/e1A7/2UzGv+2n5P////////////////////////////8+/v/9PDu/59+
+ bv9kMBf/imRQ//Ht6v///////////+3t7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAAAAf/////////////
+ ///////////////////Mu7P/cUAo/2w6Iv/DrqX//////+/q5/+Palj/ZTIZ/49qWP/v6uj//////+vk
+ 4f+AVkL/ZjIa/7GWiv/+/v7////////////m39v/fFE7/2Y1G/+2n5T////////////28/H/28/J/8e1
+ rP+qjoH/lXJh/3NDLf9mMxr/qo1///v6+v///////////+3t7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAA
+ AAf////////////////////////////////z7+3/lHFf/2UwF/+MZVL/7Obk/86+t/9vPyj/bz4m/8Wy
+ qP///////////+vk4f+AVkL/ZjIa/7GWi//+/v7////////////m39v/fFE7/2Y1G/+2oJT///////Lu
+ 7P+qjX7/dkkx/2o5Iv9lMRj/ZTEY/2k2Hv+JYU3/3tTO/////////////////+3t7e5BQUGFAAAAWgAA
+ AD4AAAAjAAAAEQAAAAf/////////////////////////////////////xbGo/207JP9sOiL/sZaJ/5d1
+ Y/9lMRj/iWFP/+3n5f///////////+vk4f+AVkL/ZjIZ/7GWiv/+/v7////////////m3tr/ek85/2Qy
+ GP+2npL//////8Kvpf9tPCT/ZzUc/35TP/+Tblz/oYBw/7qjmP/n4Nz//v79/////////////////+3t
+ 7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAAAAf/////////////////////////////////////7ujl/4xl
+ U/9lMxn/c0Mq/2s6If9pNx7/tJuP//38+////////////+vk4f+BVkL/ZjIZ/7GWiv/+/v7/////////
+ ///u6eb/pYZ1/5ZyXv/NvLP//f39/6yShf9lMhj/imJP/9/V0P/18vD/+vj4///+/v//////////////
+ /////////////+3t7e5BQUGFAAAAWgAAAD4AAAAjAAAAEQAAAAf/////////////////////////////
+ /////////////8OupP9uOyT/ZjIa/2UyGv+BV0P/5dzY/////////////////+vk4f+BVkL/ZjIa/7GW
+ iv/+/v7////////////9/f3/6+jv/+Xh6//6+Pj//v39/62Thv9kMRj/lnNj//Pv7f//////////////
+ /////////////////////////////+3t7e1CQkKEAAAAWQAAAD0AAAAjAAAAEQAAAAf/////////////
+ /////////////////////////////+7n5f+MZFP/ZTIa/2g3H/+zmY3//Pz7/////////////////+vk
+ 4f+BVkP/ZjIZ/7GWiv/+/v7////////////t7fn/f3vU/2ZhzP/Qz/D//////8Owpv9rOyL/bj4m/55+
+ bv+6o5j/uqSZ/7qkmf+6pJj/u6SZ/7qkmP/Dr6X/9PDu/+7u7+1DQ0OBAAAAVwAAADsAAAAiAAAAEAAA
+ AAf////////////////////////////////////////////+/v+6o5f/aDYe/39WQf/k3Nf/////////
+ /////////////+vk4f+BVkL/ZjIZ/7GXiv/+/v7////////////g3/T/SUTC/ygit/+in+D///////Dq
+ 6P+ignT/bT0l/2YzGv9lMxr/ZTIa/2YyGv9mMxr/ZjMa/2UxGP94SzP/49rU//Dx8exHR0d7AAAAUQAA
+ ADgAAAAgAAAADwAAAAb////////////////////////////////////////////////i2dP/f1ZA/66U
+ h//8+/v///////////////////////Tx7/+7pJn/rJGD/9THv////v7////////////39/z/pKLh/4aC
+ 1//f3vT////////////y7uz/yLas/6SGdf+Vc2D/lXNh/5ZzYv+Vc2H/lXNh/5RyYP+kh3b/7ujl//Hy
+ 8upOTk5wAAAARwAAADEAAAAcAAAADQAAAAX/////////////////////////////////////////////
+ ///7+fj/ybiu/+be2f/////////////////////////////////+/v7//v7+///+/v//////////////
+ /////////Pv+//r6/f////////////////////////////r5+P/29PL/9vTy//b08v/29PL/9vTy//b0
+ 8v/49vX////+//T09OdbW1tfAAAANwAAACYAAAAWAAAACgAAAAT/////////////////////////////
+ /////////////////////////f39//7+/v//////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////f39+Rzc3NMAAAAJQAAABoAAAAPAAAABwAAAAP////v////7///
+ /+/////v////7////+/////v////7////+/////v////7////+/////v////7////+/////v////7///
+ /+/////v////7////+/////v////7////+/////v////7////+/////v////7////+/////v////7///
+ /+/////v////7////+/////v////7////+/////v////8fr6+tOVlZU3AAAAFAAAAA8AAAAJAAAABAAA
+ AAL///8y////Mv///zL///8y////Mv///zL///8y////Mv///zL///8y////Mv///zL///8y////Mv//
+ /zL///8y////Mv///zL///8y////Mv///zL///8y////Mv///zL///8y////Mv///zL///8y////Mv//
+ /zL///8y////Mv///zL///8y////Mv///zL///8y////Mv///zL///8y////Mvv7+yyrq6sKAAAAAwAA
+ AAIAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////
+ AAD///////8AAP///////wAA////////AAD///////8AAIAAAAAABwAAAAAAAAABAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAQAA////////AAD///////8AAP///////wAA////////AAD///////8AAP//
+ /////wAA////////AAD///////8AAP///////wAA////////AACJUE5HDQoaCgAAAA1JSERSAAABAAAA
+ AQAIBgAAAFxyqGYAAEMISURBVHja7b3ZdhtJmuf5N9+xryS4SJQUERmZVVk1PefMe9SD1HNNv0df1Nz1
+ nJrpqsrMyAiFJO7Yd9/NrC/MHXA4HRtJkRRlPx0IgNPhMHe4ffbZtxkgkUgkEolEIpFIJBKJRCKRSCQS
+ iUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKR
+ SCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJ
+ RCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFI
+ JBLJU0I45/y5GyGRfG9wzn3Hcf7Hx48f//u//uu//o9/+7d/GwHQAZB4l9SDZWyLH1jzOvl+5evjF9pz
+ XwiJ5DuGMMbAGCMQHT9+pOFrtif/jmifvQZ0KQAkkmeCc44wDJUgCBQAavSIO3Fy5FdS79ceMvGaZGy7
+ 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
+
+
+
+ 17, 17
+
+
+ 123, 21
+
+
+ 220, 24
+
+
+ 329, 28
+
+
+
+ AAABAAMAMDAAAAEAIACoJQAANgAAACAgAAABACAAqBAAAN4lAAAQEAAAAQAgAGgEAACGNgAAKAAAADAA
+ AABgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACyexsbsnsbq7J7G+eyexv/snsb/7J7
+ G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7
+ G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7
+ G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb57J7G6uyexsbAAAAALJ7Gyqyexvtsnsb/7J7
+ G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7
+ G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7
+ G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexvtsnsbKrJ7
+ G66yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7
+ G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7
+ G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7
+ G/+yexv/snsbrrJ7G/C3fxz/z5Yi/9mgJf/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92k
+ Jv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92k
+ Jv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92k
+ Jv/dpCb/2aAl/8+WIv+3fxz/snsb87mCHf/boSX/3qQm/96kJv/epCb/3qQm/96kJv/epCb/3qQm/96k
+ Jv/epCb/3qQm/96kJv/epCb/3qQm/96kJv/epCb/3qQm/96kJv/epCb/3qQm/96kJv/epCb/3qQm/96k
+ Jv/epCb/3qQm/96kJv/epCb/3qQm/96kJv/epCb/3qQm/96kJv/epCb/3qQm/96kJv/epCb/3qQm/96k
+ Jv/epCb/3qQm/96kJv/epCb/3qQm/96kJv/boSX/uYId/9CYI//epSb/3qUm/96lJv/epSb/3qUm/96l
+ Jv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96l
+ Jv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96l
+ Jv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/0Jgj/9ujJv/epSf/3qUn/96l
+ J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96l
+ J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96l
+ J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3KMm/96l
+ J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96l
+ J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96l
+ J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96l
+ J//epSf/3qUn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+m
+ J//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+m
+ J//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+m
+ J//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/3aUn//Xl
+ wv//////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////15cL/3aUn/9+mJ//fpif/36Yn/9+m
+ J//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/+CmJ//gpif/4KYn/+CmJ//gpif/4KYn/+Cm
+ J//gpif/26Im////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////26Im/+Cm
+ J//gpif/4KYn/+CmJ//gpif/4KYn/+CmJ//gpif/4KYn/+CmJ//gpif/4KYn/+CnKP/gpyj/4Kco/+Cn
+ KP/gpyj/4Kco/+CnKP/gpyj/2KEn////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////xpQj/8mWJP/JliT/yZYk/8iV
+ JP/my5H/2aIn/+CnKP/gpyj/4Kco/+CnKP/gpyj/4Kco/+CnKP/gpyj/4Kco/+CnKP/gpyj/4Kco/+Cn
+ KP/gpyj/4Kco/+CnKP/gpyj/4Kco/+CnKP/gpyj/2KEn////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////0pwl/9ih
+ J//YoSf/2KEn/9agJv/WoCb/3KQn/+CnKP/gpyj/4Kco/+CnKP/gpyj/4Kco/+CnKP/gpyj/4Kco/+Cn
+ KP/gpyj/4Kco/+GnKP/hpyj/4aco/+GnKP/hpyj/4aco/+GnKP/hpyj/2aEn////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////2aEn/+CmKP/u0pT////////////t0pT/36Yo/+GnKP/hpyj/4aco/+GnKP/hpyj/4aco/+Gn
+ KP/hpyj/4aco/+GnKP/hpyj/4aco/+GoKP/hqCj/4ago/+GoKP/hqCj/4ago/+GoKP/hqCj/2aIn////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////2KEm/+3SlP//////////////////////7dKU/+CnKP/hqCj/4ago/+Go
+ KP/hqCj/4ago/+GoKP/hqCj/4ago/+GoKP/hqCj/4ago/+KoKf/iqCn/4qgp/+KoKf/iqCn/4qgp/+Ko
+ Kf/iqCn/2qIn////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////6s+U/////////////////8ucM//w4sH//////+7S
+ lf/hpyn/4qgp/+KoKf/iqCn/4qgp/+KoKf/iqCn/4qgp/+KoKf/iqCn/4qgp/+KpKf/iqSn/4qkp/+Kp
+ Kf/iqSn/4qkp/+KpKf/iqSn/2qMn////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////////Pn
+ zP/RoTT/8eLB///////u05X/4agp/+KpKf/iqSn/4qkp/+KpKf/iqSn/4qkp/+KpKf/iqSn/4qkp/+Op
+ Kf/jqSn/46kp/+OpKf/jqSn/46kp/+OpKf/jqSn/2qMn////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///LnDP/8OHB///////06Mz/0qI0//Hiwf//////7tOV/+KoKf/jqSn/46kp/+OpKf/jqSn/46kp/+Op
+ Kf/jqSn/46kp/+OqKv/jqir/46oq/+OqKv/jqir/46oq/+OqKv/jqir/2qQo////////////////////
+ ///////////////////9+/f/7d26/97AfP/Uq1H/06tO/8qYJf/KmCX/06tO/9SrUf/ewHz/7d26//37
+ 9//////////////////58+X/0aE1//Diwf//////9OjM/9KiNf/x4sL//////+7Tlf/iqSr/46oq/+Oq
+ Kv/jqir/46oq/+OqKv/jqir/46oq/+SqKv/kqir/5Koq/+SqKv/kqir/5Koq/+SqKv/kqir/26Qo////
+ ////////////////////////+/fw/96/ev/OnTD/0Jsm/9WfJ//YoSj/2qIo/9ukKP/bpCj/2qIo/9ih
+ KP/Vnyf/0Jsm/86dMP/ev3r/+/fw////////////+vPm/9KiNf/w4sH///////XozP/TojX/8eLC////
+ ///v05X/46kq/+SqKv/kqir/5Koq/+SqKv/kqir/5Koq/+WqKv/lqir/5aoq/+WqKv/lqir/5aoq/+Wq
+ Kv/lqir/3KQo///////////////////////38OD/06RA/9afJ//coyj/36Yp/+KnKf/jqSr/5Kkq/+Wq
+ Kv/lqir/5Kkq/+OpKv/ipyn/36Yp/9yjKP/Wnyf/06RA//fw4P////////////rz5v/TojX/8eLB////
+ ///16Mz/1KI1//Hiwv//////79OV/+SpKv/lqir/5aoq/+WqKv/lqir/5aoq/+WrKv/lqyr/5asq/+Wr
+ Kv/lqyr/5asq/+WrKv/lqyr/3KUo///////////////////////btWH/2aIo/+GoKf/kqir/5asq/+Wr
+ Kv/lqyr/5asq/+WrKv/lqyr/5asq/+WrKv/lqyr/5asq/+SqKv/hqCn/2aIo/9u0Xv//////////////
+ ///69Ob/06M1//Hiwf//////9ejM/9SjNf/x4sL//////+/Ulf/kqir/5asq/+WrKv/lqyr/5asq/+ar
+ K//mqyv/5qsr/+arK//mqyv/5qsr/+arK//mqyv/3aUp///////////////////////YoSj/46gq/+ar
+ K//mrjX/7MRu//Ter//57dT/+vDc////////////+vDc//nt1P/03q//7MRu/+auNf/mqyv/46gq/9ih
+ KP//////////////////////9ejM/9SjNv/x4sL///////XozP/Uozb////////////w1Jb/5aor/+ar
+ K//mqyv/5qsr/+asK//mrCv/5qwr/+asK//mrCv/5qwr/+asK//mrCv/3aYp////////////////////
+ ///dpSn/5Ksr/+/Oh//9+/X///////////////////////////////////////////////////////37
+ 9f/vzof/5Ksr/92lKf////////////////////////////XozP/UpDb/8eLC////////////////////
+ ////////8NSW/+WrK//mrCv/5qwr/+esK//nrCv/56wr/+esK//nrCv/56wr/+esK//nrCv/3qYp////
+ ///////////////////dpSn/892s////////////////////////////////////////////////////
+ ////////////////////////892s/92lKf//////////////////////5cuR///////16Mz/1KM2////
+ /////////////////////////////+OpKv/nrCv/56wr/+etLP/nrSz/560s/+etLP/nrSz/560s/+et
+ LP/nrSz/3qcq///////////////////////cpzT//Pjw////////////////////////////5cyU/82a
+ J//Pmyf/z5sn/8+bJ//Pmyf/z5sn/9CcKP/Vnyn/3aUq/92nL///////////////////////0Jwo/+fN
+ kv//////////////////////////////////////6M6S/+GoK//nrSz/560s/+itLP/orSz/6K0s/+it
+ LP/orSz/6K0s/+itLP/orSz/36cq///////////////////////iumP/7tms////////////////////
+ /////////////+zRlf/epir/36cq/9+nKv/fpyr/36cq/9+nKv/gpyv/46kr/+a9ZP//////////////
+ ////////2aIp/9ihKf/nzJL////////////////////////////my5L/2KEp/+SqK//orSz/6K0s/+iu
+ LP/oriz/6K4s/+iuLP/oriz/6K4s/+iuLP/oriz/36gq///////////////////////68+P/3LFQ/+LF
+ gv/8+vX////////////////////////////x1Zb/560s/+iuLP/oriz/6K4s/+iuLP/oriz/6rtT//rz
+ 4///////////////////////3qcq/+KpK//Xoin/5syS/////////////////+bMkv/Xoin/4qkr/+et
+ LP/oriz/6K4s/+muLf/pri3/6a4t/+muLf/pri3/6a4t/+muLf/pri3/4Kgr////////////////////
+ /////////vz3/+jKif/Wpj7/3blq/+rWqf/06tT/9evW////////////78yD/+itLf/pri3/6a4t/+my
+ Of/w0Ir//vz3////////////////////////////4Kgr/+itLf/jqSz/2KIq/+bMkv//////5syS/9ii
+ Kv/jqSz/6K0t/+muLf/pri3/6a4t/+mvLf/pry3/6a8t/+mvLf/pry3/6a8t/+mvLf/pry3/4Kgr////
+ ///////////////////////////////////+/fr/8uK+/+XHgf/cs1b/2rFT/9KeK//Woiz/5blV/+u+
+ Wf/wzoP/9uW+//79+v//////////////////////////////////////4Kgr/+mvLf/ori3/46os/9mj
+ Kv/Unyn/2aMq/+OqLP/ori3/6a8t/+mvLf/pry3/6a8t/+qvLf/qry3/6q8t/+qvLf/qry3/6q8t/+qv
+ Lf/qry3/4agr////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////4agr/+qv
+ Lf/qry3/6a4t/+asLP/kqiz/5qws/+muLf/qry3/6q8t/+qvLf/qry3/6q8t/+uwLv/rsC7/67Au/+uw
+ Lv/rsC7/67Au/+uwLv/rsC7/4qks////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////4qks/+uwLv/rsC7/67Au/+uwLv/rsC7/67Au/+uwLv/rsC7/67Au/+uwLv/rsC7/67Au/+uw
+ Lv/rsC7/67Au/+uwLv/rsC7/67Au/+uwLv/rsC7/4qks////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////4qks/+uwLv/rsC7/67Au/+uwLv/rsC7/67Au/+uwLv/rsC7/67Au/+uw
+ Lv/rsC7/67Au/+yxLv/ssS7/7LEu/+yxLv/ssS7/7LEu/+yxLv/ssS7/46os////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////46os/+yxLv/ssS7/7LEu/+yxLv/ssS7/7LEu/+yx
+ Lv/ssS7/7LEu/+yxLv/ssS7/7LEu/+yxLv/ssS7/7LEu/+yxLv/ssS7/7LEu/+yxLv/ssS7/46os////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////btFz/0p4p/9OfKf/Tnyn/058p/9OfKf/Zoyr/5qwt/+yxLv/ssS7/7LEu/+yx
+ Lv/ssS7/7LEu/+yxLv/ssS7/7LEu/+yxLv/ssS7/7LEu/+2xL//tsS//7bEv/+2xL//tsS//7bEv/+2x
+ L//tsS//5Kot////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////aoyv////////////////////////////w05X/6a4u/+2x
+ L//tsS//7bEv/+2xL//tsS//7bEv/+2xL//tsS//7bEv/+2xL//tsS//7bEv/+2yL//tsi//7bIv/+2y
+ L//tsi//7bIv/+2yL//tsi//5Kst////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////dpiz//////////////////////+zR
+ lP/jqy3/67Ev/+2yL//tsi//7bIv/+2yL//tsi//7bIv/+2yL//tsi//7bIv/+2yL//tsi//7bIv/+6y
+ L//usi//7rIv/+6yL//usi//7rIv/+6yL//usi//5ast////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////dpSz/////////
+ ////////6M2T/92lLP/orS7/7bEv/+6yL//usi//7rIv/+6yL//usi//7rIv/+6yL//usi//7rIv/+6y
+ L//usi//7rIv/+6zL//usy//7rMv/+6zL//usy//7rMv/+6zL//usy//5awt////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///dpiz////////////ozpP/3aYs/+iuLv/tsi//7rMv/+6zL//usy//7rMv/+6zL//usy//7rMv/+6z
+ L//usy//7rMv/+6zL//usy//7rMv/+6zMP/uszD/7rMw/+6zMP/uszD/7rMw/+6zMP/uszD/5awu////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////dpi3//////+jOlP/dpi3/6K4v/+2yMP/uszD/7rMw/+6zMP/uszD/7rMw/+6z
+ MP/uszD/7rMw/+6zMP/uszD/7rMw/+6zMP/uszD/7rMw/++zMP/vszD/77Mw/++zMP/vszD/77Mw/++z
+ MP/vszD/560u//XnyP//////////////////////////////////////////////////////////////
+ ///////////////////////////////////fpy3/7dGU/96mLf/pri//7rIw/++zMP/vszD/77Mw/++z
+ MP/vszD/77Mw/++zMP/vszD/77Mw/++zMP/vszD/77Mw/++zMP/vszD/77Mw/++0MP/vtDD/77Qw/++0
+ MP/vtDD/77Qw/++0MP/vtDD/6rAv/96nLf/Xoiv/1qEr/9ahK//WoSv/1qEr/9ahK//WoSv/1qEr/9ah
+ K//WoSv/1qEr/9ahK//WoSv/1qEr/9ahK//WoSv/1qEr/9ymLP/krC7/5a0u/+mvL//uszD/77Qw/++0
+ MP/vtDD/77Qw/++0MP/vtDD/77Qw/++0MP/vtDD/77Qw/++0MP/vtDD/77Qw/++0MP/vtDD/77Qw//C0
+ MP/wtDD/8LQw//C0MP/wtDD/8LQw//C0MP/wtDD/7rMw/+uwL//ori7/560u/+etLv/nrS7/560u/+et
+ Lv/nrS7/560u/+etLv/nrS7/560u/+etLv/nrS7/560u/+etLv/nrS7/560u/+qvL//ssS//7rMw/++z
+ MP/wtDD/8LQw//C0MP/wtDD/8LQw//C0MP/wtDD/8LQw//C0MP/wtDD/8LQw//C0MP/wtDD/8LQw//C0
+ MP/wtDD/8LQw//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0
+ Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0
+ Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C0
+ Mf/wtDH/8LQx//C0Mf/wtDH/8LQx//C1MfDwtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1
+ Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1
+ Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1
+ Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx8/C1MavwtTH/8LUx//C1Mf/wtTH/8LUx//C1
+ Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1
+ Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1
+ Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUxrvG1MSfxtTHt8bUx//G1
+ Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1
+ Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1
+ Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTHt8bUxKgAA
+ AADxtTEb8bUxqPG1MeTxtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1
+ Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1
+ Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx5PG1
+ MajxtTEbAAAAAIAAAAAAAaiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAA
+ AAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAA
+ qIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAA
+ AAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAA
+ qIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAA
+ AAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIwAAAAAAACojAAAAAAAAKiMAAAAAAAA
+ qIwAAAAAAACojAAAAAAAAKiMAAAAAAAAqIyAAAAAAAGojCgAAAAgAAAAQAAAAAEAIAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACyexsGsnsbjbJ7G+eyexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7
+ G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7
+ G/+yexv/snsb/7J7G+eyexuNsnsbBrJ7G4eyexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7
+ G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7
+ G/+yexv/snsb/7J7G/+yexv/snsb/7J7G/+yexuKs3wb6sqSIf/ZoCX/3aQm/92kJv/dpCb/3aQm/92k
+ Jv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/dpCb/3aQm/92k
+ Jv/dpCb/3aQm/92kJv/dpCb/3aQm/92kJv/ZoCX/ypIh/7N8G+rJkSH/3qUm/96lJv/epSb/3qUm/96l
+ Jv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96l
+ Jv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96lJv/epSb/ypIh/9qiJv/epSf/3qUn/96l
+ J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96l
+ J//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//epSf/3qUn/96lJ//aoib/36Yn/9+m
+ J//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+m
+ J//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+mJ//fpif/36Yn/9+m
+ J//fpif/36Yn/9+mJ//fpif/36Yn/92lJ//15cL/////////////////////////////////////////
+ //////////////////////////////////////////////Xlwv/dpSf/36Yn/9+mJ//fpif/36Yn/9+m
+ J//fpif/36Yn/+CnKP/gpyj/4Kco/+CnKP/gpyj/26Mn////////////////////////////////////
+ /////////////////////////////////////////////////////////////9ujJ//gpyj/4Kco/+Cn
+ KP/gpyj/4Kco/+CnKP/gpyj/4aco/+GnKP/hpyj/4aco/+GnKP/ZoSf/////////////////////////
+ /////////////////////////////////////////////8eUI//JliT/yZYk/8mVJP/my5H/2qIn/+Gn
+ KP/hpyj/4aco/+GnKP/hpyj/4aco/+GnKP/hqCj/4ago/+GoKP/hqCj/4ago/9miJ///////////////
+ ////////////////////////////////////////////////////////050l/9ihJv/q0JT//////+nP
+ k//cpCf/4ago/+GoKP/hqCj/4ago/+GoKP/hqCj/4ago/+KoKf/iqCn/4qgp/+KoKf/iqCn/2qIn////
+ ///////////////////////////////////////////////////////////////////ZoSf/7tKV////
+ /////////Pjw/+3Slf/hpyn/4qgp/+KoKf/iqCn/4qgp/+KoKf/iqCn/46kp/+OpKf/jqSn/46kp/+Op
+ Kf/aoyf//////////////////////////////////////////////////////////////////////+rP
+ lP////////////jy5P/RoDT/+fHh/+7Tlf/iqCn/46kp/+OpKf/jqSn/46kp/+OpKf/kqir/5Koq/+Sq
+ Kv/kqir/5Koq/9ukKP//////////////////////////////////////////////////////////////
+ ///////////////////8+fL/0aA1//Xpz//WpDb/+fLh/+/Tlf/jqSr/5Koq/+SqKv/kqir/5Koq/+Wq
+ Kv/lqir/5aoq/+WqKv/lqir/3KQo////////////////////////////8OLE/9u5bf/VrFH/zZoq/82a
+ Kv/VrFH/27lt//DixP/////////////////68+b/2aY2//bqz//XpDb/+fLh/+/Tlf/kqSr/5aoq/+Wq
+ Kv/lqir/5asr/+WrK//lqyv/5asr/+WrK//cpSn/////////////////+vbt/9auVP/RnCf/1qAo/9qj
+ Kf/cpCn/3KQp/9qjKf/WoCj/0Zwn/9exXP/8+fL////////////69Ob/2ac3//bqz//XpTf/+fLh/+/U
+ lv/kqiv/5asr/+WrK//mrCv/5qwr/+asK//mrCv/5qwr/92mKf/////////////////duWj/2KIo/9+n
+ Kv/jqSr/5Ksr/+WrK//lqyv/5Ksr/+OpKv/fpyr/2KIo/9y4Zv/////////////////69Ob/2qg3//bq
+ z//Ypjf//Pjw//DUlv/lqyv/5qwr/+etLP/nrSz/560s/+etLP/nrSz/3qcq/////////////////9ii
+ Kf/jqiv/6r9e//Terf/579f////////////579f/9N6t/+q/Xv/jqiv/2KIp/////////////////+jN
+ kv/69Ob/26k4//rz5f///////////+OqK//nrSz/6K0s/+itLP/orSz/6K0s/+itLP/fpyr/////////
+ ////////3qUq//DSkf////////////////////////////////////////////DSkf/epSr/////////
+ ////////054o/+vPk//9+fL////////////pzpL/4qgr/+itLP/priz/6a4s/+muLP/priz/6a4s/+Co
+ Kv////////////7+/P/dpSr//fv1/////////////////+fPmf/Qmyf/0Z0o/9SeKP/Yoin/4Kgq/9+m
+ Kv/////////////////bpCn/26Qp/+nOkv//////5syS/9miKf/lqyv/6a4s/+mvLf/pry3/6a8t/+mv
+ Lf/pry3/4Kgr/////////////////+O6X//pzZD//////////////////////+7Um//fqCv/4Kgr/+Kq
+ LP/lrCz/6MFp/////////////////9+oK//jqiz/2qQq/9SfKf/Zoyr/46os/+iuLf/pry3/6q8t/+qv
+ Lf/qry3/6q8t/+qvLf/hqCv//////////////////Pjw/+K4Xv/cs1v/69er//Xq1P/+/fr//v36/+/O
+ hf/pri3/6a4t/+zBYP/8+fD/////////////////4agr/+muLf/mrCz/5Kos/+asLP/pri3/6q8t/+qv
+ Lf/rsC7/67Au/+uwLv/rsC7/67Au/+KpLP////////////////////////////TkwP/jvm7/3LFS/9Oe
+ Kf/Yoir/5rhU/+7GcP/35sH////////////////////////////iqSz/67Au/+uwLv/rsC7/67Au/+uw
+ Lv/rsC7/67Au/+yxLv/ssS7/7LEu/+yxLv/ssS7/46os////////////////////////////////////
+ /////////////////////////////////////////////////////////////+OqLP/ssS7/7LEu/+yx
+ Lv/ssS7/7LEu/+yxLv/ssS7/7bEv/+2xL//tsS//7bEv/+2xL//kqi3/////////////////////////
+ ////////////////////////////////////////////////////////////////////////5Kot/+2x
+ L//tsS//7bEv/+2xL//tsS//7bEv/+2xL//tsi//7bIv/+2yL//tsi//7bIv/+SrLf//////////////
+ /////////////////////////////////////////////////////////////9y0XP/Tnyr/1J8q/9qk
+ K//nrS7/7bIv/+2yL//tsi//7bIv/+2yL//tsi//7bIv/+6zL//usy//7rMv/+6zL//usy//5awt////
+ ////////////////////////////////////////////////////////////////////////3aYs/+Ss
+ Lf/lrC3/6K4u/+yyL//usy//7rMv/+6zL//usy//7rMv/+6zL//usy//77Mw/++zMP/vszD/77Mw/++z
+ MP/mrC7/////////////////////////////////////////////////////////////////////////
+ ///lrC7/7rIw/++zMP/vszD/77Mw/++zMP/vszD/77Mw/++zMP/vszD/77Mw/++zMP/vtDD/77Qw/++0
+ MP/vtDD/77Qw/+euLv/158j/////////////////////////////////////////////////////////
+ /////////////+atLv/vtDD/77Qw/++0MP/vtDD/77Qw/++0MP/vtDD/77Qw/++0MP/vtDD/77Qw//C0
+ MP/wtDD/8LQw//C0MP/wtDD/67Av/9+nLf/Yoiv/16Er/9ehK//XoSv/16Er/9ehK//XoSv/16Er/9eh
+ K//XoSv/16Er/9ehK//dpiz/6q8v//C0MP/wtDD/8LQw//C0MP/wtDD/8LQw//C0MP/wtDD/8LQw//C0
+ MP/wtDD/8LUx6vC1Mf/wtTH/8LUx//C1Mf/utDH/67Ew/+ivL//nri//564v/+euL//nri//564v/+eu
+ L//nri//564v/+euL//nri//564v/+qwMP/utDH/8LUx//C1Mf/wtTH/8LUx//C1Mf/wtTH/8LUx//C1
+ Mf/wtTH/8LUx//C1MerxtTGH8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1
+ Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1
+ Mf/xtTH/8bUx//G1Mf/xtTH/8bUxh/G1MQbxtTGE8bUx5PG1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1
+ Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1
+ Mf/xtTH/8bUx//G1Mf/xtTH/8bUx5PG1MYTxtTEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAEAAAACAAAAABACAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAsnsbSLJ7G+eyexv/snsb/7J7G/+yexv/snsb/7J7G/+yexv/snsb/7J7
+ G/+yexv/snsb/7J7G/+yexvnsnsbSL+IHuzaoSX/3qUm/96lJv/epSb/3qUm/96lJv/epSb/3qUm/96l
+ Jv/epSb/3qUm/96lJv/epSb/2qEl/7+IHuzaoSb/36Yn//79+///////////////////////////////
+ ///////////////////fpif/36Yn/9+mJ//aoSb/4Kco/+CnKP/+/fv/////////////////////////
+ ///KlyT/ypck/8qXJP/kypD/4Kco/+CnKP/gpyj/4Kco/+GoKP/hqCj//v37////////////////////
+ ////////4ago/+GoKP/pvl//1qAm/+GoKP/hqCj/4ago/+GoKP/jqSn/46kp//79+///////////////
+ /////////////+OpKf/x1ZX///////HVlf/jqSn/46kp/+OpKf/jqSn/5aoq/+WqKv/+/fv/////////
+ ////////////////////////////////////////8tWW/+WqKv/lqir/5aoq/+asK//mrCv//v37////
+ ///r06H/2K1N/9CbJ//YrU3/69Oh///////////////////////z1pb/5qwr/+asK//orSz/6K0s//79
+ +//p0Jr/4rVV//ns0P//////+ezQ/+K1Vf/ozZL///////////////////////TWl//orSz/6a8t/+mv
+ Lf/+/fv/4K08//z05P/////////////////89OT/4a48////////////////////////////6a8t/+uw
+ Lv/rsC7//v37/+u2P//68+P//////9SfKv/Unyr/16Eq/+u2P////////////+nOk///////6c6T/+uw
+ Lv/tsS//7bEv//79+//23KL/4LJQ//Hguf/tsS//7bEv/+2xL//12Jj////////////hqC3/1qAr/+Go
+ Lf/tsS//7rMv/+6zL//+/fv///////bepv/luFT/7rMv//HBVv/436f/////////////////7rMv/+6z
+ L//usy//7rMv/++0MP/vtDD//v37/////////////////////////////////////////////////++0
+ MP/vtDD/77Qw/++0MP/vtDDt8LUx/9mkLP/Zoyz/2aMs/9mjLP/Zoyz/2aMs/9mjLP/Zoyz/2aMs/9mj
+ LP/wtTH/8LUx//C1Mf/vtDDt8bUxP/G1McnxtTH/8bUx//G1Mf/xtTH/8bUx//G1Mf/xtTH/8bUx//G1
+ Mf/xtTH/8bUx//G1Mf/xtTHJ8bUxPwAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAA
+ rEEAAKxBAACsQQAArEEAAKxBAACsQQAArEE=
+
+
+
\ No newline at end of file
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Program.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Program.cs
new file mode 100644
index 0000000..f39e6f9
--- /dev/null
+++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Program.cs
@@ -0,0 +1,57 @@
+using Microsoft.Extensions.DependencyInjection;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Threading;
+using System.Windows.Forms;
+using SystemX.Net.Platform.SystemX.Net.XEFCore;
+using SystemX.Net.Platform.SystemX.Net.XEFCore.DBContext.CPXV2Log;
+using SystemX.Net.Platform.SystemX.Net.XEFCore.DBContext.CPXV2LogJson;
+
+namespace SystemX.Net.MiddlewareUI
+{
+ static class Program
+ {
+ ///
+ /// The main entry point for the application.
+ ///
+ [STAThread]
+ static void Main()
+ {
+ bool bCreateProgram = false;
+
+ Mutex SetMutex = new Mutex(true, "SystemX.Net.Middleware.UI.Log CPXV2", out bCreateProgram);
+
+ if (bCreateProgram)
+ {
+ //종속성 주입
+ /*
+ ServiceCollection collection = new ServiceCollection();
+ collection.AddSingleton>();
+ collection.AddSingleton();
+
+ ServiceProvider provider = collection.BuildServiceProvider();
+ var shortTermJson = provider.GetService>();
+ shortTermJson.SetConnectionString("Server=127.0.0.1;Database=CPXV2ShortTermLogJson;User Id=Alis;Password=Kefico!@34;");
+
+
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(provider.GetService());
+ */
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(new MainForm());
+
+ SetMutex.ReleaseMutex();
+ }
+ else
+ {
+ MessageBox.Show("[SystemX.Net.Middleware.UI.Log CPXV2] Already this program excute now. Check the process.", "SystemX.Net.Middleware.UI.Log", MessageBoxButtons.OK, MessageBoxIcon.Information);
+
+ return;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/AssemblyInfo.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..5f9d5c0
--- /dev/null
+++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/AssemblyInfo.cs
@@ -0,0 +1,32 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("SystemX.Net.MiddlewareUI")]
+[assembly: AssemblyDescription("SystemX")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("SystemX")]
+[assembly: AssemblyProduct("SystemX.Net.MiddlewareUI")]
+[assembly: AssemblyCopyright("Copyright © 2022")]
+[assembly: AssemblyTrademark("CP-ServerX")]
+[assembly: AssemblyCulture("")]
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("83f9d8f8-1fc1-4c57-bef0-9b0f33d4ff9e")]
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("20.22.11.29")]
+[assembly: AssemblyFileVersion("20.22.11.29")]
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Resources.Designer.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..d5fe1d7
--- /dev/null
+++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Resources.Designer.cs
@@ -0,0 +1,193 @@
+//------------------------------------------------------------------------------
+//
+// 이 코드는 도구를 사용하여 생성되었습니다.
+// 런타임 버전:4.0.30319.42000
+//
+// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
+// 이러한 변경 내용이 손실됩니다.
+//
+//------------------------------------------------------------------------------
+
+namespace SystemX.Net.MiddlewareUI.Log.Properties {
+ using System;
+
+
+ ///
+ /// 지역화된 문자열 등을 찾기 위한 강력한 형식의 리소스 클래스입니다.
+ ///
+ // 이 클래스는 ResGen 또는 Visual Studio와 같은 도구를 통해 StronglyTypedResourceBuilder
+ // 클래스에서 자동으로 생성되었습니다.
+ // 멤버를 추가하거나 제거하려면 .ResX 파일을 편집한 다음 /str 옵션을 사용하여 ResGen을
+ // 다시 실행하거나 VS 프로젝트를 다시 빌드하십시오.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.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() {
+ }
+
+ ///
+ /// 이 클래스에서 사용하는 캐시된 ResourceManager 인스턴스를 반환합니다.
+ ///
+ [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("SystemX.Net.MiddlewareUI.Log.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// 이 강력한 형식의 리소스 클래스를 사용하여 모든 리소스 조회에 대해 현재 스레드의 CurrentUICulture 속성을
+ /// 재정의합니다.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
+ ///
+ internal static System.Drawing.Bitmap ALIS {
+ get {
+ object obj = ResourceManager.GetObject("ALIS", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
+ ///
+ internal static System.Drawing.Bitmap AppIcon {
+ get {
+ object obj = ResourceManager.GetObject("AppIcon", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
+ ///
+ internal static System.Drawing.Bitmap AppIcon1 {
+ get {
+ object obj = ResourceManager.GetObject("AppIcon1", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
+ ///
+ internal static System.Drawing.Bitmap Bubble_16x16 {
+ get {
+ object obj = ResourceManager.GetObject("Bubble_16x16", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
+ ///
+ internal static System.Drawing.Bitmap Bubble_32x32 {
+ get {
+ object obj = ResourceManager.GetObject("Bubble_32x32", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
+ ///
+ internal static System.Drawing.Bitmap Cancel_16x16 {
+ get {
+ object obj = ResourceManager.GetObject("Cancel_16x16", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
+ ///
+ internal static System.Drawing.Bitmap Cancel_32x32 {
+ get {
+ object obj = ResourceManager.GetObject("Cancel_32x32", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
+ ///
+ internal static System.Drawing.Bitmap CI {
+ get {
+ object obj = ResourceManager.GetObject("CI", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
+ ///
+ internal static System.Drawing.Bitmap Database_16x16 {
+ get {
+ object obj = ResourceManager.GetObject("Database_16x16", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
+ ///
+ internal static System.Drawing.Bitmap Database_32x32 {
+ get {
+ object obj = ResourceManager.GetObject("Database_32x32", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
+ ///
+ internal static System.Drawing.Bitmap Kefico_CI {
+ get {
+ object obj = ResourceManager.GetObject("Kefico_CI", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
+ ///
+ internal static System.Drawing.Bitmap Publish_16x16 {
+ get {
+ object obj = ResourceManager.GetObject("Publish_16x16", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
+ ///
+ internal static System.Drawing.Bitmap Publish_32x32 {
+ get {
+ object obj = ResourceManager.GetObject("Publish_32x32", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+ }
+}
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Resources.resx b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Resources.resx
new file mode 100644
index 0000000..f60e153
--- /dev/null
+++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Resources.resx
@@ -0,0 +1,160 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\Resources\Bubble_32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\Database_16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\ALIS.PNG;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\Cancel_16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\AppIcon.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\Cancel_32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\Publish_32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\Kefico CI.PNG;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\Publish_16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\CI.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\Bubble_16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\Database_32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\AppIcon1.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Settings.Designer.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..ea38265
--- /dev/null
+++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Settings.Designer.cs
@@ -0,0 +1,26 @@
+//------------------------------------------------------------------------------
+//
+// 이 코드는 도구를 사용하여 생성되었습니다.
+// 런타임 버전:4.0.30319.42000
+//
+// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
+// 이러한 변경 내용이 손실됩니다.
+//
+//------------------------------------------------------------------------------
+
+namespace SystemX.Net.MiddlewareUI.Log.Properties {
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.10.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default {
+ get {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Settings.settings b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Settings.settings
new file mode 100644
index 0000000..8e615f2
--- /dev/null
+++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/Settings.settings
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/licenses.licx b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/licenses.licx
new file mode 100644
index 0000000..2ee4d98
--- /dev/null
+++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Properties/licenses.licx
@@ -0,0 +1 @@
+DevExpress.XtraEditors.ProgressBarControl, DevExpress.XtraEditors.v20.2, Version=20.2.6.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/ALIS.PNG b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/ALIS.PNG
new file mode 100644
index 0000000..cd68b96
Binary files /dev/null and b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/ALIS.PNG differ
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/AppIcon.ico b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/AppIcon.ico
new file mode 100644
index 0000000..cbb016c
Binary files /dev/null and b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/AppIcon.ico differ
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/AppIcon1.ico b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/AppIcon1.ico
new file mode 100644
index 0000000..cbb016c
Binary files /dev/null and b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/AppIcon1.ico differ
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Bubble_16x16.png b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Bubble_16x16.png
new file mode 100644
index 0000000..53772d2
Binary files /dev/null and b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Bubble_16x16.png differ
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Bubble_32x32.png b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Bubble_32x32.png
new file mode 100644
index 0000000..720bc52
Binary files /dev/null and b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Bubble_32x32.png differ
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/CI.png b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/CI.png
new file mode 100644
index 0000000..c993fbf
Binary files /dev/null and b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/CI.png differ
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Cancel_16x16.png b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Cancel_16x16.png
new file mode 100644
index 0000000..bb13117
Binary files /dev/null and b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Cancel_16x16.png differ
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Cancel_32x32.png b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Cancel_32x32.png
new file mode 100644
index 0000000..95e1e95
Binary files /dev/null and b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Cancel_32x32.png differ
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Database_16x16.png b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Database_16x16.png
new file mode 100644
index 0000000..25372a5
Binary files /dev/null and b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Database_16x16.png differ
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Database_32x32.png b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Database_32x32.png
new file mode 100644
index 0000000..fee0e48
Binary files /dev/null and b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Database_32x32.png differ
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Kefico CI.PNG b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Kefico CI.PNG
new file mode 100644
index 0000000..ed53c82
Binary files /dev/null and b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Kefico CI.PNG differ
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Publish_16x16.png b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Publish_16x16.png
new file mode 100644
index 0000000..b209fdd
Binary files /dev/null and b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Publish_16x16.png differ
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Publish_32x32.png b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Publish_32x32.png
new file mode 100644
index 0000000..e2c5c03
Binary files /dev/null and b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Resources/Publish_32x32.png differ
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/CPXV2_CpLogProcess.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/CPXV2_CpLogProcess.cs
new file mode 100644
index 0000000..b26ee76
--- /dev/null
+++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/CPXV2_CpLogProcess.cs
@@ -0,0 +1,1371 @@
+using DevExpress.Data.Helpers;
+using DevExpress.XtraBars;
+using DevExpress.XtraBars.Navigation;
+
+using System;
+using System.Net;
+using System.Net.Sockets;
+using System.Runtime.InteropServices;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Data.SqlClient;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using System.Xml.Linq;
+using System.IO;
+using System.Diagnostics;
+using System.Threading;
+using System.Reflection;
+using System.Threading.Tasks;
+
+using SystemX.Net.Platform.Common.ExtensionMethods;
+using SystemX.Net;
+using SystemX.Common;
+using SystemX.Net.BaseProtocol;
+using SystemX.Net.Comm;
+using SystemX.Net.Schedule;
+using SystemX.Net.DB.LogProcess;
+using SystemX.Common.Serialization;
+using SystemX.Common.Archive;
+
+using static SystemX.Net.Platform.Common.Util.LogMessage;
+using static SystemX.Net.DB.LogProcess.XLogDBConnManager;
+using SystemX.Net.Platform.SystemX.Common;
+using SystemX.Net.Middleware.Log.Commons;
+using SystemX.Net.Platform.SystemX.Net.XEFCore.DBContext.CPXV2LogJson;
+
+using CPXV2Log = SystemX.Net.Platform.SystemX.Net.XEFCore.DBContext.CPXV2Log;
+using CPXV2LogJson = SystemX.Net.Platform.SystemX.Net.XEFCore.DBContext.CPXV2LogJson;
+using Newtonsoft.Json;
+using SystemX.Common.Util;
+using CpTesterPlatform.CpLogUtil;
+
+namespace SystemX.Net.MiddlewareUI
+{
+ public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm
+ {
+ static internal class CPXV2_CpLogProcessInfo
+ {
+ static public string strProcessDebugInfo = string.Empty;
+ static public string strGetFileName = string.Empty;
+
+ //Summary 삽입 정보 생성
+ static public string strHostID = string.Empty;
+ static public string strSection = string.Empty;
+ static public string strStationID = string.Empty;
+ static public Int64 nShortTermIdent = int.MaxValue;
+ static public Int64 nLongTermIdent = int.MaxValue;
+ static public string strStationName = string.Empty;
+ static public string strProdNo_P = string.Empty;
+ static public string strProdNo_C = string.Empty;
+ static public string strTestType = string.Empty;
+ static public string strTestCode = string.Empty;
+ static public string strVersion = string.Empty;
+ static public string strProdCode = string.Empty;
+ static public string strTestListCntID = string.Empty;
+
+ static public int nTestListFileNo = int.MaxValue;
+ static public int nTestListVariantNo = int.MaxValue;
+ static public int nTestListReleaseNo = int.MaxValue;
+
+ static public string strCpLogFileComment = string.Empty;
+
+ static public Dictionary dicCpLogHeader = new Dictionary();
+
+ static public int nGetReadStepVersion = int.MaxValue;
+
+ /*
+ * CpLog Header 상 검사 시작 시간 획득 및 맨앞 공백 제거
+ */
+ static public string strStTime = string.Empty;
+
+ static public long lMainMeasTime = 0;
+ static public long lLongTermMeasTime = 0;
+ }
+
+ private DataTable CPXV2_MakeCpLogTable()
+ {
+ // Create a new DataTable titled 'Names.'
+ DataTable logTable = new DataTable("CpLogProcTestResult");
+
+ // Add three column objects to the table.
+ DataColumn Column0 = new DataColumn();
+ Column0.DataType = System.Type.GetType("System.Int64");
+ Column0.ColumnName = "No";
+ Column0.AutoIncrement = true;
+ Column0.AllowDBNull = false;
+ logTable.Columns.Add(Column0);
+
+ DataColumn Column3 = new DataColumn();
+ Column3.DataType = System.Type.GetType("System.Int64");
+ Column3.ColumnName = "StepID";
+ Column3.AllowDBNull = false;
+ logTable.Columns.Add(Column3);
+
+ DataColumn Column4 = new DataColumn();
+ Column4.DataType = System.Type.GetType("System.Decimal");
+ Column4.ColumnName = "MeasVal";
+ Column4.AllowDBNull = true;
+ logTable.Columns.Add(Column4);
+
+ DataColumn Column5 = new DataColumn();
+ Column5.DataType = System.Type.GetType("System.String");
+ Column5.ColumnName = "MeasValStr";
+ Column5.AllowDBNull = true;
+ logTable.Columns.Add(Column5);
+
+ DataColumn Column6 = new DataColumn();
+ Column6.DataType = System.Type.GetType("System.String");
+ Column6.ColumnName = "Message";
+ Column6.AllowDBNull = true;
+ logTable.Columns.Add(Column6);
+
+ DataColumn Column7 = new DataColumn();
+ Column7.DataType = System.Type.GetType("System.String");
+ Column7.ColumnName = "GlobalMin";
+ Column7.AllowDBNull = true;
+ logTable.Columns.Add(Column7);
+
+ DataColumn Column8 = new DataColumn();
+ Column8.DataType = System.Type.GetType("System.String");
+ Column8.ColumnName = "GlobalMax";
+ Column8.AllowDBNull = true;
+ logTable.Columns.Add(Column8);
+
+ DataColumn Column9 = new DataColumn();
+ Column9.DataType = System.Type.GetType("System.String");
+ Column9.ColumnName = "Result";
+ Column9.AllowDBNull = false;
+ logTable.Columns.Add(Column9);
+
+ DataColumn Column10 = new DataColumn();
+ Column10.DataType = System.Type.GetType("System.String");
+ Column10.ColumnName = "SpentTime";
+ Column10.AllowDBNull = true;
+ logTable.Columns.Add(Column10);
+
+ // Create an array for DataColumn objects.
+ DataColumn[] keys = new DataColumn[1];
+ keys[0] = Column0;
+ logTable.PrimaryKey = keys;
+
+ // Return the new DataTable.
+ return logTable;
+ }
+
+ private DataTable CPXV2_MakeProcLogTable()
+ {
+ // Create a new DataTable titled 'Names.'
+ DataTable logTable = new DataTable("TestResult");
+
+ // Add three column objects to the table.
+ DataColumn Column0 = new DataColumn();
+ Column0.DataType = System.Type.GetType("System.Int64");
+ Column0.ColumnName = "No";
+ Column0.AllowDBNull = false;
+ logTable.Columns.Add(Column0);
+
+ DataColumn Column1 = new DataColumn();
+ Column1.DataType = System.Type.GetType("System.DateTime");
+ Column1.ColumnName = "TestDT";
+ Column1.AllowDBNull = true;
+ logTable.Columns.Add(Column1);
+
+ DataColumn Column2 = new DataColumn();
+ Column2.DataType = System.Type.GetType("System.String");
+ Column2.ColumnName = "LogData";
+ Column2.AllowDBNull = false;
+ logTable.Columns.Add(Column2);
+
+ // Create an array for DataColumn objects.
+ DataColumn[] keys = new DataColumn[1];
+ keys[0] = Column0;
+ logTable.PrimaryKey = keys;
+
+ // Return the new DataTable.
+ return logTable;
+ }
+
+ private enum eCPXV2_CreateFileInfo
+ {
+ SuccessSavePos = 0,
+ FailedSavePos,
+ MesSavePos,
+ CheckLogSavePos
+ }
+
+ private string CPXV2_GetFileName(LogMappedPacket GetMappedInfo, string strCreateName)
+ {
+ Random randNumber = new Random();
+
+ string strFileName = strCreateName;
+
+ if (GetMappedInfo.objOptionFileName[0].Data.CompareTo("-") == 0)
+ strFileName += @"LogFileTemp" + @randNumber.Next().ToString() + @GetMappedInfo.objOptionFileExtension[0].Data;
+ else
+ strFileName += @GetMappedInfo.objOptionFileName[0].Data + @GetMappedInfo.objOptionFileExtension[0].Data;
+
+ if (File.Exists(strFileName) == true)
+ {
+ while (true)
+ {
+ strFileName = strCreateName;
+
+ if (GetMappedInfo.objOptionFileName[0].Data.CompareTo("-") == 0)
+ strFileName += @"LogFileTemp" + @randNumber.Next().ToString() + @GetMappedInfo.objOptionFileExtension[0].Data;
+ else
+ strFileName += @GetMappedInfo.objOptionFileName[0].Data + "_" + @randNumber.Next().ToString() + @GetMappedInfo.objOptionFileExtension[0].Data;
+
+ if (File.Exists(strFileName) == false)
+ break;
+ }
+ }
+
+ return strFileName;
+ }
+
+ private string CPXV2_GetFileSaveInformation(eCPXV2_CreateFileInfo fileInfo,
+ LogMappedPacket GetMappedInfo,
+ int iPos,
+ string strMakeDate,
+ bool bGetOnlyFilePath = false)
+ {
+ string strMakeInfo = string.Empty;
+ string strMakeName = string.Empty;
+
+ switch (fileInfo)
+ {
+ case eCPXV2_CreateFileInfo.SuccessSavePos:
+ strMakeInfo = LoadInfo.SERVER_SAVE_POS + @"\" + strMakeDate;
+ strMakeInfo += @"LogFileSave_ProcessPort" + (iPos + 1).ToString("D2") + "(" + GetMappedInfo.nStreamPort + ")_" + GetMappedInfo.objHost[0].Data + "_" + GetMappedInfo.objSection[0].Data + @"\";
+ break;
+ case eCPXV2_CreateFileInfo.FailedSavePos:
+ strMakeInfo = LoadInfo.SERVER_SAVE_POS + @"\" + strMakeDate;
+ strMakeInfo += @"LogFileSave_ProcessPort" + (iPos + 1).ToString("D2") + "(" + GetMappedInfo.nStreamPort + ")_" + GetMappedInfo.objHost[0].Data + "_" + GetMappedInfo.objSection[0].Data + @"\ProcessingFailed\";
+ break;
+ case eCPXV2_CreateFileInfo.MesSavePos:
+ strMakeInfo = LoadInfo.MES_SAVE_POS + @"\MESLogSave_ProcessPort" + (iPos + 1).ToString("D2") + "(" + GetMappedInfo.nStreamPort + ")_" + GetMappedInfo.objHost[0].Data + "_" + GetMappedInfo.objSection[0].Data + @"\";
+ strMakeInfo += strMakeDate;
+ break;
+ case eCPXV2_CreateFileInfo.CheckLogSavePos:
+ strMakeInfo = LoadInfo.SERVER_SAVE_POS + @"\" + strMakeDate;
+ strMakeInfo += @"LogFileSave_ProcessPort" + (iPos + 1).ToString("D2") + "(" + GetMappedInfo.nStreamPort + ")_" + GetMappedInfo.objHost[0].Data + "_" + GetMappedInfo.objSection[0].Data + @"\LogCheck\";
+ break;
+ }
+
+ if (Directory.Exists(strMakeInfo) == false)
+ Directory.CreateDirectory(strMakeInfo);
+
+ if (bGetOnlyFilePath == false)
+ strMakeName = CPXV2_GetFileName(GetMappedInfo, strMakeInfo);
+ else
+ strMakeName = strMakeInfo;
+
+ return strMakeName;
+ }
+
+ private bool CPXV2_SummaryLastNoCheck(eConnCategory eConnType, ref Int64 nLastNo, ref Int64 nRowCnt)
+ {
+ nLastNo = 0;
+ nRowCnt = 0;
+
+ bool bResult = true;
+
+ string strGetTableName = string.Empty;
+
+ if (eConnType == eConnCategory.ShortTerm)
+ strGetTableName = MngDBLogConn.GetDBConnectInfo().ConnShortTerm.SUMMARY_TABLE;
+ else if (eConnType == eConnCategory.LongTerm)
+ strGetTableName = MngDBLogConn.GetDBConnectInfo().ConnLongTerm.SUMMARY_TABLE;
+ else
+ {
+ bResult = false;
+
+ return bResult;
+ }
+
+ try
+ {
+ //Summary 테이블 현재 마지막 인덱스 번호 획득
+ DataSet ds = QueryStreamProcess(eConnType, "SELECT IDENT_CURRENT('" + strGetTableName + "') AS LastNo");
+ bool hasRows = XCommons.isHasRow(ds);
+
+ //인덱스 번호 획득 실패시 예외
+ if (hasRows == false)
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + @" CPXV2 CpLogProcess Summary Table LogProcess/LastNo Query failed. [SystemX.Net.MiddlewareUI : MainForm.SummaryLastNoCheck]", ConsoleColor.Yellow, LogMessageLevel.DEBUG);
+
+ throw new Exception("[" + CPXV2_CpLogProcessInfo.strGetFileName + "] When the file is in progress.");
+ }
+
+ //인덱스 번호 변환 실패 예외
+ if (Int64.TryParse(ds.Tables[0].Rows[0].ItemArray[0].ToString(), out nLastNo) == false)
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo +
+ @" CPXV2 CpLogProcess [" + strGetTableName + "] index number conversion failed failed. [SystemX.Net.MiddlewareUI : MainForm.SummaryLastNoCheck]", ConsoleColor.Red, LogMessageLevel.FATAL);
+
+ throw new Exception();
+ }
+
+ if (nLastNo == 0)
+ {
+ ds = QueryStreamProcess(eConnType, "SELECT ROWS FROM SYS.SYSINDEXES WHERE ID = OBJECT_ID ('" + strGetTableName + "') AND INDID < 2");
+
+ hasRows = XCommons.isHasRow(ds);
+
+ //인덱스 번호 획득 실패시 예외
+ if (hasRows == false)
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + @" CPXV2 CpLogProcess Summary Table LogProcess/LastNo Query failed(SYS.SYSINDEXES). [SystemX.Net.MiddlewareUI : MainForm.SummaryLastNoCheck]", ConsoleColor.Yellow, LogMessageLevel.DEBUG);
+
+ throw new Exception("[" + CPXV2_CpLogProcessInfo.strGetFileName + "] When the file is in progress(SYS.SYSINDEXES).");
+ }
+
+ nRowCnt = Convert.ToInt64(ds.Tables[0].Rows[0]["ROWS"]);
+ }
+ }
+ catch
+ {
+ bResult = false;
+ }
+
+ return bResult;
+ }
+
+ private void RegisterCpLogComment(ref int nProcPos, DataRow[] SetMakeLogRows)
+ {
+ //CpLog 의 정보와 VRFY 정보를 조건에 따라 생성한 DataRow에 업데이트
+ SetMakeLogRows[nProcPos]["StepID"] = "1";
+
+ SetMakeLogRows[nProcPos]["MeasVal"] = Convert.ToDecimal(0);
+ SetMakeLogRows[nProcPos]["MeasValStr"] = "";
+ SetMakeLogRows[nProcPos]["Message"] = CPXV2_CpLogProcessInfo.strCpLogFileComment;
+
+ SetMakeLogRows[nProcPos]["GlobalMin"] = "";
+ SetMakeLogRows[nProcPos]["GlobalMax"] = "";
+
+ SetMakeLogRows[nProcPos]["Result"] = "NONE";
+ SetMakeLogRows[nProcPos]["SpentTime"] = "0";
+
+ nProcPos += 1;
+ }
+
+ private void RegisterCpLogData(ref int nProcPos, DataTable SetCpLogTable, DataSet dsVRFYInfo, DataRow dr, DataRow[] SetMakeLogRows)
+ {
+ string strGetMeasure = string.Empty;
+
+ //CpLog 한행의 정보 획득
+ LongLogParamInfo.STEP = dr["STEP"].ToString().Trim();
+ LongLogParamInfo.POSITION = dr["POSITION"].ToString().Trim();
+ LongLogParamInfo.MO = dr["MO"].ToString().Trim();
+ LongLogParamInfo.FNC_NAME = dr["FNC_NAME"].ToString().Trim();
+ LongLogParamInfo.MIN = dr["MIN"].ToString().Trim();
+ LongLogParamInfo.MEASURE = dr["MEASURE"].ToString().Trim();
+ LongLogParamInfo.MAX = dr["MAX"].ToString().Trim();
+ LongLogParamInfo.DIM = dr["DIM"].ToString().Trim();
+ LongLogParamInfo.CHECK = dr["CHECK"].ToString().Trim();
+ LongLogParamInfo.SPENT_TIME = dr["SPENT_TIME"].ToString().Trim();
+ LongLogParamInfo.INFO = dr["INFO"].ToString().Trim();
+
+ LongLogParamInfo.GLOBAL_SPEC = false;
+ LongLogParamInfo.VRFY_MIN = "";
+ LongLogParamInfo.VRFY_MAX = "";
+
+ //VRFY 키 지정 검색 > 현재의 STEP 이 VRFY 에 존재하면 해당 STEP 의 정보 VRFY 에서 가져옴
+ DataRow getDr = dsVRFYInfo.Tables[0].Rows.Find(LongLogParamInfo.STEP);
+ if (getDr != null)
+ {
+ LongLogParamInfo.GLOBAL_SPEC = Convert.ToBoolean(getDr["IsGlobal"]);
+
+ LongLogParamInfo.VRFY_MIN = getDr["SpecMin"].ToString().Trim();
+ LongLogParamInfo.VRFY_MAX = getDr["SpecMax"].ToString().Trim();
+ }
+
+ //DataRow 를 설정된 DataTable Format으로 한행 생성
+ SetMakeLogRows[nProcPos] = SetCpLogTable.NewRow();
+
+ //CpLog 의 정보와 VRFY 정보를 조건에 따라 생성한 DataRow에 업데이트
+ SetMakeLogRows[nProcPos]["StepID"] = LongLogParamInfo.STEP;
+
+ SetMakeLogRows[nProcPos]["MeasVal"] = Convert.ToDecimal(0);
+ SetMakeLogRows[nProcPos]["MeasValStr"] = "";
+ SetMakeLogRows[nProcPos]["Message"] = "";
+
+ if (LongLogParamInfo.FNC_NAME.IndexOf("PRINTOUT") >= 0)
+ {
+ if (LongLogParamInfo.MEASURE.Length > LongLogParamInfo.MessageLength)
+ {
+ strGetMeasure = LongLogParamInfo.MEASURE;
+ strGetMeasure = strGetMeasure.Substring(0, LongLogParamInfo.MessageLength);
+
+ SetMakeLogRows[nProcPos]["Message"] = strGetMeasure;
+ }
+ else SetMakeLogRows[nProcPos]["Message"] = LongLogParamInfo.MEASURE;
+ }
+ else if (LongLogParamInfo.DIM.IndexOf("STR") >= 0 ||
+ LongLogParamInfo.DIM.IndexOf("STRING") >= 0 ||
+ LongLogParamInfo.DIM.IndexOf("HEX") >= 0 ||
+ LongLogParamInfo.DIM.IndexOf("NONE") >= 0 ||
+ LongLogParamInfo.DIM.IndexOf("BIN") >= 0 ||
+ LongLogParamInfo.DIM == string.Empty)
+ {
+ if (LongLogParamInfo.MEASURE.Length > LongLogParamInfo.MessageValLength)
+ {
+ strGetMeasure = LongLogParamInfo.MEASURE;
+ strGetMeasure = strGetMeasure.Substring(0, LongLogParamInfo.MessageValLength);
+
+ SetMakeLogRows[nProcPos]["MeasValStr"] = strGetMeasure;
+ }
+ else SetMakeLogRows[nProcPos]["MeasValStr"] = LongLogParamInfo.MEASURE;
+ }
+ else
+ {
+ //상기 케이스에 다 해당 안될때 Decimal 삽입 아무값이 없을 때 0 삽입
+ if (LongLogParamInfo.MEASURE.Length <= 0)
+ SetMakeLogRows[nProcPos]["MeasVal"] = Convert.ToDecimal(0);
+ else
+ {
+ //Measure 존재에 대한 값변환 시도 및 실패시 String 항목으로 삽입
+ decimal getMeasValue = decimal.Zero;
+ if (Decimal.TryParse(LongLogParamInfo.MEASURE, out getMeasValue))
+ SetMakeLogRows[nProcPos]["MeasVal"] = getMeasValue;
+ else
+ {
+ //0 삽입 및 Str 에 >> 표시 및 Message 에 데이터 표시
+ SetMakeLogRows[nProcPos]["MeasVal"] = Convert.ToDecimal(0);
+ SetMakeLogRows[nProcPos]["MeasValStr"] = ">>";
+ SetMakeLogRows[nProcPos]["Message"] = LongLogParamInfo.MEASURE;
+ }
+ }
+ }
+
+ //IS GLOBAL 이면 CpLog 에서 읽은 정보 삽입 아니면 VRFY 에서 읽은 정보 삽입
+ if (LongLogParamInfo.GLOBAL_SPEC)
+ {
+ SetMakeLogRows[nProcPos]["GlobalMin"] = LongLogParamInfo.MIN;
+ SetMakeLogRows[nProcPos]["GlobalMax"] = LongLogParamInfo.MAX;
+ }
+ else
+ {
+ SetMakeLogRows[nProcPos]["GlobalMin"] = LongLogParamInfo.VRFY_MIN;
+ SetMakeLogRows[nProcPos]["GlobalMax"] = LongLogParamInfo.VRFY_MAX;
+
+ if (LongLogParamInfo.VRFY_MIN.Length <= 0 &&
+ LongLogParamInfo.VRFY_MAX.Length <= 0)
+ {
+ if (LongLogParamInfo.MIN.Length > 0 ||
+ LongLogParamInfo.MAX.Length > 0)
+ {
+ SetMakeLogRows[nProcPos]["GlobalMin"] = LongLogParamInfo.MIN;
+ SetMakeLogRows[nProcPos]["GlobalMax"] = LongLogParamInfo.MAX;
+ }
+ }
+ }
+
+ SetMakeLogRows[nProcPos]["Result"] = LongLogParamInfo.CHECK;
+ SetMakeLogRows[nProcPos]["SpentTime"] = LongLogParamInfo.SPENT_TIME;
+
+ nProcPos += 1;
+ }
+
+ private DataRow[] CPXV2_ShortProcessMakeLogRows(int nLogCnt, DataSet dsVRFYInfo, DataTable dtLogData)
+ {
+ bool bMakeProcResult = true;
+
+ DataRow[] SetMakeLogRows = new DataRow[nLogCnt];
+
+ int nProcPos = 0;
+
+ //CpLog 삽입할 DataTable 생성
+ DataTable SetCpLogTable;
+ SetCpLogTable = CPXV2_MakeCpLogTable();
+
+ //읽은 Cplog DataTable DataRow 정보로 DataRow 업데이트 및 Datatable에 삽입
+ //현재 VRFY 최근 Step 별 정보로 IsGlobal 일때 Spec 을 가져오거나 측정되어 생성된 Spec 구분하여 처리
+ string strGetMeasure = string.Empty;
+
+ string strGetMin = string.Empty;
+ string strGetMax = string.Empty;
+
+ string strGetVRFYMin = string.Empty;
+ string strGetVRFYMax = string.Empty;
+
+ //Make Comment Step
+ try
+ {
+ //DataRow 를 설정된 DataTable Format으로 한행 생성
+ SetMakeLogRows[nProcPos] = SetCpLogTable.NewRow();
+
+ //CpLog 의 정보와 VRFY 정보를 조건에 따라 생성한 DataRow에 업데이트
+ RegisterCpLogComment(ref nProcPos, SetMakeLogRows);
+ }
+ catch (Exception ex)
+ {
+ bMakeProcResult = false;
+
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + @" Step:" + "1 Insert log data(CpLog Comment) make failed. " + ex.Message + " [SystemX.Net.MiddlewareUI : MainForm.ProcessMakeLogRows]", ConsoleColor.Red, LogMessageLevel.FATAL);
+
+ goto MAKE_ROW_RPCOESS_FAILED;
+ }
+ //
+ foreach (DataRow dr in dtLogData.Rows)
+ {
+ try
+ {
+ RegisterCpLogData(ref nProcPos, SetCpLogTable, dsVRFYInfo, dr, SetMakeLogRows);
+ }
+ catch (Exception ex)
+ {
+ bMakeProcResult = false;
+
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + @" Step:" + ShortLogParamInfo.STEP + @" Insert log data make failed. " + ex.Message + " [SystemX.Net.MiddlewareUI : MainForm.ProcessMakeLogRows]", ConsoleColor.Red, LogMessageLevel.FATAL);
+
+ break;
+ }
+ }
+
+ MAKE_ROW_RPCOESS_FAILED:
+
+ if (bMakeProcResult == false)
+ SetMakeLogRows = null;
+
+ return SetMakeLogRows;
+ }
+
+ private DataRow[] CPXV2_LongProcessMakeLogRows(int nLogCnt, DataSet dsVRFYInfo, DataTable dtLogData)
+ {
+ bool bMakeProcResult = true;
+
+ DataRow[] SetMakeLogRows = new DataRow[nLogCnt];
+
+ int nProcPos = 0;
+
+ //CpLog 삽입할 DataTable 생성
+ DataTable SetCpLogTable;
+ SetCpLogTable = CPXV2_MakeCpLogTable();
+
+ //읽은 Cplog DataTable DataRow 정보로 DataRow 업데이트 및 Datatable에 삽입
+ //현재 VRFY 최근 Step 별 정보로 IsGlobal 일때 Spec 을 가져오거나 측정되어 생성된 Spec 구분하여 처리
+ string strGetMeasure = string.Empty;
+
+ string strGetMin = string.Empty;
+ string strGetMax = string.Empty;
+
+ string strGetVRFYMin = string.Empty;
+ string strGetVRFYMax = string.Empty;
+
+ //Make Comment Step
+ try
+ {
+ //DataRow 를 설정된 DataTable Format으로 한행 생성
+ SetMakeLogRows[nProcPos] = SetCpLogTable.NewRow();
+
+ //CpLog 의 정보와 VRFY 정보를 조건에 따라 생성한 DataRow에 업데이트
+ RegisterCpLogComment(ref nProcPos, SetMakeLogRows);
+ }
+ catch (Exception ex)
+ {
+ bMakeProcResult = false;
+
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + @" Step:" + "1 Insert log data(CpLog Comment) make failed. " + ex.Message + " [SystemX.Net.MiddlewareUI : MainForm.ProcessMakeLogRows]", ConsoleColor.Red, LogMessageLevel.FATAL);
+
+ goto MAKE_ROW_RPCOESS_FAILED;
+ }
+ //
+ foreach (DataRow dr in dtLogData.Rows)
+ {
+ try
+ {
+ RegisterCpLogData(ref nProcPos, SetCpLogTable, dsVRFYInfo, dr, SetMakeLogRows);
+ }
+ catch (Exception ex)
+ {
+ bMakeProcResult = false;
+
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + @" Step:" + LongLogParamInfo.STEP + @" Insert log data make failed. " + ex.Message + " [SystemX.Net.MiddlewareUI : MainForm.ProcessMakeLogRows]", ConsoleColor.Red, LogMessageLevel.FATAL);
+
+ break;
+ }
+ }
+
+ MAKE_ROW_RPCOESS_FAILED:
+
+ if (bMakeProcResult == false)
+ SetMakeLogRows = null;
+
+ return SetMakeLogRows;
+ }
+
+ private void CPXV2_MakeSummaryData(int iPos, string strStationName, string strTestListID, string strHostID, string strSection,
+ ref HISTLogSummary[] summaryItem)
+ {
+ summaryItem[0].StationName = strStationName;
+ summaryItem[0].TestType = CPXV2_CpLogProcessInfo.strTestType;
+ summaryItem[0].Version = CPXV2_CpLogProcessInfo.strVersion;
+ summaryItem[0].ProdCode = CPXV2_CpLogProcessInfo.strProdCode;
+ summaryItem[0].TestListFileNo = CPXV2_CpLogProcessInfo.nTestListFileNo;
+ summaryItem[0].TestListVariantNo = CPXV2_CpLogProcessInfo.nTestListVariantNo;
+ summaryItem[0].TestListCntID = strTestListID;
+ summaryItem[0].StepVersion = CPXV2_CpLogProcessInfo.nGetReadStepVersion;
+ summaryItem[0].Host = strHostID;
+ summaryItem[0].Section = strSection;
+ summaryItem[0].ProdNoC = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["ProdNo_C"].ToString();
+ summaryItem[0].ProdNoP = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["ProdNo_P"].ToString();
+ summaryItem[0].TestCode = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["TestCode"].ToString();
+ summaryItem[0].TestListFileName = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["FileName"].ToString();
+ summaryItem[0].ProductID = CPXV2_CpLogProcessInfo.dicCpLogHeader["PART_ID"];
+ summaryItem[0].Result = CPXV2_CpLogProcessInfo.dicCpLogHeader["RESULT"];
+ summaryItem[0].Duration = CPXV2_CpLogProcessInfo.dicCpLogHeader["DURATION"];
+ summaryItem[0].TestDT = Convert.ToDateTime(CPXV2_CpLogProcessInfo.strStTime);
+ //
+ summaryItem[1].StationName = strStationName;
+ summaryItem[1].TestType = CPXV2_CpLogProcessInfo.strTestType;
+ summaryItem[1].Version = CPXV2_CpLogProcessInfo.strVersion;
+ summaryItem[1].ProdCode = CPXV2_CpLogProcessInfo.strProdCode;
+ summaryItem[1].TestListFileNo = CPXV2_CpLogProcessInfo.nTestListFileNo;
+ summaryItem[1].TestListVariantNo = CPXV2_CpLogProcessInfo.nTestListVariantNo;
+ summaryItem[1].TestListCntID = strTestListID;
+ summaryItem[1].StepVersion = CPXV2_CpLogProcessInfo.nGetReadStepVersion;
+ summaryItem[1].Host = strHostID;
+ summaryItem[1].Section = strSection;
+ summaryItem[1].ProdNoC = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["ProdNo_C"].ToString();
+ summaryItem[1].ProdNoP = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["ProdNo_P"].ToString();
+ summaryItem[1].TestCode = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["TestCode"].ToString();
+ summaryItem[1].TestListFileName = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["FileName"].ToString();
+ summaryItem[1].ProductID = CPXV2_CpLogProcessInfo.dicCpLogHeader["PART_ID"];
+ summaryItem[1].Result = CPXV2_CpLogProcessInfo.dicCpLogHeader["RESULT"];
+ summaryItem[1].Duration = CPXV2_CpLogProcessInfo.dicCpLogHeader["DURATION"];
+ summaryItem[1].TestDT = Convert.ToDateTime(CPXV2_CpLogProcessInfo.strStTime);
+ }
+
+ private async Task CPXV2_CheckDuplicateData(eConnCategory eConnType, int iPos, string strStationName, string strHostID, string strSection, Int64 nPreNo)
+ {
+ DataSet dsLastSummaryInfo = null;
+ DataSet dsDateTimeInfo = null;
+
+ string strGetTableName = string.Empty;
+
+ if(nPreNo < 0)
+ return false;
+
+ if (eConnType == eConnCategory.ShortTerm)
+ strGetTableName = MngDBLogConn.GetDBConnectInfo().ConnShortTerm.SUMMARY_TABLE;
+ else if (eConnType == eConnCategory.LongTerm)
+ strGetTableName = MngDBLogConn.GetDBConnectInfo().ConnLongTerm.SUMMARY_TABLE;
+ else
+ return true;
+
+ string strSummaryQueryText = "SELECT " +
+ "StationName, " +
+ "TestType, " +
+ "Version, " +
+ "ProdCode, " +
+ "TestListFileNo, " +
+ "TestListVariantNo, " +
+ "TestListCntID," +
+ "StepVersion, " +
+ "HostID, " +
+ "Section, " +
+ "ProdNo_C, " +
+ "ProdNo_P, " +
+ "Testcode, " +
+ "TestListFileName, " +
+ "ProductID, " +
+ "Result, " +
+ "Duration, " +
+ "TestDT " +
+ "FROM [" + strGetTableName + "] " +
+ "WHERE No = " + nPreNo.ToString() + ";";
+
+ //직전 Summary Information 획득
+ dsLastSummaryInfo = QueryStreamProcess(eConnType, strSummaryQueryText);
+
+ if (XCommons.isHasRow(dsLastSummaryInfo) == false)
+ return false;
+
+ //직전정보와 이전정보를 비교를 위한 선언 > 검사기측 중복으로 동일 로그를 전송해도 무시 하도록
+ string[] strSummaryInsertInfo = new string[18];
+ string[] strSummaryBeforeInfo = new string[18];
+
+ bool bCompareResult = false;
+
+ try
+ {
+ //현재 정보중 비교할 정보 삽입
+ strSummaryInsertInfo[0] = strStationName;
+ strSummaryInsertInfo[1] = CPXV2_CpLogProcessInfo.strTestType;
+ strSummaryInsertInfo[2] = CPXV2_CpLogProcessInfo.strVersion;
+ strSummaryInsertInfo[3] = CPXV2_CpLogProcessInfo.strProdCode;
+ strSummaryInsertInfo[4] = CPXV2_CpLogProcessInfo.nTestListFileNo.ToString();
+ strSummaryInsertInfo[5] = CPXV2_CpLogProcessInfo.nTestListVariantNo.ToString();
+ strSummaryInsertInfo[6] = CPXV2_CpLogProcessInfo.strTestListCntID.ToString();
+ strSummaryInsertInfo[7] = CPXV2_CpLogProcessInfo.nGetReadStepVersion.ToString();
+ strSummaryInsertInfo[8] = strHostID;
+ strSummaryInsertInfo[9] = strSection;
+ strSummaryInsertInfo[10] = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["ProdNo_C"].ToString();
+ strSummaryInsertInfo[11] = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["ProdNo_P"].ToString();
+ strSummaryInsertInfo[12] = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["TestCode"].ToString();
+ strSummaryInsertInfo[13] = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["FileName"].ToString();
+ strSummaryInsertInfo[14] = CPXV2_CpLogProcessInfo.dicCpLogHeader["PART_ID"];
+ strSummaryInsertInfo[15] = CPXV2_CpLogProcessInfo.dicCpLogHeader["RESULT"];
+ strSummaryInsertInfo[16] = CPXV2_CpLogProcessInfo.dicCpLogHeader["DURATION"];
+ strSummaryInsertInfo[17] = CPXV2_CpLogProcessInfo.strStTime;
+
+ //이전 정보중 비교할 정보 삽입
+ strSummaryBeforeInfo[0] = dsLastSummaryInfo.Tables[0].Rows[0][0].ToString();
+ strSummaryBeforeInfo[1] = dsLastSummaryInfo.Tables[0].Rows[0][1].ToString();
+ strSummaryBeforeInfo[2] = dsLastSummaryInfo.Tables[0].Rows[0][2].ToString();
+ strSummaryBeforeInfo[3] = dsLastSummaryInfo.Tables[0].Rows[0][3].ToString();
+ strSummaryBeforeInfo[4] = dsLastSummaryInfo.Tables[0].Rows[0][4].ToString();
+ strSummaryBeforeInfo[5] = dsLastSummaryInfo.Tables[0].Rows[0][5].ToString();
+ strSummaryBeforeInfo[6] = dsLastSummaryInfo.Tables[0].Rows[0][6].ToString();
+ strSummaryBeforeInfo[7] = dsLastSummaryInfo.Tables[0].Rows[0][7].ToString();
+ strSummaryBeforeInfo[8] = dsLastSummaryInfo.Tables[0].Rows[0][8].ToString();
+ strSummaryBeforeInfo[9] = dsLastSummaryInfo.Tables[0].Rows[0][9].ToString();
+ strSummaryBeforeInfo[10] = dsLastSummaryInfo.Tables[0].Rows[0][10].ToString();
+ strSummaryBeforeInfo[11] = dsLastSummaryInfo.Tables[0].Rows[0][11].ToString();
+ strSummaryBeforeInfo[12] = dsLastSummaryInfo.Tables[0].Rows[0][12].ToString();
+ strSummaryBeforeInfo[13] = dsLastSummaryInfo.Tables[0].Rows[0][13].ToString();
+ strSummaryBeforeInfo[14] = dsLastSummaryInfo.Tables[0].Rows[0][14].ToString();
+ strSummaryBeforeInfo[15] = dsLastSummaryInfo.Tables[0].Rows[0][15].ToString();
+ strSummaryBeforeInfo[16] = dsLastSummaryInfo.Tables[0].Rows[0][16].ToString();
+ strSummaryBeforeInfo[17] = dsLastSummaryInfo.Tables[0].Rows[0][17].ToString();
+
+ int nDateTimePos = 17;
+ if (strSummaryBeforeInfo[nDateTimePos].IndexOf("AM") >= 0 || strSummaryBeforeInfo[nDateTimePos].IndexOf("PM") >= 0)
+ {
+ string strQueryDateTime = "SELECT DBO.XConvertDateE('" + strSummaryBeforeInfo[nDateTimePos] + "') AS 'DATETIME';";
+
+ dsDateTimeInfo = QueryStreamProcess(eConnType, strQueryDateTime);
+
+ if (XCommons.isHasRow(dsDateTimeInfo))
+ {
+ strSummaryBeforeInfo[nDateTimePos] = dsDateTimeInfo.Tables[0].Rows[0][0].ToString();
+
+ strSummaryBeforeInfo[nDateTimePos] = strSummaryBeforeInfo[nDateTimePos].Remove(strSummaryBeforeInfo[nDateTimePos].Length - 8, 8);
+ }
+ }
+ else if (strSummaryBeforeInfo[nDateTimePos].IndexOf("오전") >= 0 || strSummaryBeforeInfo[nDateTimePos].IndexOf("오후") >= 0)
+ {
+ string strQueryDateTime = "SELECT DBO.XConvertDateK('" + strSummaryBeforeInfo[nDateTimePos] + "') AS 'DATETIME';";
+
+ dsDateTimeInfo = QueryStreamProcess(eConnType, strQueryDateTime);
+
+ if (XCommons.isHasRow(dsDateTimeInfo))
+ {
+ strSummaryBeforeInfo[nDateTimePos] = dsDateTimeInfo.Tables[0].Rows[0][0].ToString();
+
+ strSummaryBeforeInfo[nDateTimePos] = strSummaryBeforeInfo[nDateTimePos].Remove(strSummaryBeforeInfo[nDateTimePos].Length - 8, 8);
+ }
+ }
+
+ //동일 한지 비교
+ bCompareResult = strSummaryInsertInfo.SequenceEqual(strSummaryBeforeInfo);
+ }
+ catch
+ {
+ bCompareResult = true;
+ }
+
+ await Task.Delay(0);
+
+ //True : 같다 / False : 다르다
+ return bCompareResult;
+ }
+
+ private bool CPXV2_CpLogProcess(LogMappedPacket GetMappedInfo, Dictionary dicSetLogFileInfo = null, string strSetLogFilePos = "")
+ {
+ int iPos = int.MinValue;
+
+ bool bRequiredProcLogFile = false;
+
+ if (strSetLogFilePos.Length > 0)
+ bRequiredProcLogFile = true;
+
+ if (bRequiredProcLogFile == false)
+ iPos = GetMappedInfo.nNumber;
+ else
+ iPos = 0;
+
+ bool bProcessResult = true;
+ bool bDupLogSkipState = false;
+
+ string strProcessDebugInfo = string.Empty;
+
+ if (bRequiredProcLogFile == false)
+ {
+ strProcessDebugInfo = "[" + (iPos).ToString("D2") + "]" +
+ "[" + GetMappedInfo.nStreamPort + "]" +
+ "[" + GetMappedInfo.objHost[0].Data + "]" +
+ "[" + GetMappedInfo.objSection[0].Data + "]";
+ }
+ else
+ {
+ strProcessDebugInfo = "[" + (iPos).ToString("D2") + "]" +
+ "[FTP]" +
+ "[" + dicSetLogFileInfo["HOST"] + "]" +
+ "[" + dicSetLogFileInfo["SECTION"] + "]";
+ }
+
+ CPXV2_CpLogProcessInfo.strProcessDebugInfo = strProcessDebugInfo;
+
+ string strMakeDate = string.Empty;
+
+ string strSuccessFileName = string.Empty;
+ string strFailedFileName = string.Empty;
+ string strGetFileName = string.Empty;
+
+ CpLogHeader getCpLogHeader = null;
+
+ DataTable dtShortLogData = null;
+ DataTable dtLongLogData = null;
+
+ try
+ {
+ //파일생성 위치 및 파일명 생성
+ if (bRequiredProcLogFile == false)
+ {
+ strMakeDate = DateTime.Now.ToString(@"yyyy\\MM\\dd\\");
+
+ strSuccessFileName = CPXV2_GetFileSaveInformation(eCPXV2_CreateFileInfo.SuccessSavePos, GetMappedInfo, iPos, strMakeDate);
+ strFailedFileName = CPXV2_GetFileSaveInformation(eCPXV2_CreateFileInfo.FailedSavePos, GetMappedInfo, iPos, strMakeDate);
+
+ strGetFileName = Path.GetFileName(strSuccessFileName);
+
+ byte[] ucGetFileData = new byte[GetMappedInfo.nLogDataSize];
+ Array.Copy(GetMappedInfo.ucLogData, 0, ucGetFileData, 0, GetMappedInfo.nLogDataSize);
+
+ byte[] ucSetFileData = null;
+
+ if (GetMappedInfo.objLogType[0].Data == "RAW_SIZE")
+ ucSetFileData = XDataArchive.DecompressGZipByteToByte(ucGetFileData);
+ else if (GetMappedInfo.objLogType[0].Data == "FILE_TRANSFER")
+ ucSetFileData = XDataArchive.DecompressDeflateByteToByte(ucGetFileData);
+ else
+ throw new Exception();
+
+ try
+ {
+ File.WriteAllBytes(strSuccessFileName, ucSetFileData);
+ }
+ catch
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + @" CPXV2 CpLogProcess [Log File] Create failed. - Need Hard Disk Space Check. [SystemX.Net.MiddlewareUI : MainForm.CPXV2_CpLogProcess]", ConsoleColor.Red, LogMessageLevel.FATAL);
+
+ throw new Exception();
+ }
+ }
+ else
+ strSuccessFileName = strSetLogFilePos;
+
+ //해당 CpLog 파일 읽기 및 헤더 정보 획득
+ dtShortLogData = CpLogFileIO.GetLogData(strSuccessFileName, out getCpLogHeader);
+
+ dtLongLogData = dtShortLogData.Copy();
+ }
+ catch
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + @" CPXV2 CpLogProcess Log make information failed. [SystemX.Net.MiddlewareUI : MainForm.CPXV2_CpLogProcess]", ConsoleColor.Yellow, LogMessageLevel.DEBUG);
+ }
+
+ try
+ {
+ //CpLog 파일 읽은 여부 확인
+ if (dtShortLogData == null || getCpLogHeader == null)
+ {
+ throw new Exception("[" + strGetFileName + "] Reading to CpLog file failed.");
+ }
+
+ CPXV2_CpLogProcessInfo.strGetFileName = strGetFileName;
+
+ //해당 프로젝트 사용 객체 생성(Summary 생성 관련)
+ CommonProtocol cp = new CommonProtocol();
+
+ //Summary 테이블 다중 접근 방지(인덱스)
+ Stopwatch stMeasTime = new Stopwatch();
+ stMeasTime.Start();
+
+ DataSet ds = null;
+
+ bool hasRows = false;
+
+ Int64 nSummaryRowsCount = 0;
+
+ Int64 nShortTermLastNo = 0;
+ Int64 nLongTermLastNo = 0;
+
+ Int64 nShortTermPreNo = 0;
+ Int64 nLongTermPreNo = 0;
+
+ int nLogItemCnt = dtShortLogData.Rows.Count;
+ //int iNPos = 0;
+
+ if (CPXV2_SummaryLastNoCheck(eConnCategory.ShortTerm, ref nShortTermLastNo, ref nSummaryRowsCount) == false)
+ throw new Exception();
+ else
+ {
+ if (nShortTermLastNo == 0)
+ nShortTermLastNo = nSummaryRowsCount;
+ else
+ nShortTermLastNo += 1;
+
+ nShortTermPreNo = nShortTermLastNo - 1;
+ }
+
+ if (CPXV2_SummaryLastNoCheck(eConnCategory.LongTerm, ref nLongTermLastNo, ref nSummaryRowsCount) == false)
+ throw new Exception();
+ else
+ {
+ if (nLongTermLastNo == 0)
+ nLongTermLastNo = nSummaryRowsCount;
+ else
+ nLongTermLastNo += 1;
+
+ nLongTermPreNo = nLongTermLastNo - 1;
+ }
+
+ //Summary 삽입 정보 생성
+ if (bRequiredProcLogFile == false)
+ {
+ CPXV2_CpLogProcessInfo.strHostID = GetMappedInfo.objHost[0].Data.Trim();
+ CPXV2_CpLogProcessInfo.strSection = GetMappedInfo.objSection[0].Data.Trim();
+ CPXV2_CpLogProcessInfo.strStationID = getCpLogHeader.CHANNEL.Trim();
+ CPXV2_CpLogProcessInfo.nShortTermIdent = nShortTermLastNo;
+ CPXV2_CpLogProcessInfo.nLongTermIdent = nLongTermLastNo;
+ CPXV2_CpLogProcessInfo.strStationName = GetMappedInfo.objStationName[0].Data;
+ CPXV2_CpLogProcessInfo.strProdNo_P = GetMappedInfo.objProdPNo[0].Data;
+ CPXV2_CpLogProcessInfo.strProdNo_C = GetMappedInfo.objProdCNo[0].Data;
+ CPXV2_CpLogProcessInfo.strTestType = GetMappedInfo.objTestType[0].Data;
+ CPXV2_CpLogProcessInfo.strTestCode = GetMappedInfo.objTestCode[0].Data;
+ CPXV2_CpLogProcessInfo.strVersion = GetMappedInfo.objVersion[0].Data;
+ CPXV2_CpLogProcessInfo.strProdCode = GetMappedInfo.objProdCode[0].Data;
+ CPXV2_CpLogProcessInfo.nTestListVariantNo = (int)GetMappedInfo.nTestListVariantNo;
+ CPXV2_CpLogProcessInfo.strTestListCntID = GetMappedInfo.objResultTestListCntID[0].Data;
+ }
+ else
+ {
+ CPXV2_CpLogProcessInfo.strHostID = dicSetLogFileInfo["HOST"];
+ CPXV2_CpLogProcessInfo.strSection = dicSetLogFileInfo["SECTION"];
+ CPXV2_CpLogProcessInfo.strStationID = getCpLogHeader.CHANNEL.Trim();
+ CPXV2_CpLogProcessInfo.nShortTermIdent = nShortTermLastNo;
+ CPXV2_CpLogProcessInfo.nLongTermIdent = nLongTermLastNo;
+ CPXV2_CpLogProcessInfo.strStationName = dicSetLogFileInfo["STATION_NAME"];
+ CPXV2_CpLogProcessInfo.strProdNo_P = dicSetLogFileInfo["P_TTNR"];
+ CPXV2_CpLogProcessInfo.strProdNo_C = dicSetLogFileInfo["TTNR"];
+ CPXV2_CpLogProcessInfo.strTestType = dicSetLogFileInfo["TEST_TYPE"];
+ CPXV2_CpLogProcessInfo.strTestCode = dicSetLogFileInfo["TEST_CODE"];
+ CPXV2_CpLogProcessInfo.strVersion = dicSetLogFileInfo["VERSION"];
+ CPXV2_CpLogProcessInfo.strProdCode = dicSetLogFileInfo["PROD_CODE"];
+ CPXV2_CpLogProcessInfo.nTestListVariantNo = Convert.ToInt32(dicSetLogFileInfo["VARIANT_NO"]);
+ CPXV2_CpLogProcessInfo.strTestListCntID = dicSetLogFileInfo["TESTLIST_ID"];
+ }
+
+ CPXV2_CpLogProcessInfo.dicCpLogHeader.Clear();
+ CPXV2_CpLogProcessInfo.nGetReadStepVersion = int.MaxValue;
+
+ /*
+ * CpLog Header 상 검사 시작 시간 획득 및 맨앞 공백 제거
+ */
+ CPXV2_CpLogProcessInfo.strStTime = getCpLogHeader.ST_TIME.Replace("_", " ");
+ CPXV2_CpLogProcessInfo.strStTime = CPXV2_CpLogProcessInfo.strStTime.Insert(CPXV2_CpLogProcessInfo.strStTime.Length - 11, "-");
+ CPXV2_CpLogProcessInfo.strStTime = CPXV2_CpLogProcessInfo.strStTime.Insert(CPXV2_CpLogProcessInfo.strStTime.Length - 9, "-");
+ CPXV2_CpLogProcessInfo.strStTime = CPXV2_CpLogProcessInfo.strStTime.Insert(CPXV2_CpLogProcessInfo.strStTime.Length - 4, ":");
+ CPXV2_CpLogProcessInfo.strStTime = CPXV2_CpLogProcessInfo.strStTime.Insert(CPXV2_CpLogProcessInfo.strStTime.Length - 2, ":");
+
+ if (CPXV2_CpLogProcessInfo.strStTime[0] == ' ')
+ CPXV2_CpLogProcessInfo.strStTime = CPXV2_CpLogProcessInfo.strStTime.Remove(0, 1);
+
+ try
+ {
+ //CpLog 헤더에 대한 항목 Dictionary 생성 > Summary 정보 삽입 위함
+ Type type = typeof(CpLogHeader);
+ FieldInfo[] f = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
+
+ foreach (FieldInfo item in f)
+ {
+ CPXV2_CpLogProcessInfo.dicCpLogHeader.Add(item.Name.Substring(item.Name.IndexOf("<") + 1, item.Name.IndexOf(">") - item.Name.IndexOf("<") - 1)
+ , item.GetValue(getCpLogHeader).ToString().Trim());
+ }
+ //
+ CPXV2_CpLogProcessInfo.strCpLogFileComment = getCpLogHeader.COMMENT;
+ }
+ catch
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo +
+ @" CPXV2 CpLogProcess - CpLogHeader failed to create per-item for header. [SystemX.Net.MiddlewareUI : MainForm.CPXV2_CpLogProcess]", ConsoleColor.Red, LogMessageLevel.FATAL);
+
+ throw new Exception();
+ }
+
+ /*
+ string strQueryTestListInformation = "SELECT A.ProdNo_C, " +
+ "B.ProdNo_P, " +
+ "D.TestCode, " +
+ "B.FileName, " +
+ "B.UseTLPosition " +
+ "FROM [PROD_Release] AS A " +
+ "INNER JOIN(SELECT X.No, X.ProdNo_P, X.TestType, X.Version, X.ProdCode, X.FileName, X.UseTLPosition, X.GroupNo " +
+ "FROM [PROD_TestList] AS X WITH(NOLOCK) WHERE X.No = " + CpLogProcessInfo.nTestListVariantNo + " " +
+ "AND TestType = '" + CpLogProcessInfo.strTestType + "' " +
+ "AND Version = '" + CpLogProcessInfo.strVersion + "' " +
+ "AND ProdCode = '" + CpLogProcessInfo.strProdCode + "') AS B " +
+ "ON B.No = " + CpLogProcessInfo.nTestListVariantNo + " " +
+ "INNER JOIN(SELECT * FROM [PROD_Group] AS Y WITH(NOLOCK)) AS C " +
+ "ON C.No = B.GroupNo " +
+ "INNER JOIN(SELECT * FROM [STAT_TestCode] AS Z WITH(NOLOCK)) AS D " +
+ "ON A.ProdNo_C = '" + CpLogProcessInfo.strProdNo_C + "' " +
+ "AND D.TestCode = '" + CpLogProcessInfo.strTestCode + "' " +
+ "AND B.No = A.TestListNo AND D.No = A.TestCodeNo;";
+ */
+
+ string strQueryTestListInformation = $"SELECT X.ProdNo_C, Z.ProdNo_P, Y.TestCode, J.FileName, Z.UseTLPosition, J.No AS 'TestListFileNo', Z.No AS 'VariantNo', J.TestType, J.Version, J.ProdCode " +
+ $"FROM [PROD_Release] AS X WITH(NOLOCK) " +
+ $"INNER JOIN [STAT_TestCode] AS Y WITH(NOLOCK) ON X.TestCodeNo = Y.No " +
+ $"INNER JOIN [PROD_Variant] AS Z WITH(NOLOCK) ON X.VariantNo = Z.No " +
+ $"INNER JOIN [PROD_Group] AS K WITH(NOLOCK) ON Z.GroupNo = K.No " +
+ $"INNER JOIN [STOR_TestListFile] AS J WITH(NOLOCK) ON Z.TestListFileNo = J.No " +
+ $"WHERE X.VariantNo = " + CPXV2_CpLogProcessInfo.nTestListVariantNo + " " +
+ $"AND X.ProdNo_C = '" + CPXV2_CpLogProcessInfo.strProdNo_C + "' " +
+ $"AND Y.TestCode = '" + CPXV2_CpLogProcessInfo.strTestCode + "' " +
+ $"AND J.TestType = '" + CPXV2_CpLogProcessInfo.strTestType + "' " +
+ $"AND J.Version = '" + CPXV2_CpLogProcessInfo.strVersion + "' " +
+ $"AND J.ProdCode = '" + CPXV2_CpLogProcessInfo.strProdCode + "' " +
+ $"ORDER BY X.No ASC;";
+
+ //Release 테스트리스트 정보 확인 [TestListNo] + strTestType + strTestCode + strVersion + strProdCode
+ thisConnInfo[iPos].geyLatestTestListInfo = QueryStreamProcess(eConnCategory.Main, strQueryTestListInformation);
+
+ int nLoadPosition = 0;
+
+ if (XCommons.isHasRow(thisConnInfo[iPos].geyLatestTestListInfo))
+ nLoadPosition = Convert.ToInt32(thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["UseTLPosition"]);
+ else
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo +
+ @" CPXV2 CpLogProcess fail. Test-list cannot be searched with client information.(TestList Information) [SystemX.Net.MiddlewareUI : MainForm.CpLogProcessShortTerm]\r\n", ConsoleColor.Red, LogMessageLevel.FATAL);
+
+ throw new Exception();
+ }
+
+ int nGetTestListFileNo = int.MaxValue;
+ int nGetTestListVariantNo = int.MaxValue;
+
+ string strGetTestListFileNo = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["TestListFileNo"].ToString();
+ string strGetTestListVariantNo = thisConnInfo[iPos].geyLatestTestListInfo.Tables[0].Rows[0]["VariantNo"].ToString();
+
+ if (int.TryParse(strGetTestListFileNo, out nGetTestListFileNo) == false ||
+ int.TryParse(strGetTestListVariantNo, out nGetTestListVariantNo) == false)
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo +
+ @" CPXV2 CpLogProcess fail. Test-list cannot be searched with client information.(TestListFileNo or TestListVariantNo) [SystemX.Net.MiddlewareUI : MainForm.CpLogProcessShortTerm]\r\n", ConsoleColor.Red, LogMessageLevel.FATAL);
+
+ throw new Exception();
+ }
+
+ CPXV2_CpLogProcessInfo.nTestListFileNo = nGetTestListFileNo;
+ CPXV2_CpLogProcessInfo.nTestListVariantNo = nGetTestListVariantNo;
+
+ if (CPXV2_ReadVRFYList(iPos, CPXV2_CpLogProcessInfo.nTestListFileNo, CPXV2_CpLogProcessInfo.nTestListVariantNo, strProcessDebugInfo, out CPXV2_CpLogProcessInfo.nGetReadStepVersion, nLoadPosition, false) == false)
+ throw new Exception(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + " " + CPXV2_CpLogProcessInfo.nTestListVariantNo + " Failed ReadVRFYList()");
+
+ //동일 할시 로그 미처리 및 리턴
+ var chkDataTsk = CPXV2_CheckDuplicateData(eConnCategory.ShortTerm, iPos,
+ CPXV2_CpLogProcessInfo.strStationName,
+ CPXV2_CpLogProcessInfo.strHostID,
+ CPXV2_CpLogProcessInfo.strSection,
+ nShortTermPreNo);
+
+ //DB 에 전송한 Summary 객체 생성
+ HISTLogSummary[] summaryItem = new HISTLogSummary[2];
+ summaryItem[0] = new HISTLogSummary();
+ summaryItem[1] = new HISTLogSummary();
+
+ CPXV2_MakeSummaryData(iPos,
+ CPXV2_CpLogProcessInfo.strStationName,
+ CPXV2_CpLogProcessInfo.strTestListCntID,
+ CPXV2_CpLogProcessInfo.strHostID,
+ CPXV2_CpLogProcessInfo.strSection,
+ ref summaryItem);
+
+ Task tskLongTerm = null;
+ //if (MngDBConn.InfoConnection.UTSI_STATE == false)
+
+ //tskLongTerm = Task.Run(async () => await CpLogProcessLongTerm(iPos, GetMappedInfo, getCpLogHeader, dtLogData, summaryItem[1]));
+ //var result = task.WaitAndUnwrapException();
+ tskLongTerm = Task.Run(() => CPXV2_CpLogProcessLongTerm(iPos, nLongTermLastNo, nLongTermPreNo, getCpLogHeader, dtLongLogData, summaryItem[1]));
+ //tskLongTerm = CPXV2_CpLogProcessLongTerm(iPos, GetMappedInfo, getCpLogHeader, dtLongLogData, summaryItem[1]);
+ //tskLongTerm.Start();
+
+ if (chkDataTsk.Result)
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo +
+ @" CPXV2 ShortTerm-CpLogProcess fail. Reason : ShortTerm Duplicated Before CpLog-File. [SystemX.Net.MiddlewareUI : MainForm.CpLogProcessShortTerm]\r\n", ConsoleColor.Yellow, LogMessageLevel.DEBUG);
+
+ bDupLogSkipState = true;
+
+ if (tskLongTerm != null)
+ lstBulkLongTermLog.Add(tskLongTerm.Result);
+
+ return false;
+ }
+
+ //Summary 객체를 이용해 DB 삽입할 SqlCommand 생성
+ SqlCommand cmd = cp.LogDataSummaryInsert(MngDBLogConn.GetDBConnectInfo().ConnShortTerm.SUMMARY_TABLE, summaryItem[0]);
+
+ //Summary 삽입 > 실패시 처리
+ bProcessResult = ExcuteNonQueryStreamProcess(eConnCategory.ShortTerm, cmd);
+
+ // TODO : SHM JSON
+ /*
+ try
+ {
+ CpxShorTermLogJson.Instance.HIST_LogSummary.Add(new CPXV2LogJson.Tables.HIST_LogSummary
+ {
+ LogNo = nCurrentLogAccessKey,
+ LogCount = nLogItemCnt + 1,
+ StationName = summaryItem[0].StationName,
+ TestType = summaryItem[0].TestType,
+ Version = summaryItem[0].Version,
+ ProdCode = summaryItem[0].ProdCode,
+ TestListFileNo = summaryItem[0].TestListFileNo,
+ TestListVariantNo = summaryItem[0].TestListVariantNo,
+ TestListCntID = summaryItem[0].TestListCntID,
+ StepVersion = summaryItem[0].StepVersion,
+ HostID = summaryItem[0].Host,
+ Section = summaryItem[0].Section,
+ ProdNo_C = summaryItem[0].ProdNoC,
+ ProdNo_P = summaryItem[0].ProdNoP,
+ Testcode = summaryItem[0].TestCode,
+ TestListFileName = summaryItem[0].TestListFileName,
+ ProductID = summaryItem[0].ProductID,
+ Result = summaryItem[0].Result,
+ Duration = summaryItem[0].Duration,
+ TestDT = Convert.ToDateTime(CPXV2_CpLogProcessInfo.strStTime)
+ });
+ CpxShorTermLogJson.Instance.SaveChanges();
+
+ }
+ catch (Exception e)
+ {
+ bProcessResult = false;
+ }
+ */
+
+ if (bProcessResult == false)
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo +
+ @" CPXV2 CpLogProcess HIST_LogSummary insert failed. [SystemX.Net.MiddlewareUI : MainForm.CPXV2_CpLogProcess]", ConsoleColor.Red, LogMessageLevel.FATAL);
+
+ //throw new Exception();
+ }
+ else
+ {
+ //CpLog 삽입할 DataRow 생성
+ DataRow[] SetMakeLogRows = CPXV2_ShortProcessMakeLogRows(nLogItemCnt + 1, thisConnInfo[iPos].dsLatestVRFYRel, dtShortLogData);
+
+ if (SetMakeLogRows == null)
+ throw new Exception("");
+
+ StringBuilder ShortLogJsonSb = new StringBuilder();
+ ShortLogJsonSb.Append(JsonConvert.SerializeObject(SetMakeLogRows.Select(x => new CPXV2Log.Tables.HIST_TestResult
+ {
+ StepID = (long)x.ItemArray[1],
+ MeasVal = (decimal)x.ItemArray[2],
+ MeasValStr = x.ItemArray[3].ToString(),
+ Message = x.ItemArray[4].ToString(),
+ GlobalMin = x.ItemArray[5].ToString(),
+ GlobalMAx = x.ItemArray[6].ToString(),
+ Result = x.ItemArray[7].ToString(),
+ SpentTime = x.ItemArray[8].ToString(),
+ })).GzipCompress());
+
+ DataTable SetProcLogTable;
+ SetProcLogTable = CPXV2_MakeProcLogTable();
+
+ DataRow SetProcLogDr = SetProcLogTable.NewRow();
+
+ //Make Comment Step
+ try
+ {
+ SetProcLogDr["No"] = Int64.MinValue;
+ SetProcLogDr["TestDT"] = DateTime.Now;
+ SetProcLogDr["LogData"] = '-';
+
+ //DataRow 를 설정된 DataTable Format으로 한행 생성
+ SetProcLogDr["No"] = CPXV2_CpLogProcessInfo.nShortTermIdent;
+ SetProcLogDr["TestDT"] = Convert.ToDateTime(CPXV2_CpLogProcessInfo.strStTime);
+
+ if (ShortLogJsonSb.ToString().Length > 0)
+ SetProcLogDr["LogData"] = ShortLogJsonSb.ToString();
+ else
+ SetProcLogDr["LogData"] = '-';
+ }
+ catch
+ {
+ SetProcLogDr["No"] = Int64.MinValue;
+ SetProcLogDr["TestDT"] = DateTime.Now;
+ SetProcLogDr["LogData"] = '-';
+
+ //throw new Exception("");
+ }
+
+ lstBulkShortTermLog.Add(SetProcLogDr);
+ }
+
+ if (tskLongTerm != null)
+ lstBulkLongTermLog.Add(tskLongTerm.Result);
+
+ //처리 시간 확인
+ CPXV2_CpLogProcessInfo.lMainMeasTime = stMeasTime.ElapsedMilliseconds;
+
+ if (GetMappedInfo.bShowCpLogProcessTime)
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo +
+ @" MainTime : " + CPXV2_CpLogProcessInfo.lMainMeasTime.ToString() + ", SubTime(LongTerm) : " + CPXV2_CpLogProcessInfo.lLongTermMeasTime + " [SystemX.Net.MiddlewareUI : MainForm.CPXV2_CpLogProcess]", ConsoleColor.Green, LogMessageLevel.DEBUG);
+ }
+
+ LogDataProcessText.Enqueue(new StringBuilder(">>[MainTime(ShortTerm)-MakeLogData][" + CPXV2_CpLogProcessInfo.lMainMeasTime + "][Include SubTime(LongTerm)-MakeLogData][" + CPXV2_CpLogProcessInfo.lLongTermMeasTime + "]\r\n"));
+ }
+ catch (Exception e)
+ {
+ bProcessResult = false;
+
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo + @" CPXV2 Make CpLogProcess fail.[SystemX.Net.MiddlewareUI : MainForm.CPXV2_CpLogProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
+ }
+ finally
+ {
+ if (bDupLogSkipState == false)
+ {
+ if (bProcessResult)
+ {
+ if (File.Exists(strSuccessFileName))
+ File.Delete(strSuccessFileName);
+ }
+ else
+ {
+ if (bRequiredProcLogFile == false)
+ {
+ if (File.Exists(strSuccessFileName))
+ File.Copy(strSuccessFileName, strFailedFileName);
+ }
+ }
+ }
+ }
+
+ return bProcessResult;
+ }
+
+ private async Task CPXV2_CpLogProcessLongTerm(int iPos, Int64 nLongTermNo, Int64 nLongTermPreNo, CpLogHeader getCpLogHeader, DataTable dtLogData, HISTLogSummary summaryItem)
+ {
+ Stopwatch stMeasTime = new Stopwatch();
+ stMeasTime.Start();
+
+ bool bProcessResult = true;
+
+ int nLogItemCnt = dtLogData.Rows.Count;
+
+ DataTable SetProcLogTable;
+ SetProcLogTable = CPXV2_MakeProcLogTable();
+
+ DataRow SetProcLogDr = SetProcLogTable.NewRow();
+
+ try
+ {
+ SetProcLogDr["No"] = Int64.MinValue;
+ SetProcLogDr["TestDT"] = DateTime.Now;
+ SetProcLogDr["LogData"] = '-';
+
+ //동일 할시 로그 미처리 및 리턴
+ var chkDataTsk = CPXV2_CheckDuplicateData(eConnCategory.LongTerm, iPos,
+ CPXV2_CpLogProcessInfo.strStationName,
+ CPXV2_CpLogProcessInfo.strHostID,
+ CPXV2_CpLogProcessInfo.strSection,
+ nLongTermPreNo);
+
+ CommonProtocol cp = new CommonProtocol();
+
+ //Summary 객체를 이용해 DB 삽입할 SqlCommand 생성
+ SqlCommand cmd = cp.LogDataSummaryInsert(MngDBLogConn.GetDBConnectInfo().ConnLongTerm.SUMMARY_TABLE, summaryItem);
+
+ if (chkDataTsk.Result)
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo +
+ @" CPXV2 LongTerm-CpLogProcess fail. Reason : LongTerm Duplicated Before CpLog-File. [SystemX.Net.MiddlewareUI : MainForm.CpLogProcessShortTerm]\r\n", ConsoleColor.Yellow, LogMessageLevel.DEBUG);
+
+ return SetProcLogDr;
+ }
+
+ //Summary 삽입 > 실패시 처리
+ bProcessResult = ExcuteNonQueryStreamProcess(eConnCategory.LongTerm, cmd);
+
+ if (bProcessResult == false)
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo +
+ @" CPXV2 CpLogProcess HIST_LogSummary insert failed. [SystemX.Net.MiddlewareUI : MainForm.CpLogProcessLongTerm]", ConsoleColor.Red, LogMessageLevel.FATAL);
+
+ throw new Exception();
+ }
+
+ //CpLog 삽입할 DataRow 생성
+ DataRow[] SetMakeLogRows = CPXV2_LongProcessMakeLogRows(nLogItemCnt + 1, thisConnInfo[iPos].dsLongTermLatestVRFYRel, dtLogData);
+
+ if (SetMakeLogRows == null)
+ throw new Exception("");
+
+ StringBuilder LongLogJsonSb = new StringBuilder();
+ LongLogJsonSb.Append(JsonConvert.SerializeObject(SetMakeLogRows.Select(x => new CPXV2Log.Tables.HIST_TestResult
+ {
+ StepID = (long)x.ItemArray[1],
+ MeasVal = (decimal)x.ItemArray[2],
+ MeasValStr = x.ItemArray[3].ToString(),
+ Message = x.ItemArray[4].ToString(),
+ GlobalMin = x.ItemArray[5].ToString(),
+ GlobalMAx = x.ItemArray[6].ToString(),
+ Result = x.ItemArray[7].ToString(),
+ SpentTime = x.ItemArray[8].ToString(),
+ })).GzipCompress());
+
+ //Make Comment Step
+ try
+ {
+ //DataRow 를 설정된 DataTable Format으로 한행 생성
+ SetProcLogDr["No"] = CPXV2_CpLogProcessInfo.nLongTermIdent;
+ SetProcLogDr["TestDT"] = Convert.ToDateTime(CPXV2_CpLogProcessInfo.strStTime);
+
+ if (LongLogJsonSb.ToString().Length > 0)
+ SetProcLogDr["LogData"] = LongLogJsonSb.ToString();
+ else
+ SetProcLogDr["LogData"] = '-';
+ }
+ catch
+ {
+ SetProcLogDr["No"] = Int64.MinValue;
+ SetProcLogDr["TestDT"] = DateTime.Now;
+ SetProcLogDr["LogData"] = '-';
+
+ throw new Exception("");
+ }
+
+ //처리 시간 확인
+ CPXV2_CpLogProcessInfo.lLongTermMeasTime = stMeasTime.ElapsedMilliseconds;
+ }
+ catch (Exception e)
+ {
+ bProcessResult = false;
+
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CPXV2_CpLogProcessInfo.strProcessDebugInfo + @" CPXV2 LongTerm Make CpLogProcess fail.[SystemX.Net.MiddlewareUI : MainForm.CpLogProcessLongTerm]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
+ }
+ finally
+ {
+ ;//
+ }
+
+ await Task.Delay(0);
+
+ return SetProcLogDr;
+ }
+ }
+}
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Command-LogScan.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Command-LogScan.cs
new file mode 100644
index 0000000..96d7027
--- /dev/null
+++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Command-LogScan.cs
@@ -0,0 +1,268 @@
+using DevExpress.Data.Helpers;
+using DevExpress.XtraBars;
+using DevExpress.XtraBars.Navigation;
+
+using System;
+using System.Net;
+using System.Net.Sockets;
+using System.Runtime.InteropServices;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Data.SqlClient;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using System.Xml.Linq;
+using System.IO;
+using System.Diagnostics;
+using System.Threading;
+using System.Threading.Tasks;
+
+using SystemX.Net;
+using SystemX.Common;
+using SystemX.Net.BaseProtocol;
+using SystemX.Net.Comm;
+using SystemX.Net.Schedule;
+using SystemX.Net.DB.LogProcess;
+using SystemX.Common.Serialization;
+using SystemX.Common.Archive;
+
+//using SystemX.Common.Protocol.SIA;
+
+using DevExpress.Utils.Extensions;
+
+using static SystemX.Net.Platform.Common.Util.LogMessage;
+using static SystemX.Net.DB.LogProcess.XLogDBConnManager;
+using SystemX.Net.Platform.SystemX.Common;
+
+namespace SystemX.Net.MiddlewareUI
+{
+ public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm
+ {
+ private async void WatchRecvCommandQueue()
+ {
+ await Task.Delay(250);
+
+ while (!m_bTaskCommandBlock)
+ {
+ try
+ {
+ CT.ThrowIfCancellationRequested();
+ }
+ catch (OperationCanceledException CancelEx)
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @" Work Canceled. [SystemX.Net.MiddlewareUI : MainForm.WatchRecvCommndQueue]\r\n" + CancelEx.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
+
+ break;
+ }
+ //
+ try
+ {
+ if (bTaskCommandWaitLock == false)
+ QueryRecvCommandQueue();
+ }
+ catch (Exception e)
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"General Queue Process failed.[1] [SystemX.Net.MiddlewareUI : MainForm.WatchRecvCommndQueue]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
+ }
+
+ await Task.Delay(500);
+ }
+ }
+
+ private bool LogMemoryPushProcess(int nPos, int nStPos)
+ {
+ int nSetSize = int.MaxValue;
+ byte[] ucSetLogArray = null;
+
+ bool bProcResult = false;
+
+ using (LogSharedMemory memLog = new LogSharedMemory(ParamterMapLog))
+ {
+ if (memLog.CheckFile(nPos))
+ {
+ LogMappedPacket LogMapFile = new LogMappedPacket();
+ nSetSize = Marshal.SizeOf(LogMapFile);
+ ucSetLogArray = new byte[nSetSize];
+ LogMapFile = (LogMappedPacket)SystemXNetSerialization.RawDeSerialize(ucSetLogArray, LogMapFile.GetType());
+
+ bool bFindLogResult = false;
+
+ LogMapFile = memLog.Get(nPos, nStPos, out bFindLogResult, nSetSize).Value;
+
+ if (bFindLogResult == false)
+ return false;
+
+ if (LogMapFile.bLogFileReadComplete == false)
+ {
+ LogMapFile.bLogFileReadComplete = true;
+
+ memLog.Set(nPos, LogMapFile);
+
+ StringBuilder sb = new StringBuilder();
+ sb.Append("[" + (++nEnqueueCount).ToString() + "][Enqueue]");
+ sb.Append("[");
+ sb.Append(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
+ sb.Append("], ");
+ sb.Append("Type [" + LogMapFile.objLogType[0].Data.ToString() + "], ");
+ sb.Append("S Port [" + LogMapFile.nStreamPort.ToString() + "], ");
+ sb.Append("C Port [" + LogMapFile.nCommandPort.ToString() + "], ");
+ sb.Append("Size [" + LogMapFile.nLogDataSize.ToString() + "], ");
+ sb.Append("Number [" + LogMapFile.nNumber.ToString() + "], ");
+ sb.Append("Host [" + LogMapFile.objHost[0].Data + "], ");
+ sb.Append("Section [" + LogMapFile.objSection[0].Data + "], ");
+ sb.Append("St Name [" + LogMapFile.objStationName[0].Data + "], ");
+ sb.Append("St ID [" + LogMapFile.nStationID.ToString() + "], ");
+ sb.Append("File Name [" + LogMapFile.objOptionFileName[0].Data + "], ");
+ sb.Append("File Extension [" + LogMapFile.objOptionFileExtension[0].Data + "] ");
+
+ /*
+ sb.Append("TL ID[" + LogMapFile.objResultTestListCntID[0].Data + "], ");
+ sb.Append("V[" + LogMapFile.objProdPNo[0].Data + "], ");
+ sb.Append("PN[" + LogMapFile.objProdCNo[0].Data + "], ");
+ sb.Append("TT[" + LogMapFile.objTestType[0].Data + "], ");
+ sb.Append("TC[" + LogMapFile.objTestCode[0].Data + "], ");
+ sb.Append("Ver[" + LogMapFile.objVersion[0].Data + "], ");
+ sb.Append("PC[" + LogMapFile.objProdCode[0].Data + "], ");
+ sb.Append("DB V No[" + LogMapFile.nTestListVariantNo.ToString() + "] ");
+ */
+
+ sb.AppendLine();
+
+ if (nEnqueueCount >= Int64.MaxValue)
+ nEnqueueCount = 0;
+
+ LogDataRecvText.Enqueue(sb);
+
+ LogDataQueue[nPos].Enqueue(LogMapFile);
+
+ bProcResult = true;
+ }
+ }
+ }
+
+ return bProcResult;
+ }
+
+ private bool QueryRecvCommandQueue()
+ {
+ bool bState = true;
+
+ string strProcessDebugInfo = string.Empty;
+
+ long l1 = long.MinValue;
+ long l2 = long.MinValue;
+
+ try
+ {
+ bTaskCommandWaitLock = true;
+
+ Stopwatch stProcessTimeChk = new Stopwatch();
+ stProcessTimeChk.Start();
+
+ using (InfoLogSharedMemory memInfoLog = new InfoLogSharedMemory(ParamterMapInfoLog))
+ {
+ InfoLogMappedPacket InfoLogMapFile = new InfoLogMappedPacket();
+ int nSetSize = Marshal.SizeOf(InfoLogMapFile);
+ byte[] ucSetLogArray = new byte[nSetSize];
+ InfoLogMapFile = (InfoLogMappedPacket)SystemXNetSerialization.RawDeSerialize(ucSetLogArray, InfoLogMapFile.GetType());
+
+ if (memInfoLog.CheckFile())
+ {
+ bool bFindInfoLogResult = false;
+
+ //로그 처리가 필요한 위치 조회
+ bool[] bGetStationReadyLog = memInfoLog.Get(out bFindInfoLogResult, nSetSize);
+
+ if (bFindInfoLogResult == false)
+ return bState;
+
+ //Array.Copy(bGetStationReadyLog, 0, InfoLogMapFile.bLogDataReady, 0, SharedMemory.nMaxInfoFullAccessSize);
+
+ Array.Clear(bCompareLogReadyState, 0, SharedMemory.nMaxInfoFullAccessSize);
+ for (int i = 0; i < SharedMemory.nMaxInfoFullAccessSize; i++)
+ {
+ if (bGetStationReadyLog[i] != bBeforeLogReadyState[i])
+ bCompareLogReadyState[i] = true;
+ }
+
+ //존재할 경우
+ if (bCompareLogReadyState.Any(x => x == true))
+ {
+ //존재하는 개수 파악
+ bool[] arrCheckNum = Array.FindAll(bCompareLogReadyState, x => x == true);
+
+ //개수 확인
+ int nFindCount = arrCheckNum.Count();
+
+ //개수 만큼 Index 확인
+ for (int i = 0; i < nFindCount; i++)
+ {
+ Stopwatch stItemTimeChk = new Stopwatch();
+ stItemTimeChk.Start();
+
+ int nIdx = Array.FindIndex(bCompareLogReadyState, x => x == true);
+
+ //Index 포트 변환 및 Station(최대 8) 확인
+ int nPos = (nIdx / SharedMemory.nMaxStationSize) + PORT_DISTRIBUTION_NUM;
+
+ int nAccessPart = nIdx / SharedMemory.nMaxStationSize;
+ int nSubPos = nIdx % SharedMemory.nMaxStationSize;
+
+ if (bCompareLogReadyState[nIdx])
+ {
+ LogMemoryPushProcess(nPos, nSubPos);
+
+ bCompareLogReadyState[nIdx] = false;
+ }
+
+ l2 = stItemTimeChk.ElapsedMilliseconds;
+ }
+
+ /*for (int i = PORT_DISTRIBUTION_NUM; i < ALL_MANAGE_NUM && !m_bTaskStreamBlock; i++)
+ {
+ for (int j = (i - PORT_DISTRIBUTION_NUM) * SharedMemory.nMaxStationSize;
+ j < ((i - PORT_DISTRIBUTION_NUM) * SharedMemory.nMaxStationSize) + SharedMemory.nMaxStationSize; j++)
+ {
+ if (bGetStationReadyLog[j])
+ {
+ LogMemoryProcess(i, j);
+
+ bGetStationReadyLog[j] = false;
+ }
+ }
+
+ Thread.Sleep(10);
+ }*/
+
+ //memInfoLog.Set(bGetStationReadyLog);
+ Array.Copy(bGetStationReadyLog, 0, bBeforeLogReadyState, 0, SharedMemory.nMaxInfoFullAccessSize);
+ }
+ }
+
+ }
+
+ l1 = stProcessTimeChk.ElapsedMilliseconds;
+
+ if (l1 != long.MinValue && l2 != long.MinValue)
+ {
+ LogDataRecvText.Enqueue(new StringBuilder(">>[Enqueue-Process][" + l1.ToString() + "][Enqueue-Item][" + l2.ToString() + "]\r\n"));
+ }
+ }
+ catch (Exception e)
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo + @" Recv queue process fail.[SystemX.Net.MiddlewareUI : MainForm.QueryRecvCommandQueue]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
+
+ bState = false;
+ }
+ finally
+ {
+ bTaskCommandWaitLock = false;
+ }
+
+ return bState;
+ }
+ }
+}
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/FileProcess.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/FileProcess.cs
new file mode 100644
index 0000000..62dff1a
--- /dev/null
+++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/FileProcess.cs
@@ -0,0 +1,73 @@
+using DevExpress.Data.Helpers;
+using DevExpress.XtraBars;
+using DevExpress.XtraBars.Navigation;
+
+using System;
+using System.Net;
+using System.Net.Sockets;
+using System.Runtime.InteropServices;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Data.SqlClient;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using System.Xml.Linq;
+using System.IO;
+using System.Diagnostics;
+
+using SystemX.Net;
+using SystemX.Common;
+using SystemX.Net.BaseProtocol;
+using SystemX.Net.Comm;
+using SystemX.Net.Schedule;
+using SystemX.Net.DB.LogProcess;
+using SystemX.Common.Serialization;
+using SystemX.Common.Archive;
+using System.Threading.Tasks;
+
+//using SystemX.Common.Protocol.SIA;
+
+using static SystemX.Net.Platform.Common.Util.LogMessage;
+using SystemX.Net.Platform.Common.ExtensionMethods;
+using SystemX.Net.Platform.SystemX.Common;
+
+namespace SystemX.Net.MiddlewareUI
+{
+ public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm
+ {
+ /*
+ private string GetFileName(int iPos, LogMappedPacket GetMappedInfo, string strCreateName, string strSubName)
+ {
+ Random randNumber = new Random();
+
+ string strFileName = strCreateName;
+
+ if (GetMappedInfo.objOptionFileName[0].Data.CompareTo("-") == 0)
+ strFileName += @strSubName + @randNumber.Next().ToString() + @GetMappedInfo.objOptionFileExtension[0].Data;
+ else
+ strFileName += @GetMappedInfo.objOptionFileName[0].Data + @GetMappedInfo.objOptionFileExtension[0].Data;
+
+ if (File.Exists(strFileName) == true)
+ {
+ while (true)
+ {
+ strFileName = strCreateName;
+
+ if (GetMappedInfo.objOptionFileName[0].Data.CompareTo("-") == 0)
+ strFileName += @strSubName + @randNumber.Next().ToString() + @GetMappedInfo.objOptionFileExtension[0].Data;
+ else
+ strFileName += @GetMappedInfo.objOptionFileName[0].Data + "_" + @randNumber.Next().ToString() + @GetMappedInfo.objOptionFileExtension[0].Data;
+
+ if (File.Exists(strFileName) == false)
+ break;
+ }
+ }
+
+ return strFileName;
+ }
+ */
+ }
+}
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Function.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Function.cs
new file mode 100644
index 0000000..f2ae1ea
--- /dev/null
+++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Function.cs
@@ -0,0 +1,214 @@
+using System;
+using System.Net;
+using System.Net.Sockets;
+using System.Runtime.InteropServices;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Data.SqlClient;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using System.Xml.Linq;
+using System.IO;
+using System.Diagnostics;
+
+using SystemX.Net;
+using SystemX.Common;
+using SystemX.Net.BaseProtocol;
+using SystemX.Net.Comm;
+using SystemX.Net.Schedule;
+using SystemX.Net.DB.LogProcess;
+using SystemX.Common.Serialization;
+using SystemX.Common.Archive;
+using System.Threading.Tasks;
+
+//using SystemX.Common.Protocol.SIA;
+
+using static SystemX.Net.Platform.Common.Util.LogMessage;
+using System.Threading;
+using SystemX.Net.Platform.Common.ExtensionMethods;
+
+using DevExpress.Data.Helpers;
+using DevExpress.XtraBars;
+using DevExpress.XtraBars.Navigation;
+using static SystemX.Net.DB.LogProcess.XLogDBConnManager;
+using System.Net.NetworkInformation;
+
+namespace SystemX.Net.MiddlewareUI
+{
+ public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm
+ {
+ public bool CPX_ReadVRFYList(int nConnId, int nTestListNo, string strProcessDebugInfo, out int nReadStepVersion, /*int nSetReadStepVersion,*/ int nLoadPosition = 0, bool bForceRead = true)
+ {
+ nReadStepVersion = int.MaxValue;
+
+ try
+ {
+ string strGetVersionTableName = MngDBLogConn.GetDBConnectInfo().ConnMain.VERSION_TABLE;
+ string strGetVRFYTableName = MngDBLogConn.GetDBConnectInfo().ConnMain.VRFY_TABLE;
+
+ try
+ {
+ //해당 테스트리스 정보 마지막 업데이트 번호 가져오기
+ thisConnInfo[nConnId].getLatestStepVer = QueryStreamProcess(eConnCategory.Main, "SELECT LatestStepVersion FROM [" + strGetVersionTableName + "] WHERE TestlistNo = " + nTestListNo + ";");
+
+ nReadStepVersion = Convert.ToInt32(thisConnInfo[nConnId].getLatestStepVer.Tables[0].Rows[0]["LatestStepVersion"]);
+ }
+ catch
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo +
+ @" CpLogProcess [" + strGetVersionTableName + "] MSV failed to obtain the most recent update number for VRFY (VRFY could not be found with the loading test list information.). [SystemX.Net.MiddlewareUI : MainForm.ReadVRFYList]", ConsoleColor.Red, LogMessageLevel.FATAL);
+
+ throw new Exception();
+ }
+
+ //이전 버전 사용 일시
+ if (nLoadPosition > 0)
+ nReadStepVersion -= nLoadPosition;
+
+ /* Changed
+ * 마지막 업데이트 번호가 다를때만 테스트리스트(VRFY) 갱신(Enabled Step 별 가장 최근 업데이트 번호 목록 정리)
+ * > 항상 최근 해당 테스트리스트(VRFY) 조회로 변경
+ * > 매번 조회시 속도 문제로 동일한 VRFY일 경우 SKIP
+ * > INDEX 사용
+ */
+ if (bForceRead ||
+ (thisConnInfo[nConnId].bQueryVRFYLoaded == false ||
+ thisConnInfo[nConnId].nLastQueryTLFileNumber != nTestListNo ||
+ thisConnInfo[nConnId].nLastQueryTLStepVersion != nReadStepVersion))
+ {
+ try
+ {
+ thisConnInfo[nConnId].dsLatestVRFYRel = QueryStreamProcess(eConnCategory.Main, "SELECT * FROM ( " +
+ "SELECT *, ROW_NUMBER() OVER(PARTITION BY StepID ORDER BY StepVersion DESC) " +
+ "AS RN FROM [" + strGetVRFYTableName + "] WITH (INDEX=[CSK_VRFY_Release_1]) WHERE TestlistNo = " + nTestListNo + " " +
+ "AND StepVersion <= " + nReadStepVersion + ") X WHERE RN = 1 ORDER BY X.StepID ASC;");
+
+ thisConnInfo[nConnId].dsLongTermLatestVRFYRel = thisConnInfo[nConnId].dsLatestVRFYRel.Copy();
+
+ DataColumn[] keys1 = new DataColumn[1];
+ keys1[0] = new DataColumn();
+ keys1[0] = thisConnInfo[nConnId].dsLatestVRFYRel.Tables[0].Columns["StepID"];
+
+ thisConnInfo[nConnId].dsLatestVRFYRel.Tables[0].PrimaryKey = keys1;
+
+ DataColumn[] keys2 = new DataColumn[1];
+ keys2[0] = new DataColumn();
+ keys2[0] = thisConnInfo[nConnId].dsLongTermLatestVRFYRel.Tables[0].Columns["StepID"];
+
+ thisConnInfo[nConnId].dsLongTermLatestVRFYRel.Tables[0].PrimaryKey = keys2;
+
+ thisConnInfo[nConnId].nLastQueryTLFileNumber = nTestListNo;
+ thisConnInfo[nConnId].nLastQueryTLStepVersion = nReadStepVersion;
+
+ thisConnInfo[nConnId].bQueryVRFYLoaded = true;
+ }
+ catch
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo +
+ @" CpLogProcess Failed to get list from [" + strGetVRFYTableName + "]. [SystemX.Net.MiddlewareUI : MainForm.ReadVRFYList]", ConsoleColor.Red, LogMessageLevel.FATAL);
+
+ throw new Exception();
+ }
+ }
+ }
+ catch
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ public bool CPXV2_ReadVRFYList(int nConnId, int nTestListFileNo, int nTestListVariantNo, string strProcessDebugInfo, out int nReadStepVersion, /*int nSetReadStepVersion,*/ int nLoadPosition = 0, bool bForceRead = true)
+ {
+ nReadStepVersion = int.MaxValue;
+
+ try
+ {
+ //HIST_TestListFileLatestStepVersion
+ //VRFY_TestListFileRelease
+
+ string strGetVersionTableName = MngDBLogConn.GetDBConnectInfo().ConnMain.VERSION_TABLE;
+ string strGetVRFYTableName = MngDBLogConn.GetDBConnectInfo().ConnMain.VRFY_TABLE;
+
+ try
+ {
+ //해당 테스트리스 정보 마지막 업데이트 번호 가져오기
+ thisConnInfo[nConnId].getLatestStepVer = QueryStreamProcess(eConnCategory.Main, "SELECT LatestStepVersion FROM [" + strGetVersionTableName + "] WITH(NOLOCK) WHERE TestListFileNo = " + nTestListFileNo + ";");
+
+ nReadStepVersion = Convert.ToInt32(thisConnInfo[nConnId].getLatestStepVer.Tables[0].Rows[0]["LatestStepVersion"]);
+ }
+ catch
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo +
+ @" CpLogProcess [" + strGetVersionTableName + "] MSV failed to obtain the most recent update number for VRFY (VRFY could not be found with the loading test list information.). [SystemX.Net.MiddlewareUI : MainForm.ReadVRFYList]", ConsoleColor.Red, LogMessageLevel.FATAL);
+
+ throw new Exception();
+ }
+
+ //이전 버전 사용 일시
+ if (nLoadPosition > 0)
+ nReadStepVersion -= nLoadPosition;
+
+ /* Changed
+ * 마지막 업데이트 번호가 다를때만 테스트리스트(VRFY) 갱신(Enabled Step 별 가장 최근 업데이트 번호 목록 정리)
+ * > 항상 최근 해당 테스트리스트(VRFY) 조회로 변경
+ * > 매번 조회시 속도 문제로 동일한 VRFY일 경우 SKIP
+ * > INDEX 사용
+ */
+ if (bForceRead ||
+ (thisConnInfo[nConnId].bQueryVRFYLoaded == false ||
+ thisConnInfo[nConnId].nLastQueryTLFileNumber != nTestListFileNo ||
+ thisConnInfo[nConnId].nLastQueryTLVariantNumber != nTestListVariantNo ||
+ thisConnInfo[nConnId].nLastQueryTLStepVersion != nReadStepVersion))
+ {
+ try
+ {
+ string strQueryVRFY = "SELECT * FROM ( " +
+ "SELECT *, ROW_NUMBER() OVER(PARTITION BY StepID ORDER BY StepVersion DESC) " +
+ "AS RN FROM [" + strGetVRFYTableName + "] WITH (NOLOCK, INDEX=[CSK_VRFY_Release_2]) WHERE TestListFileNo = " + nTestListFileNo + " " +
+ "AND StepVersion <= " + nReadStepVersion + ") X WHERE RN = 1 ORDER BY X.StepID ASC;";
+
+ thisConnInfo[nConnId].dsLatestVRFYRel = QueryStreamProcess(eConnCategory.Main, strQueryVRFY);
+
+ thisConnInfo[nConnId].dsLongTermLatestVRFYRel = thisConnInfo[nConnId].dsLatestVRFYRel.Copy();
+
+ DataColumn[] keys1 = new DataColumn[1];
+ keys1[0] = new DataColumn();
+ keys1[0] = thisConnInfo[nConnId].dsLatestVRFYRel.Tables[0].Columns["StepID"];
+
+ thisConnInfo[nConnId].dsLatestVRFYRel.Tables[0].PrimaryKey = keys1;
+
+ DataColumn[] keys2 = new DataColumn[1];
+ keys2[0] = new DataColumn();
+ keys2[0] = thisConnInfo[nConnId].dsLongTermLatestVRFYRel.Tables[0].Columns["StepID"];
+
+ thisConnInfo[nConnId].dsLongTermLatestVRFYRel.Tables[0].PrimaryKey = keys2;
+
+ thisConnInfo[nConnId].nLastQueryTLFileNumber = nTestListFileNo;
+ thisConnInfo[nConnId].nLastQueryTLVariantNumber = nTestListVariantNo;
+ thisConnInfo[nConnId].nLastQueryTLStepVersion = nReadStepVersion;
+
+ thisConnInfo[nConnId].bQueryVRFYLoaded = true;
+ }
+ catch
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo +
+ @" CpLogProcess Failed to get list from [" + strGetVRFYTableName + "]. [SystemX.Net.MiddlewareUI : MainForm.ReadVRFYList]", ConsoleColor.Red, LogMessageLevel.FATAL);
+
+ throw new Exception();
+ }
+ }
+ }
+ catch
+ {
+ return false;
+ }
+
+ return true;
+ }
+ }
+}
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Query.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Query.cs
new file mode 100644
index 0000000..706d07b
--- /dev/null
+++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Query.cs
@@ -0,0 +1,456 @@
+using DevExpress.Data.Helpers;
+using DevExpress.XtraBars;
+using DevExpress.XtraBars.Navigation;
+
+using System;
+using System.Net;
+using System.Net.Sockets;
+using System.Runtime.InteropServices;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Data.SqlClient;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using System.Xml.Linq;
+using System.IO;
+using System.Diagnostics;
+
+using SystemX.Net;
+using SystemX.Common;
+using SystemX.Net.BaseProtocol;
+using SystemX.Net.Comm;
+using SystemX.Net.Schedule;
+using SystemX.Net.DB.LogProcess;
+using SystemX.Common.Serialization;
+using SystemX.Common.Archive;
+using System.Threading.Tasks;
+
+//using SystemX.Common.Protocol.SIA;
+
+using SystemX.Net.Middleware.Log.Commons;
+
+using static SystemX.Net.Platform.Common.Util.LogMessage;
+using System.Threading;
+using static SystemX.Net.DB.LogProcess.XLogDBConnManager;
+
+namespace SystemX.Net.MiddlewareUI
+{
+ public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm
+ {
+ private bool IsImageExtension(string strFileNameInfo, bool bOnlyExtension = true)
+ {
+ if (bOnlyExtension)
+ return -1 != Array.IndexOf(COMMON.mediaExtensions, strFileNameInfo.ToUpperInvariant());
+ else
+ return -1 != Array.IndexOf(COMMON.mediaExtensions, Path.GetExtension(strFileNameInfo).ToUpperInvariant());
+ }
+
+ public List QueryStreamProcess(string strGetQuery, out byte[] ucQueryByteArray, out DataSet setResultDataSet)
+ {
+ SqlDataReader xSqlReader = null;
+
+ int iFieldCnt = 0;
+ int iRecordsAffectedCnt = 0;
+ bool bHasRow = false;
+
+ ucQueryByteArray = null;
+
+ setResultDataSet = null;
+
+ DataSet ds = new DataSet();
+ DataTable dt = new DataTable();
+
+ DataSet getDS = Task.Run(() =>
+ {
+ try
+ {
+ try
+ {
+ xSqlReader = MngDBLogConn.CurrentConnection(eConnCategory.Main).QueryDatabase(strGetQuery);
+
+ if (xSqlReader != null)
+ {
+ iFieldCnt = xSqlReader.FieldCount;
+ iRecordsAffectedCnt = xSqlReader.RecordsAffected;
+ bHasRow = xSqlReader.HasRows;
+
+ dt.Load(xSqlReader);
+ ds.Tables.Add(dt);
+ }
+ }
+ catch (Exception e)
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + strGetQuery + "> Query process fail![SystemX.Net.MiddlewareUI : MainForm.QueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
+ }
+ }
+ finally
+ {
+ if (xSqlReader != null)
+ xSqlReader.Close();
+
+ xSqlReader = null;
+ }
+
+ return ds;
+ }).Result;
+
+ if(XCommons.isHasRow(ds))
+ setResultDataSet = ds.Copy();
+
+ List getStreamList = XCommons.ObjectToByteStreamList(new BASE_PROTOCOL(BASE_PROTOCOL.PROTOCOL_CODE.RAW_SIZE), getDS);
+
+ return getStreamList;
+ }
+
+ public void QueryResultRemake(DataSet dsResult, int iSetFieldCnt, int iSetRecordsAffectedCnt, bool bSetHasRow, out byte[] ucQueryByteArray, params string[] strParameters)
+ {
+ int iFieldCnt = iSetFieldCnt;
+ int iRecordsAffectedCnt = iSetRecordsAffectedCnt;
+ bool bHasRow = bSetHasRow;
+
+ ucQueryByteArray = null;
+
+ ucQueryByteArray = XCommons.ObjectToByteStream(new BASE_PROTOCOL(BASE_PROTOCOL.PROTOCOL_CODE.DATASET_TRANSEFER),
+ dsResult,
+ null,
+ 0,
+ iRecordsAffectedCnt,
+ bHasRow,
+ iFieldCnt,
+ strParameters);
+ }
+
+ public Tuple QueryProcess(string strGetQuery, out byte[] ucQueryByteArray, params string[] strParameters)
+ {
+ SqlDataReader xSqlReader = null;
+
+ int iFieldCnt = 0;
+ int iRecordsAffectedCnt = 0;
+ bool bHasRow = false;
+
+ ucQueryByteArray = null;
+
+ DataSet getDS = Task.Run(() =>
+ {
+ DataSet ds = new DataSet();
+ DataTable dt = new DataTable();
+
+ try
+ {
+ try
+ {
+ xSqlReader = MngDBLogConn.CurrentConnection(eConnCategory.Main).QueryDatabase(strGetQuery);
+
+ if (xSqlReader != null)
+ {
+ iFieldCnt = xSqlReader.FieldCount;
+ iRecordsAffectedCnt = xSqlReader.RecordsAffected;
+ bHasRow = xSqlReader.HasRows;
+
+ dt.Load(xSqlReader);
+ ds.Tables.Add(dt);
+ }
+ }
+ catch (Exception e)
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + strGetQuery + "> Query process fail![SystemX.Net.MiddlewareUI : MainForm.QueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
+ }
+ }
+ finally
+ {
+ if (xSqlReader != null)
+ xSqlReader.Close();
+
+ xSqlReader = null;
+ }
+
+ return ds;
+ }).Result;
+
+ ucQueryByteArray = XCommons.ObjectToByteStream(new BASE_PROTOCOL(BASE_PROTOCOL.PROTOCOL_CODE.DATASET_TRANSEFER),
+ getDS,
+ null,
+ 0,
+ iRecordsAffectedCnt,
+ bHasRow,
+ iFieldCnt,
+ strParameters);
+
+ return new Tuple(getDS, iRecordsAffectedCnt, iFieldCnt, bHasRow);
+ }
+
+ private bool ExcuteNonQueryCommandProcess(SqlCommand cmd)
+ {
+ return Task.Run(() =>
+ {
+ bool bExcuteResult = true;
+
+ try
+ {
+ try
+ {
+ bExcuteResult = MngDBLogConn.CurrentConnection(eConnCategory.Main).ExecuteNonCommandQuery(cmd);
+ }
+ catch (Exception e)
+ {
+ bExcuteResult = false;
+
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + cmd.CommandText + "> Query excute fail![SystemX.Net.MiddlewareUI : MainForm.AsyncExcuteNonQueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
+ }
+ }
+ finally
+ {
+ ;
+ }
+
+ return bExcuteResult;
+ }).Result;
+ }
+
+ private bool ExcuteNonQueryStreamProcess(eConnCategory eConnType, SqlCommand cmd)
+ {
+ return Task.Run(() =>
+ {
+ bool bExcuteResult = true;
+
+ try
+ {
+ try
+ {
+ bExcuteResult = MngDBLogConn.CurrentConnection(eConnType).ExecuteNonStreamQuery(cmd);
+ }
+ catch (Exception e)
+ {
+ bExcuteResult = false;
+
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + cmd.CommandText + "> Query excute fail![SystemX.Net.MiddlewareUI : MainForm.AsyncExcuteNonQueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
+ }
+ }
+ finally
+ {
+ ;
+ }
+
+ return bExcuteResult;
+ }).Result;
+ }
+
+ private DataSet QueryCommandProcess(eConnCategory eConnType, string strGetQuery, bool bUseTransaction = false)
+ {
+ return Task.Run(() =>
+ {
+ DataSet ds = new DataSet();
+ DataTable dt = new DataTable();
+
+ try
+ {
+ SqlDataReader xSqlReader = null;
+
+ try
+ {
+ int iFieldCnt = 0;
+ int iRecordsAffectedCnt = 0;
+ bool bHasRow = false;
+
+ try
+ {
+ xSqlReader = MngDBLogConn.CurrentConnection(eConnType).QueryCommandDatabase(strGetQuery, bUseTransaction);
+
+ if (xSqlReader != null)
+ {
+ iFieldCnt = xSqlReader.FieldCount;
+ iRecordsAffectedCnt = xSqlReader.RecordsAffected;
+ bHasRow = xSqlReader.HasRows;
+
+ dt.Load(xSqlReader);
+ ds.Tables.Add(dt);
+ }
+ }
+ catch (Exception e)
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + strGetQuery + "> Query process fail![SystemX.Net.MiddlewareUI : MainForm.AsyncQueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
+ }
+ }
+ finally
+ {
+ if (xSqlReader != null)
+ xSqlReader.Close();
+
+ xSqlReader = null;
+ }
+ }
+ finally
+ {
+ ;
+ }
+
+ return ds;
+ }).Result;
+ }
+
+ private DataSet QueryStreamProcess(eConnCategory eConnType, string strGetQuery)
+ {
+ return Task.Run(() =>
+ {
+ DataSet ds = new DataSet();
+ DataTable dt = new DataTable();
+
+ try
+ {
+ SqlDataReader xSqlReader = null;
+
+ try
+ {
+ int iFieldCnt = 0;
+ int iRecordsAffectedCnt = 0;
+ bool bHasRow = false;
+
+ try
+ {
+ xSqlReader = MngDBLogConn.CurrentConnection(eConnType).QueryStreamDatabase(strGetQuery);
+
+ if (xSqlReader != null)
+ {
+ iFieldCnt = xSqlReader.FieldCount;
+ iRecordsAffectedCnt = xSqlReader.RecordsAffected;
+ bHasRow = xSqlReader.HasRows;
+
+ dt.Load(xSqlReader);
+ ds.Tables.Add(dt);
+ }
+ }
+ catch (Exception e)
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + strGetQuery + "> Query process fail![SystemX.Net.MiddlewareUI : MainForm.AsyncQueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
+ }
+ }
+ finally
+ {
+ if (xSqlReader != null)
+ xSqlReader.Close();
+
+ xSqlReader = null;
+ }
+ }
+ finally
+ {
+ ;
+ }
+
+ return ds;
+ }).Result;
+ }
+
+ private DataSet QueryStreamProcess(eConnCategory eConnType, string strGetQuery, ref int nRecAffectedCnt)
+ {
+ nRecAffectedCnt = -2;
+
+ int iFieldCnt = 0;
+ int iRecordsAffectedCnt = -2;
+ bool bHasRow = false;
+
+ DataSet dsResult = null;
+
+ dsResult = Task.Run(() =>
+ {
+ DataSet ds = new DataSet();
+ DataTable dt = new DataTable();
+
+ try
+ {
+ SqlDataReader xSqlReader = null;
+
+ try
+ {
+
+ try
+ {
+ xSqlReader = MngDBLogConn.CurrentConnection(eConnType).QueryStreamDatabase(strGetQuery);
+
+ if (xSqlReader != null)
+ {
+ iFieldCnt = xSqlReader.FieldCount;
+ //Default -2 Fail 0 Select -1
+ iRecordsAffectedCnt = xSqlReader.RecordsAffected;
+ bHasRow = xSqlReader.HasRows;
+
+ dt.Load(xSqlReader);
+ ds.Tables.Add(dt);
+ }
+ }
+ catch (Exception e)
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + strGetQuery + "> Query process fail![SystemX.Net.MiddlewareUI : MainForm.AsyncQueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
+ }
+ }
+ finally
+ {
+ if (xSqlReader != null)
+ xSqlReader.Close();
+
+ xSqlReader = null;
+ }
+ }
+ finally
+ {
+ ;
+ }
+
+ return ds;
+ }).Result;
+
+ nRecAffectedCnt = iRecordsAffectedCnt;
+
+ return dsResult;
+ }
+
+ private DataSet QueryProcess(string strGetQuery)
+ {
+ return Task.Run(() =>
+ {
+ SqlDataReader xSqlReader = null;
+
+ DataSet ds = new DataSet();
+ DataTable dt = new DataTable();
+
+ int iFieldCnt = 0;
+ int iRecordsAffectedCnt = 0;
+ bool bHasRow = false;
+
+ try
+ {
+ try
+ {
+ xSqlReader = MngDBLogConn.CurrentConnection(eConnCategory.Main).QueryDatabaseSub(strGetQuery);
+
+ if (xSqlReader != null)
+ {
+ iFieldCnt = xSqlReader.FieldCount;
+ iRecordsAffectedCnt = xSqlReader.RecordsAffected;
+ bHasRow = xSqlReader.HasRows;
+
+ dt.Load(xSqlReader);
+ ds.Tables.Add(dt);
+ }
+ }
+ catch (Exception e)
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"<" + strGetQuery + "> Query process fail![SystemX.Net.MiddlewareUI : MainForm.QueryProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
+ }
+ }
+ finally
+ {
+ if (xSqlReader != null)
+ xSqlReader.Close();
+
+ xSqlReader = null;
+ }
+
+ return ds;
+ }).Result;
+ }
+ }
+}
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Stream-LogProcess.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Stream-LogProcess.cs
new file mode 100644
index 0000000..8a544a2
--- /dev/null
+++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/Stream-LogProcess.cs
@@ -0,0 +1,701 @@
+using DevExpress.Data.Helpers;
+using DevExpress.XtraBars;
+using DevExpress.XtraBars.Navigation;
+
+using System;
+using System.Net;
+using System.Net.Sockets;
+using System.Runtime.InteropServices;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Data.SqlClient;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using System.Xml.Linq;
+using System.IO;
+using System.IO.Compression;
+using System.Diagnostics;
+
+using SystemX.Net;
+using SystemX.Common;
+using SystemX.Net.BaseProtocol;
+using SystemX.Net.Comm;
+using SystemX.Net.Schedule;
+using SystemX.Net.DB.LogProcess;
+using SystemX.Common.Serialization;
+using SystemX.Common.Archive;
+using System.Threading.Tasks;
+
+//using SystemX.Common.Protocol.SIA;
+
+using static SystemX.Net.Platform.Common.Util.LogMessage;
+using System.Threading;
+using SystemX.Net.Middleware.Log.Commons;
+using SystemX.Net.Platform.SystemX.Common;
+using static SystemX.Net.DB.LogProcess.XLogDBConnManager;
+using SystemX.Net.Middleware.Log.DeleteProc;
+using SystemX.Net.Comm.IIS_FTP;
+
+namespace SystemX.Net.MiddlewareUI
+{
+ public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm
+ {
+ private async void WatchRecvStreamQueue()
+ {
+ await Task.Delay(250);
+
+ stCheckTermBulkWaitTime.Start();
+ while (!m_bTaskStreamBlock)
+ {
+ try
+ {
+ CT.ThrowIfCancellationRequested();
+ }
+ catch (OperationCanceledException CancelEx)
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @" Work Canceled. [SystemX.Net.MiddlewareUI : MainForm.WatchRecvStreamQueue]\r\n" + CancelEx.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
+
+ break;
+ }
+ //
+ try
+ {
+ if (bDatabaseConnResult == false)
+ continue;
+
+ if (MngDBLogConn.GetMainDBAccessTime() >= 120000)
+ QueryStreamProcess(eConnCategory.Main, "SELECT GETDATE() AS 'CHECK PING';");
+ if (MngDBLogConn.GetShortTermDBAccessTime() >= 120000)
+ QueryStreamProcess(eConnCategory.ShortTerm, "SELECT GETDATE() AS 'CHECK PING';");
+ if (MngDBLogConn.GetLongTermDBAccessTime() >= 120000)
+ QueryStreamProcess(eConnCategory.LongTerm, "SELECT GETDATE() AS 'CHECK PING';");
+
+ nBulkLogCount = lstBulkTermLogInfo.Count;
+ nBulkLongTermCount = lstBulkShortTermLog.Count;
+ nBulkShortTermCount = lstBulkLongTermLog.Count;
+ nBulkTimeValue = stCheckTermBulkWaitTime.ElapsedMilliseconds;
+
+ if (stCheckTermBulkWaitTime.ElapsedMilliseconds >= LoadInfo.BULK_ProcessTime_ms || bTryBulkInsertBuffer)
+ {
+ Stopwatch stMeasProcTime = new Stopwatch();
+
+ if (lstBulkTermLogInfo.Count > 0)
+ {
+ stMeasProcTime.Start();
+
+ foreach (string str in lstBulkTermLogInfo.ToArray())
+ {
+ LogDataRecvText.Enqueue(new StringBuilder(str));
+ LogDataRecvText.Enqueue(new StringBuilder("\r\n"));
+ }
+
+ lstBulkTermLogInfo.Clear();
+ }
+ //
+ if(lstBulkShortTermLog.Count > 0)
+ SetLogDataInsertProc(eConnCategory.ShortTerm);
+ if (lstBulkLongTermLog.Count > 0)
+ SetLogDataInsertProc(eConnCategory.LongTerm);
+
+ BULK_INSERT_EXIT:
+
+ if (stMeasProcTime.IsRunning)
+ {
+ LogDataRecvText.Enqueue(new StringBuilder(">>[BulkInsert-Process][" + stMeasProcTime.ElapsedMilliseconds.ToString() + "]\r\n"));
+
+ //Check Server Time And Db Change
+ bDatabaseConnResult = MngDBLogConn.CheckDatabaseConnection();
+ }
+
+ bTryBulkInsertBuffer = false;
+
+ stCheckTermBulkWaitTime.Restart();
+ }
+
+ //Map Log File Check
+ if (bTaskStreamWaitLock == false)
+ QueryRecvStreamQueue();
+
+ // TODO : FTP ALIS
+ if (StateFTP != eFTPServiceStatus.Connected)
+ goto ROUTINE_END;
+
+ //FTP Server Check
+ nFTPTimeValue = stProcessCheckFTPTime.ElapsedMilliseconds;
+
+ if (stProcessCheckFTPTime.ElapsedMilliseconds >= LoadInfo.FTP_ScanTime_ms)
+ {
+ List lstFile = ControlFTP.PositionRootCheckList();
+
+ List lstDownlaodFile = new List();
+ List lstDeleteFailedFile = new List();
+
+ if (lstFile.Count == 0)
+ goto BRANCH_EXIT;
+
+ string strGetDownloadPath = GetFTPDownloadPath();
+
+ foreach (string f in lstFile)
+ lstDownlaodFile.Add(await ControlFTP.FileDownload(f, strGetDownloadPath));
+
+ foreach (string f in lstDownlaodFile)
+ {
+ string strGetFileName = Path.GetFileName(f);
+
+ if (ControlFTP.DeleteFile(strGetFileName) == false)
+ lstDeleteFailedFile.Add(strGetFileName);
+ }
+
+ BRANCH_EXIT:
+
+ ProcFTPCheckLogFiles();
+
+ foreach (string f in lstDeleteFailedFile)
+ {
+ string strGetFileName = Path.GetFileName(f);
+
+ if (ControlFTP.DeleteFile(strGetFileName) == false)
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"FTP > file delete process failed. [SystemX.Net.MiddlewareUI : MainForm.WatchRecvStreamQueue]\r\n", ConsoleColor.Yellow, LogMessageLevel.DEBUG);
+ }
+ }
+
+ stProcessCheckFTPTime.Restart();
+ }
+
+ ROUTINE_END:;
+ }
+ catch (Exception e)
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"General Queue Process failed. [SystemX.Net.MiddlewareUI : MainForm.WatchRecvStreamQueue]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
+ }
+
+ await Task.Delay(100);
+ }
+ }
+
+ private void SetLogDataInsertProc(eConnCategory SetCategory)
+ {
+ bool bBulkCopyResult = true;
+
+ string strSetLogTable = string.Empty;
+ string strAddText = string.Empty;
+
+ if (SetCategory == eConnCategory.ShortTerm)
+ {
+ strSetLogTable = MngDBLogConn.GetDBConnectInfo().ConnShortTerm.LOG_TABLE;
+ strAddText = "ShortTerm";
+ }
+ else if (SetCategory == eConnCategory.LongTerm)
+ {
+ strSetLogTable = MngDBLogConn.GetDBConnectInfo().ConnLongTerm.LOG_TABLE;
+ strAddText = "LongTerm";
+ }
+
+ try
+ {
+ //LogData Set Bulk
+ using (SqlTransaction sqlTran = MngDBLogConn.CurrentConnection(SetCategory).getConnection().BeginTransaction())
+ {
+ //Sql Bulk Insert 준비 - Short Log
+ //Make Result Command
+ SqlBulkCopy sbc = new SqlBulkCopy(sqlTran.Connection,
+ SqlBulkCopyOptions.CheckConstraints |
+ SqlBulkCopyOptions.FireTriggers |
+ SqlBulkCopyOptions.KeepNulls, sqlTran);
+ sbc.BatchSize = 5000;
+ sbc.DestinationTableName = "dbo." + strSetLogTable;
+ sbc.BulkCopyTimeout = 120;
+
+ try
+ {
+ // Write from the source to the destination.
+ //생성된 DataRow 들을 Bulk Copy 실시
+ if (SetCategory == eConnCategory.ShortTerm)
+ sbc.WriteToServer(lstBulkShortTermLog.ToArray());
+ else if (SetCategory == eConnCategory.LongTerm)
+ sbc.WriteToServer(lstBulkLongTermLog.ToArray());
+
+ //if (MngDBConn.InfoConnection.UTSI_STATE)
+ //{
+ // //Long Log
+ // SqlBulkCopy sbcL = new SqlBulkCopy(sqlTran.Connection,
+ // SqlBulkCopyOptions.CheckConstraints |
+ // SqlBulkCopyOptions.FireTriggers |
+ // SqlBulkCopyOptions.KeepNulls, sqlTran);
+ // sbcL.BatchSize = 5000;
+ // sbcL.DestinationTableName = "dbo.HIST_TestResultLongTerm";
+ // sbcL.BulkCopyTimeout = 120;
+ //
+ // sbcL.WriteToServer(SetMakeLogRows);
+ //}
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + $@" CPXV2 CpLogProcess fail.({strAddText} - Bulk Upload) [SystemX.Net.MiddlewareUI : MainForm.SetLogDataInsertProc]\r\n" + ex.Message, ConsoleColor.Red, LogMessageLevel.FATAL);
+
+ bBulkCopyResult = false;
+ }
+ finally
+ {
+ // Close the SqlDataReader. The SqlBulkCopy
+ // object is automatically closed at the end
+ // of the using block.
+ if (bBulkCopyResult)
+ {
+ sqlTran.Commit();
+
+ if (SetCategory == eConnCategory.ShortTerm)
+ lstBulkShortTermLog.Clear();
+ else if (SetCategory == eConnCategory.LongTerm)
+ lstBulkLongTermLog.Clear();
+
+ LogDataRecvText.Enqueue(new StringBuilder($"<{strAddText} - All CpLogs(Bulk)Process Result [OK]>\r\n"));
+ }
+ else
+ {
+ sqlTran.Rollback();
+
+ LogDataRecvText.Enqueue(new StringBuilder($"<{strAddText} - All CpLogs(Bulk)Process Result [NOK]>\r\n"));
+
+ //throw new Exception();
+ }
+ }
+ }
+ }
+ catch
+ {
+ ;//
+ }
+ finally
+ {
+ ;//
+ }
+
+ if (bBulkCopyResult == false)
+ {
+ CommonProtocol cp = new CommonProtocol();
+
+ List lstRefRow = null;
+
+ if (SetCategory == eConnCategory.ShortTerm)
+ lstRefRow = lstBulkShortTermLog;
+ else if (SetCategory == eConnCategory.LongTerm)
+ lstRefRow = lstBulkLongTermLog;
+
+ foreach (DataRow dr in lstRefRow)
+ {
+ if (Convert.ToInt64(dr["No"]) == Int64.MinValue)
+ continue;
+
+ //Summary 객체를 이용해 DB 삽입할 SqlCommand 생성
+ SqlCommand cmd = cp.LogDataResultInsert(strSetLogTable, dr);
+
+ //Summary 삽입 > 실패시 처리
+ bool bProcessResult = ExcuteNonQueryStreamProcess(SetCategory, cmd);
+
+ if (bProcessResult == false)
+ {
+ LogDataRecvText.Enqueue(new StringBuilder($"<{strAddText} - CpLogs(Command) Process Result [NOK]>\r\n"));
+
+ continue;
+ }
+ else
+ LogDataRecvText.Enqueue(new StringBuilder($"<{strAddText} - CpLogs(Command) Process Result [OK]>\r\n"));
+ }
+
+ if (SetCategory == eConnCategory.ShortTerm)
+ lstBulkShortTermLog.Clear();
+ else if (SetCategory == eConnCategory.LongTerm)
+ lstBulkLongTermLog.Clear();
+ }
+ }
+
+ private bool QueryRecvStreamQueue()
+ {
+ //StackTrace st = new StackTrace(true);
+
+ bool bState = true;
+
+ string strProcessDebugInfo = string.Empty;
+
+ long l1 = long.MinValue;
+ long l2 = long.MinValue;
+
+ try
+ {
+ bTaskStreamWaitLock = true;
+
+ //Log Process
+ Stopwatch stProcessTimeChk = new Stopwatch();
+ stProcessTimeChk.Start();
+
+ for (int i = PORT_DISTRIBUTION_NUM; i < ALL_MANAGE_NUM && !m_bTaskCommandBlock; i++)
+ {
+ Stopwatch stItemTimeChk = new Stopwatch();
+ stItemTimeChk.Start();
+
+ if (LogDataQueue[i].Count <= 0)
+ continue;
+
+ LogMappedPacket LogMapFile = new LogMappedPacket();
+ int nSetSize = Marshal.SizeOf(LogMapFile);
+ byte[] ucSetLogArray = new byte[nSetSize];
+ LogMapFile = (LogMappedPacket)SystemXNetSerialization.RawDeSerialize(ucSetLogArray, LogMapFile.GetType());
+
+ int iPos = LogMapFile.nNumber;
+ strProcessDebugInfo = "[" + (iPos).ToString("D2") + "]" +
+ "[" + LogMapFile.nCommandPort + "]" +
+ "[" + LogMapFile.objHost[0].Data + "]" +
+ "[" + LogMapFile.objSection[0].Data + "]";
+ //
+ if (LogDataQueue[i].TryPeek(out LogMapFile)) //LogDataQueue[i].TryDequeue(out LogMapFile))
+ {
+ if (bShowCpLogProcessTime)
+ LogMapFile.bShowCpLogProcessTime = true;
+
+ StringBuilder sb = new StringBuilder();
+ sb.Append("[" + (++nDequeueCount).ToString() + "][TryDequeue]");
+ sb.Append("[");
+ sb.Append(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
+ sb.Append("], ");
+ sb.Append("Type [" + LogMapFile.objLogType[0].Data.ToString() + "], ");
+ sb.Append("S Port [" + LogMapFile.nStreamPort.ToString() + "], ");
+ sb.Append("C Port [" + LogMapFile.nCommandPort.ToString() + "], ");
+ sb.Append("Size [" + LogMapFile.nLogDataSize.ToString() + "], ");
+ sb.Append("Number [" + LogMapFile.nNumber.ToString() + "], ");
+ sb.Append("Host [" + LogMapFile.objHost[0].Data + "], ");
+ sb.Append("Section [" + LogMapFile.objSection[0].Data + "], ");
+ sb.Append("St Name [" + LogMapFile.objStationName[0].Data + "], ");
+ sb.Append("St ID [" + LogMapFile.nStationID.ToString() + "], ");
+ sb.Append("File Name [" + LogMapFile.objOptionFileName[0].Data + "], ");
+ sb.Append("File Extension [" + LogMapFile.objOptionFileExtension[0].Data + "] ");
+ sb.Append("TL ID[" + LogMapFile.objResultTestListCntID[0].Data + "], ");
+ sb.Append("V[" + LogMapFile.objProdPNo[0].Data + "], ");
+ sb.Append("PN[" + LogMapFile.objProdCNo[0].Data + "], ");
+ sb.Append("TT[" + LogMapFile.objTestType[0].Data + "], ");
+ sb.Append("TC[" + LogMapFile.objTestCode[0].Data + "], ");
+ sb.Append("Ver[" + LogMapFile.objVersion[0].Data + "], ");
+ sb.Append("PC[" + LogMapFile.objProdCode[0].Data + "], ");
+ sb.Append("DB V No[" + LogMapFile.nTestListVariantNo.ToString() + "], ");
+
+ if (nDequeueCount >= Int64.MaxValue)
+ nDequeueCount = 0;
+
+ bool bProcResult = false;
+
+ if (MngDBLogConn.GetDBConnectInfo().ConnVersion == XDBConnInfo.eVersion.CPX)
+ {
+ sb.Append("!Use Log Process Version [CPX] - No longer supported.");
+
+ //bProcResult = CPX_CpLogProcess(LogMapFile);
+
+ bProcResult = false;
+ }
+ else if (MngDBLogConn.GetDBConnectInfo().ConnVersion == XDBConnInfo.eVersion.CPXV2)
+ {
+ bProcResult = CPXV2_CpLogProcess(LogMapFile);
+
+ if(bProcResult == true)
+ lstBulkTermLogInfo.Add(sb.ToString());
+
+ sb.Append("!Use Log Process Version [CPXV2] ");
+ }
+
+ if (bProcResult)
+ sb.Append("");
+ else
+ sb.Append("");
+
+ sb.AppendLine();
+
+ LogDataProcessText.Enqueue(sb);
+
+ if (LogDataQueue[i].TryDequeue(out LogMapFile) == false)
+ {
+ if (LogDataQueue[i].TryDequeue(out LogMapFile) == false)
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo + @" Recv queue try-dequeue failed. [SystemX.Net.MiddlewareUI : MainForm.QueryRecvStreamQueue]\r\n", ConsoleColor.Yellow, LogMessageLevel.DEBUG);
+ }
+ }
+ }
+
+ l2 = stItemTimeChk.ElapsedMilliseconds;
+ }
+
+ l1 = stProcessTimeChk.ElapsedMilliseconds;
+
+ if (l1 != long.MinValue && l2 != long.MinValue)
+ {
+ LogDataProcessText.Enqueue(new StringBuilder(">>[TryDequeue-Process][" + l1.ToString() + "][TryDequeue-Item][" + l2.ToString() + "]\r\n"));
+ }
+ }
+ catch (Exception e)
+ {
+ MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo + @" Recv queue stream process unknown fail. [SystemX.Net.MiddlewareUI : MainForm.QueryRecvStreamQueue]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
+
+ bState = false;
+ }
+ finally
+ {
+ bTaskStreamWaitLock = false;
+ }
+
+ return bState;
+ }
+
+ // TODO : FTP ALIS
+ internal eFTPServiceStatus StartFTPService()
+ {
+ ControlFTP = new CtrlFTP(LoadInfo.FTP_Use,
+ IPAddress.Parse(LoadInfo.FTP_IPAddress), Convert.ToInt32(LoadInfo.FTP_Port),
+ LoadInfo.FTP_Account, LoadInfo.FTP_Password);
+
+ if (ControlFTP.FTPConnState)
+ return eFTPServiceStatus.Connected;
+ else
+ return eFTPServiceStatus.Disconnected;
+ }
+
+ private string GetFTPDownloadPath()
+ {
+ string strYYYY = DateTime.Today.ToString("yyyy");
+ string strMM = DateTime.Today.ToString("MM");
+ string strdd = DateTime.Today.ToString("dd");
+
+ string strHHmmssfff = DateTime.Now.ToString("HHmmssfff");
+ string strGetRoot = Path.GetPathRoot(Environment.CurrentDirectory);
+ string DirPath = @strGetRoot + $@"\XProc\FTP\CpLog\{strYYYY}\{strMM}\{strdd}\";
+
+ //string CpLogDirPath = @strGetRoot + $@"XProcCpLog\Temp\{strYYYY}\{strMM}\{strdd}\{strHHmmssfff}\";
+
+ DirectoryInfo di1 = new DirectoryInfo(@DirPath);
+ if (!di1.Exists) Directory.CreateDirectory(@DirPath);
+
+ //DirectoryInfo di2 = new DirectoryInfo(@CpLogDirPath);
+ //if (!di2.Exists) Directory.CreateDirectory(@CpLogDirPath);
+
+ return DirPath;
+ }
+
+ private void ProcFTPCheckLogFiles()
+ {
+ //Scan And Send File
+ string strGetRoot = Path.GetPathRoot(Environment.CurrentDirectory);
+
+ //오늘 포함 -6일전까지 검색
+ string[] strScanYYYY = new string[7];
+ string[] strScanMM = new string[7];
+ string[] strScandd = new string[7];
+
+ for (int n = 6; n >= 0; n--)
+ {
+ DateTime dtSet = DateTime.Today.AddDays(-n);
+ strScanYYYY[n] = dtSet.ToString("yyyy");
+ strScanMM[n] = dtSet.ToString("MM");
+ strScandd[n] = dtSet.ToString("dd");
+ }
+ //
+ // 7일치 위치 확인
+ //
+ for (int n = 0; n < 7; n++)
+ {
+ string DirPath = strGetRoot + $@"\XProc\FTP\CpLog\{strScanYYYY[n]}\{strScanMM[n]}\{strScandd[n]}\";
+ string DirMovePath = strGetRoot + $@"\XProc\FTP\CpLog\{strScanYYYY[n]}\{strScanMM[n]}\{strScandd[n]}\History\";
+
+ //생성 폴더가 없을경우 SKIP
+ if (Directory.Exists(DirPath) == false)
+ continue;
+
+ if (Directory.Exists(DirMovePath) == false)
+ Directory.CreateDirectory(DirMovePath);
+
+ string fileExtension = "zip";
+
+ string[] dirs = Directory.GetDirectories(DirPath);
+ string[] files = Directory.GetFiles(DirPath, $"*.{fileExtension}", SearchOption.TopDirectoryOnly);
+
+ if (files.Length <= 0)
+ continue;
+
+ ProcFTPLogFiles(files, DirPath, DirMovePath);
+ }
+ }
+
+ private void ProcFTPLogFiles(string[] strArrFiles, string strReadDirPath, string strMoveDirPath)
+ {
+ string strExtractFilePos = string.Empty;
+ string strOrgRemoveFilePos = string.Empty;
+
+ string strHeaderInfo = string.Empty;
+ string strLogFileNameInfo = string.Empty;
+
+ long l1 = long.MinValue;
+
+ //Log Process
+ Stopwatch stProcessTimeChk = new Stopwatch();
+ stProcessTimeChk.Start();
+
+ foreach (string f in strArrFiles)
+ {
+ strOrgRemoveFilePos = f;
+
+ strHeaderInfo = string.Empty;
+ strLogFileNameInfo = string.Empty;
+
+ string[] strInfos = f.Split(';');
+
+ //파일정보 확인(로그 저장관련 정보)
+ /*
+ string strSetDateTime = strInfos[1];
+ string strSetStationName = strInfos[2];
+ int nSetTestListVariantNo = int.Parse(strInfos[3]);
+ string strSetProcNoP = strInfos[4];
+ string strSetProcNoC = strInfos[5];
+ string strSetTestType = strInfos[6];
+ string strSetTestCode = strInfos[7];
+ string strSetVersion = strInfos[8];
+ string strSetProdCode = strInfos[9];
+ string strSetTestListCntID = strInfos[10];
+ string strHost = strInfos[11];
+ string strSection = strInfos[12];
+ */
+ int nSetTryNo = int.Parse(strInfos[13]);
+
+ Dictionary dicSetLogInfo = new Dictionary();
+ dicSetLogInfo.Add("DATE_TIME", strInfos[1]);
+ dicSetLogInfo.Add("STATION_NAME", strInfos[2]);
+ dicSetLogInfo.Add("VARIANT_NO", strInfos[3]);
+ dicSetLogInfo.Add("P_TTNR", strInfos[4]);
+ dicSetLogInfo.Add("TTNR", strInfos[5]);
+ dicSetLogInfo.Add("TEST_TYPE", strInfos[6]);
+ dicSetLogInfo.Add("TEST_CODE", strInfos[7]);
+ dicSetLogInfo.Add("VERSION", strInfos[8]);
+ dicSetLogInfo.Add("PROD_CODE", strInfos[9]);
+ dicSetLogInfo.Add("TESTLIST_ID", strInfos[10]);
+ dicSetLogInfo.Add("HOST", strInfos[11]);
+ dicSetLogInfo.Add("SECTION", strInfos[12]);
+
+ for (int m = 1; m < 12; m++)
+ strHeaderInfo += (strInfos[m + 1] + ";");
+
+ strHeaderInfo = strHeaderInfo.Remove(strHeaderInfo.Length - 1, 1);
+
+ //압축해제 하여 로그 파일 추출
+ using (FileStream fs = new FileStream(f, FileMode.Open))
+ using (ZipArchive zip = new ZipArchive(fs, ZipArchiveMode.Update, false))
+ {
+ foreach (ZipArchiveEntry zae in zip.Entries)
+ {
+ strLogFileNameInfo = zae.FullName;
+
+ if (strLogFileNameInfo.IndexOf(".txt") >= 0)
+ continue;
+
+ strExtractFilePos = strReadDirPath + strLogFileNameInfo;
+
+ //ZipFileExtensions
+ zae.ExtractToFile(strExtractFilePos, true);
+ }
+ }
+
+ //Sometihing Procee
+ LogMappedPacket EmptyLogMapFile = new LogMappedPacket();
+
+ StringBuilder sb = new StringBuilder();
+ sb.Append("[" + (++nDequeueCount).ToString() + "][TryDequeue]");
+ sb.Append("[");
+ sb.Append(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
+ sb.Append("], ");
+ sb.Append("Type [FTP], ");
+ sb.Append("Host [" + dicSetLogInfo["HOST"] + "], ");
+ sb.Append("Section [" + dicSetLogInfo["SECTION"] + "], ");
+ sb.Append("St Name [" + dicSetLogInfo["STATION_NAME"] + "], ");
+ sb.Append("File Name [" + Path.GetFileName(strExtractFilePos) + "], ");
+ sb.Append("File Extension [" + Path.GetExtension(strExtractFilePos) + "] ");
+ sb.Append("TL ID[" + dicSetLogInfo["TESTLIST_ID"] + "], ");
+ sb.Append("V[" + dicSetLogInfo["P_TTNR"] + "], ");
+ sb.Append("PN[" + dicSetLogInfo["TTNR"] + "], ");
+ sb.Append("TT[" + dicSetLogInfo["TEST_TYPE"] + "], ");
+ sb.Append("TC[" + dicSetLogInfo["TEST_CODE"] + "], ");
+ sb.Append("Ver[" + dicSetLogInfo["VERSION"] + "], ");
+ sb.Append("PC[" + dicSetLogInfo["PROD_CODE"] + "], ");
+ sb.Append("DB V No[" + dicSetLogInfo["VARIANT_NO"] + "], ");
+
+ if (nDequeueCount >= Int64.MaxValue)
+ nDequeueCount = 0;
+
+ bool bGetLogProcResult = CPXV2_CpLogProcess(EmptyLogMapFile, dicSetLogInfo, strExtractFilePos);
+
+ if (bGetLogProcResult == true)
+ lstBulkTermLogInfo.Add(sb.ToString());
+
+ sb.Append("!Use Log Process Version [FTP-CPXV2] ");
+
+ if (bGetLogProcResult)
+ sb.Append("");
+ else
+ sb.Append("");
+
+ sb.AppendLine();
+
+ LogDataProcessText.Enqueue(sb);
+
+ l1 = stProcessTimeChk.ElapsedMilliseconds;
+
+ if (l1 != long.MinValue)
+ {
+ LogDataProcessText.Enqueue(new StringBuilder(">>[FTP-Process][" + l1.ToString() + "]\r\n"));
+ }
+
+ //Failed
+ if (bGetLogProcResult == false)
+ {
+ //실패시
+ nSetTryNo++;
+
+ string strTryNo = string.Empty;
+
+ string strCopyPos = string.Empty;
+
+ //재시도 3회 초과 일시 히스토리로 이동
+ if (nSetTryNo > 3)
+ {
+ strCopyPos = strMoveDirPath;
+
+ strTryNo = "X";
+ }
+ else
+ {
+ strCopyPos = strReadDirPath;
+
+ strTryNo = nSetTryNo.ToString();
+ }
+
+ for (int m = 0; m < 12; m++)
+ strCopyPos += (";" + strInfos[m + 1]);
+
+ strCopyPos += (";" + strTryNo + ";.zip");
+
+ File.Copy(f, strCopyPos, true);
+ }
+
+ //압축해제 파일 삭제
+ if (File.Exists(strExtractFilePos))
+ File.Delete(strExtractFilePos);
+
+ //성공시나 실패시 새로운 파일생성 되기 때문에 기존 파일 삭제
+ if (strOrgRemoveFilePos != string.Empty)
+ {
+ if (File.Exists(strOrgRemoveFilePos))
+ File.Delete(strOrgRemoveFilePos);
+ }
+
+ stProcessTimeChk.Restart();
+ }
+ }
+ }
+}
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/UI.cs b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/UI.cs
new file mode 100644
index 0000000..83c85f0
--- /dev/null
+++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/Sub/UI.cs
@@ -0,0 +1,166 @@
+using DevExpress.Data.Helpers;
+using DevExpress.XtraBars;
+using DevExpress.XtraBars.Navigation;
+
+using System;
+using System.Net;
+using System.Net.Sockets;
+using System.Runtime.InteropServices;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Data.SqlClient;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using System.Xml.Linq;
+using System.IO;
+using System.Diagnostics;
+
+using SystemX.Net;
+using SystemX.Common;
+using SystemX.Net.BaseProtocol;
+using SystemX.Net.Comm;
+using SystemX.Net.Schedule;
+using SystemX.Net.DB.LogProcess;
+using SystemX.Common.Serialization;
+using SystemX.Common.Archive;
+using System.Threading.Tasks;
+
+//using SystemX.Common.Protocol.SIA;
+
+using static SystemX.Net.Platform.Common.Util.LogMessage;
+using System.Threading;
+using SystemX.Net.Platform.Common.Util;
+using SystemX.Net.Platform.Common.ExtensionMethods;
+using SystemX.Net.Middleware.Log.Commons;
+using static SystemX.Net.DB.LogProcess.XLogDBConnManager;
+
+namespace SystemX.Net.MiddlewareUI
+{
+ public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm
+ {
+ private void Chktimer_Tick(object sender, EventArgs e)
+ {
+ Chktimer.Enabled = false;
+
+ if (MiddlewareLogStartState == false)
+ {
+ ConsoleUtil.ConsoleVisibleControl();
+
+ //The program is automatically terminated.
+ MessageBox.Show("Server information could not be retrieved. Check the console error text.", "SystemX.Net.Middleware.UI.Log", MessageBoxButtons.OK, MessageBoxIcon.Error);
+
+ // TODO : FTP ALIS
+ this.Close();
+ }
+ }
+
+ private void UItimer_Tick(object sender, EventArgs e)
+ {
+ if (m_bTimerLock[(int)TIMER_LOCK.UI_TIMER] == false)
+ {
+ m_bTimerLock[(int)TIMER_LOCK.UI_TIMER] = true;
+
+ if (bTryBulkInsertBuffer)
+ {
+ if (buttonBulkInsertStart.BackColor != Color.Yellow)
+ buttonBulkInsertStart.BackColor = Color.Yellow;
+ }
+ else
+ {
+ if (buttonBulkInsertStart.BackColor != Color.Silver)
+ buttonBulkInsertStart.BackColor = Color.Silver;
+ }
+
+ labelBulkCntInfo1.Text = nBulkLogCount.ToString();
+ labelBulkCntInfo2.Text = nBulkShortTermCount.ToString();
+ labelBulkCntInfo3.Text = nBulkLongTermCount.ToString();
+
+ labelBulkTime.Text = nBulkTimeValue.ToString();
+ labelFTPTime.Text = nFTPTimeValue.ToString();
+
+ labelDBMain.Text = "Information [" + MngDBLogConn.GetDBConnectInfo().ConnMain.SCHEMA + "]";
+ labelDBShortTerm.Text = "ShortTerm [" + MngDBLogConn.GetDBConnectInfo().ConnShortTerm.SCHEMA + "]";
+ labelShortTermSummaryTableName.Text = "└ [" + MngDBLogConn.GetDBConnectInfo().ConnShortTerm.SUMMARY_TABLE + "]";
+ labelShortTermLogTableName.Text = "└ [" + MngDBLogConn.GetDBConnectInfo().ConnShortTerm.LOG_TABLE + "]";
+ labelDBLongTerm.Text = "LongTerm [" + MngDBLogConn.GetDBConnectInfo().ConnLongTerm.SCHEMA + "]";
+
+ if (bDatabaseConnResult)
+ {
+ if (panelDBMain2.BackColor != Color.LimeGreen) panelDBMain2.BackColor = Color.LimeGreen;
+ if (panelDBShortTerm2.BackColor != Color.LimeGreen) panelDBShortTerm2.BackColor = Color.LimeGreen;
+ if (panelDBLongTerm2.BackColor != Color.LimeGreen) panelDBLongTerm2.BackColor = Color.LimeGreen;
+
+ if (buttonDbConnect.Visible) buttonDbConnect.Visible = false;
+ }
+ else
+ {
+ if (panelDBMain2.BackColor != Color.Red) panelDBMain2.BackColor = Color.Red;
+ if (panelDBShortTerm2.BackColor != Color.Red) panelDBShortTerm2.BackColor = Color.Red;
+ if (panelDBLongTerm2.BackColor != Color.Red) panelDBLongTerm2.BackColor = Color.Red;
+
+ if (buttonDbConnect.Visible == false) buttonDbConnect.Visible = true;
+ }
+
+ if (progressBarProgram.Value + 20 <= 100)
+ progressBarProgram.Value += 20;
+ else
+ progressBarProgram.Value = 0;
+
+ int nPanelHeight = panelMain.Height / 2;
+
+ panelRecv.Height = nPanelHeight - 20;
+ panelProcess.Height = nPanelHeight - 20;
+
+ int n1 = richTextBoxRecv.Lines.Count();
+ int n2 = richTextBoxProcess.Lines.Count();
+
+ if (richTextBoxRecv.Lines.Count() > 8192)
+ richTextBoxRecv.Clear();
+ if (richTextBoxProcess.Lines.Count() > 8192)
+ richTextBoxProcess.Clear();
+
+ if (LogDataRecvText.Count > 0)
+ {
+ StringBuilder sb = null;
+
+ if (LogDataRecvText.TryDequeue(out sb))
+ {
+ //richTextBoxRecv.SuspendLayout();
+ richTextBoxRecv.AppendText(sb.ToString());
+
+ richTextBoxRecv.ScrollToCaret();
+ //richTextBoxRecv.ResumeLayout();
+ }
+ }
+
+ if (LogDataProcessText.Count > 0)
+ {
+ StringBuilder sb = null;
+
+ if (LogDataProcessText.TryDequeue(out sb))
+ {
+ //richTextBoxProcess.SuspendLayout();
+ richTextBoxProcess.AppendText(sb.ToString());
+
+ richTextBoxProcess.ScrollToCaret();
+ //richTextBoxProcess.ResumeLayout();
+ }
+ }
+
+ m_bTimerLock[(int)TIMER_LOCK.UI_TIMER] = false;
+ }
+ }
+
+ private string MakeInfoConnectProcessText(int nPos, int nCommandPort, int nStreamPort)
+ {
+ string strSetProcessInfo = nPos.ToString("D2") + ":" +
+ nCommandPort.ToString("D4") + ":" +
+ nStreamPort.ToString("D4");
+
+ return strSetProcessInfo;
+ }
+ }
+}
\ No newline at end of file
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/SystemX.Net.CP.Middleware.Log.csproj b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/SystemX.Net.CP.Middleware.Log.csproj
new file mode 100644
index 0000000..32c0a9c
--- /dev/null
+++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/SystemX.Net.CP.Middleware.Log.csproj
@@ -0,0 +1,343 @@
+
+
+
+ Debug
+ x86
+ 8.0.30703
+ 2.0
+ {3658FBE5-9A84-4F76-8E19-867DB9F4484D}
+ Exe
+ Properties
+ SystemX.Net.MiddlewareUI.Log
+ SystemX.Net.MiddlewareUI.Log
+ v4.8
+ 512
+
+
+
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+ true
+
+
+ AppIcon.ico
+
+
+
+
+
+ true
+ bin\x64\
+ DEBUG;TRACE
+ full
+ x64
+ 7.3
+ prompt
+ true
+
+
+ bin\x64\
+ TRACE
+ true
+ pdbonly
+ x64
+ 7.3
+ prompt
+ true
+
+
+
+ ..\packages\Common.Logging.3.4.1\lib\net40\Common.Logging.dll
+
+
+ ..\packages\Common.Logging.Core.3.4.1\lib\net40\Common.Logging.Core.dll
+
+
+ ..\..\Output.SystemX\CpApplciationIntrf.dll
+
+
+ ..\..\Output.SystemX\CpApplication.dll
+
+
+ ..\..\Output.SystemX\CpCommon.dll
+
+
+
+
+
+
+
+ ..\..\Output.SystemX\log4net.dll
+
+
+ ..\packages\Microsoft.Bcl.AsyncInterfaces.1.1.1\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll
+
+
+ ..\packages\Microsoft.Bcl.HashCode.1.1.1\lib\net461\Microsoft.Bcl.HashCode.dll
+
+
+ ..\packages\Microsoft.Data.SqlClient.1.1.3\lib\net46\Microsoft.Data.SqlClient.dll
+
+
+ ..\packages\Microsoft.EntityFrameworkCore.3.1.32\lib\netstandard2.0\Microsoft.EntityFrameworkCore.dll
+
+
+ ..\packages\Microsoft.EntityFrameworkCore.Abstractions.3.1.32\lib\netstandard2.0\Microsoft.EntityFrameworkCore.Abstractions.dll
+
+
+ ..\packages\Microsoft.EntityFrameworkCore.Relational.3.1.32\lib\netstandard2.0\Microsoft.EntityFrameworkCore.Relational.dll
+
+
+ ..\packages\Microsoft.EntityFrameworkCore.SqlServer.3.1.32\lib\netstandard2.0\Microsoft.EntityFrameworkCore.SqlServer.dll
+
+
+ ..\packages\Microsoft.Extensions.Caching.Abstractions.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Caching.Abstractions.dll
+
+
+ ..\packages\Microsoft.Extensions.Caching.Memory.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Caching.Memory.dll
+
+
+ ..\packages\Microsoft.Extensions.Configuration.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Configuration.dll
+
+
+ ..\packages\Microsoft.Extensions.Configuration.Abstractions.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Configuration.Abstractions.dll
+
+
+ ..\packages\Microsoft.Extensions.Configuration.Binder.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Configuration.Binder.dll
+
+
+ ..\packages\Microsoft.Extensions.DependencyInjection.3.1.32\lib\net461\Microsoft.Extensions.DependencyInjection.dll
+
+
+ ..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.3.1.32\lib\netstandard2.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll
+
+
+ ..\packages\Microsoft.Extensions.Logging.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Logging.dll
+
+
+ ..\packages\Microsoft.Extensions.Logging.Abstractions.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Logging.Abstractions.dll
+
+
+ ..\packages\Microsoft.Extensions.Options.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Options.dll
+
+
+ ..\packages\Microsoft.Extensions.Primitives.3.1.32\lib\netstandard2.0\Microsoft.Extensions.Primitives.dll
+
+
+ ..\packages\Microsoft.Identity.Client.3.0.8\lib\net45\Microsoft.Identity.Client.dll
+
+
+ ..\packages\Microsoft.IdentityModel.JsonWebTokens.5.5.0\lib\net461\Microsoft.IdentityModel.JsonWebTokens.dll
+
+
+ ..\packages\Microsoft.IdentityModel.Logging.5.5.0\lib\net461\Microsoft.IdentityModel.Logging.dll
+
+
+ ..\packages\Microsoft.IdentityModel.Protocols.5.5.0\lib\net461\Microsoft.IdentityModel.Protocols.dll
+
+
+ ..\packages\Microsoft.IdentityModel.Protocols.OpenIdConnect.5.5.0\lib\net461\Microsoft.IdentityModel.Protocols.OpenIdConnect.dll
+
+
+ ..\packages\Microsoft.IdentityModel.Tokens.5.5.0\lib\net461\Microsoft.IdentityModel.Tokens.dll
+
+
+ ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll
+
+
+
+
+ ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll
+
+
+ ..\packages\System.Collections.Immutable.1.7.1\lib\net461\System.Collections.Immutable.dll
+
+
+ ..\packages\System.ComponentModel.Annotations.4.7.0\lib\net461\System.ComponentModel.Annotations.dll
+
+
+
+
+ ..\packages\System.Data.Common.4.3.0\lib\net451\System.Data.Common.dll
+ True
+ True
+
+
+ ..\packages\System.Diagnostics.DiagnosticSource.4.7.1\lib\net46\System.Diagnostics.DiagnosticSource.dll
+
+
+
+ ..\packages\System.IdentityModel.Tokens.Jwt.5.5.0\lib\net461\System.IdentityModel.Tokens.Jwt.dll
+
+
+
+
+ ..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll
+
+
+
+
+ ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll
+
+
+ ..\packages\System.Runtime.CompilerServices.Unsafe.4.7.1\lib\net461\System.Runtime.CompilerServices.Unsafe.dll
+
+
+ ..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll
+
+
+
+
+
+
+
+
+
+
+ False
+ ..\..\Output.SystemX\SystemX.Net.Platform.dll
+
+
+ ..\..\Output.SystemX\SystemX.XEFCore.dll
+
+
+
+
+
+ Form
+
+
+ Form
+
+
+ Form
+
+
+ Form
+
+
+ Form
+
+
+ Form
+
+
+ Form
+
+
+
+ Form
+
+
+ MainForm.cs
+
+
+
+
+
+
+
+
+
+
+ MainForm.cs
+ Designer
+
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+ Designer
+
+
+ True
+ Resources.resx
+ True
+
+
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+ True
+ Settings.settings
+ True
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 이 프로젝트는 이 컴퓨터에 없는 NuGet 패키지를 참조합니다. 해당 패키지를 다운로드하려면 NuGet 패키지 복원을 사용하십시오. 자세한 내용은 http://go.microsoft.com/fwlink/?LinkID=322105를 참조하십시오. 누락된 파일은 {0}입니다.
+
+
+
+
+
\ No newline at end of file
diff --git a/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/packages.config b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/packages.config
new file mode 100644
index 0000000..88b057a
--- /dev/null
+++ b/SystemX.Net.CP.Middleware.Log/SystemX.Net.Middleware.UI/packages.config
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file