강기헌 강기헌 2023-01-03
..
@b0bf81bf7fa3ebe17f50ee1552084fb0848bfc67
KHModbus.sln
--- KHModbus.sln
+++ KHModbus.sln
@@ -9,6 +9,8 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SignusKH", "SignusKH\SignusKH.csproj", "{7F1050F6-B03B-45C2-9F29-6632066E4B5C}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SignusKHSVR", "SignusKHSVR\SignusKHSVR.csproj", "{7F1050F6-B03B-46C2-9F29-6632066E4B5C}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -27,6 +29,10 @@
 		{7F1050F6-B03B-45C2-9F29-6632066E4B5C}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{7F1050F6-B03B-45C2-9F29-6632066E4B5C}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{7F1050F6-B03B-45C2-9F29-6632066E4B5C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{7F1050F6-B03B-46C2-9F29-6632066E4B5C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{7F1050F6-B03B-46C2-9F29-6632066E4B5C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{7F1050F6-B03B-46C2-9F29-6632066E4B5C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{7F1050F6-B03B-46C2-9F29-6632066E4B5C}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
ModbusTest/FormModbus.cs
--- ModbusTest/FormModbus.cs
+++ ModbusTest/FormModbus.cs
@@ -1229,12 +1229,54 @@
             */
         }
 
+        private Dictionary<string, float> m_dicPV = new Dictionary<string, float>();
+
+
         private void UpdateBaseoilSwitch()
         {
             U3Util.ErrorLog("UpdateBaseoilSwitch");
             U3Database db = new U3Database();
 
             string strSQL = "";
+
+            strSQL = " SELECT *, (a.REAL_DATA * b.VALUE_RATIO) as PV_VAL FROM T_HT_REAL_DATA a ";
+            strSQL += " left join T_STD_MACH b on a.MACH_CD = b.MACH_CD where b.REMARK04 is not null";
+            DataTable dtCurPV = db.OpenSQL(strSQL);
+            foreach (DataRow drCurPV in dtCurPV.Rows)
+            {
+                string strBaseoil = U3Util.toStr(drCurPV["REMARK04"]);
+                string strMachCD = U3Util.toStr(drCurPV["MACH_CD"]);
+                string strMachNM = U3Util.toStr(drCurPV["MACH_NM"]);
+                float fPV = U3Util.toFloat(drCurPV["PV_VAL"]);
+
+                if (m_dicPV.ContainsKey(strMachCD) == false)
+                {
+                    m_dicPV.Add(strMachCD, fPV);
+                }
+                else
+                {
+                    float fPrev = m_dicPV[strMachCD];
+                    if (fPV < (fPrev * 0.1))
+                    {
+                        U3Util.ErrorLog("### " + strBaseoil + " = 이전: " + fPrev.ToString() + " / 현재: " + fPV.ToString());
+
+                        string sql3 = "";
+                        sql3 += " insert into T_HT_HIST_BASEOIL (COMP_CD,BASEOIL_CD,HBT_CD,ONOFF_YN,PV_VAL,MACH_NM,REG_DT) values (";
+                        sql3 += " '0001', ";
+                        sql3 += " '" + strBaseoil + "', ";
+                        sql3 += " '', ";
+                        sql3 += " 'X', ";
+                        sql3 += " " + fPrev.ToString() + ", ";
+                        sql3 += " '" + strMachNM + "', ";
+                        sql3 += " getdate() ";
+                        sql3 += " )";
+                        sql3 += " ";
+
+                        db.ExcuteSql(sql3);
+                    }
+                    m_dicPV[strMachCD] = fPV;
+                }
+            }
 
             Dictionary<string, string> oldDic = new Dictionary<string, string>();
             strSQL = "select * from T_HT_REAL_BASEOIL";
@@ -1248,6 +1290,7 @@
             }
 
             Dictionary<string, float> pvDic = new Dictionary<string, float>();
+            Dictionary<string, string> machNmDic = new Dictionary<string, string>();
             strSQL = "";
             strSQL += " SELECT a.MACH_CD, (REAL_DATA * VALUE_RATIO) as PV_VAL, MACH_NM, REMARK04";
             strSQL += " FROM T_HT_REAL_DATA a";
@@ -1258,8 +1301,11 @@
             {
                 string strKey = U3Util.toStr(drPv["REMARK04"]);
                 float fVal = U3Util.toFloat(drPv["PV_VAL"]);
+                string strMachNm = U3Util.toStr(drPv["MACH_NM"]);
                 if (pvDic.ContainsKey(strKey) == false)
                     pvDic.Add(strKey, fVal);
+                if (machNmDic.ContainsKey(strKey) == false)
+                    machNmDic.Add(strKey, strMachNm);
             }
 
             Dictionary<string, string> myDictionary = new Dictionary<string, string>();
@@ -1304,16 +1350,23 @@
                         pvVal = pvDic[item.Key];
                     }
 
+                    string mach_nm = "";
+                    if (machNmDic.ContainsKey(item.Key))
+                    {
+                        mach_nm = machNmDic[item.Key];
+                    }
+
                     string oldValue = oldDic[item.Key];
                     if (item.Value != oldValue)
                     {
                         string sql3 = "";
-                        sql3 += " insert into T_HT_HIST_BASEOIL (COMP_CD,BASEOIL_CD,HBT_CD,ONOFF_YN,PV_VAL,REG_DT) values (";
+                        sql3 += " insert into T_HT_HIST_BASEOIL (COMP_CD,BASEOIL_CD,HBT_CD,ONOFF_YN,PV_VAL,MACH_NM,REG_DT) values (";
                         sql3 += " '0001', ";
                         sql3 += " '" + item.Key + "', ";
                         sql3 += " '" + ((item.Value.Length > 0) ? item.Value : oldValue) + "', ";
                         sql3 += " '" + ((item.Value.Length > 0) ? "Y" : "N") + "', ";
                         sql3 += " " + pvVal.ToString() + ", ";
+                        sql3 += " '" + mach_nm + "', ";
                         sql3 += " getdate() ";
                         sql3 += " )";
                         sql3 += " ";
SignusKH/Form1.cs
--- SignusKH/Form1.cs
+++ SignusKH/Form1.cs
@@ -119,7 +119,7 @@
                 m_ps[index].StartInfo.FileName = AppExe;
                 m_ps[index].StartInfo.WorkingDirectory = AppPath;
                 m_ps[index].StartInfo.Arguments = " -kiosk -fullscreen " + m_strUrl;
-                m_ps[index].StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Minimized;
+                m_ps[index].StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Maximized;
                 m_ps[index].Start();
                 return;
             }
 
SignusKHSVR/App.config (added)
+++ SignusKHSVR/App.config
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+    <startup> 
+        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
+    </startup>
+</configuration>(No newline at end of file)
 
SignusKHSVR/Form1.Designer.cs (added)
+++ SignusKHSVR/Form1.Designer.cs
@@ -0,0 +1,95 @@
+namespace SignusKHSVR
+{
+    partial class Form1
+    {
+        /// <summary>
+        /// 필수 디자이너 변수입니다.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// 사용 중인 모든 리소스를 정리합니다.
+        /// </summary>
+        /// <param name="disposing">관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form 디자이너에서 생성한 코드
+
+        /// <summary>
+        /// 디자이너 지원에 필요한 메서드입니다. 
+        /// 이 메서드의 내용을 코드 편집기로 수정하지 마세요.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.components = new System.ComponentModel.Container();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
+            this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components);
+            this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
+            this.ToolStripMenuItem_Close = new System.Windows.Forms.ToolStripMenuItem();
+            this.timer1 = new System.Windows.Forms.Timer(this.components);
+            this.timer_LogApi = new System.Windows.Forms.Timer(this.components);
+            this.contextMenuStrip1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // notifyIcon1
+            // 
+            this.notifyIcon1.ContextMenuStrip = this.contextMenuStrip1;
+            this.notifyIcon1.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon1.Icon")));
+            this.notifyIcon1.Text = "시그너스 프로그램 관리자";
+            this.notifyIcon1.Visible = true;
+            // 
+            // contextMenuStrip1
+            // 
+            this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.ToolStripMenuItem_Close});
+            this.contextMenuStrip1.Name = "contextMenuStrip1";
+            this.contextMenuStrip1.Size = new System.Drawing.Size(151, 26);
+            // 
+            // ToolStripMenuItem_Close
+            // 
+            this.ToolStripMenuItem_Close.Name = "ToolStripMenuItem_Close";
+            this.ToolStripMenuItem_Close.Size = new System.Drawing.Size(150, 22);
+            this.ToolStripMenuItem_Close.Text = "프로그램 종료";
+            this.ToolStripMenuItem_Close.Click += new System.EventHandler(this.ToolStripMenuItem_Close_Click);
+            // 
+            // timer1
+            // 
+            this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
+            // 
+            // timer_LogApi
+            // 
+            this.timer_LogApi.Tick += new System.EventHandler(this.timer_LogApi_Tick);
+            // 
+            // Form1
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(544, 226);
+            this.Name = "Form1";
+            this.Text = "SIGNUS";
+            this.WindowState = System.Windows.Forms.FormWindowState.Minimized;
+            this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.Form1_FormClosed);
+            this.Load += new System.EventHandler(this.Form1_Load);
+            this.Resize += new System.EventHandler(this.Form1_Resize);
+            this.contextMenuStrip1.ResumeLayout(false);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.NotifyIcon notifyIcon1;
+        private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
+        private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem_Close;
+        private System.Windows.Forms.Timer timer1;
+        private System.Windows.Forms.Timer timer_LogApi;
+    }
+}
+
 
SignusKHSVR/Form1.cs (added)
+++ SignusKHSVR/Form1.cs
@@ -0,0 +1,164 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using System.Diagnostics;
+
+namespace SignusKHSVR
+{
+    public partial class Form1 : Form
+    {
+        const int MAX_PROCESS = 10;
+        private Process[] m_ps = new Process[MAX_PROCESS];
+        private List<string> m_lstExe = new List<string>();
+
+        public Form1()
+        {
+            InitializeComponent();
+        }
+
+        private void ToolStripMenuItem_Close_Click(object sender, EventArgs e)
+        {
+            Program.PostMessage((IntPtr)0xffff, Program.messageQuit, 0, 0);
+
+            for (int i = 0; i < MAX_PROCESS; i++)
+            {
+                if (m_ps[i] != null)
+                {
+                    m_ps[i].Kill();
+                    m_ps[i] = null;
+                }
+            }
+            this.Close();
+        }
+
+        private string m_strUrl = "http://192.168.1.17:8080";
+
+        private void Form1_Load(object sender, EventArgs e)
+        {
+            string AppPath = Application.ExecutablePath.Substring(0, Application.ExecutablePath.LastIndexOf("\\"));
+
+            //string strChrome1 = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe";
+            //string strChrome2 = "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe";
+            //string strChrome3 = "C:\\Users\\CUPC\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe";
+
+            //if (System.IO.File.Exists(strChrome1))
+            //    this.m_lstExe.Add(strChrome1);
+            //else if (System.IO.File.Exists(strChrome2))
+            //    this.m_lstExe.Add(strChrome2);
+            //else if (System.IO.File.Exists(strChrome3))
+            //    this.m_lstExe.Add(strChrome3);
+
+            //this.m_lstExe.Add(AppPath + string.Format("\\KHSCALE.exe"));
+
+            timer1.Enabled = true;
+            timer1.Interval = 500;
+
+            timer_LogApi.Enabled = true;
+            timer_LogApi.Interval = 30 * 60 * 1000;
+
+            this.Visible = false; //창을 보이지 않게 한다.
+            this.ShowIcon = false; //작업표시줄에서 제거.
+        }
+
+        private int m_nPrevSec = -1;
+
+        private void timer1_Tick(object sender, EventArgs e)
+        {
+            DateTime dtNow = DateTime.Now;
+            if (m_nPrevSec == dtNow.Second) return;
+            m_nPrevSec = dtNow.Second;
+
+            UpdateProgram(m_nPrevSec % 10);
+
+            //Program.MoveFiles("C:\\EDIM\\Edge Advance 16P\\CSV", "C:\\EDIM\\Edge Advance 16P\\CSV1");
+        }
+
+        public void UpdateProgram(int index)
+        {
+            if (index < 0) return;
+            if (index >= this.m_lstExe.Count()) return;
+
+            string AppExe = this.m_lstExe[index];
+            if (System.IO.File.Exists(AppExe) == false)
+                return;
+
+            string AppPath = Application.ExecutablePath.Substring(0, Application.ExecutablePath.LastIndexOf("\\"));
+
+            if (m_ps[index] == null)
+            {
+                m_ps[index] = new Process();
+            }
+            else
+            {
+                try
+                {
+                    if (m_ps[index].HasExited)
+                    {
+                        m_ps[index].Close();
+                        m_ps[index] = new System.Diagnostics.Process();
+                    }
+                    else
+                    {
+                        return;
+                    }
+                }
+                catch
+                {
+                    return;
+                }
+            }
+
+            if (AppExe.IndexOf("chrome") > 0)
+            {
+                m_ps[index].StartInfo.FileName = AppExe;
+                m_ps[index].StartInfo.WorkingDirectory = AppPath;
+                m_ps[index].StartInfo.Arguments = " -kiosk -fullscreen " + m_strUrl;
+                m_ps[index].StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Maximized;
+                m_ps[index].Start();
+                return;
+            }
+
+            m_ps[index].StartInfo.FileName = AppExe;
+            m_ps[index].StartInfo.WorkingDirectory = AppPath;
+            m_ps[index].StartInfo.Arguments = "";
+            m_ps[index].StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Minimized;
+            m_ps[index].Start();
+        }
+
+        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
+        {
+            Program.PostMessage((IntPtr)0xffff, Program.messageQuit, 0, 0);
+
+            for (int i = 0; i < MAX_PROCESS; i++)
+            {
+                if (m_ps[i] != null)
+                {
+                    m_ps[i].Kill();
+                    m_ps[i] = null;
+                }
+            }
+        }
+
+        private void Form1_Resize(object sender, EventArgs e)
+        {
+            if (this.WindowState == FormWindowState.Minimized)
+            {
+                this.Visible = false; //창을 보이지 않게 한다.
+                this.ShowIcon = false; //작업표시줄에서 제거.
+                //m_notify.Visible = true; //트레이 아이콘을 표시한다.
+            }
+        }
+
+        private void timer_LogApi_Tick(object sender, EventArgs e)
+        {
+            SFLogApi log = new SFLogApi();
+            log.Run();
+        }
+    }
+}
 
SignusKHSVR/Form1.resx (added)
+++ SignusKHSVR/Form1.resx
@@ -0,0 +1,420 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="notifyIcon1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>35, 21</value>
+  </metadata>
+  <metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>149, 21</value>
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="notifyIcon1.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAEAQEAAAAEAIAAoQgAAFgAAACgAAABAAAAAgAAAAAEAIAAAAAAAAEAAAMMOAADDDgAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByX0wncV1Pb3NcT4ZyXU6+cl1OvnNc
+        Tt5zXU//c11P/3NdT/9zXU//clxP5nJdTr5yXU6+c1xOjnJdTnd0Wk8vAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdFpPL3NcT4ZzXE/Wc11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nc
+        Tt5zXE6Oc1tPPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG9eTw9zXE6OclxP5nNd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXE7uc11OnnRfSRcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfl49B3Nd
+        T39zXE7uc11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9yXE/2c1xOjm9e
+        Tw8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAc11OZ3JcT+ZzXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXE7ucl1Od35ePQcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAB0Wk8vc1xP1nNdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9yXE/mc1tPPwAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByXE9Pc1xO7nNdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Jc
+        T/ZzXU5nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxXU9vc11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NcTo4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5ePQdzXU6ec11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11Ptm9eTw8AAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5e
+        PQdzXU+2c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9yXU7Ob15PDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAABzXE6Oc11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT7YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzXU5nc11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c1xOjgAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzW08/clxP9nNdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//clxP/2pWSf9oVUn/aFVJ/2hV
+        Sf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hV
+        Sf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/bVhL/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU5nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABvX08fclxP5nNd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/29a
+        Tf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hV
+        Sf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//clxP9nNbTz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAc11OrnNdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/+Acmn/yNXU/9Hg4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg
+        4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg
+        4P+wuLb/c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9yXE/mfl49BwAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAcVxNR3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//np+b/9Hg4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg
+        4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg
+        4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Fd
+        T28AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJdTs5zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3hlWf+2vLv/0eDg/9Hg
+        4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg
+        4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg4P9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9yXE/mfl49BwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJcT19zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//clxP/2pWSf9oVUn/aFVJ/2hV
+        Sf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hV
+        Sf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/bVhL/3NdT/9zXU//0eDg/9Hg4P/R4OD/c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NcTo4AAAAAAAAAAAAAAAAAAAAAAAAAAH5e
+        PQdyXE/mc11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/29a
+        Tf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hV
+        Sf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9zXU//c11P/9Hg
+        4P/R4OD/0eDg/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9yXE/2dF9JFwAA
+        AAAAAAAAAAAAAAAAAABxXU9vc11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/+Acmn/yNXU/9Hg4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg
+        4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg
+        4P+wuLb/c11P/3NdT//R4OD/0eDg/9Hg4P9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NcTo4AAAAAAAAAAAAAAAAAAAAAcl1OvnNdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//np+b/9Hg4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg
+        4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg
+        4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/3NdT/9zXU//0eDg/9Hg4P/R4OD/c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXE7eAAAAAAAAAAAAAAAAdF9JF3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3hlWf+2vLv/0eDg/9Hg
+        4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg
+        4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg4P/R4OD/0eDg/9Hg4P9zXU//c11P/9Hg4P/R4OD/0eDg/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3FbTTcAAAAAAAAAAHJc
+        T19zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/21YS/9oVUn/aFVJ/2hV
+        Sf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hV
+        Sf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9rV0r/clxP/3NdT/9zXU//0eDg/9Hg4P/R4OD/c11P/3Nd
+        T//R4OD/0eDg/9Hg4P9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU9/AAAAAAAAAABzXU+2c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/21Y
+        S/9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hV
+        Sf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2xYS/9zXU//c11P/9Hg
+        4P/R4OD/0eDg/3NdT/9zXU//0eDg/9Hg4P/R4OD/c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c1xP1gAAAAB+Xj0HclxP9nNdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zYlf/1tPS////////////////////////////////////////////////////
+        /////////////////////////////////////////////////////////////////////////////+Hf
+        3v96a2P/c11P/3NdT//R4OD/0eDg/9Hg4P9zXU//c11P/9Hg4P/R4OD/0eDg/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9vX08fclxPT3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//zsvJ////////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////////////
+        ////////////////////////2dfW/3NdT/9zXU//0eDg/9Hg4P/R4OD/c11P/3NdT//R4OD/0eDg/9Hg
+        4P9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//cV1Pb3Nd
+        TmdzXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P//Lx8P//////////////
+        ////////////////////////////////////////////////////////////////////////////////
+        //////////////////////////////////////////////v7+/9zXU//c11P/9Hg4P/R4OD/0eDg/3Nd
+        T/9zXU//0eDg/9Hg4P/R4OD/c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NcT4ZzXU9/c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/////////////////9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//////////////////c11P/3Nd
+        T//R4OD/0eDg/9Hg4P9zXU//c11P/9Hg4P/R4OD/0eDg/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU6ec11OnnNdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//////////////////c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P////
+        /////////////3NdT/9zXU//0eDg/9Hg4P/R4OD/c11P/3NdT//R4OD/0eDg/9Hg4P9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//cl1OvnNdT7ZzXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/////////////////3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/////////////////9zXU//c11P/9Hg4P/R4OD/0eDg/3NdT/9zXU//0eDg/9Hg
+        4P/R4OD/c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nc
+        T9ZyXU7Oc11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT///////////////
+        //9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//////////////////c11P/3NdT//R4OD/0eDg/9Hg
+        4P9zXU//c11P/9Hg4P/R4OD/0eDg/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXE7uclxP5nNdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//////////////////c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/////////////////3Nd
+        T/9zXU//0eDg/9Hg4P/R4OD/c11P/3NdT//R4OD/0eDg/9Hg4P9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NcTt5zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/////////////////3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/////////////////9zXU//c11P/9Hg4P/R4OD/0eDg/3NdT/9zXU//0eDg/9Hg4P/R4OD/c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU/Gc11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/////////////////9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//////////////////c11P/3NdT//R4OD/0eDg/9Hg4P9zXU//c11P/9Hg
+        4P/R4OD/0eDg/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9yXE/mc11OrnNdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//////////
+        ////////c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/////////////////3NdT/9zXU//0eDg/9Hg
+        4P/R4OD/c11P/3NdT//R4OD/0eDg/9Hg4P9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//cl1OznJcT5ZzXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/////////////////3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT///////////////
+        //9zXU//c11P/9Hg4P/R4OD/0eDg/3NdT/9zXU//0eDg/9Hg4P/R4OD/c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT7ZzXU9/c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/////////////////9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//////////////////c11P/3NdT//R4OD/0eDg/9Hg4P9zXU//c11P/7rDwf/R4OD/xM/O/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU6eclxPX3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//////////////////c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/////////////////3NdT/9zXU//0eDg/9Hg4P/R4OD/c11P/3Nd
+        T/9zXU//kY2H/3hlWf9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11Pf3NbTz9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P////
+        /////////////3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/////////////////9zXU//c11P/9Hg
+        4P/R4OD/0eDg/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3JcT18AAAAAc1xO7nNdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/////////////////9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//////////
+        ////////c11P/3NdT//R4OD/0eDg/9Hg4P9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9vXk8PAAAAAHNdTp5zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//////////////////c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/////////////////3NdT/9zXU//0eDg/9Hg4P/R4OD/c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9yXU6+AAAAAAAA
+        AAByXE9Pc11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/////////////////3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/////////////////9zXU//c11P/7rDwf/R4OD/xM/O/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//cV1PbwAAAAAAAAAAfl49B3JcT/ZzXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/////////////////9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//////////////////c11P/3Nd
+        T/9zXU//kY2H/3hlWf9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/29fTx8AAAAAAAAAAAAAAABzXU6uc11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//////////////////aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hV
+        Sf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/aFVJ////
+        /////////////3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3JdTs4AAAAAAAAAAAAAAAAAAAAAclxPT3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/////////////////2hVSf9oVUn/aFVJ/2hV
+        Sf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hVSf9oVUn/aFVJ/2hV
+        Sf9oVUn/aFVJ/2hVSf////////////////9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9xXU9vAAAAAAAA
+        AAAAAAAAAAAAAAAAAAByXU7Oc11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT//s6ur/////////
+        ////////////////////////////////////////////////////////////////////////////////
+        ///////////////////////////////////////////////////4+Pf/c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9yXE/mfl49BwAAAAAAAAAAAAAAAAAAAAAAAAAAcVtNN3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//ubKu////////////////////////////////////////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////ycXC/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11OZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzXU6uc11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/+5sq7/5ePi////////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////////////
+        ///l4+L/xcC+/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//cl1OzgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAcl9MJ3JcT/ZzXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3JcT08AAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzXE6Oc11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T8YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfl49B3NdT8ZzXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3JcT+ZvX08fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AABvX08fclxP5nNdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3JcT/ZxW003AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFbTTdyXE/2c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXE5XAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAclxPX3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXE+GAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AABzXU9/c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU6eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHNcTldyXE/2c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9xXU9vAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcVtNN3JcT+ZzXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NcTu5yXE9PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAB0X0kXc11PxnNdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NcT9ZyX0wnAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5ePQdzXE6OclxP9nNdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3JcT5ZvXk8PAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG9fTx9yXU+mc11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11PtnRa
+        Ty8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAHFbTTdyXU6+c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9yXU7Oc1tPPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJcT09yXU+mc1xO7nNdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//clxP9nNdTq5yXE9fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AABxXE1HclxPlnJcT+ZzXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+        T/9zXU//c11P/3NcTu5zXU6eclxPT35ePQcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdFpPL3FcTUdzXU9/c11Pf3NdTp5yXU6+cl1OvnJd
+        Tr5yXU6+cl1PpnNdT39zXU9/clxPT3FbTTcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAA////AAD///////gAAB//////wAAAA/////8AAAAA/////gAAAAA////4AAAAAB////AAAAAA
+        D///4AAAAAAH//+AAAAAAAH//wAAAAAAAP//AAAAAAAA//4AAAAAAAB//AAAAAAAAD/4AAAAAAAAH/gA
+        AAAAAAAP8AAAAAAAAA/wAAAAAAAAB+AAAAAAAAAHwAAAAAAAAAPAAAAAAAAAA8AAAAAAAAADgAAAAAAA
+        AAGAAAAAAAAAAYAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAHAAAAAAAAAA8AA
+        AAAAAAAD4AAAAAAAAAPgAAAAAAAAB/AAAAAAAAAP8AAAAAAAAA/4AAAAAAAAH/gAAAAAAAAf/AAAAAAA
+        AD/+AAAAAAAAf/8AAAAAAAD//4AAAAAAAf//wAAAAAAD///gAAAAAAf///AAAAAAD///+AAAAAAf///+
+        AAAAAH////+AAAAB/////+AAAAf//////AAAH///////gAH///8=
+</value>
+  </data>
+  <metadata name="timer1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>307, 21</value>
+  </metadata>
+  <metadata name="timer_LogApi.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>394, 21</value>
+  </metadata>
+</root>(No newline at end of file)
 
SignusKHSVR/Program.cs (added)
+++ SignusKHSVR/Program.cs
@@ -0,0 +1,86 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using System.Runtime.InteropServices;
+using System.IO;
+
+namespace SignusKHSVR
+{
+    static class Program
+    {
+        [DllImport("user32.dll")]
+        public static extern uint RegisterWindowMessage(string lpString);
+        [DllImport("user32.dll")]
+        public static extern bool PostMessage(IntPtr hWnd, uint Msg, uint wParam, uint lParam);
+
+        public static uint messageQuit = 0;
+
+        /// <summary>
+        /// 해당 응용 프로그램의 주 진입점입니다.
+        /// </summary>
+        [STAThread]
+        static void Main()
+        {
+            bool createNew = false;
+            //프로그램 중복실행 방지
+            System.Threading.Mutex mutex = new System.Threading.Mutex(true, "__U3_SIGNUS_KHSVR_W__MUTEX__", out createNew);
+
+            if (createNew == false)
+            {
+                MessageBox.Show("프로그램이 이미 실행중입니다.", "SIGNUS");
+                return;
+            }
+
+            U3Config config = new U3Config();
+
+            SFLogApi log = new SFLogApi();
+            log.Run();
+
+            messageQuit = RegisterWindowMessage("MSG_SIGNUS_QUIT");
+
+            Application.EnableVisualStyles();
+            Application.SetCompatibleTextRenderingDefault(false);
+            Application.Run(new Form1());
+        }
+
+        static public void DeleteOldFiles(string dirName, int nSec)
+        {
+            DateTime dt = DateTime.Now.AddSeconds(-nSec);
+            string[] files = Directory.GetFiles(dirName);
+
+            foreach (string file in files)
+            {
+                try
+                {
+                    FileInfo fi = new FileInfo(file);
+                    if (fi.CreationTime < dt)
+                        fi.Delete();
+                }
+                catch
+                {
+                }
+            }
+        }
+
+        static public void MoveFiles(string srcDir, string dstDir)
+        {
+            string[] files = Directory.GetFiles(srcDir);
+            foreach (string file in files)
+            {
+                try
+                {
+                    FileInfo fi = new FileInfo(file);
+                    if(fi.Length > 0)
+                    {
+                        File.Move(file, dstDir + "\\" + fi.Name);
+                    }
+                }
+                catch
+                {
+                }
+            }
+        }
+    }
+}
 
SignusKHSVR/Properties/AssemblyInfo.cs (added)
+++ SignusKHSVR/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 어셈블리에 대한 일반 정보는 다음 특성 집합을 통해 
+// 제어됩니다. 어셈블리와 관련된 정보를 수정하려면
+// 이러한 특성 값을 변경하세요.
+[assembly: AssemblyTitle("SignusKHSVR")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("SignusKHSVR")]
+[assembly: AssemblyCopyright("Copyright ©  2021")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에 
+// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면
+// 해당 형식에 대해 ComVisible 특성을 true로 설정하세요.
+[assembly: ComVisible(false)]
+
+// 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다.
+[assembly: Guid("7f1050f6-b03b-45c2-9f19-6632066e4b5c")]
+
+// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다.
+//
+//      주 버전
+//      부 버전 
+//      빌드 번호
+//      수정 버전
+//
+// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호가 자동으로
+// 지정되도록 할 수 있습니다.
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
 
SignusKHSVR/Properties/Resources.Designer.cs (added)
+++ SignusKHSVR/Properties/Resources.Designer.cs
@@ -0,0 +1,71 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     이 코드는 도구를 사용하여 생성되었습니다.
+//     런타임 버전:4.0.30319.42000
+//
+//     파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
+//     이러한 변경 내용이 손실됩니다.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace SignusKHSVR.Properties
+{
+
+
+    /// <summary>
+    ///   지역화된 문자열 등을 찾기 위한 강력한 형식의 리소스 클래스입니다.
+    /// </summary>
+    // 이 클래스는 ResGen 또는 Visual Studio와 같은 도구를 통해 StronglyTypedResourceBuilder
+    // 클래스에서 자동으로 생성되었습니다.
+    // 멤버를 추가하거나 제거하려면 .ResX 파일을 편집한 다음 /str 옵션을 사용하여
+    // ResGen을 다시 실행하거나 VS 프로젝트를 다시 빌드하십시오.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources
+    {
+
+        private static global::System.Resources.ResourceManager resourceMan;
+
+        private static global::System.Globalization.CultureInfo resourceCulture;
+
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources()
+        {
+        }
+
+        /// <summary>
+        ///   이 클래스에서 사용하는 캐시된 ResourceManager 인스턴스를 반환합니다.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager
+        {
+            get
+            {
+                if ((resourceMan == null))
+                {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SignusKHSVR.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+
+        /// <summary>
+        ///   이 강력한 형식의 리소스 클래스를 사용하여 모든 리소스 조회에 대해 현재 스레드의 CurrentUICulture 속성을
+        ///   재정의합니다.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture
+        {
+            get
+            {
+                return resourceCulture;
+            }
+            set
+            {
+                resourceCulture = value;
+            }
+        }
+    }
+}
 
SignusKHSVR/Properties/Resources.resx (added)
+++ SignusKHSVR/Properties/Resources.resx
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>(No newline at end of file)
 
SignusKHSVR/Properties/Settings.Designer.cs (added)
+++ SignusKHSVR/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace SignusKHSVR.Properties
+{
+
+
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.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;
+            }
+        }
+    }
+}
 
SignusKHSVR/Properties/Settings.settings (added)
+++ SignusKHSVR/Properties/Settings.settings
@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
+  <Profiles>
+    <Profile Name="(Default)" />
+  </Profiles>
+  <Settings />
+</SettingsFile>
 
SignusKHSVR/SFLogApi.cs (added)
+++ SignusKHSVR/SFLogApi.cs
@@ -0,0 +1,121 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Data;
+using System.Web;
+using System.Net;
+using System.IO;
+using System.Threading.Tasks;
+
+namespace SignusKHSVR
+{
+    public class SFLogApi
+    {
+        public void Run()
+        {
+            U3Database db = new U3Database();
+            string strSQL = "";
+
+            strSQL = "select * from T_SYS_LOG_SF where SEND_YN = 'N' and logDt >= '2022-12-01 00:00:00' ";
+            DataTable dt = db.OpenSQL(strSQL);
+
+            foreach(DataRow dr in dt.Rows)
+            {
+                string crtfcKey = "$5$API$1WbqYTUStuf.RwPb2dgv//OCyn//FDtEWyIAFQQhvE/";
+
+                string idx = U3Util.toStr(dr["IDX"]);
+                string logDt = U3Util.toStr(dr["logDt"]);
+                string useSe = U3Util.toStr(dr["useSe"]);
+                string sysUser = U3Util.toStr(dr["sysUser"]);
+                string conectIp = U3Util.toStr(dr["conectIp"]);
+                string dataUsgqty = U3Util.toStr(dr["dataUsgqty"]);
+
+                if (sysUser.Length == 0) sysUser = "houghton";
+
+                string strJson = "";
+                strJson += "{";
+                strJson += "\"crtfcKey\":\"" + crtfcKey + "\",";
+                strJson += "\"logDt\":\"" + logDt + "\",";
+                strJson += "\"useSe\":\"" + useSe + "\",";
+                strJson += "\"sysUser\":\"" + sysUser + "\",";
+                strJson += "\"conectIp\":\"" + conectIp + "\",";
+                strJson += "\"dataUsgqty\":\"" + dataUsgqty + "\"";
+                strJson += "}";
+                string strJsonEnc = HttpUtility.UrlEncode(strJson);
+
+                string strUrl = "https://log.smart-factory.kr/apisvc/sendLogDataJSON.do?logData=";
+                string strSend = strUrl + strJsonEnc;
+                string strRecv = HttpGet(strSend);
+
+                //string strUrl = "https://log.smart-factory.kr/apisvc/sendLogData.json";
+                //string strSend = strJson;
+                //string strRecv = HttpPost(strUrl, strSend);
+
+                string sql1 = "";
+                sql1 += " update T_SYS_LOG_SF set SEND_YN = 'Y', ";
+                sql1 += " SEND_DATA = '" + strSend + "', ";
+                sql1 += " RECV_DATA = '" + strRecv + "' ";
+                sql1 += " where IDX = " + idx;
+                db.ExcuteSql(sql1);
+            }
+        }
+
+        private string HttpGet(string strUrl)
+        {
+            try
+            {
+                HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(strUrl);
+                httpWebRequest.Method = "GET";
+                httpWebRequest.Timeout = 5000;
+
+                var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
+                using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
+                {
+                    string result = streamReader.ReadToEnd();
+                    return result;
+                }
+            }
+            catch (Exception ex)
+            {
+                U3Util.ErrorLog(ex.Message);
+                return "";
+            }
+        }
+
+        private string HttpPost(string strUrl, string strSend)
+        {
+            try
+            {
+                HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(strUrl);
+                httpWebRequest.Method = "POST";
+                //httpWebRequest.ContentType = "application/json; charset=utf-8";
+                httpWebRequest.ContentType = "application/x-www-form-urlencoded; charset=utf-8";
+                httpWebRequest.Timeout = 5000;
+
+                using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
+                {
+                    byte[] byteArray = Encoding.UTF8.GetBytes(strSend);
+                    char[] charArray = Encoding.Default.GetChars(byteArray);
+                    streamWriter.Write(charArray, 0, charArray.Length);
+
+                    //streamWriter.Write(strSend);
+                    streamWriter.Flush();
+                    streamWriter.Close();
+
+                    var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
+                    using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
+                    {
+                        string result = streamReader.ReadToEnd();
+                        return result;
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                U3Util.ErrorLog(ex.Message);
+                return "";
+            }
+        }
+    }
+}
 
SignusKHSVR/SignusKHSVR.csproj (added)
+++ SignusKHSVR/SignusKHSVR.csproj
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{7F1050F6-B03B-46C2-9F29-6632066E4B5C}</ProjectGuid>
+    <OutputType>WinExe</OutputType>
+    <RootNamespace>SignusKHSVR</RootNamespace>
+    <AssemblyName>SignusKHSVR</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <Deterministic>true</Deterministic>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <ApplicationIcon>hyundai.ico</ApplicationIcon>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Web" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Form1.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Form1.Designer.cs">
+      <DependentUpon>Form1.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="SFLogApi.cs" />
+    <Compile Include="U3Config.cs" />
+    <Compile Include="U3Database.cs" />
+    <Compile Include="U3Util.cs" />
+    <EmbeddedResource Include="Form1.resx">
+      <DependentUpon>Form1.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <None Include="Properties\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+    </None>
+    <Compile Include="Properties\Settings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="hyundai.ico" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\YdtechLib\YdtechLib.csproj">
+      <Project>{1db7db22-f72f-4f63-b892-b099438fda25}</Project>
+      <Name>YdtechLib</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project>(No newline at end of file)
 
SignusKHSVR/U3Config.cs (added)
+++ SignusKHSVR/U3Config.cs
@@ -0,0 +1,68 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+
+namespace SignusKHSVR
+{
+    public class U3Config
+    {
+        public const bool FLAG_TEST = true;
+        public const int MAX_DI = 4;
+        public const int MAX_DEV = 100;
+        static public string m_SqlConnStr = "";
+
+        [DllImport("kernel32")]
+        private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
+        [DllImport("kernel32")]
+        private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
+
+        protected string GetIniFile()
+        {
+            string AppPath = Application.ExecutablePath.Substring(0, Application.ExecutablePath.LastIndexOf("\\"));
+            return AppPath + "\\Config.ini";
+        }
+
+        protected string GetIniValue(string Section, string Key, string defvalue)
+        {
+            StringBuilder temp = new StringBuilder(255);
+            int i = GetPrivateProfileString(Section, Key, defvalue, temp, 255, GetIniFile());
+            return temp.ToString();
+        }
+
+        protected void SetIniValue(string Section, string Key, string Value)
+        {
+            WritePrivateProfileString(Section, Key, Value, GetIniFile());
+        }
+
+        //public string m_StrMqttIP = "";
+        public string m_StrSqlServerIP = "";
+
+        public U3Config()
+        {
+            Load();
+
+            // 테스트용 개발 서버
+            //m_SqlConnStr = "Provider=SQLOLEDB.1;Password=tlrmsjtm~1@3;Persist Security Info=False;User ID=sa;Initial Catalog=U3SMES;Data Source=signus-sf1.koreacentral.cloudapp.azure.com,14443";
+
+            // 한국하우톤 현장 서버
+            m_SqlConnStr = "Provider=SQLOLEDB.1;Password=signus1!;Persist Security Info=False;User ID=sa;Initial Catalog=U3SMES;Data Source=192.168.1.17,1433";
+        }
+
+        public void Save()
+        {
+            //SetIniValue("MQTT", "IPADDR", m_StrMqttIP);
+            SetIniValue("SQLSERVER", "IPADDR", m_StrSqlServerIP);
+        }
+
+        public void Load()
+        {
+            m_StrSqlServerIP = GetIniValue("SQLSERVER", "IPADDR", "192.168.1.17");
+            //m_StrMqttIP = GetIniValue("MQTT", "IPADDR", "192.168.0.200");
+            //m_StrSqlServerIP = GetIniValue("SQLSERVER", "IPADDR", "192.168.0.240");
+        }
+    }
+}
 
SignusKHSVR/U3Database.cs (added)
+++ SignusKHSVR/U3Database.cs
@@ -0,0 +1,157 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Data;
+using System.Data.OleDb;
+
+namespace SignusKHSVR
+{
+    public class U3Database
+    {
+        private OleDbConnection mCN = null;
+        private OleDbCommand mCmd = null;
+
+        public bool SetSqlServer()
+        {
+            try
+            {
+                mCN = new OleDbConnection();
+                mCN.ConnectionString = U3Config.m_SqlConnStr;
+                mCN.Open();
+                return true;
+            }
+            catch (Exception ex)
+            {
+                U3Util.ErrorLog("Can't connect to database." + Environment.NewLine + ex.Message);
+                return false;
+            }
+        }
+
+        public DataTable OpenSQL(string strSQL)
+        {
+            DataTable retTable = new DataTable();
+
+            try
+            {
+                mCN = new OleDbConnection();
+                mCN.ConnectionString = U3Config.m_SqlConnStr;
+                mCN.Open();
+
+                mCmd = new OleDbCommand(strSQL, mCN);
+                OleDbDataAdapter da = new OleDbDataAdapter(mCmd);
+                da.Fill(retTable);
+            }
+            catch (Exception ex)
+            {
+                U3Util.ErrorLog(strSQL);
+                U3Util.ErrorLog(ex.Message);
+            }
+            finally
+            {
+                if (mCN != null) mCN.Close();
+            }
+            return retTable;
+        }
+
+
+        public DataSet OpenSQLSet(string strSQL)
+        {
+            DataSet retTable = new DataSet();
+
+            try
+            {
+                mCN = new OleDbConnection();
+                mCN.ConnectionString = U3Config.m_SqlConnStr;
+                mCN.Open();
+
+                mCmd = new OleDbCommand(strSQL, mCN);
+                OleDbDataAdapter da = new OleDbDataAdapter(mCmd);
+                da.Fill(retTable);
+            }
+            catch (Exception ex)
+            {
+                U3Util.ErrorLog(strSQL);
+                U3Util.ErrorLog(ex.Message);
+            }
+            finally
+            {
+                if (mCN != null) mCN.Close();
+            }
+            return retTable;
+        }
+
+        public int ExcuteSql(string strSql)
+        {
+            try
+            {
+                mCN = new OleDbConnection();
+                mCN.ConnectionString = U3Config.m_SqlConnStr;
+                mCN.Open();
+
+                mCmd = new OleDbCommand(strSql, mCN);
+                int iResult = mCmd.ExecuteNonQuery();
+
+                return iResult;
+            }
+            catch (Exception ex)
+            {
+                U3Util.ErrorLog(strSql);
+                U3Util.ErrorLog(ex.Message);
+                return 0;
+            }
+            finally
+            {
+                if (mCN != null) mCN.Close();
+            }
+        }
+
+        public bool ExcuteSqls(List<string> strSqls)
+        {
+            string strMsg = "";
+            return ExcuteSqls(strSqls, out strMsg);
+        }
+
+        public bool ExcuteSqls(List<string> strSqls, out string strMessage)
+        {
+            string strSQL = string.Empty;
+            try
+            {
+                mCN = new OleDbConnection();
+                mCN.ConnectionString = U3Config.m_SqlConnStr;
+                mCN.Open();
+
+                mCmd = new OleDbCommand();
+                mCmd.Connection = mCN;
+            }
+            catch (Exception ex)
+            {
+                U3Util.ErrorLog(ex.Message);
+                if (mCN != null) mCN.Close();
+                strMessage = "DB접속 오류: " + ex.Message;
+                return false;
+            }
+
+            int count = 0;
+            foreach (string strSql in strSqls)
+            {
+                strSQL = strSql;
+                try
+                {
+                    mCmd.CommandText = strSql;
+                    mCmd.ExecuteNonQuery();
+                    count++;
+                }
+                catch (Exception ex)
+                {
+                    U3Util.ErrorLog(strSQL);
+                    U3Util.ErrorLog(ex.Message);
+                }
+            }
+            if (mCN != null) mCN.Close();
+            strMessage = string.Format("SQL 실행 완료({0}건 실행, {1}건 성공)", strSqls.Count, count);
+            return true;
+        }
+    }
+}
 
SignusKHSVR/U3Util.cs (added)
+++ SignusKHSVR/U3Util.cs
@@ -0,0 +1,302 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using System.IO;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.Drawing.Drawing2D;
+
+namespace SignusKHSVR
+{
+    public class U3Util
+    {
+        static public Random rnd = new Random(new System.DateTime().Millisecond);
+
+        static public string GetErrorLogFile(bool bFullPath)
+        {
+            string AppPath = Application.ExecutablePath.Substring(0, Application.ExecutablePath.LastIndexOf("\\"));
+            string AppName = Application.ExecutablePath.Substring(Application.ExecutablePath.LastIndexOf("\\") + 1);
+            string AppTitle = AppName.Substring(0, AppName.LastIndexOf("."));
+
+            if (bFullPath)
+                return AppPath + "\\" + AppTitle + "Error.txt";
+            else
+                return AppTitle + "Error.txt";
+        }
+
+        static public string GetEventLogFile(bool bFullPath)
+        {
+            string AppPath = Application.ExecutablePath.Substring(0, Application.ExecutablePath.LastIndexOf("\\"));
+            string AppName = Application.ExecutablePath.Substring(Application.ExecutablePath.LastIndexOf("\\") + 1);
+            string AppTitle = AppName.Substring(0, AppName.LastIndexOf("."));
+
+            if (bFullPath)
+                return AppPath + "\\" + AppTitle + "Event.txt";
+            else
+                return AppTitle + "Event.txt";
+        }
+
+        static public string GetImagePath()
+        {
+            string AppPath = Application.ExecutablePath.Substring(0, Application.ExecutablePath.LastIndexOf("\\"));
+            return AppPath + "\\" + "Images";
+        }
+
+        public static Bitmap ResizeImage(Image image, int width, int height)
+        {
+            var destRect = new Rectangle(0, 0, width, height);
+            var destImage = new Bitmap(width, height);
+
+            destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);
+
+            using (var graphics = Graphics.FromImage(destImage))
+            {
+                graphics.CompositingMode = CompositingMode.SourceCopy;
+                graphics.CompositingQuality = CompositingQuality.HighQuality;
+                graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
+                graphics.SmoothingMode = SmoothingMode.HighQuality;
+                graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
+
+                using (var wrapMode = new ImageAttributes())
+                {
+                    wrapMode.SetWrapMode(WrapMode.TileFlipXY);
+                    graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);
+                }
+            }
+            return destImage;
+        }
+
+        public static void ErrorLog(string strLog)
+        {
+            try
+            {
+                FileLog(strLog, GetErrorLogFile(false));
+            }
+            catch
+            {
+            }
+        }
+
+        public static void EventLog(string strLog)
+        {
+            try
+            {
+                FileLog(strLog, GetEventLogFile(false));
+            }
+            catch
+            {
+            }
+        }
+
+        public static void FileLog(string strLog, string strFileName)
+        {
+            string str = "";
+
+            DateTime t = DateTime.Now;
+            str = t.ToString("(yyyy-MM-dd HH:mm:ss.fff) ");
+            str += strLog;
+
+            try
+            {
+                string AppPath = Application.ExecutablePath.Substring(0, Application.ExecutablePath.LastIndexOf("\\"));
+                string strLogFile = AppPath + "\\" + strFileName;
+                FileBackup(strLogFile);
+                FileWrite(strLogFile, str);
+            }
+            catch (Exception ex)
+            {
+                throw new Exception("FileLog->:" + ex.Message);
+            }
+        }
+
+        public static void FileBackup(string strLogFile)
+        {
+            if (File.Exists(strLogFile))
+            {
+                try
+                {
+                    FileInfo f = new FileInfo(strLogFile);
+                    if (f.Length >= (2 * 1024 * 1024))
+                    {
+                        System.IO.File.Delete(strLogFile + ".bak");
+                        f.MoveTo(strLogFile + ".bak");
+                    }
+                }
+                catch (Exception ex)
+                {
+                    throw new Exception("FileBackup->:" + ex.Message);
+                }
+            }
+        }
+
+        public static void FileWrite(string strLogFile, string str)
+        {
+            try
+            {
+                FileStream fs = new FileStream(strLogFile, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);
+                fs.Seek(0, SeekOrigin.End);
+                StreamWriter swFromFile = new StreamWriter(fs);
+                swFromFile.WriteLine(str);
+                swFromFile.Close();
+                fs.Close();
+            }
+            catch (Exception ex)
+            {
+                ErrorLog("FileWrite->:" + ex.Message);
+            }
+        }
+
+        public static string FileRead(string strFileName)
+        {
+            if (System.IO.File.Exists(strFileName) == false) return "";
+
+            string result = "";
+            try
+            {
+                FileStream fs = new FileStream(strFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
+                fs.Seek(0, SeekOrigin.Begin);
+                StreamReader srFile = new StreamReader(fs, Encoding.Default, true);
+                result = srFile.ReadToEnd();
+                srFile.Close();
+                fs.Close();
+            }
+            catch (Exception ex)
+            {
+                ErrorLog("FileRead->:" + ex.Message);
+            }
+            return result;
+        }
+
+        public static bool GetBit(byte b, int bitNumber)
+        {
+            return (b & (1 << bitNumber)) != 0;
+        }
+
+        public static bool GetBit(short s, int bitNumber)
+        {
+            return (s & (1 << bitNumber)) != 0;
+        }
+
+        static public DateTime FromUnixTime(long unixTime)
+        {
+            var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
+            return epoch.AddSeconds(unixTime);
+        }
+
+        static public Int32 ToUnixTime(DateTime dt)
+        {
+            return (Int32)(dt.Subtract(new DateTime(1970, 1, 1, 0, 0, 0))).TotalSeconds;
+        }
+
+        static public void DeleteAllFile(string strPath)
+        {
+            try
+            {
+                System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(strPath);
+                FileInfo[] lst = di.GetFiles();
+                foreach (FileInfo fi in lst)
+                {
+                    System.IO.File.Delete(fi.FullName);
+                }
+            }
+            catch
+            {
+            }
+        }
+
+        public static string toStr(object obj, string def = "")
+        {
+            if (obj == null) return def;
+
+            try
+            {
+                return obj.ToString().Trim();
+            }
+            catch
+            {
+                return def;
+            }
+        }
+
+        public static bool toBoolean(object obj, bool def = false)
+        {
+            if (obj == null) return def;
+
+            try
+            {
+                return (bool)obj;
+            }
+            catch
+            {
+                return def;
+            }
+        }
+
+        public static DateTime toDateTime(object obj)
+        {
+            try
+            {
+                return Convert.ToDateTime(obj);
+            }
+            catch
+            {
+                return DateTime.MinValue;
+            }
+        }
+
+        public static Decimal toDecimal(object obj, Decimal def = 0M)
+        {
+            if (obj == null) return def;
+            try
+            {
+                return Convert.ToDecimal(obj);
+            }
+            catch
+            {
+                return def;
+            }
+        }
+
+        public static int toInt(object A, int def = 0)
+        {
+            if (A == null) return def;
+            try
+            {
+                return Convert.ToInt32(Math.Round(Convert.ToDouble(U3Util.toStr(A, "")), 0));
+            }
+            catch
+            {
+                return def;
+            }
+        }
+
+        public static double toDouble(object A, double def = 0.0)
+        {
+            if (A == null) return def;
+            try
+            {
+                return double.Parse(U3Util.toStr(A, ""));
+            }
+            catch
+            {
+                return def;
+            }
+        }
+
+        public static float toFloat(object A, float def = 0.0f)
+        {
+            if (A == null) return def;
+            try
+            {
+                return float.Parse(U3Util.toStr(A, ""));
+            }
+            catch
+            {
+                return def;
+            }
+        }
+    }
+}
 
SignusKHSVR/hyundai.ico (Binary) (added)
+++ SignusKHSVR/hyundai.ico
Binary file is not shown
Add a comment
List