Browse Source

first commit 20250123

HANTE 6 months ago
commit
459bb2df9b
61 changed files with 22376 additions and 0 deletions
  1. 85 0
      .gitignore
  2. BIN
      20171106_124023.png
  3. BIN
      20171106_184751.png
  4. 42 0
      DATABASE/Color.txt
  5. BIN
      DATABASE/Default_scenario.png
  6. 380 0
      DATABASE/VMS.SQL
  7. 216 0
      DATABASE/VMS_PACKET.TXT
  8. 62 0
      DATABASE/VMS_PACKET_LIB_Download.TXT
  9. BIN
      DATABASE/vms_message_edit.png
  10. 184 0
      SRC/AppGlobalF.cpp
  11. 186 0
      SRC/AppGlobalF.h
  12. 376 0
      SRC/CDS/LibSTLF.hpp
  13. 38 0
      SRC/CDS/TCDSFontF.cpp
  14. 40 0
      SRC/CDS/TCDSFontF.h
  15. 75 0
      SRC/CDS/TCDSFormF.cpp
  16. 98 0
      SRC/CDS/TCDSFormF.h
  17. 241 0
      SRC/CDS/TVmsCtlrF.cpp
  18. 365 0
      SRC/CDS/TVmsCtlrF.h
  19. 275 0
      SRC/CDS/TVmsFormF.cpp
  20. 143 0
      SRC/CDS/TVmsFormF.h
  21. 46 0
      SRC/CDS/TVmsIfscF.cpp
  22. 64 0
      SRC/CDS/TVmsIfscF.h
  23. 243 0
      SRC/CDS/TVmsImageF.cpp
  24. 94 0
      SRC/CDS/TVmsImageF.h
  25. 286 0
      SRC/COMMON/CommThread.cpp
  26. 27 0
      SRC/COMMON/CommThread.h
  27. 1686 0
      SRC/COMMON/VMSCThread.cpp
  28. 220 0
      SRC/COMMON/VMSCThread.h
  29. 407 0
      SRC/COMMON/VMSCThreadRecvF.cpp
  30. 6 0
      SRC/COMMON/VMSCThreadRecvF.h
  31. 349 0
      SRC/COMMON/VMSCThreadSendF.cpp
  32. 6 0
      SRC/COMMON/VMSCThreadSendF.h
  33. 177 0
      SRC/COMMON/VmsDataTypeF.cpp
  34. 256 0
      SRC/COMMON/VmsDataTypeF.h
  35. 333 0
      SRC/COMMON/VmsPasigProtocolF.h
  36. 4607 0
      SRC/DM/DMCOMMF.cpp
  37. 12 0
      SRC/DM/DMCOMMF.dfm
  38. 145 0
      SRC/DM/DMCOMMF.h
  39. 106 0
      SRC/FRM/FrmOptionF.cpp
  40. 891 0
      SRC/FRM/FrmOptionF.dfm
  41. 75 0
      SRC/FRM/FrmOptionF.h
  42. 87 0
      SRC/FRM/FrmSysLogF.cpp
  43. 275 0
      SRC/FRM/FrmSysLogF.dfm
  44. 50 0
      SRC/FRM/FrmSysLogF.h
  45. 598 0
      SRC/FRM/FrmVmsInfoF.cpp
  46. 1910 0
      SRC/FRM/FrmVmsInfoF.dfm
  47. 124 0
      SRC/FRM/FrmVmsInfoF.h
  48. 243 0
      SRC/FRM/FrmVmsLogF.cpp
  49. 573 0
      SRC/FRM/FrmVmsLogF.dfm
  50. 70 0
      SRC/FRM/FrmVmsLogF.h
  51. 202 0
      SRC/FrmMainCommF.cpp
  52. 6 0
      SRC/FrmMainCommF.h
  53. 2209 0
      SRC/FrmMainF.cpp
  54. 2460 0
      SRC/FrmMainF.dfm
  55. 166 0
      SRC/FrmMainF.h
  56. BIN
      SRC/RESOURCE/NETHOOD.ICO
  57. 246 0
      SRC/SysGlobalF.cpp
  58. 169 0
      SRC/SysGlobalF.h
  59. 23 0
      SRC/VMSCommServer.cbproj
  60. 123 0
      SRC/VMSCommServer.cpp
  61. BIN
      SRC/VMSCommServer.res

+ 85 - 0
.gitignore

@@ -0,0 +1,85 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### DUMMY ###
+*.lib
+*.exe
+*.dll
+*.zip
+*.bak
+*.~*
+*.log
+*.obj
+*.cgl
+*.ilc
+*.ild
+*.ilf
+*.ils
+*.tds
+*.pch
+*.map
+*.#*
+*.tds
+twfiles.@@@
+*.twfd
+*.twopts
+*.local
+*.skincfg
+TMP*.$$$
+*.zip
+
+### LOG ###
+/logs/
+/images/
+/fonts/
+/REAL-RUN/
+/ftp/
+/@@VMS/
+/RUN/
+/Vms_bin - 1/
+/Vms_bin - 2/
+/Vms_bin - 3/
+/Vms_bin - 4/
+/Vms_bin - 5/
+/Vms_bin - 6/
+/Vms_bin - 7/
+/Vms_bin - 8/
+
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+*.jar
+*.exe
+
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+*.exe
+*.jar
+*.run

BIN
20171106_124023.png


BIN
20171106_184751.png


+ 42 - 0
DATABASE/Color.txt

@@ -0,0 +1,42 @@
+BGColor
+    Black
+    Red
+    Lime
+    Yellow
+    White
+    Purple
+    Teal
+    Gray
+    Fuchsia
+    Blue
+    Orange
+    Navy
+    Maroon
+    Green
+    Olive
+    Aqua
+
+FontColor
+    Black
+    Red
+    Lime
+    Yellow
+    White
+    Purple
+    Teal
+    Gray
+    Fuchsia
+    Blue
+    Orange
+    Navy
+    Maroon
+    Green
+    Olive
+    Aqua
+
+
+Font
+    GulimChe
+    Gungsuhche
+    DotumChe
+    BatangChe

BIN
DATABASE/Default_scenario.png


+ 380 - 0
DATABASE/VMS.SQL

@@ -0,0 +1,380 @@
+            sQry = "SELECT TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS') AS S_DATE  \r\n"
+                   "  FROM DUAL                                            \r\n";
+
+            sQry = "SELECT SYST_ID, SYST_TYPE,   \r\n"
+                   "       SYST_IP_1, PRGM_PORT  \r\n"
+                   "  FROM TB_UNIT_SYST          \r\n"
+                   " WHERE DEL_YN = 'N'          \r\n"
+                   " ORDER BY SYST_ID            \r\n";
+
+    sQry = "SELECT PORT             \r\n"
+           "  FROM PROCESS          \r\n"
+           " WHERE PROCESSID = :p01 \r\n";
+
+    sQry = "SELECT A.*,                                        \r\n"
+           "       (SELECT NVL(ATRB1, '320')                   \r\n"
+           "          FROM TB_CMMN_CD                          \r\n"
+           "         WHERE CMMN_CLSF_CD = 'VMP'                \r\n"
+           "           AND CMMN_CD = A.VMS_TYPE_CD) AS FORMW,  \r\n"
+           "       (SELECT NVL(ATRB2,  '64')                   \r\n"
+           "          FROM TB_CMMN_CD                          \r\n"
+           "         WHERE CMMN_CLSF_CD = 'VMP'                \r\n"
+           "           AND CMMN_CD = A.VMS_TYPE_CD) AS FORMH   \r\n"
+           "  FROM TB_VMS_CTLR A                               \r\n"
+           " WHERE A.DEL_YN = 'N'                              \r\n";
+
+    sQry = "SELECT A.*                                \r\n"
+           "  FROM TB_VMS_STTS_PRST A,                \r\n"
+           "       TB_VMS_CTLR      B                 \r\n"
+           " WHERE B.DEL_YN = 'N'                     \r\n"
+           "   AND A.VMS_CTLR_NMBR = B.VMS_CTLR_NMBR  \r\n";
+
+    sQry = "SELECT A.VMS_CTLR_NMBR, B.VMS_IFSC_ID,    \r\n"
+           "       B.DSPL_PRRT, C.AXIS_YN             \r\n"
+           "  FROM TB_VMS_CTLR      A,                \r\n"
+           "       TB_VMS_IFSC_RLTN B,                \r\n"
+           "       TB_VMS_IFSC      C                 \r\n"
+           " WHERE A.VMS_CTLR_NMBR = B.VMS_CTLR_NMBR  \r\n"
+           "   AND B.VMS_IFSC_ID   = C.VMS_IFSC_ID    \r\n"
+           "   AND C.EDTN_CD <> 'EDI2'                \r\n"
+           "   AND A.DEL_YN = 'N'                     \r\n"
+           " ORDER BY A.VMS_CTLR_NMBR, B.DSPL_PRRT    \r\n";
+
+    sQry = "SELECT A.VMS_CTLR_NMBR, \r\n"
+           "       A.PANL_ON_TIME,  \r\n"
+           "       A.PANL_OFF_TIME  \r\n"
+           "  FROM TB_VMS_CTLR A    \r\n"
+           " WHERE A.DEL_YN = 'N'   \r\n";
+
+//-->용인에서만 사용함
+    sQry = "SELECT A.VMS_CTLR_NMBR, A.SCH_TIME, A.LUMINANCE  \r\n"
+           "  FROM TB_VMS_LUM_SET_SCH A,                     \r\n"
+           "       TB_VMS_CTLR        B                      \r\n"
+           " WHERE A.VMS_CTLR_NMBR = B.VMS_CTLR_NMBR         \r\n"
+           "   AND B.DEL_YN = 'N'                            \r\n"
+           "   AND A.USE_YN = 'Y'                            \r\n"
+           "   AND A.SCH_TIME = TO_CHAR(SYSDATE, 'HH24MI')   \r\n";
+
+
+//사용안함
+    sQry = "SELECT A.VMS_CTLR_NMBR, A.RGST_DT,                               \r\n"
+           "       A.FILETYPE, A.FILEID                                      \r\n"
+           "  FROM TB_VMS_DOWNLOAD A                                         \r\n"
+           " WHERE A.SENDSTARTDATE <= TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS')   \r\n"
+           "   AND A.SENDRESULT = 0                                          \r\n"
+           " ORDER BY A.VMS_CTLR_NMBR, A.RGST_DT DESC, A.FILETYPE, A.FILEID  \r\n";
+
+    sQry = "SELECT A.*               \r\n"
+           "  FROM TB_VMS_SYMB_LIB A \r\n";
+
+    sQry = "SELECT B.*                              \r\n"
+           "  FROM TB_VMS_SYMB_LIB  A,              \r\n"
+           "       TB_VMS_SYMB_IFSC B               \r\n"
+           " WHERE A.SYMBLIB_NMBR = B.SYMBLIB_NMBR  \r\n"
+           " ORDER BY B.SYMBLIB_NMBR, B.CELL_ID     \r\n";
+
+    sQry = "SELECT A.*           \r\n"
+           "  FROM TB_VMS_FORM A \r\n";
+
+    sQry = "SELECT B.*, NVL(C.IMAG_DATA, B.VMS_DSPL_FIGR) AS IMAG_DATA  \r\n"
+           "  FROM TB_VMS_FORM        A,                                \r\n"
+           "       TB_VMS_FORM_OBJECT B,                                \r\n"
+           "       TB_VMS_SYMB_LIB    C                                 \r\n"
+           " WHERE A.VMS_FORM_ID  = B.VMS_FORM_ID                       \r\n"
+           "   AND B.SYMBLIB_NMBR = C.SYMBLIB_NMBR(+)                   \r\n"
+           " ORDER BY B.VMS_FORM_ID, B.FORM_OBJECT_ID                   \r\n";
+
+    sQry = "SELECT A.VMS_IFSC_ID, A.VMS_IFSC_NM, A.DSPL_STRT_NODE_NM, A.DSPL_END_NODE_NM, \r\n"
+           "       A.ROAD_NM, A.SPOT_NM,                                                  \r\n"
+           "       A.DETR_ID, A.AXIS_YN,                                                  \r\n"
+           "       NVL(B.RGST_DT,       '') AS RGST_DT,                                   \r\n"
+           "       NVL(B.CMTR_GRAD_CD, '0') AS CMTR_GRAD_CD,                              \r\n"
+           "       NVL(B.SPED,           0) AS SPED,                                      \r\n"
+           "       NVL(B.TRVL_HH,        0) AS TRVL_HH                                    \r\n"
+           "  FROM TB_VMS_IFSC A,                                                         \r\n"
+           "       (SELECT *                                                              \r\n"
+           "          FROM TB_VMS_CMTRINFR                                                \r\n"
+           "         WHERE RGST_DT >= TO_CHAR(SYSDATE-10/1440, 'YYYYMMDDHH24MISS') ) B    \r\n"
+           " WHERE A.VMS_IFSC_ID = B.VMS_IFSC_ID(+)                                       \r\n";
+
+    sQry = "SELECT B.*, DECODE(B.TRFC_SITU_TYPE_CD, '0', 7,               \r\n"
+           "                                        '1', 3,               \r\n"
+           "                                        '2', 4,               \r\n"
+           "                                        '3', 5,               \r\n"
+           "                                        '4', 6,               \r\n"
+           "                                        '5', 1,               \r\n"
+           "                                        '6', 0,               \r\n"
+           "                                        '7', 8, 9) AS SCHPRIT \r\n"
+           "  FROM TB_VMS_CTLR A,                                         \r\n"
+           "       TB_VMS_TRFC_INFR_DSPL_SCH B,                           \r\n"
+           "       TB_VMS_FORM C                                          \r\n"
+           " WHERE A.DEL_YN = 'N'                                         \r\n"
+           "   AND A.VMS_CTLR_NMBR = B.VMS_CTLR_NMBR                      \r\n"
+           "   AND B.VMS_FORM_ID   = C.VMS_FORM_ID                        \r\n"
+           "   AND B.USE_YN        = 'Y'                                  \r\n"
+           "   AND TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS') BETWEEN           \r\n"
+           "       B.DSPL_STRT_HH AND B.DSPL_END_HH                       \r\n";
+
+    sQry = "SELECT * \r\n"
+           "  FROM ( \r\n" + sQry +
+           "       ) \r\n"
+           " ORDER BY VMS_CTLR_NMBR ASC, SCHPRIT ASC, PHASE ASC \r\n";
+
+    sQry = "SELECT V.VMS_CTLR_NMBR, V.LINK_ID, V.IFSC_ID, V.VMS_IFSC_ID,   \r\n"
+           "       V.VMS_IFSC_NM, V.DSPL_STRT_NODE_NM, V.DSPL_END_NODE_NM, \r\n"
+           "       V.DETR_ID, V.DSPL_PRRT, I.INCD_OCRR_ID, I.STRT_LCTN_NM, \r\n"
+           "       V.ROAD_NM, V.SPOT_NM,                                   \r\n"
+           "       I.END_LCTN_NM, I.OCRR_LCTN_NM,                          \r\n"
+           "       (SELECT CMMN_CD_KOR_NM                                  \r\n"
+           "         FROM TB_CMMN_CD                                       \r\n"
+           "        WHERE CMMN_CD = I.VMS_INCD_TYPE_CD                     \r\n"
+           "          AND CMMN_CLSF_CD = 'VIT') AS VMS_INCD_TYPE_NM,       \r\n"
+           "       I.VMS_INCD_TYPE_CD,                                     \r\n"
+           "       CASE WHEN I.VMS_INCD_TYPE_CD = 'VIT1' THEN              \r\n"
+           "       (SELECT CMMN_CD_KOR_NM                                  \r\n"
+           "          FROM TB_CMMN_CD                                      \r\n"
+           "         WHERE CMMN_CD      = I.VMS_INCD_DETL_TYPE_CD          \r\n"
+           "           AND CMMN_CLSF_CD = 'IDT')                           \r\n"
+           "       ELSE                                                    \r\n"
+           "       (SELECT CMMN_CD_KOR_NM                                  \r\n"
+           "          FROM TB_CMMN_CD                                      \r\n"
+           "         WHERE CMMN_CD      = I.VMS_INCD_DETL_TYPE_CD          \r\n"
+           "           AND CMMN_CLSF_CD = 'EDT')                           \r\n"
+           "       END AS VMS_INCD_DETL_NM,                                \r\n"
+           "       I.VMS_INCD_DETL_TYPE_CD,                                \r\n"
+           "       (SELECT CMMN_CD_KOR_NM                                  \r\n"
+           "          FROM TB_CMMN_CD                                      \r\n"
+           "         WHERE CMMN_CD      = I.CMTR_GRAD_CD                   \r\n"
+           "           AND CMMN_CLSF_CD = 'LTC') AS CMTR_GRAD_NM,          \r\n"
+           "       I.CMTR_GRAD_CD,                                         \r\n"
+           "       I.INCD_CLSR_LANE,                                       \r\n"
+           "       I.INCD_STRT_DT,                                         \r\n"
+           "       I.INCD_END_PRAR_DT                                      \r\n"
+           "  FROM (SELECT D.VMS_CTLR_NMBR, A.LINK_ID,                     \r\n"
+           "               A.IFSC_ID, B.VMS_IFSC_ID,                       \r\n"
+           "               C.VMS_IFSC_NM,                                  \r\n"
+           "               C.DSPL_STRT_NODE_NM,                            \r\n"
+           "               C.DSPL_END_NODE_NM,                             \r\n"
+           "               NVL(C.DETR_ID, 0) AS DETR_ID,                   \r\n"
+           "               C.ROAD_NM, C.SPOT_NM,                           \r\n"
+           "               D.DSPL_PRRT                                     \r\n"
+           "          FROM TB_IFSC_LINK_RLTN A,                            \r\n"
+           "               TB_VMS_LINK_IFSC  B,                            \r\n"
+           "               TB_VMS_IFSC       C,                            \r\n"
+           "               TB_VMS_IFSC_RLTN  D                             \r\n"
+           "         WHERE A.IFSC_ID     = B.IFSC_ID                       \r\n"
+           "           AND B.VMS_IFSC_ID = C.VMS_IFSC_ID                   \r\n"
+           "           AND C.VMS_IFSC_ID = D.VMS_IFSC_ID ) V,              \r\n"
+           "       (SELECT *                                               \r\n"
+           "          FROM TB_INCD_OCRR_VMS                                \r\n"
+           "         WHERE INCD_PRGR_STEP_CD = 'ISS2'                      \r\n"
+           "           AND VMS_DSPL_YN       = 'Y'                         \r\n"
+           "           AND VMS_INCD_TYPE_CD IN ('VIT1', 'VIT2') ) I        \r\n"
+           " WHERE V.LINK_ID = I.LINK_ID                                   \r\n"
+           " ORDER BY V.VMS_CTLR_NMBR                                      \r\n";
+
+    sQry = "SELECT A.VMS_CTLR_NMBR, A.OPER_MODE,                    \r\n"
+           "       NVL(A.VMS_MAX_PHSE_NUM, 16) AS VMS_MAX_PHSE_NUM  \r\n"
+           "  FROM TB_VMS_CTLR A                                    \r\n"
+           " WHERE A.DEL_YN = 'N'                                   \r\n";
+
+    sQry = "MERGE INTO TB_VMS_STTS_PRST L                                     \r\n"
+           "USING (SELECT :p01 AS VMS_CTLR_NMBR,                              \r\n"
+           "              :p02 AS RGST_DT,                                    \r\n"
+           "              :p03 AS CONN_STTS_CD,                               \r\n"
+           "              :p04 AS CBOXDOOR_OPEN_STTS_CD,                      \r\n"
+           "              :p05 AS PWER_STTS_CD,                               \r\n"
+           "              :p06 AS CBOX_TMPR,                                  \r\n"
+           "              :p07 AS CBOX_HMDT,                                  \r\n"
+           "              :p08 AS FAN_STTS_CD,                                \r\n"
+           "              :p09 AS HETR_STTS_CD,                               \r\n"
+           "              :p10 AS CBOXFAN_STTS_CD                             \r\n"
+           "         FROM DUAL) M                                             \r\n"
+           "ON (L.VMS_CTLR_NMBR = M.VMS_CTLR_NMBR)                            \r\n"
+           "WHEN MATCHED THEN                                                 \r\n"
+           "    UPDATE SET L.RGST_DT               = M.RGST_DT,               \r\n"
+           "               L.CONN_STTS_CD          = M.CONN_STTS_CD,          \r\n"
+           "               L.CBOXDOOR_OPEN_STTS_CD = M.CBOXDOOR_OPEN_STTS_CD, \r\n"
+           "               L.PWER_STTS_CD          = M.PWER_STTS_CD,          \r\n"
+           "               L.CBOX_TMPR             = M.CBOX_TMPR,             \r\n"
+           "               L.CBOX_HMDT             = M.CBOX_HMDT,             \r\n"
+           "               L.FAN_STTS_CD           = M.FAN_STTS_CD,           \r\n"
+           "               L.HETR_STTS_CD          = M.HETR_STTS_CD,          \r\n"
+           "               L.CBOXFAN_STTS_CD       = M.CBOXFAN_STTS_CD        \r\n"
+           "WHEN NOT MATCHED THEN                                             \r\n"
+           "    INSERT (L.VMS_CTLR_NMBR,                                      \r\n"
+           "            L.RGST_DT,                                            \r\n"
+           "            L.CONN_STTS_CD,                                       \r\n"
+           "            L.CBOXDOOR_OPEN_STTS_CD,                              \r\n"
+           "            L.PWER_STTS_CD,                                       \r\n"
+           "            L.CBOX_TMPR,                                          \r\n"
+           "            L.CBOX_HMDT,                                          \r\n"
+           "            L.FAN_STTS_CD,                                        \r\n"
+           "            L.HETR_STTS_CD,                                       \r\n"
+           "            L.CBOXFAN_STTS_CD)                                    \r\n"
+           "    VALUES (M.VMS_CTLR_NMBR,                                      \r\n"
+           "            M.RGST_DT,                                            \r\n"
+           "            M.CONN_STTS_CD,                                       \r\n"
+           "            M.CBOXDOOR_OPEN_STTS_CD,                              \r\n"
+           "            M.PWER_STTS_CD,                                       \r\n"
+           "            M.CBOX_TMPR,                                          \r\n"
+           "            M.CBOX_HMDT,                                          \r\n"
+           "            M.FAN_STTS_CD,                                        \r\n"
+           "            M.HETR_STTS_CD,                                       \r\n"
+           "            M.CBOXFAN_STTS_CD)                                    \r\n";
+
+    iQry = "INSERT INTO TB_VMS_STTS_HS         \r\n"
+           "           (VMS_CTLR_NMBR,         \r\n"
+           "            RGST_DT,               \r\n"
+           "            CONN_STTS_CD,          \r\n"
+           "            CBOXDOOR_OPEN_STTS_CD, \r\n"
+           "            PWER_STTS_CD,          \r\n"
+           "            CBOX_TMPR,             \r\n"
+           "            CBOX_HMDT,             \r\n"
+           "            FAN_STTS_CD,           \r\n"
+           "            HETR_STTS_CD,          \r\n"
+           "            CBOXFAN_STTS_CD)       \r\n"
+           "    VALUES (:p01,                  \r\n"
+           "            :p02,                  \r\n"
+           "            :p03,                  \r\n"
+           "            :p04,                  \r\n"
+           "            :p05,                  \r\n"
+           "            :p06,                  \r\n"
+           "            :p07,                  \r\n"
+           "            :p08,                  \r\n"
+           "            :p09,                  \r\n"
+           "            :p10)                  \r\n";
+
+
+
+    sQry = "MERGE INTO TB_VMS_STTS_PRST L                                     \r\n"
+           "USING (SELECT :p01 AS VMS_CTLR_NMBR,                              \r\n"
+           "              :p02 AS RGST_DT,                                    \r\n"
+           "              :p03 AS CONN_STTS_CD,                               \r\n"
+           "              :p04 AS CBOXDOOR_OPEN_STTS_CD,                      \r\n"
+           "              :p05 AS PWER_STTS_CD,                               \r\n"
+           "              :p06 AS CBOX_TMPR,                                  \r\n"
+           "              :p07 AS CBOX_HMDT,                                  \r\n"
+           "              :p08 AS FAN_STTS_CD,                                \r\n"
+           "              :p09 AS HETR_STTS_CD,                               \r\n"
+           "              :p10 AS CBOXFAN_STTS_CD                             \r\n"
+           "         FROM DUAL) M                                             \r\n"
+           "ON (L.VMS_CTLR_NMBR = M.VMS_CTLR_NMBR)                            \r\n"
+           "WHEN MATCHED THEN                                                 \r\n"
+           "    UPDATE SET L.RGST_DT               = M.RGST_DT,               \r\n"
+           "               L.CONN_STTS_CD          = M.CONN_STTS_CD,          \r\n"
+           "               L.CBOXDOOR_OPEN_STTS_CD = M.CBOXDOOR_OPEN_STTS_CD, \r\n"
+           "               L.PWER_STTS_CD          = M.PWER_STTS_CD,          \r\n"
+           "               L.CBOX_TMPR             = M.CBOX_TMPR,             \r\n"
+           "               L.CBOX_HMDT             = M.CBOX_HMDT,             \r\n"
+           "               L.FAN_STTS_CD           = M.FAN_STTS_CD,           \r\n"
+           "               L.HETR_STTS_CD          = M.HETR_STTS_CD,          \r\n"
+           "               L.CBOXFAN_STTS_CD       = M.CBOXFAN_STTS_CD        \r\n"
+           "WHEN NOT MATCHED THEN                                             \r\n"
+           "    INSERT (L.VMS_CTLR_NMBR,                                      \r\n"
+           "            L.RGST_DT,                                            \r\n"
+           "            L.CONN_STTS_CD,                                       \r\n"
+           "            L.CBOXDOOR_OPEN_STTS_CD,                              \r\n"
+           "            L.PWER_STTS_CD,                                       \r\n"
+           "            L.CBOX_TMPR,                                          \r\n"
+           "            L.CBOX_HMDT,                                          \r\n"
+           "            L.FAN_STTS_CD,                                        \r\n"
+           "            L.HETR_STTS_CD,                                       \r\n"
+           "            L.CBOXFAN_STTS_CD)                                    \r\n"
+           "    VALUES (M.VMS_CTLR_NMBR,                                      \r\n"
+           "            M.RGST_DT,                                            \r\n"
+           "            M.CONN_STTS_CD,                                       \r\n"
+           "            M.CBOXDOOR_OPEN_STTS_CD,                              \r\n"
+           "            M.PWER_STTS_CD,                                       \r\n"
+           "            M.CBOX_TMPR,                                          \r\n"
+           "            M.CBOX_HMDT,                                          \r\n"
+           "            M.FAN_STTS_CD,                                        \r\n"
+           "            M.HETR_STTS_CD,                                       \r\n"
+           "            M.CBOXFAN_STTS_CD)                                    \r\n";
+
+
+    sQry = "MERGE INTO TB_VMS_DSPL_PRST L                                  \r\n"
+           "USING (SELECT :p01 AS VMS_CTLR_NMBR,                           \r\n"
+           "              :p02 AS PHASE,                                   \r\n"
+           "              :p03 AS DSPL_DT,                                 \r\n"
+           "              :p04 AS VMS_DSPL_MSG_DATA,                       \r\n"
+           "              :p05 AS VMS_DSPL_MSG_TXT,                        \r\n"
+           "              :p06 AS TRFC_SITU_TYPE_CD,                       \r\n"
+           "              :p07 AS VMS_MSG_DSPL_DRCT_CD,                    \r\n"
+           "              :p08 AS VMS_MSG_DSPL_MTHD_CD,                    \r\n"
+           "              :p09 AS DSPL_HH,                                 \r\n"
+           "              :p10 AS VMS_FORM_ID,                             \r\n"
+           "              :p11 AS DNLD_YN                                  \r\n"
+           "         FROM DUAL) M                                          \r\n"
+           " ON (L.VMS_CTLR_NMBR = M.VMS_CTLR_NMBR AND L.PHASE = M.PHASE)  \r\n"
+           "WHEN MATCHED THEN                                              \r\n"
+           "UPDATE SET L.DSPL_DT              = M.DSPL_DT,                 \r\n"
+           "           L.VMS_DSPL_MSG_DATA    = M.VMS_DSPL_MSG_DATA,       \r\n"
+           "           L.VMS_DSPL_MSG_TXT     = M.VMS_DSPL_MSG_TXT,        \r\n"
+           "           L.TRFC_SITU_TYPE_CD    = M.TRFC_SITU_TYPE_CD,       \r\n"
+           "           L.VMS_MSG_DSPL_DRCT_CD = M.VMS_MSG_DSPL_DRCT_CD,    \r\n"
+           "           L.VMS_MSG_DSPL_MTHD_CD = M.VMS_MSG_DSPL_MTHD_CD,    \r\n"
+           "           L.DSPL_HH              = M.DSPL_HH,                 \r\n"
+           "           L.VMS_FORM_ID          = M.VMS_FORM_ID,             \r\n"
+           "           L.DNLD_YN              = M.DNLD_YN                  \r\n"
+           "WHEN NOT MATCHED THEN                                          \r\n"
+           "INSERT (VMS_CTLR_NMBR, PHASE, DSPL_DT,                         \r\n"
+           "        VMS_DSPL_MSG_DATA, VMS_DSPL_MSG_TXT,                   \r\n"
+           "        TRFC_SITU_TYPE_CD, VMS_MSG_DSPL_DRCT_CD,               \r\n"
+           "        VMS_MSG_DSPL_MTHD_CD, DSPL_HH,                         \r\n"
+           "        VMS_FORM_ID, DNLD_YN)                                  \r\n"
+           "VALUES (M.VMS_CTLR_NMBR, M.PHASE, M.DSPL_DT,                   \r\n"
+           "        M.VMS_DSPL_MSG_DATA, M.VMS_DSPL_MSG_TXT,               \r\n"
+           "        M.TRFC_SITU_TYPE_CD, M.VMS_MSG_DSPL_DRCT_CD,           \r\n"
+           "        M.VMS_MSG_DSPL_MTHD_CD, M.DSPL_HH,                     \r\n"
+           "        M.VMS_FORM_ID, M.DNLD_YN)                              \r\n";
+
+    uQry = "UPDATE TB_VMS_DSPL_PRST         \r\n"
+           "   SET VMS_DSPL_MSG_IMAG = :p03 \r\n"
+           " WHERE VMS_CTLR_NMBR = :p01     \r\n"
+           "   AND PHASE         = :p02     \r\n";
+
+
+
+                sQry = "INSERT INTO TB_UNIT_SYST_STTS_HS(SYST_ID, CRTN_DT, SYST_STTS_CD) \r\n"
+                       "   VALUES(:p01, TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS'), :p02)      \r\n";
+
+
+    sQry = "INSERT INTO TB_VMS_DSPL_HS                           \r\n"
+           "           (VMS_CTLR_NMBR, DSPL_PHASE_NUM, DSPL_DT,  \r\n"
+           "            VMS_DSPL_MSG_DATA, VMS_DSPL_MSG_TXT,     \r\n"
+           "            TRFC_SITU_TYPE_CD, VMS_MSG_DSPL_DRCT_CD, \r\n"
+           "            VMS_MSG_DSPL_MTHD_CD, DSPL_HH,           \r\n"
+           "            VMS_FORM_ID, DNLD_YN)                    \r\n"
+           "SELECT VMS_CTLR_NMBR, PHASE, DSPL_DT,                \r\n"
+           "       VMS_DSPL_MSG_DATA, VMS_DSPL_MSG_TXT,          \r\n"
+           "       TRFC_SITU_TYPE_CD, VMS_MSG_DSPL_DRCT_CD,      \r\n"
+           "       VMS_MSG_DSPL_MTHD_CD, DSPL_HH,                \r\n"
+           "       VMS_FORM_ID, DNLD_YN                          \r\n"
+           "  FROM TB_VMS_DSPL_PRST                              \r\n"
+           " WHERE VMS_CTLR_NMBR = :p01                          \r\n"
+           "   AND PHASE        <= :p02                          \r\n";
+
+    sQry = "UPDATE TB_VMS_CTLR                   \r\n"
+           "   SET VMS_PHSE_CHNG_CYCL    = :p01, \r\n"
+           "       VMS_CMNC_ERR_BASS_VAL = :p02, \r\n"
+           "       FAN_MTNS_TMPR         = :p03, \r\n"
+           "       HETR_MTNS_TMPR        = :p04, \r\n"
+           "       VMS_MODL_ERR_RATE     = :p05  \r\n"
+           " WHERE VMS_CTLR_NMBR = :p06          \r\n";
+
+    sQry = "UPDATE TB_VMS_DOWNLOAD        \r\n"
+           "   SET SENDENDDATE   = :p05,  \r\n"
+           "       SENDSTEP	     = :p06,  \r\n"
+           "       SENDRESULT    = :p07   \r\n"
+           " WHERE RGST_DT       = :p01   \r\n"
+           "   AND VMS_CTLR_NMBR = :p02   \r\n"
+           "   AND FILETYPE      = :p03   \r\n"
+           "   AND FILEID        = :p04   \r\n";
+
+    sQry = "UPDATE TB_VMS_DSPL_PRST      \r\n"
+           "   SET DSPL_DT       = :p03, \r\n"
+           "       DNLD_YN       = :p04  \r\n"
+           " WHERE VMS_CTLR_NMBR = :p01  \r\n"
+           "   AND PHASE        <= :p02  \r\n";
+

+ 216 - 0
DATABASE/VMS_PACKET.TXT

@@ -0,0 +1,216 @@
+    unsigned crc = MakeCrc16(szData, nLen);
+    szData[nLen++] = HIBYTE(crc);
+    szData[nLen++] = LOBYTE(crc);
+
+
+02 00 51 
+00 00 07 B4 
+31 30 30 36 
+
+07 정지화면 (Stationary)
+02 Left(오른쪽에서 왼쪽으로)
+08 표출 시간/기간
+05 PHASE 갯수(00-1EA, ... 05=6EA)
+
+54 'T' ==> TEXT, 47(Graphic), 42(BAR)
+00 00 좌측심벌
+00 00 우측심벌
+
+1B 61 중앙정렬(Centeral Function, phase에 1개)
+1B 40 배경색(흑색)
+1B 3A ??? 문자색상???
+1B 02 24 x 24(영문/숫자/특수문자는 12 x 24)
+1B 13 바탕
+
+4F 44 44 20 45 56 45 4E 20 53 43 48 45 4D 45 20 49 6D 70 6C 65 6D 65 6E 74 65 64 
+1B 50 
+1B 3A 
+1B 02 
+1B 13 
+41 74 20 53 61 6E 20 47 75 69 6C 6C 65 72 6D 6F 20 73 74 20 45 61 73 74 20 42 6F 75 6E 64 00 00 00 00 00 
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 54 00 00 00 00 
+
+1B 61 
+1B 40 
+1B 3A 
+1B 02 
+1B 13 
+
+4F 44 44 20 45 56 45 4E 20 53 43 48 45 4D 45 20 49 6D 70 6C 65 6D 65 6E 74 65 64 
+1B 50 1B 3A 1B 02 1B 13 
+41 74 20 45 61 73 74 20 42 61 6E 6B 20 72 64 2F 46 2E 6C 65 67 61 73 70 69 20 73 74 20 57 20 42 6F 75 6E 64 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
+00 00 00 00 00 00 00 00 00 
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 54 00 00 00 00 1B 61 1B 40 1B 3A 1B 02 1B 13 4F 44 44 20 45 56 45 4E 20 53 43 48 45 4D 45 20 49 6D 
+70 6C 65 6D 65 6E 74 65 64 1B 50 1B 3A 1B 02 1B 13 41 74 20 53 61 6E 20 4C 6F 72 65 6E 7A 6F 2F 53 61 6E 64 6F 76 61 6C 20 50 69 6E 61 67 62 75 68 61 
+74 61 6E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 54 00 00 00 00 1B 61 
+1B 40 1B 3A 1B 02 1B 13 4F 44 44 20 45 56 45 4E 20 53 43 48 45 4D 45 20 49 6D 70 6C 65 6D 65 6E 74 65 64 20 1B 50 1B 3A 1B 02 1B 13 41 74 20 47 72 65 
+65 6E 77 6F 6F 64 73 2F 53 61 6E 64 6F 76 61 6C 20 41 76 65 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 54 00 00 00 00 1B 61 1B 40 1B 3A 1B 02 1B 13 49 6E 20 43 61 73 65 20 6F 66 20 45 6D 65 72 67 
+65 6E 63 79 20 63 61 6C 6C 1B 50 1B 3A 1B 02 1B 13 36 34 33 2D 30 30 30 30 20 50 61 73 69 67 20 43 6F 6D 6D 61 6E 64 20 43 65 6E 74 65 72 00 00 00 00 
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 54 00 00 00 00 
+1B 61 1B 40 1B 32 1B 02 1B 11 69 6B 61 2D 34 34 34 20 41 72 61 77 20 6E 67 20 50 61 73 69 67 1B 50 1B 3A 1B 01 1B 12 4A 75 6C 79 20 32 2C 20 32 30 31 
+37 1B 50 1B 32 1B 01 1B 10 4D 61 79 6F 72 20 42 6F 62 62 79 20 45 75 73 65 62 69 6F 20 26 20 43 6F 75 6E 63 69 6C 00 00 00 00 00 00 00 00 00 00 00 00 
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 A7 DD 03 
+
+
+
+16:58:29 [INF] -CLI VMS1000003, ClientInitInfo ok
+16:58:30 [INF] -CLI VMS1000003, Thread start
+16:58:30 [INF] -CLI VMS1000003, Server connect try: 127.0.0.1.5050
+16:58:30 [INF] -CLI VMS1000003, ClientInitInfo ok
+16:58:30 [INF] -CLI VMS1000003, Server Connect  ok: 127.0.0.1 5050
+
+16:58:30 [DATA] VMS1000003 Client, [SEND] 1974 Bytes 
+00000000h  02 00 51 00 00 07 B4 31 30 30 36 07 02 08 05 54  ;..Q....1006....T
+00000010h  00 00 00 00 1B 61 1B 40 1B 3A 1B 02 1B 13 4F 44  ;.....a.@.:....OD
+00000020h  44 20 45 56 45 4E 20 53 43 48 45 4D 45 20 49 6D  ;D EVEN SCHEME Im
+00000030h  70 6C 65 6D 65 6E 74 65 64 1B 50 1B 3A 1B 02 1B  ;plemented.P.:...
+00000040h  13 41 74 20 53 61 6E 20 47 75 69 6C 6C 65 72 6D  ;.At San Guillerm
+00000050h  6F 20 73 74 20 45 61 73 74 20 42 6F 75 6E 64 00  ;o st East Bound.
+00000060h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000070h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000080h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000090h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+000000A0h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+000000B0h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+000000C0h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+000000D0h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+000000E0h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+000000F0h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000100h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000110h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000120h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000130h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000140h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000150h  00 00 00 00 00 54 00 00 00 00 1B 61 1B 40 1B 3A  ;.....T.....a.@.:
+00000160h  1B 02 1B 13 4F 44 44 20 45 56 45 4E 20 53 43 48  ;....ODD EVEN SCH
+00000170h  45 4D 45 20 49 6D 70 6C 65 6D 65 6E 74 65 64 1B  ;EME Implemented.
+00000180h  50 1B 3A 1B 02 1B 13 41 74 20 45 61 73 74 20 42  ;P.:....At East B
+00000190h  61 6E 6B 20 72 64 2F 46 2E 6C 65 67 61 73 70 69  ;ank rd/F.legaspi
+000001A0h  20 73 74 20 57 20 42 6F 75 6E 64 00 00 00 00 00  ; st W Bound.....
+000001B0h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+000001C0h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+000001D0h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+000001E0h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+000001F0h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000200h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000210h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000220h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000230h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000240h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000250h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000260h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000270h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000280h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000290h  00 00 00 00 00 00 00 00 00 00 00 54 00 00 00 00  ;...........T....
+000002A0h  1B 61 1B 40 1B 3A 1B 02 1B 13 4F 44 44 20 45 56  ;.a.@.:....ODD EV
+000002B0h  45 4E 20 53 43 48 45 4D 45 20 49 6D 70 6C 65 6D  ;EN SCHEME Implem
+000002C0h  65 6E 74 65 64 1B 50 1B 3A 1B 02 1B 13 41 74 20  ;ented.P.:....At 
+000002D0h  53 61 6E 20 4C 6F 72 65 6E 7A 6F 2F 53 61 6E 64  ;San Lorenzo/Sand
+000002E0h  6F 76 61 6C 20 50 69 6E 61 67 62 75 68 61 74 61  ;oval Pinagbuhata
+000002F0h  6E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;n...............
+00000300h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000310h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000320h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000330h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000340h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000350h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000360h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000370h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000380h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000390h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+000003A0h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+000003B0h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+000003C0h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+000003D0h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+000003E0h  00 54 00 00 00 00 1B 61 1B 40 1B 3A 1B 02 1B 13  ;.T.....a.@.:....
+000003F0h  4F 44 44 20 45 56 45 4E 20 53 43 48 45 4D 45 20  ;ODD EVEN SCHEME 
+00000400h  49 6D 70 6C 65 6D 65 6E 74 65 64 20 1B 50 1B 3A  ;Implemented .P.:
+00000410h  1B 02 1B 13 41 74 20 47 72 65 65 6E 77 6F 6F 64  ;....At Greenwood
+00000420h  73 2F 53 61 6E 64 6F 76 61 6C 20 41 76 65 00 00  ;s/Sandoval Ave..
+00000430h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000440h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000450h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000460h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000470h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000480h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000490h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+000004A0h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+000004B0h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+000004C0h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+000004D0h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+000004E0h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+000004F0h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000500h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000510h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000520h  00 00 00 00 00 00 00 54 00 00 00 00 1B 61 1B 40  ;.......T.....a.@
+00000530h  1B 3A 1B 02 1B 13 49 6E 20 43 61 73 65 20 6F 66  ;.:....In Case of
+00000540h  20 45 6D 65 72 67 65 6E 63 79 20 63 61 6C 6C 1B  ; Emergency call.
+00000550h  50 1B 3A 1B 02 1B 13 36 34 33 2D 30 30 30 30 20  ;P.:....643-0000 
+00000560h  50 61 73 69 67 20 43 6F 6D 6D 61 6E 64 20 43 65  ;Pasig Command Ce
+00000570h  6E 74 65 72 00 00 00 00 00 00 00 00 00 00 00 00  ;nter............
+00000580h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000590h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+000005A0h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+000005B0h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+000005C0h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+000005D0h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+000005E0h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+000005F0h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000600h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000610h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000620h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000630h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000640h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000650h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000660h  00 00 00 00 00 00 00 00 00 00 00 00 00 54 00 00  ;.............T..
+00000670h  00 00 1B 61 1B 40 1B 32 1B 02 1B 11 69 6B 61 2D  ;...a.@.2....ika-
+00000680h  34 34 34 20 41 72 61 77 20 6E 67 20 50 61 73 69  ;444 Araw ng Pasi
+00000690h  67 1B 50 1B 3A 1B 01 1B 12 4A 75 6C 79 20 32 2C  ;g.P.:....July 2,
+000006A0h  20 32 30 31 37 1B 50 1B 32 1B 01 1B 10 4D 61 79  ; 2017.P.2....May
+000006B0h  6F 72 20 42 6F 62 62 79 20 45 75 73 65 62 69 6F  ;or Bobby Eusebio
+000006C0h  20 26 20 43 6F 75 6E 63 69 6C 00 00 00 00 00 00  ; & Council......
+000006D0h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+000006E0h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+000006F0h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000700h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000710h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000720h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000730h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000740h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000750h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000760h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000770h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000780h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+00000790h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+000007A0h  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ;................
+000007B0h  00 00 00 A7 DD 03                                ;......
+
+
+16:58:30 [DATA] VMS1000003 Client, [RECV] 15 Bytes 
+00000000h  02 00 51 00 00 00 0D 31 30 30 35 00 16 82 03     ;..Q....1005....
+

File diff suppressed because it is too large
+ 62 - 0
DATABASE/VMS_PACKET_LIB_Download.TXT


BIN
DATABASE/vms_message_edit.png


+ 184 - 0
SRC/AppGlobalF.cpp

@@ -0,0 +1,184 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+//---------------------------------------------------------------------------
+#include <vcl.h>
+#include <assert.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <memory.h>
+#include <Systobj.h>
+#include <winsock.h>
+#include <time.h>
+
+#include <Buttons.hpp>
+#include <Classes.hpp>
+#include <ComCtrls.hpp>
+#include <Controls.hpp>
+#include <Chart.hpp>
+#include <DB.hpp>
+#include <DBClient.hpp>
+#include <DBGrids.hpp>
+#include <DBXpress.hpp>
+#include <Dialogs.hpp>
+#include <ExtCtrls.hpp>
+#include <FMTBcd.hpp>
+#include <Forms.hpp>
+#include <Graphics.hpp>
+#include <Grids.hpp>
+#include <jpeg.hpp>
+#include <Mask.hpp>
+#include <Menus.hpp>
+#include <Messages.hpp>
+#include <OleCtrls.hpp>
+#include <Outline.hpp>
+#include <Provider.hpp>
+#include <SqlExpr.hpp>
+#include <StdCtrls.hpp>
+#include <System.hpp>
+#include <SysUtils.hpp>
+#include <Types.hpp>
+#include <Windows.hpp>
+#include <inifiles.hpp>
+//---------------------------------------------------------------------------
+#include "AppGlobalF.h"
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+//---------------------------------------------------------------------------
+
+/*
+******************************************************************************
+* Global variables
+******************************************************************************
+*/
+APP_CONFIG       g_AppCfg;
+LOG_INFO         g_LogCfg;
+TITSLog         *ITSLog = NULL;
+TITSLog         *FDbLog = NULL;
+bool LOGIN_CHECK = false;
+bool LOAD_DB = false;
+
+SYSTEM_INFORMATION *g_SysInfo;
+
+//---------------------------------------------------------------------------
+bool APP_LoadConfigInfo()
+{
+    String    sCfgFile;
+    TIniFile *pIniFile = NULL;
+
+    sCfgFile = g_sCfgDir + g_sAppName + ".ini";
+    g_AppCfg.sConfigFile = sCfgFile;
+
+    DATABASE_INFO *pDb;
+    try
+    {
+        String sTmp;
+
+        pIniFile = new TIniFile(sCfgFile);
+
+        g_AppCfg.sTitle     = pIniFile->ReadString("APPLICATION", "TITLE",      "VMS Communication Server");
+        g_AppCfg.sSystemId  = pIniFile->ReadString("APPLICATION", "SYSTEMID",   "VMS01");
+
+        g_AppCfg.sProcessId = pIniFile->ReadString("APPLICATION", "PROCESSID",  "30101");
+        g_AppCfg.nProcessId = g_AppCfg.sProcessId.ToIntDef(0);
+        g_AppCfg.nProcessPort = pIniFile->ReadInteger("APPLICATION", "PROCESSPORT", 5301);;
+
+        g_AppCfg.SaveFormImage  = (bool)pIniFile->ReadInteger("APPLICATION", "SAVEFORMIMAGE", 0);
+        g_AppCfg.DownloadBitmap = (bool)pIniFile->ReadInteger("APPLICATION", "DOWNLOADBITMAP", 0);
+        LOGIN_CHECK = (bool)pIniFile->ReadInteger("APPLICATION", "LOGINCHECK", 1);
+        LOAD_DB = (bool)pIniFile->ReadInteger("APPLICATION", "LOADDB", 0);
+
+        g_sFtpDir = pIniFile->ReadString("APPLICATION", "FTPHOMEDIR", g_sFtpDir);
+        if (g_sFtpDir.SubString(g_sFtpDir.Length(), 1) != "\\")
+            g_sFtpDir += "\\";
+
+        g_AppCfg.sManagerApp= pIniFile->ReadString("APPLICATION", "MANAGERAPP", "");
+        if (g_AppCfg.sManagerApp != "")
+        {
+            if (!FileExists(g_AppCfg.sManagerApp))
+            {
+                g_AppCfg.sManagerApp = "";
+            }
+        }
+
+        g_AppCfg.nTrafficCycleTime = pIniFile->ReadInteger("APPLICATION", "TrafficCycleTime",  300);
+        if (g_AppCfg.nTrafficCycleTime < 60) g_AppCfg.nTrafficCycleTime = 60;
+
+        g_AppCfg.nTrafficBasisTime = pIniFile->ReadInteger("APPLICATION", "TrafficBasisTime",  60);
+        g_AppCfg.nSaveFormType     = pIniFile->ReadInteger("APPLICATION", "SaveFormType",      0);
+        if (g_AppCfg.nSaveFormType < 0 || g_AppCfg.nSaveFormType > 2) g_AppCfg.nSaveFormType = 0;
+        g_AppCfg.nDefaultFillColor = pIniFile->ReadInteger("APPLICATION", "DefaultFillColor",  0);
+
+        g_AppCfg.MaxMemory = pIniFile->ReadInteger("RESOURCE", "MAXMEMORY", 512);
+        g_AppCfg.MaxHandle = pIniFile->ReadInteger("RESOURCE", "MAXHANDLE", 0);
+        g_AppCfg.MaxThread = pIniFile->ReadInteger("RESOURCE", "MAXTHREAD", 4096);
+        g_AppCfg.MaxGdi    = pIniFile->ReadInteger("RESOURCE", "MAXGDI",    0);
+        g_AppCfg.RcRestart = (bool)pIniFile->ReadInteger("RESOURCE", "RESTART",   0);
+
+        g_AppCfg.comm.nCenterPort  = pIniFile->ReadInteger("COMMUNICATION", "CENTERPORT",  6000);
+
+        g_AppCfg.comm.nListenPort  = pIniFile->ReadInteger("COMMUNICATION", "LISTENPORT",  6020);
+        g_AppCfg.comm.sLocalDomain = pIniFile->ReadString ("COMMUNICATION", "LOCALDOMAIN", "VMS_SERVER");
+
+        g_AppCfg.comm.nClientPort = pIniFile->ReadInteger("COMMUNICATION", "CLIENTPORT", 355);
+        g_AppCfg.comm.sLoginUser  = pIniFile->ReadString ("COMMUNICATION", "LOGINUSER",  "ysvms");
+        g_AppCfg.comm.sLoginPswd  = pIniFile->ReadString ("COMMUNICATION", "LOGINPSWD",  "ysvms");
+
+        g_AppCfg.comm.nConnectWait  = pIniFile->ReadInteger("COMMUNICATION", "CONNECTWAIT",  60);
+        g_AppCfg.comm.nCmdTimeOut   = pIniFile->ReadInteger("COMMUNICATION", "CMDTIMEOUT",   5);
+        g_AppCfg.comm.nWatchDogTime = pIniFile->ReadInteger("COMMUNICATION", "WATCHDOGTIME", 30);
+        g_AppCfg.comm.nPollingTime  = pIniFile->ReadInteger("COMMUNICATION", "POLLINGTIME",  20);
+
+        if (g_AppCfg.comm.nPollingTime < 10) g_AppCfg.comm.nPollingTime = 10;
+        if (g_AppCfg.comm.nPollingTime > 90) g_AppCfg.comm.nPollingTime = 90;
+
+	    g_AppCfg.nCenterCommLogLevel = pIniFile->ReadInteger("COMMUNICATION", "CenterCommLogLevel", 0);
+
+        if (g_AppCfg.comm.nConnectWait  < 10) g_AppCfg.comm.nConnectWait  = 10;
+        if (g_AppCfg.comm.nConnectWait  > 60) g_AppCfg.comm.nConnectWait  = 60;
+        if (g_AppCfg.comm.nCmdTimeOut   <  5) g_AppCfg.comm.nCmdTimeOut   =  5;
+        if (g_AppCfg.comm.nWatchDogTime < 30) g_AppCfg.comm.nWatchDogTime = 30;
+        g_AppCfg.comm.nWatchDogTime += 5;   // 5초정도를 더 추가해 준다(딜레이발생할 경우)
+
+        pDb = &g_AppCfg.db;
+        pDb->sProvider   = pIniFile->ReadString("DATABASE", "PROVIDER",   "");
+        pDb->sServerName = pIniFile->ReadString("DATABASE", "SERVERNAME", "");
+        pDb->sCatalog    = pIniFile->ReadString("DATABASE", "CATALOG",    "");
+        pDb->sUserName   = pIniFile->ReadString("DATABASE", "USERNAME",   "");
+        pDb->sPassword   = pIniFile->ReadString("DATABASE", "PASSWORD",   "");
+        pDb->MakeConnString();
+
+        try
+        {
+            g_AppCfg.nMaxLogLines = pIniFile->ReadInteger("LOG", "LOGLINE", 200);
+            if (g_AppCfg.nMaxLogLines > 1000) g_AppCfg.nMaxLogLines = 1000;
+            if (g_AppCfg.nMaxLogLines < 0)    g_AppCfg.nMaxLogLines = 100;
+
+            g_AppCfg.sLogDay      = pIniFile->ReadString ("LOG", "LOGDAY",  "");
+
+            g_LogCfg.Info    = (bool)pIniFile->ReadInteger("LOG", "INFO",    1);
+            g_LogCfg.Data    = (bool)pIniFile->ReadInteger("LOG", "DATA",    0);
+            g_LogCfg.Error   = (bool)pIniFile->ReadInteger("LOG", "ERROR",   1);
+            g_LogCfg.Warning = (bool)pIniFile->ReadInteger("LOG", "WARNING", 1);
+            g_LogCfg.Debug   = (bool)pIniFile->ReadInteger("LOG", "DEBUG",   0);
+            g_LogCfg.Detail  = (bool)pIniFile->ReadInteger("LOG", "DETAIL",  0);
+            g_LogCfg.Detail  = 0;
+        } catch(Exception &e) {}
+
+        g_AppCfg.bThrExit = false;
+    }
+    __finally
+    {
+        if (pIniFile) delete pIniFile;
+        pIniFile = NULL;
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+

+ 186 - 0
SRC/AppGlobalF.h

@@ -0,0 +1,186 @@
+//---------------------------------------------------------------------------
+
+#ifndef AppGlobalFH
+#define AppGlobalFH
+//---------------------------------------------------------------------------
+#include <vcl.h>
+#include <assert.h>
+#include <stdio.h>
+#include <inifiles.hpp>
+
+//---------------------------------------------------------------------------
+#include "ITSLogF.h"
+#include "ITSCommF.h"
+#include "SysGlobalF.h"
+#include "TVmsCtlrF.h"
+#include "TVmsImageF.h"
+#include "TCDSFormF.h"
+#include "TCDSFontF.h"
+#include "TVmsIfscF.h"
+#include "VitzroCommF.h"
+#include "VmsPasigProtocolF.h"
+
+//---------------------------------------------------------------------------
+
+/*
+******************************************************************************
+* User Define
+******************************************************************************
+*/
+//---------------------------------------------------------------------------
+#define LINFO(args...)      LogWrite(eLOG_INFO,    ##args)
+#define LDATA(args...)      LogWrite(eLOG_DATA,    ##args)
+#define LERROR(args...)     LogWrite(eLOG_ERROR,   ##args)
+#define LWARN(args...)      LogWrite(eLOG_WARNING, ##args)
+#define LDEBUG(args...)     LogWrite(eLOG_DEBUG,   ##args)
+#define LDETAIL(args...)    LogWrite(eLOG_DETAIL,  ##args)
+
+#define SINFO(args...)      SysLogWrite(eLOG_INFO,    ##args)
+#define SDATA(args...)      SysLogWrite(eLOG_DATA,    ##args)
+#define SERROR(args...)     SysLogWrite(eLOG_ERROR,   ##args)
+#define SWARN(args...)      SysLogWrite(eLOG_WARNING, ##args)
+#define SDEBUG(args...)     SysLogWrite(eLOG_DEBUG,   ##args)
+#define SDETAIL(args...)    SysLogWrite(eLOG_DETAIL,  ##args)
+
+#define WM_THREAD_TERMINATE         (WM_USER+0x92)      /* Thread 종료 메시지 */
+#define WM_PROCESS_STATE            (WM_USER+0xA4)      /* 프로세스 상태 입력 */
+//---------------------------------------------------------------------------
+
+#define MAX_SENDER_SIZE     20
+typedef struct tagIpcLogMessage
+{
+    int         Kind;
+    int         Flag;
+    int         Len;
+    TDateTime   Tm;
+    char        Type;
+    char        Msg[MAX_LOG_BUFFER];
+    void       *Obj;
+} IPC_LOG_MESSAGE;
+
+
+typedef struct tagCommConfig
+{
+    int             nCenterPort;        // center udp port
+
+    int             nListenPort;        // vms listen port
+    AnsiString      sLocalDomain;       // vms server domain
+
+    int             nClientPort;        // vms controller connect port
+    AnsiString      sLoginUser;         // vms controller login id
+    AnsiString      sLoginPswd;         // vms controller login pswd
+
+    int             nConnectWait;
+    int             nCmdTimeOut;
+    int             nWatchDogTime;
+    int             nPollingTime;
+    void Clear()
+    {
+    }
+} COMM_CONFIG;
+
+typedef struct tagAppConfig
+{
+    String          sConfigFile;
+    bool            bAppClose;
+    bool            bAppLoad;
+    bool            bThrExit;
+
+    String          sTitle;
+    long            lMainWinHandle;     /* Main Window Handle */
+
+    String          sManagerApp;
+
+    AnsiString      sProcessId;       	/* Process ID */
+    int             nProcessId;
+    int             nProcessPort;
+
+    AnsiString      sSystemId;          /* System ID */
+
+    AnsiString      sLogDay;
+    int             nTrafficCycleTime;
+    int             nTrafficBasisTime;
+    int             nSaveFormType;
+    int             nDefaultFillColor;
+
+    int             nMaxLogLines;
+
+	int  MaxMemory;                     /* Max Memory size Mbyte */
+	int  MaxHandle;                     /* Max Handle count */
+	int  MaxThread;                     /* Max Thread count */
+	int  MaxGdi;                        /* Max Gdi count */
+    bool RcRestart;                     /* 리소스 오류시 재기동 여부 */
+
+    bool DownloadBitmap;
+    bool SaveFormImage;                 // 폼이미지를 Form 디렉토리에 저장할지 여부
+
+    //THREAD_INFO     thrDb;              /* DB Thread */
+    DATABASE_INFO   db;
+    COMM_CONFIG     comm;
+    int             nCenterCommLogLevel;
+public:
+    void Clear()
+    {
+        bThrExit       = false;
+        bAppClose      = false;
+        bAppLoad       = false;
+        sTitle         = "";
+        lMainWinHandle = 0;
+
+        sProcessId  = "";
+        sLogDay     = "";
+
+        MaxMemory = 0;
+        MaxHandle = 0;
+        MaxThread = 0;
+        MaxGdi    = 0;
+
+        //thrDb.Clear();
+        db.Clear();
+        comm.Clear();
+    }
+} APP_CONFIG;
+
+// system state
+typedef struct tagSystemState
+{
+    BYTE Action;      						/* 동작 상태 */
+    BYTE Comm;        						/* 통신 상태 */
+    BYTE DB;          						/* DB 상태 */
+
+    HANDLE hFinishEvent;                    /* finish event */
+
+	DWORD CommThreadID;     				/* 통신 데이터 처리 스레드 ID */
+} SYSTEM_STATE;
+
+// system informations
+typedef struct tagSystemInformation
+{
+	SYSTEM_STATE      State;         /* system state */
+} SYSTEM_INFORMATION;
+
+
+/*
+******************************************************************************
+* Global variable definitions
+******************************************************************************
+*/
+extern APP_CONFIG       g_AppCfg;
+extern LOG_INFO         g_LogCfg;
+extern TITSLog         *ITSLog;
+extern TITSLog         *FDbLog;
+extern bool LOGIN_CHECK;
+extern bool LOAD_DB;
+
+extern SYSTEM_INFORMATION *g_SysInfo;
+
+#define USE_Q   0
+
+/*
+******************************************************************************
+* Global function definitios
+******************************************************************************
+*/
+bool APP_LoadConfigInfo();
+
+#endif

+ 376 - 0
SRC/CDS/LibSTLF.hpp

@@ -0,0 +1,376 @@
+
+#ifndef  _LIBSTL_HPP
+#define _LIBSTL_HPP
+
+#include <vcl.h>
+#include <math.h>
+#include <map>
+#include <list>
+#include <vector>
+#include <algorithm>
+//#include <functional>
+
+#ifndef FOR_STL
+#define FOR_STL(_class, _pointer, _list)		for(_class _pointer = (_list).GetHead(); !(_list).IsEnd(); _pointer = (_list).GetNext())
+#endif
+
+#ifndef REV_STL
+#define REV_STL(_class, _pointer, _list)		for(_class _pointer = (_list).GetTail(); !(_list).IsBegin(); _pointer = (_list).GetPrev())
+#endif
+
+#define DB_INIT     0
+#define DB_NEW      1
+#define DB_DELETE   2
+#define DB_UPDATE   3
+
+class TLockObj
+{
+private:
+    CRITICAL_SECTION CS;
+public:
+    TLockObj(CRITICAL_SECTION &ACS)
+    {
+        EnterCriticalSection(&CS);
+    }
+    ~TLockObj()
+    {
+        LeaveCriticalSection(&CS);
+    }
+};
+
+namespace LibSTL
+{
+    template<class T>
+    class LibStrMap
+    {
+    protected:
+        typedef std::map<AnsiString, T*>                    MapObject;
+        typedef std::map<AnsiString, T*>::iterator          MapPosition;
+        typedef std::map<AnsiString, T*>::reverse_iterator  MapRevPosition;
+
+        MapPosition         FMapPosition;
+        MapRevPosition      FMapRevPosition;
+        //TCriticalSection   *FCS;
+        //TRTLCriticalSection CS;
+        CRITICAL_SECTION    CS;
+
+    public:
+        MapObject           FMapObject;
+        LibStrMap()
+        {
+            //FCS = new TCriticalSection();
+            FMapObject.clear();
+            InitializeCriticalSection(&CS);
+        };
+
+        virtual ~LibStrMap()
+        {
+            RemoveAll();
+            //if (FCS) delete FCS;
+            DeleteCriticalSection(&CS);
+        };
+
+    public:
+        inline bool Lock()
+        {
+            EnterCriticalSection(&CS);
+            //FCS->Acquire();
+            return true;
+        };
+        inline void UnLock()
+        {
+            LeaveCriticalSection(&CS);
+            //FCS->Release();
+        };
+        inline bool Push(AnsiString AKey, T* AData)
+        {
+            //std::pair<map<AnsiString, T*>::iterator, bool> pairTwo;
+            std::pair<MapPosition, bool> pairTwo;
+
+            pairTwo = FMapObject.insert(std::make_pair<AnsiString, T*>(AKey, AData));
+            // if (pairTwo->second == false) //데이터가 중복으로 들어간것임.
+            return pairTwo.second;
+        };
+
+        inline T* Find(AnsiString AKey)
+        {
+            MapPosition it;
+            it = FMapObject.find(AKey);
+            if (it == FMapObject.end())
+                return (T*)NULL;
+            return it->second;
+        }
+
+        inline void RemoveAll()
+        {
+            MapPosition it;
+            for (it = FMapObject.begin(); it != FMapObject.end(); ++it)
+            {
+                T* pData = it->second;
+                if (pData)
+                    delete pData;
+            }
+            FMapObject.clear();
+        }
+
+        inline void Clear()
+        {
+            FMapObject.clear();
+        }
+
+        inline bool Remove(AnsiString AKey)
+        {
+            MapPosition it;
+            it = FMapObject.find(AKey);
+            if (it != FMapObject.end())
+            {
+                T* pData = it->second;
+                if (pData)
+                    delete pData;
+                
+                FMapObject.erase(AKey);
+                return true;
+            }
+            return false;
+        }
+
+        inline bool Erase(AnsiString AKey)
+        {
+            MapPosition it;
+            it = FMapObject.find(AKey);
+            if (it != FMapObject.end())
+            {
+                FMapObject.erase(AKey);
+                return true;
+            }
+            return false;
+        }
+        
+        inline int Size()
+        {
+            return(int)FMapObject.size();
+        }
+
+        inline bool IsExist(AnsiString AKey)
+        {
+            MapPosition it;
+            it = FMapObject.find(AKey);
+            if (it == FMapObject.end())
+                return false;
+            return true;
+        }
+
+        inline T* GetTail()
+        {
+            FMapRevPosition = FMapObject.rbegin();
+            if (FMapRevPosition == FMapObject.rend())
+                return (T*)NULL;
+            return FMapRevPosition->second;
+        }
+
+        inline T* GetPrev()
+        {
+            if (FMapRevPosition != FMapObject.rend()) {
+                FMapRevPosition++;
+                if (FMapRevPosition != FMapObject.rend())
+                    return FMapRevPosition->second;
+            }
+            return(T*)NULL;
+        }
+
+        inline bool IsBegin()
+        {
+            return (FMapRevPosition == FMapObject.rend());
+        }
+
+        inline T* GetHead()
+        {
+            FMapPosition = FMapObject.begin();
+            if (FMapPosition == FMapObject.end())
+                return (T*)NULL;
+            return FMapPosition->second;
+        }
+
+        inline T* GetNext()
+        {
+            if (FMapPosition != FMapObject.end()) {
+                FMapPosition++;
+                if (FMapPosition != FMapObject.end())
+                    return FMapPosition->second;
+            }
+            return(T*)NULL;
+        }
+
+        inline bool IsEnd()
+        {
+            return (FMapPosition == FMapObject.end());
+        }
+    };
+
+    template<class T>
+    class LibIntMap
+    {
+    protected:
+        typedef std::map<int, T*>                   MapObject;
+        typedef std::map<int, T*>::iterator         MapPosition;
+        typedef std::map<int, T*>::reverse_iterator MapRevPosition;
+
+        MapObject           FMapObject;
+        MapPosition         FMapPosition;
+        MapRevPosition      FMapRevPosition;
+        CRITICAL_SECTION    CS;
+
+    public:
+        LibIntMap()
+        {
+            FMapObject.clear();
+            InitializeCriticalSection(&CS);
+        };
+
+        virtual ~LibIntMap()
+        {
+            RemoveAll();
+            DeleteCriticalSection(&CS);
+        };
+
+    public:
+        inline bool Lock()
+        {
+            EnterCriticalSection(&CS);
+            return true;
+        };
+        inline void UnLock()
+        {
+            LeaveCriticalSection(&CS);
+        };
+        inline bool Push(int AKey, T* AData)
+        {
+            std::pair<MapPosition, bool> pairTwo;
+            pairTwo = FMapObject.insert(std::make_pair<int, T*>(AKey, AData));
+            return pairTwo.second;
+        };
+
+        inline T* Find(int AKey)
+        {
+            MapPosition it;
+            it = FMapObject.find(AKey);
+            if (it == FMapObject.end())
+                return (T*)NULL;
+            return it->second;
+        }
+
+        inline void RemoveAll()
+        {
+            MapPosition it;
+            for (it = FMapObject.begin(); it != FMapObject.end(); ++it)
+            {
+                T* pData = it->second;
+                if (pData)
+                    delete pData;
+            }
+            FMapObject.clear();
+        }
+
+        inline void Clear()
+        {
+            FMapObject.clear();
+        }
+
+        inline bool Remove(int AKey)
+        {
+            MapPosition it;
+            it = FMapObject.find(AKey);
+            if (it != FMapObject.end())
+            {
+                T* pData = it->second;
+                if (pData)
+                    delete pData;
+
+                FMapObject.erase(AKey);
+                return true;
+            }
+            return false;
+        }
+
+        inline bool Erase(int AKey)
+        {
+            MapPosition it;
+            it = FMapObject.find(AKey);
+            if (it != FMapObject.end())
+            {
+                FMapObject.erase(AKey);
+                return true;
+            }
+            return false;
+        }
+
+        inline int Size()
+        {
+            return(int)FMapObject.size();
+        }
+
+        inline bool IsExist(int AKey)
+        {
+            MapPosition it;
+            it = FMapObject.find(AKey);
+            if (it == FMapObject.end())
+                return false;
+            return true;
+        }
+
+        inline T* GetTail()
+        {
+            FMapRevPosition = FMapObject.rbegin();
+            if (FMapRevPosition == FMapObject.rend())
+                return (T*)NULL;
+            return FMapRevPosition->second;
+        }
+
+        inline T* GetPrev()
+        {
+            if (FMapRevPosition != FMapObject.rend()) {
+                FMapRevPosition++;
+                if (FMapRevPosition != FMapObject.rend())
+                    return FMapRevPosition->second;
+            }
+            return(T*)NULL;
+        }
+
+        inline bool IsBegin()
+        {
+            return (FMapRevPosition == FMapObject.rend());
+        }
+
+        inline T* GetHead()
+        {
+            FMapPosition = FMapObject.begin();
+            if (FMapPosition == FMapObject.end())
+                return (T*)NULL;
+            return FMapPosition->second;
+        }
+
+        inline T* GetNext()
+        {
+            if (FMapPosition != FMapObject.end()) {
+                FMapPosition++;
+                if (FMapPosition != FMapObject.end())
+                    return FMapPosition->second;
+            }
+            return(T*)NULL;
+        }
+
+        inline bool IsEnd()
+        {
+            return (FMapPosition == FMapObject.end());
+        }
+    };
+
+} // namespace
+
+#define StrMap     LibSTL::LibStrMap
+#define IntMap     LibSTL::LibIntMap
+#define ListMap    LibSTL::LibStrMap
+
+#endif //_LIBSTL_HPP
+
+

+ 38 - 0
SRC/CDS/TCDSFontF.cpp

@@ -0,0 +1,38 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "TCDSFontF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TCDSFont::TCDSFont()
+{
+}
+//---------------------------------------------------------------------------
+
+TCDSFont::~TCDSFont()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TCDSFontManager *FontManager = NULL;
+//---------------------------------------------------------------------------
+
+TCDSFontManager::TCDSFontManager()
+{
+}
+//---------------------------------------------------------------------------
+TCDSFontManager::~TCDSFontManager()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+

+ 40 - 0
SRC/CDS/TCDSFontF.h

@@ -0,0 +1,40 @@
+//---------------------------------------------------------------------------
+
+#ifndef TCDSFontFH
+#define TCDSFontFH
+//---------------------------------------------------------------------------
+#include "LibSTLF.hpp"
+//---------------------------------------------------------------------------
+#include "VitzroCommF.h"
+#include "ITSLogF.h"
+//---------------------------------------------------------------------------
+
+class TCDSFont
+{
+public:
+    TCDSFont();
+    ~TCDSFont();
+
+public:
+    int        FontCode;
+    AnsiString FontName;
+};
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+class TCDSFontManager
+{
+public:
+    TCDSFontManager();
+    ~TCDSFontManager();
+
+private:
+
+public:
+    IntMap<TCDSFont> FLists;
+};
+//---------------------------------------------------------------------------
+extern TCDSFontManager *FontManager;
+//---------------------------------------------------------------------------
+
+#endif

+ 75 - 0
SRC/CDS/TCDSFormF.cpp

@@ -0,0 +1,75 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "TCDSFormF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+//---------------------------------------------------------------------------
+TCDSFormObj::TCDSFormObj()
+{
+    pImage  = NULL;
+    pImage  = new TImage(NULL);
+}
+//---------------------------------------------------------------------------
+
+TCDSFormObj::~TCDSFormObj()
+{
+    Clear();
+    if (pImage)
+    {
+        delete pImage;
+        pImage = NULL;
+    }
+}
+//---------------------------------------------------------------------------
+void TCDSFormObj::Clear()
+{
+    if (pImage)
+    {
+        pImage->Picture->Bitmap->FreeImage();
+        pImage->Picture->Assign(NULL);
+    }
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TCDSForm::TCDSForm()
+{
+    TrfIfsc = false;
+    TrfAxis = false;
+    TrfBakImgId = "";
+}
+//---------------------------------------------------------------------------
+
+TCDSForm::~TCDSForm()
+{
+    Clear();
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+void TCDSForm::Clear()
+{
+}
+//---------------------------------------------------------------------------
+
+
+//---------------------------------------------------------------------------
+TCDSFormManager *FormManager = NULL;
+//---------------------------------------------------------------------------
+
+TCDSFormManager::TCDSFormManager()
+{
+}
+//---------------------------------------------------------------------------
+TCDSFormManager::~TCDSFormManager()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+
+

+ 98 - 0
SRC/CDS/TCDSFormF.h

@@ -0,0 +1,98 @@
+//---------------------------------------------------------------------------
+
+#ifndef TCDSFormFH
+#define TCDSFormFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <stdio.h>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include <SyncObjs.hpp>
+#include <ExtCtrls.hpp>
+#include <jpeg.hpp>
+#include <GIFimg.hpp>
+#include "LibSTLF.hpp"
+//---------------------------------------------------------------------------
+#include "VitzroCommF.h"
+#include "ITSLogF.h"
+//---------------------------------------------------------------------------
+
+class TCDSFormObj
+{
+public:
+    TCDSFormObj();
+    ~TCDSFormObj();
+
+public:
+    int        FORM_OBJECT_ID;          //NUMBER(5)	N			FORM OBJECT ID
+    AnsiString VMS_FORM_ID;             //NUMBER(5)	N			VMS FORM ID
+    int        VMS_FORM_DSPL_ROW;       //NUMBER(2)	Y			VMS FORM 표출 행
+    int        VMS_FORM_DSPL_CLMN;      //NUMBER(2)	Y			VMS FORM 표출 칼럼
+    int        VMS_FORM_OBJECT_TYPE_CD; //NUMBER(3)	N			VMS FORM OBJECT 유형 코드
+    int        VMS_FONT_TYPE_CD;        //NUMBER(3)	N			VMS 글꼴 유형 코드
+    int        VMS_FONT_HUE_CD;         //NUMBER(9)	N			VMS 글꼴 색상 코드
+    int        VMS_FONT_STYL_CD;        //NUMBER(3)	Y			VMS 글꼴 방식 코드
+    int        VMS_FONT_SIZE;           //NUMBER(3)	Y	0		VMS 글꼴 크기
+    int        VMS_FONT_ALIGN;          //NUMBER(1)	Y	0		VMS 표출 문자열정열방식(0:LEFT,1:RIGHT,2:CENTER)
+    AnsiString VMS_DSPL_TXT;            //VARCHAR2(200)	Y		VMS 표출 텍스트
+    int        VMS_DSPL_XCRDN;          //NUMBER(5)	Y			VMS 표출 X좌표
+    int        VMS_DSPL_YCRDN;          //NUMBER(5)	Y			VMS 표출 Y좌표
+    int        VMS_DSPL_WIDTH;          //NUMBER(5)	Y	0		VMS 표출 넓이
+    int        VMS_DSPL_HEIGHT;         //NUMBER(5)	Y	0		VMS 표출 높이
+    int        VMS_DSPL_BLINKING;       //NUMBER(1)	Y	0		VMS 표출 점멸 여부(0:지속, 1:점멸)
+    int        VMS_DSPL_BKCOLOR;        //NUMBER(1)	Y	0		VMS 표출 배경색상코드
+    int        VMS_DSPL_SIZE;           //NUMBER(7)	Y	0		VMS 표출 크기(문자:문자길이,이미지:이미지전체크기)
+    AnsiString TRFC_FILL_CD;            //CHAR(1)	Y	'N'		FILL-IN 메시지 여부
+    AnsiString SYMBLIB_NMBR;            //NUMBER(4)	N	0		심벌라이브러리 번호
+    AnsiString VMS_IFSC_ID;             //NUMBER(10)	Y		VMS 정보제공구간 ID
+	TImage    *pImage;
+
+public:
+    void Clear();
+};
+//---------------------------------------------------------------------------
+
+class TCDSForm
+{
+public:
+    TCDSForm();
+    ~TCDSForm();
+
+public:
+    AnsiString VMS_FORM_ID;             //NUMBER(5)	    N			VMS FORM ID
+    AnsiString VMS_TYPE_CD;             //VARCHAR2(7)	Y			VMS 유형 코드
+    int        VMS_FORM_TYPE_CD;        //NUMBER(3)	    N			VMS FORM 유형 코드
+    int        VMS_FORM_BCKG_HUE_CD;    //NUMBER(10)	N			VMS FORM 배경 색상 코드
+    int        VMS_MSG_DSPL_DRCT_CD;    //NUMBER(3)	    Y			VMS 메시지 표출 방향 코드
+    int        VMS_MSG_DSPL_MTHD_CD;    //NUMBER(3)	    Y	0		VMS 메시지 표출 방법 코드
+
+    AnsiString  TrfBakImgId;
+
+    bool       TrfIfsc;   //도형식 하단 정보제공구간소통정보
+    bool       TrfAxis;   //도형식 하단 축소통정보
+public:
+    IntMap<TCDSFormObj> FLists;
+
+    void Clear();
+};
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+class TCDSFormManager
+{
+public:
+    TCDSFormManager();
+    ~TCDSFormManager();
+
+private:
+
+public:
+    ListMap<TCDSForm> FLists;
+};
+//---------------------------------------------------------------------------
+extern TCDSFormManager *FormManager;
+//---------------------------------------------------------------------------
+
+
+
+#endif

+ 241 - 0
SRC/CDS/TVmsCtlrF.cpp

@@ -0,0 +1,241 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "TVmsCtlrF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+//---------------------------------------------------------------------------
+TVmsCtlr::TVmsCtlr()
+{
+    InitializeCriticalSection(&FCS);
+
+    VMS_MAX_PHSE_NUM      = INT_MAX_VMS_FORM;   // NUMBER(2)    Y            VMS 최대 표출면 개수
+
+    VMS_PHSE_CHNG_CYCL    = 5;    // NUMBER(3)      Y VMS 표출면 변경 주기
+    VMS_CMNC_ERR_BASS_VAL = 127;  // NUMBER(3)      Y VMS 통신 오류 기본 값(모듈 전원이 꺼지는 온도값(℃))
+    FAN_MTNS_TMPR         = 35;   // NUMBER(6,3)    Y 팬 동작 온도
+    HETR_MTNS_TMPR        = 0;    // NUMBER(6,3)    Y 히터 동작 온도
+    VMS_MODL_ERR_RATE     = 20;   // NUMBER(3)      Y VMS 모듈 오류 율(Options)
+
+    VMS_NGHT_BRGH_STEP    = 48;   // NUMBER(2)    Y            VMS 야간 휘도 단계
+    VMS_WEEK_BRGH_STEP    = 64;   // NUMBER(2)    Y            VMS 주간 휘도 단계
+    CMNCFAIL_SLOT_NMBR    = 0;    // NUMBER(4)    Y    0        통신장애 SLOT 번호
+    PWER_FAIL_SLOT_NMBR   = 0;    // NUMBER(4)    Y    0        전원 장애 SLOT 번호
+    VMS_MODL_CHK_CYCL     = 30;
+
+    FDispLog = false;
+    FSLog    = NULL;
+    FCLog    = NULL;
+
+    memset(&DSTATE, 0x00, sizeof(DSTATE));
+    DSTATE.Comm = vms_error;
+    DSTATE.Wcomm = vms_error;
+    VComm_VmsInitStatus(&DSTATE);
+    DSTATE.Comm = vms_error;
+    DSTATE.Wcomm = vms_error;
+
+    memset(&RSTATE, 0x00, sizeof(RSTATE));
+    RSTATE.Comm = vms_error;
+    RSTATE.Wcomm = vms_error;
+    VComm_VmsInitStatus(&RSTATE);
+    RSTATE.Comm = vms_error;
+    RSTATE.Wcomm = vms_error;
+
+    FSaveState = false;
+    FOldState  = vms_normal;
+
+    FProvide = false;
+    FModeChange = false;
+
+    FIsOldProtocol    = false;
+    FIsFtpDownload    = false;
+    FIsProtolFontName = false;
+    FIsStatusAuto     = true;
+    FBmpDownload      = false;
+
+    FSymbolDownload   = false;
+
+    RowNo = -1;
+}
+//---------------------------------------------------------------------------
+
+TVmsCtlr::~TVmsCtlr()
+{
+    SAFE_DELETE(pPackQueue); /* 패킷 버퍼 */
+    SAFE_DELETE(FSLog);
+    SAFE_DELETE(FCLog);
+
+    SAFE_DELETE(DOWNLOAD);
+    SAFE_DELETE(CTLMODE);
+
+    DeleteCriticalSection(&FCS);
+}
+//---------------------------------------------------------------------------
+void TVmsCtlr::Lock()
+{
+    EnterCriticalSection(&FCS);
+}
+//---------------------------------------------------------------------------
+void TVmsCtlr::UnLock()
+{
+    LeaveCriticalSection(&FCS);
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TVmsCtlrManager *VmsManager = NULL;
+//---------------------------------------------------------------------------
+
+TVmsCtlrManager::TVmsCtlrManager()
+{
+    Total  = 0;
+    Error  = 0;
+    Normal = 0;
+    Module = 0;
+}
+//---------------------------------------------------------------------------
+TVmsCtlrManager::~TVmsCtlrManager()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+
+void TVmsCtlrManager::InitProvide(bool AProvide/*=false*/)
+{
+    try
+    {
+        FLists.Lock();
+        FOR_STL(TVmsCtlr*, pObj, VmsManager->FLists)
+        {
+            pObj->FProvide = AProvide;;
+        }
+    }
+    __finally
+    {
+        FLists.UnLock();
+    }
+}
+//---------------------------------------------------------------------------
+
+
+bool ChangedState(INT_VMS_STATE *DSTATE, INT_VMS_STATE *RSTATE)
+{
+    if (DSTATE->OprMode != RSTATE->OprMode) return true;
+	//if (DSTATE->Comm    != RSTATE->Comm) return true;
+	if (DSTATE->Wcomm   != RSTATE->Wcomm) return true;
+
+	if (DSTATE->DoorStatus        != RSTATE->DoorStatus) return true;
+	if (DSTATE->ModulePowerStatus != RSTATE->ModulePowerStatus) return true;
+	if (DSTATE->FanStatus         != RSTATE->FanStatus) return true;
+	if (DSTATE->HeaterStatus      != RSTATE->HeaterStatus) return true;
+	if (DSTATE->BodyTemp          != RSTATE->BodyTemp) return true;
+	if (DSTATE->LuminanceStatus   != RSTATE->LuminanceStatus) return true;
+
+    if (DSTATE->ExternalLightStatus != RSTATE->ExternalLightStatus) return true;
+    if (DSTATE->AlarmLightStatus    != RSTATE->AlarmLightStatus) return true;
+    if (DSTATE->SpeakerStatus       != RSTATE->SpeakerStatus) return true;
+
+	//if (!memcmp(DSTATE->ControllerCurrentTime, RSTATE->ControllerCurrentTime, INT_VMS_MAX_DATETIME)) return true;
+
+    if (DSTATE->Voltage != RSTATE->Voltage) return true;
+
+	if (DSTATE->ModuleState      != RSTATE->ModuleState) return true;
+	if (DSTATE->ModuleVertical   != RSTATE->ModuleVertical) return true;
+	if (DSTATE->ModuleHorizontal != RSTATE->ModuleHorizontal) return true;
+	if (memcmp(DSTATE->ModuleStatus, RSTATE->ModuleStatus, INT_VMS_MAX_MODULE_BIT)) return true;
+
+	if (DSTATE->PowerCount != RSTATE->PowerCount) return true;
+	if (memcmp(DSTATE->PowerStatus, RSTATE->PowerStatus, INT_VMS_MAX_POWER_BIT)) return true;
+
+	//if (DSTATE->ScheduledMessageOperatingTime   != RSTATE->ScheduledMessageOperatingTime) return true;
+	if (DSTATE->ModuleOperatingTemperature      != RSTATE->ModuleOperatingTemperature) return true;
+	if (DSTATE->FanOperatingTemperature         != RSTATE->FanOperatingTemperature) return true;
+	if (DSTATE->HeaterOperatingTemperature      != RSTATE->HeaterOperatingTemperature) return true;
+	if (DSTATE->ExternalLightOperatingLuminance != RSTATE->ExternalLightOperatingLuminance) return true;
+	if (DSTATE->ModuleBasicFailureRate          != RSTATE->ModuleBasicFailureRate) return true;
+	if (DSTATE->MaximumRetry                    != RSTATE->MaximumRetry) return true;
+	if (DSTATE->ResponseTimeOut                 != RSTATE->ResponseTimeOut) return true;
+	if (DSTATE->BlinkingCycleTime               != RSTATE->BlinkingCycleTime) return true;
+
+    return false;
+}
+//---------------------------------------------------------------------------
+
+void InitDownLoadInfo(VMS_DOWNLOAD_INFO *AInfo)
+{
+    AInfo->Enable   = vms_download_disable;
+    AInfo->SaveFlag = -1;
+    AInfo->dTimer   = Now();
+    AInfo->Count    = 0;
+}
+//---------------------------------------------------------------------------
+
+void InitCtlModeInfo(VMS_CONTROL_MODE *AInfo)
+{
+    AInfo->SaveFlag = -1;
+    AInfo->pTimer   = Now();
+}
+//---------------------------------------------------------------------------
+
+void EventInit(VMS_EVENT_INFO *AInfo)
+{
+    AInfo->Count = 0;
+    for (int ii = 0; ii < VMS_MAX_EVENT; ii++)
+    {
+        AInfo->Unit[ii].LINK_ID               = "";
+        AInfo->Unit[ii].IFSC_ID               = "";
+        AInfo->Unit[ii].VMS_IFSC_ID           = "";
+        AInfo->Unit[ii].VMS_IFSC_NM           = "";
+        AInfo->Unit[ii].DSPL_STRT_NODE_NM     = "";
+        AInfo->Unit[ii].DSPL_END_NODE_NM      = "";
+        AInfo->Unit[ii].DETR_ID               = "";
+        AInfo->Unit[ii].DSPL_PRRT             = "";
+        AInfo->Unit[ii].INCD_OCRR_ID          = "";
+        AInfo->Unit[ii].STRT_LCTN_NM          = "";
+        AInfo->Unit[ii].END_LCTN_NM           = "";
+        AInfo->Unit[ii].OCRR_LCTN_NM          = "";
+        AInfo->Unit[ii].VMS_INCD_TYPE_NM      = "";
+        AInfo->Unit[ii].VMS_INCD_TYPE_CD      = "";
+        AInfo->Unit[ii].VMS_INCD_DETL_NM      = "";
+        AInfo->Unit[ii].VMS_INCD_DETL_TYPE_CD = "";
+        AInfo->Unit[ii].CMTR_GRAD_NM          = "";
+        AInfo->Unit[ii].CMTR_GRAD_CD          = "";
+        AInfo->Unit[ii].INCD_CLSR_LANE        = "";
+        AInfo->Unit[ii].INCD_STRT_DT          = "";
+        AInfo->Unit[ii].INCD_END_PRAR_DT      = "";
+    }
+}
+//---------------------------------------------------------------------------
+
+void ScheduleInit(VMS_SCHEDULE_INFO *AInfo)
+{
+    AInfo->Count = 0;
+    for (int ii = 0; ii < VMS_MAX_SCHEDULE; ii++)
+    {
+        AInfo->Unit[ii].TRFC_SITU_TYPE_CD = 0;
+        AInfo->Unit[ii].PHASE             = 0;
+        AInfo->Unit[ii].VMS_FORM_ID       = "";
+        AInfo->Unit[ii].FRST_VMS_IFSC_ID  = "";
+        AInfo->Unit[ii].SECD_VMS_IFSC_ID  = "";
+        AInfo->Unit[ii].THIR_VMS_IFSC_ID  = "";
+        AInfo->Unit[ii].FOUR_VMS_IFSC_ID  = "";
+        AInfo->Unit[ii].FRST_IMG_IFSC_ID  = "";
+        AInfo->Unit[ii].SECD_IMG_IFSC_ID  = "";
+        AInfo->Unit[ii].THIR_IMG_IFSC_ID  = "";
+        AInfo->Unit[ii].FOUR_IMG_IFSC_ID  = "";
+        AInfo->Unit[ii].DSPL_HH           = 0;
+        AInfo->Unit[ii].VMS_FORM_PRRT_CD  = "";
+
+        AInfo->Unit[ii].VMS_IFSC_ID       = "";
+
+        AInfo->Unit[ii].EVENT             = NULL;
+    }
+}
+//---------------------------------------------------------------------------
+

+ 365 - 0
SRC/CDS/TVmsCtlrF.h

@@ -0,0 +1,365 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSVmsCtlrFH
+#define CDSVmsCtlrFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <stdio.h>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "LibSTLF.hpp"
+//---------------------------------------------------------------------------
+#include "VitzroCommF.h"
+#include "ITSLogF.h"
+#include "TVmsFormF.h"
+//---------------------------------------------------------------------------
+
+typedef enum en_object_state
+{
+    object_disable = 0,
+    object_enable  = 1,
+} EN_OBJECT_STATE;
+
+typedef enum en_bit_state
+{
+    bit_disable = 0,
+    bit_enable  = 1,
+} EN_BIT_STATE;
+
+typedef enum en_state
+{
+    state_close = 0,
+    state_open  = 1,
+
+    state_stop  = 0,
+    state_run   = 1,
+
+    state_normal = 0,
+    state_error  = 1,
+    state_unknown= 2,
+} EN_STATE;
+
+typedef enum en_process_state
+{
+    process_fail = 0,
+    process_run,
+    process_stop,
+} EN_PROCESS_STATE;
+
+//---------------------------------------------------------------------------
+// 프로세스 정보
+//---------------------------------------------------------------------------
+class PROCESS_INFO
+{
+public:
+    PROCESS_INFO()
+    {
+        UseFlag         = bit_disable;
+        Status          = process_fail;
+        Comm            = state_close;
+        pThread         = NULL;
+        ActiveIndicator = false;
+        wTimer          = Now() - 1;
+    };
+    ~PROCESS_INFO()
+    {
+    }
+
+public:
+    BYTE      UseFlag;
+    BYTE      Status;                   /* 프로세스 상태, 0:비정상 1:정상 2:정지 */
+    BYTE      Comm;                     /* 통신상태, 0:close, 1:open */
+	void     *pThread;                  /* 스레드 포인터 */
+    bool      ActiveIndicator;          /* 스레드 실행 상태 */
+    TDateTime wTimer;                   /* timer for connect wait time check */
+};
+//---------------------------------------------------------------------------
+
+// VMS 제어모드
+typedef struct vms_form_download
+{
+	BYTE        Control;                /* VMS 제어모드 */
+	AnsiString  ManSceId;               /* 수동시나리오ID */
+	AnsiString  EmeSceId;               /* 긴급시나리오ID */
+	AnsiString  CurSceId;               /* 현재시나리오ID */
+
+	bool        Enable;                 /* 활성화 여부 */
+	int         MaxDisplayForm;         /* 최대 표출폼 갯수 */
+	AnsiString  SvcDate;                /* 제공시각 */
+	int         SaveFlag;               /* 제공정보 저장 여부 */
+	TDateTime   pTimer;                 /* timer for provide */
+    bool        Result;
+} VMS_CONTROL_MODE;
+
+// VMS 다운로드
+#define VMS_MAX_DOWNLOAD                8       /* 최대 VMS 다운로드 */
+typedef struct VmsDownLoadInfo
+{
+	bool        Enable;             	/* 활성화 여부 */
+	int         SaveFlag;               /* 다운로드정보 저장 여부 */
+	TDateTime   dTimer;                 /* timer for download */
+	int         Count;                  /* 정보 갯수 */
+	struct
+    {
+		AnsiString  RegDate;           	/* 등록일시 */
+		AnsiString  FileType;          	/* 다운로드파일유형 */
+		AnsiString  FileId;            	/* 다운로드파일ID */
+		AnsiString  SendStartDate;     	/* 전송시작시각 */
+		AnsiString  SendEndDate;       	/* 전송완료시각 */
+		int         SendStep;           /* 전송진행단계 */
+		int         SendResult;        	/* 전송결과 */
+	} Unit[VMS_MAX_DOWNLOAD];
+} VMS_DOWNLOAD_INFO;
+
+typedef enum en_vms_downalod
+{
+    vms_download_disable = 0,
+    vms_download_enable  = 1,
+} EN_VMS_DOWNLOAD;
+
+typedef enum en_vms_download_step
+{
+	send_wait,			/* 0:대기 */
+	send_progress,		/* 1:전송중 */
+	send_complete,      /* 2:전송완료 */
+} EN_VMS_DOWNLOAD_STEP;
+
+// 전송결과
+typedef enum en_send_result
+{
+	send_result_fail,	/* 0:실패 */
+	send_result_succ	/* 1:성공 */
+} EN_SEND_RESULT;
+
+//---------------------------------------------------------------------------
+#define VMS_MAX_EVENT       16
+typedef struct vms_event_detl
+{
+    AnsiString LINK_ID;
+    AnsiString IFSC_ID;
+    AnsiString VMS_IFSC_ID;
+    AnsiString VMS_IFSC_NM;
+    AnsiString DSPL_STRT_NODE_NM;
+    AnsiString DSPL_END_NODE_NM;
+    AnsiString DETR_ID;
+    AnsiString DSPL_PRRT;
+    AnsiString INCD_OCRR_ID;
+    AnsiString STRT_LCTN_NM;
+    AnsiString END_LCTN_NM;
+    AnsiString OCRR_LCTN_NM;
+    AnsiString VMS_INCD_TYPE_NM;
+    AnsiString VMS_INCD_TYPE_CD;
+    AnsiString VMS_INCD_DETL_NM;
+    AnsiString VMS_INCD_DETL_TYPE_CD;
+    AnsiString CMTR_GRAD_NM;
+    AnsiString CMTR_GRAD_CD;
+    AnsiString INCD_CLSR_LANE;
+    AnsiString INCD_STRT_DT;
+    AnsiString INCD_END_PRAR_DT;
+    AnsiString ROAD_NM;
+    AnsiString SPOT_NM;
+} VMS_EVENT_DETL;
+
+typedef struct vms_event_info
+{
+    int            Count;
+    VMS_EVENT_DETL Unit[VMS_MAX_EVENT];
+} VMS_EVENT_INFO;
+//---------------------------------------------------------------------------
+
+#define VMS_MAX_SCHEDULE    16
+typedef struct vms_schedule_detl
+{
+    int        TRFC_SITU_TYPE_CD;   //VARCHAR2(7)	N			스케줄 유형 코드(0:교통정보,1:돌발,2:공사/행사문안,3:홍보문안,4:우회도로,5:고정스케줄)
+    int        PHASE;               //NUMBER(2)	    N			PHASE
+    AnsiString VMS_FORM_ID;         //NUMBER(5)	    Y			VMS FORM ID
+    AnsiString FRST_VMS_IFSC_ID;    //NUMBER(10)	Y			1단 VMS 정보제공구간 ID
+    AnsiString SECD_VMS_IFSC_ID;    //NUMBER(10)	Y			2단 VMS 정보제공구간 ID
+    AnsiString THIR_VMS_IFSC_ID;    //NUMBER(10)	Y			3단 VMS 정보제공구간 ID
+    AnsiString FOUR_VMS_IFSC_ID;    //NUMBER(10)	Y			4단 VMS 정보제공구간 ID
+    AnsiString FRST_IMG_IFSC_ID;    //NUMBER(10)	Y			1단 이미지 정보제공구간 ID
+    AnsiString SECD_IMG_IFSC_ID;    //NUMBER(10)	Y			2단 이미지 정보제공구간 ID
+    AnsiString THIR_IMG_IFSC_ID;    //NUMBER(10)	Y			3단 이미지 정보제공구간 ID
+    AnsiString FOUR_IMG_IFSC_ID;    //NUMBER(10)	Y			4단 이미지 정보제공구간 ID
+    int        DSPL_HH;             //NUMBER(3)	    Y	0		표출 시간
+    AnsiString VMS_FORM_PRRT_CD;    //VARCHAR2(3)	Y			VMS FORM 우선순위 코드
+
+    AnsiString VMS_IFSC_ID;         //도형식 배경 하단 소통정보 제공구간 ID
+
+    VMS_EVENT_DETL *EVENT;
+} VMS_SCHEDULE_DETL;
+
+typedef struct vms_schedule_info
+{
+    int               Count;
+    VMS_SCHEDULE_DETL Unit[VMS_MAX_SCHEDULE];
+} VMS_SCHEDULE_INFO;
+//---------------------------------------------------------------------------
+
+class TVmsIfsc
+{
+public:
+    TVmsIfsc() {};
+    ~TVmsIfsc(){};
+public:
+    AnsiString VMS_IFSC_ID;         //NUMBER(10)	N			VMS 정보제공구간 ID
+    int        DSPL_PRRT;           //NUMBER(2)	    Y			표출 우선순위
+};
+//---------------------------------------------------------------------------
+
+class TVmsCtlr
+{
+public:
+    TVmsCtlr();
+    ~TVmsCtlr();
+
+private:
+    CRITICAL_SECTION    FCS;
+
+public:
+    PROCESS_INFO    Server;
+    PROCESS_INFO    Client;
+
+    AnsiString      ChangeDate; /* 변경시각 */
+    TThreadList    *pPackQueue; /* 패킷 버퍼 */
+
+public:
+    int         RowNo;
+    int         Id;
+    AnsiString  VmsNo;          /* VMS NO */
+    AnsiString  VmsId;          /* VMS ID */
+    AnsiString  VmsType;        /* VMS종류 */
+    AnsiString  Name;           /* 명칭 */
+    AnsiString  Location;       /* 설치위치 */
+    int         LocalNo;        /* Local번호 */
+    AnsiString  IpAddress;      /* IP Address */
+    AnsiString  WlTelNo;        /* 무선통신연결번호 */
+    AnsiString  WlIp;           /* 무선통신 IP Address */
+    int         WlPort;         /* 무선통신 Port */
+
+    AnsiString  OPER_MODE;      /* 운영 모드 A:Auto, F:Fix */
+
+    AnsiString  ConnectTm;
+    AnsiString  DisconnectTm;
+
+    struct
+    {
+        AnsiString  PowerOnTime;    /* ON TIME */
+	    AnsiString  PowerOffTime;   /* OFF TIME */
+        int         Retry;
+    } MODULE;
+
+    struct
+    {
+        AnsiString  SchTime;
+        int         Value;
+        int         Retry;
+    } LUMINANCE;
+
+    int         VMS_PHSE_CHNG_CYCL;     // NUMBER(3)    Y            VMS 표출면 변경 주기
+    int         VMS_CMNC_ERR_BASS_VAL;  // NUMBER(3)    Y            VMS 통신 오류 기본 값
+    int         FAN_MTNS_TMPR;          // NUMBER(6,3)    Y            팬 동작 온도
+    int         HETR_MTNS_TMPR;         // NUMBER(6,3)    Y            히터 동작 온도
+    int         VMS_MODL_ERR_RATE;      // NUMBER(3)    Y            VMS 모듈 오류 율
+    int         VMS_MODL_CHK_CYCL;      // NUMBER(3)	Y	30		모듈체크주기(초)
+
+    int         VMS_NGHT_BRGH_STEP;     // NUMBER(2)    Y            VMS 야간 휘도 단계
+    int         VMS_WEEK_BRGH_STEP;     // NUMBER(2)    Y            VMS 주간 휘도 단계
+    int         CMNCFAIL_SLOT_NMBR;     // NUMBER(4)    Y    0        통신장애 SLOT 번호
+    int         PWER_FAIL_SLOT_NMBR;    // NUMBER(4)    Y    0        전원 장애 SLOT 번호
+
+    int         VMS_MAX_PHSE_NUM;       // NUMBER(2)    Y            VMS 최대 표출면 개수
+
+    int     WIDTH;
+    int     HEIGHT;
+    int     ModHorCnt;
+    int     ModVerCnt;
+
+    IntMap<TVmsIfsc> FIfscLists;
+
+    VMS_SCHEDULE_INFO  *SCHEDULE;
+    VMS_EVENT_INFO     *INCIDENT;
+    VMS_EVENT_INFO     *EVENT;
+
+    VMS_DOWNLOAD_INFO  *DOWNLOAD;
+    VMS_CONTROL_MODE   *CTLMODE;
+
+    TVmsFormManager    *pForms;
+
+    bool                FSaveState;
+    BYTE                FOldState;
+    INT_VMS_STATE       DSTATE;
+    INT_VMS_STATE       RSTATE;
+
+    bool                FProvide;
+    bool                FModeChange;
+
+    bool                FIsOldProtocol;
+    bool                FIsFtpDownload;
+    bool                FIsProtolFontName;
+    bool                FIsStatusAuto;
+    AnsiString          VmsDownId;
+    bool                FBmpDownload;
+
+    bool                FSymbolDownload;
+
+public:
+    bool         FDispLog;
+    TITSLog     *FSLog;
+    TITSLog     *FCLog;
+
+    void Lock();
+    void UnLock();
+
+};
+//---------------------------------------------------------------------------
+
+class TVmsCtlrManager
+{
+public:
+    TVmsCtlrManager();
+    ~TVmsCtlrManager();
+
+private:
+
+public:
+    unsigned short    Total;
+    unsigned short    Error;
+    unsigned short    Normal;
+    unsigned short    Module;
+
+    ListMap<TVmsCtlr> FLists;
+
+public:
+    int GetCount() { return FLists.Size(); }
+    void InitProvide(bool AProvide=false);
+
+    __property int Count = { read = GetCount };
+};
+//---------------------------------------------------------------------------
+extern TVmsCtlrManager *VmsManager;
+//---------------------------------------------------------------------------
+
+typedef std::map<AnsiString, TVmsCtlr*>::iterator   VmsIterator;
+#ifndef VMS_STL
+#define VMS_STL(_class, _pointer)		for(VmsIterator it=_list.begin(); it!=_list.end(); ++it,  _pointer=(TVmsCtrl*)it->second)
+#if 0
+    VmsIterator it;
+    for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
+    {
+        TVmsCtlr *pObj = (TVmsCtlr*)it->second;
+        pInfo = pObj->DOWNLOAD;
+        InitDownLoadInfo(pInfo);
+    }
+
+#endif
+#endif
+
+bool ChangedState(INT_VMS_STATE *DSTATE, INT_VMS_STATE *RSTATE);
+void InitDownLoadInfo(VMS_DOWNLOAD_INFO *AInfo);
+void InitCtlModeInfo(VMS_CONTROL_MODE *AInfo);
+void EventInit(VMS_EVENT_INFO *AInfo);
+void ScheduleInit(VMS_SCHEDULE_INFO *AInfo);
+
+#endif
+

+ 275 - 0
SRC/CDS/TVmsFormF.cpp

@@ -0,0 +1,275 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "TVmsFormF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+//---------------------------------------------------------------------------
+TVmsFormObj::TVmsFormObj()
+{
+    pImageData   = NULL;
+    pImageStream = NULL;
+    IFSC_ID = NULL;
+}
+//---------------------------------------------------------------------------
+
+TVmsFormObj::~TVmsFormObj()
+{
+    if (pImageData)
+    {
+        pImageData->Picture->Bitmap->FreeImage();
+        pImageData->Picture->Assign(NULL);
+        delete pImageData;
+        pImageData = NULL;
+    }
+    if (pImageStream)
+    {
+        pImageStream->Clear();
+        pImageStream->Position = 0;
+        delete pImageStream;
+        pImageStream = NULL;
+    }
+}
+//---------------------------------------------------------------------------
+void TVmsFormObj::Clear()
+{
+}
+//---------------------------------------------------------------------------
+TImage *TVmsFormObj::NewImage()
+{
+    bool bUnLock = false;
+    try
+    {
+        if (pImageData)
+        {
+            pImageData->Picture->Bitmap->Canvas->Lock();
+            bUnLock = true;
+        }
+        try
+        {
+            if (pImageStream)
+            {
+                pImageStream->Clear();
+                pImageStream->Position = 0;
+            }
+            else
+            {
+                pImageStream = new TMemoryStream();
+            }
+
+            if (pImageData)
+            {
+                pImageData->Picture->Bitmap->FreeImage();
+                pImageData->Picture->Assign(NULL);
+            }
+            else
+            {
+                pImageData = new TImage(NULL);
+            }
+        }
+        catch(Exception &e)
+        {
+        }
+    }
+    __finally
+    {
+        if (bUnLock)
+        {
+            pImageData->Picture->Bitmap->Canvas->Unlock();
+        }
+    }
+
+    return pImageData;
+}
+//---------------------------------------------------------------------------
+
+
+//---------------------------------------------------------------------------
+TVmsForm::TVmsForm()
+{
+    FTotal  = 0;
+
+    SvcRes  = false;
+    FtpRes  = false;
+    FObjects= 0;
+
+    TrfBakImgId = "";
+
+    pCriticalSection = new TCriticalSection();
+
+	pBitmap = new Graphics::TBitmap;
+	pStream = new TMemoryStream();
+}
+//---------------------------------------------------------------------------
+TVmsForm::~TVmsForm()
+{
+    FLists.RemoveAll();
+
+    if (pBitmap)
+    {
+        pBitmap->FreeImage();
+        pBitmap->Assign(NULL);
+        delete pBitmap;
+        pBitmap = NULL;
+    }
+    if (pStream)
+    {
+        pStream->Clear();
+        pStream->Position = 0;
+        delete pStream;
+        pStream = NULL;
+    }
+
+    if (pCriticalSection)
+    {
+        delete pCriticalSection;
+        pCriticalSection = NULL;
+    }
+}
+//---------------------------------------------------------------------------
+void TVmsForm::Clear()
+{
+    //FLists.RemoveAll();
+    SvcRes  = false;
+    FtpRes  = false;
+    FObjects = 0;
+}
+//---------------------------------------------------------------------------
+void TVmsForm::Init(int AWidth, int AHeight)
+{
+    try
+    {
+        pBitmap->PixelFormat = pf4bit;
+        pBitmap->Width = AWidth;
+        pBitmap->Height= AHeight;
+    }
+    catch(Exception &e)
+    {
+    }
+}
+//---------------------------------------------------------------------------
+void TVmsForm::FormClear(TColor ABkColor)
+{
+    try
+    {
+        pBitmap->FreeImage();
+        pBitmap->Assign(NULL);
+
+        pBitmap->PixelFormat = pf4bit;
+        pBitmap->Width = Width;
+        pBitmap->Height= Height;
+
+        pBitmap->Canvas->Pen->Color = clWhite;
+        pBitmap->Canvas->Pen->Width = 0;
+        pBitmap->Canvas->Pen->Style = psClear;
+        pBitmap->Canvas->Brush->Style = bsSolid;
+        pBitmap->Canvas->Brush->Color = ABkColor;
+        pBitmap->Canvas->Rectangle(0, 0, Width+1, Height+1);
+
+        pStream->Clear();
+        pStream->Position = 0;
+    }
+    catch(Exception &e)
+    {
+    }
+}
+//---------------------------------------------------------------------------
+
+TVmsFormObj *TVmsForm::GetItem(int AIdx)
+{
+    TVmsFormObj *pFormObj = FLists.Find(AIdx);
+    return pFormObj;
+}
+//---------------------------------------------------------------------------
+int TVmsForm::AddFormObject(TVmsFormObj *AFormObj)
+{
+    FLists.Push(FObjects++, AFormObj);
+    return FObjects;
+}
+//---------------------------------------------------------------------------
+TVmsFormObj *TVmsForm::AddFormObject()
+{
+    TVmsFormObj *pVmsFormObj = NULL;
+
+    if (FObjects < FTotal)
+    {
+        pVmsFormObj = GetItem(FObjects);
+        FObjects++;
+    }
+    else
+    {
+        pVmsFormObj = new TVmsFormObj();
+        FLists.Push(FTotal++, pVmsFormObj);
+        FObjects++;
+    }
+    return pVmsFormObj;
+}
+//---------------------------------------------------------------------------
+
+
+//---------------------------------------------------------------------------
+//extern TVmsFormManager *VmsFormManager = NULL;
+//---------------------------------------------------------------------------
+
+TVmsFormManager::TVmsFormManager()
+{
+    FTotal   = 0;
+    FObjects = 0;
+}
+//---------------------------------------------------------------------------
+TVmsFormManager::~TVmsFormManager()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+void TVmsFormManager::Clear()
+{
+#ifdef VMS_CLEAR
+    FLists.RemoveAll();
+#else
+    FObjects = 0;
+    FOR_STL(TVmsForm*, pForm, FLists)
+    {
+        pForm->Clear();
+    }
+#endif
+}
+//---------------------------------------------------------------------------
+TVmsForm *TVmsFormManager::GetItem(int AIdx)
+{
+    TVmsForm *pForm = FLists.Find(AIdx);
+    return pForm;
+}
+//---------------------------------------------------------------------------
+int TVmsFormManager::AddForm(TVmsForm *AForm)
+{
+    FLists.Push(FObjects++, AForm);
+    return FObjects;
+}
+//---------------------------------------------------------------------------
+TVmsForm *TVmsFormManager::AddForm()
+{
+    TVmsForm *pVmsForm = NULL;
+
+    if (FObjects < FTotal)
+    {
+        pVmsForm = GetItem(FObjects);
+        FObjects++;
+    }
+    else
+    {
+        pVmsForm = new TVmsForm();
+        pVmsForm->Init(FormWidth, FormHeight);
+        FLists.Push(FTotal++, pVmsForm);
+        FObjects++;
+    }
+    return pVmsForm;
+}
+//---------------------------------------------------------------------------
+
+

+ 143 - 0
SRC/CDS/TVmsFormF.h

@@ -0,0 +1,143 @@
+//---------------------------------------------------------------------------
+
+#ifndef TVmsFormFH
+#define TVmsFormFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <stdio.h>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include <SyncObjs.hpp>
+#include <ExtCtrls.hpp>
+#include <jpeg.hpp>
+#include <GIFimg.hpp>
+#include "LibSTLF.hpp"
+//---------------------------------------------------------------------------
+#include "VitzroCommF.h"
+#include "ITSLogF.h"
+//---------------------------------------------------------------------------
+
+#define MAX_VMS_OBJ_LIST               64     	    /* 최대 VMS 오브젝트 리스트 갯수 */
+
+class TVmsFormObj
+{
+public:
+    TVmsFormObj();
+    ~TVmsFormObj();
+
+public:
+	int         ObjectKind;         /* 객체종류 */
+	int         ObjectType;         /* 객체타입 */
+	int         ObjectSize;         /* 객체크기 */
+	int         IsBlinking;         /* 점멸 여부 */
+	int         PosX;               /* 위치 X */
+	int         PosY;               /* 위치 Y */
+	int         Width;              /* 객체넓이 */
+	int         Height;             /* 객체높이 */
+	int         BkColor;            /* 객체배경색상 */
+	int         TextFontName;       /* 폰트이름 */
+    //TODO
+    AnsiString  StrTextFontName;
+	int         TextFontColor;      /* 폰트색상 */
+	int         TextFontSize;       /* 폰트크기 */
+	int         TextFontBold;       /* 폰트굵기 */
+	int         TextAlign;          /* 문자열정열방식 */
+	AnsiString  TextData;           /* 문자열데이터 */
+	AnsiString  ImageId;            /* 이미지아이디 */
+	AnsiString  ImageType;          /* 이미지 타입 */
+	//int         ObjectId;           /* 폼객체ID */
+    AnsiString  IFSC_ID;
+
+	TImage        *pImageData;      /* 이미지데이터 */
+	TMemoryStream *pImageStream;    /* 이미지데이터 버퍼 */
+
+public:
+    void Clear();
+    TImage *NewImage();
+};
+//---------------------------------------------------------------------------
+
+class TVmsForm
+{
+public:
+    TVmsForm();
+    ~TVmsForm();
+
+public:
+	int         ScenarioSeq;        /* 폼 표출순서 */
+	AnsiString  FormId;             /* 폼 ID */
+	int         DisplayTime;        /* 표출시간(초) */
+	AnsiString  DisplayMode;        /* 표출기능 */
+	AnsiString  DisplayDir;         /* 표출방향 */
+	int         FormKind;           /* 폼 종류 */
+	int         BkColor;            /* 배경색상 */
+
+	int         Width;              /* 폼넓이 */
+	int         Height;             /* 폼높이 */
+
+	bool        SvcRes;             /* 제공결과 */
+	bool        FtpRes;             /* 제공결과 */
+
+    AnsiString  TrfBakImgId;
+
+    TCriticalSection *pCriticalSection;
+
+public:
+    int                 FTotal;
+    int                 FObjects;
+    IntMap<TVmsFormObj> FLists;
+
+    void Lock()   { pCriticalSection->Enter(); }
+    void UnLock() { pCriticalSection->Leave(); };
+
+    int Count() { return FObjects; }
+    int Total() { return FTotal; }
+
+    void Clear();
+    TVmsFormObj *GetItem(int AIdx);
+    int AddFormObject(TVmsFormObj *AFormObj);
+    TVmsFormObj *AddFormObject();
+
+    void Init(int AWidth, int AHeight);
+    void FormClear(TColor ABkColor);
+	Graphics::TBitmap *pBitmap;     /* 이미지데이터 */
+	TMemoryStream     *pStream;     /* 이미지데이터 버퍼 */
+};
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+class TVmsFormManager
+{
+public:
+    TVmsFormManager();
+    ~TVmsFormManager();
+
+private:
+
+public:
+    void Lock() { FLists.Lock(); }
+    void UnLock() { FLists.UnLock(); }
+
+public:
+    int              FormWidth;
+    int              FormHeight;
+
+    int              FTotal;
+    int              FObjects;
+    IntMap<TVmsForm> FLists;
+
+    int Count() { return FObjects; }
+    int Total() { return FTotal; }
+
+    void Clear();
+    TVmsForm *GetItem(int AIdx);
+    int AddForm(TVmsForm *AForm);
+    TVmsForm *AddForm();
+};
+//---------------------------------------------------------------------------
+//extern TVmsFormManager *VmsFormManager;
+//---------------------------------------------------------------------------
+
+
+
+#endif

+ 46 - 0
SRC/CDS/TVmsIfscF.cpp

@@ -0,0 +1,46 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "TVmsIfscF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+//---------------------------------------------------------------------------
+TCDSIfsc::TCDSIfsc()
+{
+    Init();
+}
+//---------------------------------------------------------------------------
+
+TCDSIfsc::~TCDSIfsc()
+{
+}
+//---------------------------------------------------------------------------
+void TCDSIfsc::Init()
+{
+    RGST_DT      = "";
+    CMTR_GRAD_CD = "0";
+    SPED         = 0;
+    TRVL_HH      = 0;
+}
+//---------------------------------------------------------------------------
+
+
+//---------------------------------------------------------------------------
+TCDSIfscManager *IfscManager = NULL;
+//---------------------------------------------------------------------------
+
+TCDSIfscManager::TCDSIfscManager()
+{
+}
+//---------------------------------------------------------------------------
+TCDSIfscManager::~TCDSIfscManager()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+

+ 64 - 0
SRC/CDS/TVmsIfscF.h

@@ -0,0 +1,64 @@
+//---------------------------------------------------------------------------
+
+#ifndef TVmsIfscFH
+#define TVmsIfscFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <stdio.h>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include <SyncObjs.hpp>
+#include <ExtCtrls.hpp>
+#include <jpeg.hpp>
+#include <GIFimg.hpp>
+#include "LibSTLF.hpp"
+//---------------------------------------------------------------------------
+#include "VitzroCommF.h"
+#include "ITSLogF.h"
+//---------------------------------------------------------------------------
+
+
+class TCDSIfsc
+{
+public:
+    TCDSIfsc();
+    ~TCDSIfsc();
+
+public:
+    AnsiString VMS_IFSC_ID;         //NUMBER(10)	N			VMS 정보제공구간 ID
+    AnsiString VMS_IFSC_NM;         //VARCHAR2(60)	Y			VMS 정보제공구간 명
+    AnsiString DSPL_STRT_NODE_NM;   //VARCHAR2(30)	Y			표출 시작 노드 명
+    AnsiString DSPL_END_NODE_NM;    //VARCHAR2(30)	Y			표출 종료 노드 명
+    AnsiString DETR_ID;             //NUMBER(10)	Y			우회도로 ID
+
+    AnsiString ROAD_NM;             //VARCHAR2(30)	Y			도로명
+    AnsiString SPOT_NM;             //VARCHAR2(30)	Y			지점명
+    AnsiString AXIS_YN;             //CHAR(1)	    Y	'N'		축정보 생성용
+
+    AnsiString RGST_DT;             //NVARCHAR2(14)	Y			등록 일시
+    AnsiString CMTR_GRAD_CD;        //NVARCHAR2(7)	Y			소통 등급 코드
+    int        SPED;                //NNUMBER(3)	Y	0		속도
+    int        TRVL_HH;             //NNUMBER(6)	Y	0		통행 시간
+
+public:
+    void Init();
+};
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+class TCDSIfscManager
+{
+public:
+    TCDSIfscManager();
+    ~TCDSIfscManager();
+
+private:
+
+public:
+    ListMap<TCDSIfsc> FLists;
+};
+//---------------------------------------------------------------------------
+extern TCDSIfscManager *IfscManager;
+//---------------------------------------------------------------------------
+
+#endif

+ 243 - 0
SRC/CDS/TVmsImageF.cpp

@@ -0,0 +1,243 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "TVmsImageF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+//---------------------------------------------------------------------------
+TCDSImageCell::TCDSImageCell()
+{
+}
+//---------------------------------------------------------------------------
+
+TCDSImageCell::~TCDSImageCell()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TCDSImage::TCDSImage()
+{
+    pImage  = NULL;
+    pImage  = new TImage(NULL);
+}
+//---------------------------------------------------------------------------
+
+TCDSImage::~TCDSImage()
+{
+    Clear();
+    if (pImage)
+    {
+        delete pImage;
+        pImage = NULL;
+    }
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+void TCDSImage::Clear()
+{
+    if (pImage)
+    {
+        pImage->Picture->Bitmap->FreeImage();
+        pImage->Picture->Assign(NULL);
+    }
+}
+//---------------------------------------------------------------------------
+
+
+//---------------------------------------------------------------------------
+TCDSImageManager *ImageManager = NULL;
+//---------------------------------------------------------------------------
+
+TCDSImageManager::TCDSImageManager()
+{
+}
+//---------------------------------------------------------------------------
+TCDSImageManager::~TCDSImageManager()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+
+
+void AssignBmp(TImage *AImage, TStream *AStream)
+{
+	try
+	{
+		try
+		{
+            AImage->Picture->Bitmap->LoadFromStream(AStream);
+		}
+		catch(...)
+		{
+		}
+	}
+	__finally
+	{
+	}
+}
+//---------------------------------------------------------------------------
+
+void AssignGif(TImage *AImage, TStream *AStream)
+{
+	TGIFImage *pGif = new TGIFImage();
+	try
+	{
+		try
+		{
+			pGif->LoadFromStream(AStream);
+			AImage->Picture->Assign(pGif);
+		}
+		catch(...)
+		{
+		}
+	}
+	__finally
+	{
+		if (pGif) {
+			delete pGif;
+		}
+	}
+}
+//---------------------------------------------------------------------------
+
+void AssignJpg(TImage *AImage, TStream *AStream)
+{
+	TJPEGImage *pJpg = new TJPEGImage();
+	try
+	{
+		try
+		{
+			pJpg->LoadFromStream(AStream);
+			AImage->Picture->Assign(pJpg);
+		}
+		catch(...)
+		{
+		}
+	}
+	__finally
+	{
+		if (pJpg) {
+			delete pJpg;
+		}
+    }
+}
+//---------------------------------------------------------------------------
+
+void SaveToFileBmp(TImage *AImage, AnsiString AFileName)
+{
+	try
+	{
+		try
+		{
+			AImage->Picture->SaveToFile(AFileName);
+		}
+		catch(...)
+		{
+		}
+	}
+	__finally
+	{
+    }
+}
+//---------------------------------------------------------------------------
+
+void SaveToFileGif(TImage *AImage, AnsiString AFileName)
+{
+	TGIFImage *pGif = new TGIFImage();
+	try
+	{
+		try
+		{
+			pGif->Assign(AImage->Picture);
+			pGif->SaveToFile(AFileName);
+		}
+		catch(...)
+		{
+		}
+	}
+	__finally
+	{
+		if (pGif) {
+			delete pGif;
+		}
+    }
+}
+//---------------------------------------------------------------------------
+
+void SaveToFileJpg(TImage *AImage, AnsiString AFileName)
+{
+	TJPEGImage *pJpg = new TJPEGImage();
+	try
+	{
+		try
+		{
+			pJpg->Assign(AImage->Picture);
+			pJpg->SaveToFile(AFileName);
+		}
+		catch(...)
+		{
+		}
+	}
+	__finally
+	{
+		if (pJpg) {
+			delete pJpg;
+		}
+    }
+}
+//---------------------------------------------------------------------------
+
+void SaveToStreamGif(TImage *AImage, TStream *AStream)
+{
+	TGIFImage *pGif = new TGIFImage();
+	try
+	{
+		try
+		{
+			pGif->Assign(AImage->Picture);
+			pGif->SaveToStream(AStream);
+		}
+		catch(...)
+		{
+		}
+	}
+	__finally
+	{
+		if (pGif) {
+			delete pGif;
+		}
+    }
+}
+//---------------------------------------------------------------------------
+
+void SaveToStreamJpg(TImage *AImage, TStream *AStream)
+{
+	TJPEGImage *pJpg = new TJPEGImage();
+	try
+	{
+		try
+		{
+			pJpg->Assign(AImage->Picture->Bitmap);
+			pJpg->SaveToStream(AStream);
+		}
+		catch(...)
+		{
+		}
+	}
+	__finally
+	{
+		if (pJpg) {
+			delete pJpg;
+		}
+    }
+}
+//---------------------------------------------------------------------------
+
+

+ 94 - 0
SRC/CDS/TVmsImageF.h

@@ -0,0 +1,94 @@
+//---------------------------------------------------------------------------
+
+#ifndef TVmsImageFH
+#define TVmsImageFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <stdio.h>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include <SyncObjs.hpp>
+#include <ExtCtrls.hpp>
+#include <jpeg.hpp>
+#include <GIFimg.hpp>
+#include "LibSTLF.hpp"
+//---------------------------------------------------------------------------
+#include "VitzroCommF.h"
+#include "ITSLogF.h"
+//---------------------------------------------------------------------------
+
+// VMS 이미지 타입
+typedef enum en_vms_image_type
+{
+	vms_image_type_bmp,			/* 0:비트맵 */
+	vms_image_type_gif,			/* 1:GIF */
+	vms_image_type_jpg,			/* 2:JPG */
+	vms_image_type_pcx			/* 3:PCX */
+} EN_VMS_IMAGE_TYPE;
+
+//---------------------------------------------------------------------------
+class TCDSImageCell
+{
+public:
+    TCDSImageCell();
+    ~TCDSImageCell();
+
+public:
+    AnsiString SYMBLIB_NMBR;    //NUMBER(4)	    N	0		심벌라이브러리 번호
+    int        CELL_ID;         //NUMBER(4)	    N			셀 ID
+    int        POSX;            //NUMBER(4)	    Y	0		이미지내 셀좌표 X
+    int        POSY;            //NUMBER(4)	    Y	0		이미지내 셀좌표 Y
+    AnsiString VMS_IFSC_ID;     //NUMBER(10)	Y			VMS 정보제공구간 ID
+};
+
+//---------------------------------------------------------------------------
+class TCDSImage
+{
+public:
+    TCDSImage();
+    ~TCDSImage();
+
+public:
+	AnsiString  Nmbr;
+	int         Type;
+    AnsiString  VmsType;
+	TImage     *pImage;
+
+public:
+    IntMap<TCDSImageCell> FLists;
+
+    void Clear();
+};
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+class TCDSImageManager
+{
+public:
+    TCDSImageManager();
+    ~TCDSImageManager();
+
+private:
+
+public:
+    ListMap<TCDSImage> FLists;
+};
+//---------------------------------------------------------------------------
+typedef std::map<AnsiString, TCDSImage*>::iterator   CDSImageItr;
+extern TCDSImageManager *ImageManager;
+//---------------------------------------------------------------------------
+
+extern void AssignBmp(TImage *AImage, TStream *AStream);
+extern void AssignGif(TImage *AImage, TStream *AStream);
+extern void AssignJpg(TImage *AImage, TStream *AStream);
+
+extern void SaveToFileBmp(TImage *AImage, AnsiString AFileName);
+extern void SaveToFileGif(TImage *AImage, AnsiString AFileName);
+extern void SaveToFileJpg(TImage *AImage, AnsiString AFileName);
+
+extern void SaveToStreamGif(TImage *AImage, TStream *AStream);
+extern void SaveToStreamJpg(TImage *AImage, TStream *AStream);
+//---------------------------------------------------------------------------
+
+
+#endif

+ 286 - 0
SRC/COMMON/CommThread.cpp

@@ -0,0 +1,286 @@
+
+//---------------------------------------------------------------------------
+#include "AppGlobalF.h"
+#include "CommThread.h"
+#include "DMCOMMF.h"
+#include "FrmSysLogF.h"
+#include "VmsPasigProtocolF.h"
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+//---------------------------------------------------------------------------
+
+//   Important: Methods and properties of objects in VCL can only be
+//   used in a method called using Synchronize, for example:
+//
+//      Synchronize(UpdateCaption);
+//
+//   where UpdateCaption could look like:
+//
+//      void __fastcall TCommThread::UpdateCaption()
+//      {
+//        Form1->Caption = "Updated in a thread";
+//      }
+//---------------------------------------------------------------------------
+
+/*
+ * 스레드 생성자
+ *  arguments
+ *   void
+ *  return
+ *   void
+ */
+__fastcall TCommThread::TCommThread(bool CreateSuspended)
+    : TThread(CreateSuspended)
+{
+    TCommThread();
+}
+//---------------------------------------------------------------------------
+
+/*
+ * 스레드 초기화
+ *  arguments
+ *   void
+ *  return
+ *   void
+ */
+__fastcall TCommThread::TCommThread(void)
+    : TThread(true)
+{
+    Priority = tpNormal;
+    FreeOnTerminate = true;
+    Resume();
+}
+//---------------------------------------------------------------------------
+
+/*
+ * 스레드 소멸자
+ *  arguments
+ *   void
+ *  return
+ *   void
+ */
+__fastcall TCommThread::~TCommThread(void)
+{
+
+}
+//---------------------------------------------------------------------------
+
+/*
+ * 스레드 실행
+ *  arguments
+ *   void
+ *  return
+ *   void
+ */
+void __fastcall TCommThread::Execute()
+{
+    MSG msg;
+    int result;
+
+    ::CoInitialize(NULL);
+
+    NameThreadForDebugging("CommThread");
+
+    while(!Terminated)
+    {
+        try
+        {
+            if (GetMessage(&msg, NULL, 0, 0) == 0)
+            {
+                Terminate();
+            }
+            else
+            {
+                result = SYS_ERR_NONE;
+
+                try
+                {
+                    DisplayMsg(msg.message);
+
+                    if (msg.message != WM_THREAD_TERMINATE)
+                    {
+                        if (!DMCOMM->DbConnect(g_AppCfg.db.sConnectStr))
+                        {
+                            result = SYS_ERR_DATABASE;
+                        }
+                    }
+                    if (result == SYS_ERR_NONE)
+                    {
+                        switch (msg.message)
+                        {
+                        case WM_DATABASE_REFLASH:
+                            //result = DMCOMM->GetDbSysdate();
+                            break;
+                        case WM_PROCESS_STATE:
+                            result = DMCOMM->SaveProcessStateProc();
+                            break;
+                        case WM_EQUIP_STATE_ALL:
+                            result = DMCOMM->SaveEquipStateAllProc();
+                            break;
+                        case WM_EQUIP_STATE:
+                            result = DMCOMM->SaveEquipStateProc((TVmsCtlr*)msg.wParam, msg.lParam);
+                            break;
+                            break;
+                        case WM_GET_ONOFF:
+                            result = DMCOMM->LoadVmsOnOffTime();
+                            //result = DMCOMM->GetVmsLuminanceTime();
+                            break;
+                        case WM_DOWNLOAD_PROC:
+                            result = DMCOMM->GetVmsDownLoadInfo();
+                            break;
+                        case WM_MASTER_IMAGE_SYMBOL:
+                        case WM_MASTER_IMAGE_TRAFFIC:
+                            result = DMCOMM->GetVmsImage();
+                            break;
+                        case WM_MASTER_FORM:
+                            result = DMCOMM->LoadVmsForm();
+                            break;
+                        case WM_MASTER_VMS_IFSC:
+                            result = DMCOMM->GetVmsIfscInfo();
+                            break;
+                        case WM_DATA_SAVE:
+                            //result = DMCOMM->DataSaveProc((void *)msg.wParam);
+                            break;
+                        case WM_PROVIDE_PROC:
+                            result = DMCOMM->ProvideProc((void *)msg.wParam);
+                            break;
+                        case WM_SAVE_DOWNLOAD_FORM:
+                            result = DMCOMM->SaveVmsDownloadForm();
+                            break;
+                        case WM_PROVIDE_SAVE:
+                            result = DMCOMM->ProvideSave((void *)msg.wParam);
+                            break;
+                        case WM_THREAD_TERMINATE:
+                            Terminate();
+                            break;
+                        }
+                    }
+                }
+                catch(Exception &e)
+                {
+                    result = SYS_ERR_DATABASE;
+                }
+
+                if (msg.message == WM_PROVIDE_PROC)
+                {
+                    SendMessage((HWND)g_AppCfg.lMainWinHandle, WM_USER, WM_MAKE_DOWNLOAD_FORM, 0);
+                }
+
+                if (msg.message != WM_THREAD_TERMINATE)
+                {
+                    if (result == SYS_ERR_NONE)
+                    {
+                        DMCOMM->DbState(true);
+                    }
+                    else
+                    {
+                        DMCOMM->DbState(false);
+                        LERROR("result error: [%X] %d", msg.message, result);
+                    }
+                    DMCOMM->DbClose();
+                }
+            }
+        }
+        catch(Exception &e)
+        {
+        }
+    }
+
+    if (g_SysInfo->State.hFinishEvent != NULL)
+    {
+        SetEvent(g_SysInfo->State.hFinishEvent);
+    }
+
+    ::CoUninitialize();
+}
+//---------------------------------------------------------------------------
+
+void TCommThread::DisplayMsg(unsigned int AMsg)
+{
+    AnsiString sMsg = "";
+    switch (AMsg)
+    {
+    case WM_DATABASE_REFLASH:       sMsg = "WM_DATABASE_REFLASH";               break;
+    case WM_PROCESS_STATE:          sMsg = "WM_PROCESS_STATE";                  break;
+    case WM_EQUIP_STATE_ALL:        sMsg = "WM_EQUIP_STATE_ALL";                break;
+    case WM_EQUIP_STATE:            sMsg = "WM_EQUIP_STATE";                    break;
+    case WM_MASTER_FORM:            sMsg = "WM_MASTER_FORM";                    break;
+    case WM_MASTER_IMAGE_SYMBOL:    sMsg = "WM_MASTER_IMAGE_SYMBOL";            break;
+    case WM_MASTER_IMAGE_TRAFFIC:   sMsg = "WM_MASTER_IMAGE_TRAFFIC";           break;
+    case WM_MASTER_VMS_IFSC:        sMsg = "WM_MASTER_VMS_IFSC";                break;
+    case WM_DATA_SAVE:              sMsg = "WM_DATA_SAVE";                      break;
+    case WM_GET_ONOFF:              sMsg = "WM_GET_ONOFF";                      break;
+    case WM_PROVIDE_PROC:           sMsg = "WM_PROVIDE_PROC";                   break;
+    case WM_SAVE_DOWNLOAD_FORM:     sMsg = "WM_SAVE_DOWNLOAD_FORM";             break;
+    case WM_PROVIDE_SAVE:           sMsg = "WM_PROVIDE_SAVE";                   break;
+    case WM_DOWNLOAD_PROC:          sMsg = "WM_DOWNLOAD_PROC";                  break;
+    case WM_THREAD_TERMINATE:       sMsg = "WM_THREAD_TERMINATE";               break;
+    default:                        sMsg.printf("UNKNOWN MESSAGE: %02X", (BYTE)(AMsg-WM_USER));   break;
+    }
+
+    LDEBUG("%s", sMsg.c_str());
+}
+//---------------------------------------------------------------------------
+
+int TCommThread::LogWrite(int ALogKind, char *AFmt, ...)
+{
+    va_list     ap;
+    int         cnt = 0;
+    char        szFmtData[MAX_LOG_BUFFER];
+    AnsiString  sLogKind;
+    int         nStep = 0;
+
+    bool bLog = false;
+    switch(ALogKind)
+    {
+    case eLOG_INFO   : bLog = g_LogCfg.Info;    sLogKind = " [INF] "; break;
+    case eLOG_DATA   : bLog = g_LogCfg.Data;    sLogKind = " [DAT] "; break;
+    case eLOG_ERROR  : bLog = g_LogCfg.Error;   sLogKind = " [ERR] "; break;
+    case eLOG_WARNING: bLog = g_LogCfg.Warning; sLogKind = " [WAN] "; break;
+    case eLOG_DEBUG  : bLog = g_LogCfg.Debug;   sLogKind = " [DBG] "; break;
+    case eLOG_DETAIL : bLog = g_LogCfg.Detail;  sLogKind = " [DET] "; break;
+    }
+    if (!bLog) return -1;
+
+    try
+    {
+        va_start(ap, AFmt);
+        cnt = vsprintf(szFmtData, AFmt, ap);
+        va_end(ap);
+
+        nStep = 1;
+        ITSLog->LogWrite(NULL, ALogKind, szFmtData);
+
+        nStep = 2;
+        //IPC_LOG_MESSAGE *pLog = new IPC_LOG_MESSAGE;
+        IPC_LOG_MESSAGE *pLog = &FLogMsg;//(IPC_LOG_MESSAGE *)malloc(sizeof(IPC_LOG_MESSAGE));
+        if (pLog)
+        {
+            pLog->Kind = ALogKind;
+            pLog->Flag = 0;
+            pLog->Len  = strlen(szFmtData);
+            pLog->Tm   = Now();
+            memset(pLog->Msg, 0x00, sizeof(pLog->Msg));
+            sprintf(pLog->Msg, "%sTHRD %s", sLogKind.c_str(), szFmtData);
+
+        	DWORD   dwResult = 0;
+            LRESULT lResult = SEND_LOGMSG(FrmSysLog->Handle, WM_LOG_DISPLAY, pLog, NULL, SMTO_NORMAL, 2000, dwResult);
+            if (lResult == 0)
+            {
+                dwResult = GetLastError();
+                if (dwResult == ERROR_TIMEOUT)
+                {
+                }
+                //SAFE_DELETE(pLog);
+            }
+        }
+    }
+    catch(Exception &e)
+    {
+        LERROR("LogWrite: %d", nStep);
+    }
+    return cnt;
+}
+//---------------------------------------------------------------------------
+
+

+ 27 - 0
SRC/COMMON/CommThread.h

@@ -0,0 +1,27 @@
+
+//---------------------------------------------------------------------------
+#ifndef CommThreadH
+#define CommThreadH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include "ITSLogF.h"
+//---------------------------------------------------------------------------
+class TCommThread : public TThread
+{
+private:
+
+protected:
+    void __fastcall Execute();
+
+public:
+    __fastcall TCommThread(void);
+    __fastcall TCommThread(bool CreateSuspended);
+    __fastcall ~TCommThread(void);
+
+    void DisplayMsg(unsigned int AMsg);
+
+    IPC_LOG_MESSAGE FLogMsg;
+    int LogWrite(int ALogKind, char *AFmt, ...);
+};
+//---------------------------------------------------------------------------
+#endif

+ 1686 - 0
SRC/COMMON/VMSCThread.cpp

@@ -0,0 +1,1686 @@
+
+//---------------------------------------------------------------------------
+#include "AppGlobalF.h"
+#include "VMSCThread.h"
+#include "FrmSysLogF.h"
+#include "FrmVmsInfoF.h"
+#include "FrmVmsLogF.h"
+#include <winsock.h>
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+//---------------------------------------------------------------------------
+
+//   Important: Methods and properties of objects in VCL can only be
+//   used in a method called using Synchronize, for example:
+//
+//      Synchronize(&UpdateCaption);
+//
+//   where UpdateCaption could look like:
+//
+//      void __fastcall TVMSCThread::UpdateCaption()
+//      {
+//        Form1->Caption = "Updated in a thread";
+//      }
+//---------------------------------------------------------------------------
+
+#define     VMSID   FVmsObj->VmsId
+
+/*
+ * 스레드 생성자
+ *  arguments
+ *   void
+ *  return
+ *   void
+ */
+ __fastcall TVMSCThread::TVMSCThread(bool CreateSuspended, int Tag, bool *ActiveIndicator)
+	: TThread(CreateSuspended)
+{
+    try
+    {
+        FUserTerm = false;
+
+        FVmsObj  = (TVmsCtlr*)Tag;
+        FLogFile = FVmsObj->FCLog;
+
+        ThreadActiveIndicator = ActiveIndicator;
+       *ThreadActiveIndicator = true;
+
+        // 정보 초기화
+        ClientInitInfo();
+
+        TcpClient = new TTcpClient(NULL);
+
+		TcpClient->RemoteHost = FVmsObj->IpAddress;
+		TcpClient->RemotePort = FVmsObj->LocalNo;
+        TcpClient->BlockMode  = bmBlocking;
+
+        TcpClient->OnConnect       = TcpClientConnect;
+        TcpClient->OnCreateHandle  = TcpClientCreateHandle;
+		TcpClient->OnDestroyHandle = TcpClientDestroyHandle;
+        TcpClient->OnDisconnect    = TcpClientDisconnect;
+		TcpClient->OnError         = TcpClientError;
+		TcpClient->OnReceive       = TcpClientReceive;
+		TcpClient->OnSend          = TcpClientSend;
+
+        Priority        = tpNormal;
+        FreeOnTerminate = true;
+		Resume();
+    }
+    catch(Exception &e)
+    {
+        SERROR("Thread Init Error");
+        Terminate();
+	}
+}
+//---------------------------------------------------------------------------
+
+/*
+ * 스레드 소멸자
+ *  arguments
+ *   void
+ *  return
+ *   void
+ */
+__fastcall TVMSCThread::~TVMSCThread()
+{
+    try
+    {
+        FVmsObj->Client.Status = process_fail;
+    	SAFE_DELETE(TcpClient);
+    }
+    catch(Exception &e)
+    {
+    }
+	*ThreadActiveIndicator = false;
+}
+//---------------------------------------------------------------------------
+
+/*
+ * 연결 이벤트 핸들러
+ *  arguments
+ *   void
+ *  return
+ *   void
+ */
+void __fastcall TVMSCThread::TcpClientConnect(TObject *Sender)
+{
+    SINFO("Server Connect  ok: %s %s", TcpClient->RemoteHost.c_str(), TcpClient->RemotePort.c_str());
+
+    ClientInitInfo();
+
+    FVmsObj->Client.Comm   = state_open;
+	FVmsObj->Client.Status = process_run;
+
+    FVmsObj->ConnectTm = Now().DateTimeString();
+    FVmsObj->Server.Status = process_run;
+    POST_MSG(MAINHANDLE, WM_VMS_THREAD, WM_VMS_SERVER_STTS, (int)FVmsObj);
+
+    POST_MSG(MAINHANDLE, WM_VMS_THREAD, WM_VMS_CLIENT_STTS, (int)FVmsObj);
+}
+//---------------------------------------------------------------------------
+
+/*
+ * 연결 해제 이벤트 핸들러
+ *  arguments
+ *   void
+ *  return
+ *   void
+ */
+void __fastcall TVMSCThread::TcpClientDisconnect(TObject *Sender)
+{
+    FVmsObj->Client.Comm   = state_close;
+	FVmsObj->Client.Status = process_run;
+    m_pState->Comm = vms_error;
+
+    FVmsObj->DisconnectTm = Now().DateTimeString();
+    FVmsObj->Server.Status == process_fail;
+
+    //POST_MSG(MAINHANDLE, WM_VMS_THREAD, WM_VMS_CLIENT_STTS, (int)FVmsObj);
+    SINFO("Server Disconnect: %s %s", TcpClient->RemoteHost.c_str(), TcpClient->RemotePort.c_str());
+
+    POST_MSG(MAINHANDLE, WM_VMS_THREAD, WM_VMS_SERVER_STTS, (int)FVmsObj);
+}
+//---------------------------------------------------------------------------
+
+/*
+ * 핸들 생성 이벤트 핸들러
+ *  arguments
+ *   void
+ *  return
+ *   void
+ */
+void __fastcall TVMSCThread::TcpClientCreateHandle(TObject *Sender)
+{
+    //LDEBUG("Thread Create Handle");
+}
+//---------------------------------------------------------------------------
+
+/*
+ * 핸들 소멸 이벤트 핸들러
+ *  arguments
+ *   void
+ *  return
+ *   void
+ */
+void __fastcall TVMSCThread::TcpClientDestroyHandle(TObject *Sender)
+{
+    //LDEBUG("Thread Destroy Handle");
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TVMSCThread::Close(void)
+{
+    try
+    {
+        FVmsObj->Client.Status == process_fail;
+        if (TcpClient)
+        {
+            //if (TcpClient->Connected)
+            {
+                TcpClient->Close();
+                //Sleep(3000);
+            }
+        }
+    }
+    catch(Exception &e)
+    {
+    }
+}
+//---------------------------------------------------------------------------
+
+/*
+ * 에러 처리 이벤트 핸들러
+ *  arguments
+ *   void
+ *  return
+ *   void
+ */
+void __fastcall TVMSCThread::TcpClientError(TObject *Sender, int SocketError)
+{
+    LPVOID lpMsgBuf = NULL;
+
+    try
+    {
+        try
+        {
+            FormatMessage(
+                FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
+                NULL,
+                //GetLastError(),
+                //MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
+                SocketError,
+                MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT),
+                (LPTSTR) &lpMsgBuf,
+                0,
+                NULL
+            );
+
+            char *pData = (char*)lpMsgBuf;
+            if (strlen(pData) > 2)
+            {
+                pData[strlen(pData)-2] = 0x00;
+                pData[strlen(pData)-1] = 0x00;
+            }
+            SERROR("SocketError: (%d: %s)", SocketError, pData);
+        }
+        __finally
+        {
+            if (lpMsgBuf) LocalFree(lpMsgBuf);
+            lpMsgBuf = NULL;
+        }
+    }
+    catch(Exception &e)
+    {
+    }
+
+    Close();
+}
+//---------------------------------------------------------------------------
+
+/*
+ * 데이터 수신 이벤트 핸들러
+ *  arguments
+ *   void
+ *  return
+ *   void
+ */
+void __fastcall TVMSCThread::TcpClientReceive(TObject *Sender, char *Buf, int &DataLen)
+{
+    //LDEBUG("VMS Client Receive: %s, %d", VMSID.c_str(), DataLen);
+}
+//---------------------------------------------------------------------------
+
+/*
+ * 데이터 송신 이벤트 핸들러
+ *  arguments
+ *   void
+ *  return
+ *   void
+ */
+void __fastcall TVMSCThread::TcpClientSend(TObject *Sender, char *Buf, int &DataLen)
+{
+    //LDEBUG("VMS Client Send: %s, %d", VMSID.c_str(), DataLen);
+}
+//---------------------------------------------------------------------------
+
+bool __fastcall TVMSCThread::SocketActivity(bool &AError)
+{
+    bool Error, ReadReady, WriteReady, ExcepFlag;
+
+    ReadReady = false;
+    AError = false;
+
+    if (!TcpClient) return ReadReady;
+
+    try
+    {
+        Error = TcpClient->Select(&ReadReady, &WriteReady, &ExcepFlag, 0);
+        if ((Error == false))// || (ExcepFlag == true)) //exception flag == o.o.b(out of band data receive)
+        {
+            AError = true;
+            ReadReady = false;
+        }
+    }
+    catch(Exception &e)
+    {
+        AError = true;
+        ReadReady = false;
+    }
+    return ReadReady;
+}
+//---------------------------------------------------------------------------
+
+bool __fastcall TVMSCThread::SocketActivity()
+{
+    bool bResult = false;
+    bool Error, ReadReady, WriteReady, ExcepFlag;
+
+    if (!TcpClient) return bResult;
+
+    try
+    {
+        Error = TcpClient->Select(&ReadReady, &WriteReady, &ExcepFlag, 0);
+
+        if ((Error == false) || (ReadReady == true) || (ExcepFlag == true))
+        {
+            bResult = true;
+        }
+    }
+    catch(Exception &e)
+    {
+    }
+    return bResult;
+}
+//---------------------------------------------------------------------------
+
+/*
+ * 클라이언트 정보 초기화 루틴
+ *  arguments
+ *   void
+ *  return
+ *   void
+ */
+void __fastcall TVMSCThread::ClientInitInfo(void)
+{
+    m_RxLen          = 0;
+    m_rcvPacketTimer = Now();
+	m_WatchDogTimer  = Now();
+
+    m_pVmsFormList    = FVmsObj->pForms;
+    m_pState          = &FVmsObj->RSTATE;
+
+	FClient.State = CT_IDLE;
+
+    FClient.IpAddress = FVmsObj->IpAddress;
+	FClient.Port      = FVmsObj->LocalNo;
+    FClient.Addr      = FVmsObj->Id;
+    FClient.VmsId     = FVmsObj->VmsId;
+	FClient.TimeOut   = g_AppCfg.comm.nCmdTimeOut;
+
+    FClient.pollingCycleTime = g_AppCfg.comm.nPollingTime;
+	FClient.reqStatusTimer   = Now() - ITSCOMM_SECTIME(FClient.pollingCycleTime+10);
+
+	FClient.sendRetry      = VMS_MAX_RETRY_COUNT;
+	FClient.sendTimer      = Now();
+
+	//m_strName.sprintf("VMSC%03d", FClient.Addr);
+	m_strName = "VMSC" + FVmsObj->VmsId;
+
+	FClient.LocalCenterId = "";
+	FClient.CenterId      = "";
+	FClient.LocalDomainNm = g_AppCfg.comm.sLocalDomain;
+	FClient.DomainNm      = FClient.VmsId;
+	FClient.UserName      = g_AppCfg.comm.sLoginUser;
+	FClient.UserPasswd    = g_AppCfg.comm.sLoginPswd;
+
+	FClient.MaxHeartbeatTime = VMS_MAX_HEARTBEAT_TIME;
+	FClient.DatagramSize     = VMS_MAX_DATAGRAM_SIZE;
+
+    m_DataPacketNumber   = 0;
+	m_SubscribeSerialNbr = 0;
+
+
+	FLocalCmd.GeneralStatus = false;
+	FLocalCmd.ModuleStatus  = false;
+	FLocalCmd.PowerStatus   = false;
+	FLocalCmd.ScreenDataStatusMessage = false;
+	FLocalCmd.RealTimeDisplayMessage  = false;
+
+    m_pState->Comm = vms_error;
+
+#if 0
+	if (m_pState != NULL)
+	{
+		m_pState->Cpsw.Enable = bit_enable;
+		m_pState->CollectDate = Now().FormatString("yyyymmddhhnnss");
+
+		m_pState->Door             = STATE_UNKNOWN;
+		m_pState->Heater           = STATE_UNKNOWN;
+		m_pState->Fan              = STATE_UNKNOWN;
+		m_pState->ModuleState      = STATE_UNKNOWN;
+		m_pState->Power            = STATE_UNKNOWN;
+		m_pState->Temp             = 0;
+		m_pState->Bright           = 0;
+		m_pState->ModuleHorizontal = 0;
+		m_pState->ModuleVertical   = 0;
+		m_pState->PowerCount       = 0;
+		memset(m_pState->ModuleStatus, STATE_UNKNOWN, sizeof(m_pState->ModuleStatus));
+		memset(m_pState->PowerStatus,  STATE_UNKNOWN, sizeof(m_pState->PowerStatus));
+	}
+#endif
+
+    InitRx();
+
+    LINFO("ClientInitInfo ok");
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TVMSCThread::InitRx()
+{
+    m_RxPktLen  = 0;
+    m_RxLen     = 0;
+    m_RxState   = RX_STX;
+
+    memset(m_RxBuff, 0x00, sizeof(m_RxBuff));
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TVMSCThread::ClientTerminate(void)
+{
+    try
+    {
+        FVmsObj->Client.Comm   = state_close;
+    	FVmsObj->Client.Status = process_fail;
+
+		FVmsObj->Client.pThread         = NULL;
+		FVmsObj->Client.ActiveIndicator = false;
+
+        //POST_MSG(MAINHANDLE, WM_VMS_THREAD, WM_VMS_CLIENT_STTS, (int)FVmsObj);
+        SINFO("Thread stop");
+    }
+    catch(Exception &e)
+    {
+    }
+}
+//---------------------------------------------------------------------------
+
+int HexArr2BinArr(unsigned char *AHexData, unsigned char *AResult)
+{
+    //TODO: 결과를 리턴할 메모리의 크기는 체크하지 않음
+
+    int                  nLen   = 0;
+    unsigned const char *pos    = AHexData;
+    char                *endptr = NULL;
+    int                  count  = (strlen(AHexData) / 2);
+
+    if ((AHexData[0] == NULL) || (strlen(AHexData) % 2))
+    {
+        //데이터가 없거나 길이가 짝수가 아닌경우
+        return -2;
+    }
+
+    for(int ii = 0; ii < count; ii++)
+    {
+        char buf[5] = {'0', 'x', pos[0], pos[1], 0};
+        AResult[nLen++] = (unsigned char)strtol(buf, &endptr, 0);
+        pos += 2 * sizeof(char);
+
+        if (endptr[0] != '\0') {
+            //Hex 문자열이 아님
+            return -1;
+        }
+    }
+
+#if 0
+    BYTE     chn, cln, val;
+
+    chn = (BYTE)szData[0];
+    cln = (BYTE)szData[1];
+
+    hn = chn > '9' ? chn - 'A' + 10 : chn - '0';
+    ln = cln > '9' ? cln - 'A' + 10 : cln - '0';
+
+    val = (BYTE)((hn << 4 ) | ln);
+    RxBuff[RxLen] = val;
+#endif
+
+    return nLen;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TVMSCThread::Execute()
+{
+    BYTE rcvBuff[DEFAULT_TCP_PACKET_MAX_SIZE];
+    int  rcvLen;
+    int  nError;
+	int  nResult;
+    bool bError;
+
+    //static bool first = true;
+    try
+    {
+		NameThreadForDebugging(m_strName);
+
+FErrLine = 0;
+        SINFO("Thread start");
+        try
+        {
+            while (!Terminated && !FUserTerm && !g_AppCfg.bThrExit)
+            {
+                FVmsObj->Client.Status = process_run;
+                m_pState->Comm = vms_error;
+
+                SINFO("Server connect try: %s.%s", TcpClient->RemoteHost.c_str(), TcpClient->RemotePort.c_str());
+                TcpClient->Open();
+
+                bError = false;
+
+                while (!Terminated && TcpClient->Connected && !FUserTerm && !g_AppCfg.bThrExit)
+                {
+                    m_pState->Comm = vms_normal;
+                    try
+                    {
+                        if (SYS_ERR_OFFLINE == ClientStateMachine())
+                        {
+                            if (FClient.State == CT_CLOSE)
+                            {
+                                break;
+                            }
+                        }
+
+                        bError = false;
+                        if (TcpClient->WaitForData(100) || SocketActivity())
+                        {
+                            bError = false;
+
+                            memset(rcvBuff, 0, sizeof(rcvBuff));
+                            rcvLen = TcpClient->ReceiveBuf(rcvBuff, sizeof(rcvBuff));
+                            if (rcvLen > 0)
+                            {
+                                if ((nResult = RecvPacket(rcvBuff, rcvLen)) != SYS_ERR_NONE)
+                                {
+                                    ProcErrorState(true, nResult);
+                                }
+                            }
+                            else
+                            {
+                                bError = true;
+                            }
+                        }
+                        if (bError)
+                        {
+                            SERROR("Socket Error[Closed]....");
+                            nError = -3;
+                            Close();
+                        }
+
+                        if (FVmsObj->Server.Status != process_run)
+                        {
+                            nError = -4;
+                            Close();
+                        }
+                    }
+                    catch(Exception &e)
+                    {
+                        SERROR("Thread execute exception: %s, Line: %d", AnsiString(e.Message).c_str(), FErrLine);
+                        nError = -2;
+                        Close();
+                    }
+                }
+
+                if (FClient.State == CT_CLOSE || FUserTerm || g_AppCfg.bThrExit)
+                {
+                    nError = 0;
+                    SINFO("Thread exit catched....2");
+                    Close();
+                    break;
+                }
+
+                if (FVmsObj->Client.Status != process_stop)
+                {
+                    Sleep(g_AppCfg.comm.nConnectWait * 1000);
+                }
+            }
+            SERROR("Term: %d, Conn: %d, Err: %d, Line: %d, AppExit: %d, UserTerm: %d",
+                   Terminated, TcpClient->Connected, nError, FErrLine, g_AppCfg.bThrExit, FUserTerm);
+        }
+		__finally
+        {
+            TcpClient->Close();
+            Terminate();
+            FUserTerm = false;
+        }
+    }
+    catch(Exception &e)
+    {
+        SERROR("Thread execute error: %s", AnsiString(e.Message).c_str());
+        Terminate();
+    }
+    m_pState->Comm = vms_error;
+    ClientTerminate();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TVMSCThread::DebugState()
+{
+	switch(FClient.State)
+    {
+    case 1: break;
+    default: break;
+    }
+}
+//---------------------------------------------------------------------------
+
+bool __fastcall TVMSCThread::IsCommandTimeout()
+{
+    // 마지막 전송시각이 타임아웃 시각보다 큰경우
+    return CommUtil_TimeDiff(FClient.sendTimer) > FClient.TimeOut ? true : false;
+}
+//---------------------------------------------------------------------------
+
+/*
+ * 클라이언트 상태에 따른 처리
+ *  arguments
+ *   void
+ *  return
+ *   void
+ */
+int __fastcall TVMSCThread::ClientStateMachine(void)
+{
+FErrLine = 13;
+    int  result;
+	bool bRequest;
+
+    result = SYS_ERR_NONE;
+
+    // CMDTIMEOUT 체크
+    // 현재 수신데이터가 있고 마지막 수진시각이 타임아웃보다 크면
+    // 수신 타임아웃으로 처리한다.
+	if (m_RxLen && (CommUtil_TimeDiff(m_rcvPacketTimer) > FClient.TimeOut))
+    {
+        InitRx();
+		m_RxLen = 0;
+        ProcErrorState(true, SYS_ERR_RECEIVE_TIMEOUT);
+        return result;
+	}
+
+    DebugState();
+
+	switch(FClient.State)
+    {
+	case CT_CLOSE:
+        LERROR("STATE: CT_CLOSE");
+        Terminate();
+        result = SYS_ERR_OFFLINE;
+		break;
+
+	case CT_IDLE:
+        FClient.reqStatusTimer = Now() - ITSCOMM_SECTIME(CLIENT_CONNECT_RETRY_TIME - CLIENT_CHANGE_TIME);
+        FClient.State = CT_SECTION;
+		break;
+
+    case CT_SECTION:
+#if 0
+        if (CommUtil_TimeDiff(m_WatchDogTimer) > g_AppCfg.comm.nWatchDogTime)
+        {
+			LERROR("STATE: ST_SECTION - WatchDog Time over");
+
+			FClient.State = CT_CLOSE;
+            break;
+        }
+#endif
+
+		if (CommUtil_TimeDiff(FClient.reqStatusTimer) > FClient.pollingCycleTime)
+        {
+			FClient.reqStatusTimer = Now();
+
+			FLocalCmd.GeneralStatus = false;
+			FLocalCmd.ModuleStatus  = false;
+			FLocalCmd.PowerStatus   = false;
+		}
+        FClient.State = CT_LOCAL_COMMAND;
+		break;
+
+	case CT_LOCAL_COMMAND:
+        result = CheckLocalData(bRequest);
+        if (bRequest)
+        {
+            if (result == SYS_ERR_NONE) FClient.State = CT_LOCAL_WAIT;
+            else
+            {
+                if (--FClient.sendRetry <= 0) FClient.State = CT_CLOSE;
+            }
+        }
+        else FClient.State = CT_CLIENT_COMMAND;
+
+        break;
+
+    case CT_CLIENT_COMMAND:
+        result = CheckClientData(bRequest);
+		if (bRequest)
+        {
+            if (result == SYS_ERR_NONE) FClient.State = CT_CLIENT_WAIT;
+            else
+            {
+                if (--FClient.sendRetry <= 0) FClient.State = CT_CLOSE;
+            }
+        }
+        else FClient.State = CT_SECTION;
+
+        break;
+
+	case CT_CLIENT_WAIT:
+	case CT_LOCAL_WAIT:
+		if (IsCommandTimeout())
+		{
+            // Local Command에 대한 타임아웃이 발생한 경우
+			if (FClient.sendRetry > 0)
+            {
+                // 타임아웃 카운트 보다 작을 경우 Command를 전송한다.
+                if (FClient.State == CT_CLIENT_WAIT) FClient.State = CT_CLIENT_COMMAND;
+                else
+                if (FClient.State == CT_LOCAL_WAIT) FClient.State = CT_LOCAL_COMMAND;
+			}
+            else
+            {
+                // 타임아웃 카운트 보다 큰 경우 종료
+				FClient.State = CT_CLOSE;
+			}
+		}
+		break;
+
+    default:
+		FClient.State = CT_IDLE;
+        break;
+    }
+
+    if (result)
+    {
+        ProcErrorState(false, result);
+    }
+
+    return result;
+}
+//---------------------------------------------------------------------------
+
+/*
+ *  프로세스 자체(주기)적으로 VMS로 전송(요청)되어야 할 패킷이 있는지 확인하고 처리한다.
+ *  arguments
+ *   void
+ *  return
+ *   void
+ */
+int __fastcall TVMSCThread::CheckLocalData(bool &ARequest)
+{
+	int              result = SYS_ERR_NONE;
+	COMMAND_ARGUMENT arg;
+
+	memset(&arg,  0x00, sizeof(arg));
+
+    FLocalCmd.OpCode           = 0x00;
+	FLocalCmd.obj              = OBJ_None;  /* EN_OBJECT_ID */
+	FLocalCmd.DataPacketNumber = 0;         /* DataPacket Number */
+    FLocalCmd.Idx              = 0;
+
+    ARequest = true;
+
+    /* 상태정보 요청 확인 */
+	if (FLocalCmd.GeneralStatus == false)
+    {
+        //LINFO("**** REQ_VMS_STATUS");
+		arg.Subscription.nbr   = NBR_GENERAL_STATUS;
+		//arg.Subscription.mode  = SubscriptionMode_PR_single;
+		arg.Subscription.delay = 60;
+		arg.Subscription.obj   = OBJ_GeneralStatus;
+
+        FLocalCmd.OpCode           = REQ_VMS_STATUS;
+		FLocalCmd.obj              = OBJ_GeneralStatus;
+		FLocalCmd.DataPacketNumber = m_DataPacketNumber;
+
+        result = ProcessSendPacket(FLocalCmd.OpCode, &arg);
+		return result;
+	}
+
+    // 모듈상태 요청 확인
+	if (FLocalCmd.ModuleStatus == false)
+	{
+        //LINFO("**** REQ_VMS_MODULE_STATUS");
+		arg.Subscription.nbr   = NBR_MODULE_STATUS;
+		//arg.Subscription.mode  = SubscriptionMode_PR_single;
+		arg.Subscription.delay = 60;
+		arg.Subscription.obj   = OBJ_ModuleStatus;
+
+        FLocalCmd.OpCode           = REQ_VMS_MODULE_STATUS;
+		FLocalCmd.obj              = OBJ_ModuleStatus;
+		FLocalCmd.DataPacketNumber = m_DataPacketNumber;
+
+        result = ProcessSendPacket(FLocalCmd.OpCode, &arg);
+		return result;
+	}
+
+	// FORM 다운로드
+	if (FVmsObj->CTLMODE->Enable == object_enable)
+    {
+		m_pVmsFormList->Lock();
+		try
+		{
+            int nFormCnt = m_pVmsFormList->Count();
+            for (int ii = 0; ii < nFormCnt; ii++)
+            {
+                TVmsForm *pVmsForm = m_pVmsFormList->GetItem(ii);
+                if (pVmsForm)
+                {
+                    if (pVmsForm->SvcRes == false)
+                    {
+                        arg.Publication.SubscribeSerialNbr = NBR_BASE_REALTIMEDISPLAY;
+                        arg.Publication.obj                = OBJ_RealTimeDisplay;
+                        arg.Publication.Data.Form.Idx      = 0;
+
+                        FLocalCmd.OpCode           = REQ_VMS_MSG_DOWNLOAD;//REQ_VMS_LIB_DOWNLOAD;//REQ_VMS_MSG_DOWNLOAD;
+                        FLocalCmd.obj              = OBJ_RealTimeDisplay;
+                        FLocalCmd.DataPacketNumber = 0;
+                        FLocalCmd.Idx              = nFormCnt;
+                        break;
+                    }
+                }
+            }
+            arg.Publication.Data.Form.Mode = FVmsObj->CTLMODE->Control;
+		}
+		__finally
+		{
+			m_pVmsFormList->UnLock();
+		}
+
+        if (FLocalCmd.OpCode != 0x00)
+        {
+            result = ProcessSendPacket(FLocalCmd.OpCode, &arg);
+            return result;
+        }
+	}
+
+    ARequest = false;
+	return result;
+}
+//---------------------------------------------------------------------------
+
+/*
+ *
+ *  arguments
+ *   void
+ *  return
+ *   void
+ */
+int __fastcall TVMSCThread::CheckClientData(bool &ARequest)
+{
+FErrLine = 24;
+    int              nResult = VERR_NONE;
+    IPCUDPPACKET    *pPI = NULL;
+	TList           *pPackQueue;
+	COMMAND_ARGUMENT arg;
+
+    ARequest = false;
+
+    try
+	{
+    	pPackQueue = FVmsObj->pPackQueue->LockList();
+
+        int nCmdCnt = pPackQueue->Count;
+        for (int ii = nCmdCnt-1; ii >= 0; ii--)
+        {
+            pPI = (IPCUDPPACKET *)pPackQueue->Items[ii];
+
+            if (pPI->Data == NULL)
+            {
+                delete pPI;
+                pPackQueue->Delete(ii);
+                continue;
+            }
+
+            memset((char*)&FCliCmd, 0x00, sizeof(FCliCmd));
+			memset((char*)&arg,     0x00, sizeof(arg));
+
+            FCliCmd.OpCode           = 0x00;
+            FCliCmd.obj              = OBJ_None;  /* EN_OBJECT_ID */
+            FCliCmd.DataPacketNumber = 0;         /* DataPacket Number */
+            FCliCmd.Idx              = 0;
+
+            INT_VMS_POWER_CTL_REQ *pHd = (INT_VMS_POWER_CTL_REQ*)pPI->Data;
+            memcpy(FCliCmd.VmsId,   pHd->VmsId,   INT_VMS_MAX_ID);
+            memcpy(FCliCmd.OperId,  pHd->OperId,  INT_VMS_MAX_OPER_ID);
+            memcpy(FCliCmd.CmdTime, pHd->CmdTime, INT_VMS_MAX_DATETIME);
+            FCliCmd.Result = CTL_RESULT_FAIL;
+
+            switch(pPI->OPCode)
+            {
+            case INT_OP_VMS_POWER_CTL:
+                {
+                    INT_VMS_POWER_CTL_REQ *pReq = (INT_VMS_POWER_CTL_REQ*)pPI->Data;
+
+                    FCliCmd.OpCode = REQ_SIGNBOARD_POWER_CONTROL;
+
+                    arg.Publication.SubscribeSerialNbr = NBR_MODULE_POWER;
+                    arg.Publication.obj       = OBJ_StatusControl;
+                    arg.Publication.Data.Ctl  = (pReq->Command == vms_board_power_on) ? 0x01 : 0x00;
+                }
+                break;
+
+            case INT_OP_VMS_RESET:
+                {
+                    INT_VMS_RESET_REQ *pReq = (INT_VMS_RESET_REQ*)pPI->Data;
+
+					FCliCmd.OpCode = REQ_VMS_INITIALIZE;
+                }
+                break;
+
+            case INT_OP_VMS_DIRECT:
+                {
+                    INT_VMS_DIRECT_CTL_REQ *pReq = (INT_VMS_DIRECT_CTL_REQ*)pPI->Data;
+
+					FCliCmd.OpCode = pReq->Command;
+                }
+                break;
+
+            case INT_OP_VMS_LUMINANCE_CTL:
+                {
+                    INT_VMS_LUMINANCE_REQ *pReq = (INT_VMS_LUMINANCE_REQ*)pPI->Data;
+
+                    arg.Publication.SubscribeSerialNbr = NBR_LUMINANCE;
+                    arg.Publication.obj                = OBJ_StatusControl;
+                    arg.Publication.Data.Ctl           = pReq->Luminance;
+
+                    FCliCmd.OpCode = REQ_VMS_LUMINANCE_LEVEL_SET;
+                }
+                break;
+            case INT_OP_VMS_PARA_SET2:
+                {
+                    INT_VMS_PARA_SET_REQ2 *pReq = (INT_VMS_PARA_SET_REQ2*)pPI->Data;
+
+                    memcpy(FCliCmd.VmsId,   pReq->VmsId,   INT_VMS_MAX_ID);
+                    memcpy(FCliCmd.OperId,  pReq->OperId,  INT_VMS_MAX_OPER_ID);
+                    memcpy(FCliCmd.CmdTime, pReq->CmdTime, INT_VMS_MAX_DATETIME);
+
+					arg.Publication.SubscribeSerialNbr  = NBR_STATUS_SETTING;
+					arg.Publication.obj                 = OBJ_StatusSetting;
+
+					arg.Publication.Data.Set2.DefCommErr        = pReq->DefCommErr;       // 통신장애 기본값, 제어기가 Host로부터 Poll 또는 명령을 받지 않고 경과할 수 있는 최대시간 (default ; 60초)
+					arg.Publication.Data.Set2.SlotCommErr       = pReq->SlotCommErr;      // 통신장애 slot번호, 통신 fail 시 표시할 메시지 번호(default 0번)
+					arg.Publication.Data.Set2.SlotPowerErr      = pReq->SlotPowerErr;     // 전원장애 slot번호, 전원장애 시 표시할 메시지 번호(default 0번)
+					arg.Publication.Data.Set2.NightLuminance    = pReq->NightLuminance;   // 야간 휘도 값, 0x30 ~ 0x3F
+					arg.Publication.Data.Set2.DayLuminance      = pReq->DayLuminance;     // 주간 휘도 값, 0x40 ~ 0x4F
+					arg.Publication.Data.Set2.PhaseCycleTime    = pReq->PhaseCycleTime;   // phase시간주기, 장애시 phase주기 (default : 3초, 범위 : 0 ~ 10초)
+					arg.Publication.Data.Set2.ModuleFailRate    = pReq->ModuleFailRate;   // 모듈장애율, 한개의 module을 장애로 처리하기 위한 장애 pixel백분율 (default 10%)
+					arg.Publication.Data.Set2.ModuleCheckTime   = pReq->ModuleCheckTime;  // 모듈감시 주기, 0 ~ 255 (단위:초)
+					arg.Publication.Data.Set2.BoardOnHour       = pReq->BoardOnHour;      // 전광판 On time(시), 0시 ~ 23시
+					arg.Publication.Data.Set2.BoardOnMin        = pReq->BoardOnMin;       // 전광판 On time(분), 0시 ~ 23시
+					arg.Publication.Data.Set2.BoardOffHour      = pReq->BoardOffHour;     // 전광판 Off time(시), 0시 ~ 23시
+					arg.Publication.Data.Set2.BoardOffMin       = pReq->BoardOffMin;      // 전광판 Off time(분), 0시 ~ 23시
+
+
+                    FVmsObj->VMS_CMNC_ERR_BASS_VAL  = (int)pReq->DefCommErr;
+                    FVmsObj->CMNCFAIL_SLOT_NMBR     = (int)pReq->SlotCommErr;     // NUMBER(4)    Y    0        통신장애 SLOT 번호
+                    FVmsObj->PWER_FAIL_SLOT_NMBR    = (int)pReq->SlotPowerErr;    // NUMBER(4)    Y    0        전원 장애 SLOT 번호
+                    FVmsObj->VMS_NGHT_BRGH_STEP     = (int)pReq->NightLuminance;
+                    FVmsObj->VMS_WEEK_BRGH_STEP     = (int)pReq->DayLuminance;
+                    //FVmsObj->VMS_PHSE_CHNG_CYCL     = (int)pReq->PhaseCycleTime;
+                    FVmsObj->VMS_MODL_ERR_RATE      = (int)pReq->ModuleFailRate;
+                    FVmsObj->VMS_MODL_CHK_CYCL      = (int)pReq->ModuleCheckTime;
+
+                    //m_State.ModuleOperatingTemperature = FVmsObj->VMS_CMNC_ERR_BASS_VAL; /* 필수 모듈 전원이 꺼지는 온도값(℃) */
+
+#if 0
+                    AnsiString sOn, sOff;
+                    sOn.printf("%02d%02d", (int)pReq->BoardOnHour, (int)pReq->BoardOnMin);
+                    sOff.printf("%02d%02d", (int)pReq->BoardOffHour, (int)pReq->BoardOffMin);
+                    FVmsObj->MODULE.PowerOnTime  = Now().FormatString("yyyymmdd") + sOn;
+                    FVmsObj->MODULE.PowerOffTime = Now().FormatString("yyyymmdd") + sOff;
+#endif
+
+					FCliCmd.OpCode = REQ_VMS_PARAM_DOWNLOAD;
+                }
+                break;
+#if 0
+            case INT_OP_VMS_PARA_SET:
+                {
+                    INT_VMS_PARA_SET_REQ *pReq = (INT_VMS_PARA_SET_REQ*)pPI->Data;
+
+                    memcpy(FCliCmd.VmsId,   pReq->VmsId,   INT_VMS_MAX_ID);
+                    memcpy(FCliCmd.OperId,  pReq->OperId,  INT_VMS_MAX_OPER_ID);
+                    memcpy(FCliCmd.CmdTime, pReq->CmdTime, INT_VMS_MAX_DATETIME);
+
+					arg.Publication.SubscribeSerialNbr  = NBR_STATUS_SETTING;
+					arg.Publication.obj                 = OBJ_StatusSetting;
+
+					arg.Publication.Data.Set.SchMsgTime = (int)pReq->SchMsgTime;
+					arg.Publication.Data.Set.ModuleTemp = (int)pReq->ModuleTemp;
+					arg.Publication.Data.Set.FanTemp    = (int)pReq->FanTemp;
+					arg.Publication.Data.Set.HeaterTemp = (int)pReq->HeaterTemp;
+					arg.Publication.Data.Set.ModuleFail = (int)pReq->ModuleFail;
+					arg.Publication.Data.Set.RetryCount = (int)pReq->RetryCount;
+					arg.Publication.Data.Set.TimeOut    = (int)pReq->TimeOut;
+
+					FCliCmd.Data.Para.SchMsgTime = (int)pReq->SchMsgTime;
+					FCliCmd.Data.Para.ModuleTemp = (int)pReq->ModuleTemp;
+					FCliCmd.Data.Para.FanTemp    = (int)pReq->FanTemp;
+					FCliCmd.Data.Para.HeaterTemp = (int)pReq->HeaterTemp;
+					FCliCmd.Data.Para.ModuleFail = (int)pReq->ModuleFail;
+					FCliCmd.Data.Para.RetryCount = (int)pReq->RetryCount;
+					FCliCmd.Data.Para.TimeOut    = (int)pReq->TimeOut;
+
+					FCliCmd.OpCode = CTL_TYPE_PARA_SET;
+					FCliCmd.obj = AI_StatusSettingMessage;
+                }
+                break;
+#endif
+			default:
+				nResult = VERR_UNKNOWN_COMMAND;
+				break;
+            }
+
+			if (nResult == VERR_NONE)
+            {
+				nResult = ProcessSendPacket(FCliCmd.OpCode, &arg);
+			}
+
+			//ClientResponse(nResult);
+
+			if (pPI->Size > 0)
+            {
+                delete []pPI->Data;
+			}
+            delete pPI;
+            pPI = NULL;
+
+			pPackQueue->Delete(ii);
+
+            ARequest = true;
+            break;
+        }
+    }
+    __finally
+    {
+		FVmsObj->pPackQueue->UnlockList();
+    }
+
+    return nResult;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TVMSCThread::ClientResponse(int error)
+{
+#ifdef CENTERCOMM
+	BYTE ErrCode;
+	int sResult;
+	int Flag;
+	bool bSave = false;
+
+	switch(error)
+	{
+	case SYS_ERR_NONE:                 break;
+	case SYS_ERR_OTHER:                ErrCode = INT_ERROR_OTHER; break;
+	case SYS_ERR_INTERNAL:             ErrCode = INT_ERROR_SYSTEM; break;
+	case SYS_ERR_MEMORY:               ErrCode = INT_ERROR_SYSTEM; break;
+	case SYS_ERR_DATABASE:             ErrCode = INT_ERROR_SYSTEM; break;
+	case SYS_ERR_RESET:                ErrCode = INT_ERROR_SYSTEM; break;
+	case SYS_ERR_START:                ErrCode = INT_ERROR_SYSTEM; break;
+	case SYS_ERR_OFFLINE:              ErrCode = INT_ERROR_OFFLINE; break;
+	case SYS_ERR_NO_RES:               ErrCode = INT_ERROR_NO_RESPONSE; break;
+	case SYS_ERR_ACCESS:               ErrCode = INT_ERROR_PROCESS; break;
+	case SYS_ERR_INVALID:              ErrCode = INT_ERROR_OTHER; break;
+	case SYS_ERR_UNKNOWN:              ErrCode = INT_ERROR_UNKNOWN_CODE; break;
+	case SYS_ERR_WRITE_LENGTH:         ErrCode = INT_ERROR_OTHER; break;
+	case SYS_ERR_PACKET_SIZE_LARGE:    ErrCode = INT_ERROR_OTHER; break;
+	case SYS_ERR_INVALID_TAG:          ErrCode = INT_ERROR_OTHER; break;
+	case SYS_ERR_CRC:                  ErrCode = INT_ERROR_OTHER; break;
+	case SYS_ERR_LENGTH:               ErrCode = INT_ERROR_LENGTH; break;
+	case SYS_ERR_ADDRESS:              ErrCode = INT_ERROR_ADDRESS; break;
+	case SYS_ERR_HEADER_OPTIONS:       ErrCode = INT_ERROR_HEADER; break;
+	case SYS_ERR_UNKNOWN_COMMAND:      ErrCode = INT_ERROR_UNKNOWN_OPCODE; break;
+	case SYS_ERR_RECEIVE_TIMEOUT:      ErrCode = INT_ERROR_OTHER; break;
+	case SYS_ERR_DATA_SIZE:            ErrCode = INT_ERROR_DISCORD; break;
+	case SYS_ERR_MISMATCH:             ErrCode = INT_ERROR_OTHER; break;
+	case SYS_ERR_INVALID_PARA:         ErrCode = INT_ERROR_INVALID_DATA; break;
+	case SYS_ERR_MOVEMENT:             ErrCode = INT_ERROR_MOVEMENT; break;
+	case SYS_ERR_UNAUTHORIZED:         ErrCode = INT_ERROR_UNAUTHORIZED; break;
+	default:                           ErrCode = INT_ERROR_OTHER; break;
+	}
+
+	switch (m_Req.OpCode)
+    {
+	case INT_OP_VMS_POWER_CTL:      /* 0x0303 VMS 통신 서버, VMS 전광판 On/Off 제어 */
+		if (error == SYS_ERR_NONE)
+        {
+			Flag = SEND_ACK;
+
+			m_Set.Data.Control.Result = CTL_RESULT_SUCC;
+		}
+        else
+        {
+			Flag = SEND_NACK;
+		}
+
+		bSave = true;
+		break;
+	case INT_OP_VMS_PARA_SET:       /* 0x0308 VMS 통신 서버, VMS 환경설정정보 전송 */
+		if (error == SYS_ERR_NONE)
+        {
+			Flag = SEND_ACK;
+
+			bSave = true;
+		}
+        else
+        {
+			Flag = SEND_NACK;
+		}
+		break;
+	case INT_OP_VMS_RESET:          /* 0x0309 VMS 통신 서버, VMS 제어기 리셋 전송 */
+		if (error == SYS_ERR_NONE)
+        {
+			Flag = SEND_ACK;
+
+			m_Set.Data.Control.Result = CTL_RESULT_SUCC;
+		}
+        else
+        {
+			Flag = SEND_NACK;
+		}
+
+		bSave = true;
+		break;
+	default:
+		Flag = SEND_NONE;
+        break;
+	}
+
+	if (bSave == true)
+    {
+		if ((sResult = SendDbThreadDataMessage(WM_DATA_SAVE, (void *)&m_Set, sizeof(m_Set))) != SYS_ERR_NONE)
+		{
+		}
+	}
+
+	if (Flag == SEND_ACK)
+    {
+		INT_ACK_RES Ack;
+
+		memset(&Ack, 0x00, sizeof(Ack));
+
+		Ack.OPCode.Type = INT_TYPE(m_Req.OpCode);
+		Ack.OPCode.Kind = INT_KIND(m_Req.OpCode);
+		Ack.MsgSeq = m_Req.MsgSeq;
+
+		if ((sResult = AckRes(&Ack, m_Req.ProcessID)) != UDP_ERR_NONE)
+        {
+		}
+	}
+    else
+    if (Flag == SEND_NACK)
+    {
+		INT_NACK_RES Nack;
+
+		memset(&Nack, 0x00, sizeof(Nack));
+
+		Nack.OPCode.Type = INT_TYPE(m_Req.OpCode);
+		Nack.OPCode.Kind = INT_KIND(m_Req.OpCode);
+		Nack.MsgSeq = m_Req.MsgSeq;
+		Nack.ErrCode = ErrCode;
+
+		if ((sResult = NackRes(&Nack, m_Req.ProcessID)) != UDP_ERR_NONE)
+        {
+		}
+	}
+#endif
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TVMSCThread::SendDbThreadMessage(UINT Msg, int wParam, int lParam)
+{
+    int result;
+
+    result = SYS_ERR_OTHER;
+
+	if (g_SysInfo->State.CommThreadID != NULL)
+    {
+		if (PostThreadMessage(g_SysInfo->State.CommThreadID, Msg, (WPARAM)wParam, (LPARAM)lParam))
+        {
+			result = SYS_ERR_NONE;
+		}
+        else
+        {
+            result = SYS_ERR_INTERNAL;
+        }
+    }
+
+	return result;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TVMSCThread::SendDbThreadDataMessage(UINT Msg, void *pData, int iLen)
+{
+    int   nResult;
+    char *p;
+
+	nResult = VERR_OTHER;
+
+	if (g_SysInfo->State.CommThreadID != NULL)
+    {
+        p = new char[iLen];
+
+		if (p != NULL)
+        {
+            try
+            {
+                memcpy(p, pData, iLen);
+
+				if (PostThreadMessage(g_SysInfo->State.CommThreadID, Msg, (WPARAM)p, NULL))
+                {
+                    nResult = VERR_NONE;
+                    Sleep(50);
+                }
+                else
+                {
+                    nResult = VERR_INTERNAL;
+                }
+            }
+            __finally
+            {
+                if (nResult != VERR_NONE)
+                {
+                    delete []p;
+                }
+            }
+        }
+        else
+        {
+            nResult = VERR_MEMORY_ALLOC;
+        }
+    }
+
+    return nResult;
+}
+//---------------------------------------------------------------------------
+
+/*
+ * 에러 처리
+ *  arguments
+ *   void
+ *  return
+ *   void
+ */
+int __fastcall TVMSCThread::ProcErrorState(bool flag, int result)
+{
+FErrLine = 14;
+#if 1
+    {
+        AnsiString strLog;
+
+		switch(result)
+        {
+        case SYS_ERR_NONE:                      strLog.sprintf("no error [%d]", result); break;
+        case SYS_ERR_OTHER:                     strLog.sprintf("other [%d]", result); break;
+        case SYS_ERR_INTERNAL:                  strLog.sprintf("internal system error(kernel..) [%d]", result); break;
+        case SYS_ERR_MEMORY:                    strLog.sprintf("memory overflow [%d]", result); break;
+        case SYS_ERR_DATABASE:                  strLog.sprintf("system database error [%d]", result); break;
+        case SYS_ERR_RESET:                     strLog.sprintf("system reset [%d]", result); break;
+        case SYS_ERR_START:                     strLog.sprintf("system start [%d]", result); break;
+        case SYS_ERR_OFFLINE:                   strLog.sprintf("offline [%d]", result); break;
+        case SYS_ERR_NO_RES:                    strLog.sprintf("no response [%d]", result); break;
+        case SYS_ERR_ACCESS:                    strLog.sprintf("access denied [%d]", result); break;
+        case SYS_ERR_INVALID:                   strLog.sprintf("invalid data type [%d]", result); break;
+        case SYS_ERR_UNKNOWN:                   strLog.sprintf("unknown data type [%d]", result); break;
+        case SYS_ERR_WRITE_LENGTH:              strLog.sprintf("write length [%d]", result); break;
+		case SYS_ERR_PACKET_SIZE_LARGE:         strLog.sprintf("packet size large [%d]", result); break;
+        case SYS_ERR_INVALID_TAG:               strLog.sprintf("invalid tag [%d]", result); break;
+        case SYS_ERR_CRC:                       strLog.sprintf("crc [%d]", result); break;
+        case SYS_ERR_LENGTH:                    strLog.sprintf("length [%d]", result); break;
+        case SYS_ERR_ADDRESS:                   strLog.sprintf("address [%d]", result); break;
+        case SYS_ERR_HEADER_OPTIONS:            strLog.sprintf("header options [%d]", result); break;
+        case SYS_ERR_UNKNOWN_COMMAND:           strLog.sprintf("unknown command [%d]", result); break;
+        case SYS_ERR_RECEIVE_TIMEOUT:           strLog.sprintf("receive timeout [%d]", result); break;
+		case SYS_ERR_DATA_SIZE:                 strLog.sprintf("data size [%d]", result); break;
+        case SYS_ERR_MISMATCH:                  strLog.sprintf("mismatch command [%d]", result); break;
+        case SYS_ERR_INVALID_PARA:              strLog.sprintf("invalid parameter [%d]", result); break;
+        case SYS_ERR_MOVEMENT:                  strLog.sprintf("movement [%d]", result); break;
+        case SYS_ERR_UNAUTHORIZED:              strLog.sprintf("unauthorized [%d]", result); break;
+
+		case SYS_ERR_DATEXDATAPACKET_DECODE:    		strLog.sprintf("DatexDataPacket decode [%d]", result); break;
+		case SYS_ERR_INVALID_VERSION_NUMBER:    		strLog.sprintf("invalid version number [%d]", result); break;
+		case SYS_ERR_C2CAUTHENTICATEDMESSAGE_DECODE:    strLog.sprintf("C2CAuthenticatedMessage decode [%d]", result); break;
+		case SYS_ERR_C2CAUTHENTICATEDMESSAGE:   		strLog.sprintf("C2CAuthenticatedMessage [%d]", result); break;
+		case SYS_ERR_NOT_LOGIN:              			strLog.sprintf("Not login [%d]", result); break;
+		case SYS_ERR_ACCEPT_TYPE:              			strLog.sprintf("Accept Type [%d]", result); break;
+		case SYS_ERR_DATEXPUBLISH_FORMAT:       		strLog.sprintf("datexPublish Format [%d]", result); break;
+		case SYS_ERR_DATEXPUBLISH_TYPE:         		strLog.sprintf("datexPublish Type [%d]", result); break;
+		case SYS_ERR_UNKNOWN_MESSAGE_ID:        		strLog.sprintf("unknown Message id [%d]", result); break;
+		case SYS_ERR_MESSAGE_DECODE:            		strLog.sprintf("Message decode [%d]", result); break;
+		case SYS_ERR_DATEXDATAPACKET_ENCODE:    		strLog.sprintf("DatexDataPacket encode [%d]", result); break;
+		case SYS_ERR_C2CAUTHENTICATEDMESSAGE_ENCODE:	strLog.sprintf("C2CAuthenticatedMessage encode [%d]", result); break;
+		case SYS_ERR_MESSAGE_ENCODE:            		strLog.sprintf("Message encode [%d]", result); break;
+		case SYS_ERR_PUBLICATIONDATA_ENCODE:    		strLog.sprintf("PublicationData encode [%d]", result); break;
+		case SYS_ERR_MISMATCH_DESTINATION_TEXT: 		strLog.sprintf("mismatch Destination text [%d]", result); break;
+		case SYS_ERR_DATEXLOGIN_VALUE:          		strLog.sprintf("Login Value [%d]", result); break;
+		case SYS_ERR_SUBSCRIPTION_TYPE:         		strLog.sprintf("SubscriptionType Type [%d]", result); break;
+		case SYS_ERR_SUBSCRIPTION_STATUS_VALUE: 		strLog.sprintf("SubscriptionType Status Value [%d]", result); break;
+		case SYS_ERR_SUBSCRIPTION_MODE_VALUE:   		strLog.sprintf("SubscriptionType Mode Value [%d]", result); break;
+		case SYS_ERR_SUBSCRIPTION_FORMAT_VALUE: 		strLog.sprintf("SubscriptionType Format Value [%d]", result); break;
+		case SYS_ERR_HANGUL_CONVERSION:         		strLog.sprintf("Hangul Conversion [%d]", result); break;
+		case SYS_ERR_INVALID_TAGANDLEN:         		strLog.sprintf("invalid Tag And Len [%d]", result); break;
+		case SYS_ERR_PUBLICATIONDATA_DECODE:    		strLog.sprintf("PublicationData decode [%d]", result); break;
+
+		default:                                strLog.sprintf("Unknown Error [%d]", result); break;
+        }
+
+        if (flag){
+            LERROR("Recv Error %s", strLog.c_str());
+        }else{
+			LERROR("Send Error %s", strLog.c_str());
+        }
+	}
+#endif
+    return 0;
+}
+//---------------------------------------------------------------------------
+
+/*
+ * 상태 변경
+ *  arguments
+ *   void
+ *  return
+ *   void
+ */
+int __fastcall TVMSCThread::SetClientState(int ACase)
+{
+FErrLine = 15;
+	switch(FClient.State)
+    {
+	case CT_LOGIN_WAIT:
+		if (ACase == SET_CLIENT_SUCC)
+        {
+            if (FVmsObj->FIsOldProtocol)
+            {
+                //정보요청을 등록해야함(기존 VMS)
+                FClient.State  = CT_SECTION;//CT_REGIST;   //TODO
+                FClient.reqStatusTimer = Now() - ITSCOMM_SECTIME(FClient.pollingCycleTime);
+            }
+            else
+            {
+                FClient.State  = CT_SECTION;
+                FClient.reqStatusTimer = Now() - ITSCOMM_SECTIME(FClient.pollingCycleTime);
+            }
+		}
+        else
+        if (ACase == SET_CLIENT_FAIL)
+        {
+			FClient.State = CT_IDLE;
+		}
+		break;
+	case CT_FRED_WAIT:
+		FClient.State = CT_SECTION;
+		break;
+	case CT_LOCAL_WAIT:
+		if (ACase == SET_CLIENT_SUCC)
+        {
+			FClient.State = CT_LOCAL_COMMAND;//CT_CLIENT_COMMAND;
+		}
+        else
+        if (ACase == SET_CLIENT_FAIL)
+        {
+			FClient.State = CT_LOCAL_COMMAND;
+		}
+		break;
+	case CT_CLIENT_WAIT:
+		if (ACase == SET_CLIENT_SUCC)
+        {
+			FClient.State = CT_SECTION;
+		}
+        else
+        if (ACase == SET_CLIENT_FAIL)
+        {
+			FClient.State = CT_CLIENT_COMMAND;
+		}
+		break;
+	case CT_REGIST_WAIT:
+		if (ACase == SET_CLIENT_SUCC)
+        {
+			FClient.State = CT_REGIST_COMMAND;
+		}
+        else
+        if (ACase == SET_CLIENT_FAIL)
+        {
+			FClient.State = CT_CLIENT_COMMAND;
+		}
+		break;
+	default:
+		break;
+	}
+    return 0;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TVMSCThread::InfoPacket(BYTE *ABuff, int ALen, bool ASend, int AResult/*=0*/)
+{
+    VMS_PACKET *Pkt = (VMS_PACKET*)ABuff;
+    AnsiString  sCmd = "";
+    ACK_NAK     res;
+    bool        acknak = true;
+
+	switch(Pkt->hd.OpCode)
+    {
+    case REQ_VMS_STATUS:
+        acknak = false;
+        if (ASend) sCmd = "REQ_VMS_STATUS";
+        else       sCmd = "RES_VMS_STATUS";
+        break;
+
+    case REQ_VMS_MSG_DOWNLOAD:
+        if (ASend) sCmd = "REQ_VMS_MSG_DOWNLOAD";
+        else       sCmd = "RES_VMS_MSG_DOWNLOAD";
+        break;
+
+    case REQ_VMS_LIB_DOWNLOAD:
+        if (ASend) sCmd = "REQ_VMS_LIB_DOWNLOAD";
+        else       sCmd = "RES_VMS_LIB_DOWNLOAD";
+        break;
+
+    case REQ_VMS_PARAM_DOWNLOAD:
+        if (ASend) sCmd = "REQ_VMS_PARAM_DOWNLOAD";
+        else       sCmd = "RES_VMS_PARAM_DOWNLOAD";
+        break;
+
+    case REQ_VMS_BLANK_DISP:
+        if (ASend) sCmd = "REQ_VMS_BLANK_DISP";
+        else       sCmd = "RES_VMS_BLANK_DISP";
+        break;
+
+    case REQ_VMS_DEF_MSG_DISP:
+        if (ASend) sCmd = "REQ_VMS_DEF_MSG_DISP";
+        else       sCmd = "RES_VMS_DEF_MSG_DISP";
+        break;
+
+    case REQ_VMS_MODULE_STATUS:
+        acknak = false;
+        if (ASend) sCmd = "REQ_VMS_MODULE_STATUS";
+        else       sCmd = "RES_VMS_MODULE_STATUS";
+        break;
+
+    case REQ_VMS_INITIALIZE:
+        if (ASend) sCmd = "REQ_VMS_INITIALIZE";
+        else       sCmd = "RES_VMS_INITIALIZE";
+        break;
+
+    case REQ_VMS_LUMINANCE_LEVEL_SET:
+        if (ASend) sCmd = "REQ_VMS_LUMINANCE_LEVEL_SET";
+        else       sCmd = "RES_VMS_LUMINANCE_LEVEL_SET";
+        break;
+
+    case REQ_SIGNBOARD_POWER_CONTROL:
+        if (ASend) sCmd = "REQ_SIGNBOARD_POWER_CONTROL";
+        else        sCmd = "RES_SIGNBOARD_POWER_CONTROL";
+        break;
+
+    default:
+        if (ASend) LERROR("Send Unknown OpCode: %02X, %d Bytes", Pkt->hd.OpCode, ALen);
+        else       LERROR("Recv Unknown OpCode: %02X, %d Bytes", Pkt->hd.OpCode, ALen);
+        return;
+    }
+
+    if (ASend)
+    {
+        if (AResult == SYS_ERR_NONE)
+            LINFO("Send: %s, %d Bytes", sCmd.c_str(), ALen);
+        else
+            LINFO("Send Fail: %s, %d Bytes", sCmd.c_str(), ALen);
+    }
+    else
+    {
+        if (acknak)
+        {
+            res.ack = ABuff[POS_ACKNAK];
+            if (res.ack == 0x00)
+                LINFO("Recv: %s, %d Bytes", sCmd.c_str(), ALen);
+            else
+                LINFO("Recv: %s, %d Bytes, NAK(%d,%d,%d,%d,%d)", sCmd.c_str(), ALen,
+                    res.nak.crc,
+                    res.nak.cmd,
+                    res.nak.dat,
+                    res.nak.nbr,
+                    res.nak.chk
+                );
+        }
+        else
+        {
+            LINFO("Recv: %s, %d Bytes", sCmd.c_str(), ALen);
+        }
+    }
+}
+//---------------------------------------------------------------------------
+
+void TVMSCThread::ReqStatus()
+{
+    try
+    {
+        FClient.reqStatusTimer = Now() - ITSCOMM_SECTIME(FClient.pollingCycleTime+10);
+    }
+    catch(Exception &e)
+    {
+    }
+}
+//---------------------------------------------------------------------------
+
+int TVMSCThread::LogData(char *ASndRcv, BYTE *AData, int ALen)
+{
+    int result = -1;
+    int nStep = 0;
+
+    if (!FLogFile) return result;
+    if (!FLogFile->FLogCfg.Data) return result;
+
+    try
+    {
+        FLogFile->LogData(ASndRcv, AData, ALen);
+
+        if (FVmsObj->FDispLog)
+        {
+            IPC_LOG_MESSAGE *pLog = &FLogMsg;//new IPC_LOG_MESSAGE;
+            if (pLog)
+            {
+                pLog->Kind = eLOG_DATA;
+                pLog->Flag = ASndRcv[0] == 'S' ? 1 : 2;
+                pLog->Len  = ALen > MAX_LOG_BUFFER ? MAX_LOG_BUFFER-1 : ALen;
+                pLog->Tm   = Now();
+                pLog->Type = 'C';
+                memset(pLog->Msg, 0x00, sizeof(pLog->Msg));
+                memcpy(pLog->Msg, (char*)AData, pLog->Len);
+                pLog->Obj  = (void*)FVmsObj;
+
+                DWORD dwResult = 0;
+                LRESULT lResult = SEND_LOGMSG(FrmVmsLog->Handle, WM_LOG_DISPLAY, (WPARAM)pLog, NULL, SMTO_NORMAL, 2000, dwResult);
+                if (lResult == 0)
+                {
+                    dwResult = GetLastError();
+                    if (dwResult == ERROR_TIMEOUT)
+                    {
+                    }
+                    //SAFE_DELETE(pLog);
+                }
+            }
+        }
+    }
+    catch(Exception &e)
+    {
+    }
+    return result;
+}
+//---------------------------------------------------------------------------
+
+int TVMSCThread::SysLogWrite(int ALogKind, char *AFmt, ...)
+{
+    va_list     ap;
+    int         cnt = 0;
+    char        szFmtData[MAX_LOG_BUFFER];
+    AnsiString  sLogKind;
+    int         nStep = 0;
+
+    if (!FLogFile) return cnt;
+
+    bool bLog = false;
+    switch(ALogKind)
+    {
+    case eLOG_INFO   : bLog = FLogFile->FLogCfg.Info;    sLogKind = " [INF] "; break;
+    case eLOG_DATA   : bLog = FLogFile->FLogCfg.Data;    sLogKind = " [DAT] "; break;
+    case eLOG_ERROR  : bLog = FLogFile->FLogCfg.Error;   sLogKind = " [ERR] "; break;
+    case eLOG_WARNING: bLog = FLogFile->FLogCfg.Warning; sLogKind = " [WAN] "; break;
+    case eLOG_DEBUG  : bLog = FLogFile->FLogCfg.Debug;   sLogKind = " [DBG] "; break;
+    case eLOG_DETAIL : bLog = FLogFile->FLogCfg.Detail;  sLogKind = " [DET] "; break;
+    }
+    if (!bLog) return -1;
+
+    try
+    {
+        va_start(ap, AFmt);
+        cnt = vsprintf(szFmtData, AFmt, ap);
+        va_end(ap);
+
+        FLogFile->LogWrite(NULL, ALogKind, szFmtData);
+
+        IPC_LOG_MESSAGE *pLog = &FLogMsg;//new IPC_LOG_MESSAGE;
+        if (pLog)
+        {
+            pLog->Kind = ALogKind;
+            pLog->Flag = 0;
+            pLog->Len  = strlen(szFmtData);
+            pLog->Tm   = Now();
+            pLog->Type = 'C';
+            memset(pLog->Msg,  0x00, sizeof(pLog->Msg));
+            sprintf(pLog->Msg, "%s-CLI %s, %s", sLogKind.c_str(), VMSID.c_str(), szFmtData);
+            pLog->Obj  = (void*)FVmsObj;
+
+            DWORD   dwResult = 0;
+            LRESULT lResult = SEND_LOGMSG(FrmSysLog->Handle, WM_LOG_DISPLAY, pLog, NULL, SMTO_NORMAL, 2000, dwResult);
+            if (lResult == 0)
+            {
+                dwResult = GetLastError();
+                if (dwResult == ERROR_TIMEOUT)
+                {
+                }
+                //SAFE_DELETE(pLog);
+            }
+        }
+
+        if (FVmsObj->FDispLog)
+        {
+            IPC_LOG_MESSAGE *pLog2 = &FLogMsg;//new IPC_LOG_MESSAGE;
+            if (pLog2)
+            {
+                pLog2->Kind = ALogKind;
+                pLog2->Flag = 0;
+                pLog2->Len  = strlen(szFmtData);
+                pLog2->Tm   = Now();
+                pLog2->Type = 'C';
+                memset(pLog2->Msg,  0x00, sizeof(pLog2->Msg));
+                sprintf(pLog2->Msg, "%s-CLI %s, %s", sLogKind.c_str(), VMSID.c_str(), szFmtData);
+                pLog2->Obj  = (void*)FVmsObj;
+
+                DWORD   dwResult = 0;
+                LRESULT lResult = SEND_LOGMSG(FrmVmsLog->Handle, WM_LOG_DISPLAY, pLog2, NULL, SMTO_NORMAL, 2000, dwResult);
+                if (lResult == 0)
+                {
+                    dwResult = GetLastError();
+                    if (dwResult == ERROR_TIMEOUT)
+                    {
+                    }
+                    //SAFE_DELETE(pLog2);
+                }
+            }
+        }
+    }
+    catch(Exception &e)
+    {
+    }
+    return cnt;
+}
+//---------------------------------------------------------------------------
+
+int TVMSCThread::LogWrite(int ALogKind, char *AFmt, ...)
+{
+    va_list     ap;
+    int         cnt = 0;
+    char        szFmtData[MAX_LOG_BUFFER];
+    AnsiString  sLogKind;
+    int         nStep = 0;
+
+    if (!FLogFile) return cnt;
+
+    bool bLog = false;
+    switch(ALogKind)
+    {
+    case eLOG_INFO   : bLog = FLogFile->FLogCfg.Info;    sLogKind = " [INF] "; break;
+    case eLOG_DATA   : bLog = FLogFile->FLogCfg.Data;    sLogKind = " [DAT] "; break;
+    case eLOG_ERROR  : bLog = FLogFile->FLogCfg.Error;   sLogKind = " [ERR] "; break;
+    case eLOG_WARNING: bLog = FLogFile->FLogCfg.Warning; sLogKind = " [WAN] "; break;
+    case eLOG_DEBUG  : bLog = FLogFile->FLogCfg.Debug;   sLogKind = " [DBG] "; break;
+    case eLOG_DETAIL : bLog = FLogFile->FLogCfg.Detail;  sLogKind = " [DET] "; break;
+    }
+    if (!bLog) return -1;
+
+    try
+    {
+        va_start(ap, AFmt);
+        cnt = vsprintf(szFmtData, AFmt, ap);
+        va_end(ap);
+
+        FLogFile->LogWrite(NULL, ALogKind, szFmtData);
+
+        if (FVmsObj->FDispLog)
+        {
+            IPC_LOG_MESSAGE *pLog = &FLogMsg;//new IPC_LOG_MESSAGE;
+            if (pLog)
+            {
+                pLog->Kind = ALogKind;
+                pLog->Flag = 0;
+                pLog->Len  = strlen(szFmtData);
+                pLog->Tm   = Now();
+                pLog->Type = 'C';
+                memset(pLog->Msg,  0x00, sizeof(pLog->Msg));
+                sprintf(pLog->Msg, "%s-CLI %s, %s", sLogKind.c_str(), VMSID.c_str(), szFmtData);
+                pLog->Obj  = (void*)FVmsObj;
+
+                DWORD   dwResult = 0;
+                LRESULT lResult = SEND_LOGMSG(FrmVmsLog->Handle, WM_LOG_DISPLAY, pLog, NULL, SMTO_NORMAL, 2000, dwResult);
+                if (lResult == 0)
+                {
+                    dwResult = GetLastError();
+                    if (dwResult == ERROR_TIMEOUT)
+                    {
+                    }
+                    //SAFE_DELETE(pLog);
+                }
+            }
+        }
+    }
+    catch(Exception &e)
+    {
+    }
+    return cnt;
+}
+//---------------------------------------------------------------------------
+

+ 220 - 0
SRC/COMMON/VMSCThread.h

@@ -0,0 +1,220 @@
+
+//---------------------------------------------------------------------------
+#ifndef VMSCThreadH
+#define VMSCThreadH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Sockets.hpp>
+#include "AppGlobalF.h"
+#include "VmsPasigProtocolF.h"
+#include "VMSDataTypeF.h"
+#include "TVmsCtlrF.h"
+#include "ITSLogF.h"
+//---------------------------------------------------------------------------
+
+//#define CLIENT_SND_BUF_SIZE             65536       /* message buffer size */
+//#define CLIENT_SND_BUF_SIZE             111717     /* message buffer size */
+#define CLIENT_SND_BUF_SIZE             200000     /* message buffer size */
+#define CLIENT_RCV_BUF_SIZE             4096       /* max packet size */
+
+#define CLIENT_CONNECT_RETRY_TIME       60          /* connect retry time */
+#define CLIENT_CHANGE_TIME              5           /* change wait time */
+
+// client thread
+typedef struct client_thread_struct
+{
+	BYTE       Idx;                         /* information index */
+
+	AnsiString IpAddress;                   /* IP주소 */
+    int        Port;                        /* 포트번호 */
+    int        TimeOut;                     /* 시간초과 */
+    int        Addr;                        /* local id */
+	AnsiString VmsId;        	            /* VMS ID */
+
+    int        State;                       /* for the statemachine */
+
+
+    TDateTime  reqStatusTimer;              /* timer for state check sending */
+    int        pollingCycleTime;            /* 정보요청주기 */
+
+    int        sendRetry;                   /* retry count */
+    TDateTime  sendTimer;                   /* timer for command timeout check */
+
+	AnsiString LocalCenterId;               /* 로컬 센터ID */
+	AnsiString LocalDomainNm;               /* 로컬 도메인명칭 */
+	AnsiString CenterId;                    /* 센터ID */
+	AnsiString DomainNm;   		            /* 도메인명칭 */
+	AnsiString UserName;                    /* 사용자명 */
+	AnsiString UserPasswd;                  /* 사용자비밀번호 */
+
+	int        MaxHeartbeatTime;     	    /* 최대허트비트지속시간 */
+	int        DatagramSize;         	    /* 데이터그램 크기 */
+} CLIENT_THREAD_STRUCT;
+
+
+typedef enum en_client_machine_state
+{
+	/* common */
+	CT_IDLE = 1,
+	CT_LOGIN,
+	CT_SECTION,
+	CT_CLOSE,
+
+    CT_REGIST,
+    CT_REGIST_COMMAND,
+    CT_REGIST_WAIT,
+	/* sender */
+	CT_LOCAL_COMMAND,
+	CT_CLIENT_COMMAND,
+
+	/* receiver */
+	CT_LOGIN_WAIT,
+    CT_FRED_WAIT,
+	CT_LOCAL_WAIT,
+	CT_CLIENT_WAIT
+} EN_CLIENT_MACHINE_STATE;
+
+enum
+{
+	SET_CLIENT_SUCC,
+	SET_CLIENT_FAIL
+};
+
+/* 설정 정보 */
+typedef struct tag_set_info_struct
+{
+	BYTE VmsId[INT_VMS_MAX_ID+1];		    /* VMS ID */
+	BYTE CtlType;                       /* 제어유형 */
+	union
+    {
+		struct
+        {
+			BYTE Result;					/* 제어결과 */
+			BYTE OperId[INT_VMS_MAX_OPER_ID+1];	/* 제어운영자ID */
+		} Control;
+
+		struct
+        {
+			int SchMsgTime;                 /* 계획된 메시지 동작시간 */
+			int ModuleTemp;                 /* 모듈전원 OFF 온도 */
+			int FanTemp;                    /* Fan동작 기준온도 */
+			int HeaterTemp;                 /* Heater동작 기준온도 */
+			int ModuleFail;                 /* 모듈장애 판단율 */
+			int RetryCount;                 /* 재시도 횟수 */
+			int TimeOut;                    /* 최대응답대기시간 */
+		} Para;
+	} Data;
+} TSET_INFO_STRUCT;
+
+
+//---------------------------------------------------------------------------
+class TVMSCThread : public TThread
+{
+private:
+	TTcpClient *TcpClient;
+    bool *ThreadActiveIndicator;
+
+    TVmsCtlr    *FVmsObj;
+
+	AnsiString m_strName;						/* thread name */
+
+    int  m_RxDataLen;
+    int  m_RxPktLen;
+    int  m_RxState;
+    int  m_RxLen;
+    BYTE m_RxBuff[CLIENT_RCV_BUF_SIZE];	        /* receive data buffer */
+    BYTE m_TxBuff[CLIENT_SND_BUF_SIZE];	        /* send data buffer */
+
+    TDateTime m_rcvPacketTimer;                 /* timer for receiver */
+    TDateTime m_WatchDogTimer;                  /* watchdog timer */
+
+    CLIENT_THREAD_STRUCT FClient;              /* client thread */
+
+    DWORD m_DataPacketNumber;                   /* DataPacket Number */
+    DWORD m_SubscribeSerialNbr;                 /* Subscribe Serial Nbr */
+
+	LOCAL_COMMAND       FLocalCmd;              //
+
+    VMS_CONTROL_INFO    FCliCmd;                //클라이언트 제어 메지시
+
+    ////////
+	VMS_SERVER_CTL_INFO FSvrCtl;                /* local control */
+
+	CLIENT_COMMAND      m_Req;                  /* client request */
+	TSET_INFO_STRUCT    m_Set;					/* client set */
+    //REQUEST_REGISTERED  m_Registered;           /* local command */
+    ////////
+
+
+    TVmsFormManager   *m_pVmsFormList;          /* VmsFormList */
+
+	INT_VMS_STATE     *m_pState;                /* VMS 상태 정보 */
+
+    TITSLog           *FLogFile;
+
+    int                FErrLine;
+
+    void __fastcall InitRx();
+	void __fastcall ClientInitInfo(void);
+	void __fastcall ClientTerminate(void);
+
+	int __fastcall SaveStatusData(BYTE *pGS);
+
+	int __fastcall RecvPacket(BYTE *ABuffer, int ALen);
+	int __fastcall ProcessRecvPacket(BYTE *ABuffer, int ARcvLen);
+	int __fastcall ResVmsStatus(BYTE *ABuffer, int ARcvLen);
+	int __fastcall ResVmsModuleStatus(BYTE *ABuffer, int ARcvLen);
+	int __fastcall ResVmsMsgDownload(BYTE *ABuffer, int ARcvLen);
+	int __fastcall ResVmsLibDownload(BYTE *ABuffer, int ARcvLen);
+	int __fastcall ResVmsSignboardPowerControl(BYTE *ABuffer, int ARcvLen);
+	int __fastcall ResVmsInitialize(BYTE *ABuffer, int ARcvLen);
+
+	int __fastcall SendPacket(BYTE *ACmdBuff, int AReqSendLen);
+	int __fastcall ProcessSendPacket(BYTE AOpCode, COMMAND_ARGUMENT *AArg);
+	int __fastcall MakeMsgDownload(BYTE *ABuff, COMMAND_ARGUMENT *AArg);
+	int __fastcall MakeLibDownload(BYTE *ABuff, COMMAND_ARGUMENT *AArg);
+
+	int __fastcall ClientStateMachine(void);
+	int __fastcall ProcErrorState(bool flag, int result);
+	int __fastcall SetClientState(int ACase);
+	int __fastcall CheckLocalData(bool &ARequest);
+	int __fastcall CheckClientData(bool &ARequest);
+
+	int __fastcall SendDbThreadMessage(UINT Msg, int wParam, int lParam);
+    int __fastcall SendDbThreadDataMessage(UINT Msg, void *pData, int iLen);
+	void __fastcall ClientResponse(int error);
+
+protected:
+	void __fastcall Execute();
+	void __fastcall TcpClientConnect(TObject *Sender);
+	void __fastcall TcpClientCreateHandle(TObject *Sender);
+	void __fastcall TcpClientDestroyHandle(TObject *Sender);
+	void __fastcall TcpClientDisconnect(TObject *Sender);
+	void __fastcall TcpClientError(TObject *Sender, int SocketError);
+	void __fastcall TcpClientReceive(TObject *Sender, char *Buf, int &DataLen);
+	void __fastcall TcpClientSend(TObject *Sender, char *Buf, int &DataLen);
+    bool __fastcall SocketActivity(bool &AError);
+    bool __fastcall SocketActivity();
+    void __fastcall Close(void);
+
+    int __fastcall SendSubRegister(int AObj);
+
+    void __fastcall DebugState();
+    bool __fastcall IsCommandTimeout();
+
+    void __fastcall InfoPacket(BYTE *ABuff, int ALen, bool ASend, int AResult=0);
+
+public:
+	__fastcall TVMSCThread(bool CreateSuspended, int Tag, bool *ActiveIndicator);
+	__fastcall ~TVMSCThread();
+
+    IPC_LOG_MESSAGE FLogMsg;
+    int LogData(char *ASndRcv, BYTE *AData, int ALen);
+    int LogWrite(int ALogKind, char *AFmt, ...);
+    int SysLogWrite(int ALogKind, char *AFmt, ...);
+
+    bool FUserTerm;
+    void ReqStatus();
+};
+//---------------------------------------------------------------------------
+#endif

+ 407 - 0
SRC/COMMON/VMSCThreadRecvF.cpp

@@ -0,0 +1,407 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "VMSCThread.h"
+#include "VMSCThreadRecvF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+/*
+ * 패킷 수신
+ *  arguments
+ *   void
+ *  return
+ *   void
+ */
+int __fastcall TVMSCThread::RecvPacket(BYTE *ABuffer, int ALen)
+{
+FErrLine = 3;
+    int       result = SYS_ERR_NONE;
+    BYTE      data;
+    PKT_HEAD *pHd = (PKT_HEAD*)m_RxBuff;
+
+    if (ALen > 0)
+    {
+        LogData("RECV", (char*)ABuffer, ALen);
+    }
+
+    m_rcvPacketTimer = Now();
+
+    for (int ii = 0; ii < ALen; ii++)
+    {
+        data = ABuffer[ii];
+        switch(m_RxState)
+        {
+        case RX_STX:
+            if (data == VMS_STX)
+            {
+                m_RxBuff[m_RxLen++] = data;
+                m_RxState = RX_HEAD;
+            }
+            else
+            {
+                LERROR("Receive packet format sequence error[STX]: %02X, %d", data, m_RxLen);
+                InitRx();
+            }
+            break;
+
+        case RX_HEAD:
+             m_RxBuff[m_RxLen++] = data;
+             if (m_RxLen == (int)sizeof(PKT_HEAD))
+             {
+                m_RxDataLen = htonl(pHd->Size);
+
+                if (m_RxDataLen > (CLIENT_RCV_BUF_SIZE-10) || m_RxDataLen == 0)
+                {
+                    LERROR("Receive packet length error: %d", m_RxDataLen);
+                    InitRx();
+                }
+                else
+                {
+                    m_RxPktLen = 1 + 1 + m_RxDataLen; // stx+etx+data(id~crc)
+                    m_RxState = RX_DATA;
+                }
+             }
+             break;
+
+        case RX_DATA:
+             // 나머지 데이터에 대한 유효성 처리는 하지 않는다.(ETX 체크안함)
+             m_RxBuff[m_RxLen++] = data;
+             if (m_RxLen == m_RxPktLen)
+             {
+                //패킷완성
+                result = ProcessRecvPacket(m_RxBuff, m_RxPktLen);
+                InitRx();
+                m_WatchDogTimer = Now();
+             }
+             break;
+        }
+    }
+
+    return result;
+}
+//---------------------------------------------------------------------------
+
+/*
+ * 수신 패킷 처리
+ *  arguments
+ *   void
+ *  return
+ *   void
+ */
+int __fastcall TVMSCThread::ProcessRecvPacket(BYTE *ABuffer, int ARcvLen)
+{
+FErrLine = 4;
+    VMS_PACKET *Pkt    = (VMS_PACKET*)ABuffer;
+	int         result = SYS_ERR_NONE;
+
+    InfoPacket(ABuffer, ARcvLen, false);
+
+    switch(Pkt->hd.OpCode)
+    {
+    case RES_VMS_STATUS://                   0x50        // Status 응답,  VMS->센터
+        result = ResVmsStatus(ABuffer, ARcvLen);
+        break;
+    case RES_VMS_MSG_DOWNLOAD://             0x51        // 문안 전송 응답, VMS->센터
+        result = ResVmsMsgDownload(ABuffer, ARcvLen);
+        break;
+    case RES_VMS_LIB_DOWNLOAD://             0x52        // Library download 응답, VMS->센터
+        result = ResVmsLibDownload(ABuffer, ARcvLen);
+        break;
+    case RES_VMS_PARAM_DOWNLOAD://           0x53        // Parameter download 응답, VMS->센터
+        break;
+    case RES_VMS_BLANK_DISP://               0x54        // Blank 응답, VMS->센터
+        break;
+    case RES_VMS_DEF_MSG_DISP://             0x55        // Default message display 응답, VMS->센터
+        break;
+    case RES_VMS_MODULE_STATUS://            0x56        // Module status upload 응답, VMS->센터
+        result = ResVmsModuleStatus(ABuffer, ARcvLen);
+        break;
+    case RES_VMS_INITIALIZE://               0x57        // Initialize 응답, VMS->센터
+        result = ResVmsInitialize(ABuffer, ARcvLen);
+        break;
+    case RES_VMS_LUMINANCE_LEVEL_SET://      0x58        // Luminance level set 응답, VMS->센터
+        break;
+    case RES_SIGNBOARD_POWER_CONTROL://      0x59        // Signboard power control 응답, VMS->센터
+        result = ResVmsSignboardPowerControl(ABuffer, ARcvLen);
+        break;
+    default:
+        LERROR("<<< Unknown ProcessRecvPacket: 0x%02X", Pkt->hd.OpCode);
+        return SYS_ERR_UNKNOWN_COMMAND;
+    }
+
+	if (result == SYS_ERR_NONE)
+    {
+		FClient.sendRetry = VMS_MAX_RETRY_COUNT;
+	}
+
+	return result;
+}
+//---------------------------------------------------------------------------
+
+// Initialize 요청 응답
+int __fastcall TVMSCThread::ResVmsInitialize(BYTE *ABuffer, int ARcvLen)
+{
+    VMS_PACKET *Pkt    = (VMS_PACKET*)ABuffer;
+	int         result = SYS_ERR_NONE;
+
+	return result;
+}
+//---------------------------------------------------------------------------
+
+// Signboard powwer control 요청 응답
+int __fastcall TVMSCThread::ResVmsSignboardPowerControl(BYTE *ABuffer, int ARcvLen)
+{
+    VMS_PACKET *Pkt    = (VMS_PACKET*)ABuffer;
+	int         result = SYS_ERR_NONE;
+
+	return result;
+}
+//---------------------------------------------------------------------------
+
+// VMS 상태정보 요청 응답
+int __fastcall TVMSCThread::ResVmsStatus(BYTE *ABuffer, int ARcvLen)
+{
+    VMS_PACKET *Pkt    = (VMS_PACKET*)ABuffer;
+	int         result = SYS_ERR_NONE;
+    ACK_NAK     res;
+
+    if (FClient.State == CT_CLIENT_WAIT)
+    {
+        //TODO: 클라이언트로 결과전송
+    }
+
+    if (FLocalCmd.obj == OBJ_GeneralStatus)
+    {
+        FLocalCmd.GeneralStatus = true;
+    }
+
+    if (FClient.State == CT_CLIENT_WAIT)
+        FClient.State = CT_CLIENT_COMMAND;
+    else
+    if (FClient.State == CT_LOCAL_WAIT)
+        FClient.State = CT_LOCAL_COMMAND;
+
+    SaveStatusData(ABuffer);
+
+	return result;
+}
+//---------------------------------------------------------------------------
+
+/*
+ *
+ *  arguments
+ *   void
+ *  return
+ *   void
+ */
+int __fastcall TVMSCThread::SaveStatusData(BYTE *pGS)
+{
+	int         result = SYS_ERR_OTHER;
+    VMS_STATUS1 status1;
+    VMS_STATUS2 status2;
+    short        temp;
+
+	if (m_pState == NULL) return result;
+
+#if 0
+typedef struct tagVmsStatus1
+{
+    BYTE localModeActive  : 1;
+    BYTE defaultParameter : 1;
+    BYTE resetOccured     : 1;
+    BYTE longPowerFail    : 1;
+    BYTE shortPowerFail   : 1;
+    BYTE doorOpen         : 1;
+    BYTE moduleErrRateOver: 1;
+    BYTE ramRomError      : 1;
+} VMS_STATUS1;
+
+typedef struct tagVmsStatus2
+{
+    BYTE libChecksumErr: 1;
+    BYTE fan           : 1;
+    BYTE heater        : 1;
+    BYTE boardPower    : 1;
+    BYTE boardPowerFail: 1;
+    BYTE blankDisp     : 1;
+    BYTE sirenFail     : 1;
+    BYTE reserved      : 1;
+} VMS_STATUS2;
+#endif
+    memcpy((char*)&status2, (char*)&pGS[11], sizeof(BYTE));
+    memcpy((char*)&status1, (char*)&pGS[12], sizeof(BYTE));
+    temp = (short)pGS[13];
+
+    m_pState->DoorStatus        = status1.doorOpen   == 0x01 ? vms_open : vms_close;
+    m_pState->ModulePowerStatus = status2.boardPower == 0x01 ? vms_on   : vms_off;
+    m_pState->FanStatus         = status2.fan        == 0x01 ? vms_on   : vms_off;
+    m_pState->HeaterStatus      = status2.heater     == 0x01 ? vms_on   : vms_off;
+	m_pState->BodyTemp          = temp;
+	m_pState->LuminanceStatus   = 0;  //PASIG 없음
+    m_pState->ModuleState       = status1.moduleErrRateOver == 0x01 ? vms_error : vms_normal;
+
+LDEBUG("     module_StatusCode: %2d, %s", status1.moduleErrRateOver, m_pState->ModuleState       == vms_normal ? "Normal" : "Error");
+LDEBUG("modulePower_StatusCode: %2d, %s", status2.boardPower,        m_pState->ModulePowerStatus == vms_on     ? "On"     : "Off");
+LDEBUG("       door_StatusCode: %2d, %s", status1.doorOpen,          m_pState->DoorStatus        == vms_open   ? "Open"   : "Close");
+LDEBUG("        fan_StatusCode: %2d, %s", status2.fan,               m_pState->FanStatus         == vms_on     ? "On"     : "Off");
+LDEBUG("     heater_StatusCode: %2d, %s", status2.heater,            m_pState->HeaterStatus      == vms_on     ? "On"     : "Off");
+LDEBUG("   body_TemperatureQty: %2d, %d", temp,                      m_pState->BodyTemp         );
+//LDEBUG("   luminance_StatusQty: %2d, %d", m_pState->LuminanceStatus, m_pState->LuminanceStatus  );
+
+	result = SYS_ERR_NONE;
+
+    //if (FGenState && FModState && FPowState)
+    {
+        //FGenState = FModState = FPowState = false;
+        POST_MSG(MAINHANDLE, WM_VMS_THREAD, WM_VMS_STATE_STTS, (int)FVmsObj);
+    }
+	return result;
+}
+//---------------------------------------------------------------------------
+
+// VMS 상태정보 요청 응답
+int __fastcall TVMSCThread::ResVmsModuleStatus(BYTE *ABuffer, int ARcvLen)
+{
+    VMS_PACKET *Pkt    = (VMS_PACKET*)ABuffer;
+	int         result = SYS_ERR_NONE;
+
+    if (FClient.State == CT_CLIENT_WAIT)
+    {
+        //TODO: 클라이언트로 결과전송
+    }
+
+    if (FLocalCmd.obj == OBJ_ModuleStatus)
+    {
+        FLocalCmd.ModuleStatus = true;
+    }
+
+    if (FClient.State == CT_CLIENT_WAIT)
+        FClient.State = CT_CLIENT_COMMAND;
+    else
+    if (FClient.State == CT_LOCAL_WAIT)
+        FClient.State = CT_LOCAL_COMMAND;
+
+    BYTE ModuleState;
+    memset((char*)m_pState->ModuleStatus, 0x00, sizeof(m_pState->ModuleStatus));
+    //INT_VMS_MAX_MODULE_BIT
+    int nBytes = (int)CommUtil_swapl(Pkt->hd.Size);
+    nBytes -= 12;
+    if (FLogFile->FLogCfg.Debug)
+    {
+    LDEBUG("ModuleInfo Bytes: %d, %d", nBytes, nBytes*8);
+        for (int ii = 0; ii < nBytes; ii++)
+        {
+    LDEBUG("                : %d, %02X", ii, Pkt->data[ii]);
+        }
+    }
+
+    memcpy((char*)m_pState->ModuleStatus, (char*)Pkt->data, nBytes);
+	return result;
+}
+//---------------------------------------------------------------------------
+
+// VMS MSG Download 요청 응답
+int __fastcall TVMSCThread::ResVmsMsgDownload(BYTE *ABuffer, int ARcvLen)
+{
+    VMS_PACKET *Pkt    = (VMS_PACKET*)ABuffer;
+	int         result = SYS_ERR_NONE;
+
+    try
+    {
+        m_pVmsFormList->Lock();
+
+        int nFormCnt = m_pVmsFormList->Count();
+        for (int ii = 0; ii < nFormCnt; ii++)
+        {
+            TVmsForm *pVmsForm = m_pVmsFormList->GetItem(ii);
+            if (!pVmsForm) continue;
+
+            pVmsForm->SvcRes = true;
+        }
+    }
+    __finally
+    {
+        m_pVmsFormList->UnLock();
+    }
+
+    if (FLocalCmd.obj == OBJ_RealTimeDisplay)
+    {
+        SAVE_STRUCT ProvideSave;
+
+        memset(&ProvideSave, 0x00, sizeof(ProvideSave));
+
+        ProvideSave.Type    = save_provide;
+        ProvideSave.Count   = 1;
+        ProvideSave.pObj[0] = (void*)FVmsObj;
+
+        FVmsObj->CTLMODE->Enable   = object_disable;
+        FVmsObj->CTLMODE->SvcDate  = Now().FormatString("yyyymmddhhnnss");
+        FVmsObj->CTLMODE->SaveFlag = true;
+        FVmsObj->CTLMODE->Result   = true;
+
+
+        if ((result = SendDbThreadDataMessage(WM_PROVIDE_SAVE, &ProvideSave, sizeof(ProvideSave))) != VERR_NONE)
+        {
+            SERROR("SendDbThreadDataMessage Error %d", result);
+        }
+    }
+
+	return result;
+}
+//---------------------------------------------------------------------------
+
+// VMS LIB Download 요청 응답
+int __fastcall TVMSCThread::ResVmsLibDownload(BYTE *ABuffer, int ARcvLen)
+{
+    VMS_PACKET *Pkt    = (VMS_PACKET*)ABuffer;
+	int         result = SYS_ERR_NONE;
+
+    try
+    {
+        m_pVmsFormList->Lock();
+
+        int nFormCnt = m_pVmsFormList->Count();
+        for (int ii = 0; ii < nFormCnt; ii++)
+        {
+            TVmsForm *pVmsForm = m_pVmsFormList->GetItem(ii);
+            if (!pVmsForm) continue;
+
+            pVmsForm->SvcRes = true;
+        }
+    }
+    __finally
+    {
+        m_pVmsFormList->UnLock();
+    }
+
+    if (FLocalCmd.obj == OBJ_RealTimeDisplay)
+    {
+        SAVE_STRUCT ProvideSave;
+
+        memset(&ProvideSave, 0x00, sizeof(ProvideSave));
+
+        ProvideSave.Type    = save_provide;
+        ProvideSave.Count   = 1;
+        ProvideSave.pObj[0] = (void*)FVmsObj;
+
+        FVmsObj->CTLMODE->Enable   = object_disable;
+        FVmsObj->CTLMODE->SvcDate  = Now().FormatString("yyyymmddhhnnss");
+        FVmsObj->CTLMODE->SaveFlag = true;
+        FVmsObj->CTLMODE->Result   = true;
+
+
+        if ((result = SendDbThreadDataMessage(WM_PROVIDE_SAVE, &ProvideSave, sizeof(ProvideSave))) != VERR_NONE)
+        {
+            SERROR("SendDbThreadDataMessage Error %d", result);
+        }
+    }
+
+	return result;
+}
+//---------------------------------------------------------------------------
+

+ 6 - 0
SRC/COMMON/VMSCThreadRecvF.h

@@ -0,0 +1,6 @@
+//---------------------------------------------------------------------------
+
+#ifndef VMSCThreadRecvFH
+#define VMSCThreadRecvFH
+//---------------------------------------------------------------------------
+#endif

+ 349 - 0
SRC/COMMON/VMSCThreadSendF.cpp

@@ -0,0 +1,349 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "VMSCThread.h"
+#include "VMSCThreadSendF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+/*
+ * 송신 패킷 처리
+ *  arguments
+ *   void
+ *  return
+ *   void
+ */
+int __fastcall TVMSCThread::ProcessSendPacket(BYTE AOpCode, COMMAND_ARGUMENT *AArg)
+{
+FErrLine = 10;
+    VMS_PACKET *Pkt    = (VMS_PACKET*)m_TxBuff;
+    int         result = SYS_ERR_NONE;
+	int         nData  = 0;
+    int         sndLen = 0;
+
+    unsigned crc;
+	unsigned short year, mon, day;
+	unsigned short hour, min, sec, msec;
+
+	Now().DecodeDate(&year, &mon, &day);
+	Now().DecodeTime(&hour, &min, &sec, &msec);
+
+    Pkt->hd.STX    = VMS_STX;   // STX, 0x02
+    Pkt->hd.ID     = 0x00;      // Reserved, 0x00
+    Pkt->hd.OpCode = AOpCode;   // OpCode
+    sprintf(Pkt->hd.ADDR, "%04d", FVmsObj->Id); // Address
+
+	switch(AOpCode)
+    {
+    case REQ_VMS_STATUS://                  0x50        // Status 요청,  센터->VMS
+        Pkt->data[nData++] = (BYTE)HIBYTE(year);
+        Pkt->data[nData++] = (BYTE)LOBYTE(year);
+        Pkt->data[nData++] = (BYTE)mon;
+        Pkt->data[nData++] = (BYTE)day;
+        Pkt->data[nData++] = (BYTE)hour;
+        Pkt->data[nData++] = (BYTE)min;
+        Pkt->data[nData++] = (BYTE)sec;
+        break;
+    case REQ_VMS_MSG_DOWNLOAD://            0x51        // 문안 전송 요청, 센터->VMS
+        nData = MakeMsgDownload(Pkt->data, AArg);
+        if (nData <= 0)
+        {
+            LERROR(">>> MakeMsgDownload Faild");
+            return SYS_ERR_DATABASE;
+        }
+        break;
+    case REQ_VMS_LIB_DOWNLOAD://            0x52        // Library download 요청, 센터->VMS
+        nData = MakeLibDownload(Pkt->data, AArg);
+        if (nData <= 0)
+        {
+            LERROR(">>> MakeLibDownload Faild");
+            return SYS_ERR_DATABASE;
+        }
+        break;
+    case REQ_VMS_PARAM_DOWNLOAD://          0x53        // Parameter download 요청, 센터->VMS
+		Pkt->data[nData++] = AArg->Publication.Data.Set2.DefCommErr;                           // 통신장애 기본값, 제어기가 Host로부터 Poll 또는 명령을 받지 않고 경과할 수 있는 최대시간 (default ; 60초)
+		Pkt->data[nData++] = (BYTE)HIBYTE(AArg->Publication.Data.Set2.SlotCommErr);                          // 통신장애 slot번호, 통신 fail 시 표시할 메시지 번호(default 0번)
+		Pkt->data[nData++] = (BYTE)LOBYTE(AArg->Publication.Data.Set2.SlotCommErr);                          // 통신장애 slot번호, 통신 fail 시 표시할 메시지 번호(default 0번)
+		Pkt->data[nData++] = (BYTE)HIBYTE(AArg->Publication.Data.Set2.SlotPowerErr);                         // 전원장애 slot번호, 전원장애 시 표시할 메시지 번호(default 0번)
+		Pkt->data[nData++] = (BYTE)LOBYTE(AArg->Publication.Data.Set2.SlotPowerErr);                         // 전원장애 slot번호, 전원장애 시 표시할 메시지 번호(default 0번)
+		Pkt->data[nData++] = AArg->Publication.Data.Set2.NightLuminance;                       // 야간 휘도 값, 0x30 ~ 0x3F
+		Pkt->data[nData++] = AArg->Publication.Data.Set2.DayLuminance;                         // 주간 휘도 값, 0x40 ~ 0x4F
+		Pkt->data[nData++] = AArg->Publication.Data.Set2.PhaseCycleTime;                       // phase시간주기, 장애시 phase주기 (default : 3초, 범위 : 0 ~ 10초)
+		Pkt->data[nData++] = AArg->Publication.Data.Set2.ModuleFailRate;                       // 모듈장애율, 한개의 module을 장애로 처리하기 위한 장애 pixel백분율 (default 10%)
+		Pkt->data[nData++] = AArg->Publication.Data.Set2.ModuleCheckTime;                      // 모듈감시 주기, 0 ~ 255 (단위:초)
+		Pkt->data[nData++] = AArg->Publication.Data.Set2.BoardOnHour;                          // 전광판 On time(시), 0시 ~ 23시
+		Pkt->data[nData++] = AArg->Publication.Data.Set2.BoardOnMin;                           // 전광판 On time(분), 0시 ~ 23시
+		Pkt->data[nData++] = AArg->Publication.Data.Set2.BoardOffHour;                         // 전광판 Off time(시), 0시 ~ 23시
+	    Pkt->data[nData++] = AArg->Publication.Data.Set2.BoardOffMin;                          // 전광판 Off time(분), 0시 ~ 23시
+#if 0
+11 통신장애 기본값 제어기가 Host로부터 Poll 또는 명령을 받지 않고 경과할 수 있는 최대시간 (default ; 60초)
+12 통신장애 slot번호 통신 fail 시 표시할 메시지 번호(default 0번)
+13
+14 전원장애 slot번호 전원장애 시 표시할 메시지 번호(default 0번)
+15
+16 야간 휘도 값 0x30 ~ 0x3F
+17 주간 휘도 값 0x40 ~ 0x4F
+18 phase시간주기 장애시 phase주기 (default : 3초, 범위 : 0 ~ 10초)
+19 모듈장애율 한개의 module을 장애로 처리하기 위한 장애 pixel백분율 (default 10%)
+20 모듈감시 주기 0 ~ 255 (단위:초)
+21 전광판 On time(시) 0시 ~ 23시 0x00000000 : 없음
+22 전광판 On time(분) 0분 ~ 59분
+23 전광판 Off time(시) 0시 ~ 23시
+24 전광판 Off time(분) 0분 ~ 59분
+#endif
+        break;
+    case REQ_VMS_BLANK_DISP://              0x54        // Blank 요청, 센터->VMS
+        //설정데이터없이 헤더로 정보로 전송
+        break;
+    case REQ_VMS_DEF_MSG_DISP://            0x55        // Default message display 요청, 센터->VMS
+        //설정데이터없이 헤더로 정보로 전송
+        break;
+    case REQ_VMS_MODULE_STATUS://           0x56        // Module status upload 요청, 센터->VMS
+        //설정데이터없이 헤더로 정보로 전송
+        break;
+    case REQ_VMS_INITIALIZE://              0x57        // Initialize 요청, 센터->VMS
+        //설정데이터없이 헤더로 정보로 전송
+        break;
+    case REQ_VMS_LUMINANCE_LEVEL_SET://     0x58        // Luminance level set 요청, 센터->VMS
+        Pkt->data[nData++] = AArg->Publication.Data.Ctl;
+        break;
+    case REQ_SIGNBOARD_POWER_CONTROL://     0x59        // Signboard power control 요청, 센터->VMS
+        Pkt->data[nData++] = AArg->Publication.Data.Ctl;
+        break;
+	default:
+        LERROR(">>> Unknown ProcessSendPacket: 0x%02X", AOpCode);
+        return SYS_ERR_UNKNOWN_COMMAND;
+	}
+
+#if 0
+BYTE    STX;
+BYTE    ID;
+BYTE    OpCode;
+UINT    Size;
+char    ADDR[4];
+char    DATA[n];
+char    CRC[2];
+char    ETX;
+#endif
+    sndLen = nData+1+1+4+4+2; // ID부터 CRC까지의 전체 길이(byte order준수)
+    Pkt->hd.Size = CommUtil_swapl((DWORD)sndLen);
+
+    crc = CommUtil_MakeCrc16((void*)&Pkt->hd.ID, (WORD)(sndLen-2));    //ID부터 DATA까지의 CRC-16 생성다항식에 의해 계산된 값
+    Pkt->data[nData++] = HIBYTE(crc);   // CRC
+    Pkt->data[nData++] = LOBYTE(crc);   // CRC
+    Pkt->data[nData++] = VMS_ETX;       // ETX, 0x03
+
+    result = SendPacket((BYTE*)Pkt, sndLen+2);  //STX+Pkt->Size+ETX
+
+    return result;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TVMSCThread::MakeMsgDownload(BYTE *ABuff, COMMAND_ARGUMENT *AArg)
+{
+	int nData  = 0;
+    int nForms = 0;
+    unsigned int nImgSize;
+
+	TVmsForm  *pVmsForm = NULL;
+
+	AnsiString MessageId;
+	int        ii;
+    bool       bException = false;
+
+    try
+    {
+        m_pVmsFormList->Lock();
+        int nFormCnt = m_pVmsFormList->Count();
+        if (nFormCnt > 9) nFormCnt = 9;
+        if (nFormCnt <= 0)
+        {
+            SERROR("Msg Download Form Count is zero ! ! !");
+            return -1;
+        }
+
+        ABuff[nData++] = 0x07;  // 정지화면 (Stationary)
+        ABuff[nData++] = 0x02;  // Left(오른쪽에서 왼쪽으로)
+
+        int nDispTime = FVmsObj->VMS_PHSE_CHNG_CYCL;
+        if (FVmsObj->VMS_PHSE_CHNG_CYCL <  3) nDispTime = 3;
+        if (FVmsObj->VMS_PHSE_CHNG_CYCL > 10) nDispTime = 10;
+
+        ABuff[nData++] = (BYTE)nDispTime;//0x05;  // 표출 시간/기간
+
+        ABuff[nData++] = (BYTE)nFormCnt-1;  // PHASE 갯수(0x00-1EA, 0x01 ~ 0x08=9EA)
+
+LDEBUG("Display Time: %d sec, Forms: %d", nDispTime, nFormCnt);
+        for (int ii = 0; ii < nFormCnt; ii++)
+        {
+            pVmsForm = m_pVmsFormList->GetItem(ii);
+            if (!pVmsForm)
+            {
+                SERROR("Msg FormId Memory Not Found: %d", ii);
+                continue;
+            }
+#if 0
+            LINFO("            pVmsForm->DisplayTime: %d", pVmsForm->DisplayTime);
+            LINFO("pVmsForm->DisplayMode.ToIntDef(0): %d", pVmsForm->DisplayMode.ToIntDef(0));
+            LINFO(" pVmsForm->DisplayDir.ToIntDef(0): %d", pVmsForm->DisplayDir.ToIntDef(0));
+            LINFO("          pVmsForm->pStream->Size: %d", pVmsForm->pStream->Size);
+#endif
+
+            nImgSize = pVmsForm->pStream->Size;
+
+            ABuff[nData++] = 'G';   //G: 그래픽, T: Text, B: Bar, S: Symbol
+            ABuff[nData++] = (BYTE)(nImgSize >> 24) & 0xFFFFFFFF;
+            ABuff[nData++] = (BYTE)(nImgSize >> 16) & 0xFFFFFFFF;
+            ABuff[nData++] = (BYTE)(nImgSize >>  8) & 0xFFFFFFFF;
+            ABuff[nData++] = (BYTE)(nImgSize      ) & 0xFFFFFFFF;
+
+            try
+            {
+                pVmsForm->pStream->Position = 0;
+                memcpy((char*)&ABuff[nData], (char *)pVmsForm->pStream->Memory, nImgSize);
+                nData += nImgSize;
+            }
+            catch(Exception &e)
+            {
+                bException = true;
+                SERROR("MemoryStream Allocation error: %s, FormId: %s", AnsiString(e.Message).c_str(), pVmsForm->FormId.c_str());
+            }
+        }
+    }
+    __finally
+    {
+        m_pVmsFormList->UnLock();
+    }
+
+    return nData;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TVMSCThread::MakeLibDownload(BYTE *ABuff, COMMAND_ARGUMENT *AArg)
+{
+	int nData  = 0;
+    int nForms = 0;
+    unsigned int nImgSize;
+
+	TVmsForm  *pVmsForm = NULL;
+
+	AnsiString MessageId;
+	int        ii;
+    bool       bException = false;
+
+    try
+    {
+        m_pVmsFormList->Lock();
+        int nFormCnt = m_pVmsFormList->Count();
+        if (nFormCnt > 9) nFormCnt = 9;
+        if (nFormCnt <= 0)
+        {
+            SERROR("Msg Download Form Count is zero ! ! !");
+            return -1;
+        }
+
+#if 0
+□ LIBRARY 메시지 번호의 범위
+  - Text Message Number			    : 1000 - 5999
+  - Graphic Symbol Message Number	: 6000 - 8999
+  - Full Graphic Message Number		: 9000 - 9999
+  - Message Number 0 은 Default Message
+#endif
+
+        int nLibNo = 0;
+        ABuff[nData++] = 0x07;  // 정지화면 (Stationary)
+        ABuff[nData++] = 0x02;  // Left(오른쪽에서 왼쪽으로)
+
+        ABuff[nData++] = (BYTE)(nLibNo >>  8) & 0xFFFFFFFF;
+        ABuff[nData++] = (BYTE)(nLibNo      ) & 0xFFFFFFFF;
+
+        ABuff[nData++] = (BYTE)nFormCnt;  // PHASE 갯수(0x00-1EA, 0x01 ~ 0x08=9EA)
+
+LDEBUG("Lib Download: Forms: %d", nFormCnt);
+
+        for (int ii = 0; ii < nFormCnt; ii++)
+        {
+            pVmsForm = m_pVmsFormList->GetItem(ii);
+            if (!pVmsForm)
+            {
+                SERROR("Msg FormId Memory Not Found: %d", ii);
+                continue;
+            }
+#if 0
+            LINFO("            pVmsForm->DisplayTime: %d", pVmsForm->DisplayTime);
+            LINFO("pVmsForm->DisplayMode.ToIntDef(0): %d", pVmsForm->DisplayMode.ToIntDef(0));
+            LINFO(" pVmsForm->DisplayDir.ToIntDef(0): %d", pVmsForm->DisplayDir.ToIntDef(0));
+            LINFO("          pVmsForm->pStream->Size: %d", pVmsForm->pStream->Size);
+#endif
+
+            nImgSize = pVmsForm->pStream->Size;
+
+            ABuff[nData++] = 'S';   //G: 그래픽, T: Text, B: Bar, S: Symbol
+            ABuff[nData++] = (BYTE)(nImgSize >> 24) & 0xFFFFFFFF;
+            ABuff[nData++] = (BYTE)(nImgSize >> 16) & 0xFFFFFFFF;
+            ABuff[nData++] = (BYTE)(nImgSize >>  8) & 0xFFFFFFFF;
+            ABuff[nData++] = (BYTE)(nImgSize      ) & 0xFFFFFFFF;
+
+            try
+            {
+                pVmsForm->pStream->Position = 0;
+                memcpy((char*)&ABuff[nData], (char *)pVmsForm->pStream->Memory, nImgSize);
+                nData += nImgSize;
+            }
+            catch(Exception &e)
+            {
+                bException = true;
+                SERROR("MemoryStream Allocation error: %s, FormId: %s", AnsiString(e.Message).c_str(), pVmsForm->FormId.c_str());
+            }
+        }
+    }
+    __finally
+    {
+        m_pVmsFormList->UnLock();
+    }
+
+    return nData;
+}
+//---------------------------------------------------------------------------
+
+/*
+ * 패킷 송신
+ *  arguments
+ *   void
+ *  return
+ *   void
+ */
+int __fastcall TVMSCThread::SendPacket(BYTE *ACmdBuff, int AReqSendLen)
+{
+    int result = SYS_ERR_NONE;
+
+    try
+    {
+        int nSendBytes = TcpClient->SendBuf(ACmdBuff, AReqSendLen);
+        if (nSendBytes == AReqSendLen)
+        {
+            FClient.sendRetry--;
+            FClient.sendTimer = Now();
+        }
+        else
+        {
+            result = SYS_ERR_WRITE_LENGTH;
+        }
+
+        if (SYS_ERR_NONE == result) LogData("SEND",      ACmdBuff, AReqSendLen);
+        else                        LogData("SEND Fail", ACmdBuff, nSendBytes);
+
+        InfoPacket(ACmdBuff, nSendBytes, true, result);
+    }
+    catch(Exception &e)
+    {
+        result = SYS_ERR_MEMORY;
+    }
+	return result;
+}
+//---------------------------------------------------------------------------
+

+ 6 - 0
SRC/COMMON/VMSCThreadSendF.h

@@ -0,0 +1,6 @@
+//---------------------------------------------------------------------------
+
+#ifndef VMSCThreadSendFH
+#define VMSCThreadSendFH
+//---------------------------------------------------------------------------
+#endif

+ 177 - 0
SRC/COMMON/VmsDataTypeF.cpp

@@ -0,0 +1,177 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "VmsDataTypeF.h"
+#include "AppGlobalF.h"
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+//---------------------------------------------------------------------------
+
+
+int GradeToColorCode(int AGrade)
+{
+	int nColor = color_green;
+	switch(AGrade)
+	{
+	//case grade_none:       nColor = color_black; break;
+	case grade_smoothness: nColor = color_green; break;
+	case grade_delay:      nColor = color_amber; break;
+	case grade_congestion: nColor = color_red;   break;
+	}
+	return nColor;
+}
+//---------------------------------------------------------------------------
+
+TColor GradeToFillColor(int AGrade)
+{
+	TColor clColor;
+#if 1
+    clColor = (TColor)g_AppCfg.nDefaultFillColor;
+#else
+    clColor = clBlack;
+#endif
+	switch(AGrade)
+	{
+	case grade_smoothness: clColor = clLime;   break;
+	case grade_delay:      clColor = clYellow; break;
+	case grade_congestion: clColor = clRed;    break;
+	}
+	return clColor;
+}
+//---------------------------------------------------------------------------
+
+AnsiString GradeToString(int AGrade, int AType)
+{
+	AnsiString sGrade = " ";
+#ifdef LANG_ENG
+    if (AType == enFormKindTrfImg)
+    {
+        switch(AGrade)
+        {
+        case grade_smoothness: sGrade = "LIGHT";    break;
+        case grade_delay:      sGrade = "MODERATE"; break;
+        case grade_congestion: sGrade = "HEAVy";    break;
+        }
+	}
+    else
+    {
+        switch(AGrade)
+        {
+        //case grade_smoothness: sGrade = "소통원활"; break;
+        case grade_smoothness: sGrade = "LIGHT";    break;
+        case grade_delay:      sGrade = "MODERATE"; break;
+        case grade_congestion: sGrade = "HEAVy";    break;
+        }
+    }
+#else
+    if (AType == enFormKindTrfImg)
+    {
+        switch(AGrade)
+        {
+        case grade_smoothness: sGrade = "원활"; break;
+        case grade_delay:      sGrade = "지체"; break;
+        case grade_congestion: sGrade = "정체"; break;
+        }
+	}
+    else
+    {
+        switch(AGrade)
+        {
+        //case grade_smoothness: sGrade = "소통원활"; break;
+        case grade_smoothness: sGrade = "소통원활"; break;
+        case grade_delay:      sGrade = "지 체"; break;
+        case grade_congestion: sGrade = "정 체"; break;
+        }
+    }
+#endif
+    return sGrade;
+}
+//---------------------------------------------------------------------------
+
+TColor CodeToColor(int ACode)
+{
+	TColor clColor = clBlack;
+	switch(ACode)
+	{
+	case color_black: clColor = clBlack;  break;
+	case color_red:   clColor = clRed;    break;
+	case color_green: clColor = clLime;   break;
+	case color_amber: clColor = clYellow; break;
+	}
+	return clColor;
+}
+//---------------------------------------------------------------------------
+
+AnsiString CodeToFont(int ACode)
+{
+#ifdef LANG_ENG
+    AnsiString sFont = "Tahoma";
+#else
+    AnsiString sFont = "맑은 고딕";
+#endif
+
+#if 0
+    #ifdef LANG_ENG
+        switch(ACode)
+        {
+        case font_malgun:  sFont = "맑은 고딕"; break;
+        case font_hygmj:   sFont = "HY견명조";  break;
+        case font_gulim:   sFont = "굴림체";    break;
+        case font_gungsuh: sFont = "궁서체";    break;
+        case font_dotum:   sFont = "돋움체";    break;
+        case font_batang:  sFont = "바탕체";    break;
+        }
+    #else
+        AnsiString sFont = "맑은 고딕";
+        switch(ACode)
+        {
+        case font_malgun:  sFont = "맑은 고딕"; break;
+        case font_hygmj:   sFont = "HY견명조";  break;
+        case font_gulim:   sFont = "굴림체";    break;
+        case font_gungsuh: sFont = "궁서체";    break;
+        case font_dotum:   sFont = "돋움체";    break;
+        case font_batang:  sFont = "바탕체";    break;
+        }
+    #endif
+#else
+    TCDSFont *pObj = FontManager->FLists.Find(ACode);
+    if (pObj)
+        sFont = pObj->FontName;
+#endif
+
+	return sFont;
+}
+//---------------------------------------------------------------------------
+
+AnsiString GetFtpImageId(AnsiString AImgNmbr)
+{
+    AnsiString sFtpImgId = AImgNmbr;
+
+    //6NNN0
+    //7NNN0
+    //8NNN0,8NNN1,8NNN2,8NNN3
+    try
+    {
+        //폼이미지와 중복되지 않도록 이미지아이디를 변경한다
+        //FTP로 다운로드 해야 하기 때문에 4자리이어야 한다
+        AnsiString sType;
+        if (AImgNmbr.SubString(1,1) == "6") sType = "S";
+        else
+        if (AImgNmbr.SubString(1,1) == "7") sType = "B";
+        else                                sType = "T";
+
+        sFtpImgId = AImgNmbr.SubString(1,1) + AImgNmbr.SubString(3,3);
+    }
+    catch(Exception &e)
+    {
+    }
+
+    return sFtpImgId;
+}
+//---------------------------------------------------------------------------
+
+
+

+ 256 - 0
SRC/COMMON/VmsDataTypeF.h

@@ -0,0 +1,256 @@
+//---------------------------------------------------------------------------
+
+#ifndef VmsDataTypeFH
+#define VmsDataTypeFH
+//---------------------------------------------------------------------------
+
+#include "VitzroCommF.h"
+
+#define VMS_MAX_RETRY_COUNT             3           /* 3 EA */
+#define VMS_DOWNLOAD_TIMEOUT            30          /* 30 sec */
+#define VMS_PROVIDE_TIMEOUT             30          /* 30 sec */
+#define VMS_BASE_DEFAULT_ID             8000        /* 기본 시나리오 ID */
+#define VMS_BASE_MANUAL_ID              9000        /* 수동 시나리오 ID */
+
+// 제공유형
+typedef enum en_provide_type
+{
+	provide_event = 1,                  /* 1:정보가공 완료 */
+	provide_mode,                       /* 2:운영모드 변경 */
+} EN_PROVIDE_TYPE;
+
+typedef enum en_object_id
+{
+    OBJ_None                = 0,    /* None */
+	OBJ_RealTimeDisplay     = 1,    /* 실시간정보표출 */
+	OBJ_ScheduledDisplay    = 2,    /* 계획된정보표출 */
+	OBJ_DownloadGraphicData = 3,    /* 그래픽데이터 다운로드 */
+	OBJ_StatusControl       = 4,    /* 상태제어 */
+	OBJ_StatusSetting       = 5,    /* 상태설정 */
+	OBJ_GeneralStatus       = 6,    /* 기본상태정보 */
+	OBJ_PowerStatus         = 7,    /* 전원상태정보 */
+	OBJ_ModuleStatus        = 8,    /* 모듈상태정보 */
+	OBJ_DotStatus           = 9,    /* 도트상태정보 */
+	OBJ_ScreenStatus        = 10,   /* 표출상태정보 */
+	OBJ_DisplayingData      = 11,   /* 표출정보 */
+	OBJ_RealtimeFtpDisplay  = 12,   /* 표출정보 */
+} EN_OBJECT_ID;
+
+typedef enum en_status_control
+{
+	CTL_MODULE_POWER_ON = 1,
+	CTL_MODULE_POWER_OFF,
+	CTL_LUMINANCE_SET,
+	CTL_CONTROLLER_RESET,
+    CTL_SCREENSTATUS_REQ,
+    CTL_REALTIMEDISPLAY_REQ,
+} EN_STATUS_CONTROL;
+
+// 제어유형
+typedef enum en_control_type
+{
+	CTL_TYPE_PARA_SET = 1,      /* 1:환경설정정보 전송 */
+
+	CTL_TYPE_POWER_ON = 11,		/* 11:전원 On */
+	CTL_TYPE_POWER_OFF = 12,	/* 12:전원 Off */
+	CTL_TYPE_HEATER_ON = 21,	/* 21:히터 On */
+	CTL_TYPE_HEATER_OFF = 22,	/* 22:히터 Off */
+	CTL_TYPE_FAN_ON = 31,		/* 31:팬 On */
+	CTL_TYPE_FAN_OFF = 32,		/* 32:팬 Off */
+	CTL_TYPE_MODULE_ON = 41,	/* 41:전광판 On */
+	CTL_TYPE_MODULE_OFF = 42,	/* 42:전광판 Off */
+	CTL_TYPE_RESET = 61,		/* 61:제어기리셋 */
+    CTL_TYPE_LUMINANCE = 71,    /* 71:휘도제어 */
+} EN_CONTROL_TYPE;
+
+// 제어결과
+typedef enum en_control_ressult
+{
+	CTL_RESULT_SUCC,			/* 0:성공 */
+	CTL_RESULT_FAIL				/* 1:실패 */
+} EN_CONTROL_RESULT;
+
+// 스레드 자체 요청 메시지
+typedef struct local_command
+{
+    BYTE  OpCode;
+	int   obj;                		/* EN_OBJECT_ID */
+	DWORD DataPacketNumber;         /* DataPacket Number */
+	int   Idx;                      /* index */
+
+	bool GeneralStatus;				/* 기본상태정보 */
+	bool PowerStatus;               /* 전원상태정보 */
+	bool ModuleStatus;              /* 모듈상태정보 */
+    bool DotStatus;
+    bool ScreenStatus;
+    bool DisplayingData;
+
+    bool ScreenDataStatusMessage;
+    bool RealTimeDisplayMessage;
+} LOCAL_COMMAND;
+
+/* 설정 정보 */
+typedef struct vms_control_info
+{
+    BYTE  OpCode;
+	int   obj;                		/* EN_OBJECT_ID */
+	DWORD DataPacketNumber;         /* DataPacket Number */
+	int   Idx;                      /* index */
+
+    BYTE CmdTime[INT_VMS_MAX_DATETIME];         /* 명령수행시각 */
+	BYTE VmsId[INT_VMS_MAX_ID+1];		        /* VMS ID */
+    BYTE OperId[INT_VMS_MAX_OPER_ID+1];	        /* 제어운영자ID */
+    BYTE Result;					            /* 제어결과 */
+
+	union
+    {
+		struct
+        {
+			int SchMsgTime;                     /* 계획된 메시지 동작시간 */
+			int ModuleTemp;                     /* 모듈전원 OFF 온도 */
+			int FanTemp;                        /* Fan동작 기준온도 */
+			int HeaterTemp;                     /* Heater동작 기준온도 */
+			int ModuleFail;                     /* 모듈장애 판단율 */
+			int RetryCount;                     /* 재시도 횟수 */
+			int TimeOut;                        /* 최대응답대기시간 */
+		} Para;
+	} Data;
+} VMS_CONTROL_INFO;
+
+typedef struct
+{
+	int     obj;                	/* EN_OBJECT_ID */
+	DWORD   DataPacketNumber;       /* DataPacket Number */
+	int     Idx;                    /* index */
+} VMS_SERVER_CTL_INFO;
+
+
+/* 저장 정보 */
+typedef enum en_save_type
+{
+	save_provide = 1,                   /* 1:제공정보 */
+	save_download                       /* 2:다운로드정보 */
+} EN_SAVE_TYPE;
+
+typedef struct save_struct
+{
+	BYTE    Type;                          /* 저장유형 */
+	BYTE    Count;                         /* 정보 갯수 */
+	void   *pObj[INT_MAX_VMS_STATE];
+} SAVE_STRUCT;
+
+/* 제공 정보 */
+typedef struct provide_struct
+{
+	BYTE Type;                          /* 제공유형 */
+    BYTE Count;                                 /* 대상 VMS 개수 */
+    INT_VMS_MODE Unit[INT_MAX_VMS_MODE];
+} PROVIDE_STRUCT;
+
+#define ALL_VMS_ID                		"ALL"   /* 전체 VMS */
+
+
+// VMS 폼 스케줄종류
+typedef enum enFormScheduleType
+{
+    enFormTraffic = 0,
+    enFormDolbal,
+    enFormGongsa,
+    enFormHongbo,
+    enFormDeture,
+    enFormFixed,
+    enFormBase,
+    enFormCongest,
+} EN_FORM_SCHEDULE_TYPE;
+
+// VMS 폼 유형
+typedef enum enFormKind
+{
+    enFormKindTrfRow1 = 11,     // 소통상황(1단)
+    enFormKindTrfRow2 = 12,     // 소통상황(2단)
+    enFormKindTrfRow3 = 13,     // 소통상황(3단)
+    enFormKindTrfRow4 = 14,     // 소통상황(4단)
+    enFormKindTrfImg  = 15,     // 소통상황(도형식배경소통정보)
+    enFormKindCongest = 16,     // 정체소통상황
+    enFormKindDolbal  = 20,     // 돌발문안
+    enFormKindGongsa  = 30,     // 공사/행사문안
+    enFormKindHongbo  = 40,     // 홍보문안
+    enFormKindDetour  = 50,     // 우회도로
+} EN_FORM_KIND;
+
+// VMS 객체종류
+typedef enum en_object_data
+{
+	text_object_data,		/* 0:문자열 */
+	graphic_object_data,	/* 1:이미지 */
+	graphicID_object_data,  /* 2:이미지ID */
+} EN_OBJECT_DATA;
+
+// VMS 제공정보 객체 코드
+typedef enum en_vms_object_type
+{
+	vms_obj_none,       /* 0:정보없음 */
+	vms_obj_text,       /* 1:문자열 */
+	vms_obj_bitmap,     /* 2:Bitmap ID */
+	vms_obj_draw,       /* 3:Draw */
+} EN_VMS_OBJECT_TYPE;
+
+// 소통등급(혼잡도코드)
+typedef enum en_traffic_grade
+{
+	grade_none,             /* 0:정보없음 */
+	grade_smoothness,       /* 1:원활 */
+	grade_delay,            /* 2:지체 */
+	grade_congestion,       /* 3:정체 */
+} EN_TRAFFIC_GRADE;
+
+// VMS 컬러
+typedef enum en_color_code
+{
+	color_black,    /* 0:검정색 */
+	color_red,      /* 1:적색 */
+	color_green,    /* 2:녹색 */
+	color_amber,    /* 3:황색 */
+} EN_COLOR_CODE;
+
+// VMS 객체 폰트
+typedef enum en_font_code
+{
+	/* 0:굴림 */
+	font_malgun = 1,					/* 1:고딕체 */
+	font_hygmj,							/* 2:HY견명조 */
+	font_gulim,							/* 3:굴림체 */
+	font_gungsuh,						/* 4:궁서체 */
+	font_dotum,							/* 5:돋움체 */
+	font_batang							/* 6:바탕체 */
+} EN_FONT_CODE;
+
+// 폰트굵기
+typedef enum en_font_thickness
+{
+	font_thickness_normal,				/* 0:보통 */
+	font_thickness_bold,				/* 1:굵게 */
+} EN_FONT_THICKNESS;
+
+// 문자열정열방식
+typedef enum en_text_align
+{
+	text_align_left,  					/* 0:LEFT */
+	text_align_right,  					/* 1:RIGHT */
+	text_align_center,  				/* 2:CENTER */
+} EN_TEXT_ALIGN;
+
+/*
+*  VMS ASN.1 Code convert functions
+*/
+int GradeToColorCode(int AGrade);
+TColor GradeToFillColor(int AGrade);
+AnsiString GradeToString(int AGrade, int AType);
+
+TColor CodeToColor(int ACode);
+AnsiString CodeToFont(int ACode);
+
+
+AnsiString GetFtpImageId(AnsiString AImgNmbr);
+
+#endif

+ 333 - 0
SRC/COMMON/VmsPasigProtocolF.h

@@ -0,0 +1,333 @@
+/****************************************************************************
+ * @source      : VMSProtocolF.h
+ * @description : VMS Protocol header
+ ****************************************************************************
+ * DATE         AUTHOR    DESCRIPTION
+ * --------------------------------------------------------------------------
+ * 2016/09/02   shjung
+ *
+ ****************************************************************************/
+
+//---------------------------------------------------------------------------
+#ifndef __VMSPROTOCOL_H__
+#define __VMSPROTOCOL_H__
+//---------------------------------------------------------------------------
+#pragma pack(push, 1)
+//---------------------------------------------------------------------------
+
+#define     DEFAULT_TCP_PACKET_MAX_SIZE	    2048	    // default tcp packet max size
+
+#define     VMS_DEFAULT_PORT                6020        /* 기본 포드 */
+#define     VMS_DEFAULT_TIMEOUT             5           /* 5 Sec */
+
+#define     VMS_MAX_PACKET_SIZE             65535       /* max packet size */
+#define     VMS_MIN_PACKET_SIZE             8           /* min packet size */
+
+#define     VMS_MAX_DATAGRAM_SIZE	        65535       /* max DatagramSize */
+
+
+#define     VMS_CHECK_TIME                  60          /* vms check on/off time */
+#define     VMS_MAX_DEVICE                  64          // 64 EA, 현장 설치 9대
+
+#define     VMS_MAX_HEARTBEAT_TIME          30			/* max HeartbeatTime */
+
+
+// Prtocol Data
+#define     VMS_DLE                         0x10        // Data Link Escape
+#define     VMS_STX                         0x02        // Start of TeXt
+#define     VMS_ETX                         0x03        // End of TeXt
+#define     VMS_ACK                         0x06        // ACK
+#define     VMS_NAK                         0x15        // NAK
+
+// PASIG VMS Protocol
+#define     REQ_VMS_STATUS                  0x50        // Status 요청,  센터->VMS
+#define     RES_VMS_STATUS                  0x50        // Status 응답,  VMS->센터
+
+#define     REQ_VMS_MSG_DOWNLOAD            0x51        // 문안 전송 요청, 센터->VMS
+#define     RES_VMS_MSG_DOWNLOAD            0x51        // 문안 전송 응답, VMS->센터
+
+#define     REQ_VMS_LIB_DOWNLOAD            0x52        // Library download 요청, 센터->VMS
+#define     RES_VMS_LIB_DOWNLOAD            0x52        // Library download 응답, VMS->센터
+
+#define     REQ_VMS_PARAM_DOWNLOAD          0x53        // Parameter download 요청, 센터->VMS
+#define     RES_VMS_PARAM_DOWNLOAD          0x53        // Parameter download 응답, VMS->센터
+
+#define     REQ_VMS_BLANK_DISP              0x54        // Blank 요청, 센터->VMS
+#define     RES_VMS_BLANK_DISP              0x54        // Blank 응답, VMS->센터
+
+#define     REQ_VMS_DEF_MSG_DISP            0x55        // Default message display 요청, 센터->VMS
+#define     RES_VMS_DEF_MSG_DISP            0x55        // Default message display 응답, VMS->센터
+
+#define     REQ_VMS_MODULE_STATUS           0x56        // Module status upload 요청, 센터->VMS
+#define     RES_VMS_MODULE_STATUS           0x56        // Module status upload 응답, VMS->센터
+
+#define     REQ_VMS_INITIALIZE              0x57        // Initialize 요청, 센터->VMS
+#define     RES_VMS_INITIALIZE              0x57        // Initialize 응답, VMS->센터
+
+#define     REQ_VMS_LUMINANCE_LEVEL_SET     0x58        // Luminance level set 요청, 센터->VMS
+#define     RES_VMS_LUMINANCE_LEVEL_SET     0x58        // Luminance level set 응답, VMS->센터
+
+#define     REQ_SIGNBOARD_POWER_CONTROL     0x59        // Signboard power control 요청, 센터->VMS
+#define     RES_SIGNBOARD_POWER_CONTROL     0x59        // Signboard power control 응답, VMS->센터
+
+typedef struct tabBit
+{
+    BYTE u0:1;
+    BYTE u1:1;
+    BYTE u2:1;
+    BYTE u3:1;
+    BYTE u4:1;
+    BYTE u5:1;
+    BYTE u6:1;
+    BYTE u7:1;
+} BIT;
+
+typedef struct tabNAK
+{
+    BYTE crc:1;     // CRC error
+    BYTE cmd:1;     // Bad Command
+    BYTE dat:1;     // Bad Data
+    BYTE nbr:1;     // Bad Number
+    BYTE chk:1;     // Pixel Check
+    BYTE res:3;
+} NAK;
+
+typedef union tagAckNak
+{
+    BYTE    ack;
+    NAK     nak;
+} ACK_NAK;
+
+#define     POS_ACKNAK  11
+
+typedef struct tagVmsStatus1
+{
+    BYTE localModeActive  : 1;
+    BYTE defaultParameter : 1;
+    BYTE resetOccured     : 1;
+    BYTE longPowerFail    : 1;
+    BYTE shortPowerFail   : 1;
+    BYTE doorOpen         : 1;
+    BYTE moduleErrRateOver: 1;
+    BYTE ramRomError      : 1;
+} VMS_STATUS1;
+
+typedef struct tagVmsStatus2
+{
+    BYTE libChecksumErr: 1;
+    BYTE fan           : 1;
+    BYTE heater        : 1;
+    BYTE boardPower    : 1;
+    BYTE boardPowerFail: 1;
+    BYTE blankDisp     : 1;
+    BYTE sirenFail     : 1;
+    BYTE reserved      : 1;
+} VMS_STATUS2;
+
+typedef union tagVmsStatus
+{
+    char    tmp[2];
+} VMS_STATUS;
+
+// Protocol Packet Header
+typedef struct tagPktHead
+{
+    BYTE    STX;
+    BYTE    ID;
+    BYTE    OpCode;
+    UINT    Size;
+    char    ADDR[4];
+} PKT_HEAD;
+
+typedef struct tagVmsPaket
+{
+    PKT_HEAD    hd;
+    BYTE        data[VMS_MAX_PACKET_SIZE];
+} VMS_PACKET;
+
+// VMS Packet Receive Sate
+typedef enum
+{
+    RX_STX,
+    RX_HEAD,
+    RX_DATA,
+    RX_CRC,
+    RX_ETX,
+} RX_STATE;
+
+
+typedef enum en_sys_err_cd
+{
+    SYS_ERR_NONE,                           //0 no error
+    SYS_ERR_OTHER,                          //1 other
+    SYS_ERR_INTERNAL,                       //2 internal system error(kernel..)
+    SYS_ERR_MEMORY,                         //3 memory overflow
+    SYS_ERR_DATABASE,                       //4 system database error
+    SYS_ERR_RESET,                          //5 system reset
+    SYS_ERR_START,                          //6 system start
+    SYS_ERR_OFFLINE,                        //7 offline
+    SYS_ERR_NO_RES,                         //8 no response
+    SYS_ERR_ACCESS,                         //9 access denied
+    SYS_ERR_INVALID,                        //10 invalid data type
+    SYS_ERR_UNKNOWN,                        //11 unknown data type
+    SYS_ERR_WRITE_LENGTH,                   //12 write length
+    SYS_ERR_PACKET_SIZE_LARGE,              //13 packet size large
+    SYS_ERR_INVALID_TAG,                    //14 invalid tag
+    SYS_ERR_CRC,                            //15 crc
+    SYS_ERR_LENGTH,                         //16 length
+    SYS_ERR_ADDRESS,                        //17 address
+    SYS_ERR_HEADER_OPTIONS,                 //18 header options
+    SYS_ERR_UNKNOWN_COMMAND,                //19 unknown command
+    SYS_ERR_RECEIVE_TIMEOUT,                //20 receive timeout
+    SYS_ERR_DATA_SIZE,                      //21 data size
+    SYS_ERR_MISMATCH,                       //22 mismatch command
+    SYS_ERR_INVALID_PARA,                   //23 invalid parameter
+    SYS_ERR_MOVEMENT,                       //24 movement
+	SYS_ERR_UNAUTHORIZED,                   //25 unauthorized
+
+	SYS_ERR_DATEXDATAPACKET_DECODE,         /* 26 DatexDataPacket decode */
+	SYS_ERR_INVALID_VERSION_NUMBER,         /* 27 invalid version number */
+	SYS_ERR_C2CAUTHENTICATEDMESSAGE_DECODE, /* 28 C2CAuthenticatedMessage decode */
+	SYS_ERR_C2CAUTHENTICATEDMESSAGE,        /* 29 C2CAuthenticatedMessage */
+	SYS_ERR_NOT_LOGIN,                      /* 30 Not login */
+	SYS_ERR_ACCEPT_TYPE,                    /* 31 Accept Type */
+	SYS_ERR_DATEXPUBLISH_FORMAT,            /* 32 datexPublish Format */
+	SYS_ERR_DATEXPUBLISH_TYPE,              /* 33 datexPublish Type */
+	SYS_ERR_UNKNOWN_MESSAGE_ID,             /* 34 unknown Message id */
+	SYS_ERR_MESSAGE_DECODE,                 /* 35 Message decode */
+	SYS_ERR_DATEXDATAPACKET_ENCODE,         /* 36 DatexDataPacket encode */
+	SYS_ERR_C2CAUTHENTICATEDMESSAGE_ENCODE, /* 37 C2CAuthenticatedMessage encode */
+	SYS_ERR_MESSAGE_ENCODE,                 /* 38 Message encode */
+	SYS_ERR_PUBLICATIONDATA_ENCODE,         /* 39 PublicationData encode */
+	SYS_ERR_MISMATCH_DESTINATION_TEXT,      /* 40 mismatch Destination text */
+	SYS_ERR_DATEXLOGIN_VALUE,               /* 41 Login Value */
+	SYS_ERR_SUBSCRIPTION_TYPE,              /* 42 SubscriptionType Type */
+	SYS_ERR_SUBSCRIPTION_STATUS_VALUE,      /* 43 SubscriptionType Status Value */
+	SYS_ERR_SUBSCRIPTION_MODE_VALUE,        /* 44 SubscriptionType Mode Value */
+	SYS_ERR_SUBSCRIPTION_FORMAT_VALUE,      /* 45 SubscriptionType Format Value */
+	SYS_ERR_HANGUL_CONVERSION,              /* 46 Hangul Conversion */
+	SYS_ERR_INVALID_TAGANDLEN,              /* 47 invalid Tag And Len */
+	SYS_ERR_PUBLICATIONDATA_DECODE          /* 48 PublicationData decode */
+} EN_SYS_ERR_CD;
+
+
+// 클라이언트 요청
+typedef struct client_command
+{
+	BYTE  MsgSeq;                       /* 통신 일련 번호 */
+	DWORD ProcessID;                    /* 프로세스 ID */
+	WORD  OpCode;                       /* 데이터 내용을 구분하는 업무 코드 */
+	WORD  wSize;                        /* Size */
+} CLIENT_COMMAND;
+
+
+typedef enum en_subscription_nbr
+{
+    NBR_GENERAL_STATUS = 1,
+    NBR_MODULE_STATUS,
+    NBR_POWER_STATUS,
+    NBR_REALTIME_DISPLAY,
+
+    NBR_DOT_STATUS,
+    NBR_SCREEN_STATUS,
+    NBR_DISPLAYING_DATA,
+} EN_SUBSCRIPTION_NBR;
+
+typedef enum en_publication_nbr
+{
+	NBR_MODULE_POWER = 1,
+	NBR_LUMINANCE,
+	NBR_CONTROLLER_RESET,
+	NBR_STATUS_SETTING,
+    NBR_SCREEN_STATUS_REQ,
+    NBR_REALTIME_DISPLAY_REQ,
+	NBR_BASE_REALTIMEDISPLAY = 100,
+	NBR_BASE_SCHEDULEDDISPLAY = 200,
+	NBR_BASE_DOWNLOADGRAPHICDATA = 300
+} EN_PUBLICATION_NBR;
+
+typedef struct subscription_argument
+{
+	DWORD nbr;              		    /* datexSubscribe_Serial_nbr */
+	int   mode;               		    /* SubscriptionMode */
+	int   delay;              		    /* datexRegistered_UpdateDelay_qty */
+	int   obj;                		    /* EN_OBJECT_ID */
+} SUBSCRIPTION_ARGUMENT;
+
+typedef struct
+{
+	DWORD SubscribeSerialNbr;    	        /* Subscribe Serial Nbr */
+	int   obj;                		/* EN_OBJECT_ID */
+    char  szFormId[10];
+	union
+    {
+		struct
+        {
+			BYTE Mode;              /* EN_VMS_MODE */
+			int  Idx;               /* index */
+		} Form;
+
+		struct
+        {
+			int Idx;                /* index */
+		} Down;
+
+		BYTE Ctl;                   /* EN_STATUS_CONTROL */
+
+		struct
+        {
+			int SchMsgTime;			/* scheduledMessage_OperatingTimeQty */
+			int	ModuleTemp; 		/* module_OperatingTemperatureQty */
+			int	FanTemp; 			/* fan_OperatingTemperatureQty */
+			int	HeaterTemp; 		/* heater_OperatingTemperatureQty */
+			int	ModuleFail;			/* module_BasicFailureRate */
+			int	RetryCount;			/* maximum_RetryQty */
+			int	TimeOut;			/* response_TimeOutQty */
+		} Set;
+		struct
+        {
+            BYTE  DefCommErr;                           // 통신장애 기본값, 제어기가 Host로부터 Poll 또는 명령을 받지 않고 경과할 수 있는 최대시간 (default ; 60초)
+            short SlotCommErr;                          // 통신장애 slot번호, 통신 fail 시 표시할 메시지 번호(default 0번)
+            short SlotPowerErr;                         // 전원장애 slot번호, 전원장애 시 표시할 메시지 번호(default 0번)
+            BYTE  NightLuminance;                       // 야간 휘도 값, 0x30 ~ 0x3F
+            BYTE  DayLuminance;                         // 주간 휘도 값, 0x40 ~ 0x4F
+            BYTE  PhaseCycleTime;                       // phase시간주기, 장애시 phase주기 (default : 3초, 범위 : 0 ~ 10초)
+            BYTE  ModuleFailRate;                       // 모듈장애율, 한개의 module을 장애로 처리하기 위한 장애 pixel백분율 (default 10%)
+            BYTE  ModuleCheckTime;                      // 모듈감시 주기, 0 ~ 255 (단위:초)
+            BYTE  BoardOnHour;                          // 전광판 On time(시), 0시 ~ 23시
+            BYTE  BoardOnMin;                           // 전광판 On time(분), 0시 ~ 23시
+            BYTE  BoardOffHour;                         // 전광판 Off time(시), 0시 ~ 23시
+            BYTE  BoardOffMin;                          // 전광판 Off time(분), 0시 ~ 23시
+		} Set2;
+	} Data;
+} PUBLICATION_ARGUMENT;
+
+typedef union command_argument
+{
+    DWORD   FrED;       /* datexFrED_ConfirmPacket_nbr */
+    int     Logout;     /* logout code */
+	int     Terminate;  /* terminate code */
+
+	struct
+    {
+		DWORD nbr;      /* datexAccept_Packet_nbr */
+		int   type;     /* accept type */
+		DWORD sub;      /* registered subscription */
+	} Accept;
+
+    struct
+    {
+        DWORD nbr;      /* datexReject_Packet_nbr */
+		int   type;     /* accept type */
+        int   code;     /* reject code */
+    } Reject;
+
+	PUBLICATION_ARGUMENT  Publication;      /* Publication */
+    SUBSCRIPTION_ARGUMENT Subscription;     /* Subscription */
+
+} COMMAND_ARGUMENT;
+
+//---------------------------------------------------------------------------
+#pragma pack(pop)
+//---------------------------------------------------------------------------
+#endif

+ 4607 - 0
SRC/DM/DMCOMMF.cpp

@@ -0,0 +1,4607 @@
+
+//---------------------------------------------------------------------------
+#include "AppGlobalF.h"
+#include "DMCOMMF.h"
+#include "VmsDataTypeF.h"
+#include "FrmSysLogF.h"
+
+#ifdef RUN_SERVER
+    #include "VMSSThread.h"
+#endif
+#ifdef RUN_CLIENT
+    #include "VMSCThread.h"
+#endif
+
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma resource "*.dfm"
+TDMCOMM *DMCOMM;
+//---------------------------------------------------------------------------
+__fastcall TDMCOMM::TDMCOMM(TComponent* Owner)
+	: TDataModule(Owner)
+{
+    FProcessStateMin = -1;
+    FEquipStateMin   = -1;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TDMCOMM::DataModuleCreate(TObject *Sender)
+{
+//
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TDMCOMM::DataModuleDestroy(TObject *Sender)
+{
+//
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TDMCOMM::SetErrorString(String AErrorString)
+{
+    FErrorString = AErrorString;
+    FDbLog->LogWrite(NULL, eLOG_ERROR, AnsiString(FErrorString).c_str());
+    LERROR(AnsiString(FErrorString).c_str());
+}
+//---------------------------------------------------------------------------
+
+int TDMCOMM::LogWrite(int ALogKind, char *AFmt, ...)
+{
+    va_list     ap;
+    int         cnt = 0;
+    char        szFmtData[MAX_LOG_BUFFER];
+    AnsiString  sLogKind;
+    int         nStep = 0;
+
+    bool bLog = false;
+    switch(ALogKind)
+    {
+    case eLOG_INFO   : bLog = g_LogCfg.Info;    sLogKind = " [INF] "; break;
+    case eLOG_DATA   : bLog = g_LogCfg.Data;    sLogKind = " [DAT] "; break;
+    case eLOG_ERROR  : bLog = g_LogCfg.Error;   sLogKind = " [ERR] "; break;
+    case eLOG_WARNING: bLog = g_LogCfg.Warning; sLogKind = " [WAN] "; break;
+    case eLOG_DEBUG  : bLog = g_LogCfg.Debug;   sLogKind = " [DBG] "; break;
+    case eLOG_DETAIL : bLog = g_LogCfg.Detail;  sLogKind = " [DET] "; break;
+    }
+    if (!bLog) return -1;
+
+    try
+    {
+        va_start(ap, AFmt);
+        cnt = vsprintf(szFmtData, AFmt, ap);
+        va_end(ap);
+
+        nStep = 1;
+        ITSLog->LogWrite(NULL, ALogKind, szFmtData);
+
+        nStep = 2;
+        //IPC_LOG_MESSAGE *pLog = new IPC_LOG_MESSAGE;
+        IPC_LOG_MESSAGE *pLog = &FLogMsg;//(IPC_LOG_MESSAGE *)malloc(sizeof(IPC_LOG_MESSAGE));
+        if (pLog)
+        {
+            pLog->Kind = ALogKind;
+            pLog->Flag = 0;
+            pLog->Len  = strlen(szFmtData);
+            pLog->Tm   = Now();
+            memset(pLog->Msg, 0x00, sizeof(pLog->Msg));
+            sprintf(pLog->Msg, "%sDCOM %s", sLogKind.c_str(), szFmtData);
+
+        	DWORD   dwResult = 0;
+            LRESULT lResult = SEND_LOGMSG(FrmSysLog->Handle, WM_LOG_DISPLAY, pLog, NULL, SMTO_NORMAL, 2000, dwResult);
+            if (lResult == 0)
+            {
+                dwResult = GetLastError();
+                if (dwResult == ERROR_TIMEOUT)
+                {
+                }
+                //SAFE_DELETE(pLog);
+            }
+        }
+    }
+    catch(Exception &e)
+    {
+        LERROR("LogWrite: %d", nStep);
+    }
+    return cnt;
+}
+//---------------------------------------------------------------------------
+
+bool __fastcall TDMCOMM::DbConnect(String AConnStr)
+{
+    bool bResult = false;
+
+	try
+    {
+        //DbClose();
+
+        FDbConn = new TADOConnection(NULL);
+        if (!FDbConn) return false;
+
+        FDbConn->ConnectionTimeout = 10;
+        FDbConn->ConnectionString  = AConnStr;
+        FDbConn->KeepConnection	   = true;
+        FDbConn->LoginPrompt       = false;
+        FDbConn->Open();
+        bResult = true;
+    }
+    catch(EDatabaseError &E)
+    {
+        ErrorString = String(E.ClassName()) + E.Message;
+        DBERRORLOG("DbConnect", String(E.ClassName()), E.Message, AConnStr);
+    }
+    catch (Exception &exception)
+    {
+        ErrorString = String(exception.ClassName()) + exception.Message;
+        DBERRORLOG("DbConnect", String(exception.ClassName()), exception.Message, AConnStr);
+    }
+    return bResult;
+}
+//---------------------------------------------------------------------------
+
+bool __fastcall TDMCOMM::DbClose()
+{
+    bool bResult = false;
+
+	try
+    {
+        if (!FDbConn) return false;
+
+        if (FDbConn->Connected)
+        {
+            FDbConn->Close();
+            FDbConn->Connected = false;
+        }
+        delete FDbConn;
+        FDbConn = NULL;
+        bResult = true;
+    }
+    catch(EDatabaseError &E)
+    {
+        ErrorString = String(E.ClassName()) + E.Message;
+        DBERRORLOG("DbClose", String(E.ClassName()), E.Message, " ");
+    }
+    catch (Exception &exception)
+    {
+        ErrorString = String(exception.ClassName()) + exception.Message;
+        DBERRORLOG("DbClose", String(exception.ClassName()), exception.Message, " ");
+    }
+    return bResult;
+}
+//---------------------------------------------------------------------------
+
+bool __fastcall TDMCOMM::SQLText(TADOQuery *adoQry, String sQry, bool AReadOnly/*=true*/)
+{
+    try
+    {
+        adoQry->Close();
+        adoQry->SQL->Text = sQry;
+        if (AReadOnly)
+        {
+            adoQry->CursorType = ctOpenForwardOnly;
+            adoQry->LockType   = ltReadOnly;
+            adoQry->DisableControls();
+        }
+        return true;
+    }
+    catch(EDatabaseError &E)
+    {
+        ErrorString = String(E.ClassName()) + E.Message;
+        DBERRORLOG("SQLText", String(E.ClassName()), E.Message, sQry);
+    }
+    catch (Exception &exception)
+    {
+        ErrorString = String(exception.ClassName()) + exception.Message;
+        DBERRORLOG("SQLText", String(exception.ClassName()), exception.Message, sQry);
+    }
+    return false;
+}
+//---------------------------------------------------------------------------
+
+bool __fastcall TDMCOMM::SQLBind(TADOQuery *adoQry, String param, String var)
+{
+    try
+    {
+        adoQry->Parameters->ParamByName(param)->Value = var;
+        return true;
+    }
+    catch(EDatabaseError &E)
+    {
+        ErrorString = String(E.ClassName()) + E.Message;
+        DBERRORLOG("SQLBind", String(E.ClassName()), E.Message, adoQry->SQL->Text);
+    }
+    catch (Exception &exception)
+    {
+        ErrorString = String(exception.ClassName()) + exception.Message;
+        DBERRORLOG("SQLBind", String(exception.ClassName()), exception.Message, adoQry->SQL->Text);
+    }
+    return false;
+}
+//---------------------------------------------------------------------------
+
+bool __fastcall TDMCOMM::SQLClose(TADOQuery *adoQry)
+{
+    try
+    {
+        if (adoQry->Active)
+        {
+            adoQry->Recordset->Close();
+            adoQry->Close();
+            adoQry->Active = false;
+        }
+        adoQry->SQL->Clear();
+        return true;
+    }
+    catch(EDatabaseError &E)
+    {
+        ErrorString = String(E.ClassName()) + E.Message;
+        DBERRORLOG("SQLClose", String(E.ClassName()), E.Message, adoQry->SQL->Text);
+    }
+    catch (Exception &exception)
+    {
+        ErrorString = String(exception.ClassName()) + exception.Message;
+        DBERRORLOG("SQLClose", String(exception.ClassName()), exception.Message, adoQry->SQL->Text);
+    }
+    return false;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::SQLOpen(TADOQuery *adoQry)
+{
+    try
+    {
+        adoQry->Open();
+        adoQry->First();
+        return adoQry->RecordCount;
+    }
+    catch(EDatabaseError &E)
+    {
+        ErrorString = String(E.ClassName()) + E.Message;
+        DBERRORLOG("SQLOpen", String(E.ClassName()), E.Message, adoQry->SQL->Text);
+    }
+    catch (Exception &exception)
+    {
+        ErrorString = String(exception.ClassName()) + exception.Message;
+        DBERRORLOG("SQLOpen", String(exception.ClassName()), exception.Message, adoQry->SQL->Text);
+    }
+    return -1;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::SQLExec(TADOQuery *adoQry)
+{
+    try
+    {
+        adoQry->ExecSQL();
+        return adoQry->RowsAffected;
+    }
+    catch(EDatabaseError &E)
+    {
+        ErrorString = String(E.ClassName()) + E.Message;
+        DBERRORLOG("SQLExec", String(E.ClassName()), E.Message, adoQry->SQL->Text);
+    }
+    catch (Exception &exception)
+    {
+        ErrorString = String(exception.ClassName()) + exception.Message;
+        DBERRORLOG("SQLExec", String(exception.ClassName()), exception.Message, adoQry->SQL->Text);
+    }
+    return -1;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TDMCOMM::DbState(bool AFlag)
+{
+	if (AFlag)
+    {
+        SendMessage((HWND)g_AppCfg.lMainWinHandle, WM_USER, WM_DATABASE_OPEN, 0);
+    }
+    else
+    {
+        SendMessage((HWND)g_AppCfg.lMainWinHandle, WM_USER, WM_DATABASE_CLOSE, 0);
+        LERROR("Database Error");
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TDMCOMM::TcpClientDisconnect(TObject *Sender)
+{
+#ifdef RUN_SERVER
+    try
+    {
+        TCustomIpClient *pClientSocket = (TCustomIpClient*)Sender;
+        AnsiString sRemoteHost = pClientSocket->RemoteHost;
+        int        nRemotePort = pClientSocket->RemotePort.ToIntDef(0);
+        LINFO("VMS Client Disconnect: %s.%d", sRemoteHost.c_str(), nRemotePort);
+    }
+    catch(Exception &e)
+    {
+    }
+#endif
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TDMCOMM::TcpServerGetThread(TObject *Sender, TClientSocketThread *&ClientSocketThread)
+{
+#ifdef RUN_SERVER
+    TVmsCtlr        *pObj          = NULL;
+    TCustomIpClient *pClientSocket = NULL;
+
+    try
+    {
+        pClientSocket = new TCustomIpClient(NULL);
+        //pClientSocket->OnDisconnect = TcpClientDisconnect;
+
+        TcpServer->ServerSocketThread->ServerSocket->Accept(pClientSocket);
+
+		pObj = FindVms(pClientSocket->RemoteHost, pClientSocket->RemotePort.ToIntDef(0));
+
+        AnsiString sRemoteHost = pClientSocket->RemoteHost;
+        int        nRemotePort = pClientSocket->RemotePort.ToIntDef(0);
+
+    	LINFO("TCP Client connect request: %s.%d", sRemoteHost.c_str(), nRemotePort);
+
+		if (!pObj)
+        {
+            LERROR("Unknown VMS Client connect request: %s.%d [socket closed]", sRemoteHost.c_str(), nRemotePort);
+            ClientSocketThread = new TClientSocketThread(TcpServer->ServerSocketThread);
+            ClientSocketThread->Terminate();
+            pClientSocket->Close();
+            delete pClientSocket;
+            return;
+        }
+
+    	LINFO("%s VMS Client connect: %s.%d", pObj->VmsId.c_str(), sRemoteHost.c_str(), nRemotePort);
+		ClientSocketThread = new TVMSSThread(TcpServer->ServerSocketThread, pClientSocket, (int)pObj, &pObj->Server.ActiveIndicator);
+    }
+    catch(Exception &e)
+    {
+        ClientSocketThread = NULL;
+    	LERROR("TCP Client connect request exception: %s", e.Message.c_str());
+    }
+
+	pObj->Server.pThread = ClientSocketThread;
+
+	if (pObj->Server.pThread == NULL)
+    {
+		pObj->Server.Status = process_fail;
+    }
+    else
+	{
+		pObj->Server.Status = process_run;
+    }
+	pObj->ChangeDate = Now().FormatString("yyyymmddhhnnss");
+#endif
+}
+//---------------------------------------------------------------------------
+
+TVmsCtlr* __fastcall TDMCOMM::FindVms(AnsiString AIpAddress, int APort)
+{
+    VmsIterator it;
+    for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
+    {
+        TVmsCtlr *pObj = (TVmsCtlr*)it->second;
+
+        if (pObj->Server.UseFlag != bit_enable) continue;
+
+        if (pObj->IpAddress.AnsiCompare(AIpAddress) == 0)
+        {
+            if (pObj->Server.ActiveIndicator)
+            {
+                /* 기존 연결 해제 */
+                LWARN("Already connected client: %s %s [closed].", pObj->VmsId.c_str(), AIpAddress.c_str());
+                ControlVms(pObj, false);
+            }
+            return pObj;
+        }
+    }
+
+    return NULL;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TDMCOMM::TerminateVms(void)
+{
+#ifdef RUN_SERVER
+    int i;
+	TVMSSThread *pVMSSThread;
+    DWORD dwWaitResult;
+
+    LINFO("TerminateVms start");
+    if (TcpServer->Active)
+    {
+		TcpServer->Close();
+    }
+    LINFO("TerminateVms end");
+
+    VmsIterator it;
+    for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
+    {
+        TVmsCtlr *pObj = (TVmsCtlr*)it->second;
+
+        if (pObj->Server.UseFlag != bit_enable) continue;
+
+        if (pObj->Server.ActiveIndicator)
+        {
+            ControlVms(pObj, false);
+        }
+    }
+#endif
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TDMCOMM::ControlVms(TVmsCtlr *AObj, bool ACreate)
+{
+#ifdef RUN_SERVER
+	TVMSSThread *pVMSSThread;
+    DWORD        dwWaitResult;
+
+	if (!AObj) return;
+
+	if (AObj->Server.UseFlag != bit_enable) return;
+
+	if (ACreate) return;
+
+    AObj->Server.Status = process_stop;
+    AObj->ChangeDate    = Now().FormatString("yyyymmddhhnnss");
+
+    if (AObj->Server.pThread         != NULL &&
+        AObj->Server.ActiveIndicator == true )
+    {
+        try
+        {
+            pVMSSThread = (TVMSSThread *)AObj->Server.pThread;
+            //pVMSSThread->Terminate();
+            pVMSSThread->FDupClose = true;
+            //Sleep(500);
+            dwWaitResult = CommUtil_WaitThreadTerm(pVMSSThread->ThreadID, (HANDLE)pVMSSThread->Handle, WAIT_THREAD_TERMINATE_TIME);
+            if (dwWaitResult == STILL_ACTIVE)
+            {
+                LERROR("VMS thread terminate fail: %s", AObj->VmsId.c_str());
+            }
+
+            AObj->Server.pThread = NULL;
+        }
+        catch(Exception &e)
+        {
+        }
+    }
+#endif
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TDMCOMM::MonitoringVms(bool ServerRun)
+{
+#ifdef RUN_SERVER
+    VmsIterator it;
+    for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
+    {
+        TVmsCtlr *pObj = (TVmsCtlr*)it->second;
+        if (pObj->Server.UseFlag != bit_enable) continue;
+
+        switch(pObj->Server.Status)
+        {
+        case process_fail:
+            break;
+        case process_run:
+            if (pObj->Server.pThread == NULL)
+            {
+                pObj->Server.Status = process_fail;
+                pObj->ChangeDate    = Now().FormatString("yyyymmddhhnnss");
+            }
+            else
+            {
+                if (!pObj->Server.ActiveIndicator)
+                {
+                    pObj->Server.pThread = NULL;
+                    pObj->Server.Status  = process_fail;
+                    pObj->ChangeDate     = Now().FormatString("yyyymmddhhnnss");
+                }
+            }
+            break;
+        case process_stop:
+            break;
+        }
+    }
+
+	if (ServerRun)
+	{
+		try
+		{
+			if (!TcpServer->Active)
+			{
+				TcpServer->LocalPort = g_AppCfg.comm.nListenPort;
+				TcpServer->BlockMode = bmThreadBlocking;
+
+                int nReqThreadCacheSize = VMS_MAX_DEVICE + 10;
+                int nThreadCacheSize = TcpServer->ServerSocketThread->ThreadCacheSize;
+                if (nThreadCacheSize < nReqThreadCacheSize)
+                {
+                    TcpServer->ServerSocketThread->ThreadCacheSize = nReqThreadCacheSize;
+                }
+				//TcpServer->ServerSocketThread->ThreadCacheSize = VMS_MAX_DEVICE;
+
+                //서버소켓 리슨 시작
+				TcpServer->Open();
+
+                nThreadCacheSize = TcpServer->ServerSocketThread->ThreadCacheSize;
+			}
+		}
+		catch(Exception &e)
+		{
+		}
+ 	}
+#endif
+}
+//---------------------------------------------------------------------------
+
+#ifdef RUN_CLIENT
+void __fastcall TDMCOMM::TerminateVmsClient(TVmsCtlr *AObj)
+{
+	TVMSCThread *pVMSCThread;
+    DWORD        dwWaitResult;
+
+	if (AObj == NULL || AObj->Client.UseFlag != bit_enable) return;
+
+
+    AObj->Client.Status = process_stop;
+
+    if ((AObj->Client.pThread         != NULL) &&
+        (AObj->Client.ActiveIndicator == true))
+    {
+        try
+        {
+            pVMSCThread = (TVMSCThread *)AObj->Client.pThread;
+            //pVMSCThread->Terminate();
+            pVMSCThread->FUserTerm = true;
+            //Sleep(500);
+            dwWaitResult = CommUtil_WaitThreadTerm(pVMSCThread->ThreadID, (HANDLE)pVMSCThread->Handle, WAIT_THREAD_TERMINATE_TIME);
+            if (dwWaitResult == STILL_ACTIVE)
+            {
+                LERROR("VMS thread terminate fail: %s", AObj->VmsId.c_str());
+            }
+
+            AObj->Client.pThread = NULL;
+        }
+        catch(Exception &e)
+        {
+        }
+
+#ifndef RUN_SERVER
+        AObj->ChangeDate    = Now().FormatString("yyyymmddhhnnss");
+#endif
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TDMCOMM::TerminateVmsClient(void)
+{
+    VmsIterator it;
+    for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
+    {
+        TVmsCtlr *pObj = (TVmsCtlr*)it->second;
+
+        if (pObj->Server.UseFlag != bit_enable) continue;
+
+        if (pObj->Server.ActiveIndicator)
+        {
+            TerminateVmsClient(pObj);
+        }
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TDMCOMM::ControlVmsClient(TVmsCtlr *AObj, bool ACreate)
+{
+	TVMSCThread *pVMSCThread;
+    DWORD        dwWaitResult;
+
+	if (AObj == NULL || AObj->Client.UseFlag != bit_enable) return;
+
+    //실행중이면 종료
+    TerminateVmsClient(AObj);
+
+    if (ACreate)
+    {
+        //VMS 제어기 접속 스레드 생성
+        pVMSCThread = new TVMSCThread(true, (int)AObj, &AObj->Client.ActiveIndicator);
+        AObj->Client.pThread = pVMSCThread;
+        if (AObj->Client.pThread == NULL)
+        {
+            AObj->Client.Status = process_fail;
+        }
+        else
+        {
+            AObj->Client.wTimer = Now();
+        }
+        //LINFO("VMS Connect Thread create: %s", AObj->VmsId.c_str());
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TDMCOMM::MonitoringVmsClient(bool ServerRun)
+{
+LDEBUG("MonitoringVmsClient");
+    VmsIterator it;
+    for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
+    {
+        TVmsCtlr *pObj = (TVmsCtlr*)it->second;
+        if (pObj->Client.UseFlag != bit_enable) continue;
+
+        switch(pObj->Client.Status)
+        {
+        case process_fail:
+            if (ServerRun)
+            {
+#if 0
+                //서버는 기동중인데 클라이언트 WatchDog Timer가 제어기 연결대기 시간보다 길경우
+                //제어기접속 클라이언트스레드를 기동시킨다.
+                if (CommUtil_TimeDiff(pObj->Client.wTimer) > g_AppCfg.comm.nConnectWait)
+                {
+                    ControlVmsClient(pObj, true);
+                }
+#else
+                if ((pObj->Client.pThread         == NULL) ||
+                    (pObj->Client.ActiveIndicator != true))
+                {
+                    ControlVmsClient(pObj, true);
+                }
+#endif
+            }
+            break;
+        case process_run:
+            if (pObj->Client.pThread == NULL)
+            {
+                pObj->Client.Status = process_fail;
+#ifndef RUN_SERVER
+                pObj->ChangeDate    = Now().FormatString("yyyymmddhhnnss");
+#endif
+            }
+            else
+            {
+                if (!pObj->Client.ActiveIndicator)
+                {
+                    pObj->Client.pThread = NULL;
+                    pObj->Client.Status  = process_fail;
+#ifndef RUN_SERVER
+                    pObj->ChangeDate     = Now().FormatString("yyyymmddhhnnss");
+#endif
+                }
+            }
+            break;
+        case process_stop:
+            break;
+        }
+    }
+}
+//---------------------------------------------------------------------------
+#endif
+
+int __fastcall TDMCOMM::GetDbSysdate()
+{
+	int         nResult;
+	AnsiString  sQry;
+    TADOQuery  *pADO = NULL;
+    AnsiString  sSysDate = Now().FormatString("yyyymmddhhnnss");
+
+	nResult = VERR_OTHER;
+
+    LDEBUG("GetDbSysdate: Start");
+	try
+	{
+		pADO = new TADOQuery(NULL);
+        pADO->Connection = GetDbConnection();
+
+		try
+		{
+            sQry = "SELECT TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS') AS S_DATE  \r\n"
+                   "  FROM DUAL                                            \r\n";
+
+            SQLText(pADO, sQry, false);
+			SQLOpen(pADO);
+
+			for( ; !pADO->Eof; pADO->Next())
+			{
+                sSysDate = pADO->FieldByName("S_DATE")->AsString;
+                break;
+			}
+
+			nResult = VERR_NONE;
+		}
+		catch(EDatabaseError &E)
+		{
+            ErrorString = String(E.ClassName()) + E.Message;
+		}
+		catch(Exception &e)
+		{
+            ErrorString = String(e.ClassName()) + e.Message;
+		}
+	}
+	__finally
+	{
+		SQLFree(pADO);
+	}
+    LINFO("GetDbSysdate: %s", sSysDate.c_str());
+	return nResult;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::GetProcessInfo()
+{
+	int         nResult;
+	AnsiString  sQry;
+	int         nSelCnt = 0;
+	TADOQuery  *pADO = NULL;
+
+	nResult = VERR_OTHER;
+
+    LDEBUG("GetProcessInfo: Start");
+	try
+	{
+		pADO = new TADOQuery(NULL);
+        pADO->Connection = GetDbConnection();
+
+		try
+		{
+            sQry = "SELECT SYST_ID, SYST_TYPE,   \r\n"
+                   "       SYST_IP_1, PRGM_PORT  \r\n"
+                   "  FROM TB_UNIT_SYST          \r\n"
+                   " WHERE DEL_YN = 'N'          \r\n"
+                   " ORDER BY SYST_ID            \r\n";
+
+            SQLText(pADO, sQry, false);
+			SQLOpen(pADO);
+
+			for( ; !pADO->Eof; pADO->Next())
+			{
+                AnsiString sProcessId = pADO->FieldByName("SYST_ID")->AsString;
+                AnsiString sSystemTp  = pADO->FieldByName("SYST_TYPE")->AsString;
+                AnsiString sIpAddress = pADO->FieldByName("SYST_IP_1")->AsString;
+                AnsiString sUdpPort   = pADO->FieldByName("PRGM_PORT")->AsString;
+
+                if (g_AppCfg.sSystemId == sProcessId)
+                {
+                    //자기자신은 목록에 추가하지 않는다...
+                    //g_AppCfg.comm.nCenterPort = sUdpPort.ToIntDef(g_AppCfg.comm.nCenterPort);
+                    continue;
+                }
+                if (VComm_AddProcess(sProcessId, sSystemTp, sIpAddress, sUdpPort) >= 0)
+                {
+                    if ("UOT" == sSystemTp)
+                    {
+                        int nPort = sUdpPort.ToIntDef(0);
+                        VComm_AddProcess(sProcessId, sSystemTp, sIpAddress, AnsiString(nPort+1));
+                    }
+                }
+                nSelCnt++;
+			}
+
+			nResult = VERR_NONE;
+		}
+		catch(EDatabaseError &E)
+		{
+            ErrorString = String(E.ClassName()) + E.Message;
+		}
+		catch(Exception &e)
+		{
+            ErrorString = String(e.ClassName()) + e.Message;
+		}
+	}
+	__finally
+	{
+		SQLFree(pADO);
+	}
+
+    LINFO("GetProcessInfo: %d", nSelCnt);
+
+	return nResult;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::GetFontInfo()
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+    LDEBUG("GetFontInfo: Start");
+
+    try
+    {
+        FontManager->FLists.Lock();
+        FontManager->FLists.RemoveAll();
+    }
+    __finally
+    {
+        FontManager->FLists.UnLock();
+    }
+
+    sQry = "SELECT VMS_FONT_SHPE_CD AS CD,   \r\n"
+           "       VMS_FONT_SHPE_NM AS NM,   \r\n"
+           "       EDTN_CD                   \r\n"
+           "  FROM TB_VMS_FONT_SHPE          \r\n"
+           " ORDER BY CD ASC                 \r\n";
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = GetDbConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                int        FontCode = pADO->FieldByName("CD")->AsInteger;
+                AnsiString FontName = pADO->FieldByName("NM")->AsString.Trim();
+
+				TCDSFont *pObj = new TCDSFont();
+
+                pObj->FontCode = FontCode;
+                pObj->FontName = FontName;
+
+				FontManager->FLists.Push(pObj->FontCode, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ErrorString = String(E.ClassName()) + E.Message;
+            return VERR_OTHER;
+        }
+        catch(Exception &e)
+        {
+            ErrorString = String(e.ClassName()) + e.Message;
+            return VERR_OTHER;
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    LINFO("GetFontInfo: %d EA", FontManager->FLists.Size());
+
+    return VERR_NONE;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::GetVmsInfo()
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+    LDEBUG("GetVmsInfo: Start");
+
+    try
+    {
+        VmsManager->FLists.Lock();
+        VmsManager->FLists.RemoveAll();
+    }
+    __finally
+    {
+        VmsManager->FLists.UnLock();
+    }
+
+#if 0
+    sQry = "SELECT A.*,                                        \r\n"
+           "       (SELECT NVL(ATRB1, '320')                   \r\n"
+           "          FROM TB_CMMN_CD                          \r\n"
+           "         WHERE CMMN_CLSF_CD = 'VMP'                \r\n"
+           "           AND CMMN_CD = A.VMS_TYPE_CD) AS FORMW,  \r\n"
+           "       (SELECT NVL(ATRB2,  '64')                   \r\n"
+           "          FROM TB_CMMN_CD                          \r\n"
+           "         WHERE CMMN_CLSF_CD = 'VMP'                \r\n"
+           "           AND CMMN_CD = A.VMS_TYPE_CD) AS FORMH   \r\n"
+           "  FROM TB_VMS_CTLR A                               \r\n"
+           " WHERE A.DEL_YN = 'N'                              \r\n";
+#else
+    sQry = "SELECT A.*,                           \r\n"
+           "       B.VMS_WDTH AS FORMW,           \r\n"
+           "       B.VMS_HGHT AS FORMH,           \r\n"
+           "       B.MODL_ROW_NUM AS MODV,        \r\n"
+           "       B.MODL_COL_NUM AS MODH         \r\n"
+           "  FROM TB_VMS_CTLR A, TB_VMS_TYPE B   \r\n"
+           " WHERE A.DEL_YN = 'N'                 \r\n"
+           "   AND A.VMS_TYPE_CD = B.VMS_TYPE_CD  \r\n";
+#endif
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = GetDbConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                AnsiString VmsNo     = pADO->FieldByName("VMS_CTLR_NMBR")->AsString.Trim();
+                AnsiString VmsId     = pADO->FieldByName("VMS_CTLR_ID")->AsString.Trim();
+                AnsiString VmsType   = pADO->FieldByName("VMS_USAG_TYPE_CD")->AsString.Trim();
+                AnsiString Name      = pADO->FieldByName("VMS_NM")->AsString.Trim();
+                AnsiString Location  = pADO->FieldByName("ISTL_LCTN_NM")->AsString.Trim();
+                AnsiString LocalNo   = pADO->FieldByName("VMS_CMNC_PORT")->AsString;//.ToIntDef(0);
+                AnsiString IpAddress = pADO->FieldByName("VMS_CTLR_IP")->AsString.Trim();
+                AnsiString WlTelNo   = "";
+                AnsiString WlIp      = "";
+                AnsiString WlPort    = 0;
+                int        VmsDownId = pADO->FieldByName("VMS_ID")->AsString.Trim().ToIntDef(0);
+
+				TVmsCtlr *pObj = new TVmsCtlr();
+
+                pObj->FBmpDownload = g_AppCfg.DownloadBitmap;
+
+                pObj->Id        = pADO->FieldByName("VMS_ID")->AsString.Trim().ToIntDef(0);
+                pObj->VmsNo     = VmsNo;
+                pObj->VmsId     = VmsId;
+                pObj->VmsDownId.printf("%02d", VmsDownId);
+                pObj->VmsType   = VmsType;
+                pObj->Name      = Name;
+                pObj->Location  = Location;
+                pObj->LocalNo   = LocalNo.ToIntDef(355);
+                pObj->IpAddress = IpAddress;
+                pObj->WlTelNo   = WlTelNo;
+                pObj->WlIp      = WlIp;
+                pObj->WlPort    = 0;
+
+                pObj->OPER_MODE             = pADO->FieldByName("OPER_MODE")->AsString;
+
+                pObj->MODULE.PowerOnTime    = Now().FormatString("yyyymmdd") + pADO->FieldByName("PANL_ON_TIME")->AsString;
+                pObj->MODULE.PowerOffTime   = Now().FormatString("yyyymmdd") + pADO->FieldByName("PANL_OFF_TIME")->AsString;
+                pObj->MODULE.Retry          = 0;
+
+                pObj->LUMINANCE.SchTime = Now().FormatString("yyyymmdd");
+                pObj->LUMINANCE.Value   = 0;
+                pObj->LUMINANCE.Retry   = 0;
+
+                pObj->VMS_PHSE_CHNG_CYCL    = pADO->FieldByName("VMS_PHSE_CHNG_CYCL")->AsInteger;
+                pObj->VMS_CMNC_ERR_BASS_VAL = pADO->FieldByName("VMS_CMNC_ERR_BASS_VAL")->AsInteger;
+                pObj->FAN_MTNS_TMPR         = pADO->FieldByName("FAN_MTNS_TMPR")->AsInteger;
+                pObj->HETR_MTNS_TMPR        = pADO->FieldByName("HETR_MTNS_TMPR")->AsInteger;
+                pObj->VMS_MODL_ERR_RATE     = pADO->FieldByName("VMS_MODL_ERR_RATE")->AsInteger;
+
+                pObj->VMS_MAX_PHSE_NUM      = pADO->FieldByName("VMS_MAX_PHSE_NUM")->AsInteger;
+
+                pObj->VMS_NGHT_BRGH_STEP    = pADO->FieldByName("VMS_NGHT_BRGH_STEP")->AsInteger;     // NUMBER(2)    Y            VMS 야간 휘도 단계
+                pObj->VMS_WEEK_BRGH_STEP    = pADO->FieldByName("VMS_WEEK_BRGH_STEP")->AsInteger;     // NUMBER(2)    Y            VMS 주간 휘도 단계
+                pObj->CMNCFAIL_SLOT_NMBR    = pADO->FieldByName("CMNCFAIL_SLOT_NMBR")->AsInteger;     // NUMBER(4)    Y    0        통신장애 SLOT 번호
+                pObj->PWER_FAIL_SLOT_NMBR   = pADO->FieldByName("PWER_FAIL_SLOT_NMBR")->AsInteger;    // NUMBER(4)    Y    0        전원 장애 SLOT 번호
+
+                pObj->WIDTH                 = pADO->FieldByName("FORMW")->AsInteger;
+                pObj->HEIGHT                = pADO->FieldByName("FORMH")->AsInteger;
+
+                pObj->ModVerCnt             = pADO->FieldByName("MODV")->AsInteger;
+                pObj->ModHorCnt             = pADO->FieldByName("MODH")->AsInteger;
+
+        		sprintf(pObj->DSTATE.VmsId, "%.*s", INT_VMS_MAX_ID, pObj->VmsNo.c_str());
+
+                if (pObj->OPER_MODE == "A")
+                    pObj->DSTATE.OprMode = 'A';
+                else
+                if (pObj->OPER_MODE == "B")
+                    pObj->DSTATE.OprMode = 'B';
+                else
+                    pObj->DSTATE.OprMode = 'F';
+
+                pObj->DSTATE.Comm  = vms_error;
+                pObj->DSTATE.Wcomm = vms_error;
+
+                pObj->DSTATE.ScheduledMessageOperatingTime = pObj->VMS_PHSE_CHNG_CYCL;    /* 필수 계획된 메시지의 동작시간(초) */
+                pObj->RSTATE.ScheduledMessageOperatingTime = pObj->VMS_PHSE_CHNG_CYCL;    /* 필수 계획된 메시지의 동작시간(초) */
+
+                pObj->DSTATE.ModuleOperatingTemperature    = pObj->VMS_CMNC_ERR_BASS_VAL; /* 필수 모듈 전원이 꺼지는 온도값(℃) */
+                pObj->DSTATE.FanOperatingTemperature       = pObj->FAN_MTNS_TMPR;         /* 필수 Fan 동작 기준 온도값(℃) */
+                pObj->DSTATE.HeaterOperatingTemperature    = pObj->HETR_MTNS_TMPR;        /* 필수 Heater 동작 기준 온도값(℃) */
+                pObj->DSTATE.ModuleBasicFailureRate        = pObj->VMS_MODL_ERR_RATE;     /* 선택 모듈 장애율 (한 개의 모듈을 장애로 처리하기 위한 픽셀의 백분율값) */
+                pObj->DSTATE.ExternalLightOperatingLuminance = 0;                         /* 선택 외부전등 동작 기준 휘도값 */
+                pObj->DSTATE.MaximumRetry                    = 3;                         /* 선택 최대 재시도 횟수(회) */
+                pObj->DSTATE.ResponseTimeOut                 = 30;                        /* 선택 최대응답대기시간 (초) */
+                pObj->DSTATE.BlinkingCycleTime               = 100;                       /* 선택 점멸시간 주기 ( 1/10초단위) */
+                memcpy(&pObj->RSTATE, &pObj->DSTATE, sizeof(pObj->RSTATE));
+                pObj->RSTATE.Comm  = vms_error;
+                pObj->RSTATE.Wcomm = vms_error;
+
+                pObj->FSLog = new TITSLog(g_sLogDir + "Comm\\"+pObj->VmsId + "\\", pObj->VmsId+"S", g_AppCfg.sLogDay);
+                pObj->FCLog = new TITSLog(g_sLogDir + "Comm\\"+pObj->VmsId + "\\", pObj->VmsId+"C", g_AppCfg.sLogDay);
+                pObj->FSLog->FLogCfg = g_LogCfg;
+                pObj->FCLog->FLogCfg = g_LogCfg;
+
+                pObj->ChangeDate = Now().FormatString("yyyymmddhhnnss");
+                pObj->pPackQueue = new TThreadList();
+
+                if (VComm_CheckIpAddress(pObj->IpAddress.c_str()) &&
+                    pObj->pPackQueue &&
+                    pObj->FSLog      &&
+                    pObj->FCLog      )
+                {
+                    pObj->Server.UseFlag = bit_enable;
+                    pObj->Server.Status  = process_run;
+
+                    pObj->Client.UseFlag = bit_enable;
+                    pObj->Client.Status  = process_run;
+                }
+
+                pObj->SCHEDULE = new VMS_SCHEDULE_INFO;
+                pObj->SCHEDULE->Count = 0;
+
+                pObj->INCIDENT = new VMS_EVENT_INFO;
+                pObj->INCIDENT->Count = 0;
+
+                pObj->EVENT = new VMS_EVENT_INFO;
+                pObj->EVENT->Count = 0;
+
+                pObj->DOWNLOAD = new VMS_DOWNLOAD_INFO;
+                InitDownLoadInfo(pObj->DOWNLOAD);
+
+                pObj->CTLMODE = new VMS_CONTROL_MODE;
+                InitCtlModeInfo(pObj->CTLMODE);
+
+                if (pObj->VMS_MAX_PHSE_NUM > INT_MAX_VMS_FORM)
+                    pObj->VMS_MAX_PHSE_NUM = INT_MAX_VMS_FORM;
+
+                pObj->CTLMODE->MaxDisplayForm = pObj->VMS_MAX_PHSE_NUM;
+                pObj->CTLMODE->Control        = pObj->DSTATE.OprMode;
+#if 0
+                if (pObj->CTLMODE->MaxDisplayForm > INT_MAX_VMS_FORM)
+                    pObj->CTLMODE->MaxDisplayForm = INT_MAX_VMS_FORM;
+#endif
+
+                //VMS제공폼을 관리할 관리자 생성(VMS개별적으로 생성함)
+                pObj->pForms = new TVmsFormManager();
+                pObj->pForms->FormWidth = pObj->WIDTH;
+                pObj->pForms->FormHeight= pObj->HEIGHT;
+
+                String sFormDir = g_sFormDir + pObj->VmsId + "\\";
+                ForceDirectories(sFormDir.c_str());
+
+				VmsManager->FLists.Push(pObj->VmsNo, pObj);
+
+#if 0
+                String sFtpDir = g_sFtpDir + pObj->VmsId + "\\";
+                ForceDirectories(sFtpDir.c_str());
+#endif
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ErrorString = String(E.ClassName()) + E.Message;
+            return VERR_OTHER;
+        }
+        catch(Exception &e)
+        {
+            ErrorString = String(e.ClassName()) + e.Message;
+            return VERR_OTHER;
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    LINFO("GetVmsInfo: %d EA", VmsManager->Count);
+
+    //return VERR_NONE;
+    return GetVmsStateInfo();
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::GetVmsStateInfo()
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+    int        nSelCnt = 0;
+
+    LDEBUG("GetVmsStateInfo: Start");
+
+    sQry = "SELECT A.*                                \r\n"
+           "  FROM TB_VMS_STTS_PRST A,                \r\n"
+           "       TB_VMS_CTLR      B                 \r\n"
+           " WHERE B.DEL_YN = 'N'                     \r\n"
+           "   AND A.VMS_CTLR_NMBR = B.VMS_CTLR_NMBR  \r\n";
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = GetDbConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                AnsiString VmsNo = pADO->FieldByName("VMS_CTLR_NMBR")->AsString.Trim();
+                TVmsCtlr *pObj = VmsManager->FLists.Find(VmsNo);
+                if (!pObj) continue;
+
+                nSelCnt++;
+
+                AnsiString CBOXDOOR_OPEN_STTS_CD = pADO->FieldByName("CBOXDOOR_OPEN_STTS_CD")->AsString.Trim();
+                AnsiString PWER_STTS_CD          = pADO->FieldByName("PWER_STTS_CD")->AsString.Trim();
+                AnsiString CBOX_TMPR             = pADO->FieldByName("CBOX_TMPR")->AsString.Trim();
+                AnsiString CBOX_HMDT             = pADO->FieldByName("CBOX_HMDT")->AsString.Trim();
+                AnsiString FAN_STTS_CD           = pADO->FieldByName("FAN_STTS_CD")->AsString.Trim();
+                AnsiString HETR_STTS_CD          = pADO->FieldByName("HETR_STTS_CD")->AsString.Trim();
+                AnsiString CBOXFAN_STTS_CD       = pADO->FieldByName("CBOXFAN_STTS_CD")->AsString.Trim();
+
+                if (CBOXDOOR_OPEN_STTS_CD == "CDS0")
+                {
+                    pObj->DSTATE.DoorStatus = vms_close;
+                }
+                else
+                {
+                    pObj->DSTATE.DoorStatus = vms_open;
+                }
+
+                if (PWER_STTS_CD == "PWS0")
+                {
+                    pObj->DSTATE.ModulePowerStatus = vms_normal;
+                }
+                else
+                {
+                    pObj->DSTATE.ModulePowerStatus = vms_error;
+                }
+                pObj->DSTATE.BodyTemp = (short)CBOX_TMPR.ToIntDef(0);
+                pObj->DSTATE.LuminanceStatus = (BYTE)CBOX_HMDT.ToIntDef(0);
+
+                if (FAN_STTS_CD == "PAS0")
+                {
+                    pObj->DSTATE.FanStatus = vms_on;
+                }
+                else
+                {
+                    pObj->DSTATE.FanStatus = vms_off;
+                }
+
+                if (HETR_STTS_CD == "HTS0")
+                {
+                    pObj->DSTATE.HeaterStatus = vms_on;
+                }
+                else
+                {
+                    pObj->DSTATE.HeaterStatus = vms_off;
+                }
+
+                if (CBOXFAN_STTS_CD == "MOS0")
+                {
+                    pObj->DSTATE.ModuleState = vms_normal;
+                }
+                else
+                {
+                    pObj->DSTATE.HeaterStatus = vms_error;
+                }
+
+                memcpy(&pObj->RSTATE, &pObj->DSTATE, sizeof(pObj->RSTATE));
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ErrorString = String(E.ClassName()) + E.Message;
+            return VERR_OTHER;
+        }
+        catch(Exception &e)
+        {
+            ErrorString = String(e.ClassName()) + e.Message;
+            return VERR_OTHER;
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    LINFO("GetVmsStateInfo: %d EA", nSelCnt);
+
+    return VERR_NONE;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::GetVmsIfscInfo()
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+    int        nSelCnt = 0;
+
+    LINFO("GetVmsIfscInfo: Start");
+
+    try
+    {
+        VmsIterator it;
+        for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
+        {
+            TVmsCtlr *pObj = (TVmsCtlr*)it->second;
+            //if (pObj->Server.UseFlag != bit_enable) continue;
+            //기존 제공구간정보를 모두 삭제
+            pObj->FIfscLists.RemoveAll();
+        }
+    }
+    catch(Exception &e)
+    {
+    }
+
+    sQry = "SELECT A.VMS_CTLR_NMBR, B.VMS_IFSC_ID,    \r\n"
+           "       B.DSPL_PRRT, C.AXIS_YN             \r\n"
+           "  FROM TB_VMS_CTLR      A,                \r\n"
+           "       TB_VMS_IFSC_RLTN B,                \r\n"
+           "       TB_VMS_IFSC      C                 \r\n"
+           " WHERE A.VMS_CTLR_NMBR = B.VMS_CTLR_NMBR  \r\n"
+           "   AND B.VMS_IFSC_ID   = C.VMS_IFSC_ID    \r\n"
+           "   AND C.EDTN_CD <> 'EDI2'                \r\n"
+           "   AND A.DEL_YN = 'N'                     \r\n"
+           " ORDER BY A.VMS_CTLR_NMBR, B.DSPL_PRRT    \r\n";
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = GetDbConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                AnsiString VMS_CTLR_NMBR = pADO->FieldByName("VMS_CTLR_NMBR")->AsString.Trim();
+
+				TVmsCtlr *pObj = VmsManager->FLists.Find(VMS_CTLR_NMBR);
+                if (!pObj) continue;
+
+                TVmsIfsc *pIfsc = new TVmsIfsc();
+                pIfsc->VMS_IFSC_ID = pADO->FieldByName("VMS_IFSC_ID")->AsString;
+                pIfsc->DSPL_PRRT   = pADO->FieldByName("DSPL_PRRT")->AsInteger;
+
+                pObj->FIfscLists.Push(pIfsc->DSPL_PRRT, pIfsc);
+                nSelCnt++;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ErrorString = String(E.ClassName()) + E.Message;
+            return VERR_OTHER;
+        }
+        catch(Exception &e)
+        {
+            ErrorString = String(e.ClassName()) + e.Message;
+            return VERR_OTHER;
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+    LINFO("GetVmsIfscInfo: %d", nSelCnt);
+    return VERR_NONE;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::LoadVmsOnOffTime()
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+    int        nSelCnt = 0;
+
+    LINFO("   LoadVmsOnOffTime: Start");
+
+    sQry = "SELECT A.VMS_CTLR_NMBR, \r\n"
+           "       A.PANL_ON_TIME,  \r\n"
+           "       A.PANL_OFF_TIME  \r\n"
+           "  FROM TB_VMS_CTLR A    \r\n"
+           " WHERE A.DEL_YN = 'N'   \r\n";
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = GetDbConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                AnsiString VmsNo = pADO->FieldByName("VMS_CTLR_NMBR")->AsString.Trim();
+
+				TVmsCtlr *pObj = VmsManager->FLists.Find(VmsNo);
+                if (!pObj) continue;
+
+                pObj->MODULE.PowerOnTime  = Now().FormatString("yyyymmdd") + pADO->FieldByName("PANL_ON_TIME")->AsString;
+                pObj->MODULE.PowerOffTime = Now().FormatString("yyyymmdd") + pADO->FieldByName("PANL_OFF_TIME")->AsString;
+                pObj->MODULE.Retry        = VMS_MAX_RETRY_COUNT;
+                nSelCnt++;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ErrorString = String(E.ClassName()) + E.Message;
+            return VERR_OTHER;
+        }
+        catch(Exception &e)
+        {
+            ErrorString = String(e.ClassName()) + e.Message;
+            return VERR_OTHER;
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    LINFO("   LoadVmsOnOffTime: %d", nSelCnt);
+
+    return VERR_NONE;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::GetVmsLuminanceTime()
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+    int        nSelCnt = 0;
+
+    LINFO("GetVmsLuminanceTime: Start");
+
+    sQry = "SELECT A.VMS_CTLR_NMBR, A.SCH_TIME, A.LUMINANCE  \r\n"
+           "  FROM TB_VMS_LUM_SET_SCH A,                     \r\n"
+           "       TB_VMS_CTLR        B                      \r\n"
+           " WHERE A.VMS_CTLR_NMBR = B.VMS_CTLR_NMBR         \r\n"
+           "   AND B.DEL_YN = 'N'                            \r\n"
+           "   AND A.USE_YN = 'Y'                            \r\n"
+           "   AND A.SCH_TIME = TO_CHAR(SYSDATE, 'HH24MI')   \r\n";
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = GetDbConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                AnsiString VmsNo = pADO->FieldByName("VMS_CTLR_NMBR")->AsString.Trim();
+				TVmsCtlr *pObj = VmsManager->FLists.Find(VmsNo);
+                if (!pObj) continue;
+
+                pObj->LUMINANCE.SchTime = Now().FormatString("yyyymmdd") + pADO->FieldByName("SCH_TIME")->AsString;
+                pObj->LUMINANCE.Value   = pADO->FieldByName("LUMINANCE")->AsInteger;
+                pObj->LUMINANCE.Retry   = VMS_MAX_RETRY_COUNT;
+                nSelCnt++;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ErrorString = String(E.ClassName()) + E.Message;
+            return VERR_OTHER;
+        }
+        catch(Exception &e)
+        {
+            ErrorString = String(e.ClassName()) + e.Message;
+            return VERR_OTHER;
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    LINFO("GetVmsLuminanceTime: %d", nSelCnt);
+
+    return VERR_NONE;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::GetVmsDownLoadInfo()
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+    int        nSelCnt = 0;
+    int        nDnIdx;
+    VMS_DOWNLOAD_INFO *pInfo;
+
+return VERR_NONE;
+    LDEBUG("GetVmsDownLoadInfo: Start");
+
+    sQry = "SELECT A.VMS_CTLR_NMBR, A.RGST_DT,                               \r\n"
+           "       A.FILETYPE, A.FILEID                                      \r\n"
+           "  FROM TB_VMS_DOWNLOAD A                                         \r\n"
+           " WHERE A.SENDSTARTDATE <= TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS')   \r\n"
+           "   AND A.SENDRESULT = 0                                          \r\n"
+           " ORDER BY A.VMS_CTLR_NMBR, A.RGST_DT DESC, A.FILETYPE, A.FILEID  \r\n";
+
+
+    VmsIterator it;
+    for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
+    {
+        TVmsCtlr *pObj = (TVmsCtlr*)it->second;
+        pInfo = pObj->DOWNLOAD;
+        InitDownLoadInfo(pInfo);
+    }
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = GetDbConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                AnsiString VmsNo     = pADO->FieldByName("VMS_CTLR_NMBR")->AsString.Trim();
+				TVmsCtlr *pObj = VmsManager->FLists.Find(VmsNo);
+                if (!pObj) continue;
+
+                if (pObj->DOWNLOAD->Count < VMS_MAX_DOWNLOAD)
+                {
+                    pInfo = pObj->DOWNLOAD;
+
+                    nDnIdx = pInfo->Count++;
+                    pInfo->Unit[nDnIdx].RegDate     = pADO->FieldByName("RGST_DT")->AsString;
+                    pInfo->Unit[nDnIdx].FileType    = pADO->FieldByName("FILETYPE")->AsString;
+                    pInfo->Unit[nDnIdx].FileId      = pADO->FieldByName("FILEID")->AsString;
+                    pInfo->Unit[nDnIdx].SendEndDate = Now().FormatString("yyyymmddhhnnss");
+                    pInfo->Unit[nDnIdx].SendStep    = send_wait;
+                    pInfo->Unit[nDnIdx].SendResult  = vms_download_fail;
+                }
+                nSelCnt++;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ErrorString = String(E.ClassName()) + E.Message;
+            return VERR_OTHER;
+        }
+        catch(Exception &e)
+        {
+            ErrorString = String(e.ClassName()) + e.Message;
+            return VERR_OTHER;
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
+    {
+        TVmsCtlr *pObj = (TVmsCtlr*)it->second;
+        if (pObj->DOWNLOAD->Count > 0)
+        {
+            pObj->DOWNLOAD->Enable   = vms_download_enable;
+            pObj->DOWNLOAD->SaveFlag = false;
+        }
+    }
+
+    LINFO("GetVmsDownLoadInfo: %d", nSelCnt);
+
+    return VERR_NONE;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::GetVmsImage()
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+    TStream   *pStream = NULL;
+    int        nSelCnt = 0;
+
+    LINFO("GetVmsImage: Start");
+
+    sQry = "SELECT A.*               \r\n"
+           "  FROM TB_VMS_SYMB_LIB A \r\n";
+    try
+    {
+        TCDSImage *pVmsImg;
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = GetDbConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                AnsiString sSymbolNmbr  = "";
+                bool bTrafSymbol = false;
+
+                int nSymbolNmbr = pADO->FieldByName("SYMBLIB_NMBR")->AsInteger;
+                if (nSymbolNmbr >= 8000 && nSymbolNmbr <= 8999)
+                {
+                    bTrafSymbol = true;
+                }
+
+                sSymbolNmbr = AnsiString(nSymbolNmbr) + "0";
+
+				pVmsImg = ImageManager->FLists.Find(sSymbolNmbr);
+                if (!pVmsImg)
+                {
+                    pVmsImg = new TCDSImage();
+                    pVmsImg->Nmbr = sSymbolNmbr;
+                    ImageManager->FLists.Push(pVmsImg->Nmbr, pVmsImg);
+                }
+                pVmsImg->FLists.RemoveAll();
+
+                pVmsImg->Type    = vms_image_type_bmp;
+                pVmsImg->VmsType = pADO->FieldByName("VMS_TYPE_CD")->AsString.Trim(); //VMP0: 심볼, VMP1: 소통정보배경, VMP1:소통정보
+                if (bTrafSymbol) pVmsImg->VmsType = "VMP2";
+
+                pVmsImg->Clear();
+    			pVmsImg->pImage->Picture->Bitmap->PixelFormat = pf4bit;
+
+                TStream *pStream = pADO->CreateBlobStream(pADO->FieldByName("IMAG_DATA"), bmRead);
+                try
+                {
+                    if (pStream && pStream->Size > 0)
+                    {
+                        pStream->Position = 0;
+                        switch(pVmsImg->Type)
+                        {
+                        case vms_image_type_bmp: AssignBmp(pVmsImg->pImage, pStream); break;
+                        case vms_image_type_gif: AssignGif(pVmsImg->pImage, pStream); break;
+                        case vms_image_type_jpg: AssignJpg(pVmsImg->pImage, pStream); break;
+                        case vms_image_type_pcx: break;
+                        default: break;
+                        }
+                    }
+                }
+                __finally
+                {
+                    SAFE_DELETE(pStream);
+                }
+                nSelCnt++;
+
+                if (pVmsImg->VmsType == "VMP2")
+                {
+                    for (int nTrf = 1; nTrf <= 3; nTrf++)
+                    {
+                        sSymbolNmbr = AnsiString(nSymbolNmbr) + AnsiString(nTrf);
+                        //좌표가 바뀌더라도 셀정보에서 업데이트 한다.
+                        //이미지내용이 바뀌는 경우는 없다
+                        pVmsImg = ImageManager->FLists.Find(sSymbolNmbr);
+                        if (pVmsImg) continue;
+
+                        pVmsImg = new TCDSImage();
+                        pVmsImg->Nmbr = sSymbolNmbr;
+                        ImageManager->FLists.Push(pVmsImg->Nmbr, pVmsImg);
+                        pVmsImg->FLists.RemoveAll();
+
+                        pVmsImg->Type    = vms_image_type_bmp;
+                        pVmsImg->VmsType = "VMP2";
+
+                        pVmsImg->Clear();
+                        pVmsImg->pImage->Picture->Bitmap->PixelFormat = pf4bit;
+
+                        TStream *pStream = pADO->CreateBlobStream(pADO->FieldByName("IMAG_DATA"), bmRead);
+                        try
+                        {
+                            if (pStream && pStream->Size > 0)
+                            {
+                                pStream->Position = 0;
+                                switch(pVmsImg->Type)
+                                {
+                                case vms_image_type_bmp: AssignBmp(pVmsImg->pImage, pStream); break;
+                                case vms_image_type_gif: AssignGif(pVmsImg->pImage, pStream); break;
+                                case vms_image_type_jpg: AssignJpg(pVmsImg->pImage, pStream); break;
+                                case vms_image_type_pcx: break;
+                                default: break;
+                                }
+                            }
+                        }
+                        __finally
+                        {
+                            SAFE_DELETE(pStream);
+                        }
+                    }
+                }
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ErrorString = String(E.ClassName()) + E.Message;
+            return VERR_OTHER;
+        }
+        catch(Exception &e)
+        {
+            ErrorString = String(e.ClassName()) + e.Message;
+            return VERR_OTHER;
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+
+    int result = GetVmsImageCell();
+
+    //if (g_LogCfg.Debug)
+    //FTP로 다운로드 해야 하기 때문에 파일로 저장해야 한다.
+    //소통정보 이미지 같은 경우 디비에는 하나만 등록하고 여기서 조회할때
+    //소통등급별로 이미지를 만든다.
+    {
+        AnsiString sImgFile;
+        FOR_STL(TCDSImage*, pTmp, ImageManager->FLists)
+        {
+            sImgFile = g_sImgDir + pTmp->Nmbr;
+            try
+            {
+                switch(pTmp->Type)
+                {
+                case vms_image_type_bmp: sImgFile += ".bmp"; SaveToFileBmp(pTmp->pImage, sImgFile); break;
+                case vms_image_type_gif: sImgFile += ".gif"; SaveToFileGif(pTmp->pImage, sImgFile); break;
+                case vms_image_type_jpg: sImgFile += ".jpg"; SaveToFileJpg(pTmp->pImage, sImgFile); break;
+                case vms_image_type_pcx: sImgFile += ".pcx"; break;
+                default: break;
+                }
+            }
+            catch(Exception &e)
+            {
+            }
+#if 0
+            sImgFile = g_sFtpDir + GetFtpImageId(pTmp->Nmbr);
+            try
+            {
+                switch(pTmp->Type)
+                {
+                case vms_image_type_bmp: sImgFile += ".bmp"; SaveToFileBmp(pTmp->pImage, sImgFile); break;
+                case vms_image_type_gif: sImgFile += ".gif"; SaveToFileGif(pTmp->pImage, sImgFile); break;
+                case vms_image_type_jpg: sImgFile += ".jpg"; SaveToFileJpg(pTmp->pImage, sImgFile); break;
+                case vms_image_type_pcx: sImgFile += ".pcx"; break;
+                default: break;
+                }
+            }
+            catch(Exception &e)
+            {
+            }
+#endif
+        }
+    }
+
+    VmsIterator it;
+    for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
+    {
+        TVmsCtlr *pObj = (TVmsCtlr*)it->second;
+        pObj->FSymbolDownload = true;
+    }
+    LINFO("GetVmsImage: %d", nSelCnt);
+
+    return result;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::GetVmsImageCell()
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+    int        nSelCnt = 0;
+
+    LINFO("GetVmsImageCell: Start");
+
+    sQry = "SELECT B.*                              \r\n"
+           "  FROM TB_VMS_SYMB_LIB  A,              \r\n"
+           "       TB_VMS_SYMB_IFSC B               \r\n"
+           " WHERE A.SYMBLIB_NMBR = B.SYMBLIB_NMBR  \r\n"
+           " ORDER BY B.SYMBLIB_NMBR, B.CELL_ID     \r\n";
+
+    try
+    {
+        TCDSImage     *pVmsImg;
+        TCDSImageCell *pImgCell;
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = GetDbConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                AnsiString SYMBLIB_NMBR = pADO->FieldByName("SYMBLIB_NMBR")->AsString.Trim();
+				pVmsImg = ImageManager->FLists.Find(SYMBLIB_NMBR+"0");
+                if (!pVmsImg)
+                {
+                    continue;
+                }
+
+                pImgCell = new TCDSImageCell();
+
+                pImgCell->SYMBLIB_NMBR = SYMBLIB_NMBR;
+                pImgCell->CELL_ID      = pADO->FieldByName("CELL_ID")->AsInteger;
+                pImgCell->POSX         = pADO->FieldByName("POSX")->AsInteger;
+                pImgCell->POSY         = pADO->FieldByName("POSY")->AsInteger;
+                pImgCell->VMS_IFSC_ID  = pADO->FieldByName("VMS_IFSC_ID")->AsString;
+
+                pVmsImg->FLists.Push(pImgCell->CELL_ID, pImgCell);
+
+                //소통정보 이미지인 경우(원활,지체,정체 이미지 생성)
+                if (pVmsImg->VmsType == "VMP2")
+                {
+                    for (int nTrf = 1; nTrf <= 3; nTrf++)
+                    {
+                        TCDSImage *pTmpImg = ImageManager->FLists.Find(SYMBLIB_NMBR+AnsiString(nTrf));
+                        if (!pVmsImg) continue;
+
+                        try
+                        {
+                            pTmpImg->pImage->Picture->Bitmap->Canvas->Lock();
+                            pTmpImg->pImage->Picture->Bitmap->Canvas->Brush->Color = GradeToFillColor(nTrf);
+                            TColor clColor = pTmpImg->pImage->Picture->Bitmap->Canvas->Pixels[pImgCell->POSX][pImgCell->POSY];
+                            pTmpImg->pImage->Picture->Bitmap->Canvas->FloodFill(pImgCell->POSX, pImgCell->POSY, clColor, fsSurface);
+                        }
+                        __finally
+                        {
+                            pTmpImg->pImage->Picture->Bitmap->Canvas->Unlock();
+                        }
+                    }
+                }
+                nSelCnt++;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ErrorString = String(E.ClassName()) + E.Message;
+            return VERR_OTHER;
+        }
+        catch(Exception &e)
+        {
+            ErrorString = String(e.ClassName()) + e.Message;
+            return VERR_OTHER;
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    if (0)
+    {
+        FOR_STL(TCDSImage*, pTmp, ImageManager->FLists)
+        {
+            if (pTmp->FLists.Size() == 0) continue;
+            LDEBUG("Image Cell: %s, Objects: %d", pTmp->Nmbr.c_str(), pTmp->FLists.Size());
+        }
+    }
+
+    LINFO("GetVmsImageCell: %d", nSelCnt);
+
+    return VERR_NONE;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::LoadVmsForm()
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+    TStream   *pStream = NULL;
+    int        nSelCnt = 0;
+
+    LINFO("        LoadVmsForm: Start");
+
+    sQry = "SELECT A.*           \r\n"
+           "  FROM TB_VMS_FORM A \r\n";
+    try
+    {
+        TCDSForm *pVmsForm;
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = GetDbConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                AnsiString sFormId = pADO->FieldByName("VMS_FORM_ID")->AsString.Trim();
+				pVmsForm = FormManager->FLists.Find(sFormId);
+                if (!pVmsForm)
+                {
+                    pVmsForm = new TCDSForm();
+                    pVmsForm->VMS_FORM_ID = sFormId;
+                    FormManager->FLists.Push(pVmsForm->VMS_FORM_ID, pVmsForm);
+                }
+                pVmsForm->FLists.RemoveAll();
+
+                pVmsForm->TrfBakImgId = ""; //소통정보 배경 이미지 ID
+                pVmsForm->VMS_TYPE_CD          = pADO->FieldByName("VMS_TYPE_CD")->AsString;
+                pVmsForm->VMS_FORM_TYPE_CD     = pADO->FieldByName("VMS_FORM_TYPE_CD")->AsInteger;
+                pVmsForm->VMS_FORM_BCKG_HUE_CD = pADO->FieldByName("VMS_FORM_BCKG_HUE_CD")->AsInteger;
+                pVmsForm->VMS_MSG_DSPL_DRCT_CD = pADO->FieldByName("VMS_MSG_DSPL_DRCT_CD")->AsInteger;
+                pVmsForm->VMS_MSG_DSPL_MTHD_CD = pADO->FieldByName("VMS_MSG_DSPL_MTHD_CD")->AsInteger;
+
+                pVmsForm->TrfIfsc = false;
+                pVmsForm->TrfAxis = false;
+
+                nSelCnt++;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ErrorString = String(E.ClassName()) + E.Message;
+            return VERR_OTHER;
+        }
+        catch(Exception &e)
+        {
+            ErrorString = String(e.ClassName()) + e.Message;
+            return VERR_OTHER;
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    LINFO("        LoadVmsForm: %d EA", nSelCnt);
+
+    return LoadVmsFormObject();
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::LoadVmsFormObject()
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+    TStream   *pStream = NULL;
+    int        nSelCnt = 0;
+
+    LINFO("  LoadVmsFormObject: Start");
+
+#if 0
+    sQry = "SELECT B.*                                \r\n"
+           "  FROM TB_VMS_FORM A,                     \r\n"
+           "       TB_VMS_FORM_OBJECT B               \r\n"
+           " WHERE A.VMS_FORM_ID = B.VMS_FORM_ID      \r\n"
+           " ORDER BY B.VMS_FORM_ID, B.FORM_OBJECT_ID \r\n";
+#else
+    sQry = "SELECT B.*, NVL(C.IMAG_DATA, B.VMS_DSPL_FIGR) AS IMAG_DATA  \r\n"
+           "  FROM TB_VMS_FORM        A,                                \r\n"
+           "       TB_VMS_FORM_OBJECT B,                                \r\n"
+           "       TB_VMS_SYMB_LIB    C                                 \r\n"
+           " WHERE A.VMS_FORM_ID  = B.VMS_FORM_ID                       \r\n"
+           "   AND B.SYMBLIB_NMBR = C.SYMBLIB_NMBR(+)                   \r\n"
+           " ORDER BY B.VMS_FORM_ID, B.FORM_OBJECT_ID                   \r\n";
+#endif
+
+    try
+    {
+        TCDSForm    *pVmsForm;
+        TCDSFormObj *pFormObj;
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = GetDbConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                AnsiString sFormId = pADO->FieldByName("VMS_FORM_ID")->AsString.Trim();
+				pVmsForm = FormManager->FLists.Find(sFormId);
+                if (!pVmsForm)
+                {
+                   continue;
+                }
+                nSelCnt++;
+
+                pFormObj = new TCDSFormObj();
+
+                pFormObj->FORM_OBJECT_ID          = pADO->FieldByName("FORM_OBJECT_ID")->AsInteger;
+                pFormObj->VMS_FORM_ID             = pADO->FieldByName("VMS_FORM_ID")->AsString;
+                pFormObj->VMS_FORM_DSPL_ROW       = pADO->FieldByName("VMS_FORM_DSPL_ROW")->AsInteger;
+                pFormObj->VMS_FORM_DSPL_CLMN      = pADO->FieldByName("VMS_FORM_DSPL_CLMN")->AsInteger;
+                pFormObj->VMS_FORM_OBJECT_TYPE_CD = pADO->FieldByName("VMS_FORM_OBJECT_TYPE_CD")->AsInteger;
+                pFormObj->VMS_FONT_TYPE_CD        = pADO->FieldByName("VMS_FONT_TYPE_CD")->AsInteger;
+                pFormObj->VMS_FONT_HUE_CD         = pADO->FieldByName("VMS_FONT_HUE_CD")->AsInteger;
+                pFormObj->VMS_FONT_STYL_CD        = pADO->FieldByName("VMS_FONT_STYL_CD")->AsInteger;
+                pFormObj->VMS_FONT_SIZE           = pADO->FieldByName("VMS_FONT_SIZE")->AsInteger;
+                pFormObj->VMS_FONT_ALIGN          = pADO->FieldByName("VMS_FONT_ALIGN")->AsInteger;
+                pFormObj->VMS_DSPL_TXT            = pADO->FieldByName("VMS_DSPL_TXT")->AsString;
+                pFormObj->VMS_DSPL_XCRDN          = pADO->FieldByName("VMS_DSPL_XCRDN")->AsInteger;
+                pFormObj->VMS_DSPL_YCRDN          = pADO->FieldByName("VMS_DSPL_YCRDN")->AsInteger;
+                pFormObj->VMS_DSPL_WIDTH          = pADO->FieldByName("VMS_DSPL_WIDTH")->AsInteger;
+                pFormObj->VMS_DSPL_HEIGHT         = pADO->FieldByName("VMS_DSPL_HEIGHT")->AsInteger;
+                pFormObj->VMS_DSPL_BLINKING       = pADO->FieldByName("VMS_DSPL_BLINKING")->AsInteger;
+                pFormObj->VMS_DSPL_BKCOLOR        = pADO->FieldByName("VMS_DSPL_BKCOLOR")->AsInteger;
+                pFormObj->VMS_DSPL_SIZE           = pADO->FieldByName("VMS_DSPL_SIZE")->AsInteger;
+                pFormObj->TRFC_FILL_CD            = pADO->FieldByName("TRFC_FILL_CD")->AsString;
+                pFormObj->SYMBLIB_NMBR            = pADO->FieldByName("SYMBLIB_NMBR")->AsString;
+                pFormObj->VMS_IFSC_ID             = pADO->FieldByName("VMS_IFSC_ID")->AsString;
+
+                pVmsForm->FLists.Push(pFormObj->FORM_OBJECT_ID, pFormObj);
+
+                int nObjType = pFormObj->VMS_FORM_OBJECT_TYPE_CD;
+
+                if (pVmsForm->VMS_FORM_TYPE_CD == enFormKindTrfImg)
+                {
+                    //도형식 소통정보 폼인데 구간 소통정보를 하단에 표출하는 경우
+                    //하나의 폼이 여러개의 소통정보를 표출되도록 하기 위함
+                    switch(nObjType)
+                    {
+                    case 11://, '	@구간명
+                    case 12://, '	@시점명
+                    case 13://, '	@종점명
+                    case 14://, '	@소통상황
+                    case 15://, '	@통행시간
+                    case 16://, '	@통행속도
+                    case 17://, '	@소통정보이미지
+                    case 18://, '	@지점명
+                        pVmsForm->TrfIfsc = true;
+                        break;
+                    case 93://, '	@축시점명(순환)
+                    case 94://, '	@축종점명(순환)
+                    case 95://, '	@축소통상황(순환)
+                    case 96://, '	@축통행시간(순환)
+                        pVmsForm->TrfAxis = true;
+                        break;
+                    }
+                }
+
+                if (nObjType == 3)
+                {
+                    pVmsForm->TrfBakImgId = pFormObj->SYMBLIB_NMBR + "0";
+                }
+
+                if (nObjType ==  1 || //심볼
+                    nObjType ==  2 || //이미지(파일에서 직접입력한것임)
+                    nObjType ==  3 || //소통정보배경이미지
+                    nObjType == 17 || //소통정보이미지1
+                    nObjType == 27 || //소통정보이미지2
+                    nObjType == 37 || //소통정보이미지3
+                    nObjType == 47 )  //소통정보이미지4
+                {
+                    pFormObj->Clear();
+                    pFormObj->pImage->Picture->Bitmap->PixelFormat = pf4bit;
+                    //심볼에서 읽지 않고 폼오브젝트에 있는 이미지를 사용함
+#if 0
+                    TStream *pStream = pADO->CreateBlobStream(pADO->FieldByName("VMS_DSPL_FIGR"), bmRead);
+#else
+                    TStream *pStream = pADO->CreateBlobStream(pADO->FieldByName("IMAG_DATA"), bmRead);
+#endif
+                    try
+                    {
+                        if (pStream && pStream->Size > 0)
+                        {
+                            pStream->Position = 0;
+                            AssignBmp(pFormObj->pImage, pStream);
+                        }
+                    }
+                    __finally
+                    {
+                        SAFE_DELETE(pStream);
+                    }
+                }
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ErrorString = String(E.ClassName()) + E.Message;
+            return VERR_OTHER;
+        }
+        catch(Exception &e)
+        {
+            ErrorString = String(e.ClassName()) + e.Message;
+            return VERR_OTHER;
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    if (0)//g_LogCfg.Debug)
+    {
+        FOR_STL(TCDSForm*, pTmp, FormManager->FLists)
+        {
+            LDEBUG("Vms Form: %s, Objects: %d", pTmp->VMS_FORM_ID.c_str(), pTmp->FLists.Size());
+        }
+    }
+
+    LINFO("  LoadVmsFormObject: %d EA", nSelCnt);
+
+    return VERR_NONE;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::SaveProcessStateProc(void)
+{
+	int               nResult;
+	AnsiString        sQry;
+	DB_STATUS_PROCESS sp;
+	TADOQuery        *pADO = NULL;
+
+	nResult = VERR_OTHER;
+
+	//sp.PROCESSID = g_AppCfg.strProcessID;
+	sp.RUNVERSION = "1";
+	sp.STATUS     = g_SysInfo->State.Action;
+	sp.COMM       = g_SysInfo->State.Comm;
+	sp.DB         = g_SysInfo->State.DB;
+
+    bool bHistIns = false;
+    AnsiString SYST_ID      = g_AppCfg.sSystemId;
+    AnsiString SYST_STTS_CD = "SPS1";
+	try
+	{
+        pADO = new TADOQuery(NULL);
+        pADO->Connection = GetDbConnection();
+
+		try
+		{
+            pADO->Connection->BeginTrans();
+
+            if (g_SysInfo->State.Action == state_error)
+            {
+                SYST_STTS_CD = "SPS3";
+                bHistIns = true;
+            }
+
+			sQry = "UPDATE TB_UNIT_SYST_STTS                                   \r\n"
+                   "   SET SYST_STTS_CD = :p02,                                \r\n"
+                   "       UPDT_DT      = TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS') \r\n"
+                   " WHERE SYST_ID = :p01                                      \r\n";
+
+            SQLText(pADO, sQry, false);
+            SQLBind(pADO, "p01", SYST_ID);
+            SQLBind(pADO, "p02", SYST_STTS_CD);
+            SQLExec(pADO);
+
+            //이력 정보는 기본적으로 5분마다 입력한다(상태정보가 바뀌면 바로 입력).
+            int nCurMin = StrToInt(Now().FormatString("nn"));
+            if (FProcessStateMin < 0)
+            {
+                //프로세스 최초 기동시...
+                FProcessStateMin = nCurMin;
+                bHistIns = true;
+            }
+            else
+            if (!(nCurMin%5))
+            {
+                //5분주기 체크
+                if (FProcessStateMin != nCurMin)
+                {
+                    FProcessStateMin = nCurMin;
+                    bHistIns = true;
+                }
+            }
+
+            if (bHistIns)
+            {
+                sQry = "INSERT INTO TB_UNIT_SYST_STTS_HS(SYST_ID, CRTN_DT, SYST_STTS_CD) \r\n"
+                       "   VALUES(:p01, TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS'), :p02)      \r\n";
+
+                SQLText(pADO, sQry, false);
+                SQLBind(pADO, "p01", SYST_ID);
+                SQLBind(pADO, "p02", SYST_STTS_CD);
+                SQLExec(pADO);
+            }
+
+            pADO->Connection->CommitTrans();
+
+			nResult = VERR_NONE;
+		}
+		catch(EDatabaseError &E)
+		{
+            pADO->Connection->RollbackTrans();
+            ErrorString = String(E.ClassName()) + E.Message;
+            DBERRORLOG("SaveProcessStateProc", String(E.ClassName()), E.Message, sQry);
+		}
+		catch(Exception &e)
+		{
+            pADO->Connection->RollbackTrans();
+            ErrorString = String(e.ClassName()) + e.Message;
+            DBERRORLOG("SaveProcessStateProc", String(e.ClassName()), e.Message, sQry);
+		}
+	}
+	__finally
+	{
+        if (pADO)
+        {
+            SQLClose(pADO);
+            SAFE_DELETE(pADO);
+        }
+	}
+
+    LDEBUG("SYST_ID: %s, STTS_CD: %s", SYST_ID.c_str(), SYST_STTS_CD.c_str());
+
+    return nResult;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::SaveEquipStateAllProc(void)
+{
+	int        nResult = VERR_NONE;
+	AnsiString sQry, iQry;
+	TADOQuery *pADO  = NULL;
+//	TADOQuery *pADOI = NULL;
+
+
+    // 상태가 변경되면 바로 입력, 기타 5분마다 이력정보를 입력한다.
+    bool bSaveHist = false;
+
+    int nCurrMin = StrToInt(Now().FormatString("nn"));
+    if ((nCurrMin % 5) == 0) //매 5분마다 무조건 입력
+    {
+        if (FEquipStateMin != nCurrMin)
+        {
+            bSaveHist = true;
+            FEquipStateMin = nCurrMin;
+        }
+    }
+
+    String sSysTime = Now().FormatString("yyyymmddhhnnss");
+
+    sQry = "MERGE INTO TB_VMS_STTS_PRST L                                     \r\n"
+           "USING (SELECT :p01 AS VMS_CTLR_NMBR,                              \r\n"
+           "              :p02 AS RGST_DT,                                    \r\n"
+           "              :p03 AS CONN_STTS_CD,                               \r\n"
+           "              :p04 AS CBOXDOOR_OPEN_STTS_CD,                      \r\n"
+           "              :p05 AS PWER_STTS_CD,                               \r\n"
+           "              :p06 AS CBOX_TMPR,                                  \r\n"
+           "              :p07 AS CBOX_HMDT,                                  \r\n"
+           "              :p08 AS FAN_STTS_CD,                                \r\n"
+           "              :p09 AS HETR_STTS_CD,                               \r\n"
+           "              :p10 AS CBOXFAN_STTS_CD,                            \r\n"
+           "              :p11 AS HIST_INS                                    \r\n"
+           "         FROM DUAL) M                                             \r\n"
+           "ON (L.VMS_CTLR_NMBR = M.VMS_CTLR_NMBR)                            \r\n"
+           "WHEN MATCHED THEN                                                 \r\n"
+           "    UPDATE SET L.RGST_DT               = M.RGST_DT,               \r\n"
+           "               L.CONN_STTS_CD          = M.CONN_STTS_CD,          \r\n"
+           "               L.CBOXDOOR_OPEN_STTS_CD = M.CBOXDOOR_OPEN_STTS_CD, \r\n"
+           "               L.PWER_STTS_CD          = M.PWER_STTS_CD,          \r\n"
+           "               L.CBOX_TMPR             = M.CBOX_TMPR,             \r\n"
+           "               L.CBOX_HMDT             = M.CBOX_HMDT,             \r\n"
+           "               L.FAN_STTS_CD           = M.FAN_STTS_CD,           \r\n"
+           "               L.HETR_STTS_CD          = M.HETR_STTS_CD,          \r\n"
+           "               L.CBOXFAN_STTS_CD       = M.CBOXFAN_STTS_CD,       \r\n"
+           "               L.HIST_INS              = M.HIST_INS               \r\n"
+           "WHEN NOT MATCHED THEN                                             \r\n"
+           "    INSERT (L.VMS_CTLR_NMBR,                                      \r\n"
+           "            L.RGST_DT,                                            \r\n"
+           "            L.CONN_STTS_CD,                                       \r\n"
+           "            L.CBOXDOOR_OPEN_STTS_CD,                              \r\n"
+           "            L.PWER_STTS_CD,                                       \r\n"
+           "            L.CBOX_TMPR,                                          \r\n"
+           "            L.CBOX_HMDT,                                          \r\n"
+           "            L.FAN_STTS_CD,                                        \r\n"
+           "            L.HETR_STTS_CD,                                       \r\n"
+           "            L.CBOXFAN_STTS_CD, L.HIST_INS)                        \r\n"
+           "    VALUES (M.VMS_CTLR_NMBR,                                      \r\n"
+           "            M.RGST_DT,                                            \r\n"
+           "            M.CONN_STTS_CD,                                       \r\n"
+           "            M.CBOXDOOR_OPEN_STTS_CD,                              \r\n"
+           "            M.PWER_STTS_CD,                                       \r\n"
+           "            M.CBOX_TMPR,                                          \r\n"
+           "            M.CBOX_HMDT,                                          \r\n"
+           "            M.FAN_STTS_CD,                                        \r\n"
+           "            M.HETR_STTS_CD,                                       \r\n"
+           "            M.CBOXFAN_STTS_CD, M.HIST_INS)                        \r\n";
+
+    iQry = "INSERT INTO TB_VMS_STTS_HS         \r\n"
+           "           (VMS_CTLR_NMBR,         \r\n"
+           "            RGST_DT,               \r\n"
+           "            CONN_STTS_CD,          \r\n"
+           "            CBOXDOOR_OPEN_STTS_CD, \r\n"
+           "            PWER_STTS_CD,          \r\n"
+           "            CBOX_TMPR,             \r\n"
+           "            CBOX_HMDT,             \r\n"
+           "            FAN_STTS_CD,           \r\n"
+           "            HETR_STTS_CD,          \r\n"
+           "            CBOXFAN_STTS_CD)       \r\n"
+           "    VALUES (:p01,                  \r\n"
+           "            :p02,                  \r\n"
+           "            :p03,                  \r\n"
+           "            :p04,                  \r\n"
+           "            :p05,                  \r\n"
+           "            :p06,                  \r\n"
+           "            :p07,                  \r\n"
+           "            :p08,                  \r\n"
+           "            :p09,                  \r\n"
+           "            :p10)                  \r\n";
+	try
+	{
+        pADO = new TADOQuery(NULL);
+        pADO->Connection = GetDbConnection();
+
+//        pADOI = new TADOQuery(NULL);
+//        pADOI->Connection = GetDbConnection();
+
+		try
+		{
+            pADO->Connection->BeginTrans();
+
+            SQLText(pADO,  sQry, false);
+//            SQLText(pADOI, iQry, false);
+
+            VmsIterator it;
+            for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
+            {
+                TVmsCtlr *pObj = (TVmsCtlr*)it->second;
+                if (pObj->Server.UseFlag != bit_enable) continue;
+
+                String HIST_INS;
+                if (bSaveHist)
+                {
+                    pObj->FSaveState = true;
+                    HIST_INS = "1";
+                }
+                else
+                {
+                    pObj->FSaveState = ChangedState(&pObj->DSTATE, &pObj->RSTATE);
+                    HIST_INS = "0";
+                }
+                //pObj->RSTATE.Comm = pObj->DSTATE.Comm;
+                if (pObj->FSaveState)
+                {
+                    memcpy(&pObj->DSTATE, &pObj->RSTATE, sizeof(pObj->DSTATE));
+                }
+                pObj->DSTATE.Comm = pObj->Client.Comm == state_open ? vms_normal : vms_error;;//pObj->Server.Status == process_run ? vms_normal : vms_error;
+
+                String VMS_CTLR_NMBR         = pObj->VmsNo;
+                String RGST_DT               = sSysTime;
+                String CONN_STTS_CD          = pObj->DSTATE.Comm              == vms_normal ? "CMS0" : "CMS1";
+                String CBOXFAN_STTS_CD       = pObj->DSTATE.ModuleState       == vms_normal ? "MOS0" : "MOS1";
+                String PWER_STTS_CD          = pObj->DSTATE.ModulePowerStatus == vms_normal ? "PWS0" : "PWS1";
+                String CBOXDOOR_OPEN_STTS_CD = pObj->DSTATE.DoorStatus        == vms_close  ? "CDS0" : "CDS1";
+                String FAN_STTS_CD           = pObj->DSTATE.FanStatus         == vms_on     ? "PAS0" : "PAS1";
+                String HETR_STTS_CD          = pObj->DSTATE.HeaterStatus      == vms_on     ? "HTS0" : "HTS1";
+                String CBOX_TMPR             = String(pObj->DSTATE.BodyTemp);
+                String CBOX_HMDT             = String(pObj->DSTATE.LuminanceStatus);
+                if (CONN_STTS_CD != "CMS0")
+                {
+                    CBOXDOOR_OPEN_STTS_CD = "CDS2";
+                    PWER_STTS_CD          = "PWS2";
+                    CBOX_TMPR             = "0";
+                    CBOX_HMDT             = "0";
+                    FAN_STTS_CD           = "PAS2";
+                    HETR_STTS_CD          = "HTS2";
+                    CBOXFAN_STTS_CD       = "MOS2";
+                }
+
+                SQLBind(pADO, "p01", VMS_CTLR_NMBR);
+                SQLBind(pADO, "p02", RGST_DT);
+                SQLBind(pADO, "p03", CONN_STTS_CD);
+                SQLBind(pADO, "p04", CBOXDOOR_OPEN_STTS_CD);
+                SQLBind(pADO, "p05", PWER_STTS_CD);
+                SQLBind(pADO, "p06", CBOX_TMPR);
+                SQLBind(pADO, "p07", CBOX_HMDT);
+                SQLBind(pADO, "p08", FAN_STTS_CD);
+                SQLBind(pADO, "p09", HETR_STTS_CD);
+                SQLBind(pADO, "p10", CBOXFAN_STTS_CD);
+                SQLBind(pADO, "p11", HIST_INS);
+
+                SQLExec(pADO);
+
+#if 0
+                if (pObj->FSaveState)
+                {
+                    //이전주기에 통신이상 이력을 입력하였고 이번에도 통신이상이면
+                    //이력으로 저장하지 않는다.
+                    if (pObj->DSTATE.Comm == vms_error &&
+                        pObj->FOldState   == vms_error)
+                    {
+                        continue;
+                    }
+
+                    SQLBind(pADOI, "p01", VMS_CTLR_NMBR);
+                    SQLBind(pADOI, "p02", RGST_DT);
+                    SQLBind(pADOI, "p03", CONN_STTS_CD);
+                    SQLBind(pADOI, "p04", CBOXDOOR_OPEN_STTS_CD);
+                    SQLBind(pADOI, "p05", PWER_STTS_CD);
+                    SQLBind(pADOI, "p06", CBOX_TMPR);
+                    SQLBind(pADOI, "p07", CBOX_HMDT);
+                    SQLBind(pADOI, "p08", FAN_STTS_CD);
+                    SQLBind(pADOI, "p09", HETR_STTS_CD);
+                    SQLBind(pADOI, "p10", CBOXFAN_STTS_CD);
+
+                    SQLExec(pADOI);
+
+                    pObj->FOldState = pObj->DSTATE.Comm;
+                }
+#endif
+            }
+
+            pADO->Connection->CommitTrans();
+
+			nResult = VERR_NONE;
+		}
+		catch(EDatabaseError &E)
+		{
+            pADO->Connection->RollbackTrans();
+            ErrorString = String(E.ClassName()) + E.Message;
+            DBERRORLOG("SaveEquipStateAllProc", String(E.ClassName()), E.Message, sQry);
+		}
+		catch(Exception &e)
+		{
+            pADO->Connection->RollbackTrans();
+            ErrorString = String(e.ClassName()) + e.Message;
+            DBERRORLOG("SaveEquipStateAllProc", String(e.ClassName()), e.Message, sQry);
+		}
+	}
+	__finally
+	{
+        if (pADO)
+        {
+            SQLClose(pADO);
+            SAFE_DELETE(pADO);
+        }
+#if 0
+        if (pADOI)
+        {
+            SQLClose(pADOI);
+            SAFE_DELETE(pADOI);
+        }
+#endif
+	}
+
+	return SendEquipStateAllProc();
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::SendEquipStateAllProc(void)
+{
+	int               nResult = VERR_NONE;
+    INT_VMS_STATE_RES Res;
+    INT_VMS_STATE    *pVms;
+
+    memset((char*)&Res, 0x00, sizeof(Res));
+    Res.Total = VmsManager->Total;
+    Res.Error = VmsManager->Error;
+    Res.Normal= VmsManager->Normal;
+    Res.Module= VmsManager->Module;
+
+    VmsIterator it;
+    for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
+    {
+        TVmsCtlr *pObj = (TVmsCtlr*)it->second;
+        if (pObj->Server.UseFlag != bit_enable) continue;
+
+        pVms = &Res.Unit[Res.Count++];
+        memcpy((char*)pVms, (char*)&pObj->DSTATE, sizeof(INT_VMS_STATE));
+        if (Res.Count >= INT_MAX_VMS_STATE)
+        {
+            nResult = VComm_VmsStateNotify(&Res);
+
+            memset((char*)&Res, 0x00, sizeof(Res));
+            Res.Total = VmsManager->Total;
+            Res.Error = VmsManager->Error;
+            Res.Normal= VmsManager->Normal;
+            Res.Module= VmsManager->Module;
+        }
+    }
+
+    if (Res.Count > 0)
+    {
+        nResult = VComm_VmsStateNotify(&Res);
+    }
+
+	return nResult;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::SaveEquipStateProc(TVmsCtlr *AObj, int AServerState)
+{
+	int        nResult = VERR_NONE;
+	AnsiString sQry;
+	TADOQuery *pADO = NULL;
+
+    if (!AObj) return nResult;
+
+    TVmsCtlr *pObj = AObj;
+
+    if (AServerState)
+    {
+        //VMS가 접속또는 종료인 경우(조건없이 업데이트)
+        memcpy(&pObj->DSTATE, &pObj->RSTATE, sizeof(pObj->DSTATE));
+    }
+    else
+    {
+        //VMS클라이언트가 상태정보를 수집한 경우
+        //상태정보가 바뀐경우만 업데이트
+        pObj->FSaveState = ChangedState(&pObj->DSTATE, &pObj->RSTATE);
+        if (!pObj->FSaveState) return nResult;
+        //if (pObj->Server.Status != process_run) return nResult;
+        memcpy(&pObj->DSTATE, &pObj->RSTATE, sizeof(pObj->DSTATE));
+    }
+    pObj->DSTATE.Comm = pObj->Client.Comm == state_open ? vms_normal : vms_error;//pObj->Server.Status == process_run ? vms_normal : vms_error;
+    //pObj->FOldState = pObj->DSTATE.Comm;    //이전상태저장
+
+    String sSysTime = Now().FormatString("yyyymmddhhnnss");
+
+    sQry = "MERGE INTO TB_VMS_STTS_PRST L                                     \r\n"
+           "USING (SELECT :p01 AS VMS_CTLR_NMBR,                              \r\n"
+           "              :p02 AS RGST_DT,                                    \r\n"
+           "              :p03 AS CONN_STTS_CD,                               \r\n"
+           "              :p04 AS CBOXDOOR_OPEN_STTS_CD,                      \r\n"
+           "              :p05 AS PWER_STTS_CD,                               \r\n"
+           "              :p06 AS CBOX_TMPR,                                  \r\n"
+           "              :p07 AS CBOX_HMDT,                                  \r\n"
+           "              :p08 AS FAN_STTS_CD,                                \r\n"
+           "              :p09 AS HETR_STTS_CD,                               \r\n"
+           "              :p10 AS CBOXFAN_STTS_CD                             \r\n"
+           "         FROM DUAL) M                                             \r\n"
+           "ON (L.VMS_CTLR_NMBR = M.VMS_CTLR_NMBR)                            \r\n"
+           "WHEN MATCHED THEN                                                 \r\n"
+           "    UPDATE SET L.RGST_DT               = M.RGST_DT,               \r\n"
+           "               L.CONN_STTS_CD          = M.CONN_STTS_CD,          \r\n"
+           "               L.CBOXDOOR_OPEN_STTS_CD = M.CBOXDOOR_OPEN_STTS_CD, \r\n"
+           "               L.PWER_STTS_CD          = M.PWER_STTS_CD,          \r\n"
+           "               L.CBOX_TMPR             = M.CBOX_TMPR,             \r\n"
+           "               L.CBOX_HMDT             = M.CBOX_HMDT,             \r\n"
+           "               L.FAN_STTS_CD           = M.FAN_STTS_CD,           \r\n"
+           "               L.HETR_STTS_CD          = M.HETR_STTS_CD,          \r\n"
+           "               L.CBOXFAN_STTS_CD       = M.CBOXFAN_STTS_CD,       \r\n"
+           "               L.HIST_INS              = '0'                      \r\n"
+           "WHEN NOT MATCHED THEN                                             \r\n"
+           "    INSERT (L.VMS_CTLR_NMBR,                                      \r\n"
+           "            L.RGST_DT,                                            \r\n"
+           "            L.CONN_STTS_CD,                                       \r\n"
+           "            L.CBOXDOOR_OPEN_STTS_CD,                              \r\n"
+           "            L.PWER_STTS_CD,                                       \r\n"
+           "            L.CBOX_TMPR,                                          \r\n"
+           "            L.CBOX_HMDT,                                          \r\n"
+           "            L.FAN_STTS_CD,                                        \r\n"
+           "            L.HETR_STTS_CD,                                       \r\n"
+           "            L.CBOXFAN_STTS_CD, L.HIST_INS)                        \r\n"
+           "    VALUES (M.VMS_CTLR_NMBR,                                      \r\n"
+           "            M.RGST_DT,                                            \r\n"
+           "            M.CONN_STTS_CD,                                       \r\n"
+           "            M.CBOXDOOR_OPEN_STTS_CD,                              \r\n"
+           "            M.PWER_STTS_CD,                                       \r\n"
+           "            M.CBOX_TMPR,                                          \r\n"
+           "            M.CBOX_HMDT,                                          \r\n"
+           "            M.FAN_STTS_CD,                                        \r\n"
+           "            M.HETR_STTS_CD,                                       \r\n"
+           "            M.CBOXFAN_STTS_CD, '0')                               \r\n";
+
+	try
+	{
+        pADO = new TADOQuery(NULL);
+        pADO->Connection = GetDbConnection();
+
+		try
+		{
+            pADO->Connection->BeginTrans();
+
+            SQLText(pADO, sQry, false);
+
+            {
+                String VMS_CTLR_NMBR         = pObj->VmsNo;
+                String RGST_DT               = sSysTime;
+                String CONN_STTS_CD          = pObj->DSTATE.Comm              == vms_normal ? "CMS0" : "CMS1";
+                String CBOXFAN_STTS_CD       = pObj->DSTATE.ModuleState       == vms_normal ? "MOS0" : "MOS1";
+                String PWER_STTS_CD          = pObj->DSTATE.ModulePowerStatus == vms_normal ? "PWS0" : "PWS1";
+                String CBOXDOOR_OPEN_STTS_CD = pObj->DSTATE.DoorStatus        == vms_close  ? "CDS0" : "CDS1";
+                String FAN_STTS_CD           = pObj->DSTATE.FanStatus         == vms_on     ? "PAS0" : "PAS1";
+                String HETR_STTS_CD          = pObj->DSTATE.HeaterStatus      == vms_on     ? "HTS0" : "HTS1";
+                String CBOX_TMPR             = String(pObj->DSTATE.BodyTemp);
+                String CBOX_HMDT             = String(pObj->DSTATE.LuminanceStatus);
+
+                if (CONN_STTS_CD != "CMS0" ||
+                    AServerState == 1) //통신이 비정상이거나 VMS가 최초로 접속한 경우(상태정보를 알수 없다)
+                {
+                    CBOXDOOR_OPEN_STTS_CD = "CDS2";
+                    PWER_STTS_CD          = "PWS2";
+                    CBOX_TMPR             = "0";
+                    CBOX_HMDT             = "0";
+                    FAN_STTS_CD           = "PAS2";
+                    HETR_STTS_CD          = "HTS2";
+                    CBOXFAN_STTS_CD       = "MOS2";
+                }
+
+                SQLBind(pADO, "p01", VMS_CTLR_NMBR);
+                SQLBind(pADO, "p02", RGST_DT);
+                SQLBind(pADO, "p03", CONN_STTS_CD);
+                SQLBind(pADO, "p04", CBOXDOOR_OPEN_STTS_CD);
+                SQLBind(pADO, "p05", PWER_STTS_CD);
+                SQLBind(pADO, "p06", CBOX_TMPR);
+                SQLBind(pADO, "p07", CBOX_HMDT);
+                SQLBind(pADO, "p08", FAN_STTS_CD);
+                SQLBind(pADO, "p09", HETR_STTS_CD);
+                SQLBind(pADO, "p10", CBOXFAN_STTS_CD);
+
+                SQLExec(pADO);
+
+
+#if 0
+    // FOR PASIG
+    sQry = "UPDATE TB_VMS_CTLR                   \r\n"
+           "   SET VMS_PHSE_CHNG_CYCL    = :p01, \r\n"
+           "       VMS_CMNC_ERR_BASS_VAL = :p02, \r\n"
+           "       FAN_MTNS_TMPR         = :p03, \r\n"
+           "       HETR_MTNS_TMPR        = :p04, \r\n"
+           "       VMS_MODL_ERR_RATE     = :p05  \r\n"
+           " WHERE VMS_CTLR_NMBR = :p06          \r\n";
+
+                if (AServerState == 0)  //상태정보를 정상적으로 수집한 경우에만
+                {
+                    if (pObj->VMS_PHSE_CHNG_CYCL    != pObj->DSTATE.ScheduledMessageOperatingTime ||
+                        pObj->VMS_CMNC_ERR_BASS_VAL != pObj->DSTATE.ModuleOperatingTemperature    ||
+                        pObj->FAN_MTNS_TMPR         != pObj->DSTATE.FanOperatingTemperature       ||
+                        pObj->HETR_MTNS_TMPR        != pObj->DSTATE.HeaterOperatingTemperature    ||
+                        pObj->VMS_MODL_ERR_RATE     != pObj->DSTATE.ModuleBasicFailureRate        )
+                    {
+                        pObj->VMS_PHSE_CHNG_CYCL    = pObj->DSTATE.ScheduledMessageOperatingTime;
+                        pObj->VMS_CMNC_ERR_BASS_VAL = pObj->DSTATE.ModuleOperatingTemperature;
+                        pObj->FAN_MTNS_TMPR         = pObj->DSTATE.FanOperatingTemperature;
+                        pObj->HETR_MTNS_TMPR        = pObj->DSTATE.HeaterOperatingTemperature;
+                        pObj->VMS_MODL_ERR_RATE     = pObj->DSTATE.ModuleBasicFailureRate;
+
+                        SQLText(pADO, sQry, false);
+
+                        SQLBind(pADO, "p01", pObj->VMS_PHSE_CHNG_CYCL);
+                        SQLBind(pADO, "p02", pObj->VMS_CMNC_ERR_BASS_VAL);
+                        SQLBind(pADO, "p03", pObj->FAN_MTNS_TMPR);
+                        SQLBind(pADO, "p04", pObj->HETR_MTNS_TMPR);
+                        SQLBind(pADO, "p05", pObj->VMS_MODL_ERR_RATE);
+                        SQLBind(pADO, "p06", VMS_CTLR_NMBR);
+
+                        SQLExec(pADO);
+                    }
+                }
+#endif
+            }
+            pADO->Connection->CommitTrans();
+
+			nResult = VERR_NONE;
+		}
+		catch(EDatabaseError &E)
+		{
+            pADO->Connection->RollbackTrans();
+            ErrorString = String(E.ClassName()) + E.Message;
+            DBERRORLOG("SaveEquipStateProc", String(E.ClassName()), E.Message, sQry);
+		}
+		catch(Exception &e)
+		{
+            pADO->Connection->RollbackTrans();
+            ErrorString = String(e.ClassName()) + e.Message;
+            DBERRORLOG("SaveEquipStateProc", String(e.ClassName()), e.Message, sQry);
+		}
+	}
+	__finally
+	{
+        if (pADO)
+        {
+            SQLClose(pADO);
+            SAFE_DELETE(pADO);
+        }
+	}
+
+    //상태정보를 클라이언트로 전송
+    INT_VMS_STATE_RES Res;
+    memset((char*)&Res, 0x00, sizeof(Res));
+    Res.Total = VmsManager->Total;
+    Res.Error = VmsManager->Error;
+    Res.Normal= VmsManager->Normal;
+    Res.Module= VmsManager->Module;
+    Res.Count = 1;
+    memcpy((char*)&Res.Unit[0], (char*)&pObj->DSTATE, sizeof(INT_VMS_STATE));
+    nResult = VComm_VmsStateNotify(&Res);
+	return nResult;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::DataSaveProc(void *pData)
+{
+#if 0
+	int              nResult;
+	SET_INFO_STRUCT *pSet;
+
+	nResult = VERR_NONE;
+
+    if (!pData) return VERR_OTHER;
+
+    try
+    {
+        pSet = (SET_INFO_STRUCT *)pData;
+
+        switch(pSet->CtlType)
+        {
+        case CTL_TYPE_PARA_SET:
+            break;
+        case CTL_TYPE_MODULE_ON:
+        case CTL_TYPE_MODULE_OFF:
+        case CTL_TYPE_RESET:
+            break;
+        }
+    }
+    __finally
+    {
+        delete[] (char *)pData;
+    }
+
+	return nResult;
+#else
+return 0;
+#endif
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::LoadIfscTrafficInfo()
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+    int        nSelCnt = 0;
+
+    LINFO("LoadIfscTrafficInfo: Start");
+
+    sQry = "SELECT A.VMS_IFSC_ID, A.VMS_IFSC_NM, A.DSPL_STRT_NODE_NM, A.DSPL_END_NODE_NM, \r\n"
+           "       A.ROAD_NM, A.SPOT_NM,                                                  \r\n"
+           "       A.DETR_ID, A.AXIS_YN,                                                  \r\n"
+           "       NVL(B.RGST_DT,       '') AS RGST_DT,                                   \r\n"
+           "       NVL(B.CMTR_GRAD_CD, '0') AS CMTR_GRAD_CD,                              \r\n"
+           "       NVL(B.SPED,           0) AS SPED,                                      \r\n"
+           "       NVL(B.TRVL_HH,        0) AS TRVL_HH                                    \r\n"
+           "  FROM TB_VMS_IFSC A,                                                         \r\n"
+           "       (SELECT *                                                              \r\n"
+           "          FROM TB_VMS_CMTRINFR                                                \r\n"
+           "         WHERE RGST_DT >= TO_CHAR(SYSDATE-10/1440, 'YYYYMMDDHH24MISS') ) B    \r\n"
+           " WHERE A.VMS_IFSC_ID = B.VMS_IFSC_ID(+)                                       \r\n";
+
+    FOR_STL(TCDSIfsc*, pObj, IfscManager->FLists)
+    {
+        pObj->CMTR_GRAD_CD = "0";
+        pObj->TRVL_HH      = 0;
+        pObj->SPED         = 0;
+    }
+
+    try
+    {
+        TCDSIfsc *pIfsc;
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = GetDbConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                AnsiString VMS_IFSC_ID = pADO->FieldByName("VMS_IFSC_ID")->AsString.Trim();
+				pIfsc = IfscManager->FLists.Find(VMS_IFSC_ID);
+                if (!pIfsc)
+                {
+                    pIfsc = new TCDSIfsc();
+                    pIfsc->VMS_IFSC_ID = VMS_IFSC_ID;
+                    IfscManager->FLists.Push(pIfsc->VMS_IFSC_ID, pIfsc);
+                }
+
+                pIfsc->VMS_IFSC_NM       = pADO->FieldByName("VMS_IFSC_NM")->AsString;
+                pIfsc->DSPL_STRT_NODE_NM = pADO->FieldByName("DSPL_STRT_NODE_NM")->AsString;
+                pIfsc->DSPL_END_NODE_NM  = pADO->FieldByName("DSPL_END_NODE_NM")->AsString;
+                pIfsc->DETR_ID           = pADO->FieldByName("DETR_ID")->AsString;
+                pIfsc->ROAD_NM           = pADO->FieldByName("ROAD_NM")->AsString;
+                pIfsc->SPOT_NM           = pADO->FieldByName("SPOT_NM")->AsString;
+                pIfsc->AXIS_YN           = pADO->FieldByName("AXIS_YN")->AsString;
+
+                pIfsc->RGST_DT      = pADO->FieldByName("RGST_DT")->AsString;
+                pIfsc->CMTR_GRAD_CD = pADO->FieldByName("CMTR_GRAD_CD")->AsString;
+                pIfsc->SPED         = pADO->FieldByName("SPED")->AsInteger;
+                pIfsc->TRVL_HH      = pADO->FieldByName("TRVL_HH")->AsInteger;
+
+                nSelCnt++;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ErrorString = String(E.ClassName()) + E.Message;
+            return VERR_OTHER;
+        }
+        catch(Exception &e)
+        {
+            ErrorString = String(e.ClassName()) + e.Message;
+            return VERR_OTHER;
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    if (0)
+    {
+        FOR_STL(TCDSIfsc*, pTmp, IfscManager->FLists)
+        {
+            try
+            {
+                LDEBUG("Ifsc: %s, Grad: %s", pTmp->VMS_IFSC_ID.c_str(), pTmp->CMTR_GRAD_CD.c_str());
+            }
+            catch(Exception &e)
+            {
+            }
+        }
+    }
+
+    LINFO("LoadIfscTrafficInfo: %d EA", nSelCnt);
+
+    return VERR_NONE;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::ClearVmsProvideMode(AnsiString AVmsId)
+{
+    int        nSelCnt= 0;
+
+    LINFO("ClearVmsProvideMode: Start");
+
+    FFormDsplDt = Now().FormatString("yyyymmddhhnnss");
+
+    VmsIterator it;
+    for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
+    {
+        TVmsCtlr *pObj = (TVmsCtlr*)it->second;
+
+        if (pObj->Server.UseFlag != bit_enable) continue;
+
+        if (!pObj->FProvide) continue;
+
+        pObj->CTLMODE->MaxDisplayForm = 0;//pObj->VMS_MAX_PHSE_NUM; //0
+        pObj->CTLMODE->Enable         = object_disable;
+        pObj->CTLMODE->SvcDate        = FFormDsplDt;
+        pObj->CTLMODE->SaveFlag       = -1;
+        pObj->CTLMODE->pTimer         = Now();
+        pObj->CTLMODE->Result         = false;
+
+        ScheduleInit(pObj->SCHEDULE);   //스케줄정보
+        EventInit(pObj->INCIDENT);      //돌발정보
+        EventInit(pObj->EVENT);         //이벤트(공사/행사)정보
+
+        pObj->pForms->Clear();
+
+        nSelCnt++;
+    }
+    LINFO("ClearVmsProvideMode: %d EA", nSelCnt);
+    return VERR_NONE;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::LoadVmsScheduleInfo(AnsiString AVmsId)
+{
+	int         nResult;
+	AnsiString  sQry;
+	int         nSelCnt = 0;
+	TADOQuery  *pADO = NULL;
+
+	nResult = VERR_OTHER;
+
+    LINFO("LoadVmsScheduleInfo: Start");
+
+    sQry = "SELECT B.*, DECODE(B.TRFC_SITU_TYPE_CD, '0', 7,               \r\n"
+           "                                        '1', 3,               \r\n"
+           "                                        '2', 4,               \r\n"
+           "                                        '3', 5,               \r\n"
+           "                                        '4', 6,               \r\n"
+           "                                        '5', 1,               \r\n"
+           "                                        '6', 0,               \r\n"
+           "                                        '7', 8, 9) AS SCHPRIT \r\n"
+           "  FROM TB_VMS_CTLR A,                                         \r\n"
+           "       TB_VMS_TRFC_INFR_DSPL_SCH B,                           \r\n"
+           "       TB_VMS_FORM C                                          \r\n"
+           " WHERE A.DEL_YN = 'N'                                         \r\n"
+           "   AND A.VMS_CTLR_NMBR = B.VMS_CTLR_NMBR                      \r\n"
+           "   AND B.VMS_FORM_ID   = C.VMS_FORM_ID                        \r\n"
+           "   AND B.USE_YN        = 'Y'                                  \r\n"
+           "   AND TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS') BETWEEN           \r\n"
+           "       B.DSPL_STRT_HH AND B.DSPL_END_HH                       \r\n";
+
+    sQry = "SELECT * \r\n"
+           "  FROM ( \r\n" + sQry +
+           "       ) \r\n"
+           " ORDER BY VMS_CTLR_NMBR ASC, SCHPRIT ASC, PHASE ASC \r\n";
+
+	try
+	{
+		pADO = new TADOQuery(NULL);
+        pADO->Connection = GetDbConnection();
+
+		try
+		{
+            SQLText(pADO, sQry, false);
+			SQLOpen(pADO);
+
+            int  nIdx;
+            int  TRFC_SITU_TYPE_CD;
+            bool bBottomTraffic;
+            TCDSIfsc *pCDSIfsc;
+
+			for( ; !pADO->Eof; pADO->Next())
+			{
+                AnsiString sVmsNmbr    = pADO->FieldByName("VMS_CTLR_NMBR")->AsString;
+                AnsiString VMS_FORM_ID = pADO->FieldByName("VMS_FORM_ID")->AsString;
+
+                //스케줄 유형 코드(0:교통정보,1:돌발,2:공사/행사문안,3:홍보문안,4:우회도로,5:고정스케줄, 6:기본스케줄, 7:정체상황)
+                TRFC_SITU_TYPE_CD = pADO->FieldByName("TRFC_SITU_TYPE_CD")->AsString.ToIntDef(-1);
+
+                if (TRFC_SITU_TYPE_CD < enFormTraffic||
+                    TRFC_SITU_TYPE_CD > enFormCongest)
+                {
+                    LERROR("VMS Schedule Unknown Type: VmsNmbr(%s)-[%s.%d]", sVmsNmbr.c_str(), VMS_FORM_ID.c_str(), TRFC_SITU_TYPE_CD);
+                    continue;
+                }
+
+                TVmsCtlr *pObj = VmsManager->FLists.Find(sVmsNmbr);
+                if (!pObj) continue;
+
+                if (!pObj->FProvide) continue;
+
+                TCDSForm *pForm = FormManager->FLists.Find(VMS_FORM_ID);
+                if (!pForm)
+                {
+                    LERROR("VMS Schedule Not Found Form: VmsNmbr(%s)-[%s]", sVmsNmbr.c_str(), VMS_FORM_ID.c_str());
+                    continue;
+                }
+
+                if (pObj->SCHEDULE->Count >= VMS_MAX_SCHEDULE)
+                {
+                    LERROR("VMS Schedule Count Over: %s, %d", sVmsNmbr.c_str(), pObj->SCHEDULE->Count);
+                    continue;
+                }
+
+                if (pObj->CTLMODE->Control == 'F')
+                {
+                    //고정스케쥴인 경우 고정스케쥴정보만 등록한다.
+                    if (TRFC_SITU_TYPE_CD != enFormFixed) continue;
+                }
+                else
+                if (pObj->CTLMODE->Control == 'B')
+                {
+                    //기본스케쥴인 경우 기본스케쥴정보만 등록한다.
+                    if (TRFC_SITU_TYPE_CD != enFormBase) continue;
+                }
+                else
+                {
+                    //자동시케쥴인 경우 고정스케쥴, 기본스케쥴 체크
+                    if (TRFC_SITU_TYPE_CD == enFormFixed || TRFC_SITU_TYPE_CD == enFormBase)
+                    {
+                        continue; //여기 걸리면 프로그램적으로 오류가 발생한 거임
+                    }
+                }
+
+                //TODO: 조회정렬은 기본,고정,자동(돌발,공사,행사,우회,교통,정체폼) 순으로 조회된다.
+                //      따라서 각 폼에 대한처리를 수행하면 된다.
+
+                if (TRFC_SITU_TYPE_CD == enFormTraffic && pForm->VMS_FORM_TYPE_CD == enFormKindTrfRow1)
+                {
+                    //교통정보스케쥴이고 폼의 유형이  소통정보(1단) 인경우....
+                    //해당 폼이 돌발이나 이벤트가 등록되어 있다면
+                    //폼을 생성하지 않는다.
+
+                    AnsiString FRST_VMS_IFSC_ID = pADO->FieldByName("FRST_VMS_IFSC_ID")->AsString;
+
+                    if (FRST_VMS_IFSC_ID != "")
+                    {
+                        for (int ii = 0; ii < pObj->SCHEDULE->Count && ii < VMS_MAX_SCHEDULE; ii++)
+                        {
+                            if (pObj->SCHEDULE->Unit[ii].TRFC_SITU_TYPE_CD == enFormDolbal ||  //돌발
+                                pObj->SCHEDULE->Unit[ii].TRFC_SITU_TYPE_CD == enFormGongsa ||  //공사/행사
+                                pObj->SCHEDULE->Unit[ii].TRFC_SITU_TYPE_CD == enFormDeture )   //우회
+                            {
+                                if (pObj->SCHEDULE->Unit[ii].EVENT)
+                                {
+                                    if (FRST_VMS_IFSC_ID == pObj->SCHEDULE->Unit[ii].EVENT->VMS_IFSC_ID)
+                                    {
+                                        //폼을 생성하지 않는다.
+                                        continue;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+
+                bBottomTraffic = false;
+                switch(TRFC_SITU_TYPE_CD)
+                {
+                case enFormTraffic:     //교통정보
+                    //정보제공구간 하단 소통정보
+                    if (pForm->VMS_FORM_TYPE_CD == enFormKindTrfImg && pForm->TrfIfsc)
+                    {
+                        //도형식 VMS인 경우 하단에 소통정보를 표출하는 경우 다중폼이 생성됨
+                        //제공구간소통정보가 정체, 지체인 경우만 하단 소통정보를 표출함
+#if 0
+                        FOR_STL(TVmsIfsc*, pIfsc, pObj->FIfscLists)
+                        {
+                            pCDSIfsc = IfscManager->FLists.Find(pIfsc->VMS_IFSC_ID);
+                            if (!pCDSIfsc) continue;
+
+                            if (pCDSIfsc->AXIS_YN == "Y") continue;
+                            if (pCDSIfsc->CMTR_GRAD_CD == "3" || pCDSIfsc->CMTR_GRAD_CD == "2")
+                            {
+                                bBottomTraffic = true;
+                                break;
+                            }
+                        }
+#else
+                        //도형식 배경셀에 등록된 구간에 대해서 표출하도록 수정(20161124)
+                        TCDSImage *pBakTrfImg = ImageManager->FLists.Find(pForm->TrfBakImgId);
+                        if (pBakTrfImg)
+                        {
+                            FOR_STL(TCDSImageCell*, pCell, pBakTrfImg->FLists)
+                            {
+                                TCDSIfsc *pTmpIfsc1 = IfscManager->FLists.Find(pCell->VMS_IFSC_ID);
+                                if (pTmpIfsc1)
+                                {
+                                    if (pTmpIfsc1->CMTR_GRAD_CD == "3" || pTmpIfsc1->CMTR_GRAD_CD == "2")
+                                    {
+                                        bBottomTraffic = true;
+                                        break;
+                                    }
+                                }
+                            }
+                        }
+#endif
+                    }
+
+                    //정보제공구간 축 하단 소통정보
+                    if (pForm->VMS_FORM_TYPE_CD == enFormKindTrfImg && pForm->TrfAxis)
+                    {
+                        //도형식 VMS인 경우 하단에 소통정보를 표출하는 경우 다중폼이 생성됨
+                        //축 소통정보인 경우 모든 축에 대해 소통정보를 표출
+                        FOR_STL(TVmsIfsc*, pIfsc, pObj->FIfscLists)
+                        {
+                            pCDSIfsc = IfscManager->FLists.Find(pIfsc->VMS_IFSC_ID);
+                            if (!pCDSIfsc) continue;
+
+                            if (pCDSIfsc->AXIS_YN != "Y") continue;
+                            if (pCDSIfsc->CMTR_GRAD_CD != "0")
+                            {
+                                bBottomTraffic = true;
+                                break;
+                            }
+                        }
+                    }
+
+                    if (bBottomTraffic)
+                    {
+                        //도형식 다중 소통정보 표출인 경우
+                        //하단소통정보를 표출하는경우 정체, 지체 순으로 표출
+                        if (pForm->TrfIfsc)
+                        {
+                            //정보제공구간 소통정보 순환표출(정체)
+#if 0
+                            FOR_STL(TVmsIfsc*, pIfsc, pObj->FIfscLists)
+                            {
+                                pCDSIfsc = IfscManager->FLists.Find(pIfsc->VMS_IFSC_ID);
+                                if (!pCDSIfsc) continue;
+
+                                if (pCDSIfsc->AXIS_YN == "Y") continue;
+                                if (pCDSIfsc->CMTR_GRAD_CD != "3") continue;
+
+                                nIdx = pObj->SCHEDULE->Count;
+                                if (nIdx < VMS_MAX_SCHEDULE)
+                                {
+                                    nIdx = pObj->SCHEDULE->Count;
+                                    pObj->SCHEDULE->Unit[nIdx].TRFC_SITU_TYPE_CD = TRFC_SITU_TYPE_CD;
+                                    pObj->SCHEDULE->Unit[nIdx].PHASE             = pADO->FieldByName("PHASE")->AsInteger;
+                                    pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID       = VMS_FORM_ID;
+                                    pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID  = pADO->FieldByName("FRST_VMS_IFSC_ID")->AsString;
+                                    pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID  = pADO->FieldByName("SECD_VMS_IFSC_ID")->AsString;
+                                    pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID  = pADO->FieldByName("THIR_VMS_IFSC_ID")->AsString;
+                                    pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID  = pADO->FieldByName("FOUR_VMS_IFSC_ID")->AsString;
+                                    pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID  = pADO->FieldByName("FRST_IMG_IFSC_ID")->AsString;
+                                    pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID  = pADO->FieldByName("SECD_IMG_IFSC_ID")->AsString;
+                                    pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID  = pADO->FieldByName("THIR_IMG_IFSC_ID")->AsString;
+                                    pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID  = pADO->FieldByName("FOUR_IMG_IFSC_ID")->AsString;
+                                    pObj->SCHEDULE->Unit[nIdx].DSPL_HH           = pADO->FieldByName("DSPL_HH")->AsInteger;
+                                    pObj->SCHEDULE->Unit[nIdx].VMS_FORM_PRRT_CD  = pADO->FieldByName("VMS_FORM_PRRT_CD")->AsString;
+                                    pObj->SCHEDULE->Unit[nIdx].VMS_IFSC_ID       = pIfsc->VMS_IFSC_ID;  //하단 제공구간 ID
+                                    pObj->SCHEDULE->Count++;
+                                    nSelCnt++;
+                                }
+                            }
+#else
+                            //도형식 배경셀에 등록된 구간에 대해서 표출하도록 수정(20161124)
+                            TCDSImage *pBakTrfImg1 = ImageManager->FLists.Find(pForm->TrfBakImgId);
+                            if (pBakTrfImg1)
+                            {
+                                FOR_STL(TCDSImageCell*, pCell, pBakTrfImg1->FLists)
+                                {
+                                    TCDSIfsc *pTmpIfsc1 = IfscManager->FLists.Find(pCell->VMS_IFSC_ID);
+                                    if (!pTmpIfsc1) continue;
+
+                                    if (pTmpIfsc1->CMTR_GRAD_CD != "3") continue;
+
+                                    nIdx = pObj->SCHEDULE->Count;
+                                    if (nIdx < VMS_MAX_SCHEDULE)
+                                    {
+                                        nIdx = pObj->SCHEDULE->Count;
+                                        pObj->SCHEDULE->Unit[nIdx].TRFC_SITU_TYPE_CD = TRFC_SITU_TYPE_CD;
+                                        pObj->SCHEDULE->Unit[nIdx].PHASE             = pADO->FieldByName("PHASE")->AsInteger;
+                                        pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID       = VMS_FORM_ID;
+                                        pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID  = pCell->VMS_IFSC_ID;
+                                        pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID  = pADO->FieldByName("SECD_VMS_IFSC_ID")->AsString;
+                                        pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID  = pADO->FieldByName("THIR_VMS_IFSC_ID")->AsString;
+                                        pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID  = pADO->FieldByName("FOUR_VMS_IFSC_ID")->AsString;
+                                        pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID  = pADO->FieldByName("FRST_IMG_IFSC_ID")->AsString;
+                                        pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID  = pADO->FieldByName("SECD_IMG_IFSC_ID")->AsString;
+                                        pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID  = pADO->FieldByName("THIR_IMG_IFSC_ID")->AsString;
+                                        pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID  = pADO->FieldByName("FOUR_IMG_IFSC_ID")->AsString;
+                                        pObj->SCHEDULE->Unit[nIdx].DSPL_HH           = pADO->FieldByName("DSPL_HH")->AsInteger;
+                                        pObj->SCHEDULE->Unit[nIdx].VMS_FORM_PRRT_CD  = pADO->FieldByName("VMS_FORM_PRRT_CD")->AsString;
+                                        pObj->SCHEDULE->Unit[nIdx].VMS_IFSC_ID       = pCell->VMS_IFSC_ID;  //하단 제공구간 ID
+                                        pObj->SCHEDULE->Count++;
+                                        nSelCnt++;
+                                    }
+                                }
+                            }
+#endif
+                            //정보제공구간 소통정보 순환표출(지체)
+#if 0
+                            FOR_STL(TVmsIfsc*, pIfsc, pObj->FIfscLists)
+                            {
+                                pCDSIfsc = IfscManager->FLists.Find(pIfsc->VMS_IFSC_ID);
+                                if (!pCDSIfsc) continue;
+
+                                if (pCDSIfsc->AXIS_YN == "Y") continue;
+                                if (pCDSIfsc->CMTR_GRAD_CD != "2") continue;
+
+                                nIdx = pObj->SCHEDULE->Count;
+                                if (nIdx < VMS_MAX_SCHEDULE)
+                                {
+                                    nIdx = pObj->SCHEDULE->Count;
+                                    pObj->SCHEDULE->Unit[nIdx].TRFC_SITU_TYPE_CD = TRFC_SITU_TYPE_CD;
+                                    pObj->SCHEDULE->Unit[nIdx].PHASE             = pADO->FieldByName("PHASE")->AsInteger;
+                                    pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID       = VMS_FORM_ID;
+                                    pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID  = pIfsc->VMS_IFSC_ID;
+                                    pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID  = "";
+                                    pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID  = "";
+                                    pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID  = "";
+                                    pObj->SCHEDULE->Unit[nIdx].DSPL_HH           = pADO->FieldByName("DSPL_HH")->AsInteger;
+                                    pObj->SCHEDULE->Unit[nIdx].VMS_FORM_PRRT_CD  = pADO->FieldByName("VMS_FORM_PRRT_CD")->AsString;
+                                    pObj->SCHEDULE->Unit[nIdx].VMS_IFSC_ID       = pIfsc->VMS_IFSC_ID;  //하단 제공구간 ID
+                                    pObj->SCHEDULE->Count++;
+                                    nSelCnt++;
+                                }
+                            }
+#else
+                            //도형식 배경셀에 등록된 구간에 대해서 표출하도록 수정(20161124)
+                            TCDSImage *pBakTrfImg2 = ImageManager->FLists.Find(pForm->TrfBakImgId);
+                            if (pBakTrfImg2)
+                            {
+                                FOR_STL(TCDSImageCell*, pCell, pBakTrfImg2->FLists)
+                                {
+                                    TCDSIfsc *pTmpIfsc1 = IfscManager->FLists.Find(pCell->VMS_IFSC_ID);
+                                    if (!pTmpIfsc1) continue;
+
+                                    if (pTmpIfsc1->CMTR_GRAD_CD != "2") continue;
+
+                                    nIdx = pObj->SCHEDULE->Count;
+                                    if (nIdx < VMS_MAX_SCHEDULE)
+                                    {
+                                    nIdx = pObj->SCHEDULE->Count;
+                                    pObj->SCHEDULE->Unit[nIdx].TRFC_SITU_TYPE_CD = TRFC_SITU_TYPE_CD;
+                                    pObj->SCHEDULE->Unit[nIdx].PHASE             = pADO->FieldByName("PHASE")->AsInteger;
+                                    pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID       = VMS_FORM_ID;
+                                    pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID  = pCell->VMS_IFSC_ID;
+                                    pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID  = "";
+                                    pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID  = "";
+                                    pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID  = "";
+                                    pObj->SCHEDULE->Unit[nIdx].DSPL_HH           = pADO->FieldByName("DSPL_HH")->AsInteger;
+                                    pObj->SCHEDULE->Unit[nIdx].VMS_FORM_PRRT_CD  = pADO->FieldByName("VMS_FORM_PRRT_CD")->AsString;
+                                    pObj->SCHEDULE->Unit[nIdx].VMS_IFSC_ID       = pCell->VMS_IFSC_ID;  //하단 제공구간 ID
+                                    pObj->SCHEDULE->Count++;
+                                    nSelCnt++;
+                                    }
+                                }
+                            }
+#endif
+                        }
+
+                        if (pForm->TrfAxis)
+                        {
+                            //축소통정보 순환표출
+                            FOR_STL(TVmsIfsc*, pIfsc, pObj->FIfscLists)
+                            {
+                                pCDSIfsc = IfscManager->FLists.Find(pIfsc->VMS_IFSC_ID);
+                                if (!pCDSIfsc) continue;
+
+                                if (pCDSIfsc->AXIS_YN != "Y") continue;
+                                if (pCDSIfsc->CMTR_GRAD_CD == "0") continue;
+
+                                nIdx = pObj->SCHEDULE->Count;
+                                if (nIdx < VMS_MAX_SCHEDULE)
+                                {
+                                    nIdx = pObj->SCHEDULE->Count;
+                                    pObj->SCHEDULE->Unit[nIdx].TRFC_SITU_TYPE_CD = TRFC_SITU_TYPE_CD;
+                                    pObj->SCHEDULE->Unit[nIdx].PHASE             = pADO->FieldByName("PHASE")->AsInteger;
+                                    pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID       = VMS_FORM_ID;
+                                    pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID  = pADO->FieldByName("FRST_VMS_IFSC_ID")->AsString;
+                                    pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID  = pADO->FieldByName("SECD_VMS_IFSC_ID")->AsString;
+                                    pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID  = pADO->FieldByName("THIR_VMS_IFSC_ID")->AsString;
+                                    pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID  = pADO->FieldByName("FOUR_VMS_IFSC_ID")->AsString;
+                                    pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID  = pADO->FieldByName("FRST_IMG_IFSC_ID")->AsString;
+                                    pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID  = pADO->FieldByName("SECD_IMG_IFSC_ID")->AsString;
+                                    pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID  = pADO->FieldByName("THIR_IMG_IFSC_ID")->AsString;
+                                    pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID  = pADO->FieldByName("FOUR_IMG_IFSC_ID")->AsString;
+                                    pObj->SCHEDULE->Unit[nIdx].DSPL_HH           = pADO->FieldByName("DSPL_HH")->AsInteger;
+                                    pObj->SCHEDULE->Unit[nIdx].VMS_FORM_PRRT_CD  = pADO->FieldByName("VMS_FORM_PRRT_CD")->AsString;
+                                    pObj->SCHEDULE->Unit[nIdx].VMS_IFSC_ID       = pIfsc->VMS_IFSC_ID;  //하단 제공구간 ID
+                                    pObj->SCHEDULE->Count++;
+                                    nSelCnt++;
+                                }
+                            }
+                        }
+                    }
+                    else
+                    {
+                        //도형식 다중표출이 아닌경우(하단소통정보가 없는 경우)
+                        nIdx = pObj->SCHEDULE->Count;
+                        if (nIdx < VMS_MAX_SCHEDULE)
+                        {
+                            pObj->SCHEDULE->Unit[nIdx].TRFC_SITU_TYPE_CD = TRFC_SITU_TYPE_CD;
+                            pObj->SCHEDULE->Unit[nIdx].PHASE             = pADO->FieldByName("PHASE")->AsInteger;
+                            pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID       = VMS_FORM_ID;
+                            pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID  = pADO->FieldByName("FRST_VMS_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID  = pADO->FieldByName("SECD_VMS_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID  = pADO->FieldByName("THIR_VMS_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID  = pADO->FieldByName("FOUR_VMS_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID  = pADO->FieldByName("FRST_IMG_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID  = pADO->FieldByName("SECD_IMG_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID  = pADO->FieldByName("THIR_IMG_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID  = pADO->FieldByName("FOUR_IMG_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].DSPL_HH           = pADO->FieldByName("DSPL_HH")->AsInteger;
+                            pObj->SCHEDULE->Unit[nIdx].VMS_FORM_PRRT_CD  = pADO->FieldByName("VMS_FORM_PRRT_CD")->AsString;
+                            pObj->SCHEDULE->Count++;
+                            nSelCnt++;
+                        }
+                    }
+                    break;
+                case enFormDolbal:  //돌발
+                    //돌발 스케줄인 경우 해당 VMS에 발생한 모든 돌발 정보를 표출하도록 스케줄 추가
+                    for (int ii = 0; ii < pObj->INCIDENT->Count; ii++)
+                    {
+                        nIdx = pObj->SCHEDULE->Count;
+                        if (nIdx < VMS_MAX_SCHEDULE)
+                        {
+                            pObj->SCHEDULE->Unit[nIdx].TRFC_SITU_TYPE_CD = TRFC_SITU_TYPE_CD;
+                            pObj->SCHEDULE->Unit[nIdx].PHASE             = pADO->FieldByName("PHASE")->AsInteger;
+                            pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID       = VMS_FORM_ID;
+                            pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID  = pADO->FieldByName("FRST_VMS_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID  = pADO->FieldByName("SECD_VMS_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID  = pADO->FieldByName("THIR_VMS_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID  = pADO->FieldByName("FOUR_VMS_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID  = pADO->FieldByName("FRST_IMG_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID  = pADO->FieldByName("SECD_IMG_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID  = pADO->FieldByName("THIR_IMG_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID  = pADO->FieldByName("FOUR_IMG_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].DSPL_HH           = pADO->FieldByName("DSPL_HH")->AsInteger;
+                            pObj->SCHEDULE->Unit[nIdx].VMS_FORM_PRRT_CD  = pADO->FieldByName("VMS_FORM_PRRT_CD")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].VMS_IFSC_ID       = pObj->INCIDENT->Unit[ii].VMS_IFSC_ID;
+                            pObj->SCHEDULE->Unit[nIdx].EVENT             = &pObj->INCIDENT->Unit[ii];
+                            pObj->SCHEDULE->Count++;
+                            nSelCnt++;
+                        }
+                    }
+                    break;
+                case enFormGongsa:  //공사/행사문안
+                    //공사/행사 스케줄인 경우 해당 VMS에 발생한 모든 돌발 정보를 표출하도록 스케줄 추가
+                    for (int ii = 0; ii < pObj->EVENT->Count; ii++)
+                    {
+                        nIdx = pObj->SCHEDULE->Count;
+                        if (nIdx < VMS_MAX_SCHEDULE)
+                        {
+                            pObj->SCHEDULE->Unit[nIdx].TRFC_SITU_TYPE_CD = TRFC_SITU_TYPE_CD;
+                            pObj->SCHEDULE->Unit[nIdx].PHASE             = pADO->FieldByName("PHASE")->AsInteger;
+                            pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID       = VMS_FORM_ID;
+                            pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID  = pADO->FieldByName("FRST_VMS_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID  = pADO->FieldByName("SECD_VMS_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID  = pADO->FieldByName("THIR_VMS_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID  = pADO->FieldByName("FOUR_VMS_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID  = pADO->FieldByName("FRST_IMG_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID  = pADO->FieldByName("SECD_IMG_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID  = pADO->FieldByName("THIR_IMG_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID  = pADO->FieldByName("FOUR_IMG_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].DSPL_HH           = pADO->FieldByName("DSPL_HH")->AsInteger;
+                            pObj->SCHEDULE->Unit[nIdx].VMS_FORM_PRRT_CD  = pADO->FieldByName("VMS_FORM_PRRT_CD")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].VMS_IFSC_ID       = pObj->EVENT->Unit[ii].VMS_IFSC_ID;
+                            pObj->SCHEDULE->Unit[nIdx].EVENT             = &pObj->EVENT->Unit[ii];
+                            pObj->SCHEDULE->Count++;
+                            nSelCnt++;
+                        }
+                    }
+                    break;
+                case enFormDeture:  //우회도로
+                    //돌발발생한 구간중 우회도로 구간이 있는경우
+                    for (int ii = 0; ii < pObj->INCIDENT->Count; ii++)
+                    {
+                        if (pObj->INCIDENT->Unit[ii].DETR_ID == "0") continue;
+
+                        nIdx = pObj->SCHEDULE->Count;
+                        if (nIdx < VMS_MAX_SCHEDULE)
+                        {
+                            pObj->SCHEDULE->Unit[nIdx].TRFC_SITU_TYPE_CD = TRFC_SITU_TYPE_CD;
+                            pObj->SCHEDULE->Unit[nIdx].PHASE             = pADO->FieldByName("PHASE")->AsInteger;
+                            pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID       = VMS_FORM_ID;
+                            pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID  = pADO->FieldByName("FRST_VMS_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID  = pADO->FieldByName("SECD_VMS_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID  = pADO->FieldByName("THIR_VMS_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID  = pADO->FieldByName("FOUR_VMS_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID  = pADO->FieldByName("FRST_IMG_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID  = pADO->FieldByName("SECD_IMG_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID  = pADO->FieldByName("THIR_IMG_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID  = pADO->FieldByName("FOUR_IMG_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].DSPL_HH           = pADO->FieldByName("DSPL_HH")->AsInteger;
+                            pObj->SCHEDULE->Unit[nIdx].VMS_FORM_PRRT_CD  = pADO->FieldByName("VMS_FORM_PRRT_CD")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].VMS_IFSC_ID       = pObj->INCIDENT->Unit[ii].VMS_IFSC_ID;
+                            pObj->SCHEDULE->Unit[nIdx].EVENT             = &pObj->INCIDENT->Unit[ii];
+                            pObj->SCHEDULE->Count++;
+                            nSelCnt++;
+                        }
+                    }
+
+                    //공사/행사 발생한 구간중 우회도로 구간이 있는경우
+                    for (int ii = 0; ii < pObj->EVENT->Count; ii++)
+                    {
+                        if (pObj->EVENT->Unit[ii].DETR_ID == "0") continue;
+
+                        nIdx = pObj->SCHEDULE->Count;
+                        if (nIdx < VMS_MAX_SCHEDULE)
+                        {
+                            pObj->SCHEDULE->Unit[nIdx].TRFC_SITU_TYPE_CD = TRFC_SITU_TYPE_CD;
+                            pObj->SCHEDULE->Unit[nIdx].PHASE             = pADO->FieldByName("PHASE")->AsInteger;
+                            pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID       = VMS_FORM_ID;
+                            pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID  = pADO->FieldByName("FRST_VMS_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID  = pADO->FieldByName("SECD_VMS_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID  = pADO->FieldByName("THIR_VMS_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID  = pADO->FieldByName("FOUR_VMS_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID  = pADO->FieldByName("FRST_IMG_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID  = pADO->FieldByName("SECD_IMG_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID  = pADO->FieldByName("THIR_IMG_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID  = pADO->FieldByName("FOUR_IMG_IFSC_ID")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].DSPL_HH           = pADO->FieldByName("DSPL_HH")->AsInteger;
+                            pObj->SCHEDULE->Unit[nIdx].VMS_FORM_PRRT_CD  = pADO->FieldByName("VMS_FORM_PRRT_CD")->AsString;
+                            pObj->SCHEDULE->Unit[nIdx].VMS_IFSC_ID       = pObj->EVENT->Unit[ii].VMS_IFSC_ID;
+                            pObj->SCHEDULE->Unit[nIdx].EVENT             = &pObj->EVENT->Unit[ii];
+                            pObj->SCHEDULE->Count++;
+                            nSelCnt++;
+                        }
+                    }
+                    break;
+                case enFormHongbo:  //홍보
+                case enFormFixed:   //고정스케줄
+                case enFormBase:    //기본스케줄
+                    nIdx = pObj->SCHEDULE->Count;
+                    if (nIdx < VMS_MAX_SCHEDULE)
+                    {
+                        pObj->SCHEDULE->Unit[nIdx].TRFC_SITU_TYPE_CD = TRFC_SITU_TYPE_CD;
+                        pObj->SCHEDULE->Unit[nIdx].PHASE             = pADO->FieldByName("PHASE")->AsInteger;
+                        pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID       = VMS_FORM_ID;
+                        pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID  = pADO->FieldByName("FRST_VMS_IFSC_ID")->AsString;
+                        pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID  = pADO->FieldByName("SECD_VMS_IFSC_ID")->AsString;
+                        pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID  = pADO->FieldByName("THIR_VMS_IFSC_ID")->AsString;
+                        pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID  = pADO->FieldByName("FOUR_VMS_IFSC_ID")->AsString;
+                        pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID  = pADO->FieldByName("FRST_IMG_IFSC_ID")->AsString;
+                        pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID  = pADO->FieldByName("SECD_IMG_IFSC_ID")->AsString;
+                        pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID  = pADO->FieldByName("THIR_IMG_IFSC_ID")->AsString;
+                        pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID  = pADO->FieldByName("FOUR_IMG_IFSC_ID")->AsString;
+                        pObj->SCHEDULE->Unit[nIdx].DSPL_HH           = pADO->FieldByName("DSPL_HH")->AsInteger;
+                        pObj->SCHEDULE->Unit[nIdx].VMS_FORM_PRRT_CD  = pADO->FieldByName("VMS_FORM_PRRT_CD")->AsString;
+                        pObj->SCHEDULE->Count++;
+                        nSelCnt++;
+                    }
+                    break;
+                case enFormCongest: //정체상황
+                    //스케쥴에 등록된 제공구간의 속도가 5km/h 이하인 경우에만 표출
+                    {
+                        bool bDup = false;
+                        AnsiString sVmsIfscId[4];
+                        int nObjCnt = pObj->SCHEDULE->Count;
+
+                        for (int ii = 0; ii < nObjCnt && ii < VMS_MAX_SCHEDULE; ii++)
+                        {
+                            sVmsIfscId[0] = "";
+                            sVmsIfscId[1] = "";
+                            sVmsIfscId[2] = "";
+                            sVmsIfscId[3] = "";
+
+                            switch(pObj->SCHEDULE->Unit[ii].TRFC_SITU_TYPE_CD)
+                            {
+                            case enFormDolbal: //돌발
+                            case enFormGongsa: //공사/행사
+                            case enFormDeture: //우회
+                                sVmsIfscId[0] = pObj->SCHEDULE->Unit[ii].VMS_IFSC_ID;
+                                break;
+                            case enFormTraffic:
+                                sVmsIfscId[0] = pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID;
+                                sVmsIfscId[1] = pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID;
+                                sVmsIfscId[2] = pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID;
+                                sVmsIfscId[3] = pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID;
+                                //도형식인 경우 체크확인 해야함
+                                break;
+                            case enFormHongbo:
+                            case enFormFixed:
+                            case enFormBase:
+                            case enFormCongest:
+                            default: continue;
+                            }
+
+                            for (int kk = 0; kk < 4; kk++)
+                            {
+                                if (sVmsIfscId[kk] == "") continue;
+
+                                pCDSIfsc = IfscManager->FLists.Find(sVmsIfscId[kk]);
+                                if (pCDSIfsc)
+                                {
+                                    if (pCDSIfsc->CMTR_GRAD_CD == "3" && pCDSIfsc->SPED <= 5)
+                                    {
+                                        bDup = false;
+                                        for (int jj = nObjCnt-1; jj < pObj->SCHEDULE->Count && ii < VMS_MAX_SCHEDULE; ii++)
+                                        {
+                                            if (pObj->SCHEDULE->Unit[jj].TRFC_SITU_TYPE_CD != enFormCongest) continue;
+                                            if (pObj->SCHEDULE->Unit[jj].VMS_IFSC_ID == sVmsIfscId[kk])
+                                            {
+                                                bDup = true;
+                                                break;
+                                            }
+                                        }
+
+                                        if (bDup) continue;
+
+                                        nIdx = pObj->SCHEDULE->Count;
+                                        if (nIdx < VMS_MAX_SCHEDULE)
+                                        {
+                                            pObj->SCHEDULE->Unit[nIdx].TRFC_SITU_TYPE_CD = TRFC_SITU_TYPE_CD;
+                                            pObj->SCHEDULE->Unit[nIdx].PHASE             = pADO->FieldByName("PHASE")->AsInteger;
+                                            pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID       = VMS_FORM_ID;
+                                            pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID  = pADO->FieldByName("FRST_VMS_IFSC_ID")->AsString;
+                                            pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID  = pADO->FieldByName("SECD_VMS_IFSC_ID")->AsString;
+                                            pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID  = pADO->FieldByName("THIR_VMS_IFSC_ID")->AsString;
+                                            pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID  = pADO->FieldByName("FOUR_VMS_IFSC_ID")->AsString;
+                                            pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID  = pADO->FieldByName("FRST_IMG_IFSC_ID")->AsString;
+                                            pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID  = pADO->FieldByName("SECD_IMG_IFSC_ID")->AsString;
+                                            pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID  = pADO->FieldByName("THIR_IMG_IFSC_ID")->AsString;
+                                            pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID  = pADO->FieldByName("FOUR_IMG_IFSC_ID")->AsString;
+                                            pObj->SCHEDULE->Unit[nIdx].DSPL_HH           = pADO->FieldByName("DSPL_HH")->AsInteger;
+                                            pObj->SCHEDULE->Unit[nIdx].VMS_FORM_PRRT_CD  = pADO->FieldByName("VMS_FORM_PRRT_CD")->AsString;
+                                            pObj->SCHEDULE->Unit[nIdx].VMS_IFSC_ID       = sVmsIfscId[kk];
+                                            pObj->SCHEDULE->Count++;
+                                            nSelCnt++;
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    break;
+                }
+			}
+
+			nResult = VERR_NONE;
+		}
+		catch(EDatabaseError &E)
+		{
+            ErrorString = String(E.ClassName()) + E.Message;
+		}
+		catch(Exception &e)
+		{
+            ErrorString = String(e.ClassName()) + e.Message;
+		}
+	}
+	__finally
+	{
+		SQLFree(pADO);
+	}
+
+    if (0)
+    {
+        VmsIterator it;
+        for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
+        {
+            TVmsCtlr *pObj = (TVmsCtlr*)it->second;
+
+            if (pObj->Server.UseFlag != bit_enable) continue;
+            LDEBUG("VMS Schedule: %s, %d EA", pObj->VmsNo.c_str(), pObj->SCHEDULE->Count);
+        }
+    }
+
+    LINFO("LoadVmsScheduleInfo: %d EA", nSelCnt);
+
+	return nResult;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::LoadVmsEventOccrInf(AnsiString AVmsId)
+{
+	int         nResult;
+	AnsiString  sQry;
+	int         nSelCnt = 0;
+	TADOQuery  *pADO = NULL;
+
+	nResult = VERR_OTHER;
+
+    LINFO("LoadVmsEventOccrInf: Start");
+
+    sQry = "SELECT V.VMS_CTLR_NMBR, V.LINK_ID, V.IFSC_ID, V.VMS_IFSC_ID,   \r\n"
+           "       V.VMS_IFSC_NM, V.DSPL_STRT_NODE_NM, V.DSPL_END_NODE_NM, \r\n"
+           "       V.DETR_ID, V.DSPL_PRRT, I.INCD_OCRR_ID, I.STRT_LCTN_NM, \r\n"
+           "       V.ROAD_NM, V.SPOT_NM,                                   \r\n"
+           "       I.END_LCTN_NM, I.OCRR_LCTN_NM,                          \r\n"
+           "       (SELECT CMMN_CD_KOR_NM                                  \r\n"
+           "         FROM TB_CMMN_CD                                       \r\n"
+           "        WHERE CMMN_CD = I.VMS_INCD_TYPE_CD                     \r\n"
+           "          AND CMMN_CLSF_CD = 'VIT') AS VMS_INCD_TYPE_NM,       \r\n"
+           "       I.VMS_INCD_TYPE_CD,                                     \r\n"
+           "       CASE WHEN I.VMS_INCD_TYPE_CD = 'VIT1' THEN              \r\n"
+           "       (SELECT CMMN_CD_KOR_NM                                  \r\n"
+           "          FROM TB_CMMN_CD                                      \r\n"
+           "         WHERE CMMN_CD      = I.VMS_INCD_DETL_TYPE_CD          \r\n"
+           "           AND CMMN_CLSF_CD = 'IDT')                           \r\n"
+           "       ELSE                                                    \r\n"
+           "       (SELECT CMMN_CD_KOR_NM                                  \r\n"
+           "          FROM TB_CMMN_CD                                      \r\n"
+           "         WHERE CMMN_CD      = I.VMS_INCD_DETL_TYPE_CD          \r\n"
+           "           AND CMMN_CLSF_CD = 'EDT')                           \r\n"
+           "       END AS VMS_INCD_DETL_NM,                                \r\n"
+           "       I.VMS_INCD_DETL_TYPE_CD,                                \r\n"
+           "       (SELECT CMMN_CD_KOR_NM                                  \r\n"
+           "          FROM TB_CMMN_CD                                      \r\n"
+           "         WHERE CMMN_CD      = I.CMTR_GRAD_CD                   \r\n"
+           "           AND CMMN_CLSF_CD = 'LTC') AS CMTR_GRAD_NM,          \r\n"
+           "       I.CMTR_GRAD_CD,                                         \r\n"
+           "       I.INCD_CLSR_LANE,                                       \r\n"
+           "       I.INCD_STRT_DT,                                         \r\n"
+           "       I.INCD_END_PRAR_DT                                      \r\n"
+           "  FROM (SELECT D.VMS_CTLR_NMBR, A.LINK_ID,                     \r\n"
+           "               A.IFSC_ID, B.VMS_IFSC_ID,                       \r\n"
+           "               C.VMS_IFSC_NM,                                  \r\n"
+           "               C.DSPL_STRT_NODE_NM,                            \r\n"
+           "               C.DSPL_END_NODE_NM,                             \r\n"
+           "               NVL(C.DETR_ID, 0) AS DETR_ID,                   \r\n"
+           "               C.ROAD_NM, C.SPOT_NM,                           \r\n"
+           "               D.DSPL_PRRT                                     \r\n"
+           "          FROM TB_IFSC_LINK_RLTN A,                            \r\n"
+           "               TB_VMS_LINK_IFSC  B,                            \r\n"
+           "               TB_VMS_IFSC       C,                            \r\n"
+           "               TB_VMS_IFSC_RLTN  D                             \r\n"
+           "         WHERE A.IFSC_ID     = B.IFSC_ID                       \r\n"
+           "           AND B.VMS_IFSC_ID = C.VMS_IFSC_ID                   \r\n"
+           "           AND C.VMS_IFSC_ID = D.VMS_IFSC_ID ) V,              \r\n"
+           "       (SELECT *                                               \r\n"
+           "          FROM TB_INCD_OCRR_VMS                                \r\n"
+           "         WHERE INCD_PRGR_STEP_CD = 'ISS2'                      \r\n"
+           "           AND VMS_DSPL_YN       = 'Y'                         \r\n"
+           "           AND VMS_INCD_TYPE_CD IN ('VIT1', 'VIT2') ) I        \r\n"
+           " WHERE V.LINK_ID = I.LINK_ID                                   \r\n"
+           " ORDER BY V.VMS_CTLR_NMBR                                      \r\n";
+
+	try
+	{
+		pADO = new TADOQuery(NULL);
+        pADO->Connection = GetDbConnection();
+
+		try
+		{
+            SQLText(pADO, sQry, false);
+			SQLOpen(pADO);
+
+            int nIdx;
+			for( ; !pADO->Eof; pADO->Next())
+			{
+                AnsiString sVmsNmbr = pADO->FieldByName("VMS_CTLR_NMBR")->AsString;
+
+                TVmsCtlr *pObj = VmsManager->FLists.Find(sVmsNmbr);
+                if (!pObj) continue;
+
+                if (!pObj->FProvide) continue;
+
+                AnsiString VMS_INCD_TYPE_CD = pADO->FieldByName("VMS_INCD_TYPE_CD")->AsString;
+                AnsiString INCD_OCRR_ID     = pADO->FieldByName("INCD_OCRR_ID")->AsString;
+
+                VMS_EVENT_INFO *pEvt;
+                if (VMS_INCD_TYPE_CD ==  "VIT1")
+                {
+                    if (pObj->INCIDENT->Count >= VMS_MAX_EVENT)
+                    {
+                        LERROR("VMS Incident Over: %s, %d", pObj->VmsNo.c_str(), pObj->INCIDENT->Count);
+                        continue;
+                    }
+                    bool bDup = false;
+                    for (int ii = 0; ii < pObj->INCIDENT->Count; ii++)
+                    {
+                        if (INCD_OCRR_ID == pObj->INCIDENT->Unit[ii].INCD_OCRR_ID)
+                        {
+                            bDup = true;
+                            break;
+                        }
+                    }
+                    if (bDup)
+                    {
+                        LERROR("VMS Incident dup: %s, %s", pObj->VmsNo.c_str(), INCD_OCRR_ID.c_str());
+                        continue;
+                    }
+                    nIdx = pObj->INCIDENT->Count;
+                    pEvt = pObj->INCIDENT;
+                }
+                else
+                {
+                    if (pObj->EVENT->Count >= VMS_MAX_EVENT)
+                    {
+                        LERROR("VMS Event Over: %s, %d", pObj->VmsNo.c_str(), pObj->EVENT->Count);
+                        continue;
+                    }
+                    bool bDup = false;
+                    for (int ii = 0; ii < pObj->EVENT->Count; ii++)
+                    {
+                        if (INCD_OCRR_ID == pObj->EVENT->Unit[ii].INCD_OCRR_ID)
+                        {
+                            bDup = true;
+                            break;
+                        }
+                    }
+                    if (bDup)
+                    {
+                        LERROR("VMS Event dup: %s, %s", pObj->VmsNo.c_str(), INCD_OCRR_ID.c_str());
+                        continue;
+                    }
+                    nIdx = pObj->EVENT->Count;
+                    pEvt = pObj->EVENT;
+                }
+
+                pEvt->Unit[nIdx].LINK_ID                = pADO->FieldByName("LINK_ID")->AsString;
+                pEvt->Unit[nIdx].IFSC_ID                = pADO->FieldByName("IFSC_ID")->AsString;
+                pEvt->Unit[nIdx].VMS_IFSC_ID            = pADO->FieldByName("VMS_IFSC_ID")->AsString;
+                pEvt->Unit[nIdx].VMS_IFSC_NM            = pADO->FieldByName("VMS_IFSC_NM")->AsString;
+                pEvt->Unit[nIdx].DSPL_STRT_NODE_NM      = pADO->FieldByName("DSPL_STRT_NODE_NM")->AsString;
+                pEvt->Unit[nIdx].DSPL_END_NODE_NM       = pADO->FieldByName("DSPL_END_NODE_NM")->AsString;
+                pEvt->Unit[nIdx].DETR_ID                = pADO->FieldByName("DETR_ID")->AsString.Trim();
+                pEvt->Unit[nIdx].DSPL_PRRT              = pADO->FieldByName("DSPL_PRRT")->AsString;
+                pEvt->Unit[nIdx].INCD_OCRR_ID           = INCD_OCRR_ID;
+                pEvt->Unit[nIdx].STRT_LCTN_NM           = pADO->FieldByName("STRT_LCTN_NM")->AsString;
+                pEvt->Unit[nIdx].END_LCTN_NM            = pADO->FieldByName("END_LCTN_NM")->AsString;
+
+                if (pEvt->Unit[nIdx].STRT_LCTN_NM == "")
+                {
+                    pEvt->Unit[nIdx].STRT_LCTN_NM = pEvt->Unit[nIdx].DSPL_STRT_NODE_NM;
+                }
+                if (pEvt->Unit[nIdx].END_LCTN_NM == "")
+                {
+                    pEvt->Unit[nIdx].END_LCTN_NM = pEvt->Unit[nIdx].DSPL_END_NODE_NM;
+                }
+
+                pEvt->Unit[nIdx].OCRR_LCTN_NM           = pADO->FieldByName("OCRR_LCTN_NM")->AsString;
+                pEvt->Unit[nIdx].VMS_INCD_TYPE_NM       = pADO->FieldByName("VMS_INCD_TYPE_NM")->AsString;
+                pEvt->Unit[nIdx].VMS_INCD_TYPE_CD       = pADO->FieldByName("VMS_INCD_TYPE_CD")->AsString;
+                pEvt->Unit[nIdx].VMS_INCD_DETL_NM       = pADO->FieldByName("VMS_INCD_DETL_NM")->AsString;
+                pEvt->Unit[nIdx].VMS_INCD_DETL_TYPE_CD  = pADO->FieldByName("VMS_INCD_DETL_TYPE_CD")->AsString;
+                pEvt->Unit[nIdx].CMTR_GRAD_NM           = pADO->FieldByName("CMTR_GRAD_NM")->AsString;
+                pEvt->Unit[nIdx].CMTR_GRAD_CD           = pADO->FieldByName("CMTR_GRAD_CD")->AsString;
+                pEvt->Unit[nIdx].INCD_CLSR_LANE         = pADO->FieldByName("INCD_CLSR_LANE")->AsString;
+                pEvt->Unit[nIdx].INCD_STRT_DT           = pADO->FieldByName("INCD_STRT_DT")->AsString;
+                pEvt->Unit[nIdx].INCD_END_PRAR_DT       = pADO->FieldByName("INCD_END_PRAR_DT")->AsString;
+                pEvt->Unit[nIdx].ROAD_NM                = pADO->FieldByName("ROAD_NM")->AsString;
+                pEvt->Unit[nIdx].SPOT_NM                = pADO->FieldByName("SPOT_NM")->AsString;
+
+                pEvt->Count++;
+
+                nSelCnt++;
+			}
+
+			nResult = VERR_NONE;
+		}
+		catch(EDatabaseError &E)
+		{
+            ErrorString = String(E.ClassName()) + E.Message;
+		}
+		catch(Exception &e)
+		{
+            ErrorString = String(e.ClassName()) + e.Message;
+		}
+	}
+	__finally
+	{
+		SQLFree(pADO);
+	}
+
+    if (0)
+    {
+        VmsIterator it;
+        for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
+        {
+            TVmsCtlr *pObj = (TVmsCtlr*)it->second;
+
+            if (pObj->Server.UseFlag != bit_enable) continue;
+            LDEBUG("VMS Event(I/E): %s, %d/%d EA", pObj->VmsNo.c_str(), pObj->INCIDENT->Count, pObj->EVENT->Count);
+        }
+    }
+
+    LINFO("LoadVmsEventOccrInf: %d EA", nSelCnt);
+
+	return nResult;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::MakeVmsScenarioForm(AnsiString AVmsId)
+{
+	int nResult = VERR_NONE;
+
+    LINFO("MakeVmsScenarioForm: Start");
+
+	ClearVmsProvideMode(AVmsId);
+
+    //TODO
+    //if (LOAD_DB)
+    {
+        LoadVmsForm();
+        GetVmsIfscInfo();
+    }
+
+    //돌발/공사/행사가 발생한 정보를 VMS에 맵핑한다.
+    nResult = LoadVmsEventOccrInf(AVmsId);
+    if (nResult != VERR_NONE)
+    {
+        LERROR("LoadVmsEventOccrInf: error: %d", nResult);
+    }
+
+    // VMS구간 소통정보를 모두 읽어오자..(데이터가 많을 경우 해당되는 정보만 읽어오도록 수정
+    nResult = LoadIfscTrafficInfo();
+    if (nResult != VERR_NONE)
+    {
+        LERROR("LoadIfscTrafficInfo: error: %d", nResult);
+    }
+
+    //VMS의 스케줄정보를 조회한다.
+    nResult = LoadVmsScheduleInfo(AVmsId);
+    if (nResult != VERR_NONE)
+    {
+        LERROR("LoadVmsScheduleInfo: error: %d", nResult);
+    }
+
+    LINFO("MakeVmsScenarioForm: End");
+    return nResult;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::SaveVmsDownloadForm()
+{
+	int nResult = VERR_NONE;
+    int nSaveVmsCnt, nSaveFormCnt;
+
+    LINFO("SaveVmsDownloadForm: Start");
+
+    nSaveVmsCnt = 0;
+    nSaveFormCnt= 0;
+
+    //생성한 폼을 데이터베이스에 저장한다.
+    VmsIterator it;
+    for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
+    {
+        TVmsCtlr *pObj = (TVmsCtlr*)it->second;
+
+        if (pObj->Server.UseFlag != bit_enable) continue;
+        if (!pObj->FProvide) continue;
+
+        nSaveFormCnt += SaveVmsDatabaseForm(pObj);
+        nSaveVmsCnt++;
+    }
+
+    //생성한 폼을 제어기에 전송할 수 있도록 플래그를 설정한다.
+    for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
+    {
+        TVmsCtlr *pObj = (TVmsCtlr*)it->second;
+
+        if (pObj->Server.UseFlag != bit_enable) continue;
+        if (!pObj->FProvide) continue;
+
+        if (pObj->pForms->Count() > 0)
+        {
+            pObj->CTLMODE->Enable   = object_enable;
+            pObj->CTLMODE->SaveFlag = false;
+            pObj->CTLMODE->Result   = false;
+        }
+    }
+
+    INT_VMS_FORM_SAVE_REQ Req;
+    memset((char*)&Req, 0x00, sizeof(Req));
+    memcpy(Req.Date, FFormDsplDt.c_str(), INT_VMS_MAX_DATETIME);
+    VComm_VmsFormSaveNotify(&Req);
+
+    LINFO("SaveVmsDownloadForm: End. (VMS: %d EA, Forms %d EA)", nSaveVmsCnt, nSaveFormCnt);
+    LINFO("*** VMS Msg create end.");
+	return nResult;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::SetVmsMode()
+{
+	int         nResult;
+	int         nSelCnt = 0;
+
+	nResult = VERR_OTHER;
+
+    LINFO("SetVmsMode: Start");
+
+    try
+    {
+        VmsIterator it;
+        for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
+        {
+            TVmsCtlr *pObj = (TVmsCtlr*)it->second;
+
+            if (pObj->Server.UseFlag != bit_enable) continue;
+
+            if (!pObj->FProvide) continue;
+
+            if (!pObj->FModeChange) continue;   //모드가 변경이 안되어 있으면 업데이트할 필요 없음
+
+            AnsiString VMS_CTLR_NMBR = pObj->VmsNo;
+            AnsiString OPER_MODE     = "A";
+
+            if (pObj->CTLMODE->Control == 'F')
+                OPER_MODE = "F";
+            else
+            if (pObj->CTLMODE->Control == 'B')
+                OPER_MODE = "B";
+
+            pObj->RSTATE.OprMode = pObj->CTLMODE->Control;
+
+            nSelCnt++;
+        }
+
+        nResult = VERR_NONE;
+    }
+    catch(Exception &e)
+    {
+        ErrorString = String(e.ClassName()) + e.Message;
+    }
+
+    LINFO("SetVmsMode: %d", nSelCnt);
+
+	return nResult;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::LoadVmsOperatorMode()
+{
+	int         nResult;
+	AnsiString  sQry;
+	int         nSelCnt = 0;
+	TADOQuery  *pADO = NULL;
+
+	nResult = VERR_OTHER;
+
+    LINFO("LoadVmsOperatorMode: Start");
+
+    sQry = "SELECT A.VMS_CTLR_NMBR, A.OPER_MODE,                       \r\n"
+           "       NVL(A.VMS_MAX_PHSE_NUM,  16) AS VMS_MAX_PHSE_NUM,   \r\n"
+           "       NVL(A.VMS_PHSE_CHNG_CYCL, 5) AS VMS_PHSE_CHNG_CYCL  \r\n"
+           "  FROM TB_VMS_CTLR A                                       \r\n"
+           " WHERE A.DEL_YN = 'N'                                      \r\n";
+
+	try
+	{
+		pADO = new TADOQuery(NULL);
+        pADO->Connection = GetDbConnection();
+
+		try
+		{
+            SQLText(pADO, sQry, false);
+			SQLOpen(pADO);
+
+			for( ; !pADO->Eof; pADO->Next())
+			{
+                AnsiString sVmsNmbr = pADO->FieldByName("VMS_CTLR_NMBR")->AsString;
+
+                TVmsCtlr *pObj = VmsManager->FLists.Find(sVmsNmbr);
+                if (!pObj) continue;
+
+                pObj->OPER_MODE = pADO->FieldByName("OPER_MODE")->AsString;
+                int nMaxFormCnt = pADO->FieldByName("VMS_MAX_PHSE_NUM")->AsInteger;
+
+                if (pObj->OPER_MODE == "A")
+                    pObj->DSTATE.OprMode = 'A';
+                else
+                if (pObj->OPER_MODE == "B")
+                    pObj->DSTATE.OprMode = 'B';
+                else
+                    pObj->DSTATE.OprMode = 'F';
+
+                if (pObj->CTLMODE->Control == pObj->DSTATE.OprMode)
+                    pObj->FModeChange = false;
+                else
+                    pObj->FModeChange = true;
+
+                pObj->VMS_PHSE_CHNG_CYCL = pADO->FieldByName("VMS_PHSE_CHNG_CYCL")->AsInteger;
+
+                pObj->CTLMODE->Control = pObj->DSTATE.OprMode;
+                pObj->RSTATE.OprMode   = pObj->CTLMODE->Control;
+
+                pObj->VMS_MAX_PHSE_NUM = nMaxFormCnt;
+                if (pObj->VMS_MAX_PHSE_NUM > INT_MAX_VMS_FORM)
+                    pObj->VMS_MAX_PHSE_NUM = INT_MAX_VMS_FORM;
+
+                pObj->CTLMODE->MaxDisplayForm = pObj->VMS_MAX_PHSE_NUM;
+#if 0
+                if (pObj->CTLMODE->MaxDisplayForm > INT_MAX_VMS_FORM)
+                    pObj->CTLMODE->MaxDisplayForm = INT_MAX_VMS_FORM;
+#endif
+
+                nSelCnt++;
+			}
+
+			nResult = VERR_NONE;
+		}
+		catch(EDatabaseError &E)
+		{
+            ErrorString = String(E.ClassName()) + E.Message;
+		}
+		catch(Exception &e)
+		{
+            ErrorString = String(e.ClassName()) + e.Message;
+		}
+	}
+	__finally
+	{
+		SQLFree(pADO);
+	}
+
+    LINFO("LoadVmsOperatorMode: %d EA", nSelCnt);
+
+	return nResult;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::ProvideProc(void *AData)
+{
+	int             nResult;
+	PROVIDE_STRUCT *pPro;
+
+    LINFO("********ProvideProc: Start");
+
+	nResult = VERR_NONE;
+
+	pPro = (PROVIDE_STRUCT*)AData;
+    if (!pPro)
+    {
+        return VERR_OTHER;
+    }
+
+    try
+    {
+        switch(pPro->Type)
+        {
+        case provide_event: //자동스케줄타임에 의한 메시지 생성
+            {
+                LINFO("--From Traffic Timer");
+
+                if ((nResult = LoadVmsOperatorMode()) != VERR_NONE)
+                {
+                    break;
+                }
+
+                //모든 VMS에 메시지다운로드 플래그 활성화 시킴
+                VmsManager->InitProvide(true);
+
+                if ((nResult = MakeVmsScenarioForm(ALL_VMS_ID)) != VERR_NONE)
+                {
+                }
+            }
+            break;
+        case provide_mode:  //개별 VMS 제어(모드변경)
+            {
+                LINFO("-From OprMode Change");
+
+                AnsiString sVmsNmbr;
+
+                //모든 VMS에 메시지다운로드 플래그 비활성화 시킴
+                VmsManager->InitProvide(false);
+
+                for(int ii = 0; ii < pPro->Count && ii < INT_MAX_VMS_MODE; ii++)
+                {
+                    sVmsNmbr.sprintf("%.*s", INT_VMS_MAX_ID, pPro->Unit[ii].VmsId);
+
+                    TVmsCtlr *pObj = VmsManager->FLists.Find(sVmsNmbr);
+                    if (!pObj) continue;
+                    if (pObj->Server.UseFlag != bit_enable) continue;
+
+                    if (pObj->CTLMODE->Control == pPro->Unit[ii].Mode)
+                        pObj->FModeChange = false;
+                    else
+                        pObj->FModeChange = true;
+
+                    pObj->CTLMODE->Control = pPro->Unit[ii].Mode;
+                    pObj->DSTATE.OprMode = pObj->CTLMODE->Control;
+                    pObj->RSTATE.OprMode = pObj->CTLMODE->Control;
+                    if      (pObj->CTLMODE->Control == 'A') pObj->OPER_MODE = "A";
+                    else if (pObj->CTLMODE->Control == 'B') pObj->OPER_MODE = "B";
+                    else                                    pObj->OPER_MODE = "F";
+                    pObj->FProvide = true;
+                }
+
+                if ((nResult = MakeVmsScenarioForm(ALL_VMS_ID)) != VERR_NONE)
+                {
+                }
+            }
+            break;
+        }
+    }
+    __finally
+    {
+        delete[] (char *)AData;
+    }
+
+    LINFO("********ProvideProc: End");
+
+	return nResult;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::SaveVmsDownLoad(TVmsCtlr *AObj)
+{
+	int         nResult;
+	AnsiString  sQry;
+	TADOQuery  *pADO = NULL;
+
+	nResult = VERR_OTHER;
+
+    LINFO("SaveVmsDownLoad: Start");
+
+    if (!AObj) return VERR_MEMORY_ALLOC;
+
+    sQry = "UPDATE TB_VMS_DOWNLOAD        \r\n"
+           "   SET SENDENDDATE   = :p05,  \r\n"
+           "       SENDSTEP	     = :p06,  \r\n"
+           "       SENDRESULT    = :p07   \r\n"
+           " WHERE RGST_DT       = :p01   \r\n"
+           "   AND VMS_CTLR_NMBR = :p02   \r\n"
+           "   AND FILETYPE      = :p03   \r\n"
+           "   AND FILEID        = :p04   \r\n";
+	try
+	{
+        pADO = new TADOQuery(NULL);
+        pADO->Connection = GetDbConnection();
+
+		try
+		{
+            pADO->Connection->BeginTrans();
+
+            SQLText(pADO, sQry, false);
+
+            for (int ii = 0; ii < AObj->DOWNLOAD->Count && ii < VMS_MAX_DOWNLOAD; ii++)
+            {
+                SQLBind(pADO, "p01", AObj->DOWNLOAD->Unit[ii].RegDate);
+                SQLBind(pADO, "p02", AObj->VmsNo);
+                SQLBind(pADO, "p03", AObj->DOWNLOAD->Unit[ii].FileType);
+                SQLBind(pADO, "p04", AObj->DOWNLOAD->Unit[ii].FileId);
+                SQLBind(pADO, "p05", AObj->DOWNLOAD->Unit[ii].SendEndDate);
+                SQLBind(pADO, "p06", AObj->DOWNLOAD->Unit[ii].SendStep);
+                SQLBind(pADO, "p07", AObj->DOWNLOAD->Unit[ii].SendResult);
+
+                SQLExec(pADO);
+            }
+            pADO->Connection->CommitTrans();
+            nResult = VERR_NONE;
+		}
+		catch(EDatabaseError &E)
+		{
+            pADO->Connection->RollbackTrans();
+            ErrorString = String(E.ClassName()) + E.Message;
+            DBERRORLOG("SaveVmsDownLoad", String(E.ClassName()), E.Message, sQry);
+            nResult = VERR_OTHER;
+		}
+		catch(Exception &e)
+		{
+            pADO->Connection->RollbackTrans();
+            ErrorString = String(e.ClassName()) + e.Message;
+            DBERRORLOG("SaveVmsDownLoad", String(e.ClassName()), e.Message, sQry);
+		}
+	}
+	__finally
+	{
+        if (pADO)
+        {
+            SQLClose(pADO);
+            SAFE_DELETE(pADO);
+        }
+	}
+    LDEBUG("SaveVmsDownLoad: End, %s", AObj->VmsNo.c_str());
+    return nResult;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::UpdateVmsProvideResult(TVmsCtlr *AObj)
+{
+	int         nResult;
+	AnsiString  sQry;
+	TADOQuery  *pSADO = NULL;
+    int         nFormCnt = 0;
+
+	nResult = VERR_OTHER;
+
+    LDEBUG("UpdateVmsProvideResult: Start");
+
+    if (!AObj) return VERR_MEMORY_ALLOC;
+
+//LINFO("UpdateVmsProvideResult[U]: %s", AObj->VmsId.c_str());
+
+    sQry = "UPDATE TB_VMS_DSPL_PRST      \r\n"
+           "   SET DSPL_DT       = :p03, \r\n"
+           "       DNLD_YN       = :p04  \r\n"
+           " WHERE VMS_CTLR_NMBR = :p01  \r\n"
+           "   AND PHASE        <= :p02  \r\n";
+
+    String VMS_CTLR_NMBR;
+    String PHASE;
+    String DSPL_DT;
+    String DNLD_YN;
+
+	try
+	{
+        nFormCnt = AObj->pForms->Count();
+
+        if (nFormCnt == 0) return VERR_NONE;
+
+        pSADO = new TADOQuery(NULL);
+        pSADO->Connection = GetDbConnection();
+
+        VMS_CTLR_NMBR = AObj->VmsNo;
+        PHASE         = String(nFormCnt);
+        DSPL_DT       = AObj->CTLMODE->SvcDate;
+        DNLD_YN       = AObj->CTLMODE->Result ? "Y" : "N";
+
+		try
+		{
+            pSADO->Connection->BeginTrans();
+
+            SQLText(pSADO, sQry, false);
+
+            SQLBind(pSADO, "p01", VMS_CTLR_NMBR);
+            SQLBind(pSADO, "p02", PHASE);
+            SQLBind(pSADO, "p03", DSPL_DT);
+            SQLBind(pSADO, "p04", DNLD_YN);
+            SQLExec(pSADO);
+
+            //pSADO->Connection->CommitTrans();
+
+            nResult = VERR_NONE;
+		}
+		catch(EDatabaseError &E)
+		{
+            pSADO->Connection->RollbackTrans();
+            ErrorString = String(E.ClassName()) + E.Message;
+            DBERRORLOG("UpdateVmsProvideResult", String(E.ClassName()), E.Message, sQry);
+            nResult = VERR_OTHER;
+		}
+		catch(Exception &e)
+		{
+            pSADO->Connection->RollbackTrans();
+            ErrorString = String(e.ClassName()) + e.Message;
+            DBERRORLOG("UpdateVmsProvideResult", String(e.ClassName()), e.Message, sQry);
+		}
+
+//LINFO("UpdateVmsProvideResult[I]: %s", AObj->VmsId.c_str());
+        // 이력 저장--제공시각이 동일한게 이력으로 저장될수 있기때문에 트랜잭션을 다시시작한다.
+        // 이전 VMS인 경우 임...
+    sQry = "INSERT INTO TB_VMS_DSPL_HS                           \r\n"
+           "           (VMS_CTLR_NMBR, DSPL_PHASE_NUM, DSPL_DT,  \r\n"
+           "            VMS_DSPL_MSG_DATA, VMS_DSPL_MSG_TXT,     \r\n"
+           "            TRFC_SITU_TYPE_CD, VMS_MSG_DSPL_DRCT_CD, \r\n"
+           "            VMS_MSG_DSPL_MTHD_CD, DSPL_HH,           \r\n"
+           "            VMS_FORM_ID, DNLD_YN)                    \r\n"
+           "SELECT VMS_CTLR_NMBR, PHASE, DSPL_DT,                \r\n"
+           "       VMS_DSPL_MSG_DATA, VMS_DSPL_MSG_TXT,          \r\n"
+           "       TRFC_SITU_TYPE_CD, VMS_MSG_DSPL_DRCT_CD,      \r\n"
+           "       VMS_MSG_DSPL_MTHD_CD, DSPL_HH,                \r\n"
+           "       VMS_FORM_ID, DNLD_YN                          \r\n"
+           "  FROM TB_VMS_DSPL_PRST                              \r\n"
+           " WHERE VMS_CTLR_NMBR = :p01                          \r\n"
+           "   AND PHASE        <= :p02                          \r\n";
+
+		try
+		{
+            //pSADO->Connection->BeginTrans();
+
+            SQLText(pSADO, sQry, false);
+
+            SQLBind(pSADO, "p01", VMS_CTLR_NMBR);
+            SQLBind(pSADO, "p02", PHASE);
+            SQLExec(pSADO);
+
+            pSADO->Connection->CommitTrans();
+
+            nResult = VERR_NONE;
+		}
+		catch(EDatabaseError &E)
+		{
+            pSADO->Connection->RollbackTrans();
+            ErrorString = String(E.ClassName()) + E.Message;
+            //DBERRORLOG("UpdateVmsProvideResult-Hist", String(E.ClassName()), E.Message, sQry);
+            nResult = VERR_OTHER;
+		}
+		catch(Exception &e)
+		{
+            pSADO->Connection->RollbackTrans();
+            ErrorString = String(e.ClassName()) + e.Message;
+            //DBERRORLOG("UpdateVmsProvideResult-Hist", String(e.ClassName()), e.Message, sQry);
+		}
+	}
+	__finally
+	{
+        if (pSADO)
+        {
+            SQLClose(pSADO);
+            SAFE_DELETE(pSADO);
+        }
+	}
+LDEBUG("UpdateVmsProvideResult: End, %s, %d EA [%s]", AObj->VmsNo.c_str(), nFormCnt, DNLD_YN.c_str());
+    return nResult;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::SaveVmsDatabaseForm(TVmsCtlr *AObj)
+{
+	int         nResult;
+	AnsiString  sQry;
+	AnsiString  uQry;
+//	AnsiString  iQry;
+	TADOQuery  *pSADO = NULL;
+	TADOQuery  *pUADO = NULL;
+//	TADOQuery  *pIADO = NULL;
+    int         nSelCnt = 0;
+
+
+	nResult = VERR_OTHER;
+
+//LINFO("[%s]SaveVmsDatabaseForm: Start", AObj->VmsNo.c_str());
+
+    if (!AObj) return VERR_MEMORY_ALLOC;
+
+//LINFO("SaveVmsDatabaseForm[M]: %s", AObj->VmsId.c_str());
+    int nFormCnt = AObj->pForms->Count();
+    if (nFormCnt == 0) return VERR_NONE;
+
+    sQry = "MERGE INTO TB_VMS_DSPL_PRST L                                  \r\n"
+           "USING (SELECT :p01 AS VMS_CTLR_NMBR,                           \r\n"
+           "              :p02 AS PHASE,                                   \r\n"
+           "              :p03 AS DSPL_DT,                                 \r\n"
+           "              :p04 AS VMS_DSPL_MSG_DATA,                       \r\n"
+           "              :p05 AS VMS_DSPL_MSG_TXT,                        \r\n"
+           "              :p06 AS TRFC_SITU_TYPE_CD,                       \r\n"
+           "              :p07 AS VMS_MSG_DSPL_DRCT_CD,                    \r\n"
+           "              :p08 AS VMS_MSG_DSPL_MTHD_CD,                    \r\n"
+           "              :p09 AS DSPL_HH,                                 \r\n"
+           "              :p10 AS VMS_FORM_ID,                             \r\n"
+           "              :p11 AS DNLD_YN                                  \r\n"
+           "         FROM DUAL) M                                          \r\n"
+           " ON (L.VMS_CTLR_NMBR = M.VMS_CTLR_NMBR AND L.PHASE = M.PHASE)  \r\n"
+           "WHEN MATCHED THEN                                              \r\n"
+           "UPDATE SET L.DSPL_DT              = M.DSPL_DT,                 \r\n"
+           "           L.VMS_DSPL_MSG_DATA    = M.VMS_DSPL_MSG_DATA,       \r\n"
+           "           L.VMS_DSPL_MSG_TXT     = M.VMS_DSPL_MSG_TXT,        \r\n"
+           "           L.TRFC_SITU_TYPE_CD    = M.TRFC_SITU_TYPE_CD,       \r\n"
+           "           L.VMS_MSG_DSPL_DRCT_CD = M.VMS_MSG_DSPL_DRCT_CD,    \r\n"
+           "           L.VMS_MSG_DSPL_MTHD_CD = M.VMS_MSG_DSPL_MTHD_CD,    \r\n"
+           "           L.DSPL_HH              = M.DSPL_HH,                 \r\n"
+           "           L.VMS_FORM_ID          = M.VMS_FORM_ID,             \r\n"
+           "           L.DNLD_YN              = M.DNLD_YN                  \r\n"
+           "WHEN NOT MATCHED THEN                                          \r\n"
+           "INSERT (VMS_CTLR_NMBR, PHASE, DSPL_DT,                         \r\n"
+           "        VMS_DSPL_MSG_DATA, VMS_DSPL_MSG_TXT,                   \r\n"
+           "        TRFC_SITU_TYPE_CD, VMS_MSG_DSPL_DRCT_CD,               \r\n"
+           "        VMS_MSG_DSPL_MTHD_CD, DSPL_HH,                         \r\n"
+           "        VMS_FORM_ID, DNLD_YN)                                  \r\n"
+           "VALUES (M.VMS_CTLR_NMBR, M.PHASE, M.DSPL_DT,                   \r\n"
+           "        M.VMS_DSPL_MSG_DATA, M.VMS_DSPL_MSG_TXT,               \r\n"
+           "        M.TRFC_SITU_TYPE_CD, M.VMS_MSG_DSPL_DRCT_CD,           \r\n"
+           "        M.VMS_MSG_DSPL_MTHD_CD, M.DSPL_HH,                     \r\n"
+           "        M.VMS_FORM_ID, M.DNLD_YN)                              \r\n";
+
+    uQry = "UPDATE TB_VMS_DSPL_PRST         \r\n"
+           "   SET VMS_DSPL_MSG_IMAG = :p03 \r\n"
+           " WHERE VMS_CTLR_NMBR = :p01     \r\n"
+           "   AND PHASE         = :p02     \r\n";
+
+#if 0
+    iQry = "INSERT INTO TB_VMS_DSPL_HS                         \r\n"
+           "       (VMS_CTLR_NMBR, DSPL_PHASE_NUM, DSPL_DT,    \r\n"
+           "        VMS_DSPL_MSG_DATA, VMS_DSPL_MSG_TXT,       \r\n"
+           "        TRFC_SITU_TYPE_CD, VMS_MSG_DSPL_DRCT_CD,   \r\n"
+           "        VMS_MSG_DSPL_MTHD_CD, DSPL_HH,             \r\n"
+           "        VMS_FORM_ID, DNLD_YN)                      \r\n"
+           "VALUES (:p01, :p02, :p03,                          \r\n"
+           "        :p04, :p05,                                \r\n"
+           "        :p06, :p07,                                \r\n"
+           "        :p08, :p09,                                \r\n"
+           "        :p10, :p11)                                \r\n";
+#endif
+
+	try
+	{
+        pSADO = new TADOQuery(NULL);
+        pSADO->Connection = GetDbConnection();
+        pUADO = new TADOQuery(NULL);
+        pUADO->Connection = GetDbConnection();
+#if 0
+        pIADO = new TADOQuery(NULL);
+        pIADO->Connection = GetDbConnection();
+#endif
+
+		try
+		{
+            AObj->pForms->Lock();
+
+            pSADO->Connection->BeginTrans();
+
+            SQLText(pSADO, sQry, false);
+            SQLText(pUADO, uQry, false);
+//            SQLText(pIADO, iQry, false);
+
+    //LDEBUG("SaveVmsProvide: %s, Forms: %d EA", AObj->VmsNo.c_str(), nFormCnt);
+            for (int ii = 0; ii < nFormCnt; ii++)
+            {
+				TVmsForm *pForm = AObj->pForms->GetItem(ii);
+
+    //LDEBUG("SaveVmsProvide: %s, %d", AObj->VmsNo.c_str(), ii+1);
+                String VMS_CTLR_NMBR        = AObj->VmsNo;
+                String PHASE                = String(ii+1);
+                String DSPL_DT              = AObj->CTLMODE->SvcDate;
+                String VMS_DSPL_MSG_DATA    = "";
+                String VMS_DSPL_MSG_TXT     = "";
+                String TRFC_SITU_TYPE_CD    = String(pForm->FormKind);
+                String VMS_MSG_DSPL_DRCT_CD = pForm->DisplayDir;
+                String VMS_MSG_DSPL_MTHD_CD = pForm->DisplayMode;
+                String DSPL_HH              = String(pForm->DisplayTime);
+                String VMS_FORM_ID          = pForm->FormId;
+                String DNLD_YN              = pForm->SvcRes ? "Y" : "N";
+
+                AnsiString sTmp  = "";
+                AnsiString sCont = "";
+
+                int nObjCnt, nObjType;
+                try
+                {
+                    //폼종류/표출시간/배경색상
+                    sCont.printf("%02X%02X%02X|", pForm->FormKind, pForm->DisplayTime, pForm->BkColor);
+                    VMS_DSPL_MSG_DATA += sCont;
+
+                    nObjCnt = pForm->Count();
+    //LDEBUG("SaveVmsProvide: %s, %d, object: %d EA", AObj->VmsNo.c_str(), ii+1, nObjCnt);
+
+                    for (int jj = 0; jj < nObjCnt; jj++)
+                    {
+                        TVmsFormObj *pFormObj = pForm->GetItem(jj);
+                        switch(pFormObj->ObjectType)
+                        {
+                        case 1: //심볼
+                        case 2: //이미지
+                            nObjType = vms_obj_bitmap;
+                            sTmp.printf("%02X%04X%04X%02X%s|",
+                                pFormObj->IsBlinking,
+                                pFormObj->PosX,
+                                pFormObj->PosY,
+                                pFormObj->BkColor,
+                                pFormObj->ImageId.SubString(1,4).c_str());
+
+                            sCont.printf("%02X%02X%s", nObjType, sTmp.Length(), sTmp.c_str());
+                            VMS_DSPL_MSG_DATA += sCont;
+                            break;
+                        case 17: //소통정보이미지1
+                        case 27: //소통정보이미지2
+                        case 37: //소통정보이미지3
+                        case 47: //소통정보이미지4
+                        case 3: //소통정보배경이미지
+                            {
+                                nObjType = vms_obj_draw;
+                                sTmp.printf("%02X%04X%04X%02X%s+",
+                                    pFormObj->IsBlinking,
+                                    pFormObj->PosX,
+                                    pFormObj->PosY,
+                                    pFormObj->BkColor,
+                                    pFormObj->ImageId.SubString(1,4).c_str());
+
+                                sCont.printf("%02X%02X%s", nObjType, sTmp.Length(), sTmp.c_str());
+                                VMS_DSPL_MSG_DATA += sCont;
+
+                                AnsiString sVertex = "";
+                                TCDSImage *pSymbol = ImageManager->FLists.Find(pFormObj->ImageId);
+                                if (pSymbol)
+                                {
+                                    sTmp = "";
+                                    int nCnt = 0;
+
+                                    FOR_STL(TCDSImageCell*, pCell, pSymbol->FLists)
+                                    {
+                                        TCDSIfsc *pIfsc = NULL;
+                                        if (pFormObj->ObjectType == 3)
+                                            pIfsc = IfscManager->FLists.Find(pCell->VMS_IFSC_ID);
+                                        else
+                                            pIfsc = IfscManager->FLists.Find(pFormObj->IFSC_ID);
+
+                                        if (pIfsc)
+                                        {
+                                            sVertex.sprintf("%03d%03d%d", pCell->POSX, pCell->POSY, pIfsc->CMTR_GRAD_CD.ToIntDef(0));
+                                            sTmp += sVertex;
+                                            nCnt++;
+                                        }
+                                    }
+                                    sCont.printf("%02X%s|", nCnt, sTmp.c_str());
+                                    VMS_DSPL_MSG_DATA += sCont;
+                                }
+                                else
+                                {
+                                    VMS_DSPL_MSG_DATA += "X|";
+                                }
+                            }
+                            break;
+                        default://기타 문자열
+                            VMS_DSPL_MSG_TXT += pFormObj->TextData;
+                            VMS_DSPL_MSG_TXT += " ";
+
+                            nObjType = vms_obj_text;
+                            sTmp.printf("%02X%04X%04X%02X%02X%02X%02X%02X%02X%s|",
+                                pFormObj->IsBlinking,
+                                pFormObj->PosX,
+                                pFormObj->PosY,
+                                pFormObj->BkColor,
+                                pFormObj->TextFontSize,
+                                pFormObj->TextFontColor,
+                                pFormObj->TextFontName,
+                                pFormObj->TextFontBold,
+                                pFormObj->TextData.Length(),
+                                pFormObj->TextData);
+
+                            sCont.printf("%02X%02X%s", nObjType, sTmp.Length(), sTmp.c_str());
+                            VMS_DSPL_MSG_DATA += sCont;
+                            break;
+                        }
+                    }
+
+                    if (VMS_DSPL_MSG_DATA.Length() > 400) VMS_DSPL_MSG_DATA = VMS_DSPL_MSG_DATA.SubString(1, 399);
+                    if (VMS_DSPL_MSG_TXT.Length()  > 200) VMS_DSPL_MSG_TXT  = VMS_DSPL_MSG_TXT.SubString(1, 199);
+
+//LDEBUG("SaveVmsProvide: %s, %d Merge", AObj->VmsNo.c_str(), ii+1);
+                    SQLBind(pSADO, "p01", VMS_CTLR_NMBR);
+                    SQLBind(pSADO, "p02", PHASE);
+                    SQLBind(pSADO, "p03", DSPL_DT);
+                    SQLBind(pSADO, "p04", VMS_DSPL_MSG_DATA);
+                    SQLBind(pSADO, "p05", VMS_DSPL_MSG_TXT);
+                    SQLBind(pSADO, "p06", TRFC_SITU_TYPE_CD);
+                    SQLBind(pSADO, "p07", VMS_MSG_DSPL_DRCT_CD);
+                    SQLBind(pSADO, "p08", VMS_MSG_DSPL_MTHD_CD);
+                    SQLBind(pSADO, "p09", DSPL_HH);
+                    SQLBind(pSADO, "p10", VMS_FORM_ID);
+                    SQLBind(pSADO, "p11", DNLD_YN);
+                    SQLExec(pSADO);
+
+                    try
+                    {
+//LDEBUG("SaveVmsProvide: %s, %d Update", AObj->VmsNo.c_str(), ii+1);
+                        SQLBind(pUADO, "p01", VMS_CTLR_NMBR);
+                        SQLBind(pUADO, "p02", PHASE);
+                        //pUADO->Parameters->ParamByName("p03")->LoadFromStream(pStream, ftBlob);
+                        pUADO->Parameters->ParamByName("p03")->LoadFromStream(pForm->pStream, ftBlob);
+                        SQLExec(pUADO);
+
+//LINFO("[%s] FormImage Size: %d", AObj->VmsNo.c_str(), pForm->pStream->Size);
+                        //pForm->pBitmap->SaveToFile(g_sFormDir + AObj->VmsId + "\\" + PHASE + ".bmp");
+                        //pImage->Picture->SaveToFile(g_sFormDir + AObj->VmsId + "\\" + PHASE + ".bmp");
+                    }
+                    catch(Exception &e)
+                    {
+                    }
+
+//LDEBUG("SaveVmsProvide: %s, %d Insert", AObj->VmsNo.c_str(), ii+1);
+#if 0
+                    SQLBind(pIADO, "p01", VMS_CTLR_NMBR);
+                    SQLBind(pIADO, "p02", PHASE);
+                    SQLBind(pIADO, "p03", DSPL_DT);
+                    SQLBind(pIADO, "p04", VMS_DSPL_MSG_DATA);
+                    SQLBind(pIADO, "p05", VMS_DSPL_MSG_TXT);
+                    SQLBind(pIADO, "p06", TRFC_SITU_TYPE_CD);
+                    SQLBind(pIADO, "p07", VMS_MSG_DSPL_DRCT_CD);
+                    SQLBind(pIADO, "p08", VMS_MSG_DSPL_MTHD_CD);
+                    SQLBind(pIADO, "p09", DSPL_HH);
+                    SQLBind(pIADO, "p10", VMS_FORM_ID);
+                    SQLBind(pIADO, "p11", DNLD_YN);
+                    SQLExec(pIADO);
+#endif
+
+                    nSelCnt++;
+                }
+                __finally
+                {
+                }
+            }
+
+            pSADO->Connection->CommitTrans();
+
+            nResult = VERR_NONE;
+		}
+		catch(EDatabaseError &E)
+		{
+            pSADO->Connection->RollbackTrans();
+            ErrorString = String(E.ClassName()) + E.Message;
+            DBERRORLOG("SaveVmsProvide", String(E.ClassName()), E.Message, sQry);
+            nResult = VERR_OTHER;
+		}
+		catch(Exception &e)
+		{
+            pSADO->Connection->RollbackTrans();
+            ErrorString = String(e.ClassName()) + e.Message;
+            DBERRORLOG("SaveVmsProvide", String(e.ClassName()), e.Message, sQry);
+		}
+	}
+	__finally
+	{
+        AObj->pForms->UnLock();
+
+        if (pSADO)
+        {
+            SQLClose(pSADO);
+            SAFE_DELETE(pSADO);
+        }
+        if (pUADO)
+        {
+            SQLClose(pUADO);
+            SAFE_DELETE(pUADO);
+        }
+#if 0
+        if (pIADO)
+        {
+            SQLClose(pIADO);
+            SAFE_DELETE(pIADO);
+        }
+#endif
+	}
+    LINFO("SaveVmsDatabaseForm: End, %s, %d EA", AObj->VmsNo.c_str(), nSelCnt);
+    return nSelCnt;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMCOMM::ProvideSave(void *AData)
+{
+	int          nResult, ii;
+    TVmsCtlr    *pObj;
+	SAVE_STRUCT *pSave;
+    int          nJobCnt = 0;
+
+	nResult = VERR_NONE;
+
+    LINFO("ProvideSave: Start");
+
+    pSave = (SAVE_STRUCT*)AData;
+    if (!pSave)
+    {
+        LERROR("ProvideSave: Data NULL");
+        return VERR_MEMORY_ALLOC;
+    }
+
+    try
+    {
+        switch(pSave->Type)
+        {
+        case save_download:
+            for (ii = 0; ii < pSave->Count && ii < INT_MAX_VMS_STATE; ii++)
+            {
+                pObj = (TVmsCtlr*)pSave->pObj[ii];
+                if (!pObj) continue;
+                if ((nResult = SaveVmsDownLoad(pObj)) != VERR_NONE)
+                {
+                    LERROR("ProvideSave: SaveVmsDownLoad failed");
+                }
+            }
+            break;
+        case save_provide:
+            {
+                INT_VMS_FORM_DOWNLOAD_REQ VmsSave;
+
+                memset(&VmsSave, 0x00, sizeof(VmsSave));
+                VmsSave.Count = 0;
+
+                LINFO("VMS Msg Dnld Result Save: %d EA", pSave->Count);
+                for (ii = 0; ii < pSave->Count && ii < INT_MAX_VMS_FORM_DOWNLOAD; ii++)
+                {
+                    pObj = (TVmsCtlr*)pSave->pObj[ii];
+                    if (!pObj) continue;
+#if 0
+                    if ((nResult = SaveVmsProvide(pObj)) != VERR_NONE)
+#else
+                    if ((nResult = UpdateVmsProvideResult(pObj)) != VERR_NONE)
+#endif
+                    {
+                        LERROR("ProvideSave: UpdateVmsProvideResult failed");
+                    }
+                    else
+                    {
+                        nJobCnt++;
+
+                        memcpy(VmsSave.Unit[VmsSave.Count].VmsId, pObj->VmsNo.c_str(), INT_VMS_MAX_ID);
+                        memcpy(VmsSave.Unit[VmsSave.Count].Date,  pObj->CTLMODE->SvcDate.c_str(), INT_VMS_MAX_DATETIME);
+                        VmsSave.Unit[VmsSave.Count].Result = pObj->CTLMODE->Result ? vms_download_succ : vms_download_fail;
+                        VmsSave.Count++;
+
+                        if (VmsSave.Count >= INT_MAX_VMS_FORM_DOWNLOAD)
+                        {
+                            VComm_VmsFormDownLoadNotify(&VmsSave);
+                            VmsSave.Count = 0;
+                        }
+                    }
+                }
+                if (VmsSave.Count > 0)
+                {
+                    VComm_VmsFormDownLoadNotify(&VmsSave);
+                }
+            }
+            break;
+        }
+    }
+    __finally
+    {
+        delete[] (char *)AData;
+    }
+    LINFO("ProvideSave: %d EA", nJobCnt);
+	return nResult;
+}
+//---------------------------------------------------------------------------
+
+

+ 12 - 0
SRC/DM/DMCOMMF.dfm

@@ -0,0 +1,12 @@
+object DMCOMM: TDMCOMM
+  OldCreateOrder = False
+  OnCreate = DataModuleCreate
+  OnDestroy = DataModuleDestroy
+  Height = 150
+  Width = 215
+  object TcpServer: TTcpServer
+    OnGetThread = TcpServerGetThread
+    Left = 64
+    Top = 32
+  end
+end

+ 145 - 0
SRC/DM/DMCOMMF.h

@@ -0,0 +1,145 @@
+
+//---------------------------------------------------------------------------
+#ifndef DMCOMMFH
+#define DMCOMMFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <Sockets.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+// 프로세스 상태
+typedef struct tagDbStatusProcess
+{
+    AnsiString PROCESSID;       /* VARCHAR2(6) not null, 프로세스ID */
+    AnsiString REGDATE;         /* DATE not null, 상태등록일시 */
+	AnsiString RUNVERSION;      /* VARCHAR2(5), 실행버전 */
+    int STATUS;                 /* NUMBER(1), 프로세스상태 */
+	int COMM;       			/* NUMBER(1), 통신상태 */
+	int DB;         			/* NUMBER(1), DB상태 */
+} DB_STATUS_PROCESS;
+
+
+//---------------------------------------------------------------------------
+class TDMCOMM : public TDataModule
+{
+__published:	// IDE-managed Components
+	TTcpServer *TcpServer;
+	void __fastcall DataModuleCreate(TObject *Sender);
+	void __fastcall DataModuleDestroy(TObject *Sender);
+	void __fastcall TcpServerGetThread(TObject *Sender, TClientSocketThread *&ClientSocketThread);
+
+
+private:	// User declarations
+
+    TADOConnection *FDbConn;
+    String          FErrorString;
+
+    int             FProcessStateMin;
+    int             FEquipStateMin;
+
+public:		// User declarations
+	__fastcall TDMCOMM(TComponent* Owner);
+
+    TADOConnection *GetDbConnection() { return FDbConn; }
+
+    bool __fastcall DbConnect(String AConnStr);
+    bool __fastcall DbClose();
+
+    bool __fastcall SQLText(TADOQuery *adoQry, String sQry, bool AReadOnly=true);
+    bool __fastcall SQLBind(TADOQuery *adoQry, String param, String var);
+    bool __fastcall SQLClose(TADOQuery *adoQry);
+    int  __fastcall SQLOpen(TADOQuery *adoQry);
+    int  __fastcall SQLExec(TADOQuery *adoQry);
+    void __fastcall SQLFree(TADOQuery *adoQry)
+    {
+        if (adoQry)
+        {
+            SQLClose(adoQry);
+            SAFE_DELETE(adoQry);
+        }
+    }
+
+	void __fastcall DbState(bool AFlag);
+
+    void __fastcall TcpClientDisconnect(TObject *Sender);
+
+	TVmsCtlr* __fastcall FindVms(AnsiString AIpAddress, int APort);
+
+	void __fastcall TerminateVms(void);
+	void __fastcall ControlVms(TVmsCtlr *AObj, bool ACreate);
+	void __fastcall MonitoringVms(bool ServerRun);
+
+#ifdef RUN_CLIENT
+	void __fastcall TerminateVmsClient(TVmsCtlr *AObj);
+	void __fastcall TerminateVmsClient(void);
+	void __fastcall ControlVmsClient(TVmsCtlr *AObj, bool ACreate);
+	void __fastcall MonitoringVmsClient(bool ServerRun);
+#endif
+
+	int __fastcall GetDbSysdate();
+	int __fastcall GetProcessInfo();
+
+	int __fastcall GetVmsInfo();
+	int __fastcall GetFontInfo();
+
+	int __fastcall GetVmsStateInfo();
+    int __fastcall GetVmsIfscInfo();
+	int __fastcall LoadVmsOnOffTime();
+	int __fastcall GetVmsLuminanceTime();
+	int __fastcall GetVmsDownLoadInfo();
+
+    /* VMS Draw Master db */
+	int __fastcall GetVmsImage();
+	int __fastcall GetVmsImageCell();
+	int __fastcall LoadVmsForm();
+	int __fastcall LoadVmsFormObject();
+
+
+//
+	int __fastcall SaveProcessStateProc(void);
+
+	int __fastcall SaveEquipStateAllProc(void);
+	int __fastcall SendEquipStateAllProc(void);
+
+	int __fastcall SaveEquipStateProc(TVmsCtlr *AObj, int AServerState);
+
+	int __fastcall DataSaveProc(void *pData);
+
+	int __fastcall ProvideProc(void *AData);
+
+    int __fastcall LoadIfscTrafficInfo();
+
+	int __fastcall LoadVmsOperatorMode();
+	int __fastcall SetVmsMode();
+
+	int __fastcall MakeVmsScenarioForm(AnsiString AVmsId);
+	int __fastcall SaveVmsDownloadForm();
+
+	int __fastcall ClearVmsProvideMode(AnsiString AVmsId);
+	int __fastcall LoadVmsScheduleInfo(AnsiString AVmsId);
+	int __fastcall LoadVmsEventOccrInf(AnsiString AVmsId);
+
+	int __fastcall ProvideSave(void *AData);
+	int __fastcall SaveVmsDownLoad(TVmsCtlr *AObj);
+	int __fastcall SaveVmsDatabaseForm(TVmsCtlr *AObj);
+	int __fastcall UpdateVmsProvideResult(TVmsCtlr *AObj);
+
+    AnsiString FFormDsplDt;
+
+    IPC_LOG_MESSAGE FLogMsg;
+    int LogWrite(int ALogKind, char *AFmt, ...);
+
+    void __fastcall SetErrorString(String AErrorString);
+	__property String  ErrorString = {read=FErrorString, write=SetErrorString};
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TDMCOMM *DMCOMM;
+//---------------------------------------------------------------------------
+#endif

+ 106 - 0
SRC/FRM/FrmOptionF.cpp

@@ -0,0 +1,106 @@
+//---------------------------------------------------------------------------
+
+#include <vcl.h>
+#pragma hdrstop
+
+#include "FrmOptionF.h"
+#include "AppGlobalF.h"
+#include "FrmVmsInfoF.h"
+#include "DMCOMMF.h"
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma resource "*.dfm"
+TFrmOption *FrmOption;
+//---------------------------------------------------------------------------
+__fastcall TFrmOption::TFrmOption(TComponent* Owner)
+    : TForm(Owner)
+{
+    FUpdate = false;
+}
+//---------------------------------------------------------------------------
+void __fastcall TFrmOption::btnCloseClick(TObject *Sender)
+{
+    Close();
+}
+//---------------------------------------------------------------------------
+void __fastcall TFrmOption::btnSetLogClick(TObject *Sender)
+{
+    // 로그설정
+#ifdef LANG_ENG
+	if (MessageDlg("Do you want to set option information?", mtWarning, TMsgDlgButtons() << mbYes << mbNo, 0) != mrYes)
+#else
+	if (MessageDlg("옵션 정보를 설정 하시겠습니까?", mtWarning, TMsgDlgButtons() << mbYes << mbNo, 0) != mrYes)
+#endif
+    {
+		return;
+	}
+
+    bool bUpdate = false;
+    if (g_LogCfg.Info   != chkInfo->Checked)
+    {
+        g_LogCfg.Info    = chkInfo->Checked;
+        bUpdate = true;
+    }
+    if (g_LogCfg.Data   != chkData->Checked)
+    {
+        g_LogCfg.Data    = chkData->Checked;
+        bUpdate = true;
+    }
+    if (g_LogCfg.Error  != chkError->Checked)
+    {
+        g_LogCfg.Error   = chkError->Checked;
+        bUpdate = true;
+    }
+    if (g_LogCfg.Warning!= chkWarning->Checked)
+    {
+        g_LogCfg.Warning = chkWarning->Checked;
+        bUpdate = true;
+    }
+    if (g_LogCfg.Debug  != chkDebug->Checked)
+    {
+        g_LogCfg.Debug   = chkDebug->Checked;
+        bUpdate = true;
+    }
+    if (g_LogCfg.Detail != chkDetail->Checked)
+    {
+        g_LogCfg.Detail  = chkDetail->Checked;
+        bUpdate = true;
+    }
+
+    SYS_WriteConfigInfo("LOG", "INFO",    g_LogCfg.Info    ? "1" : "0", g_AppCfg.sConfigFile);
+    SYS_WriteConfigInfo("LOG", "DATA",    g_LogCfg.Data    ? "1" : "0", g_AppCfg.sConfigFile);
+    SYS_WriteConfigInfo("LOG", "ERROR",   g_LogCfg.Error   ? "1" : "0", g_AppCfg.sConfigFile);
+    SYS_WriteConfigInfo("LOG", "WARNING", g_LogCfg.Warning ? "1" : "0", g_AppCfg.sConfigFile);
+    SYS_WriteConfigInfo("LOG", "DEBUG",   g_LogCfg.Debug   ? "1" : "0", g_AppCfg.sConfigFile);
+    SYS_WriteConfigInfo("LOG", "DETAIL",  g_LogCfg.Detail  ? "1" : "0", g_AppCfg.sConfigFile);
+
+    if (bUpdate) FUpdate = bUpdate;
+
+	//MessageDlg("로그설정이 변경되었습니다.", mtCustom, TMsgDlgButtons() << mbOK, 0);
+}
+//---------------------------------------------------------------------------
+void __fastcall TFrmOption::FormShow(TObject *Sender)
+{
+    // 서버정보 표출
+    plTot->Caption = FrmVmsInfo->plTot->Caption;
+    plErr->Caption = FrmVmsInfo->plErr->Caption;
+    plNor->Caption = FrmVmsInfo->plNor->Caption;
+
+    //plProcessId->Caption  = g_AppCfg.sProcessId + " (" + String(g_AppCfg.nProcessPort) + ")";
+    plProcessId->Caption  = g_AppCfg.sProcessId;
+    plSystemId->Caption   = g_AppCfg.sSystemId;
+    plIpAddress->Caption  = DMCOMM->TcpServer->LocalHostAddr();
+    plCenterPort->Caption = g_AppCfg.comm.nCenterPort;
+    plVmsPort->Caption    = g_AppCfg.comm.nListenPort;
+    plVmsConPort->Caption = g_AppCfg.comm.nClientPort;
+
+    // 로그설정
+    chkInfo->Checked    = g_LogCfg.Info;
+    chkData->Checked    = g_LogCfg.Data;
+    chkError->Checked   = g_LogCfg.Error;
+    chkWarning->Checked = g_LogCfg.Warning;
+    chkDebug->Checked   = g_LogCfg.Debug;
+    chkDetail->Checked  = g_LogCfg.Detail;
+}
+//---------------------------------------------------------------------------
+

+ 891 - 0
SRC/FRM/FrmOptionF.dfm

@@ -0,0 +1,891 @@
+object FrmOption: TFrmOption
+  Left = 0
+  Top = 0
+  BorderIcons = [biSystemMenu, biMinimize]
+  BorderStyle = bsSingle
+  Caption = 'Options'
+  ClientHeight = 291
+  ClientWidth = 616
+  Color = clBtnFace
+  DoubleBuffered = True
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -12
+  Font.Name = 'Tahoma'
+  Font.Style = []
+  Icon.Data = {
+    000001000100100F000000000000540500001600000028000000100000001E00
+    000001000800000000002C01000000000000000000000000000000000000FFFF
+    FF00FACEA900FFDA9500FFC49D00FFC69500E4B48E00E7AB9500E6A49100EEA4
+    8B00ECA18100E3A38C00D9A29400DFA68B00DA9D8B00D99D8700D49A8600CC93
+    8100CA8B830099E4FE00BF908200E9967900D4947600BD907B00A9817900A07B
+    7400A3756500A06B61009F766600896A61008A626200926652008B7E5A008860
+    55008D664E0081544E0073544A00734D4000674F490064484000604B3C00535B
+    3B005F443B004F403F0048382C00315967003F4538002C1106001D1211000C0D
+    0B00000000006DADB500719BA600628AA80063868F00736765006E6C64007957
+    4E0075544700695450005D4D46007F5A360073483D00664C3F0051403B005737
+    240048352F00344B6B0000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000FFFFFF003131
+    3131313131313131313131313131313131302424242424242424313131313131
+    2424121212122C24032424313131312403242412123224030303242431313103
+    0303241212342403030303242431310303032412123424030303032424313103
+    0303241212342403030303242431310303032412123424030303032424313103
+    0303241212342403030303242431310303243712123424030303032424313124
+    0324373333372403030324243131313103032432332403030303242431313131
+    2403331212342403032424313131313131242432123524242431313131313131
+    3131312F2F303131313131313131E00F0000C007000080030000000100000000
+    0000000000000000000000000000000000000000000000010000800100008003
+    0000C0070000E01F0000}
+  OldCreateOrder = False
+  OnShow = FormShow
+  PixelsPerInch = 96
+  TextHeight = 14
+  object btnClose: TButton
+    Left = 526
+    Top = 260
+    Width = 75
+    Height = 25
+    Cursor = crHandPoint
+    Caption = 'Close'
+    TabOrder = 0
+    OnClick = btnCloseClick
+  end
+  object pnlLeft: TPanel
+    AlignWithMargins = True
+    Left = 2
+    Top = 0
+    Width = 612
+    Height = 153
+    Margins.Left = 2
+    Margins.Top = 0
+    Margins.Right = 2
+    Margins.Bottom = 2
+    Align = alTop
+    BevelKind = bkSoft
+    BevelOuter = bvNone
+    TabOrder = 1
+    object plServerInfo: TPanel
+      AlignWithMargins = True
+      Left = 2
+      Top = 2
+      Width = 604
+      Height = 26
+      Margins.Left = 2
+      Margins.Top = 2
+      Margins.Right = 2
+      Margins.Bottom = 2
+      Align = alTop
+      Alignment = taLeftJustify
+      BevelKind = bkSoft
+      BevelOuter = bvNone
+      Caption = '      Server Information'
+      Font.Charset = DEFAULT_CHARSET
+      Font.Color = clWindowText
+      Font.Height = -12
+      Font.Name = 'Tahoma'
+      Font.Style = [fsBold]
+      ParentBackground = False
+      ParentFont = False
+      TabOrder = 0
+      object Image3: TImage
+        Left = 7
+        Top = 6
+        Width = 9
+        Height = 9
+        Picture.Data = {
+          07544269746D617032010000424D320100000000000036000000280000000900
+          0000090000000100180000000000FC000000C30E0000C30E0000000000000000
+          00000000FF0000FF0000FF0092FF0092FF0092FF0000FF0000FF0000FF000000
+          FF0092FF0092FF46AFFD46AFFD46AFFD0092FF0092FF0000FF000000FF0092FF
+          46AFFD46AFFDFFFFFF46AFFD46AFFD0092FF0000FF000092FF46AFFD46AFFD46
+          AFFDFFFFFF46AFFD46AFFD46AFFD0092FF000092FF46AFFDFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFF46AFFD0092FF000092FF46AFFD46AFFD46AFFDFFFFFF46AFFD
+          46AFFD46AFFD0092FF000000FF0092FF46AFFD46AFFDFFFFFF46AFFD46AFFD00
+          92FF0000FF000000FF0092FF0092FF46AFFD46AFFD46AFFD0092FF0092FF0000
+          FF000000FF0000FF0000FF0092FF0092FF0092FF0000FF0000FF0000FF00}
+        Transparent = True
+      end
+    end
+    object Panel1: TPanel
+      AlignWithMargins = True
+      Left = 2
+      Top = 30
+      Width = 300
+      Height = 117
+      Margins.Left = 2
+      Margins.Top = 0
+      Margins.Right = 2
+      Margins.Bottom = 2
+      Align = alLeft
+      BevelKind = bkSoft
+      BevelOuter = bvNone
+      TabOrder = 1
+      object Panel10: TPanel
+        AlignWithMargins = True
+        Left = 2
+        Top = 55
+        Width = 292
+        Height = 25
+        Margins.Left = 2
+        Margins.Top = 1
+        Margins.Right = 2
+        Margins.Bottom = 1
+        Align = alTop
+        BevelKind = bkFlat
+        BevelOuter = bvNone
+        ParentBackground = False
+        TabOrder = 0
+        object Label2: TLabel
+          AlignWithMargins = True
+          Left = 0
+          Top = 3
+          Width = 150
+          Height = 15
+          Margins.Left = 0
+          Align = alLeft
+          Alignment = taRightJustify
+          AutoSize = False
+          Caption = 'IP Address'
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -12
+          Font.Name = 'Tahoma'
+          Font.Style = []
+          ParentFont = False
+          Layout = tlCenter
+        end
+        object plIpAddress: TPanel
+          AlignWithMargins = True
+          Left = 156
+          Top = 0
+          Width = 129
+          Height = 21
+          Margins.Top = 0
+          Margins.Bottom = 0
+          Align = alClient
+          BevelKind = bkFlat
+          BevelOuter = bvNone
+          Caption = '127.0.0.1'
+          Color = clTeal
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindow
+          Font.Height = -12
+          Font.Name = 'Tahoma'
+          Font.Style = [fsBold]
+          ParentBackground = False
+          ParentFont = False
+          TabOrder = 0
+        end
+      end
+      object Panel26: TPanel
+        AlignWithMargins = True
+        Left = 2
+        Top = 82
+        Width = 292
+        Height = 25
+        Margins.Left = 2
+        Margins.Top = 1
+        Margins.Right = 2
+        Margins.Bottom = 1
+        Align = alTop
+        BevelKind = bkFlat
+        BevelOuter = bvNone
+        ParentBackground = False
+        TabOrder = 1
+        object Label4: TLabel
+          AlignWithMargins = True
+          Left = 0
+          Top = 3
+          Width = 150
+          Height = 15
+          Margins.Left = 0
+          Align = alLeft
+          Alignment = taRightJustify
+          AutoSize = False
+          Caption = 'Internal Port'
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -12
+          Font.Name = 'Tahoma'
+          Font.Style = []
+          ParentFont = False
+          Layout = tlCenter
+        end
+        object plCenterPort: TPanel
+          AlignWithMargins = True
+          Left = 156
+          Top = 0
+          Width = 129
+          Height = 21
+          Margins.Top = 0
+          Margins.Bottom = 0
+          Align = alClient
+          BevelKind = bkFlat
+          BevelOuter = bvNone
+          Caption = '5040'
+          Color = clTeal
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindow
+          Font.Height = -12
+          Font.Name = 'Tahoma'
+          Font.Style = [fsBold]
+          ParentBackground = False
+          ParentFont = False
+          TabOrder = 0
+        end
+      end
+      object Panel2: TPanel
+        AlignWithMargins = True
+        Left = 2
+        Top = 1
+        Width = 292
+        Height = 25
+        Margins.Left = 2
+        Margins.Top = 1
+        Margins.Right = 2
+        Margins.Bottom = 1
+        Align = alTop
+        BevelKind = bkFlat
+        BevelOuter = bvNone
+        ParentBackground = False
+        TabOrder = 2
+        object Label11: TLabel
+          AlignWithMargins = True
+          Left = 0
+          Top = 3
+          Width = 285
+          Height = 15
+          Margins.Left = 0
+          Align = alClient
+          AutoSize = False
+          Caption = '  Communication Information'
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clPurple
+          Font.Height = -12
+          Font.Name = 'Tahoma'
+          Font.Style = [fsBold]
+          ParentFont = False
+          Layout = tlCenter
+          ExplicitLeft = 16
+          ExplicitWidth = 90
+        end
+      end
+      object Panel13: TPanel
+        AlignWithMargins = True
+        Left = 2
+        Top = 28
+        Width = 292
+        Height = 25
+        Margins.Left = 2
+        Margins.Top = 1
+        Margins.Right = 2
+        Margins.Bottom = 1
+        Align = alTop
+        BevelKind = bkFlat
+        BevelOuter = bvNone
+        ParentBackground = False
+        TabOrder = 3
+        object Label10: TLabel
+          AlignWithMargins = True
+          Left = 0
+          Top = 3
+          Width = 150
+          Height = 15
+          Margins.Left = 0
+          Align = alLeft
+          Alignment = taRightJustify
+          AutoSize = False
+          Caption = 'System ID'
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -12
+          Font.Name = 'Tahoma'
+          Font.Style = []
+          ParentFont = False
+          Layout = tlCenter
+        end
+        object plSystemId: TPanel
+          AlignWithMargins = True
+          Left = 156
+          Top = 0
+          Width = 129
+          Height = 21
+          Margins.Top = 0
+          Margins.Bottom = 0
+          Align = alClient
+          BevelKind = bkFlat
+          BevelOuter = bvNone
+          Caption = '0'
+          Color = clTeal
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindow
+          Font.Height = -12
+          Font.Name = 'Tahoma'
+          Font.Style = [fsBold]
+          ParentBackground = False
+          ParentFont = False
+          TabOrder = 0
+        end
+      end
+    end
+    object Panel5: TPanel
+      AlignWithMargins = True
+      Left = 306
+      Top = 30
+      Width = 300
+      Height = 117
+      Margins.Left = 2
+      Margins.Top = 0
+      Margins.Right = 2
+      Margins.Bottom = 2
+      Align = alLeft
+      BevelKind = bkSoft
+      BevelOuter = bvNone
+      TabOrder = 2
+      object Panel19: TPanel
+        AlignWithMargins = True
+        Left = 2
+        Top = 1
+        Width = 292
+        Height = 25
+        Margins.Left = 2
+        Margins.Top = 1
+        Margins.Right = 2
+        Margins.Bottom = 1
+        Align = alTop
+        BevelKind = bkFlat
+        BevelOuter = bvNone
+        ParentBackground = False
+        TabOrder = 0
+        object Label15: TLabel
+          AlignWithMargins = True
+          Left = 0
+          Top = 3
+          Width = 285
+          Height = 15
+          Margins.Left = 0
+          Align = alClient
+          AutoSize = False
+          Caption = '  VMS Controller Information'
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clPurple
+          Font.Height = -12
+          Font.Name = 'Tahoma'
+          Font.Style = [fsBold]
+          ParentFont = False
+          Layout = tlCenter
+          ExplicitLeft = 16
+          ExplicitWidth = 90
+        end
+      end
+      object Panel20: TPanel
+        AlignWithMargins = True
+        Left = 2
+        Top = 28
+        Width = 292
+        Height = 25
+        Margins.Left = 2
+        Margins.Top = 1
+        Margins.Right = 2
+        Margins.Bottom = 1
+        Align = alTop
+        BevelKind = bkFlat
+        BevelOuter = bvNone
+        ParentBackground = False
+        TabOrder = 1
+        object Label16: TLabel
+          AlignWithMargins = True
+          Left = 0
+          Top = 3
+          Width = 150
+          Height = 15
+          Margins.Left = 0
+          Align = alLeft
+          Alignment = taRightJustify
+          AutoSize = False
+          Caption = 'Total VMS'
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -12
+          Font.Name = 'Tahoma'
+          Font.Style = []
+          ParentFont = False
+          Layout = tlCenter
+        end
+        object plTot: TPanel
+          AlignWithMargins = True
+          Left = 156
+          Top = 0
+          Width = 129
+          Height = 21
+          Margins.Top = 0
+          Margins.Bottom = 0
+          Align = alClient
+          BevelKind = bkFlat
+          BevelOuter = bvNone
+          Caption = '0'
+          Color = clTeal
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindow
+          Font.Height = -12
+          Font.Name = 'Tahoma'
+          Font.Style = [fsBold]
+          ParentBackground = False
+          ParentFont = False
+          TabOrder = 0
+        end
+      end
+      object Panel22: TPanel
+        AlignWithMargins = True
+        Left = 2
+        Top = 55
+        Width = 292
+        Height = 25
+        Margins.Left = 2
+        Margins.Top = 1
+        Margins.Right = 2
+        Margins.Bottom = 1
+        Align = alTop
+        BevelKind = bkFlat
+        BevelOuter = bvNone
+        ParentBackground = False
+        TabOrder = 2
+        object Label17: TLabel
+          AlignWithMargins = True
+          Left = 0
+          Top = 3
+          Width = 150
+          Height = 15
+          Margins.Left = 0
+          Align = alLeft
+          Alignment = taRightJustify
+          AutoSize = False
+          Caption = 'Normal VMS'
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -12
+          Font.Name = 'Tahoma'
+          Font.Style = []
+          ParentFont = False
+          Layout = tlCenter
+        end
+        object plNor: TPanel
+          AlignWithMargins = True
+          Left = 156
+          Top = 0
+          Width = 129
+          Height = 21
+          Margins.Top = 0
+          Margins.Bottom = 0
+          Align = alClient
+          BevelKind = bkFlat
+          BevelOuter = bvNone
+          Caption = '0'
+          Color = clTeal
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindow
+          Font.Height = -12
+          Font.Name = 'Tahoma'
+          Font.Style = [fsBold]
+          ParentBackground = False
+          ParentFont = False
+          TabOrder = 0
+        end
+      end
+      object Panel25: TPanel
+        AlignWithMargins = True
+        Left = 2
+        Top = 82
+        Width = 292
+        Height = 25
+        Margins.Left = 2
+        Margins.Top = 1
+        Margins.Right = 2
+        Margins.Bottom = 1
+        Align = alTop
+        BevelKind = bkFlat
+        BevelOuter = bvNone
+        ParentBackground = False
+        TabOrder = 3
+        object Label18: TLabel
+          AlignWithMargins = True
+          Left = 0
+          Top = 3
+          Width = 150
+          Height = 15
+          Margins.Left = 0
+          Align = alLeft
+          Alignment = taRightJustify
+          AutoSize = False
+          Caption = 'Error VMS'
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -12
+          Font.Name = 'Tahoma'
+          Font.Style = []
+          ParentFont = False
+          Layout = tlCenter
+        end
+        object plErr: TPanel
+          AlignWithMargins = True
+          Left = 156
+          Top = 0
+          Width = 129
+          Height = 21
+          Margins.Top = 0
+          Margins.Bottom = 0
+          Align = alClient
+          BevelKind = bkFlat
+          BevelOuter = bvNone
+          Caption = '0'
+          Color = clTeal
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clRed
+          Font.Height = -12
+          Font.Name = 'Tahoma'
+          Font.Style = [fsBold]
+          ParentBackground = False
+          ParentFont = False
+          TabOrder = 0
+        end
+      end
+    end
+  end
+  object Panel4: TPanel
+    AlignWithMargins = True
+    Left = 2
+    Top = 155
+    Width = 612
+    Height = 98
+    Margins.Left = 2
+    Margins.Top = 0
+    Margins.Right = 2
+    Margins.Bottom = 2
+    Align = alTop
+    BevelKind = bkSoft
+    BevelOuter = bvNone
+    TabOrder = 2
+    object Panel6: TPanel
+      AlignWithMargins = True
+      Left = 2
+      Top = 2
+      Width = 604
+      Height = 26
+      Margins.Left = 2
+      Margins.Top = 2
+      Margins.Right = 2
+      Margins.Bottom = 2
+      Align = alTop
+      Alignment = taLeftJustify
+      BevelKind = bkSoft
+      BevelOuter = bvNone
+      Caption = '      Log Options'
+      Font.Charset = DEFAULT_CHARSET
+      Font.Color = clWindowText
+      Font.Height = -12
+      Font.Name = 'Tahoma'
+      Font.Style = [fsBold]
+      ParentBackground = False
+      ParentFont = False
+      TabOrder = 0
+      object Image1: TImage
+        Left = 7
+        Top = 6
+        Width = 9
+        Height = 9
+        Picture.Data = {
+          07544269746D617032010000424D320100000000000036000000280000000900
+          0000090000000100180000000000FC000000C30E0000C30E0000000000000000
+          00000000FF0000FF0000FF0092FF0092FF0092FF0000FF0000FF0000FF000000
+          FF0092FF0092FF46AFFD46AFFD46AFFD0092FF0092FF0000FF000000FF0092FF
+          46AFFD46AFFDFFFFFF46AFFD46AFFD0092FF0000FF000092FF46AFFD46AFFD46
+          AFFDFFFFFF46AFFD46AFFD46AFFD0092FF000092FF46AFFDFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFF46AFFD0092FF000092FF46AFFD46AFFD46AFFDFFFFFF46AFFD
+          46AFFD46AFFD0092FF000000FF0092FF46AFFD46AFFDFFFFFF46AFFD46AFFD00
+          92FF0000FF000000FF0092FF0092FF46AFFD46AFFD46AFFD0092FF0092FF0000
+          FF000000FF0000FF0000FF0092FF0092FF0092FF0000FF0000FF0000FF00}
+        Transparent = True
+      end
+    end
+    object chkInfo: TCheckBox
+      Left = 15
+      Top = 37
+      Width = 97
+      Height = 17
+      Cursor = crHandPoint
+      Caption = ' Information'
+      TabOrder = 1
+    end
+    object chkData: TCheckBox
+      Left = 352
+      Top = 37
+      Width = 97
+      Height = 17
+      Cursor = crHandPoint
+      Caption = ' Data'
+      Enabled = False
+      TabOrder = 2
+    end
+    object chkDetail: TCheckBox
+      Left = 143
+      Top = 60
+      Width = 97
+      Height = 17
+      Cursor = crHandPoint
+      Caption = ' Detail'
+      TabOrder = 3
+      Visible = False
+    end
+    object chkError: TCheckBox
+      Left = 127
+      Top = 37
+      Width = 97
+      Height = 17
+      Cursor = crHandPoint
+      Caption = ' Error'
+      TabOrder = 4
+    end
+    object chkWarning: TCheckBox
+      Left = 240
+      Top = 37
+      Width = 97
+      Height = 17
+      Cursor = crHandPoint
+      Caption = ' Warning'
+      TabOrder = 5
+    end
+    object chkDebug: TCheckBox
+      Left = 465
+      Top = 37
+      Width = 97
+      Height = 17
+      Cursor = crHandPoint
+      Caption = ' Debug'
+      Enabled = False
+      TabOrder = 6
+    end
+    object btnSetLog: TButton
+      Left = 522
+      Top = 60
+      Width = 75
+      Height = 25
+      Cursor = crHandPoint
+      Caption = 'Save'
+      TabOrder = 7
+      OnClick = btnSetLogClick
+    end
+  end
+  object Panel7: TPanel
+    AlignWithMargins = True
+    Left = 19
+    Top = 255
+    Width = 300
+    Height = 195
+    Margins.Left = 2
+    Margins.Top = 0
+    Margins.Right = 2
+    Margins.Bottom = 2
+    BevelKind = bkSoft
+    BevelOuter = bvNone
+    TabOrder = 3
+    Visible = False
+    object Panel3: TPanel
+      AlignWithMargins = True
+      Left = 2
+      Top = 1
+      Width = 292
+      Height = 25
+      Margins.Left = 2
+      Margins.Top = 1
+      Margins.Right = 2
+      Margins.Bottom = 1
+      Align = alTop
+      BevelKind = bkFlat
+      BevelOuter = bvNone
+      ParentBackground = False
+      TabOrder = 0
+      Visible = False
+      object Label1: TLabel
+        AlignWithMargins = True
+        Left = 0
+        Top = 3
+        Width = 150
+        Height = 15
+        Margins.Left = 0
+        Align = alLeft
+        Alignment = taRightJustify
+        AutoSize = False
+        Caption = 'Process ID'
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = 'Tahoma'
+        Font.Style = []
+        ParentFont = False
+        Layout = tlCenter
+      end
+      object plProcessId: TPanel
+        AlignWithMargins = True
+        Left = 156
+        Top = 0
+        Width = 129
+        Height = 21
+        Margins.Top = 0
+        Margins.Bottom = 0
+        Align = alClient
+        BevelKind = bkFlat
+        BevelOuter = bvNone
+        Caption = '20301'
+        Color = clTeal
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindow
+        Font.Height = -12
+        Font.Name = 'Tahoma'
+        Font.Style = [fsBold]
+        ParentBackground = False
+        ParentFont = False
+        TabOrder = 0
+      end
+    end
+    object Panel24: TPanel
+      AlignWithMargins = True
+      Left = 2
+      Top = 28
+      Width = 292
+      Height = 25
+      Margins.Left = 2
+      Margins.Top = 1
+      Margins.Right = 2
+      Margins.Bottom = 1
+      Align = alTop
+      BevelKind = bkFlat
+      BevelOuter = bvNone
+      ParentBackground = False
+      TabOrder = 1
+      Visible = False
+      object Label3: TLabel
+        AlignWithMargins = True
+        Left = 0
+        Top = 3
+        Width = 150
+        Height = 15
+        Margins.Left = 0
+        Align = alLeft
+        Alignment = taRightJustify
+        AutoSize = False
+        Caption = 'VMS Binding Port'
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = 'Tahoma'
+        Font.Style = []
+        ParentFont = False
+        Layout = tlCenter
+      end
+      object plVmsPort: TPanel
+        AlignWithMargins = True
+        Left = 156
+        Top = 0
+        Width = 129
+        Height = 21
+        Margins.Top = 0
+        Margins.Bottom = 0
+        Align = alClient
+        BevelKind = bkFlat
+        BevelOuter = bvNone
+        Caption = '6020'
+        Color = clTeal
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindow
+        Font.Height = -12
+        Font.Name = 'Tahoma'
+        Font.Style = [fsBold]
+        ParentBackground = False
+        ParentFont = False
+        TabOrder = 0
+      end
+    end
+    object Panel9: TPanel
+      AlignWithMargins = True
+      Left = 2
+      Top = 55
+      Width = 292
+      Height = 25
+      Margins.Left = 2
+      Margins.Top = 1
+      Margins.Right = 2
+      Margins.Bottom = 1
+      Align = alTop
+      BevelKind = bkFlat
+      BevelOuter = bvNone
+      ParentBackground = False
+      TabOrder = 2
+      Visible = False
+      object Label9: TLabel
+        AlignWithMargins = True
+        Left = 0
+        Top = 3
+        Width = 150
+        Height = 15
+        Margins.Left = 0
+        Align = alLeft
+        Alignment = taRightJustify
+        AutoSize = False
+        Caption = 'VMS Connect Port'
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = 'Tahoma'
+        Font.Style = []
+        ParentFont = False
+        Layout = tlCenter
+        Visible = False
+      end
+      object plVmsConPort: TPanel
+        AlignWithMargins = True
+        Left = 156
+        Top = 0
+        Width = 129
+        Height = 21
+        Margins.Top = 0
+        Margins.Bottom = 0
+        Align = alClient
+        BevelKind = bkFlat
+        BevelOuter = bvNone
+        Caption = '0'
+        Color = clTeal
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindow
+        Font.Height = -12
+        Font.Name = 'Tahoma'
+        Font.Style = [fsBold]
+        ParentBackground = False
+        ParentFont = False
+        TabOrder = 0
+        Visible = False
+      end
+    end
+  end
+end

+ 75 - 0
SRC/FRM/FrmOptionF.h

@@ -0,0 +1,75 @@
+//---------------------------------------------------------------------------
+
+#ifndef FrmOptionFH
+#define FrmOptionFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <ExtCtrls.hpp>
+#include <Graphics.hpp>
+//---------------------------------------------------------------------------
+class TFrmOption : public TForm
+{
+__published:	// IDE-managed Components
+    TButton *btnClose;
+    TPanel *pnlLeft;
+    TPanel *plServerInfo;
+    TImage *Image3;
+    TPanel *Panel1;
+    TPanel *Panel10;
+    TLabel *Label2;
+    TPanel *plIpAddress;
+    TPanel *Panel26;
+    TLabel *Label4;
+    TPanel *plCenterPort;
+    TPanel *Panel2;
+    TLabel *Label11;
+    TPanel *Panel13;
+    TLabel *Label10;
+    TPanel *plSystemId;
+    TPanel *Panel5;
+    TPanel *Panel19;
+    TLabel *Label15;
+    TPanel *Panel20;
+    TLabel *Label16;
+    TPanel *plTot;
+    TPanel *Panel22;
+    TLabel *Label17;
+    TPanel *plNor;
+    TPanel *Panel25;
+    TLabel *Label18;
+    TPanel *plErr;
+    TPanel *Panel4;
+    TPanel *Panel6;
+    TImage *Image1;
+    TCheckBox *chkInfo;
+    TCheckBox *chkData;
+    TCheckBox *chkDetail;
+    TCheckBox *chkError;
+    TCheckBox *chkWarning;
+    TCheckBox *chkDebug;
+    TButton *btnSetLog;
+    TPanel *Panel7;
+    TPanel *Panel3;
+    TLabel *Label1;
+    TPanel *plProcessId;
+    TPanel *Panel24;
+    TLabel *Label3;
+    TPanel *plVmsPort;
+    TPanel *Panel9;
+    TLabel *Label9;
+    TPanel *plVmsConPort;
+    void __fastcall btnCloseClick(TObject *Sender);
+    void __fastcall btnSetLogClick(TObject *Sender);
+    void __fastcall FormShow(TObject *Sender);
+private:	// User declarations
+public:		// User declarations
+    bool    FUpdate;
+    __fastcall TFrmOption(TComponent* Owner);
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TFrmOption *FrmOption;
+//---------------------------------------------------------------------------
+#endif

+ 87 - 0
SRC/FRM/FrmSysLogF.cpp

@@ -0,0 +1,87 @@
+//---------------------------------------------------------------------------
+
+#include <vcl.h>
+#pragma hdrstop
+
+#include "FrmSysLogF.h"
+#include "AppGlobalF.h"
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma resource "*.dfm"
+TFrmSysLog *FrmSysLog = NULL;
+//---------------------------------------------------------------------------
+__fastcall TFrmSysLog::TFrmSysLog(TComponent* Owner)
+    : TForm(Owner)
+{
+    reMsg->Lines->Clear();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmSysLog::btnClearClick(TObject *Sender)
+{
+#if 0
+    lbLog->Items->Clear();
+#else
+    reMsg->Lines->Clear();
+#endif
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmSysLog::btnCopyClick(TObject *Sender)
+{
+    try
+    {
+        reMsg->SelectAll();
+        reMsg->CopyToClipboard();
+    }
+    catch(Exception &e)
+    {
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmSysLog::OnWMLogDisplayMessage(TMessage &Msg)
+{
+    IPC_LOG_MESSAGE *pLog = (IPC_LOG_MESSAGE *)Msg.WParam;
+
+    if (pLog)
+    {
+        IPC_LOG_MESSAGE Log;
+        Log.Kind = pLog->Kind;
+        Log.Flag = pLog->Flag;
+        Log.Len  = pLog->Len;
+        Log.Tm   = pLog->Tm;
+        memcpy(Log.Msg, pLog->Msg, sizeof(Log.Msg));
+
+        //SAFE_DELETE(pLog);
+
+        //ReplyMessage(0);
+
+        if (chkLogPause->Checked) return;
+        LogWrite(&Log);
+    }
+}
+//---------------------------------------------------------------------------
+
+void TFrmSysLog::LogWrite(IPC_LOG_MESSAGE *ALog)
+{
+#if 0
+	if(lbLog->Items->Count > g_AppCfg.nMaxLogLines) lbLog->Items->Delete(lbLog->Items->Count-1);
+	lbLog->Items->Insert(0, ALog->Tm.FormatString("hh:nn:ss") + String(ALog->Msg));
+#else
+
+    try
+    {
+        while (reMsg->Lines->Count >= g_AppCfg.nMaxLogLines)
+            reMsg->Lines->Delete(0);
+
+        reMsg->Lines->Add(ALog->Tm.FormatString("hh:nn:ss") + String(ALog->Msg));
+    }
+    __finally
+    {
+        //Application->ProcessMessages();
+    }
+#endif
+}
+//---------------------------------------------------------------------------
+

+ 275 - 0
SRC/FRM/FrmSysLogF.dfm

@@ -0,0 +1,275 @@
+object FrmSysLog: TFrmSysLog
+  Left = 0
+  Top = 0
+  Align = alClient
+  BorderStyle = bsNone
+  Caption = 'System'
+  ClientHeight = 299
+  ClientWidth = 802
+  Color = clWhite
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -12
+  Font.Name = 'Tahoma'
+  Font.Style = []
+  OldCreateOrder = False
+  ShowHint = True
+  PixelsPerInch = 96
+  TextHeight = 14
+  object plServerInfo: TPanel
+    AlignWithMargins = True
+    Left = 2
+    Top = 2
+    Width = 798
+    Height = 297
+    Margins.Left = 2
+    Margins.Top = 2
+    Margins.Right = 2
+    Margins.Bottom = 0
+    Align = alClient
+    Alignment = taLeftJustify
+    BevelKind = bkSoft
+    BevelOuter = bvNone
+    ParentBackground = False
+    ParentColor = True
+    TabOrder = 0
+    object Panel1: TPanel
+      Left = 0
+      Top = 0
+      Width = 794
+      Height = 30
+      Align = alTop
+      BevelOuter = bvNone
+      TabOrder = 0
+      object Image1: TImage
+        Left = 0
+        Top = 0
+        Width = 30
+        Height = 30
+        Align = alLeft
+        Center = True
+        Picture.Data = {
+          07544269746D6170360C0000424D360C00000000000036000000280000002000
+          0000200000000100180000000000000C00001217000012170000000000000000
+          0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3927255226209A715D86776FFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFF30282774241AE7A34ED77F3EA82110C266378577
+          6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFF28282857281FFFF173E7B04EE7AB4ED7843ED7813EA82110C167
+          38837771FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFF3D2B24DFC76AD79D3EFFFE66E7BC4EE7B54ED78B3ED7853EC3592AA821
+          10BE683B827872FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFF743E1AE7CB4ED7A33EFFFF66E7C54EE7C24ED7933ED78D3EC35E2AD785
+          3EA82110BC683D817874FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFF74471AE7D04ED7AB3EFFFF66E7C84EE7C64ED79B3ED7963EC3632AD78B
+          3ED7883EA82210BA693F7F7976FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFF6F4F1BE7D44ED7B33EFFFF66E7CC4EE7CA4ED7A23ED79D3EC36A2AD795
+          3ED7903ED78B3EA82310B86B417A7A7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFF6C571CE7D94ED7BB3EFFFF66E7D14EA85052D7A83ED7A53EC3722AD79C
+          3ED7993ED7933E9825138C776A7A7A7A7A7A7AFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFF6C611FE7DE62D7C343FFFF66FF8A20E7D34ED7B03ED7AC3EC37B2AD7A3
+          3ED7A03ED79B3E4F28217A7A7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFF6C6321E7E277D7CA55FFFF7DE7DA51E7D74ED7B83ED7B33EC3872AD7AB
+          3ED7A53ED3A2432C2827FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFF665F23E7E38DD7CF66FFFF98E7DF68FFFF76FFFF66D7BB3EC3932AD7B1
+          3ED7AE3ECEA74B282828FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFF645E25E7E3A1D7D075FFFFB3FFFFA4E7E171E7DE65E7DB59C39F2AD7B8
+          3ED7B53ED6B03F2E2A27FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFF343328FFFFEBFFFFDAE7E39DE7E391FFFFAEFFFFA0FFFF8FFFFF7FD7C1
+          42D7BD3ED7B83E453323FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3927255226209A715D86776F
+          FFFFFFFFFFFF2C2C28DDDBBBFFFFE2FFFFD6FFFFC7FFFFB8FFFFACFFFF9BFFFF
+          8AD7C549D7BF3F5D441E282828FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFF30282774241AE7A34ED77F3EA82110C26637
+          85776FFFFFFFFFFFFF2B2B28FFFFFAFFFFEBFFFFDFFFFFD1FFFFC4FFFFB5FFFF
+          A4FFFF96D7C8506C571D282828282828FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFF28282857281FFFF173E7B04EE7AB4ED7843ED7813EA82110
+          C16738837771FFFFFFFFFFFF2B2B28FFFFFDFFFFF2FFFFE9FFFFDAFFFFCEFFFF
+          BFFFFFB0FFFFBC3B3825282828282828282828FFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFF3D2B24DFC76AD79D3EFFFE66E7BC4EE7B54ED78B3ED7853EC3592A
+          A82110BE683B827872FFFFFFFFFFFF2A2A28FFFFFFFFFFFAFFFFF0FFFFE4FFFF
+          E0484426282828FFFFFFFFFFFF282828282828FFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFF743E1AE7CB4ED7A33EFFFF66E7C54EE7C24ED7933ED78D3EC35E2A
+          D7853EA82110BC683D817874FFFFFFFFFFFF2A2A28FFFFFFFFFFFF5551282828
+          28FFFFFFFFFFFFFFFFFF282828282828282828FFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFF74471AE7D04ED7AB3EFFFF66E7C84EE7C64ED79B3ED7963EC3632A
+          D78B3ED7883EA82210BA693F7F7976FFFFFFFFFFFF2828282B2B28FFFFFFFFFF
+          FFFFFFFF282828282828282828282828FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFF6F4F1BE7D44ED7B33EFFFF66E7CC4EE7CA4ED7A23ED79D3EC36A2A
+          D7953ED7903ED78B3EA82310B86B417A7A7AFFFFFFFFFFFFFFFFFFFFFFFF2828
+          28282828282828282828FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFF6C571CE7D94ED7BB3EFFFF66E7D14EA85052D7A83ED7A53EC3722A
+          D79C3ED7993ED7933E9825138C776A7A7A7AFFFFFFFFFFFF2828282828282828
+          28282828FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFF6C611FE7DE62D7C343FFFF66FF8A20E7D34ED7B03ED7AC3EC37B2A
+          D7A33ED7A03ED79B3E4F2821E5E5E5E5E5E52828282828282828282828282828
+          28282828282828FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFF6C6321E7E277D7CA55FFFF7DE7DA51E7D74ED7B83ED7B33EC3872A
+          D7AB3ED7A53ED3A2432C2827282828282828282828282828FFFFFFFFFFFFFFFF
+          FF2828286A6A6A282828FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFF665F23E7E38DD7CF66FFFF98E7DF68FFFF76FFFF66D7BB3EC3932A
+          D7B13ED7AE3ECEA74B282828282828282828FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFF2828286A6A6A6A6A6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFF645E25E7E3A1D7D075FFFFB3FFFFA4E7E171E7DE65E7DB59C39F2A
+          D7B83ED7B53ED6B03F2E2A27FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFF6A6A6A9B9B9B9B9B9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFF343328FFFFEBFFFFDAE7E39DE7E391FFFFAEFFFFA0FFFF8FFFFF7F
+          D7C142D7BD3ED7B83E453323FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFF9B9B9BFFFFFF9B9B9BFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFF2C2C28DDDBBBFFFFE2FFFFD6FFFFC7FFFFB8FFFFACFFFF9B
+          FFFF8AD7C549D7BF3F5D441EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFF9B9B9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFF2B2B28FFFFFAFFFFEBFFFFDFFFFFD1FFFFC4FFFFB5
+          FFFFA4FFFF96D7C8506C571DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFF2B2B28FFFFFDFFFFF2FFFFE9FFFFDAFFFFCE
+          FFFFBFFFFFB0FFFFBC3B3825FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A2A28FFFFFFFFFFFAFFFFF0FFFFE4
+          FFFFE0484426282828FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A2A28FFFFFFFFFFFF555128
+          282828FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2828282B2B28FFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFF}
+        Stretch = True
+        Transparent = True
+      end
+      object Panel2: TPanel
+        Left = 30
+        Top = 0
+        Width = 107
+        Height = 30
+        Align = alLeft
+        BevelOuter = bvNone
+        Caption = 'VMS Server Log'
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = 'Tahoma'
+        Font.Style = [fsBold]
+        ParentFont = False
+        TabOrder = 0
+      end
+      object chkLogPause: TCheckBox
+        Left = 647
+        Top = 0
+        Width = 53
+        Height = 30
+        Cursor = crHandPoint
+        Hint = 'Log Message Display pause/start'
+        Align = alRight
+        Caption = 'Pause'
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = 'Tahoma'
+        Font.Style = []
+        ParentFont = False
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 1
+      end
+      object btnClear: TButton
+        Left = 700
+        Top = 0
+        Width = 47
+        Height = 30
+        Cursor = crHandPoint
+        Hint = 'Log Message Clear'
+        Align = alRight
+        Caption = 'Clear'
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = 'Tahoma'
+        Font.Style = []
+        ParentFont = False
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 2
+        OnClick = btnClearClick
+      end
+      object btnCopy: TButton
+        Left = 747
+        Top = 0
+        Width = 47
+        Height = 30
+        Cursor = crHandPoint
+        Hint = 'Log Message Copy To Clipboard'
+        Align = alRight
+        Caption = 'Copy'
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = 'Tahoma'
+        Font.Style = []
+        ParentFont = False
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 3
+        OnClick = btnCopyClick
+      end
+    end
+    object reMsg: TMemo
+      Left = 0
+      Top = 30
+      Width = 794
+      Height = 263
+      Align = alClient
+      Color = clBlack
+      Font.Charset = DEFAULT_CHARSET
+      Font.Color = clWhite
+      Font.Height = -12
+      Font.Name = 'Hack'
+      Font.Style = []
+      ImeName = 'Microsoft IME 2010'
+      Lines.Strings = (
+        'Local mode          (Remote mode=0, Local mode=1): %d", status.'
+        'Module power                  (normal=0, fault=1): %d", status.'
+        'Signboard power                     (off=0, on=1): %d", status.'
+        'Door                            (open=0, close=1): %d", status.'
+        'Fan                                 (off=0, on=1): %d", status.'
+        'Luminance mode(00:'#51088#46041', 01:'#51452#44036#49688#46041', 02:'#50556#44036#49688#46041'): %d", status.'
+        '')
+      ParentFont = False
+      ReadOnly = True
+      ScrollBars = ssBoth
+      TabOrder = 1
+      WordWrap = False
+    end
+    object lbLog: TListBox
+      Left = 516
+      Top = 120
+      Width = 184
+      Height = 141
+      Color = clBlack
+      Font.Charset = DEFAULT_CHARSET
+      Font.Color = clWhite
+      Font.Height = -12
+      Font.Name = 'Hack'
+      Font.Style = []
+      ImeName = 'Microsoft IME 2003'
+      ItemHeight = 15
+      ParentFont = False
+      TabOrder = 2
+      Visible = False
+    end
+  end
+end

+ 50 - 0
SRC/FRM/FrmSysLogF.h

@@ -0,0 +1,50 @@
+//---------------------------------------------------------------------------
+
+#ifndef FrmSysLogFH
+#define FrmSysLogFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <Buttons.hpp>
+#include <ExtCtrls.hpp>
+#include <Graphics.hpp>
+#include <ComCtrls.hpp>
+//---------------------------------------------------------------------------
+#include "ITSLogF.h"
+#include "AppGlobalF.h"
+//---------------------------------------------------------------------------
+class TFrmSysLog : public TForm
+{
+__published:	// IDE-managed Components
+    TPanel *plServerInfo;
+    TPanel *Panel1;
+    TImage *Image1;
+    TPanel *Panel2;
+    TCheckBox *chkLogPause;
+    TButton *btnClear;
+    TButton *btnCopy;
+    TMemo *reMsg;
+    TListBox *lbLog;
+    void __fastcall btnClearClick(TObject *Sender);
+    void __fastcall btnCopyClick(TObject *Sender);
+
+private:	// User declarations
+public:
+
+public:		// User declarations
+    __fastcall TFrmSysLog(TComponent* Owner);
+
+    void LogWrite(IPC_LOG_MESSAGE *ALog);
+
+	void __fastcall OnWMLogDisplayMessage(TMessage &Msg);
+
+	BEGIN_MESSAGE_MAP
+		MESSAGE_HANDLER(WM_LOG_DISPLAY, TMessage, OnWMLogDisplayMessage)
+	END_MESSAGE_MAP(TForm)
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TFrmSysLog *FrmSysLog;
+//---------------------------------------------------------------------------
+#endif

+ 598 - 0
SRC/FRM/FrmVmsInfoF.cpp

@@ -0,0 +1,598 @@
+//---------------------------------------------------------------------------
+
+#include <vcl.h>
+#pragma hdrstop
+
+#include "FrmVmsInfoF.h"
+#include "FrmVmsLogF.h"
+#include "FrmMainF.h"
+#include "AppGlobalF.h"
+#include "VMSCThread.h"
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma link "cxCalc"
+#pragma link "cxClasses"
+#pragma link "cxControls"
+#pragma link "cxCustomData"
+#pragma link "cxData"
+#pragma link "cxDataStorage"
+#pragma link "cxEdit"
+#pragma link "cxFilter"
+#pragma link "cxGraphics"
+#pragma link "cxGrid"
+#pragma link "cxGridCustomTableView"
+#pragma link "cxGridCustomView"
+#pragma link "cxGridLevel"
+#pragma link "cxGridTableView"
+#pragma link "cxLabel"
+#pragma link "cxLookAndFeelPainters"
+#pragma link "cxLookAndFeels"
+#pragma link "cxStyles"
+#pragma resource "*.dfm"
+TFrmVmsInfo *FrmVmsInfo = NULL;
+
+String VmsModuleType(TVmsCtlr *AObj)
+{
+#ifdef LANG_ENG
+    if (AObj->VmsType == "VUTN") return "Text";
+    return "Figure";
+#else
+    if (AObj->VmsType == "VUTN") return "문자식";
+    return "도형식";
+#endif
+}
+//---------------------------------------------------------------------------
+
+String VmsOperMode(TVmsCtlr *AObj)
+{
+#ifdef LANG_ENG
+    if (AObj->OPER_MODE == "A") return "Auto";
+    return "Fixed";
+#else
+    if (AObj->OPER_MODE == "A") return "자동";
+    return "고정";
+#endif
+}
+//---------------------------------------------------------------------------
+
+String VmsComm(TVmsCtlr *AObj)
+{
+#ifdef LANG_ENG
+    if (AObj->Client.Comm == state_open) return "Normal";
+    return "Error";
+#else
+    if (AObj->Client.Comm == state_open) return "정상";
+    return "장애";
+#endif
+}
+//---------------------------------------------------------------------------
+
+String VmsModuleState(TVmsCtlr *AObj)
+{
+#ifdef LANG_ENG
+    if (AObj->Client.Comm != state_open) return "-";
+    if (AObj->RSTATE.ModuleState == vms_normal) return "Normal";
+    return "Error";
+#else
+    if (AObj->Client.Comm != state_open) return "-";
+    if (AObj->RSTATE.ModuleState == vms_normal) return "정상";
+    return "장애";
+#endif
+}
+//---------------------------------------------------------------------------
+
+String VmsModulePower(TVmsCtlr *AObj)
+{
+#ifdef LANG_ENG
+    if (AObj->Client.Comm != state_open) return "-";
+    if (AObj->RSTATE.ModulePowerStatus == vms_on) return "On";
+    return "Off";
+#else
+    if (AObj->Client.Comm != state_open) return "-";
+    if (AObj->RSTATE.ModulePowerStatus == vms_on) return "켜짐";
+    return "꺼짐";
+#endif
+}
+//---------------------------------------------------------------------------
+
+String VmsModuleLuminance(TVmsCtlr *AObj)
+{
+    if (AObj->Client.Comm != state_open) return "-";
+    int nLuminance = AObj->RSTATE.LuminanceStatus;
+    return String(nLuminance);
+}
+//---------------------------------------------------------------------------
+
+String VmsModuleDoor(TVmsCtlr *AObj)
+{
+#ifdef LANG_ENG
+    if (AObj->Client.Comm != state_open) return "-";
+    if (AObj->RSTATE.DoorStatus == vms_open) return "Open";
+    return "Close";
+#else
+    if (AObj->Client.Comm != state_open) return "-";
+    if (AObj->RSTATE.DoorStatus == vms_open) return "열림";
+    return "닫힘";
+#endif
+}
+//---------------------------------------------------------------------------
+
+
+String VmsModuleFan(TVmsCtlr *AObj)
+{
+#ifdef LANG_ENG
+    if (AObj->Client.Comm != state_open) return "-";
+    if (AObj->RSTATE.FanStatus == vms_on) return "On";
+    return "Off";
+#else
+    if (AObj->Client.Comm != state_open) return "-";
+    if (AObj->RSTATE.FanStatus == vms_on) return "동작";
+    return "정지";
+#endif
+}
+//---------------------------------------------------------------------------
+
+
+String VmsModuleHeater(TVmsCtlr *AObj)
+{
+#ifdef LANG_ENG
+    if (AObj->Client.Comm != state_open) return "-";
+    if (AObj->RSTATE.HeaterStatus == vms_on) return "On";
+    return "Off";
+#else
+    if (AObj->Client.Comm != state_open) return "-";
+    if (AObj->RSTATE.HeaterStatus == vms_on) return "가동";
+    return "중지";
+#endif
+}
+//---------------------------------------------------------------------------
+
+
+String VmsModuleTemp(TVmsCtlr *AObj)
+{
+    if (AObj->Client.Comm != state_open) return "-";
+    int nTemp = AObj->RSTATE.BodyTemp;
+    return String(nTemp);//+"℃";
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+__fastcall TFrmVmsInfo::TFrmVmsInfo(TComponent* Owner)
+    : TForm(Owner)
+{
+    FViewMode = 0;
+    FVmsCnt = 0;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmVmsInfo::InitVmsList()
+{
+    int nRow;
+    TcxDataController *pGDC = TvList->DataController;
+
+    try
+    {
+        TvList->BeginUpdate();
+        pGDC->BeginUpdate();
+        pGDC->RecordCount = 0;
+
+        VmsIterator it;
+        for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
+        {
+            TVmsCtlr *pObj = (TVmsCtlr*)it->second;
+            nRow = pGDC->AppendRecord();
+
+            pGDC->Values[nRow][Col00->Index] = process_stop;
+            pGDC->Values[nRow][Col01->Index] = "";
+            pGDC->Values[nRow][Col02->Index] = pObj->VmsNo;
+            pGDC->Values[nRow][Col03->Index] = pObj->VmsId;
+            pGDC->Values[nRow][Col04->Index] = pObj->Name;
+            pGDC->Values[nRow][Col05->Index] = pObj->IpAddress + "." + String(pObj->LocalNo);
+            pGDC->Values[nRow][Col06->Index] = "-";
+            pGDC->Values[nRow][Col07->Index] = "-";
+            pGDC->Values[nRow][Col08->Index] = "-";
+            pGDC->Values[nRow][Col09->Index] = "-";
+            pGDC->Values[nRow][Col10->Index] = "-";
+            pGDC->Values[nRow][Col11->Index] = "-";
+            pGDC->Values[nRow][Col12->Index] = "-";
+            pGDC->Values[nRow][Col13->Index] = "-";
+            pGDC->Values[nRow][Col14->Index] = "-";
+            pGDC->Values[nRow][Col15->Index] = "-";
+
+            pGDC->Values[nRow][Col99->Index] = (int)pObj;
+
+            pObj->RowNo = nRow;
+        }
+    }
+    __finally
+    {
+        pGDC->EndUpdate();
+        TvList->EndUpdate();
+        FVmsCnt = pGDC->RecordCount;
+    }
+
+    VmsManager->Total  = VmsManager->Count;
+    VmsManager->Error  = VmsManager->Count;
+    VmsManager->Normal = 0;
+    VmsManager->Module = 0;
+
+    plTot->Caption = String(VmsManager->Count);
+    plErr->Caption = String(VmsManager->Count);
+    plNor->Caption = "0";
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmVmsInfo::UpdateServerState(int AObj)
+{
+    TcxDataController *pGDC = TvList->DataController;
+    try
+    {
+        int       nErrCnt = 0;
+        int       nMemPtr;
+        TVmsCtlr *pObj;
+        for (int nRow = 0; nRow < FVmsCnt; nRow++)
+        {
+            nMemPtr = pGDC->Values[nRow][Col99->Index];
+            pObj = (TVmsCtlr*)nMemPtr;
+            if (!pObj) continue;
+
+            //TODO
+            pGDC->Values[nRow][Col00->Index] = pObj->Client.Comm;
+            pObj->Server.Status = pObj->Client.Comm == state_open ? process_run : process_fail;
+            if (pObj->Server.Status != process_run)
+            {
+                pGDC->Values[nRow][Col00->Index] = process_stop;
+                nErrCnt++;
+            }
+            pGDC->Values[nRow][Col14->Index] = pObj->ConnectTm;       //Connect
+            pGDC->Values[nRow][Col15->Index] = pObj->DisconnectTm;    //Disconnect
+        }
+
+        VmsManager->Error  = nErrCnt;
+        VmsManager->Normal = FVmsCnt-nErrCnt;
+        plTot->Caption = String(FVmsCnt);
+        plErr->Caption = String(nErrCnt);
+        plNor->Caption = String(FVmsCnt-nErrCnt);
+    }
+    catch(Exception &e)
+    {
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmVmsInfo::UpdateClientState(int AObj)
+{
+#ifdef LANG_ENG
+    String sNormal = "Normal";
+    String sError  = "Error";
+#else
+    String sNormal = "정상";
+    String sError  = "오류";
+#endif
+
+    TcxDataController *pGDC = TvList->DataController;
+    try
+    {
+        int       nMemPtr;
+        TVmsCtlr *pObj;
+        for(int nRow = 0; nRow < FVmsCnt; nRow++)
+        {
+            nMemPtr = pGDC->Values[nRow][Col99->Index];
+            pObj = (TVmsCtlr*)nMemPtr;
+            if (!pObj) continue;
+
+            if (pObj->Client.Status == process_run)
+            {
+                if (pObj->Client.Comm == state_open)
+                    pGDC->Values[nRow][Col06->Index] = sNormal;
+                else
+                    pGDC->Values[nRow][Col06->Index] = "-";
+            }
+            else
+            {
+                pGDC->Values[nRow][Col06->Index] = sError;
+            }
+
+            pGDC->Values[nRow][Col07->Index] = VmsModuleState(pObj);      //모듈
+            pGDC->Values[nRow][Col08->Index] = VmsModuleLuminance(pObj);  //휘도
+            pGDC->Values[nRow][Col09->Index] = VmsModulePower(pObj);      //전원
+            pGDC->Values[nRow][Col10->Index] = VmsModuleDoor(pObj);       //도어
+            pGDC->Values[nRow][Col11->Index] = VmsModuleFan(pObj);        //팬
+            pGDC->Values[nRow][Col12->Index] = VmsModuleHeater(pObj);     //히터
+            pGDC->Values[nRow][Col13->Index] = VmsModuleTemp(pObj);       //온도
+        }
+    }
+    catch(Exception &e)
+    {
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmVmsInfo::Col01CustomDrawCell(TcxCustomGridTableView *Sender, TcxCanvas *ACanvas,
+          TcxGridTableDataCellViewInfo *AViewInfo, bool &ADone)
+{
+    if (AViewInfo->GridRecord->RecordIndex < 0) return;
+
+    Graphics::TBitmap *pBmp = NULL;
+    pBmp = ImgState1->Picture->Bitmap;
+	if (!VarIsNull(AViewInfo->GridRecord->DisplayTexts[Col00->Index]))
+    {
+        String sCode = AViewInfo->GridRecord->DisplayTexts[Col00->Index];
+        int    nCode = sCode.ToIntDef(2);
+
+        if      (nCode == process_run ) pBmp = ImgState0->Picture->Bitmap;
+        else if (nCode == process_stop) pBmp = ImgState1->Picture->Bitmap;
+        else                            pBmp = ImgState3->Picture->Bitmap;
+    }
+
+    if (!pBmp) return;
+    pBmp->Transparent = true;
+
+    int nW, nH;
+    nW = nH = 21;
+    try
+    {
+        TColor bBrush = ACanvas->Brush->Color;
+        if (AViewInfo->GridRecord->Selected)
+        {
+            if (AViewInfo->GridRecord->Index % 2 == 0)
+            {
+                bBrush = Sender->LookAndFeelPainter->DefaultContentEvenColor();
+            }
+            else
+            {
+                bBrush = Sender->LookAndFeelPainter->DefaultContentOddColor();
+            }
+        }
+        ACanvas->Brush->Color = bBrush;
+
+        TRect rc;
+        TRect rcOrg = AViewInfo->Bounds;
+        ACanvas->FillRect(rcOrg);
+
+        nW = rcOrg.Bottom - rcOrg.Top - 4;
+        rc.Top    = rcOrg.Top+2;
+        rc.Bottom = rcOrg.Bottom - 2;
+        rc.Left   = rcOrg.Left + (rcOrg.Width() - nW) / 2;
+        rc.Right  = rc.Left + nW;
+
+        ACanvas->Canvas->StretchDraw(rc, pBmp);
+        //ACanvas->Draw(AViewInfo->ContentBounds.Left, AViewInfo->ContentBounds.Top, pBmp);
+        ADone = true;
+    }
+    catch(...) {}
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmVmsInfo::TvListCellDblClick(TcxCustomGridTableView *Sender, TcxGridTableDataCellViewInfo *ACellViewInfo,
+          TMouseButton AButton, TShiftState AShift,
+          bool &AHandled)
+{
+    if (!ACellViewInfo) return;
+    try {
+        TcxDataController *pGDC = TvList->DataController;
+        int nRow = pGDC->FocusedRecordIndex;
+        if (nRow < 0) return;
+
+        int nMemPtr = pGDC->Values[nRow][Col99->Index];
+        if (!nMemPtr) return;
+
+        if (!FrmVmsLog->Showing)
+        {
+            FrmVmsLog->Top = FrmMain->Top;
+            //FrmVmsLog->Left= FrmMain->Left+FrmMain->Width;
+            FrmVmsLog->Show();
+        }
+        FrmVmsLog->DisplayVmsLog(nMemPtr);
+    } catch(...) {}
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmVmsInfo::TvListCellClick(TcxCustomGridTableView *Sender, TcxGridTableDataCellViewInfo *ACellViewInfo,
+          TMouseButton AButton, TShiftState AShift,
+          bool &AHandled)
+{
+	if (AButton != mbRight) return;
+    if (!ACellViewInfo) return;
+
+    try {
+        TcxDataController *pGDC = TvList->DataController;
+        int nRow = pGDC->FocusedRecordIndex;
+        if (nRow < 0) return;
+
+        FSelVmsNo = VarToStr(pGDC->Values[nRow][Col02->Index]);
+        FSelVmsNm = VarToStr(pGDC->Values[nRow][Col04->Index]);
+
+        POINT p;
+        GetCursorPos(&p);
+
+        pmuVms->Popup(p.x, p.y);
+    } catch(...) {}
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmVmsInfo::pmuVmsPopup(TObject *Sender)
+{
+    MnuVmsId->Caption = FSelVmsNm;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmVmsInfo::mnuVmsPowerOnClick(TObject *Sender)
+{
+    TMenuItem *pMnu = (TMenuItem*)Sender;
+
+    TVmsCtlr *pObj = VmsManager->FLists.Find(FSelVmsNo);
+    if (!pObj) return;
+
+    if (pObj->Server.Status != process_run) return;
+
+    if (!pObj->pPackQueue) return;
+
+    String sVmsNmbr = FSelVmsNo;
+
+    int nCmdIdx;
+    if (pMnu->Tag == 0)
+        nCmdIdx = vms_board_power_on;
+    else
+    if (pMnu->Tag == 1)
+        nCmdIdx = vms_board_power_off;
+    else
+    if (pMnu->Tag == 2)
+    {
+        nCmdIdx = 2;
+    }
+    else
+        return;
+
+    String sCmdUser = "server";
+    String sCmdTime = Now().FormatString("yyyymmddhhnnss");
+    BYTE   OpCode;
+
+    if (nCmdIdx == vms_board_power_on || nCmdIdx == vms_board_power_off)
+    {
+        OpCode = INT_OP_VMS_POWER_CTL;
+
+        // 전광판 On(=0)/Off(=1)
+        INT_VMS_POWER_CTL_REQ VmsPowerCtl;
+        BYTE                  MsgSeq;
+
+        memset(&VmsPowerCtl, 0x00, sizeof(VmsPowerCtl));
+
+        MsgSeq = (BYTE)0x10;                                                            // 제어명령 일련번호-결과값을 받아서 처리할때 필요함
+
+        memcpy(VmsPowerCtl.CmdTime, AnsiString(sCmdTime).c_str(), INT_VMS_MAX_DATETIME); /* 명령수행시각 */
+        memcpy(VmsPowerCtl.VmsId,   AnsiString(sVmsNmbr).c_str(), INT_VMS_MAX_ID);       /* VMS 제어기 번호 */
+        memcpy(VmsPowerCtl.OperId,  AnsiString(sCmdUser).c_str(), INT_VMS_MAX_OPER_ID);  /* 운영자 ID */
+        VmsPowerCtl.Command = (BYTE)nCmdIdx;                                            /* 제어 구분, 0:켜짐 1:꺼짐 */
+
+        IPCUDPPACKET *pPI = new IPCUDPPACKET;
+        if (pPI == NULL) return;
+
+        pPI->Sender.IP   = 0;
+        pPI->Sender.Port = 0;
+        pPI->RecvId      = 0;
+        pPI->OPCode      = OpCode;
+        pPI->Size        = (int)sizeof(VmsPowerCtl);
+        if (pPI->Size > 0)
+        {
+            pPI->Data = new char[pPI->Size];
+            if (!pPI->Data)
+            {
+                delete pPI;
+                return ;
+            }
+            CopyMemory(pPI->Data, (char*)&VmsPowerCtl, pPI->Size);
+        }
+        pObj->pPackQueue->Add((void*)pPI);
+    }
+    else
+    if (nCmdIdx == 2)
+    {
+        OpCode = INT_OP_VMS_RESET;
+
+        // 제어기 리셋
+        INT_VMS_RESET_REQ VmsReset;
+        BYTE              MsgSeq;
+
+        memset(&VmsReset, 0x00, sizeof(VmsReset));
+
+        MsgSeq = (BYTE)0x20;
+        memcpy(VmsReset.CmdTime, AnsiString(sCmdTime).c_str(), INT_VMS_MAX_DATETIME); /* 명령수행시각 */
+        memcpy(VmsReset.VmsId,   AnsiString(sVmsNmbr).c_str(), INT_VMS_MAX_ID);       /* VMS 제어기 번호 */
+        memcpy(VmsReset.OperId,  AnsiString(sCmdUser).c_str(), INT_VMS_MAX_OPER_ID);  /* 운영자 ID */
+
+        IPCUDPPACKET *pPI = new IPCUDPPACKET;
+        if (pPI == NULL) return;
+
+        pPI->Sender.IP   = 0;
+        pPI->Sender.Port = 0;
+        pPI->RecvId      = 0;
+        pPI->OPCode      = OpCode;
+        pPI->Size        = (int)sizeof(VmsReset);
+        if (pPI->Size > 0)
+        {
+            pPI->Data = new char[pPI->Size];
+            if (!pPI->Data)
+            {
+                delete pPI;
+                return ;
+            }
+            CopyMemory(pPI->Data, (char*)&VmsReset, pPI->Size);
+        }
+        pObj->pPackQueue->Add((void*)pPI);
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmVmsInfo::mnuVmsStatusReqClick(TObject *Sender)
+{
+    TVmsCtlr *pObj = VmsManager->FLists.Find(FSelVmsNo);
+    if (!pObj) return;
+
+    if ((pObj->Client.pThread         != NULL) &&
+        (pObj->Client.ActiveIndicator == true))
+    {
+        try
+        {
+            TVMSCThread *pVMSCThread = (TVMSCThread *)pObj->Client.pThread;
+            pVMSCThread->ReqStatus();
+        }
+        catch(Exception &e)
+        {
+        }
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmVmsInfo::mnuVmsFormDnClick(TObject *Sender)
+{
+    TVmsCtlr *pObj = VmsManager->FLists.Find(FSelVmsNo);
+    if (!pObj) return;
+
+    if ((pObj->Client.pThread         != NULL) &&
+        (pObj->Client.ActiveIndicator == true))
+    {
+        TVmsFormManager *m_pVmsFormList = pObj->pForms;
+
+		m_pVmsFormList->Lock();
+		try
+		{
+            int nFormCnt = m_pVmsFormList->Count();
+            for (int ii = 0; ii < nFormCnt; ii++)
+            {
+                TVmsForm *pVmsForm = m_pVmsFormList->GetItem(ii);
+                if (pVmsForm)
+                {
+                    pVmsForm->SvcRes = false;
+                }
+            }
+		}
+		__finally
+		{
+            pObj->CTLMODE->Enable = object_enable;
+			m_pVmsFormList->UnLock();
+		}
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmVmsInfo::Disconnect1Click(TObject *Sender)
+{
+    TVmsCtlr *pObj = VmsManager->FLists.Find(FSelVmsNo);
+    if (!pObj) return;
+
+    if ((pObj->Client.pThread         != NULL) &&
+        (pObj->Client.ActiveIndicator == true))
+    {
+        try
+        {
+            TVMSCThread *pVMSCThread = (TVMSCThread *)pObj->Client.pThread;
+            pVMSCThread->FUserTerm = true;
+        }
+        catch(Exception &e)
+        {
+        }
+    }
+}
+//---------------------------------------------------------------------------
+

+ 1910 - 0
SRC/FRM/FrmVmsInfoF.dfm

@@ -0,0 +1,1910 @@
+object FrmVmsInfo: TFrmVmsInfo
+  Left = 0
+  Top = 0
+  Align = alClient
+  BorderStyle = bsNone
+  Caption = 'Vms'
+  ClientHeight = 239
+  ClientWidth = 1044
+  Color = clWhite
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -12
+  Font.Name = 'Tahoma'
+  Font.Style = []
+  OldCreateOrder = False
+  ShowHint = True
+  PixelsPerInch = 96
+  TextHeight = 14
+  object plServerInfo: TPanel
+    AlignWithMargins = True
+    Left = 2
+    Top = 2
+    Width = 1040
+    Height = 237
+    Margins.Left = 2
+    Margins.Top = 2
+    Margins.Right = 2
+    Margins.Bottom = 0
+    Align = alClient
+    Alignment = taLeftJustify
+    BevelKind = bkSoft
+    BevelOuter = bvNone
+    ParentBackground = False
+    ParentColor = True
+    TabOrder = 0
+    object Panel1: TPanel
+      Left = 0
+      Top = 0
+      Width = 1036
+      Height = 30
+      Align = alTop
+      BevelOuter = bvNone
+      TabOrder = 0
+      object Image3: TImage
+        Left = 0
+        Top = 0
+        Width = 30
+        Height = 30
+        Align = alLeft
+        Center = True
+        Picture.Data = {
+          07544269746D6170361B0000424D361B00000000000036000000280000003000
+          0000300000000100180000000000001B0000130B0000130B0000000000000000
+          0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFE8ECEFE1E6E9FDFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9DADB454E570D1012131313
+          1D2731878E94FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFAFBFB23282E1400008E3D009A4B015F27000000007D8183FFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFC4CA000000CA6400F07600EA7B0E
+          FF951A7C36000F1822F5F6F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFBEC4CA000000C46100D66A00D6710DF68717873C00141B22F5F6F7FFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFC4CA000000BF5F00D76A00D6710D
+          F586177F3800181F26F7F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFBFC4CA000000BF5F00D76A00D6710DF586177F3800181F26F7F8F8FFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFC4CA000000BF5F00D76A00D6710D
+          F586177F3800181F26F7F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFBFC4CA000000BF5F00D76A00D6710DF586177F3800181F26F7F8F8FFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFC4CA000000BF5F00D76A00D6710D
+          F586177E3700181F27F7F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF868A8E232E
+          3A2931392C343D2C343D2C343D2C343D2C343D2C343D2C343D2C343D2C343D2C
+          343D2C343D2C343D2C343D2C343D2C343D2C343D2C343D2C343D2C343D2C343D
+          2C343D2C343D2C343D2C343D29313A202C3881868BFFFFFFFFFFFFFFFFFFFFFF
+          FFBFC4CA000000BF5F00D76A00D6710DF58617813900161D24F6F7F7FFFFFFFF
+          FFFFFFFFFFFFFFFFAAADAD000000531B007C3500733100733100733100733100
+          7331007331007331007331007331007331007331007331007331007331007331
+          007331007331007331007331007331007331007331007331007331007935005F
+          2000000000878C8DFFFFFFFFFFFFFFFFFFBFC4CA000000BF5F00D76A00D6710D
+          F58617873D0010171EF4F4F5FFFFFFFFFFFFFFFFFFFFFFFF4354643A0C00FF9E
+          11FF8F0FFF8E0DFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF
+          8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0C
+          FF8F0CFF8F0CFF8F0CFF8E0EFF8E0FFFA0114C1600394959FFFFFFFFFFFFFFFF
+          FFBFC4CA000000BF5F00D76A00D6710DF58617873D000F171EF4F4F5FFFFFFFF
+          FFFFFFFFFFFFFFFF4253643F1000FF9410EC7C0CDD740CBB6612B56414B86513
+          B86513B86513B86513B86513B86513B86513B86513B86513B86513B86513B865
+          13B86513B86513B86513B86513B86513B86513B46314C16911E1760CEC7C0DFF
+          920F531D003A4755FFFFFFFFFFFFFFFFFFBFC4CA000000BF5F00D76A00D6710D
+          F58617873D0010171EF4F4F5FFFFFFFFFFFFFFFFFFFFFFFF4354643B0E00FF93
+          0FF17D0991551B262A33342F2F36302F36302F36302F36302F362E2E362E2E36
+          2F2E36302F36302F36302F36302F362F2E362E2E362E2E362F2F36302F36302F
+          36302F312E302D2D31A95F16F68009FF920F4E1A003B4956FFFFFFFFFFFFFFFF
+          FFBFC4CA000000BF5F00D76A00D6710DF58617873D0010171EF4F4F5FFFFFFFF
+          FFFFFFFFFFFFFFFF4354643C0E00FF930EEC7B0A7048221824352E2D302E2D30
+          362F2F362F2F362F2F362F2F362F2F35302F35302F35302F35302F35302F3530
+          2F35302F35302F35302F35302F35302F2E2D302F2D301121378B531CFB8107FF
+          920F4E1A003B4956FFFFFFFFFFFFFFFFFFBFC4CA000000BF5F00D76A00D6710D
+          F58617873D0010171EF4F4F5FFFFFFFFFFFFFFFFFFFFFFFF4354643B0E00FF93
+          0FEC7B0A774B2021283335302F35302F362F2F362F2F362F2F362F2F362F2F35
+          302F35302F35302F35302F35302F35302F35302F35302F35302F35302F35302F
+          35302F35302F1C263491551BF98108FF920F4E1A003B4956FFFFFFFFFFFFFFFF
+          FFBFC4CA000000BF5F00D76A00D6710DF58617873D0010171EF4F4F5FFFFFFFF
+          FFFFFFFFFFFFFFFF4354643B0E00FF930FEC7B0A784B2021283335302F362F2F
+          33F36334FC6533FF66362F2F362F2F35302F33F36334FC6533FF6635302F3530
+          2F35302F33F36334FC6533FF6635302F35302F35302F1C263491551BF98108FF
+          920F4E1A003B4956FFFFFFFFFFFFFFFFFFBFC4CA000000BF5F00D76A00D6710D
+          F58617873D0010171EF4F4F5FFFFFFFFFFFFFFFFFFFFFFFF4354643B0E00FF93
+          0FEC7B0A784B2021283335302F362F2F34FE6533FF6633FF66362F2F362F2F35
+          302F34FE6533FF6633FF6635302F35302F35302F34FE6533FF6633FF6635302F
+          35302F35302F1C263491551BF98108FF920F4A1600495764FFFFFFFFFFFFFFFF
+          FFBFC4CA000000BF5F00D76A00D6710DF58617863C0011181FF4F5F6FFFFFFFF
+          FFFFFFFFFFFFFFFF4354643B0E00FF930FEC7B0A784B20212833362F2F362F2F
+          36EC7338EF7433F864362F2F362F2F35302F36EC7338EF7433F86435302F3530
+          2F35302F36EC7338EF7433F86435302F35302F35302F1C263491551BF98108FF
+          920F642F000011215C6670555D665D6670374350070000C06000D76A00D6710D
+          F686178D40000A1118F1F2F3FFFFFFFFFFFFFFFFFFFFFFFF4354643B0E00FF93
+          0FEC7B0A784B20212833362F2F362F2F362F2F362F2F362F2F362F2F362F2F35
+          302F35302F35302F35302F35302F35302F35302F35302F35302F35302F35302F
+          35302F35302F1C263491551BF98108FF920F6E3B060000000500000600000700
+          000000000D0600C16100D76A00D6710DF68617914300070E14F0F1F1FFFFFFFF
+          FFFFFFFFFFFFFFFF4354643B0E00FF930FEC7B0A784B20212833362F2F362F2F
+          362F2F362F2F362F2F362F2F362F2F35302F35302F35302F35302F35302F3530
+          2F35302F35302F35302F35302F35302F35302F35302F1C263491551BF98108FF
+          920F572F06241100D06700BE5E00D16700894400010000C06000D76A00D6710D
+          F68617904200080F15F0F1F2FFFFFFFFFFFFFFFFFFFFFFFF4354643B0E00FF93
+          0FEC7B0A784B20212833362F2F362F2F362F2F362F2F362F2F362F2F362F2F35
+          302F35302F35302F35302F35302F35302F35302F35302F35302F35302F35302F
+          35302F35302F1C263491551BF98108FF920F522B04311B04F98611E47B0FFA86
+          11A75A0C000000BF6000D76A00D6710DF68617904200080F15F0F1F2FFFFFFFF
+          FFFFFFFFFFFFFFFF4354643B0E00FF930FEC7B0A784B20212833362F2F362F2F
+          33F36334FC6533FF66362F2F362F2F35302F33F36334FC6533FF6635302F3530
+          2F35302F33F36334FC6533FF6635302F35302F35302F1C263491551BF98108FF
+          920F68370500000236220D331F0C38220D1C130A0A0400C16000D76A00D6710D
+          F68617904200080F15F0F1F2FFFFFFFFFFFFFFFFFFFFFFFF4354643B0E00FF93
+          0FEC7B0A784B20212833362F2F362F2F34FE6533FF6633FF66362F2F362F2F35
+          302F34FE6533FF6633FF6635302F35302F35302F34FE6533FF6633FF6635302F
+          35302F35302F1C263491551BF98108FF920F6F3B060000000000000000000000
+          000000000D0600C16100D76A00D6710DF68617904200080F15F0F1F2FFFFFFFF
+          FFFFFFFFFFFFFFFF4354643B0E00FF930FEC7B0A784B20212833362F2F362F2F
+          36EC7338EF7433F864362F2F362F2F35302F36EC7338EF7433F86435302F3530
+          2F35302F36EC7338EF7433F86435302F35302F35302F1C263491551BF98108FF
+          920F5F32050F08018B4B0A8045098C4B0A583007050200C06000D76A00D6710D
+          F68617904200080F15F0F1F2FFFFFFFFFFFFFFFFFFFFFFFF4354643B0E00FF93
+          0FEC7B0A774B20212833362F2F362F2F362F2F362F2F362F2F362F2F362F2F35
+          302F35302F35302F35302F35302F35302F35302F35302F35302F35302F35302F
+          35302F35302F1C263491551BF98108FF920F4F2A06391D00FF8D06FB8106FF8D
+          07B95F05000000BF6000D76A00D6710DF686178F4200080F16F1F1F2FFFFFFFF
+          FFFFFFFFFFFFFFFF4354643C0E00FF930EEC7B0A704722172436362F2F362F2F
+          362F2F362F2F362F2F362F2F362F2F35302F35302F35302F35302F35302F3530
+          2F35302F35302F35302F35302F35302F35302F35302F1021378A531CFB8107FF
+          920F582F061F1100C16506B15C06C265077F4205020100C06000D76A00D6710D
+          F68617914300070E14F0F1F1FFFFFFFFFFFFFFFFFFFFFFFF4354643B0E00FF93
+          0FF17D0994561A2B2C3137302E39312E39312E39312E39312E39312E39312E39
+          312E39312E39312E39312E39312E39312E39312E39312E39312E39312E39312E
+          39312E342F2F312E30AA5F15F57F09FF920F6E3904000004060C11070B0F080C
+          1100030C0C0600CD6700F07600F4800EFF951AA14B0000070EEDEEEFFFFFFFFF
+          FFFFFFFFFFFFFFFF4253643F1000FF9510EB7C0CDF750BC36911BC6613BE6712
+          BE6712BE6712BE6712BE6712BE6712BE6712BE6712BE6712BE6712BE6712BE67
+          12BE6712BE6712BE6712BE6712BE6712BE6712BB6613C96C0FE3780BEC7C0DFF
+          920F5721002F3E4CF8FBFEE4E6E8FAFCFEA8AFB50100009F4B00843400712F00
+          A75200853B00060B10EEEEEFFFFFFFFFFFFFFFFFFFFFFFFF445464370A00FF9D
+          10FF9110FF8E0EFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF
+          8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0C
+          FF8F0CFF8F0CFF8F0CFF8E0EFF8F0FFFA0114A1400404F5FFFFFFFFFFFFFFFFF
+          FFCACACA0000000904040B182605192E0B141D0000000F0E0EEFEFEFFFFFFFFF
+          FFFFFFFFFFFFFFFFACB0B00000004F17007A3500733100733100733100733100
+          7331007331007331007331007331007331007331007331007331007331007331
+          007331007331007331007331007331007331007331007331007230007935005A
+          1D00000000878C8DFFFFFFFFFFFFFFFFFFC5C3C2000000708BAAD2F9FFDCFFFF
+          C5ECFF415670020000EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6AAAE2D39
+          45252D362C343D2C343D2C343D2C343D2C343D2C343D2C343D2C343D2C343D2C
+          343D2C343D2C343D2C343D2C343D2C343D2C343D2C343D2C343D2C343D2C343D
+          2C343D2C343D2C343D2C343D293139242F3B84898EFFFFFFFFFFFFFFFFFFFFFF
+          FFF8F8F72E2E2E151F29526478576A7E4B5C6F0109105B5A58FFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECECEC75737027221E16110C
+          312D28908E8CFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFF}
+        Stretch = True
+        Transparent = True
+      end
+      object Panel2: TPanel
+        Left = 30
+        Top = 0
+        Width = 189
+        Height = 30
+        Align = alLeft
+        BevelOuter = bvNone
+        Caption = 'VMS Controller Information'
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = 'Tahoma'
+        Font.Style = [fsBold]
+        ParentFont = False
+        TabOrder = 0
+        ExplicitLeft = 34
+      end
+      object plErr: TPanel
+        Left = 1008
+        Top = 0
+        Width = 28
+        Height = 30
+        Align = alRight
+        BevelOuter = bvNone
+        Caption = '0'
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clRed
+        Font.Height = -12
+        Font.Name = 'Tahoma'
+        Font.Style = [fsBold]
+        ParentFont = False
+        TabOrder = 1
+      end
+      object Panel6: TPanel
+        Left = 765
+        Top = 0
+        Width = 187
+        Height = 30
+        Align = alRight
+        BevelOuter = bvNone
+        Caption = '(Total/Connect/Disconnect):'
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = 'Tahoma'
+        Font.Style = [fsBold]
+        ParentFont = False
+        TabOrder = 2
+      end
+      object plTot: TPanel
+        Left = 952
+        Top = 0
+        Width = 28
+        Height = 30
+        Align = alRight
+        BevelOuter = bvNone
+        Caption = '0'
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = 'Tahoma'
+        Font.Style = [fsBold]
+        ParentFont = False
+        TabOrder = 3
+      end
+      object plNor: TPanel
+        Left = 980
+        Top = 0
+        Width = 28
+        Height = 30
+        Align = alRight
+        BevelOuter = bvNone
+        Caption = '0'
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clBlue
+        Font.Height = -12
+        Font.Name = 'Tahoma'
+        Font.Style = [fsBold]
+        ParentFont = False
+        TabOrder = 4
+      end
+    end
+    object CxList: TcxGrid
+      Left = 0
+      Top = 30
+      Width = 1036
+      Height = 203
+      Align = alClient
+      TabOrder = 1
+      object TvList: TcxGridTableView
+        Navigator.Buttons.Append.Visible = True
+        Navigator.Buttons.SaveBookmark.Visible = False
+        Navigator.InfoPanel.Visible = True
+        FilterBox.CustomizeDialog = False
+        OnCellClick = TvListCellClick
+        OnCellDblClick = TvListCellDblClick
+        DataController.Summary.DefaultGroupSummaryItems = <>
+        DataController.Summary.FooterSummaryItems = <>
+        DataController.Summary.SummaryGroups = <>
+        FilterRow.InfoText = '<'#44160#49353#50612#47484' '#51077#47141' '#54616#49464#50836'>'
+        OptionsBehavior.CellHints = True
+        OptionsBehavior.ShowLockedStateImageOptions.BestFit = lsimImmediate
+        OptionsBehavior.ShowLockedStateImageOptions.Filtering = lsimImmediate
+        OptionsBehavior.ShowLockedStateImageOptions.Grouping = lsimImmediate
+        OptionsBehavior.ShowLockedStateImageOptions.Sorting = lsimImmediate
+        OptionsCustomize.ColumnFiltering = False
+        OptionsCustomize.ColumnMoving = False
+        OptionsCustomize.ColumnSorting = False
+        OptionsData.CancelOnExit = False
+        OptionsData.Deleting = False
+        OptionsData.DeletingConfirmation = False
+        OptionsData.Editing = False
+        OptionsData.Inserting = False
+        OptionsSelection.HideSelection = True
+        OptionsView.NoDataToDisplayInfoText = '<VMS Controller List>'
+        OptionsView.GroupByBox = False
+        OptionsView.Indicator = True
+        object Col00: TcxGridColumn
+          Caption = 'StateCode'
+          DataBinding.ValueType = 'Integer'
+          PropertiesClassName = 'TcxLabelProperties'
+          Properties.Alignment.Horz = taCenter
+          Properties.Alignment.Vert = taVCenter
+          Visible = False
+          HeaderAlignmentHorz = taCenter
+          HeaderAlignmentVert = vaCenter
+          Options.Editing = False
+          VisibleForCustomization = False
+          Width = 94
+        end
+        object Col01: TcxGridColumn
+          Caption = '-'
+          PropertiesClassName = 'TcxLabelProperties'
+          Properties.Alignment.Horz = taCenter
+          Properties.Alignment.Vert = taVCenter
+          OnCustomDrawCell = Col01CustomDrawCell
+          HeaderAlignmentHorz = taCenter
+          HeaderAlignmentVert = vaCenter
+          MinWidth = 30
+          Options.Editing = False
+          Options.HorzSizing = False
+          Options.Moving = False
+          VisibleForCustomization = False
+          Width = 30
+        end
+        object Col02: TcxGridColumn
+          Caption = 'No'
+          PropertiesClassName = 'TcxLabelProperties'
+          Properties.Alignment.Horz = taCenter
+          Properties.Alignment.Vert = taVCenter
+          HeaderAlignmentHorz = taCenter
+          HeaderAlignmentVert = vaCenter
+          Options.Editing = False
+          VisibleForCustomization = False
+          Width = 59
+        end
+        object Col03: TcxGridColumn
+          Caption = 'ID'
+          PropertiesClassName = 'TcxLabelProperties'
+          Properties.Alignment.Horz = taCenter
+          Properties.Alignment.Vert = taVCenter
+          HeaderAlignmentHorz = taCenter
+          HeaderAlignmentVert = vaCenter
+          Options.Editing = False
+          VisibleForCustomization = False
+          Width = 95
+        end
+        object Col04: TcxGridColumn
+          Caption = 'Location(Name)'
+          PropertiesClassName = 'TcxLabelProperties'
+          Properties.Alignment.Horz = taLeftJustify
+          Properties.Alignment.Vert = taVCenter
+          HeaderAlignmentHorz = taCenter
+          HeaderAlignmentVert = vaCenter
+          Options.Editing = False
+          VisibleForCustomization = False
+          Width = 163
+        end
+        object Col05: TcxGridColumn
+          Caption = 'IP Address'
+          PropertiesClassName = 'TcxLabelProperties'
+          Properties.Alignment.Horz = taCenter
+          Properties.Alignment.Vert = taVCenter
+          HeaderAlignmentHorz = taCenter
+          HeaderAlignmentVert = vaCenter
+          Options.Editing = False
+          VisibleForCustomization = False
+          Width = 111
+        end
+        object Col06: TcxGridColumn
+          Caption = 'Comm.'
+          PropertiesClassName = 'TcxLabelProperties'
+          Properties.Alignment.Horz = taCenter
+          Properties.Alignment.Vert = taVCenter
+          Visible = False
+          HeaderAlignmentHorz = taCenter
+          HeaderAlignmentVert = vaCenter
+          Options.Editing = False
+          VisibleForCustomization = False
+          Width = 50
+        end
+        object Col07: TcxGridColumn
+          Caption = 'Module'
+          PropertiesClassName = 'TcxLabelProperties'
+          Properties.Alignment.Horz = taCenter
+          Properties.Alignment.Vert = taVCenter
+          HeaderAlignmentHorz = taCenter
+          HeaderAlignmentVert = vaCenter
+          Options.Editing = False
+          VisibleForCustomization = False
+          Width = 50
+        end
+        object Col08: TcxGridColumn
+          Caption = 'Lum.'
+          PropertiesClassName = 'TcxLabelProperties'
+          Properties.Alignment.Horz = taCenter
+          Properties.Alignment.Vert = taVCenter
+          Visible = False
+          HeaderAlignmentHorz = taCenter
+          HeaderAlignmentVert = vaCenter
+          Options.Editing = False
+          VisibleForCustomization = False
+          Width = 50
+        end
+        object Col09: TcxGridColumn
+          Caption = 'Power'
+          PropertiesClassName = 'TcxLabelProperties'
+          Properties.Alignment.Horz = taCenter
+          Properties.Alignment.Vert = taVCenter
+          HeaderAlignmentHorz = taCenter
+          HeaderAlignmentVert = vaCenter
+          Options.Editing = False
+          VisibleForCustomization = False
+          Width = 50
+        end
+        object Col10: TcxGridColumn
+          Caption = 'Door'
+          PropertiesClassName = 'TcxLabelProperties'
+          Properties.Alignment.Horz = taCenter
+          Properties.Alignment.Vert = taVCenter
+          HeaderAlignmentHorz = taCenter
+          HeaderAlignmentVert = vaCenter
+          Options.Editing = False
+          VisibleForCustomization = False
+          Width = 50
+        end
+        object Col11: TcxGridColumn
+          Caption = 'Fan'
+          PropertiesClassName = 'TcxLabelProperties'
+          Properties.Alignment.Horz = taCenter
+          Properties.Alignment.Vert = taVCenter
+          HeaderAlignmentHorz = taCenter
+          HeaderAlignmentVert = vaCenter
+          Options.Editing = False
+          VisibleForCustomization = False
+          Width = 50
+        end
+        object Col12: TcxGridColumn
+          Caption = 'Heater'
+          PropertiesClassName = 'TcxLabelProperties'
+          Properties.Alignment.Horz = taCenter
+          Properties.Alignment.Vert = taVCenter
+          HeaderAlignmentHorz = taCenter
+          HeaderAlignmentVert = vaCenter
+          Options.Editing = False
+          VisibleForCustomization = False
+          Width = 50
+        end
+        object Col13: TcxGridColumn
+          Caption = 'Temp.'
+          PropertiesClassName = 'TcxLabelProperties'
+          Properties.Alignment.Horz = taCenter
+          Properties.Alignment.Vert = taVCenter
+          HeaderAlignmentHorz = taCenter
+          HeaderAlignmentVert = vaCenter
+          VisibleForCustomization = False
+          Width = 50
+        end
+        object Col14: TcxGridColumn
+          Caption = 'Connect'
+          PropertiesClassName = 'TcxLabelProperties'
+          Properties.Alignment.Horz = taCenter
+          Properties.Alignment.Vert = taVCenter
+          HeaderAlignmentHorz = taCenter
+          HeaderAlignmentVert = vaCenter
+          VisibleForCustomization = False
+          Width = 150
+        end
+        object Col15: TcxGridColumn
+          Caption = 'Disconnect'
+          PropertiesClassName = 'TcxLabelProperties'
+          Properties.Alignment.Horz = taCenter
+          Properties.Alignment.Vert = taVCenter
+          HeaderAlignmentHorz = taCenter
+          HeaderAlignmentVert = vaCenter
+          VisibleForCustomization = False
+          Width = 150
+        end
+        object Col99: TcxGridColumn
+          Caption = 'Memory'
+          DataBinding.ValueType = 'Integer'
+          PropertiesClassName = 'TcxCalcEditProperties'
+          Visible = False
+          HeaderAlignmentHorz = taCenter
+          HeaderAlignmentVert = vaCenter
+          MinWidth = 40
+          Options.Editing = False
+          Options.HorzSizing = False
+          Options.Moving = False
+          VisibleForCustomization = False
+          Width = 40
+        end
+      end
+      object GlList: TcxGridLevel
+        GridView = TvList
+      end
+    end
+    object Panel3: TPanel
+      Left = 34
+      Top = 151
+      Width = 189
+      Height = 66
+      TabOrder = 2
+      Visible = False
+      object ImgState0: TImage
+        Left = 12
+        Top = 16
+        Width = 32
+        Height = 32
+        AutoSize = True
+        Center = True
+        Picture.Data = {
+          07544269746D6170360C0000424D360C00000000000036000000280000002000
+          0000200000000100180000000000000C0000C40E0000C40E0000000000000000
+          0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE
+          FEFEFEFCFCFCFAFAFAF8F8F8F6F6F6F5F5F5F6F6F6F6F6F6F8F8F8FAFAFAFCFC
+          FCFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFAFAFA
+          F4F4F4EBEBEBE1E1E1D8D8D8D0D0D0CCCCCCCCCCCCD0D0D0D7D7D7E1E1E1EBEB
+          EBF3F3F3FAFAFAFDFDFDFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFAFAFAF1F1F1E3E3E3
+          CFCFCFB8B8B8A1A3A28A9790799286728F81728F817992858A9790A0A2A1B8B8
+          B8CECECEE4E4E4F1F1F1FAFAFAFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFDF7F7F7E9E9E9D0D0D0AFAFAF
+          84938B54957332A36923AB651BB16319B26419B2641BB06322AB6432A3685494
+          7383928AB0B0B0CFCFCFE9E9E9F6F6F6FDFDFDFEFEFEFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF5F5F5DFDFDFBDBDBD87988F45986B
+          1DB06019B35F19B25D18B05D18AE5C18AE5C18AE5C18AF5C18B05D19B15D19B3
+          5F1EAF6046976B85968DBEBEBEDFDFDFF5F5F5FDFDFDFEFEFEFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFDFDFDF5F5F5E0E0E0B3B4B370947F29A95F1AB25B
+          1AB05A1AAD5819A95619A65519A55419A45419A45419A55419A75519A9561AAD
+          581AB0591AB25B28A85F70957FB2B3B2DFDFDFF5F5F5FDFDFDFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFDFDFDF7F7F7DFDFDFB3B4B45C967320AF581BB1561AAC54
+          1AA7511AA34F199F4D199C4C199A4A18984A18984A19994A199C4C199F4D1AA3
+          4F1AA7511BAD541BB15620AF595D9272B2B3B2DFDFDFF7F7F7FDFDFDFFFFFFFF
+          FFFFFFFFFFFFFFFFFAFAFAEAEAEABDBDBD6C987B21B0551DAF511CAA4F1BA44C
+          1A9F4A1A9A47199645189244189042188F42188F421890421993441996461A9A
+          471A9E4A1BA44C1CAA4F1CB05222AE546D987CBDBDBDE9E9E9FAFAFAFEFEFEFF
+          FFFFFFFFFFFDFDFDF1F1F1D0D0D0819A8929AB531FAE4E1EA84B1CA2481B9B44
+          1A95421A903F198C3E18883C18863C18853B18853B18863C18883D198C3E1A90
+          3F1A96421B9C441CA2481DA94A1FAF4D28AB53809988CFCFCFF1F1F1FDFDFDFF
+          FFFFFEFEFEFAFAFAE3E3E3B0B2B141A15C20B04A1FAA481EA3441C9B411B943E
+          1A8D3C198839188337188035177E35177D34177D34177E351880361884381988
+          391A8E3C1B953E1C9B411EA3441FA94820B0493DA15AAFB1B0E4E4E4FAFAFAFE
+          FEFEFDFDFDF4F4F4CCCCCC799B8222AF4621AB4320A4411E9B3E1C933B1B8B37
+          1A8535198033197C32197931187630187530187530197630197931197C321981
+          331A85361B8C381C933B1E9B3E20A34121AB4422AF46799C81CDCDCDF3F3F3FD
+          FDFDFCFCFCECECECB6B7B649A25C22AD4122A73F209E3C1E96391D8D351C8733
+          1E82341E7D331D78321C75301C72301C712F1C712F1C72301C76311D79321E7E
+          331E83341C87341C8E361E9639209E3C22A73F23AE4148A35CB7B8B7EBEBEBFC
+          FCFCFAFAFAE2E2E296A5992EAA4424AB3D22A23A2199371F9034248B37278739
+          268237257C35247833247432247232237132247232247232247433247833257D
+          3526833828883A248C371F913421993622A23A24AA3D2FAA4597A79AE0E0E0FA
+          FAFAF7F7F7D9D9D97C9F8127AD3B25A839229F352296332C933B31904030883D
+          2E823B2D7D392C79372C76362B73362B73362B73362B73362C76372C79372D7E
+          392E833C30893D31903F2C943C229633239F3525A83929AC3C7CA181D7D7D7F7
+          F7F7F5F5F5D1D1D1659E6B28AC3626A534249C30339B3E3D99463B9244398B41
+          38853F37803E367D3D357A3D35773C35763C35763C35773C357A3D367D3D3781
+          3E388540398C413B92453D9A46339C3F249C3126A63428AC3667A26DD0D0D0F6
+          F6F6F4F4F4CDCDCD5BA0602AAB3228A42F2F9F3647A44E469C4C44954A428F47
+          4189453F84443F81433E7E423E7B413E7B413E7B413E7B413E7E433F81434085
+          44418946429048449649469D4C47A44E2F9F3728A3302AAB325CA060CCCCCCF5
+          F5F5F4F4F4CECECE59A25A2BAA2E2AA32D48AA4B54A95651A253509A514E9550
+          4C8F4E4B8B4C4A874C49844B49824A49824A49824A49824B49854B4A884C4B8C
+          4D4D904E4E95504F9B5151A25354A95649AB4B2BA32D2BAA2D5CA05ECCCCCCF5
+          F5F5F5F5F5D2D2D262A2612CAA2B33A6315CB35A5FAE5D5CA75B5BA159599B58
+          589656579255558F54558C53558A53548953548953558A53558C54568F545792
+          55589656599C585BA15A5CA85B5EAF5D5CB45B33A7312CAA2A62A261D0D0D0F5
+          F5F5F7F7F7D9D9D974A3712EAA273FAC386BBB666BB56669AE6468A86366A362
+          649F60639B6063985F62955E62945E61935E61935E62945E62965E63985F649B
+          60659F6166A46267A96369AF646BB5666DBB673FAC382FA92775A772D8D8D8F8
+          F8F8FAFAFAE2E2E290A98D33A92649B13D79C17077BB6E75B56D73B06C72AC6B
+          70A76A6FA4696EA0696E9F686E9D686D9D686D9D686E9D686E9F686FA16970A4
+          6970A86A72AD6B73B16C75B66D77BC6E79C17047B03C33A82790AC8CE1E1E1FA
+          FAFAFCFCFCECECECB0B8AF42A63249B13884C87985C37A83BF7981B97880B577
+          7FB2767EAE767DAB757DA9747CA8747CA8747CA8747DA8747DAA747DAB757EAE
+          767FB27781B67781BA7883BF7985C47A85C87A49B13843A734B3BBB1EBEBEBFC
+          FCFCFDFDFDF4F4F4CDCECD67A65A41AD2A8CCC7D91CB8490C7848EC2838DBF82
+          8CBB828BB8818AB6818AB48189B3808AB3808AB3808AB3808AB4818BB6818BB8
+          818CBB828DBF828EC28390C78491CB858CCC7D42AE2B67A859CFCFCFF4F4F4FD
+          FDFDFEFEFEFAFAFAE3E3E3A7B4A33EA82380C76C9FD3919ECF909CCC909BC88F
+          9AC58F9AC28F99C18E99C08E98BF8E98BE8E98BE8E98BF8E99C08E99C18E9AC3
+          8F9AC58F9CC8909DCC909ECF909FD39180C86D3DA821A5B4A2E3E3E3FAFAFAFE
+          FEFEFFFFFFFDFDFDF2F2F2D1D2D16BA75955B537A9D999ACD79DAAD49CAAD19C
+          A8CF9CA7CD9CA7CB9BA7CA9AA6C99AA6C99AA6C99AA6C99AA7CA9AA7CB9BA8CD
+          9CA8CF9CAAD29CABD59CACD79DABD99B56B53769A757D0D1D0F2F2F2FDFDFDFF
+          FFFFFFFFFFFFFFFFFAFAFAEBEBEBB7BFB554A6377EC662B8DFA8B9DDAAB8DBAA
+          B7D9AAB7D7A9B6D6A9B6D4A9B6D4A9B6D4A9B6D4A9B6D4A9B6D4A9B6D6A9B7D7
+          A9B7D9AAB8DBAAB9DDAAB9DFA97EC66354A736B7BFB4EAEAEAFAFAFAFEFEFEFF
+          FFFFFFFFFFFFFFFFFDFDFDF8F8F8E0E0E0A9B9A350A92A8DCB71C6E5B8C6E3B8
+          C5E1B8C5E0B8C5DFB8C4DFB8C4DEB8C4DEB8C4DEB8C4DEB8C4DFB8C5DFB8C5E0
+          B8C5E2B8C6E4B8C6E4B790CE754FA929A9B9A3E0E0E0F7F7F7FDFDFDFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFDFDFDF5F5F5E1E1E1A7B8A055A72E81C55DC7E5B7
+          D4EAC8D4E9C8D3E8C8D3E8C8D3E8C7D3E7C7D3E7C7D3E8C7D3E8C8D3E8C8D4EA
+          C8D4EAC8C7E5B683C66056A82EA5B89DE0E0E0F5F5F5FDFDFDFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF6F6F6E1E1E1B7C1B267A9455BB22B
+          A2D486D6EBC9E0F0D6E1F0D7E0F0D7E0EFD7E0F0D7E0F0D7E0F0D7E0EFD7D6EB
+          C8A4D4875CB32D66A943B7C2B2E1E1E1F5F5F5FDFDFDFEFEFEFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF7F7F7EAEAEAD0D2D09CB58E
+          60A83553AB1D79BF4D9DD07BB7DC9EC1E1AAC0E1AAB8DD9F9DD17B7AC04E52AA
+          1C5EA7339CB68DD0D0CFEBEBEBF8F8F8FDFDFDFEFEFEFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFAFAFAF2F2F2E4E4E4
+          CDD0CBA9BC9E84B06867A73E55A52153A61C53A61C55A52167A73D84AF68AABC
+          9FCCCFCBE4E4E4F2F2F2FAFAFAFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFAFAFA
+          F5F5F5EDEDEDE4E4E4DCDCDCD5D5D5CFD0CECFD0CFD5D5D5DBDBDBE3E3E3EDED
+          EDF4F4F4FAFAFAFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE
+          FEFEFEFCFCFCFAFAFAF8F8F8F6F6F6F6F6F6F6F6F6F6F6F6F8F8F8FAFAFAFCFC
+          FCFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFF}
+        Stretch = True
+        Transparent = True
+        Visible = False
+      end
+      object ImgState1: TImage
+        Left = 58
+        Top = 16
+        Width = 32
+        Height = 32
+        AutoSize = True
+        Center = True
+        Picture.Data = {
+          07544269746D6170360C0000424D360C00000000000036000000280000002000
+          0000200000000100180000000000000C0000C40E0000C40E0000000000000000
+          0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFE
+          FCFCFCFAFAFAF7F7F7F3F3F3F1F1F1EFEFEFEFEFEFF1F1F1F4F4F4F7F7F7FAFA
+          FAFDFDFDFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFCFCFCF6F6F6
+          EDEDEDE2E2E2D5D5D5C9C9C9C0C0C0BBBBBBBBBBBBC0C0C0C9C9C9D5D5D5E3E3
+          E3EEEEEEF7F7F7FCFCFCFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFCFCFCF7F7F7E9E9E9D5D5D5
+          BABABAA09EA1927F988E649A9251A39648AB9649AA9152A28E6599938198A2A0
+          A3BCBCBCD7D7D7EAEAEAF7F7F7FCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFCFCFCF2F2F2E0E0E0BFBFBF9C989E
+          8F5CA39A30C0A71BD5AB15DCAC14DEAD14DFAD14DFAC14DDAB16DCA51CD49A32
+          BE9061A09F9CA0C2C2C2E2E2E2F3F3F3FCFCFCFEFEFEFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFEFEFEFBFBFBEFEFEFD2D2D2ABA9AC8C63A09825CD
+          A114E0A014DF9E13DC9C13D99B13D79B13D69B13D69B13D79D13D99F13DCA114
+          DFA114E09728C98D679FAEADAED5D5D5F1F1F1FCFCFCFEFEFEFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFEFEFEFCFCFCEFEFEFD5D5D5A29EA48B4AB19617DE9714E1
+          9413DC9113D88E12D38B12CF8912CD8912CC8912CC8A12CD8C12CF8F12D39113
+          D89413DD9714E19618DD8A50ADA4A1A6D7D7D7F1F1F1FCFCFCFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFDFDFDF3F3F3D4D4D4A39FA68638BF8D14E38B13E08713D9
+          8312D27F11CD7C11C87911C47810C17810C07810C07810C17A11C47C11C88011
+          CD8312D38713DA8B13E08D15E3853EBAA7A5A9D6D6D6F4F4F4FDFDFDFFFFFFFF
+          FFFFFFFFFFFEFEFEF8F8F8E3E3E3AEACAF834AB78414E48114E17C13D97812D1
+          7411CA7010C36C10BD6A10B9680FB6680FB6680FB6690FB76A10BA6C10BE7010
+          C47411CA7912D27D13DA8114E18314E48451B2B2B1B3E5E5E5F9F9F9FEFEFEFF
+          FFFFFFFFFFFCFCFCECECECC5C5C58563AB7916E47713E27212DA6D11D16911C8
+          650FC0610FB95E0FB35B0FAF5A0FAC5A0EAB5A0EAB5A0FAC5C0FB05E0FB4620F
+          BA6510C16A11C96E12D17312DB7713E37918E2886DA8CACACAEEEEEEFDFDFDFF
+          FFFFFEFEFEF8F8F8DCDCDCA39EAA7124D76E14E66A13DE6612D46111C95C10C0
+          580FB7550FB0520FA94F0EA64E0EA34E0EA24E0EA24E0EA4500EA7520FAA550F
+          B2590FB85D10C16111C96612D56B13DE6E14E6722AD2A9A6ACDEDEDEF9F9F9FE
+          FEFEFDFDFDF1F1F1C5C5C57F5EB66514EA6213E45E12D85911CD540FC1500FB8
+          4C0FB0490FA84810A346109F440F9B440F9A440F9A450F9B4610A04810A44A0F
+          AA4C0FB0510FB95510C35A11CE5E12D96313E46514EA856AB2C9C9C9F2F2F2FD
+          FDFDFBFBFBE8E8E8ACA9B2662FD45B14E85713DF5211D34E10C7490FBC4912B3
+          4714AC4514A443149F41149A40149640149640149640149741149B4314A04614
+          A64814AD4913B5490FBE4E10C95311D45713E05B14E96A37CFB2B0B6EAEAEAFC
+          FCFCF9F9F9DDDDDD9186AD551AE75012E74B12DC4710CE4512C44A1ABC491DB2
+          461CAA431BA2411B9D401A993F1A963F1A953F1A953F1A97401A9A421B9E431B
+          A4461CAC491DB44A1ABC4512C54710D04C12DD5013E7561CE59990AEE0E0E0FA
+          FAFAF6F6F6D4D4D47B68B54913EE4612E54211D94114CD4C22C54C25BC4825B2
+          4624AA4323A241229D4022993F22973F22953F22953F229741229A42229E4323
+          A44624AC4925B44C25BD4B22C74113CE4211DB4612E64914EC8374B3D8D8D8F7
+          F7F7F4F4F4CECECE6852C03F13EF3C12E53B12D84C2AD14F2FC74C2FBD492EB4
+          472DAB452CA5442CA0432C9C422B98422B97422B97422B99432C9C442CA1462D
+          A6482DAD4A2EB54C2FBE5030C84C28D23A12D93C12E63F13EF715EBBD2D2D2F6
+          F6F6F4F4F4CBCBCB5B45CA3613F03312E54123DB543AD45139CA4F38C04C37B7
+          4A36AF4936A84836A44735A046359C46359B46359B46359D4735A14836A54936
+          AA4B36B04D37B94F38C15239CC543AD53F21DC3412E63613F16552C3CFCFCFF5
+          F5F5F4F4F4CCCCCC5646CC2D13F12E15E6513DE15744D85544CE5343C45142BC
+          5041B44E41AE4E41AA4D40A64D40A34D40A24D40A24D40A34D40A74E41AB4F41
+          B05041B55242BE5343C65644CF5844D84F3AE22C14E72D13F26052C5D1D1D1F5
+          F5F5F6F6F6D1D1D15C53C72413F4301FEA5B4EE65B4FDC5A4FD2584ECA574DC2
+          564DBB554DB5544CB1544CAD534BAA534BA9534BA9534BAA544CAE544CB2554D
+          B6564DBC574EC3594ECB5A4FD45C50DD5B4DE72C1CEB2413F46860C3D6D6D6F6
+          F6F6F8F8F8D9D9D9716EC01B13F6352DEE625CEA625DE1615CD9605BD05F5BC9
+          5E5AC35D5ABD5D59B95C59B65C59B45C59B35C59B35C59B45D59B65D59BA5E5A
+          BF5E5AC45F5BCA605BD1615CDA625DE2625CEB2F27EF1C14F57C7ABEDDDDDDF8
+          F8F8FAFAFAE3E3E38D8DBD1A19F43433F36969EF6969E76868DF6767D76767D1
+          6666CB6565C56565C26565BF6565BD6565BD6565BD6565BD6565C06565C26665
+          C66666CC6767D26767D86868E06969E86868F02D2DF41E1DF09999BCE6E6E6FB
+          FBFBFCFCFCEEEEEEB5B5C2292FE7272EF77074F47176EC7176E67175DF7174D9
+          7074D47074CF7073CC7073C96F73C76F73C76F73C76F73C77073CA7073CD7074
+          D07074D57175DA7175E07176E77176ED6E73F52128F83237E2BDBDC5F0F0F0FD
+          FDFDFDFDFDF5F5F5D2D2D35C63CF1120FB6F78F87B84F27B83EC7B83E77B82E1
+          7B82DD7B81D97B81D57B81D37B81D17B81D17B81D17B81D17B81D37B81D67B81
+          DA7B82DD7B82E27B83E77B83ED7B84F36B75F90E1DFC6A6FCBD7D7D7F6F6F6FE
+          FEFEFEFEFEFBFBFBE7E7E7B0B1C31424F05261FB8793F88892F38891EE8891E9
+          8890E68890E28890DF8890DD8890DB8890DB8890DB8890DC8890DE8890E08890
+          E38891E68891EB8891EF8892F48793F84A5AFC1929EDB7B7C5E9E9E9FBFBFBFF
+          FFFFFFFFFFFDFDFDF3F3F3D8D8D8656CCB182BFB8D97FB97A0F7979FF4979FF0
+          979FED979FE9979EE7979EE5979EE4979EE4979EE4979EE5979EE6979EE8979F
+          EA979FED979FF1979FF497A0F88793FC1426FA7177C8DBDBDBF5F5F5FDFDFDFF
+          FFFFFFFFFFFFFFFFFCFCFCEFEFEFC4C4CB434EDD3C4DFD9FA8FCA8AFF9A8AFF6
+          A8AFF4A8AFF2A8AEEFA8AEEEA8AEEDA8AEEDA8AEEDA8AEEDA8AEEEA8AFF0A8AF
+          F2A8AFF4A8AFF6A8AFF99CA5FC3344FD4E58D9C9C9CDF0F0F0FCFCFCFFFFFFFF
+          FFFFFFFFFFFFFFFFFEFEFEF9F9F9E6E6E6B8B8C82E3CE54656FDB0B7FCB8BFFB
+          B8BFF8B8BEF6B8BEF5B8BEF4B8BEF4B8BEF4B8BEF4B8BEF4B8BEF5B8BEF5B8BE
+          F7B8BFF9B8BFFBAEB6FD3B4CFD3945E0BEBEC9E8E8E8FAFAFAFEFEFEFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFEFEFEF8F8F8E8E8E8B9BACA4550DE3242FC97A1FD
+          C6CCFCC9CFFCC9CFFAC9CFFAC9CFFAC9CFFAC9CFFAC9CFFAC9CFFAC9CFFBC9CF
+          FCC5CBFC919BFE2B3BFB4F59DABFC0CBEAEAEAF9F9F9FEFEFEFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF9F9F9E8E8E8C8C8D06C73D01C2CF4
+          4B5AFD9AA3FDD2D7FDD9DDFDDADFFDDADFFDDADFFDDADFFDD8DDFDD0D5FD969F
+          FD4453FD1E2EF1747ACECDCDD2EAEAEAF9F9F9FEFEFEFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFAFAFAF1F1F1DDDDDEB8B9CA
+          626AD82534EC1729FA3C4DFC5C6AFE6B78FE6B77FE5B69FE3B4BFC1729F92736
+          EB676FD7BCBDCBDFDFE0F2F2F2FAFAFAFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFDF7F7F7ECECEC
+          DCDCDDC3C4CF9A9ECC7279D35660DB4953DD4954DD5861D9757CD29FA2CCC6C6
+          D0DDDDDEEEEEEEF7F7F7FDFDFDFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFD
+          F8F8F8F4F4F4ECECECE6E6E6E1E1E1DEDEDEDEDEDEE1E1E1E6E6E6EDEDEDF4F4
+          F4F9F9F9FDFDFDFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FEFEFEFEFEFEFDFDFDFBFBFBFAFAFAFAFAFAFAFAFAFAFAFAFBFBFBFDFDFDFEFE
+          FEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFF}
+        Stretch = True
+        Transparent = True
+      end
+      object ImgState3: TImage
+        Left = 96
+        Top = 16
+        Width = 32
+        Height = 32
+        AutoSize = True
+        Center = True
+        Picture.Data = {
+          07544269746D6170360C0000424D360C00000000000036000000280000002000
+          0000200000000100180000000000000C0000C40E0000C40E0000000000000000
+          0000FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+          FEFEFEFEFEFEFEFEFEF7F7F7F7F7F7F7F7F7F7F7F7F7F7F7FEFEFEFEFEFEFEFE
+          FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+          FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+          F7F7F7E4E4E4E4E4E4D7D7D7CFCFCFCFCFCFCFCFCFCFCFCFD7D7D7DEDEDEEFEF
+          EFF7F7F7FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+          FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEFEFEFE4E4E4
+          CFCFCFB2B2B2A4A4A49D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9DA4A4A4B2B2
+          B2CFCFCFE4E4E4F7F7F7FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+          FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF7F7F7E4E4E4CFCFCFADADAD
+          9D9D9DADADADD7D7D7E4E4E4EFEFEFEFEFEFEFEFEFEFEFEFDEDEDED7D7D7ADAD
+          AD9D9D9DADADADCFCFCFE4E4E4F7F7F7FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+          FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF7F7F7DEDEDEBCBCBC9D9D9DB2B2B2
+          E4E4E4EFEFEFE4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4
+          E4E4E4E4ADADAD9D9D9DBCBCBCE4E4E4F7F7F7FEFEFEFEFEFEFEFEFEFEFEFEFE
+          FEFEFEFEFEFEFEFEFEFEFEFEFEFEF7F7F7DEDEDEB2B2B2A4A4A4D7D7D7DEDEDE
+          DEDEDED7D7D7D7D7D7CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFD7D7D7DEDE
+          DEDEDEDEDEDEDECFCFCF9D9D9DB2B2B2E4E4E4F7F7F7FEFEFEFEFEFEFEFEFEFE
+          FEFEFEFEFEFEFEFEFEFEFEF7F7F7DEDEDEB2B2B2A4A4A4CFCFCFD7D7D7CFCFCF
+          C7C7C7C7C7C7BCBCBCBCBCBCB2B2B2B2B2B2B2B2B2BCBCBCBCBCBCBCBCBCC7C7
+          C7C7C7C7CFCFCFD7D7D7CFCFCF9D9D9DB2B2B2DEDEDEF7F7F7FEFEFEFEFEFEFE
+          FEFEFEFEFEFEFEFEFEFEFEE4E4E4BCBCBC9D9D9DCFCFCFC7C7C7BCBCBCBCBCBC
+          B2B2B2B2B2B2ADADADA4A4A4A4A4A4ADADADA4A4A4A4A4A4A4A4A4ADADADADAD
+          ADB2B2B2BCBCBCC7C7C7C7C7C7C7C7C79D9D9DBCBCBCEFEFEFFEFEFEFEFEFEFE
+          FEFEFEFEFEFEFEFEEFEFEFCFCFCF9D9D9DBCBCBCBCBCBCB2B2B2B2B2B2ADADAD
+          A4A4A49D9D9D9393939393939393939393939393939393939393939D9D9D9D9D
+          9DA4A4A4ADADADADADADBCBCBCBCBCBCBCBCBC9D9D9DD7D7D7EFEFEFFEFEFEFE
+          FEFEFEFEFEFEFEFEE4E4E4ADADADA4A4A4B2B2B2B2B2B2ADADAD9D9D9D9D9D9D
+          8A8A8A8A8A8A8A8A8A8282828282828282828282828282828282828A8A8A8A8A
+          8A9393939D9D9DA4A4A4A4A4A4B2B2B2B2B2B2A4A4A4B2B2B2E4E4E4FEFEFEFE
+          FEFEFEFEFEF7F7F7CFCFCF9D9D9DADADADADADAD9D9D9D9393939393938A8A8A
+          8282828282827D7D7D7171717171717171717171717171717D7D7D7D7D7D7D7D
+          7D8282828A8A8A9393939D9D9DA4A4A4ADADADADADAD9D9D9DCFCFCFF7F7F7FE
+          FEFEFEFEFEE4E4E4B2B2B29D9D9D9D9D9D9D9D9D9393938A8A8A8282827D7D7D
+          7D7D7D7171717171717171716E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E7171
+          717D7D7D7D7D7D8282828A8A8A9393939D9D9DA4A4A49D9D9DB2B2B2EFEFEFFE
+          FEFEFEFEFEE4E4E4A4A4A49393939393938A8A8A8282828282827D7D7D717171
+          7171716E6E6E6E6E6E6060606060606060606060606060606E6E6E6E6E6E6E6E
+          6E7171717D7D7D7D7D7D8282828282828A8A8A939393939393A4A4A4E4E4E4FE
+          FEFEF7F7F7D7D7D79393939393938A8A8A8282827D7D7D7D7D7D7D7D7D717171
+          7171716E6E6E6060606E6E6E6060606060606E6E6E6060606060606E6E6E6E6E
+          6E6E6E6E7171717D7D7D7D7D7D7D7D7D8282828A8A8A9393939D9D9DD7D7D7F7
+          F7F7F7F7F7CFCFCF8A8A8A8282827D7D7D7D7D7D7D7D7D7D7D7D717171717171
+          6E6E6E6E6E6E6060606E6E6E6060606060606060606060606E6E6E6060606E6E
+          6E6E6E6E7171717D7D7D7D7D7D7D7D7D7D7D7D7D7D7D8282828A8A8AD7D7D7F7
+          F7F7F7F7F7CFCFCF8282827D7D7D7171717171718282827D7D7D7D7D7D717171
+          6E6E6E6E6E6E6E6E6E6060606060606E6E6E6060606060606E6E6E6060606E6E
+          6E6E6E6E7171717D7D7D7D7D7D8282827171717171717D7D7D828282D7D7D7F7
+          F7F7F7F7F7CFCFCF7D7D7D6E6E6E6E6E6E8282828282827D7D7D7D7D7D717171
+          7171716E6E6E6E6E6E6E6E6E6E6E6E6060606E6E6E6E6E6E6E6E6E6E6E6E6E6E
+          6E7171717171717D7D7D7D7D7D8282827D7D7D6E6E6E717171828282CFCFCFF7
+          F7F7F7F7F7CFCFCF7D7D7D6E6E6E6060608A8A8A8282828282827D7D7D7D7D7D
+          7171717171717171716E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E7171717171
+          717D7D7D7D7D7D7D7D7D8282828282828A8A8A6E6E6E606060828282D7D7D7F7
+          F7F7F7F7F7D7D7D78282825A5A5A6E6E6E8A8A8A8A8A8A8282828282827D7D7D
+          7D7D7D7D7D7D7171717D7D7D7171717171717171717171717171717D7D7D7D7D
+          7D7D7D7D7D7D7D8282828282828A8A8A8A8A8A6E6E6E5A5A5A8A8A8ADEDEDEF7
+          F7F7FEFEFEDEDEDE9393935A5A5A6E6E6E9393938A8A8A8A8A8A828282828282
+          8282828282827D7D7D7D7D7D7D7D7D7D7D7D8282827D7D7D8282827D7D7D7D7D
+          7D8282828282828A8A8A8A8A8A8A8A8A8A8A8A6E6E6E5A5A5A9D9D9DE4E4E4FE
+          FEFEFEFEFEEFEFEFADADAD5A5A5A6060609393939393939393938A8A8A8A8A8A
+          8A8A8A8A8A8A8282828A8A8A8282828A8A8A8282828282828A8A8A8A8A8A8A8A
+          8A8A8A8A8A8A8A8A8A8A9393939393939393935A5A5A5A5A5AB2B2B2EFEFEFFE
+          FEFEFEFEFEF7F7F7CFCFCF6E6E6E5151519393939D9D9D9393939D9D9D939393
+          9393939393939393939393939393938A8A8A9393939393938A8A8A9393939393
+          939393939393939D9D9D9393939D9D9D939393515151717171D7D7D7F7F7F7FE
+          FEFEFEFEFEF7F7F7DEDEDEA4A4A4454545828282A4A4A4A4A4A49D9D9D9D9D9D
+          9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D
+          9D9D9D9D9D9D9D9D9D9DA4A4A4A4A4A47D7D7D454545ADADADE4E4E4FEFEFEFE
+          FEFEFEFEFEFEFEFEF7F7F7CFCFCF606060515151ADADADA4A4A4ADADADA4A4A4
+          A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4
+          A4A4A4A4ADADADA4A4A4ADADADA4A4A44A4A4A6E6E6ED7D7D7EFEFEFFEFEFEFE
+          FEFEFEFEFEFEFEFEF7F7F7EFEFEFB2B2B2454545717171B2B2B2B2B2B2B2B2B2
+          B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2
+          B2B2B2B2B2B2B2B2B2B2B2B2B26E6E6E4A4A4ABCBCBCEFEFEFFEFEFEFEFEFEFE
+          FEFEFEFEFEFEFEFEFEFEFEF7F7F7DEDEDEA4A4A43838388A8A8ABCBCBCBCBCBC
+          BCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC
+          BCBCBCBCC7C7C7BCBCBC7D7D7D383838ADADADDEDEDEF7F7F7FEFEFEFEFEFEFE
+          FEFEFEFEFEFEFEFEFEFEFEFEFEFEF7F7F7DEDEDE9D9D9D3838386E6E6EBCBCBC
+          CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF
+          CFCFCFCFB2B2B2606060383838A4A4A4E4E4E4F7F7F7FEFEFEFEFEFEFEFEFEFE
+          FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF7F7F7DEDEDEB2B2B2454545383838
+          8A8A8ACFCFCFD7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7C7C7
+          C7828282353535515151B2B2B2E4E4E4F7F7F7FEFEFEFEFEFEFEFEFEFEFEFEFE
+          FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF7F7F7EFEFEFCFCFCF8A8A8A
+          3535352626265151517D7D7DA4A4A4ADADADADADAD9D9D9D7D7D7D4A4A4A2626
+          26383838939393D7D7D7EFEFEFF7F7F7FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+          FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEFEFEFE4E4E4
+          CFCFCF9D9D9D6060603838382626261A1A1A1A1A1A2626264545456E6E6E9D9D
+          9DCFCFCFE4E4E4EFEFEFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+          FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+          F7F7F7EFEFEFE4E4E4DEDEDED7D7D7CFCFCFCFCFCFD7D7D7DEDEDEE4E4E4EFEF
+          EFF7F7F7FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+          FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+          FEFEFEFEFEFEF7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7FEFE
+          FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+          FEFE}
+        Stretch = True
+        Transparent = True
+      end
+      object Image4: TImage
+        Left = 134
+        Top = 16
+        Width = 32
+        Height = 32
+        AutoSize = True
+        Center = True
+        Picture.Data = {
+          07544269746D6170360C0000424D360C00000000000036000000280000002000
+          0000200000000100180000000000000C0000C40E0000C40E0000000000000000
+          0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFE
+          FDFDFDFAFAFAF6F6F6F3F3F3EFEFEFEDEDEDECECECEDEDEDF0F0F0F3F3F3F7F7
+          F7FBFBFBFDFDFDFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFCFCFCF7F7F7
+          EFEFEFE2E2E2D3D3D3C6C6C6B9B9B9B2B2B2B0B0B0B3B3B3BBBBBBC6C6C6D5D5
+          D5E3E3E3F0F0F0F8F8F8FCFCFCFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFDF9F9F9EFEFEFDDDDDD
+          C2C2C2A9A8A79D8F81A5835FB47D43C07C36C07B34BF7C36B27E46A382629D92
+          87AAA9A8C6C6C6DFDFDFF0F0F0FAFAFAFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFCFCFCF6F6F6E6E6E6C9C9C9A5A4A3
+          A18364CA7A2BEB7B0CF77D03F77D02F77C02F77C02F77C02F87D02F77D03E77B
+          0FC77A2E9B8570A9A8A7CDCDCDE9E9E9F7F7F7FDFDFDFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF5F5F5E0E0E0BABABAA18C7ACB7829
+          F67902F57802F27602EE7402EB7302EA7202E97202EA7202EC7402EF7402F276
+          02F57802F37804C5772E9F9184BEBEBEE3E3E3F6F6F6FDFDFDFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFDFDFDF6F6F6E0E0E0B5B5B4A58365E6740FF37402
+          EF7102E96F02E46D02E06A02DD6902DB6802DA6802DB6802DD6902E16B02E46D
+          02EA6F02EF7202F47402DE7516A2866DBABABAE2E2E2F8F8F8FDFDFDFFFFFFFF
+          FFFFFFFFFFFFFFFFFEFEFEF9F9F9E4E4E4B9B8B8AE7F58EB7108EF6F02E96C02
+          E26902DB6502D46301D06001CC5F01CA5E01CA5E01CA5E01CD5F01D16001D663
+          02DC6602E36902E96C02F06F02EA7008A58469BEBEBDE8E8E8FAFAFAFEFEFEFF
+          FFFFFFFFFFFFFFFFFCFCFCEDEDEDC6C6C6A48872E76C09EC6A02E56702DD6402
+          D46002CD5D01C65A01C25701BE5501BC5501BC5501BC5501BF5601C35801C75A
+          01CE5E01D66102DE6402E66802ED6B02E06E11A48F7FCCCCCCF0F0F0FCFCFCFF
+          FFFFFFFFFFFEFEFEF6F6F6D9D9D9A79C94D86C18EA6702E36302D95F02D05B02
+          C75701C05301B95101B44E01B04D01AE4C01AE4C01AE4C01B14D01B54F01BA51
+          01C05401C95801D15B01DB6002E46402EB6702D16D20AAA5A2DDDDDDF8F8F8FE
+          FEFEFFFFFFFCFCFCECECECBEBEBEB97748E96302E46002DA5C02CE5702C55301
+          BB5001B54C01AD4901A84701A44501A24501A24401A34501A54601A94701AF4A
+          01B64D01BD5001C65401D05802DB5D02E56102EA6402AF7E5BC5C5C5EFEFEFFC
+          FCFCFEFEFEF9F9F9DDDDDDA69D97DF610BE45D02DA5902CF5502C45001BA4C01
+          B14901A94601A344039E42039A41039840039840039840039B42039F4303A445
+          02AB4701B24901BB4D01C65101D15502DC5A02E55E02D36519AEA59FE2E2E2FA
+          FAFAFDFDFDF4F4F4CDCDCDB17F5EE55B02DE5802D25302C74F02BB4A01B34903
+          AA4907A446089D44089842089440089240089240089340089541089943089F44
+          08A54708AC4907B44902BE4B01C95001D45402DF5802E35B04AF8870D4D4D4F6
+          F6F6FCFCFCEEEEEEBCBBBBC6692FE15602D75202CA4D01C04A01B74D0AB04E10
+          A64B10A048109845109543109142108F42108F42109042109243109544109A45
+          10A14810A94B10B24F10B84C08C14901CD4E02D85202E15601BE6F3EC4C4C4F2
+          F2F2FCFCFCE8E8E8B6ADA7D15C18DC5102D24D02C54901BF510FB75518AE5118
+          A54E189E4B189849189447189146188F45188F45189045189146189547189A49
+          189F4B18A74E18B05218B95518C04F0DC74901D34E02DE5102CC5E1FB9B8B8EE
+          EEEEFBFBFBE4E4E4B4A298D8540CD84C02CD4801C5510FC05D22B65922AE5622
+          A552229E5022994E22954C22914B22904B22904B22904B22924B22954D229A4E
+          22A05122A75322AF5622B85922C15D22C64F0CCE4801DA4D02D6530BB1AFAFEB
+          EBEBFBFBFBE3E3E3B39C92D84F09D44801CA4805C96229C1612DB75E2DB05B2D
+          A7582DA1562D9C542D98522D94512D93512D93512D93512D95522D99532D9D55
+          2DA2562DA9592DB15C2DB95E2DC2622DCA5F25CC4704D64802D84D07AEACACEB
+          EBEBFBFBFBE4E4E4B49F95D54B0AD34301CE561ACB6B39C26738BA6538B36238
+          AB6038A55E38A05C389C5A389959389859389859389859389A5A389D5B38A25C
+          38A65E38AD6038B46338BC6538C46838CD6B38CE5114D44401D64907B0AEAEEB
+          EBEBFBFBFBE7E7E7B9A7A0D0490ED14102D36530CE7244C66F44BE6C44B76A44
+          B06844AA6644A66444A36344A062449F62449E62449F6244A16344A46344A765
+          44AC6644B26844B86A44BF6C44C76F44D07244D25F29D24001CF490EB7B6B6EE
+          EEEEFCFCFCEDEDEDBFB6B3C84E1CD13F03D77143D27A52CB7851C37551BD7351
+          B77151B26F51AE6E51AB6E51A86D51A76D51A76C51A76D51A96D51AB6D51AF6F
+          51B37051B87151BE7351C57651CC7951D47B52D76D3DD13D01C45325C3C2C2F1
+          F1F1FDFDFDF2F2F2C9C9C9BF5D37D03D04DA784ED6825FD0805EC97E5EC37D5E
+          BE7B5EBA7A5EB5795EB3785EB0775EB0765EB0765EB0775EB1775EB4785EB779
+          5EBB7A5EBF7C5EC47D5ECB7F5ED1815ED8835FD97246D03901BB694AD0D0D0F5
+          F5F5FEFEFEF8F8F8DBDBDBB58473CF3803DB7750DB8C6DD68B6DD0896CCB886C
+          C6866CC3856CBF846CBC846CBA836CB9836CB9836CB9836CBA836CBD846CC085
+          6CC3856CC7866CCC886CD28A6CD78B6DDD8D6DDA6F46CD3805B79285E0E0E0F9
+          F9F9FFFFFFFCFCFCE9E9E9BBB3B0C73E11D8653DE1967BDC957BD7947BD3937B
+          CE917BCB917BC8907BC5907BC38E7BC38E7BC38E7BC38E7BC48E7BC6907BC990
+          7BCB917BCF927BD3937BD8947BDC957BE2967AD65B30C24922C2BBB8EDEDEDFC
+          FCFCFFFFFFFEFEFEF5F5F5D5D5D5B87460CE3E13E49C83E2A18ADEA08ADA9F8A
+          D79E8AD49D8AD19C8ACF9C8ACE9C8ACD9B8ACD9B8ACD9B8ACE9C8ACF9C8AD29C
+          8AD59D8AD89E8ADB9F8ADFA08AE3A18AE39377CD3D11B78576DADADAF7F7F7FE
+          FEFEFFFFFFFFFFFFFBFBFBEAEAEAC3B8B6BF4727DB7253E8AC99E4AC9AE1AB9A
+          DFAA9ADCAA9ADAA99AD8A99AD7A89AD7A89AD7A89AD7A89AD7A89AD8A99ADBA9
+          9ADDAA9ADFAB9AE2AB9AE5AC9AE8AC99D66240BE4F31C8C4C3EDEDEDFCFCFCFE
+          FEFEFFFFFFFFFFFFFEFEFEF8F8F8E0E0E0BAA099C53D1BE08A73EAB8ABE8B8AB
+          E6B8ABE4B7ABE2B7ABE1B7ABE1B7ABE0B6ABE0B6ABE1B6ABE1B7ABE1B7ABE3B7
+          ABE5B7ABE6B8ABE9B8ABEAB7A9DE836BC04020BFABA6E5E5E5F8F8F8FEFEFEFF
+          FFFFFFFFFFFFFFFFFFFFFFFDFDFDF4F4F4DADADABB8E84C43B1CE29481EDC4B9
+          ECC5BAEBC4BAEAC4BAE9C4BAE9C4BAE8C4BAE8C4BAE8C4BAE9C4BAE9C4BAEAC4
+          BAEBC4BAEDC5BAEEC4B9DE846FC33A1CBC9C94DEDEDEF6F6F6FDFDFDFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF3F3F3DBDBDBBB9B94BE3C22D66953
+          EDBEB4F2D2CBF1D3CCF1D3CCF0D2CCF0D2CCF0D2CCF0D2CCF0D2CCF1D3CCF1D3
+          CCF2D2CBEBB7ABD3614ABC432BBDA49FDEDEDEF4F4F4FCFCFCFEFEFEFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFCFCFCF4F4F4E1E1E1C4B1AEB95B4B
+          C43820D7715FEBB8ADF4D8D2F5DFDAF6E2DDF6E2DDF6E2DDF5DED9F4D8D2E8AD
+          A2D66C59C2351DB96152C7BCB9E3E3E3F5F5F5FCFCFCFEFEFEFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF7F7F7EBEBEBD6D5D5
+          BEA29EB85E50B9311DC1321ECB4D3AD05C4BD36757D05C4BC94936C02F1ABA35
+          22B86154C1ACA9D8D8D8EDEDEDF9F9F9FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFBFBFBF4F4F4
+          E8E8E8DBDBDBCBBFBEC2A09BBD8079BC736AB96A60BC736ABD847CC2A29DCEC4
+          C3DCDCDCEBEBEBF6F6F6FBFBFBFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE
+          FCFCFCF8F8F8F2F2F2EDEDEDE7E7E7E4E4E4E3E3E3E4E4E4E8E8E8EDEDEDF3F3
+          F3F9F9F9FCFCFCFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFEFEFEFDFDFDFDFDFDFCFCFCFBFBFBFBFBFBFBFBFBFCFCFCFDFDFDFDFD
+          FDFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFF}
+        Stretch = True
+        Transparent = True
+      end
+    end
+  end
+  object ilSmall: TImageList
+    Left = 448
+    Top = 72
+    Bitmap = {
+      494C010105000900040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
+      0000000000003600000028000000400000002000000001002000000000000020
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000003131310021212100212121002121210031313100000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000005A5A
+      5A004A4A4A00848C8C0084848C008484840084848C00848C8C004A4A4A005A5A
+      5A00000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000000000005A5A5A009494
+      9C008C8C8C00948C8400CECECE00CECECE00CECECE00948C84008C8C8C009494
+      9C005A5A5A000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000000000004A4A4A008C8C
+      8C00CECECE00CECECE00CECECE00CECECE00CECECE00CECECE00CECECE008C8C
+      8C004A4A4A000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000005A5A5A0084848C00948C
+      8400CECECE00CECECE00CECECE00CECECE00CECECE00CECECE00CECECE00948C
+      8400848C8C004242420000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000004242420084848400CECE
+      CE00CECECE00CECECE00CECECE00CECECE00CECECE00CECECE00CECECE00CECE
+      CE0084848C003131310000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000004242420084848400CECE
+      CE00CECECE00CECECE00CECECE00CECECE00CECECE00CECECE00CECECE00CECE
+      CE00848484003939390000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000004242420084848400CECE
+      CE00CECECE00CECECE00CECECE00CECECE00CECECE00CECECE00CECECE00CECE
+      CE00848484003939390000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000004242420084848400CECE
+      CE00CECECE00CECECE00CECECE00CECECE00CECECE00CECECE00CECECE00CECE
+      CE0084848C003131310000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000005A5A5A008C8C8C00948C
+      8400CECECE00CECECE00CECECE00CECECE00CECECE00CECECE00CECECE00948C
+      8400848C8C004242420000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000000000008C8C8C008C94
+      9400CECECE00CECECE00CECECE00CECECE00CECECE00CECECE00CECECE008C8C
+      8C004A4A4A000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000000000006B6B6B008484
+      84008C8C8C00948C8400CECECE00CECECE00CECECE00948C84008C8C8C009494
+      9C005A5A5A000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000005A5A
+      5A004A4A4A0084848C0084848400848484008484840084848C007B7B7B005A5A
+      5A00000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000005A5A5A004242420042424200424242005A5A5A00000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000D6CEBDFFD6CEBDFFD6CEBDFFD6CE
+      BDFFD1C9B9FFAAA298FF615F58FF32312EFF292724FF44423EFF867F77FFC2BA
+      ABFFD5CDBDFFD6CEBDFFD6CEBDFFD6CEBDFFD6CEBDFFD6CEBDFFD6CEBDFFD6CE
+      BDFFD1C9B9FFAAA298FF615F58FF32312EFF292724FF44423EFF867F77FFC2BA
+      ABFFD5CDBDFFD6CEBDFFD6CEBDFFD6CEBDFF0000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000D6CEBDFFD6CEBDFFD6CEBDFFBBB3
+      A5FF393734FF050404FF000000FF000000FF000000FF000000FF010000FF1514
+      13FF807A72FFD3CBBAFFD6CEBDFFD6CEBDFFD6CEBDFFD6CEBDFFD6CEBDFFBBB3
+      A5FF393734FF050404FF000000FF000000FF000000FF000000FF010000FF1514
+      13FF807A72FFD3CBBAFFD6CEBDFFD6CEBDFF0000000000000000000000000000
+      0000000000003131310021212100212121002121210031313100000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000003131310021212100212121002121210031313100000000000000
+      000000000000000000000000000000000000D6CEBDFFD6CEBDFFB3AB9DFF1C1A
+      18FF000000FF000816FF001F67FF0011B9FF0007C8FF002099FF000C35FF0002
+      04FF030303FF5E5B52FFD3CBBAFFD6CEBDFFD6CEBDFFD6CEBDFFB3AB9DFF1C1A
+      18FF000000FF001600FF006700FF00B900FF00C800FF009900FF003500FF0004
+      00FF030303FF5E5B52FFD3CBBAFFD6CEBDFF0000000000000000000000005A5A
+      5A004A4A4A006B6B94006B6B940063638C006B6B94006B6B94004A4A4A005A5A
+      5A00000000000000000000000000000000000000000000000000000000005A5A
+      5A004A4A4A008C8C73008C8C6B00848C6B008C8C6B008C8C73004A4A4A005A5A
+      5A0000000000000000000000000000000000D6CEBDFFC6BEB0FF252321FF0001
+      01FF000E41FF000BE0FF0000FEFF0000FFFF0000FFFF0000FFFF0003F8FF0015
+      A1FF00040BFF030303FF807B72FFD5CDBDFFD6CEBDFFC6BEB0FF252321FF0001
+      00FF004100FF00E000FF00FE00FF00FF00FF00FF00FF00FF00FF00F800FF00A1
+      00FF000B00FF030303FF807B72FFD5CDBDFF00000000000000005A5A5A007B7B
+      9C006B739400847B8C000000FF000000FF000000FF00847B8C006B7394007B7B
+      9C005A5A5A0000000000000000000000000000000000000000005A5A5A008C8C
+      9400CEA53100DEB52100F7FF0000F7FF0000F7FF0000F7E70000CEA531009C9C
+      7B005A5A5A00000000000000000000000000D6CEBDFF6B645DFF010101FF000C
+      2DFF0007EEFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0001
+      FEFF0015A1FF000204FF151412FFC2BAABFFD6CEBDFF6B645DFF010101FF002D
+      00FF00EE00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FE
+      00FF00A100FF000400FF151412FFC2BAABFF00000000000000004A4A4A006B73
+      94000000FF000000FF000000FF000000FF000000FF000000FF000000FF006B73
+      94004A4A4A0000000000000000000000000000000000000000004A4A4A00CEA5
+      3100F7F70000F7FF0000F7FF0000F7FF0000F7FF0000F7FF0000F7FF0000CEA5
+      31004A4A4A00000000000000000000000000C7BFB0FF1D1A19FF000204FF000D
+      BEFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000
+      FFFF0002F9FF000D36FF010000FF868077FFC7BFB0FF1D1A19FF000400FF00BE
+      00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF
+      00FF00F900FF003600FF010000FF868077FF000000005A5A5A006B6B9400847B
+      8C000000FF000000FF000000FF000000FF000000FF000000FF000000FF00847B
+      8C006B6B9400424242000000000000000000000000005A5A5A007B7B7B00DEB5
+      2100F7FF0000F7FF0000F7FF0000F7FF0000F7FF0000F7FF0000F7FF0000F7E7
+      00007B7B7B00424242000000000000000000B1AA9DFF080808FF00091EFF0009
+      EFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000
+      FFFF0000FFFF002098FF000000FF44433EFFB1AA9DFF080808FF001E00FF00EF
+      00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF
+      00FF00FF00FF009800FF000000FF44433EFF00000000424242006B6B8C000000
+      FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+      FF006B6B940031313100000000000000000000000000424242007B7B7B00EFD6
+      0800F7FF0000F7FF0000F7FF0000F7FF0000F7FF0000F7FF0000F7FF0000EFD6
+      08007B7B7B00313131000000000000000000A7A194FF010101FF00022CFF0002
+      FDFF0707FDFF7575DFFF0808FEFF0000FFFF0000FFFF0000FFFF0000FFFF0000
+      FFFF0000FFFF0007C9FF000000FF292724FFA7A194FF010101FF002C00FF00FD
+      00FF07FD07FF90DC90FF86DA86FF00FF00FF00FF00FF00FF00FF00FF00FF00FF
+      00FF00FF00FF00C900FF000000FF292724FF000000004242420063638C000000
+      FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+      FF006B6B8C00393939000000000000000000000000004242420073737300EFCE
+      0000F7FF0000F7FF0000F7FF0000F7FF0000F7FF0000F7FF0000F7FF0000EFCE
+      08007B7B7B00393939000000000000000000AAA497FF030303FF000527FF0005
+      F8FF1D1DF7FFDDDDE5FFB0B0F4FF0808FEFF0000FFFF0000FFFF0000FFFF0000
+      FFFF0000FFFF0011B9FF000000FF32312EFFAAA497FF030303FF002700FF00F8
+      00FF24F524FFF1F1F1FFDAE2DAFF1DF71DFF00FF00FF00FF00FF00FF00FF00FF
+      00FF00FF00FF00B900FF000000FF32312EFF000000004242420063638C000000
+      FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+      FF006B6B8C00393939000000000000000000000000004242420073737300EFCE
+      0000F7FF0000F7FF0000F7FF0000F7FF0000F7FF0000F7FF0000F7FF0000EFCE
+      08007B7B7B00393939000000000000000000BBB4A5FF10100FFF000810FF0009
+      DFFF0000FFFFA8A8F5FFFBFBFBFF9292DEFF0000FFFF0000FFFF0000FFFF0000
+      FFFF0000FEFF001F67FF000000FF615F58FFBBB4A5FF10100FFF001000FF00DF
+      00FF07FD07FFA0E3A0FFF4F4F4FF90DC90FF00FF00FF00FF00FF00FF00FF00FF
+      00FF00FE00FF006700FF000000FF615F58FF000000004242420063638C000000
+      FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+      FF006B6B94003131310000000000000000000000000042424200737B7B00EFD6
+      0800F7FF0000F7FF0000F7FF0000F7FF0000F7FF0000F7FF0000F7FF0000EFD6
+      08007B7B7B00313131000000000000000000D2CABBFF37312EFF000000FF0019
+      77FF0001FDFF0808FEFFB6B6FAFF9191DDFF0000FFFF0000FFFF0000FFFF0000
+      FFFF000BDFFF000816FF050404FFAAA298FFD2CABBFF37312EFF000000FF0077
+      00FF00FD00FF1FF91FFFE4ECE4FF90DC90FF00FF00FF00FF00FF00FF00FF00FF
+      00FF00DF00FF001600FF050404FFAAA298FF000000005A5A5A0073739400847B
+      8C000000FF000000FF000000FF000000FF000000FF000000FF000000FF00847B
+      8C006B6B9400424242000000000000000000000000005A5A5A0084848400DEB5
+      2100F7FF0000F7FF0000F7FF0000F7FF0000F7FF0000F7FF0000F7FF0000F7E7
+      00007B7B7B00424242000000000000000000D6CEBDFFA39C92FF070606FF0003
+      08FF000DB2FF0001FDFF0707FDFF0707FDFF0000FFFF0000FFFF0000FFFF0007
+      EEFF000E41FF000000FF393734FFD1C9B9FFD6CEBDFFA39C92FF070606FF0008
+      00FF00B200FF00FD00FF1DF61DFF07FD07FF00FF00FF00FF00FF00FF00FF00EE
+      00FF004100FF000000FF393734FFD1C9B9FF00000000000000008C8C8C007373
+      9C000000FF000000FF000000FF000000FF000000FF000000FF000000FF006B73
+      94004A4A4A0000000000000000000000000000000000000000008C8C8C00D6A5
+      3100F7FF0000F7FF0000F7FF0000F7FF0000F7FF0000F7FF0000F7FF0000CEA5
+      31004A4A4A00000000000000000000000000D6CEBDFFD4CCBBFF6B655DFF0202
+      02FF000308FF001A77FF0009DFFF0005F8FF0002FDFF0009EFFF000CBEFF000C
+      2DFF000101FF1C1B18FFBBB4A5FFD6CEBDFFD6CEBDFFD4CCBBFF6B655DFF0202
+      02FF000800FF007700FF00DF00FF00F800FF00FD00FF00EF00FF00BE00FF002D
+      00FF000100FF1C1B18FFBBB4A5FFD6CEBDFF00000000000000006B6B6B006B6B
+      8C006B6B9400847B8C000000FF000000FF000000FF00847B8C006B7394007B7B
+      9C005A5A5A0000000000000000000000000000000000000000006B6B6B00A594
+      5200CEA53100DEB52100F7FF0000F7FF0000F7FF0000F7E70000CEA531009C9C
+      7B005A5A5A00000000000000000000000000D6CEBDFFD6CEBDFFD1CAB9FF6B65
+      5DFF070706FF000000FF000910FF000528FF00022CFF00091EFF000304FF0101
+      01FF252320FFB3AC9DFFD6CEBDFFD6CEBDFFD6CEBDFFD6CEBDFFD1CAB9FF6B65
+      5DFF070706FF000000FF001000FF002800FF002C00FF001E00FF000400FF0101
+      01FF252320FFB3AC9DFFD6CEBDFFD6CEBDFF0000000000000000000000005A5A
+      5A004A4A4A006B6B94006B6B8C0063638C006B6B8C006B6B94007B7B7B005A5A
+      5A00000000000000000000000000000000000000000000000000000000005A5A
+      5A004A4A4A008C8C6B008C8C6B00848463008C8C6B008C8C6B007B7B7B005A5A
+      5A0000000000000000000000000000000000D6CEBDFFD6CEBDFFD6CEBDFFD4CC
+      BBFFA39C92FF37312EFF11100FFF030303FF010101FF080808FF1D1A19FF6B65
+      5DFFC6BEB0FFD6CEBDFFD6CEBDFFD6CEBDFFD6CEBDFFD6CEBDFFD6CEBDFFD4CC
+      BBFFA39C92FF37312EFF11100FFF030303FF010101FF080808FF1D1A19FF6B65
+      5DFFC6BEB0FFD6CEBDFFD6CEBDFFD6CEBDFF0000000000000000000000000000
+      0000000000005A5A5A004242420042424200424242005A5A5A00000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000005A5A5A004242420042424200424242005A5A5A00000000000000
+      000000000000000000000000000000000000D6CEBD00D6CEBDFFD6CEBDFFD6CE
+      BDFFD6CEBDFFD2CABBFFBBB4A6FFAAA497FFA7A194FFB0AA9DFFC7C0B1FFD6CE
+      BDFFD6CEBDFFD6CEBDFFD6CEBDFFD6CEBDFFD6CEBDFFD6CEBDFFD6CEBDFFD6CE
+      BDFFD6CEBDFFD2CABBFFBBB4A6FFAAA497FFA7A194FFB0AA9DFFC7C0B1FFD6CE
+      BDFFD6CEBDFFD6CEBDFFD6CEBDFFD6CEBDFF0000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000424D3E000000000000003E000000
+      2800000040000000200000000100010000000000000100000000000000000000
+      000000000000000000000000FFFFFF00FFFF000000000000F83F000000000000
+      E00F000000000000C007000000000000C0070000000000008003000000000000
+      8003000000000000800300000000000080030000000000008003000000000000
+      8003000000000000C007000000000000C007000000000000E00F000000000000
+      F83F000000000000FFFF00000000000000000000FFFFFFFF00000000F83FF83F
+      00000000E00FE00F00000000C007C00700000000C007C0070000000080038003
+      0000000080038003000000008003800300000000800380030000000080038003
+      000000008003800300000000C007C00700000000C007C00700000000E00FE00F
+      00000000F83FF83F00000000FFFFFFFF00000000000000000000000000000000
+      000000000000}
+  end
+  object ilLarge: TImageList
+    Height = 32
+    Width = 32
+    Left = 568
+    Top = 120
+    Bitmap = {
+      494C010102000500040020002000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
+      0000000000003600000028000000800000002000000001002000000000000040
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000FEFEFE00FEFEFE00FDFDFD00FBFB
+      FB00F8F8F800F6F6F600F3F3F300F2F2F200F2F2F200F3F3F300F6F6F600F8F8
+      F800FBFBFB00FDFDFD00FEFEFE00000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000FEFEFE00FEFEFE00FCFC
+      FC00FAFAFA00F8F8F800F6F6F600F5F5F500F6F6F600F6F6F600F8F8F800FAFA
+      FA00FCFCFC00FEFEFE00FEFEFE00000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000FEFEFE00FCFCFC00F7F7F700F0F0F000E5E5
+      E500D9D9D900CECECE00C5C5C500C1C1C100C1C1C100C5C5C500CECECE00D8D8
+      D800E5E5E500EFEFEF00F8F8F800FCFCFC00FEFEFE0000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000FDFDFD00FAFAFA00F4F4F400EBEB
+      EB00E1E1E100D8D8D800D0D0D000CCCCCC00CCCCCC00D0D0D000D7D7D700E1E1
+      E100EBEBEB00F3F3F300FAFAFA00FDFDFD00FEFEFE0000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000FEFEFE00FDFDFD00F8F8F800EDEDED00DBDBDB00C3C3C300A9A9
+      AB008A8C9E006E729E00595FA7005058AC005058AC00595FA7006F729D008A8B
+      9D00A9A9AB00C2C2C200DCDCDC00EDEDED00F8F8F800FDFDFD00000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000FEFEFE00FAFAFA00F1F1F100E3E3E300CFCFCF00B8B8
+      B800A1A3A2008A97900079928600728F8100728F8100799285008A979000A0A2
+      A100B8B8B800CECECE00E4E4E400F1F1F100FAFAFA00FEFEFE00000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000FEFEFE00FCFCFC00F4F4F400E4E4E400C6C6C600A3A3A400686CA400303B
+      C6001020E5000618F0000114F6000013F8000013F8000114F6000618F0001120
+      E400313CC500676BA400A3A3A500C5C5C500E4E4E400F4F4F400FDFDFD00FEFE
+      FE00000000000000000000000000000000000000000000000000000000000000
+      0000FEFEFE00FDFDFD00F7F7F700E9E9E900D0D0D000AFAFAF0084938B005495
+      730032A3690023AB65001BB1630019B2640019B264001BB0630022AB640032A3
+      68005494730083928A00B0B0B000CFCFCF00E9E9E900F6F6F600FDFDFD00FEFE
+      FE00000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000000000000000000000FEFE
+      FE00FCFCFC00F2F2F200D8D8D800B1B1B2006D709F00202DCD000114F2000012
+      F2000012EF000011EC000011EA000011E9000011E9000011EA000011EC000012
+      EF000012F3000113F100202DCF006B6E9F00B1B1B200D7D7D700F1F1F100FCFC
+      FC00FEFEFE000000000000000000000000000000000000000000000000000000
+      0000FDFDFD00F5F5F500DFDFDF00BDBDBD0087988F0045986B001DB0600019B3
+      5F0019B25D0018B05D0018AE5C0018AE5C0018AE5C0018AF5C0018B05D0019B1
+      5D0019B35F001EAF600046976B0085968D00BEBEBE00DFDFDF00F5F5F500FDFD
+      FD00FEFEFE000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000FEFEFE00FCFC
+      FC00F3F3F300DADADA00A8A8AB005157AE000819E6000012EF000011EA000011
+      E6000010E1000010DD000010DA000010DA000010DA000010DB000010DE000010
+      E1000011E6000011EA000012EE000818E6005057AE00A7A7AA00D9D9D900F2F2
+      F200FCFCFC00000000000000000000000000000000000000000000000000FDFD
+      FD00F5F5F500E0E0E000B3B4B30070947F0029A95F001AB25B001AB05A001AAD
+      580019A9560019A6550019A5540019A4540019A4540019A5540019A7550019A9
+      56001AAD58001AB059001AB25B0028A85F0070957F00B2B3B200DFDFDF00F5F5
+      F500FDFDFD000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000FDFDFD00F6F6
+      F600D9D9D900A8A8AB003B44B9000213E9000011E8000010E200000FDB00000F
+      D500000FD000000FCB00000FC900000FC700000FC700000FC800000FCC00000F
+      CF00000FD500000FDB000010E2000011E8000213E9003C45B400A6A6AA00D9D9
+      D900F5F5F500FDFDFD0000000000000000000000000000000000FDFDFD00F7F7
+      F700DFDFDF00B3B4B4005C96730020AF58001BB156001AAC54001AA751001AA3
+      4F00199F4D00199C4C00199A4A0018984A0018984A0019994A00199C4C00199F
+      4D001AA34F001AA751001BAD54001BB1560020AF59005D927200B2B3B200DFDF
+      DF00F7F7F700FDFDFD0000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000FEFEFE00F9F9F900E6E6
+      E600B5B5B6004F56B1000112E5000011E3000010DC00000FD400000FCD00000F
+      C600000EC000000EBC00000EB900000EB800000EB800000EBA00000EBD00000E
+      C100000FC600000FCD00000FD4000010DC000011E3000213E6004E55B100B4B4
+      B500E5E5E500F9F9F900FEFEFE00000000000000000000000000FAFAFA00EAEA
+      EA00BDBDBD006C987B0021B055001DAF51001CAA4F001BA44C001A9F4A001A9A
+      4700199645001892440018904200188F4200188F420018904200199344001996
+      46001A9A47001A9E4A001BA44C001CAA4F001CB0520022AE54006D987C00BDBD
+      BD00E9E9E900FAFAFA00FEFEFE00000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000FDFDFD00EEEEEE00CACA
+      CA006B6FA5000617DD000010DF00000FD700000FCE00000EC600000EBD00000D
+      B700000DB100000DAD00000CAA00000CA800000CA800000DA900000DAD00000D
+      B100000DB700000EBD00000FC600000FCE00000FD7000010DF000616DD006A6E
+      A400C9C9C900EFEFEF00FDFDFD000000000000000000FDFDFD00F1F1F100D0D0
+      D000819A890029AB53001FAE4E001EA84B001CA248001B9B44001A9542001A90
+      3F00198C3E0018883C0018863C0018853B0018853B0018863C0018883D00198C
+      3E001A903F001A9642001B9C44001CA248001DA94A001FAF4D0028AB53008099
+      8800CFCFCF00F1F1F100FDFDFD00000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000FEFEFE00F9F9F900DFDFDF00A7A7
+      AD001D2AC9000010DD00000FD500000FCC00000EC200000EBA00000DB100000C
+      AA00000CA400000CA000000B9D00000B9C00000B9C00000B9D00000CA100000C
+      A500000CAB00000DB100000EBA00000EC200000FCC00000FD5000010DD001A27
+      C900A7A7AB00E0E0E000F9F9F900FEFEFE00FEFEFE00FAFAFA00E3E3E300B0B2
+      B10041A15C0020B04A001FAA48001EA344001C9B41001B943E001A8D3C001988
+      39001883370018803500177E3500177D3400177D3400177E3500188036001884
+      3800198839001A8E3C001B953E001C9B41001EA344001FA9480020B049003DA1
+      5A00AFB1B000E4E4E400FAFAFA00FEFEFE000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000FDFDFD00F3F3F300C8C8C8006267
+      AA000010DA00000FD500000FCA00000EC000000DB600000CAD00000CA400000C
+      9E00010D9800010E9500020D9200020D9100020D9100020D9200010E9600010D
+      9900000D9F00000CA500000CAE00000DB600000EC000000FCA00000FD4000010
+      DA006167AC00C9C9C900F2F2F200FDFDFD00FDFDFD00F4F4F400CCCCCC00799B
+      820022AF460021AB430020A441001E9B3E001C933B001B8B37001A8535001980
+      3300197C3200197931001876300018753000187530001976300019793100197C
+      3200198133001A8536001B8C38001C933B001E9B3E0020A3410021AB440022AF
+      4600799C8100CDCDCD00F3F3F300FDFDFD000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000FBFBFB00EBEBEB00B0B0B4002833
+      BF00000FD400000FCC00000EC100000DB700000CAC00010EA40004119D000511
+      97000511920005118D0005108A00051089000510890005108B0005118E000511
+      92000511980004119D00010EA500000CAC00000DB700000EC100000FCC00000F
+      D4002833C000B0B1B500E9E9E900FCFCFC00FCFCFC00ECECEC00B6B7B60049A2
+      5C0022AD410022A73F00209E3C001E9639001D8D35001C8733001E8234001E7D
+      33001D7832001C7530001C7230001C712F001C712F001C7230001C7631001D79
+      32001E7E33001E8334001C8734001C8E36001E963900209E3C0022A73F0023AE
+      410048A35C00B7B8B700EBEBEB00FCFCFC000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000F9F9F900E0E0E0008C8EA9000A18
+      CB00000FCD00000FC300000DB800010EAE000916A7000D19A1000D1999000D18
+      93000D188D000D1889000D1786000D1786000D1786000D1787000D188A000D18
+      8E000D1993000D1999000D19A2000816A800010EAE00000DB800000FC300000F
+      CD000918CC008C8EAB00DFDFDF00FAFAFA00FAFAFA00E2E2E20096A599002EAA
+      440024AB3D0022A23A00219937001F903400248B37002787390026823700257C
+      3500247833002474320024723200237132002472320024723200247433002478
+      3300257D35002683380028883A00248C37001F9134002199360022A23A0024AA
+      3D002FAA450097A79A00E0E0E000FAFAFA000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000F7F7F700D7D7D7006B6FA7000010
+      CD00000EC600000EBC00010FB2000F1DAD001521A60015219D00152197001520
+      910015208B0015208800151F8500151F8400151F8400151F8600152088001520
+      8C00152091001521970015219F001422A6000F1DAE00020FB200000EBC00000F
+      C7000211CC006B6FAB00D5D5D500F7F7F700F7F7F700D9D9D9007C9F810027AD
+      3B0025A83900229F3500229633002C933B003190400030883D002E823B002D7D
+      39002C7937002C7636002B7336002B7336002B7336002B7336002C7637002C79
+      37002D7E39002E833C0030893D0031903F002C943C0022963300239F350025A8
+      390029AC3C007CA18100D7D7D700F7F7F7000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000F5F5F500D0D0D0005157AC00000F
+      C800000EC000000DB6001523B4001E2CAE001F2BA5001F2A9D001F2A96001F29
+      91001F298C001F2988001F2886001F2885001F2885001F2886001F2989001F29
+      8D001F2A91001F2A97001F2B9E001F2BA6001E2CAE001523B400000EB600000E
+      C000000FC9005258AF00CFCFCF00F5F5F500F5F5F500D1D1D100659E6B0028AC
+      360026A53400249C3000339B3E003D9946003B924400398B410038853F003780
+      3E00367D3D00357A3D0035773C0035763C0035763C0035773C00357A3D00367D
+      3D0037813E0038854000398C41003B9245003D9A4600339C3F00249C310026A6
+      340028AC360067A26D00D0D0D000F6F6F6000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000F4F4F400CDCDCD00444CAE00000F
+      C400000EBC000D1BB6002835B6002935AE002934A60029339E00293398002932
+      930029328E0029328A002932880029328700293287002932880029328B002932
+      8F00293294002933980029349F002934A6002935AE002835B6000D1CB700000E
+      BB00000FC400454DAE00CCCCCC00F5F5F500F4F4F400CDCDCD005BA060002AAB
+      320028A42F002F9F360047A44E00469C4C0044954A00428F4700418945003F84
+      44003F8143003E7E42003E7B41003E7B41003E7B41003E7B41003E7E43003F81
+      430040854400418946004290480044964900469D4C0047A44E002F9F370028A3
+      30002AAB32005CA06000CCCCCC00F5F5F5000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000F4F4F400CECECE004149AF00000E
+      C000010FB8002835BD003540B8003540B000353FA800353EA200353E9B00353E
+      9700353D9300353D9000353D8D00353D8C00353D8C00353D8E00353D9000353D
+      9400353E9700353E9C00353EA300353FA800353FB1003540B9002835BD00010F
+      B800000FC000454DAC00CDCDCD00F5F5F500F4F4F400CECECE0059A25A002BAA
+      2E002AA32D0048AA4B0054A9560051A25300509A51004E9550004C8F4E004B8B
+      4C004A874C0049844B0049824A0049824A0049824A0049824B0049854B004A88
+      4C004B8C4D004D904E004E9550004F9B510051A2530054A9560049AB4B002BA3
+      2D002BAA2D005CA05E00CCCCCC00F5F5F5000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000F6F6F600D3D3D3004F55AB00000E
+      BC000A18B8003C48C100404BBB00404BB300404AAC00404AA6004049A1004049
+      9B00404898004048950040489300404893004048930040489300404895004048
+      980040499C004049A100404AA700404AAC00404BB400404BBB003C48C1000917
+      B800000FBD004F56AC00D1D1D100F6F6F600F5F5F500D2D2D20062A261002CAA
+      2B0033A631005CB35A005FAE5D005CA75B005BA15900599B5800589656005792
+      5500558F5400558C5300558A53005489530054895300558A5300558C5400568F
+      54005792550058965600599C58005BA15A005CA85B005EAF5D005CB45B0033A7
+      31002CAA2A0062A26100D0D0D000F5F5F5000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000F8F8F800DBDBDB00686DA900000E
+      B8001623BA004C57C5004D58BE004D57B7004D57B2004D56AC004D56A7004D55
+      A3004D55A0004D559C004D559B004D559A004D559A004D559B004D559D004D55
+      A0004D55A3004D56A7004D56AD004D57B2004D57B8004D58BF004C58C6001523
+      BA00010FB700686DAD00D9D9D900F8F8F800F7F7F700D9D9D90074A371002EAA
+      27003FAC38006BBB66006BB5660069AE640068A8630066A36200649F6000639B
+      600063985F0062955E0062945E0061935E0061935E0062945E0062965E006398
+      5F00649B6000659F610066A4620067A9630069AF64006BB566006DBB67003FAC
+      38002FA9270075A77200D8D8D800F8F8F8000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000FAFAFA00E4E4E4008C8EAE000512
+      B3001D2ABB005A64C9005A64C3005A63BD005A62B7005A62B3005A62AE005A61
+      AB005A61A7005A61A5005A61A4005A61A3005A61A3005A61A4005A61A5005A61
+      A7005A62AB005A62AF005A62B3005A63B7005A63BE005A64C3005964CA001B28
+      BB000713B3008C8FB100E3E3E300FBFBFB00FAFAFA00E2E2E20090A98D0033A9
+      260049B13D0079C1700077BB6E0075B56D0073B06C0072AC6B0070A76A006FA4
+      69006EA069006E9F68006E9D68006D9D68006D9D68006E9D68006E9F68006FA1
+      690070A4690070A86A0072AD6B0073B16C0075B66D0077BC6E0079C1700047B0
+      3C0033A8270090AC8C00E1E1E100FAFAFA000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000FCFCFC00EEEEEE00B4B5BC001F29
+      AC001926B800656FCD006871C9006871C3006870BF006870BA00686FB600686F
+      B300686FB100686FAE00686FAD00686FAC00686FAC00686FAD00686FAE00686F
+      B100686FB3006870B7006870BC006870BF006871C4006871C9006670CD001926
+      B8001F29AD00B5B6BF00EDEDED00FCFCFC00FCFCFC00ECECEC00B0B8AF0042A6
+      320049B1380084C8790085C37A0083BF790081B9780080B577007FB276007EAE
+      76007DAB75007DA974007CA874007CA874007CA874007DA874007DAA74007DAB
+      75007EAE76007FB2770081B6770081BA780083BF790085C47A0085C87A0049B1
+      380043A73400B3BBB100EBEBEB00FCFCFC000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000FDFDFD00F6F6F600D1D1D200585D
+      AA000D19B2006974CF00767FCE00767FCA00767EC600767EC200767DBE00767D
+      BB00767DB900767DB800767DB600767DB600767DB600767DB700767DB800767D
+      B900767DBC00767DBF00767EC200767EC600767FCA00767FCF006973CF000C19
+      B100585EAB00D3D3D300F5F5F500FDFDFD00FDFDFD00F4F4F400CDCECD0067A6
+      5A0041AD2A008CCC7D0091CB840090C784008EC283008DBF82008CBB82008BB8
+      81008AB681008AB4810089B380008AB380008AB380008AB380008AB481008BB6
+      81008BB881008CBB82008DBF82008EC2830090C7840091CB85008CCC7D0042AE
+      2B0067A85900CFCFCF00F4F4F400FDFDFD000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000FEFEFE00FBFBFB00E6E6E600ACAC
+      BA00121CA800515BC500878ED500878ED100878DCE00878DCB00878DC800878D
+      C500878DC300878DC200878DC100878DC100878DC100878DC100878DC200878D
+      C300878DC600878DC800878DCB00878DCE00878ED200878ED500525DC6000F1A
+      A700AAABB900E7E7E700FBFBFB00FEFEFE00FEFEFE00FAFAFA00E3E3E300A7B4
+      A3003EA8230080C76C009FD391009ECF90009CCC90009BC88F009AC58F009AC2
+      8F0099C18E0099C08E0098BF8E0098BE8E0098BE8E0098BF8E0099C08E0099C1
+      8E009AC38F009AC58F009CC890009DCC90009ECF90009FD3910080C86D003DA8
+      2100A5B4A200E3E3E300FAFAFA00FEFEFE000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000FDFDFD00F4F4F400D7D7
+      D7006367A9001A26AE008D94D800959CD700959BD500959BD200959BD000959B
+      CE00959BCD00959BCB00959BCA00959BCA00959BCA00959BCA00959BCB00959B
+      CD00959BCE00959BD100959BD300959BD600959CD7008D94D8001925AE006166
+      A800D6D6D600F4F4F400FDFDFD000000000000000000FDFDFD00F2F2F200D1D2
+      D1006BA7590055B53700A9D99900ACD79D00AAD49C00AAD19C00A8CF9C00A7CD
+      9C00A7CB9B00A7CA9A00A6C99A00A6C99A00A6C99A00A6C99A00A7CA9A00A7CB
+      9B00A8CD9C00A8CF9C00AAD29C00ABD59C00ACD79D00ABD99B0056B5370069A7
+      5700D0D1D000F2F2F200FDFDFD00000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000FBFBFB00EEEE
+      EE00C1C1C6003D44A300404ABB00A0A6DC00A6ABDD00A6ABDB00A6ABD900A6AB
+      D700A6ABD600A6ABD600A6ABD500A6ABD500A6ABD500A6ABD500A6ABD600A6AB
+      D600A6ABD800A6ABD900A6ABDB00A6ABDD009FA5DD00414BBB003D44A400C1C2
+      C600EDEDED00FBFBFB0000000000000000000000000000000000FAFAFA00EBEB
+      EB00B7BFB50054A637007EC66200B8DFA800B9DDAA00B8DBAA00B7D9AA00B7D7
+      A900B6D6A900B6D4A900B6D4A900B6D4A900B6D4A900B6D4A900B6D4A900B6D6
+      A900B7D7A900B7D9AA00B8DBAA00B9DDAA00B9DFA9007EC6630054A73600B7BF
+      B400EAEAEA00FAFAFA00FEFEFE00000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000FEFEFE00F9F9
+      F900E5E5E500B4B5C0002E36A100525BBE00B2B6E200B6BAE200B6BAE100B6BA
+      E000B6BADF00B6BADF00B6BADE00B6BADE00B6BADE00B6BADE00B6BADF00B6BA
+      DF00B6BAE000B6BAE100B6BAE200B2B6E200505ABE002931A000B3B4BF00E5E5
+      E500F8F8F800FEFEFE0000000000000000000000000000000000FDFDFD00F8F8
+      F800E0E0E000A9B9A30050A92A008DCB7100C6E5B800C6E3B800C5E1B800C5E0
+      B800C5DFB800C4DFB800C4DEB800C4DEB800C4DEB800C4DEB800C4DFB800C5DF
+      B800C5E0B800C5E2B800C6E4B800C6E4B70090CE75004FA92900A9B9A300E0E0
+      E000F7F7F700FDFDFD0000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000000000000000000000FEFE
+      FE00F8F8F800E7E7E700B5B5C0003A419F003A44B100A0A6DA00C7CAE900C8CB
+      E900C8CBE800C8CBE800C8CBE700C8CBE700C8CBE700C8CBE700C8CBE800C8CB
+      E800C8CBE900C7CAE900A2A7DB003D46B2003B41A000B2B3C000E6E6E600F7F7
+      F700FDFDFD00000000000000000000000000000000000000000000000000FDFD
+      FD00F5F5F500E1E1E100A7B8A00055A72E0081C55D00C7E5B700D4EAC800D4E9
+      C800D3E8C800D3E8C800D3E8C700D3E7C700D3E7C700D3E8C700D3E8C800D3E8
+      C800D4EAC800D4EAC800C7E5B60083C6600056A82E00A5B89D00E0E0E000F5F5
+      F500FDFDFD000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000FDFDFD00F8F8F800E6E6E600C3C3C9005F65A5001E279E005C63BD00AAAF
+      DD00D5D8EE00D9DBF000D8DAF000D8DAF000D8DAF000D8DAF000DADCF000D6D8
+      EF00ABAFDD005C64BD001E279D005D62A400C3C3C900E6E6E600F7F7F700FDFD
+      FD00000000000000000000000000000000000000000000000000000000000000
+      0000FDFDFD00F6F6F600E1E1E100B7C1B20067A945005BB22B00A2D48600D6EB
+      C900E0F0D600E1F0D700E0F0D700E0EFD700E0F0D700E0F0D700E0F0D700E0EF
+      D700D6EBC800A4D487005CB32D0066A94300B7C2B200E1E1E100F5F5F500FDFD
+      FD00FEFEFE000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000FEFEFE00F9F9F900EFEFEF00DBDBDB00ACADBD005257A2001E26
+      9700232CA0004D55B3007177C2008389CB00838ACB007379C3004B54B300242E
+      A0001D2597005257A100AEAFBF00DADADB00F0F0F000FAFAFA00FDFDFD000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000FDFDFD00F7F7F700EAEAEA00D0D2D0009CB58E0060A8350053AB
+      1D0079BF4D009DD07B00B7DC9E00C1E1AA00C0E1AA00B8DD9F009DD17B007AC0
+      4E0052AA1C005EA733009CB68D00D0D0CF00EBEBEB00F8F8F800FDFDFD00FEFE
+      FE00000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000FEFEFE00FCFCFC00F5F5F500EAEAEA00D8D8D900B9BA
+      C3008A8CB0005F63A10044499A00353C9700353C9700434999006165A1008B8D
+      AF00B9B9C400D7D7D800EBEBEB00F5F5F500FCFCFC00FEFEFE00000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000FEFEFE00FAFAFA00F2F2F200E4E4E400CDD0CB00A9BC
+      9E0084B0680067A73E0055A5210053A61C0053A61C0055A5210067A73D0084AF
+      6800AABC9F00CCCFCB00E4E4E400F2F2F200FAFAFA00FEFEFE00000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000FEFEFE00FCFCFC00F8F8F800F2F2
+      F200EBEBEB00E3E3E300DDDDDD00D9D9DA00D9D9DA00DDDDDD00E3E3E300EBEB
+      EB00F2F2F200F8F8F800FCFCFC00FEFEFE000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000FDFDFD00FAFAFA00F5F5F500EDED
+      ED00E4E4E400DCDCDC00D5D5D500CFD0CE00CFD0CF00D5D5D500DBDBDB00E3E3
+      E300EDEDED00F4F4F400FAFAFA00FDFDFD000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000FEFEFE00FDFD
+      FD00FCFCFC00FAFAFA00F9F9F900F8F8F800F8F8F800F8F8F800FAFAFA00FCFC
+      FC00FDFDFD00FEFEFE0000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000FEFEFE00FEFEFE00FCFC
+      FC00FAFAFA00F8F8F800F6F6F600F6F6F600F6F6F600F6F6F600F8F8F800FAFA
+      FA00FCFCFC00FEFEFE00FEFEFE00000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000424D3E000000000000003E000000
+      2800000080000000200000000100010000000000000200000000000000000000
+      000000000000000000000000FFFFFF00FF0001FFFF8001FF0000000000000000
+      FE00007FFF00007F0000000000000000F800003FFC00003F0000000000000000
+      F000000FF000000F0000000000000000E0000007F00000070000000000000000
+      C0000007E00000070000000000000000C0000003C00000030000000000000000
+      80000001C0000001000000000000000080000001800000010000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      80000001800000010000000000000000C0000003C00000010000000000000000
+      C0000003C00000030000000000000000E0000007E00000070000000000000000
+      F000000FF00000070000000000000000F800001FF800000F0000000000000000
+      FC00003FFC00003F0000000000000000FF0000FFFF0000FF0000000000000000
+      FFC003FFFF8001FF000000000000000000000000000000000000000000000000
+      000000000000}
+  end
+  object pmuVms: TPopupMenu
+    Tag = 1
+    AutoHotkeys = maManual
+    OnPopup = pmuVmsPopup
+    Left = 360
+    Top = 108
+    object MnuVmsId: TMenuItem
+      Caption = 'VMS ID'
+      Default = True
+      Enabled = False
+    end
+    object N3: TMenuItem
+      Caption = '-'
+    end
+    object mnuVmsStatusReq: TMenuItem
+      Caption = 'Status Request'
+      OnClick = mnuVmsStatusReqClick
+    end
+    object mnuVmsFormDn: TMenuItem
+      Caption = 'Form Download'
+      OnClick = mnuVmsFormDnClick
+    end
+    object N1: TMenuItem
+      Caption = '-'
+    end
+    object mnuVmsPower: TMenuItem
+      Caption = 'Power'
+      object mnuVmsPowerOn: TMenuItem
+        Caption = 'On'
+        OnClick = mnuVmsPowerOnClick
+      end
+      object mnuVmsPowerOff: TMenuItem
+        Tag = 1
+        Caption = 'Off'
+        OnClick = mnuVmsPowerOnClick
+      end
+    end
+    object N2: TMenuItem
+      Caption = '-'
+    end
+    object mnuVmsReset: TMenuItem
+      Tag = 2
+      Caption = 'Controller Reset'
+      OnClick = mnuVmsPowerOnClick
+    end
+    object N4: TMenuItem
+      Caption = '-'
+    end
+    object Disconnect1: TMenuItem
+      Caption = 'Disconnect'
+      OnClick = Disconnect1Click
+    end
+  end
+end

+ 124 - 0
SRC/FRM/FrmVmsInfoF.h

@@ -0,0 +1,124 @@
+//---------------------------------------------------------------------------
+
+#ifndef FrmVmsInfoFH
+#define FrmVmsInfoFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <Buttons.hpp>
+#include <ExtCtrls.hpp>
+#include <Graphics.hpp>
+#include <ComCtrls.hpp>
+#include <ImgList.hpp>
+//---------------------------------------------------------------------------
+#include "ITSLogF.h"
+#include "SysGlobalF.h"
+#include "TVmsCtlrF.h"
+#include "cxCalc.hpp"
+#include "cxClasses.hpp"
+#include "cxControls.hpp"
+#include "cxCustomData.hpp"
+#include "cxData.hpp"
+#include "cxDataStorage.hpp"
+#include "cxEdit.hpp"
+#include "cxFilter.hpp"
+#include "cxGraphics.hpp"
+#include "cxGrid.hpp"
+#include "cxGridCustomTableView.hpp"
+#include "cxGridCustomView.hpp"
+#include "cxGridLevel.hpp"
+#include "cxGridTableView.hpp"
+#include "cxLabel.hpp"
+#include "cxLookAndFeelPainters.hpp"
+#include "cxLookAndFeels.hpp"
+#include "cxStyles.hpp"
+#include <Menus.hpp>
+//---------------------------------------------------------------------------
+class TFrmVmsInfo : public TForm
+{
+__published:	// IDE-managed Components
+    TPanel *plServerInfo;
+    TImageList *ilSmall;
+    TImageList *ilLarge;
+    TPanel *Panel1;
+    TImage *Image3;
+    TPanel *Panel2;
+    TPanel *plErr;
+    TPanel *Panel6;
+    TPanel *plTot;
+    TPanel *plNor;
+    TcxGrid *CxList;
+    TcxGridTableView *TvList;
+    TcxGridColumn *Col01;
+    TcxGridColumn *Col02;
+    TcxGridColumn *Col03;
+    TcxGridColumn *Col04;
+    TcxGridColumn *Col00;
+    TcxGridColumn *Col05;
+    TcxGridColumn *Col06;
+    TcxGridColumn *Col07;
+    TcxGridColumn *Col08;
+    TcxGridColumn *Col09;
+    TcxGridColumn *Col10;
+    TcxGridColumn *Col11;
+    TcxGridColumn *Col12;
+    TcxGridColumn *Col99;
+    TcxGridLevel *GlList;
+    TcxGridColumn *Col13;
+    TcxGridColumn *Col14;
+    TcxGridColumn *Col15;
+    TPanel *Panel3;
+    TImage *ImgState0;
+    TImage *ImgState1;
+    TImage *ImgState3;
+    TImage *Image4;
+    TPopupMenu *pmuVms;
+    TMenuItem *MnuVmsId;
+    TMenuItem *N3;
+    TMenuItem *mnuVmsReset;
+    TMenuItem *mnuVmsPower;
+    TMenuItem *mnuVmsPowerOn;
+    TMenuItem *mnuVmsPowerOff;
+    TMenuItem *mnuVmsStatusReq;
+    TMenuItem *N1;
+    TMenuItem *N2;
+    TMenuItem *mnuVmsFormDn;
+    TMenuItem *N4;
+    TMenuItem *Disconnect1;
+    void __fastcall Col01CustomDrawCell(TcxCustomGridTableView *Sender, TcxCanvas *ACanvas,
+          TcxGridTableDataCellViewInfo *AViewInfo, bool &ADone);
+    void __fastcall TvListCellDblClick(TcxCustomGridTableView *Sender, TcxGridTableDataCellViewInfo *ACellViewInfo,
+          TMouseButton AButton, TShiftState AShift,
+          bool &AHandled);
+    void __fastcall TvListCellClick(TcxCustomGridTableView *Sender, TcxGridTableDataCellViewInfo *ACellViewInfo,
+          TMouseButton AButton, TShiftState AShift,
+          bool &AHandled);
+    void __fastcall pmuVmsPopup(TObject *Sender);
+    void __fastcall mnuVmsPowerOnClick(TObject *Sender);
+    void __fastcall mnuVmsStatusReqClick(TObject *Sender);
+    void __fastcall mnuVmsFormDnClick(TObject *Sender);
+    void __fastcall Disconnect1Click(TObject *Sender);
+
+
+private:	// User declarations
+
+    int FViewMode;
+    int FVmsCnt;
+    String FSelVmsNo;
+    String FSelVmsNm;
+
+public:
+    void __fastcall InitVmsList();
+
+public:		// User declarations
+    __fastcall TFrmVmsInfo(TComponent* Owner);
+
+    void __fastcall UpdateServerState(int AObj);
+    void __fastcall UpdateClientState(int AObj);
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TFrmVmsInfo *FrmVmsInfo;
+//---------------------------------------------------------------------------
+#endif

+ 243 - 0
SRC/FRM/FrmVmsLogF.cpp

@@ -0,0 +1,243 @@
+//---------------------------------------------------------------------------
+
+#include <vcl.h>
+#pragma hdrstop
+
+#include "FrmVmsLogF.h"
+#include "FrmSysLogF.h"
+#include "AppGlobalF.h"
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma resource "*.dfm"
+TFrmVmsLog *FrmVmsLog = NULL;
+//---------------------------------------------------------------------------
+__fastcall TFrmVmsLog::TFrmVmsLog(TComponent* Owner)
+    : TForm(Owner)
+{
+    FVmsIdx = -1;
+    FVmsId  = " ";
+    FVmsCtlr = NULL;
+
+    reMsg->Lines->Clear();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmVmsLog::btnClearClick(TObject *Sender)
+{
+    reMsg->Lines->Clear();
+    Application->ProcessMessages();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmVmsLog::btnCopyClick(TObject *Sender)
+{
+    try
+    {
+        reMsg->SelectAll();
+        reMsg->CopyToClipboard();
+    }
+    catch(Exception &e)
+    {
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmVmsLog::OnWMLogDisplayMessage(TMessage &Msg)
+{
+    if (Showing)
+    {
+        IPC_LOG_MESSAGE *pLog = (IPC_LOG_MESSAGE *)Msg.WParam;
+        if (pLog)
+        {
+            IPC_LOG_MESSAGE Log;
+            Log.Kind = pLog->Kind;
+            Log.Flag = pLog->Flag;
+            Log.Len  = pLog->Len;
+            Log.Tm   = pLog->Tm;
+            Log.Type = pLog->Type;
+            memcpy(Log.Msg, pLog->Msg, sizeof(Log.Msg));
+            if (chkLogPause->Checked) return;
+            LogWrite(&Log);
+        }
+    }
+}
+//---------------------------------------------------------------------------
+
+void TFrmVmsLog::LogWrite(IPC_LOG_MESSAGE *ALog)
+{
+    if (ALog->Type == 'S')
+    {
+        if (!chkServer->Checked) return;
+    }
+    else
+    {
+        if (!chkClient->Checked) return;
+    }
+
+    if (ALog->Kind == eLOG_DATA)
+    {
+        LogData(ALog);
+        return;
+    }
+    try
+    {
+        while (reMsg->Lines->Count >= g_AppCfg.nMaxLogLines)
+            reMsg->Lines->Delete(0);
+
+        reMsg->Lines->Add(ALog->Tm.FormatString("hh:nn:ss") + String(ALog->Msg));
+    }
+    catch(Exception &e)
+    {
+    }
+}
+//---------------------------------------------------------------------------
+
+void TFrmVmsLog::LogData(IPC_LOG_MESSAGE *ALog)
+{
+    AnsiString     sTemp;
+    AnsiString     sTime;
+    int            ii, jj, pos;
+    bool           bFileClose = false;
+    unsigned char *AData= ALog->Msg;
+
+    if (!AData) return;
+
+    String sLogData = "";
+
+    if (chkLogPause->Checked) return;
+
+    try
+    {
+        AnsiString sSndRcv = ALog->Flag == 1 ? "SEND" : "RECV";
+        sTime = AnsiString(ALog->Tm.FormatString("hh:nn:ss"));
+        if (ALog->Type == 'C')
+            sTemp.printf("%s [DATA] %s Client, [%s] %d Bytes ", sTime.c_str(), FVmsId.c_str(), sSndRcv.c_str(), ALog->Len);
+        else
+            sTemp.printf("%s [DATA] %s Server, [%s] %d Bytes ", sTime.c_str(), FVmsId.c_str(), sSndRcv.c_str(), ALog->Len);
+
+        reMsg->Lines->Add("");
+        reMsg->Lines->Add(sTemp);
+
+        AnsiString sLog;
+        AnsiString sChar;
+        AnsiString sMsg;
+
+        for (ii = 0; ii < ALog->Len; ii += 16)
+        {
+            sLogData = "";
+            sLog = "";
+            sMsg.printf("%08Xh ", ii);
+            sLog += sMsg;
+            for (jj = 0; jj < 16; jj++)
+            {
+                pos = ii + jj;
+                if (pos < ALog->Len)
+                    sMsg.printf(" %02X", AData[pos]);
+                else
+                    sMsg.printf("   ");
+
+                sLog += sMsg;
+
+                if (jj == 7)
+                {
+                    //sMsg.printf("  "); sLog += sMsg;
+                }
+            }
+
+            sMsg.printf("  ;"); sLog += sMsg;
+
+            for (jj = 0; jj < 16; jj++)
+            {
+                pos = ii + jj;
+                if (pos >= ALog->Len)
+                    break;
+
+                uint8_t v = AData[pos];
+                sMsg.printf("%c", isprint(v) ? v : '.');
+                sLog += sMsg;
+                if (jj == 7)
+                {
+                    //sMsg.printf(" "); sLog += sMsg;
+                }
+            }
+            sLogData += sLog;
+            //sLogData = sLogData.SubString(0, sLogData.Length()-2);
+            reMsg->Lines->Add(sLogData);
+        }
+        reMsg->Lines->Add("");
+    }
+    catch(Exception &e)
+    {
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmVmsLog::FormClose(TObject *Sender, TCloseAction &Action)
+{
+    DisplayVmsLog();
+    Hide();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmVmsLog::DisplayVmsLog(int AVmsIdx/*=-1*/)
+{
+    VmsIterator it;
+    for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
+    {
+        TVmsCtlr *pObj = (TVmsCtlr*)it->second;
+        if (!pObj->FDispLog)
+        {
+            pObj->FCLog->FLogCfg = g_LogCfg;
+            pObj->FSLog->FLogCfg = g_LogCfg;
+        }
+    }
+
+    if (FVmsCtlr)
+    {
+        FVmsCtlr->FDispLog = false;
+        FVmsCtlr->FCLog->FLogCfg = g_LogCfg;
+        FVmsCtlr->FSLog->FLogCfg = g_LogCfg;
+    }
+    if (AVmsIdx < 0)
+    {
+        FVmsCtlr = NULL;
+        return;
+    }
+
+    FVmsCtlr = (TVmsCtlr*)AVmsIdx;
+
+    FLogCfg = FVmsCtlr->FSLog->FLogCfg;
+
+    chkInfo->Checked    = FLogCfg.Info;
+    chkData->Checked    = FLogCfg.Data;
+    chkError->Checked   = FLogCfg.Error;
+    chkWarning->Checked = FLogCfg.Warning;
+    chkDebug->Checked   = FLogCfg.Debug;
+    chkDetail->Checked  = FLogCfg.Detail;
+
+    FVmsCtlr->FDispLog = true;
+    FVmsId = FVmsCtlr->VmsId;
+    //Caption = "VMS Log: " + FVmsCtlr->VmsId + ", " + FVmsCtlr->Name;
+    Caption = FVmsCtlr->VmsId + ", " + FVmsCtlr->Name;
+
+    btnClearClick(NULL);
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmVmsLog::btnSetLogClick(TObject *Sender)
+{
+    FLogCfg.Info    = chkInfo->Checked;
+    FLogCfg.Data    = chkData->Checked;
+    FLogCfg.Error   = chkError->Checked;
+    FLogCfg.Warning = chkWarning->Checked;
+    FLogCfg.Debug   = chkDebug->Checked;
+    FLogCfg.Detail  = chkDetail->Checked;
+
+    if (FVmsCtlr)
+    {
+        FVmsCtlr->FCLog->FLogCfg = FLogCfg;
+        FVmsCtlr->FSLog->FLogCfg = FLogCfg;
+    }
+}
+//---------------------------------------------------------------------------
+

+ 573 - 0
SRC/FRM/FrmVmsLogF.dfm

@@ -0,0 +1,573 @@
+object FrmVmsLog: TFrmVmsLog
+  Left = 0
+  Top = 0
+  BorderIcons = [biSystemMenu, biMaximize]
+  Caption = 'VMS Communication Log'
+  ClientHeight = 610
+  ClientWidth = 613
+  Color = clWhite
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -12
+  Font.Name = 'Tahoma'
+  Font.Style = []
+  Icon.Data = {
+    000001000100100F000000000000540500001600000028000000100000001E00
+    000001000800000000002C01000000000000000000000000000000000000FFD1
+    B400FFB9A100AA867A00309ED100289ACE00279ACE002597CE00005B89004545
+    350011395100002958003A3C270026353A002627140000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000FFFFFF000707
+    07070E07070707070E0707070707070504070E07040303070E07050605070707
+    07070E07070307070E07070707070E0E0E0E0E0E0703070E0E0E0E0E0E0E0E0E
+    0E0E0E0E070A090E0E0E0E0E0E0E0E0E0E0E0E0E0C00000E0E0E0E0E0E0E0E0E
+    0E0E08000000000E020B0E0E0E0E0E0E000000000000000E0202020D0E0E0E00
+    0000000000000E0E020202020E0E0E000000000E0E0E01010E0E02020E0E0E00
+    000E0E010101010101010E020E0E0E0E0E010101010101010101010E0E0E0E01
+    01010101010101010E0E0E0E0E0E0E0E0E010101010E0E0E0E0E0E0E0E0E0E0E
+    0E0E0E0E0E0E0E0E0E0E0E0E0E0E082000000820000008200000FC7F0000FC3F
+    0000F00F0000C003000000010000000100000001000000010000000100000007
+    0000803F0000E1FF0000}
+  OldCreateOrder = False
+  ShowHint = True
+  OnClose = FormClose
+  PixelsPerInch = 96
+  TextHeight = 14
+  object plServerInfo: TPanel
+    AlignWithMargins = True
+    Left = 2
+    Top = 82
+    Width = 609
+    Height = 528
+    Margins.Left = 2
+    Margins.Top = 2
+    Margins.Right = 2
+    Margins.Bottom = 0
+    Align = alClient
+    Alignment = taLeftJustify
+    BevelKind = bkSoft
+    BevelOuter = bvNone
+    ParentBackground = False
+    ParentColor = True
+    TabOrder = 0
+    object Panel1: TPanel
+      Left = 0
+      Top = 0
+      Width = 605
+      Height = 25
+      Align = alTop
+      BevelOuter = bvNone
+      TabOrder = 0
+      object Image1: TImage
+        Left = 0
+        Top = 0
+        Width = 25
+        Height = 25
+        Align = alLeft
+        Center = True
+        Picture.Data = {
+          07544269746D6170361B0000424D361B00000000000036000000280000003000
+          0000300000000100180000000000001B0000130B0000130B0000000000000000
+          0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFE8ECEFE1E6E9FDFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9DADB454E570D1012131313
+          1D2731878E94FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFAFBFB23282E1400008E3D009A4B015F27000000007D8183FFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFC4CA000000CA6400F07600EA7B0E
+          FF951A7C36000F1822F5F6F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFBEC4CA000000C46100D66A00D6710DF68717873C00141B22F5F6F7FFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFC4CA000000BF5F00D76A00D6710D
+          F586177F3800181F26F7F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFBFC4CA000000BF5F00D76A00D6710DF586177F3800181F26F7F8F8FFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFC4CA000000BF5F00D76A00D6710D
+          F586177F3800181F26F7F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFBFC4CA000000BF5F00D76A00D6710DF586177F3800181F26F7F8F8FFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFC4CA000000BF5F00D76A00D6710D
+          F586177E3700181F27F7F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF868A8E232E
+          3A2931392C343D2C343D2C343D2C343D2C343D2C343D2C343D2C343D2C343D2C
+          343D2C343D2C343D2C343D2C343D2C343D2C343D2C343D2C343D2C343D2C343D
+          2C343D2C343D2C343D2C343D29313A202C3881868BFFFFFFFFFFFFFFFFFFFFFF
+          FFBFC4CA000000BF5F00D76A00D6710DF58617813900161D24F6F7F7FFFFFFFF
+          FFFFFFFFFFFFFFFFAAADAD000000531B007C3500733100733100733100733100
+          7331007331007331007331007331007331007331007331007331007331007331
+          007331007331007331007331007331007331007331007331007331007935005F
+          2000000000878C8DFFFFFFFFFFFFFFFFFFBFC4CA000000BF5F00D76A00D6710D
+          F58617873D0010171EF4F4F5FFFFFFFFFFFFFFFFFFFFFFFF4354643A0C00FF9E
+          11FF8F0FFF8E0DFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF
+          8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0C
+          FF8F0CFF8F0CFF8F0CFF8E0EFF8E0FFFA0114C1600394959FFFFFFFFFFFFFFFF
+          FFBFC4CA000000BF5F00D76A00D6710DF58617873D000F171EF4F4F5FFFFFFFF
+          FFFFFFFFFFFFFFFF4253643F1000FF9410EC7C0CDD740CBB6612B56414B86513
+          B86513B86513B86513B86513B86513B86513B86513B86513B86513B86513B865
+          13B86513B86513B86513B86513B86513B86513B46314C16911E1760CEC7C0DFF
+          920F531D003A4755FFFFFFFFFFFFFFFFFFBFC4CA000000BF5F00D76A00D6710D
+          F58617873D0010171EF4F4F5FFFFFFFFFFFFFFFFFFFFFFFF4354643B0E00FF93
+          0FF17D0991551B262A33342F2F36302F36302F36302F36302F362E2E362E2E36
+          2F2E36302F36302F36302F36302F362F2E362E2E362E2E362F2F36302F36302F
+          36302F312E302D2D31A95F16F68009FF920F4E1A003B4956FFFFFFFFFFFFFFFF
+          FFBFC4CA000000BF5F00D76A00D6710DF58617873D0010171EF4F4F5FFFFFFFF
+          FFFFFFFFFFFFFFFF4354643C0E00FF930EEC7B0A7048221824352E2D302E2D30
+          362F2F362F2F362F2F362F2F362F2F35302F35302F35302F35302F35302F3530
+          2F35302F35302F35302F35302F35302F2E2D302F2D301121378B531CFB8107FF
+          920F4E1A003B4956FFFFFFFFFFFFFFFFFFBFC4CA000000BF5F00D76A00D6710D
+          F58617873D0010171EF4F4F5FFFFFFFFFFFFFFFFFFFFFFFF4354643B0E00FF93
+          0FEC7B0A774B2021283335302F35302F362F2F362F2F362F2F362F2F362F2F35
+          302F35302F35302F35302F35302F35302F35302F35302F35302F35302F35302F
+          35302F35302F1C263491551BF98108FF920F4E1A003B4956FFFFFFFFFFFFFFFF
+          FFBFC4CA000000BF5F00D76A00D6710DF58617873D0010171EF4F4F5FFFFFFFF
+          FFFFFFFFFFFFFFFF4354643B0E00FF930FEC7B0A784B2021283335302F362F2F
+          33F36334FC6533FF66362F2F362F2F35302F33F36334FC6533FF6635302F3530
+          2F35302F33F36334FC6533FF6635302F35302F35302F1C263491551BF98108FF
+          920F4E1A003B4956FFFFFFFFFFFFFFFFFFBFC4CA000000BF5F00D76A00D6710D
+          F58617873D0010171EF4F4F5FFFFFFFFFFFFFFFFFFFFFFFF4354643B0E00FF93
+          0FEC7B0A784B2021283335302F362F2F34FE6533FF6633FF66362F2F362F2F35
+          302F34FE6533FF6633FF6635302F35302F35302F34FE6533FF6633FF6635302F
+          35302F35302F1C263491551BF98108FF920F4A1600495764FFFFFFFFFFFFFFFF
+          FFBFC4CA000000BF5F00D76A00D6710DF58617863C0011181FF4F5F6FFFFFFFF
+          FFFFFFFFFFFFFFFF4354643B0E00FF930FEC7B0A784B20212833362F2F362F2F
+          36EC7338EF7433F864362F2F362F2F35302F36EC7338EF7433F86435302F3530
+          2F35302F36EC7338EF7433F86435302F35302F35302F1C263491551BF98108FF
+          920F642F000011215C6670555D665D6670374350070000C06000D76A00D6710D
+          F686178D40000A1118F1F2F3FFFFFFFFFFFFFFFFFFFFFFFF4354643B0E00FF93
+          0FEC7B0A784B20212833362F2F362F2F362F2F362F2F362F2F362F2F362F2F35
+          302F35302F35302F35302F35302F35302F35302F35302F35302F35302F35302F
+          35302F35302F1C263491551BF98108FF920F6E3B060000000500000600000700
+          000000000D0600C16100D76A00D6710DF68617914300070E14F0F1F1FFFFFFFF
+          FFFFFFFFFFFFFFFF4354643B0E00FF930FEC7B0A784B20212833362F2F362F2F
+          362F2F362F2F362F2F362F2F362F2F35302F35302F35302F35302F35302F3530
+          2F35302F35302F35302F35302F35302F35302F35302F1C263491551BF98108FF
+          920F572F06241100D06700BE5E00D16700894400010000C06000D76A00D6710D
+          F68617904200080F15F0F1F2FFFFFFFFFFFFFFFFFFFFFFFF4354643B0E00FF93
+          0FEC7B0A784B20212833362F2F362F2F362F2F362F2F362F2F362F2F362F2F35
+          302F35302F35302F35302F35302F35302F35302F35302F35302F35302F35302F
+          35302F35302F1C263491551BF98108FF920F522B04311B04F98611E47B0FFA86
+          11A75A0C000000BF6000D76A00D6710DF68617904200080F15F0F1F2FFFFFFFF
+          FFFFFFFFFFFFFFFF4354643B0E00FF930FEC7B0A784B20212833362F2F362F2F
+          33F36334FC6533FF66362F2F362F2F35302F33F36334FC6533FF6635302F3530
+          2F35302F33F36334FC6533FF6635302F35302F35302F1C263491551BF98108FF
+          920F68370500000236220D331F0C38220D1C130A0A0400C16000D76A00D6710D
+          F68617904200080F15F0F1F2FFFFFFFFFFFFFFFFFFFFFFFF4354643B0E00FF93
+          0FEC7B0A784B20212833362F2F362F2F34FE6533FF6633FF66362F2F362F2F35
+          302F34FE6533FF6633FF6635302F35302F35302F34FE6533FF6633FF6635302F
+          35302F35302F1C263491551BF98108FF920F6F3B060000000000000000000000
+          000000000D0600C16100D76A00D6710DF68617904200080F15F0F1F2FFFFFFFF
+          FFFFFFFFFFFFFFFF4354643B0E00FF930FEC7B0A784B20212833362F2F362F2F
+          36EC7338EF7433F864362F2F362F2F35302F36EC7338EF7433F86435302F3530
+          2F35302F36EC7338EF7433F86435302F35302F35302F1C263491551BF98108FF
+          920F5F32050F08018B4B0A8045098C4B0A583007050200C06000D76A00D6710D
+          F68617904200080F15F0F1F2FFFFFFFFFFFFFFFFFFFFFFFF4354643B0E00FF93
+          0FEC7B0A774B20212833362F2F362F2F362F2F362F2F362F2F362F2F362F2F35
+          302F35302F35302F35302F35302F35302F35302F35302F35302F35302F35302F
+          35302F35302F1C263491551BF98108FF920F4F2A06391D00FF8D06FB8106FF8D
+          07B95F05000000BF6000D76A00D6710DF686178F4200080F16F1F1F2FFFFFFFF
+          FFFFFFFFFFFFFFFF4354643C0E00FF930EEC7B0A704722172436362F2F362F2F
+          362F2F362F2F362F2F362F2F362F2F35302F35302F35302F35302F35302F3530
+          2F35302F35302F35302F35302F35302F35302F35302F1021378A531CFB8107FF
+          920F582F061F1100C16506B15C06C265077F4205020100C06000D76A00D6710D
+          F68617914300070E14F0F1F1FFFFFFFFFFFFFFFFFFFFFFFF4354643B0E00FF93
+          0FF17D0994561A2B2C3137302E39312E39312E39312E39312E39312E39312E39
+          312E39312E39312E39312E39312E39312E39312E39312E39312E39312E39312E
+          39312E342F2F312E30AA5F15F57F09FF920F6E3904000004060C11070B0F080C
+          1100030C0C0600CD6700F07600F4800EFF951AA14B0000070EEDEEEFFFFFFFFF
+          FFFFFFFFFFFFFFFF4253643F1000FF9510EB7C0CDF750BC36911BC6613BE6712
+          BE6712BE6712BE6712BE6712BE6712BE6712BE6712BE6712BE6712BE6712BE67
+          12BE6712BE6712BE6712BE6712BE6712BE6712BB6613C96C0FE3780BEC7C0DFF
+          920F5721002F3E4CF8FBFEE4E6E8FAFCFEA8AFB50100009F4B00843400712F00
+          A75200853B00060B10EEEEEFFFFFFFFFFFFFFFFFFFFFFFFF445464370A00FF9D
+          10FF9110FF8E0EFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF
+          8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0CFF8F0C
+          FF8F0CFF8F0CFF8F0CFF8E0EFF8F0FFFA0114A1400404F5FFFFFFFFFFFFFFFFF
+          FFCACACA0000000904040B182605192E0B141D0000000F0E0EEFEFEFFFFFFFFF
+          FFFFFFFFFFFFFFFFACB0B00000004F17007A3500733100733100733100733100
+          7331007331007331007331007331007331007331007331007331007331007331
+          007331007331007331007331007331007331007331007331007230007935005A
+          1D00000000878C8DFFFFFFFFFFFFFFFFFFC5C3C2000000708BAAD2F9FFDCFFFF
+          C5ECFF415670020000EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6AAAE2D39
+          45252D362C343D2C343D2C343D2C343D2C343D2C343D2C343D2C343D2C343D2C
+          343D2C343D2C343D2C343D2C343D2C343D2C343D2C343D2C343D2C343D2C343D
+          2C343D2C343D2C343D2C343D293139242F3B84898EFFFFFFFFFFFFFFFFFFFFFF
+          FFF8F8F72E2E2E151F29526478576A7E4B5C6F0109105B5A58FFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECECEC75737027221E16110C
+          312D28908E8CFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFF}
+        Stretch = True
+        Transparent = True
+      end
+      object Panel2: TPanel
+        Left = 25
+        Top = 0
+        Width = 169
+        Height = 25
+        Align = alLeft
+        BevelOuter = bvNone
+        Caption = 'VMS Communication Log'
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = 'Tahoma'
+        Font.Style = [fsBold]
+        ParentFont = False
+        TabOrder = 0
+        ExplicitLeft = 40
+      end
+      object chkLogPause: TCheckBox
+        Left = 444
+        Top = 0
+        Width = 67
+        Height = 25
+        Cursor = crHandPoint
+        Hint = 'Log Message Display pause/start'
+        Align = alRight
+        Caption = 'Pause'
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = 'Tahoma'
+        Font.Style = []
+        ParentFont = False
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 1
+      end
+      object btnClear: TButton
+        Left = 511
+        Top = 0
+        Width = 47
+        Height = 25
+        Cursor = crHandPoint
+        Hint = 'Log Message Clear'
+        Align = alRight
+        Caption = 'Clear'
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = 'Tahoma'
+        Font.Style = []
+        ParentFont = False
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 2
+        OnClick = btnClearClick
+      end
+      object btnCopy: TButton
+        Left = 558
+        Top = 0
+        Width = 47
+        Height = 25
+        Cursor = crHandPoint
+        Hint = 'Log Message Copy To Clipboard'
+        Align = alRight
+        Caption = 'Copy'
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = 'Tahoma'
+        Font.Style = []
+        ParentFont = False
+        ParentShowHint = False
+        ShowHint = True
+        TabOrder = 3
+        OnClick = btnCopyClick
+      end
+      object chkServer: TCheckBox
+        Left = 250
+        Top = 0
+        Width = 97
+        Height = 25
+        Cursor = crHandPoint
+        Align = alRight
+        Caption = 'Server Log'
+        Checked = True
+        State = cbChecked
+        TabOrder = 4
+        Visible = False
+      end
+      object chkClient: TCheckBox
+        Left = 347
+        Top = 0
+        Width = 97
+        Height = 25
+        Cursor = crHandPoint
+        Align = alRight
+        Caption = 'Client Log'
+        Checked = True
+        State = cbChecked
+        TabOrder = 5
+        Visible = False
+      end
+    end
+    object reMsg: TMemo
+      Left = 0
+      Top = 25
+      Width = 605
+      Height = 499
+      Align = alClient
+      Color = clBlack
+      Font.Charset = DEFAULT_CHARSET
+      Font.Color = clWhite
+      Font.Height = -12
+      Font.Name = 'Hack'
+      Font.Style = []
+      ImeName = 'Microsoft IME 2010'
+      Lines.Strings = (
+        'Local mode          (Remote mode=0, Local mode=1): %d", status.'
+        'Module power                  (normal=0, fault=1): %d", status.'
+        'Signboard power                     (off=0, on=1): %d", status.'
+        'Door                            (open=0, close=1): %d", status.'
+        'Fan                                 (off=0, on=1): %d", status.'
+        'Luminance mode(00:'#51088#46041', 01:'#51452#44036#49688#46041', 02:'#50556#44036#49688#46041'): %d", status.'
+        '')
+      ParentFont = False
+      ReadOnly = True
+      ScrollBars = ssBoth
+      TabOrder = 1
+      WordWrap = False
+    end
+  end
+  object Panel4: TPanel
+    AlignWithMargins = True
+    Left = 2
+    Top = 0
+    Width = 609
+    Height = 78
+    Margins.Left = 2
+    Margins.Top = 0
+    Margins.Right = 2
+    Margins.Bottom = 2
+    Align = alTop
+    BevelKind = bkSoft
+    BevelOuter = bvNone
+    ParentColor = True
+    TabOrder = 1
+    object Panel6: TPanel
+      AlignWithMargins = True
+      Left = 2
+      Top = 2
+      Width = 601
+      Height = 26
+      Margins.Left = 2
+      Margins.Top = 2
+      Margins.Right = 2
+      Margins.Bottom = 2
+      Align = alTop
+      Alignment = taLeftJustify
+      BevelKind = bkSoft
+      BevelOuter = bvNone
+      Caption = '      Log Options'
+      Font.Charset = DEFAULT_CHARSET
+      Font.Color = clWindowText
+      Font.Height = -12
+      Font.Name = 'Tahoma'
+      Font.Style = [fsBold]
+      ParentBackground = False
+      ParentColor = True
+      ParentFont = False
+      TabOrder = 0
+      object Image2: TImage
+        Left = 7
+        Top = 6
+        Width = 9
+        Height = 9
+        Picture.Data = {
+          07544269746D617032010000424D320100000000000036000000280000000900
+          0000090000000100180000000000FC000000C30E0000C30E0000000000000000
+          00000000FF0000FF0000FF0092FF0092FF0092FF0000FF0000FF0000FF000000
+          FF0092FF0092FF46AFFD46AFFD46AFFD0092FF0092FF0000FF000000FF0092FF
+          46AFFD46AFFDFFFFFF46AFFD46AFFD0092FF0000FF000092FF46AFFD46AFFD46
+          AFFDFFFFFF46AFFD46AFFD46AFFD0092FF000092FF46AFFDFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFF46AFFD0092FF000092FF46AFFD46AFFD46AFFDFFFFFF46AFFD
+          46AFFD46AFFD0092FF000000FF0092FF46AFFD46AFFDFFFFFF46AFFD46AFFD00
+          92FF0000FF000000FF0092FF0092FF46AFFD46AFFD46AFFD0092FF0092FF0000
+          FF000000FF0000FF0000FF0092FF0092FF0092FF0000FF0000FF0000FF00}
+        Transparent = True
+      end
+    end
+    object chkInfo: TCheckBox
+      Left = 15
+      Top = 37
+      Width = 97
+      Height = 17
+      Cursor = crHandPoint
+      Caption = ' Information'
+      TabOrder = 1
+    end
+    object chkData: TCheckBox
+      Left = 283
+      Top = 37
+      Width = 73
+      Height = 17
+      Cursor = crHandPoint
+      Caption = ' Data'
+      TabOrder = 2
+    end
+    object chkDetail: TCheckBox
+      Left = 443
+      Top = 37
+      Width = 72
+      Height = 17
+      Cursor = crHandPoint
+      Caption = ' Detail'
+      TabOrder = 3
+    end
+    object chkError: TCheckBox
+      Left = 116
+      Top = 37
+      Width = 69
+      Height = 17
+      Cursor = crHandPoint
+      Caption = ' Error'
+      TabOrder = 4
+    end
+    object chkWarning: TCheckBox
+      Left = 188
+      Top = 37
+      Width = 73
+      Height = 17
+      Cursor = crHandPoint
+      Caption = ' Warning'
+      TabOrder = 5
+    end
+    object chkDebug: TCheckBox
+      Left = 360
+      Top = 37
+      Width = 72
+      Height = 17
+      Cursor = crHandPoint
+      Caption = ' Debug'
+      TabOrder = 6
+    end
+    object btnSetLog: TButton
+      Left = 515
+      Top = 33
+      Width = 75
+      Height = 25
+      Cursor = crHandPoint
+      Caption = 'Apply'
+      TabOrder = 7
+      OnClick = btnSetLogClick
+    end
+  end
+end

+ 70 - 0
SRC/FRM/FrmVmsLogF.h

@@ -0,0 +1,70 @@
+//---------------------------------------------------------------------------
+
+#ifndef FrmVmsLogFH
+#define FrmVmsLogFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <Buttons.hpp>
+#include <ExtCtrls.hpp>
+#include <Graphics.hpp>
+#include <ComCtrls.hpp>
+//---------------------------------------------------------------------------
+#include "ITSLogF.h"
+#include "AppGlobalF.h"
+//---------------------------------------------------------------------------
+class TFrmVmsLog : public TForm
+{
+__published:	// IDE-managed Components
+    TPanel *plServerInfo;
+    TPanel *Panel1;
+    TImage *Image1;
+    TPanel *Panel2;
+    TCheckBox *chkLogPause;
+    TButton *btnClear;
+    TButton *btnCopy;
+    TMemo *reMsg;
+    TPanel *Panel4;
+    TPanel *Panel6;
+    TImage *Image2;
+    TCheckBox *chkInfo;
+    TCheckBox *chkData;
+    TCheckBox *chkDetail;
+    TCheckBox *chkError;
+    TCheckBox *chkWarning;
+    TCheckBox *chkDebug;
+    TButton *btnSetLog;
+    TCheckBox *chkServer;
+    TCheckBox *chkClient;
+    void __fastcall btnClearClick(TObject *Sender);
+    void __fastcall btnCopyClick(TObject *Sender);
+    void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
+    void __fastcall btnSetLogClick(TObject *Sender);
+
+private:	// User declarations
+    int         FVmsIdx;
+    LOG_INFO    FLogCfg;
+    AnsiString  FVmsId;
+    TVmsCtlr   *FVmsCtlr;
+
+public:
+
+public:		// User declarations
+    __fastcall TFrmVmsLog(TComponent* Owner);
+
+    void __fastcall DisplayVmsLog(int AVmsIdx=-1);
+
+    void LogWrite(IPC_LOG_MESSAGE *ALog);
+    void LogData(IPC_LOG_MESSAGE *ALog);
+	void __fastcall OnWMLogDisplayMessage(TMessage &Msg);
+
+	BEGIN_MESSAGE_MAP
+		MESSAGE_HANDLER(WM_LOG_DISPLAY, TMessage, OnWMLogDisplayMessage)
+	END_MESSAGE_MAP(TForm)
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TFrmVmsLog *FrmVmsLog;
+//---------------------------------------------------------------------------
+#endif

+ 202 - 0
SRC/FrmMainCommF.cpp

@@ -0,0 +1,202 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "FrmMainCommF.h"
+#include "AppGlobalF.h"
+#include "FrmMainF.h"
+#include "DMCOMMF.h"
+#include "CommThread.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+void __fastcall TFrmMain::SendInitial(void)
+{
+    int result;
+
+LINFO("SendInitial");
+    if ((result = SendProcessState()) != VERR_NONE)
+    {
+        LERROR("SendProcessState failed %d", result);
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmMain::SendTerminal(void)
+{
+    int result;
+
+LINFO("SendTerminal");
+    // 동작, 통신, DB 모두 이상 처리
+    m_bAction = state_error;
+    m_bComm   = state_error;
+    m_bDB     = state_error;
+
+    // 모든 시설물 통신 오프라인 처리
+    VmsIterator it;
+    for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
+    {
+        TVmsCtlr *pObj = (TVmsCtlr*)it->second;
+        if (pObj->Server.UseFlag != bit_enable) continue;
+
+        pObj->Server.Status = process_fail;
+        pObj->ChangeDate    = Now().FormatString("yyyymmddhhnnss");
+    }
+
+    SendProcessState();
+
+    // DB에 상태정보를 업데이트 하구...
+    if (DMCOMM->DbConnect(g_AppCfg.db.sConnectStr))
+    {
+        if ((result = DMCOMM->SaveProcessStateProc()) != VERR_NONE)
+        {
+            LERROR("SaveProcessStateProc Error %d", result);
+        }
+        if ((result = DMCOMM->SaveEquipStateAllProc()) != VERR_NONE)
+        {
+            LERROR("SaveEquipStateAllProc Error %d", result);
+        }
+        DMCOMM->DbClose();
+    }
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TFrmMain::SendProcessState()
+{
+    int result;
+    INT_PG_STATE_RES PgState;
+
+    memset(&PgState, 0x00, sizeof(PgState));
+
+    g_SysInfo->State.Action = m_bAction;
+    g_SysInfo->State.Comm   = m_bComm;
+    g_SysInfo->State.DB     = m_bDB;
+
+    PgState.Count = 1;
+    PgState.Unit[0].Type    = INT_ID_VMS_SERVER;
+    PgState.Unit[0].DB      = m_bDB;
+    PgState.Unit[0].Comm    = m_bComm;
+    PgState.Unit[0].Action  = m_bAction;
+
+    if (FServerRun == false)
+    {
+        PgState.Unit[0].Action = state_error;
+        g_SysInfo->State.Action = state_error;
+    }
+    result = VComm_CmmProcessStateNotify(&PgState);
+
+    if (m_bAction != state_error)   //프로세스 종료처리중이 아닌경우
+    {
+        result = SendDbThreadMessage(WM_PROCESS_STATE, NULL, NULL);
+        if (result != SYS_ERR_NONE)
+        {
+            LERROR("SendDbThreadMessage Error %d", result);
+        }
+        LINFO(">>>>>>>>>>>>>>> SendProcessState: %d,%d,%d", PgState.Unit[0].Action, PgState.Unit[0].Comm, PgState.Unit[0].DB);
+    }
+
+    return result;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmMain::CheckCommState()
+{
+    int i;
+    int uCount, rCount;
+    bool eFlag;
+
+    FSendMsg = SEND_MSG_NONE;
+
+    if (VmsManager->Total == VmsManager->Normal) m_bComm = state_normal;
+    else                                         m_bComm = state_error;
+
+    /* 통신 데이터 처리 스레드 체크 */
+    int Flag;
+    DWORD ExitCode;
+
+    if ((m_CommThreadID != NULL) && (m_CommHandle != NULL))
+    {
+        if (GetExitCodeThread((HANDLE)m_CommHandle, &ExitCode))
+        {
+            if (STILL_ACTIVE == ExitCode) Flag = 0;
+            else                          Flag = -1;
+        }
+        else Flag = -2;
+    }
+    else Flag = -3;
+
+    if (Flag)
+    {
+        m_bAction = state_error;
+
+        String sError = SYS_GetSysError();
+        LERROR("DB Server abnormal terminated, try restart: %d (%s)", Flag, AnsiString(sError).c_str());
+        //AutoClose();
+        StartJobThread();
+    }
+    else
+    {
+        //if (tbConnect->Enabled == false)
+        {
+            m_bAction = state_normal;
+        }
+    }
+    if (g_SysInfo->State.Action != m_bAction ||
+        g_SysInfo->State.Comm   != m_bComm   ||
+        g_SysInfo->State.DB     != m_bDB      )
+    {
+        //SendProcessState();
+        FSendMsg += SEND_MSG_PROCESS;
+    }
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TFrmMain::SendVmsThreadMessage(BYTE *AVmsId, IPCUDPMESSAGESTRUCT *ARcvData, BYTE AOpCode, char *AData)
+{
+    AnsiString    sVmsId;
+    IPCUDPPACKET *pPI = NULL;
+
+    sVmsId.sprintf("%.*s", INT_VMS_MAX_ID, (char*)AVmsId);
+
+    TVmsCtlr *pObj = VmsManager->FLists.Find(sVmsId);
+    if (!pObj)
+    {
+        return VERR_NOTFOUND_VMS;
+    }
+
+    if (pObj->Server.Status != process_run)
+    {
+        return VERR_OFFLINE;
+    }
+
+    if (!pObj->pPackQueue)
+    {
+        return VERR_INTERNAL;
+    }
+
+    pPI = new IPCUDPPACKET;
+    if (pPI == NULL) return VERR_MEMORY_ALLOC;
+
+    pPI->Sender.IP   = ARcvData->Sender.IP;
+    pPI->Sender.Port = ARcvData->Sender.Port;
+    pPI->RecvId      = ARcvData->Pkt.head.SendId;
+    pPI->OPCode      = AOpCode;
+    pPI->Size        = (int)ARcvData->Pkt.head.Length;
+    if (pPI->Size > 0)
+    {
+        pPI->Data = new char[pPI->Size];
+        if (!pPI->Data)
+        {
+            delete pPI;
+            return VERR_INTERNAL;
+        }
+        CopyMemory(pPI->Data, AData, pPI->Size);
+    }
+    pObj->pPackQueue->Add((void*)pPI);
+    return VERR_NONE;
+}
+//---------------------------------------------------------------------------
+

+ 6 - 0
SRC/FrmMainCommF.h

@@ -0,0 +1,6 @@
+//---------------------------------------------------------------------------
+
+#ifndef FrmMainCommFH
+#define FrmMainCommFH
+//---------------------------------------------------------------------------
+#endif

+ 2209 - 0
SRC/FrmMainF.cpp

@@ -0,0 +1,2209 @@
+//---------------------------------------------------------------------------
+
+#include <vcl.h>
+#pragma hdrstop
+#include <psapi.h>
+#include <windows.h>
+#include <stdio.h>
+#include <time.h>
+//---------------------------------------------------------------------------
+
+#include "AppGlobalF.h"
+#include "VmsDataTypeF.h"
+#include "FrmMainF.h"
+#include "VMSProtocolF.h"
+#include "DMCOMMF.h"
+#include "CommThread.h"
+#include "FrmOptionF.h"
+#include "FrmSysLogF.h"
+#include "FrmVmsInfoF.h"
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma resource "*.dfm"
+TFrmMain *FrmMain;
+//---------------------------------------------------------------------------
+
+__fastcall TFrmMain::TFrmMain(TComponent* Owner)
+    : TForm(Owner)
+{
+    ::CoInitialize(NULL);
+
+    FServerRun = false;
+    FTickState = 0;
+    g_AppCfg.bAppLoad  = false;
+    g_AppCfg.bAppClose = false;
+
+    Caption = " " + g_AppCfg.sTitle + " - " + Now().DateTimeString();;
+
+    VmsManager   = new TVmsCtlrManager();
+    ImageManager = new TCDSImageManager();
+    FormManager  = new TCDSFormManager();
+    FontManager  = new TCDSFontManager();
+    IfscManager  = new TCDSIfscManager();
+
+    FCur5Min = StrToInt(Now().FormatString("nn"));;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmMain::FormCreate(TObject *Sender)
+{
+    Application->ShowMainForm = false;
+
+    try {
+        Application->Icon->LoadFromResourceName(((unsigned int)HInstance), "MAINICON");
+    } catch(...) { ShowMessage("LoadFromResourceName failed"); }
+
+    SYS_WritePidFile((long)Handle);
+    g_AppCfg.lMainWinHandle = (long)Handle;
+
+    FrmSysLog = new TFrmSysLog(pnlLog);
+    FrmSysLog->Parent = pnlLog;
+    FrmSysLog->Show();
+
+    FrmVmsInfo = new TFrmVmsInfo(pnlVms);
+    FrmVmsInfo->Parent = pnlVms;
+    FrmVmsInfo->Show();
+
+    Application->ShowMainForm = true;
+}
+//---------------------------------------------------------------------------
+
+bool __fastcall TFrmMain::StartJobThread()
+{
+    TCommThread *pCommThread = new TCommThread();
+    m_CommThreadID = pCommThread->ThreadID;
+    m_CommHandle   = pCommThread->Handle;
+    if (m_CommThreadID == NULL)
+    {
+        LERROR("CommThread initialization fail");
+        return false;
+    }
+    LINFO("Job thread started.");
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmMain::FormShow(TObject *Sender)
+{
+    StartJobThread();
+    CheckResource((g_AppCfg.MaxMemory * 1024), g_AppCfg.MaxHandle, g_AppCfg.MaxThread, g_AppCfg.MaxGdi);
+    //CheckManagerApp();
+    tmrAppState->Enabled = true;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmMain::FormCloseQuery(TObject *Sender, bool &CanClose)
+{
+    if (!g_AppCfg.bAppClose)
+    {
+        String strMsg;
+        strMsg = Caption + "\r\n\r\nAre you sure you want to exit the program?\r\nIf the Process Manager is running the program will be restarted automatically!!!";
+
+        //if (Application->MessageBox(strMsg.c_str(), L"Confirm program exit", MB_YESNO|MB_ICONQUESTION) == IDYES)
+        {
+            FServerRun = false;
+            g_AppCfg.bThrExit  = true;
+            g_AppCfg.bAppClose = true;
+        }
+        CanClose = false;
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmMain::FormClose(TObject *Sender, TCloseAction &Action)
+{
+    CommClose();
+
+    ::CoUninitialize();
+
+    Action = caFree;
+    FrmMain = NULL;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmMain::CommClose()
+{
+    try
+    {
+        SYS_WriteConfigInfo("LOG", "LOGDAY", Now().FormatString("dd"), g_AppCfg.sConfigFile);
+
+        if (VmsManager)
+        {
+            VmsManager->FLists.Lock();
+            FOR_STL(TVmsCtlr*, pObj, VmsManager->FLists)
+            {
+                //SAFE_DELETE(pObj->FLogFile);
+            }
+            VmsManager->FLists.UnLock();
+        }
+        //SAFE_DELETE(VmsManager);
+
+        if (ImageManager)
+        {
+        }
+        //SAFE_DELETE(ImageManager);
+    }
+    catch(Exception &e)
+    {
+    }
+}
+//---------------------------------------------------------------------------
+
+bool __fastcall TFrmMain::InitApplication(void)
+{
+    String sTitle, sMsg;
+    int nResult;
+
+    LINFO("Program initialize start...");
+
+    m_bAction = state_normal;
+    m_bComm   = state_error;
+    m_bDB     = state_normal;
+
+    FTickState = 0;
+    FServerRun = true;
+
+    CommUtil_MakeBasisTime(m_oTimer, VMS_CHECK_TIME, 0);
+    CommUtil_MakeBasisTime(m_tTimer, g_AppCfg.nTrafficCycleTime, g_AppCfg.nTrafficBasisTime);
+    m_rTimer = Now();
+
+    LINFO("VMS Information initialize...");
+
+    g_SysInfo->State.CommThreadID = m_CommThreadID;
+
+    LINFO("Center communication initialize...");
+    //통신초기화를 최초 수행한 후 디비읽어서 처리
+    nResult = VComm_Initialize((long)Handle, g_AppCfg.sSystemId, "VMS", g_AppCfg.comm.nCenterPort, g_AppCfg.sLogDay);
+    if (VERR_NONE != nResult)
+    {
+        sMsg.printf(L"Center communication initialize failed: error %d", nResult);
+        LERROR(AnsiString(sMsg).c_str());
+        return false;
+    }
+
+    if (!DMCOMM->DbConnect(g_AppCfg.db.sConnectStr))
+    {
+        sTitle = "Process initialize failed...";
+        sMsg   = "Database connect failed.\r\nProgram exit.\r\n";
+        //sMsg  += DMComm->ErrorString;
+        LERROR(AnsiString(sMsg).c_str());
+        return false;
+    }
+
+    if (DMCOMM->GetVmsInfo() != VERR_NONE)
+    {
+        DMCOMM->DbClose();
+
+        sTitle = "Process initialize failed...";
+        sMsg   = "VMS information initialize failed.\r\nProgram exit.\r\n";
+        //sMsg  += DMComm->ErrorString;
+        LERROR(AnsiString(sMsg).c_str());
+        return false;
+    }
+    if (DMCOMM->GetVmsIfscInfo() != VERR_NONE)
+    {
+        DMCOMM->DbClose();
+
+        sTitle = "Process initialize failed...";
+        sMsg   = "VMS IFSC information initialize failed.\r\nProgram exit.\r\n";
+        //sMsg  += DMComm->ErrorString;
+        LERROR(AnsiString(sMsg).c_str());
+        return false;
+    }
+    if (DMCOMM->GetProcessInfo() != SYS_ERR_NONE)
+    {
+        DMCOMM->DbClose();
+
+        sTitle = "Process initialize failed...";
+        sMsg   = "Center communication process load failed.\r\nProgram exit.\r\n";
+        //sMsg  += DMComm->ErrorString;
+        LERROR(AnsiString(sMsg).c_str());
+        return false;
+    }
+    if (DMCOMM->GetVmsImage() != VERR_NONE)
+    {
+        DMCOMM->DbClose();
+
+        sTitle = "Process initialize failed...";
+        sMsg   = "VMS image information initialize failed.\r\nProgram exit.\r\n";
+        //sMsg  += DMComm->ErrorString;
+        LERROR(AnsiString(sMsg).c_str());
+        return false;
+    }
+    if (DMCOMM->LoadVmsForm() != VERR_NONE)
+    {
+        DMCOMM->DbClose();
+
+        sTitle = "Process initialize failed...";
+        sMsg   = "VMS form information initialize failed.\r\nProgram exit.\r\n";
+        //sMsg  += DMComm->ErrorString;
+        LERROR(AnsiString(sMsg).c_str());
+        return false;
+    }
+
+    if (DMCOMM->GetFontInfo() != VERR_NONE)
+    {
+        DMCOMM->DbClose();
+
+        sTitle = "Process initialize failed...";
+        sMsg   = "VMS Font initialize failed.\r\nProgram exit.\r\n";
+        //sMsg  += DMComm->ErrorString;
+        LERROR(AnsiString(sMsg).c_str());
+        return false;
+    }
+
+    DMCOMM->DbClose();
+
+    //LoadOldVmsInfo();
+    //LoadFtpVmsInfo();
+    //LoadFontVmsInfo();
+    //LoadBitmapVmsInfo();
+
+    //이미지로 저장하는 경우에 대한 Ftp다운로드 처리여부 확인
+    VmsIterator it;
+    for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
+    {
+        TVmsCtlr *pObj = (TVmsCtlr*)it->second;
+        if (pObj->FBmpDownload)
+        {
+            if (pObj->FIsOldProtocol)
+            {
+                //이전 버전중 레도것이 아닌경우는 모두 ftp를 사용함
+                pObj->FIsFtpDownload = true;
+            }
+        }
+        else
+        {
+            //FtpVMS.inf에 등록된 VMS만 FTP로 다운로드하면 된다
+        }
+    }
+
+    FrmVmsInfo->InitVmsList();
+
+    if (VERR_NONE != VComm_Open())//g_AppCfg.comm.nCenterPort))
+    {
+        sMsg.printf(L"Center communication open failed: error %d", nResult);
+        LERROR(AnsiString(sMsg).c_str());
+        return false;
+    }
+
+    SendInitial();
+    ProvideEvent(provide_event, NULL, NULL);
+
+    //통신서버 시작
+    tbConnectClick(this);
+
+    LINFO("Program initialize success...[Completed]");
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmMain::tmrAppStateTimer(TObject *Sender)
+{
+    tmrAppState->Enabled = false;
+    plTime->Caption = Now().DateTimeString();
+
+    if (!g_AppCfg.bAppLoad)
+    {
+        if (!InitApplication())
+        {
+            g_AppCfg.bAppClose = true;
+            TerminateApplication();
+            Sleep(500);
+            Close();
+            return;
+        }
+        // 초기화작업완료
+
+        CheckResource((g_AppCfg.MaxMemory * 1024), g_AppCfg.MaxHandle, g_AppCfg.MaxThread, g_AppCfg.MaxGdi);
+
+        g_AppCfg.bAppLoad     = true;   // 프로그램이 로딩되었음을 확인
+        tmrAppState->Interval = 1000;   // 프로그램 상태점검주기=1초
+        tmrAppState->Enabled  = true;
+
+        DMCOMM->MonitoringVms(FServerRun);
+        DMCOMM->MonitoringVmsClient(FServerRun);
+        CheckCommState();   //통신상태정보 체크
+
+        return;
+    }
+
+    if (g_AppCfg.bAppClose)
+    {
+        // 응용프로그램 종료
+        g_AppCfg.bThrExit = true;
+        Sleep(500);
+        TerminateApplication();
+        Close();
+        return;
+    }
+
+    g_AppCfg.lMainWinHandle = (long)Handle;
+
+    UpdateProcessStatePanel();
+
+    if (!(++FTickState % 5))
+    {
+        DMCOMM->MonitoringVms(FServerRun);
+        DMCOMM->MonitoringVmsClient(FServerRun);
+        CheckCommState();   //통신상태정보 체크
+    }
+
+
+#if 0
+    FCurMin = StrToInt(Now().FormatString("nn"));
+    if (!(FCurMin % 5))
+    {
+        if (FCur5Min != FCurMin)
+        {
+            FCur5Min = FCurMin;
+
+            SendProcessState();
+            SendDbThreadMessage(WM_EQUIP_STATE_ALL, NULL, NULL);
+        }
+    }
+#endif
+    if (!(FTickState % 60))
+    {
+        FSendMsg = SEND_MSG_NONE;
+        //1분주기 상태정보를 업데이트 한다.
+        //if (!(FSendMsg & SEND_MSG_PROCESS))
+        {
+            SendProcessState();
+        }
+        //if (!(FSendMsg & SEND_MSG_EQUIP))
+        {
+            SendDbThreadMessage(WM_EQUIP_STATE_ALL, NULL, NULL);
+            LINFO(">>>>>>>>>>>>>>> SendEquipStateAll");
+        }
+
+#if 0
+        if (m_bDB != state_normal)
+        {
+            SendDbThreadMessage(WM_DATABASE_REFLASH, NULL, NULL);
+        }
+#endif
+
+        if (CheckResource((g_AppCfg.MaxMemory * 1024), g_AppCfg.MaxHandle, g_AppCfg.MaxThread, g_AppCfg.MaxGdi))
+        {
+            LERROR("Resource error");
+#if 0
+            AutoClose();
+#endif
+        }
+        FTickState++;
+    }
+
+#if 0
+    //PASIG에서는 사용하지 않음
+    if (CheckBasisTime(m_oTimer, VMS_CHECK_TIME, 0))
+    {
+        SendDbThreadMessage(WM_GET_ONOFF,     NULL, NULL);
+        SendDbThreadMessage(WM_DOWNLOAD_PROC, NULL, NULL);
+    }
+#endif
+
+    if (CheckBasisTime(m_tTimer, g_AppCfg.nTrafficCycleTime, g_AppCfg.nTrafficBasisTime))
+    {
+        if (CommUtil_TimeDiff(m_rTimer) > g_AppCfg.nTrafficCycleTime)
+        {
+            LINFO("*** VMS Traffic Timer Acitve");
+            ProvideEvent(provide_event, NULL, NULL);
+            FTickState++;
+        }
+    }
+
+    CheckProvideSave();
+
+    tmrAppState->Enabled  = true;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmMain::AutoClose()
+{
+    g_AppCfg.bAppClose = true;
+    //Close();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmMain::tbConnectClick(TObject *Sender)
+{
+    FServerRun = true;
+    g_AppCfg.bThrExit = false;
+
+    tbConnect->Enabled = false;
+    tbDisconnect->Enabled = true;
+
+    //m_bAction = state_normal;
+    SendProcessState();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmMain::tbDisconnectClick(TObject *Sender)
+{
+    FServerRun = false;
+    g_AppCfg.bThrExit = true;
+
+    tbDisconnect->Enabled = false;
+
+    DMCOMM->TerminateVms();
+    Sleep(500);
+    DMCOMM->TerminateVms();
+    DMCOMM->TerminateVmsClient();
+
+    //m_bAction = state_error;
+    SendProcessState();
+
+    tbConnect->Enabled = true;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmMain::tbOptionsClick(TObject *Sender)
+{
+    FrmOption = new TFrmOption(this);
+    FrmOption->Left = FrmMain->Left + 80;
+    FrmOption->Top = FrmMain->Top + 80;
+    FrmOption->ShowModal();
+    if (FrmOption->FUpdate)
+    {
+        try
+        {
+            ITSLog->FLogCfg = g_LogCfg;
+            FDbLog->FLogCfg = g_LogCfg;
+
+            VmsIterator it;
+            for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
+            {
+                TVmsCtlr *pObj = (TVmsCtlr*)it->second;
+                if (!pObj->FDispLog)
+                {
+                    pObj->FCLog->FLogCfg = g_LogCfg;
+                    pObj->FSLog->FLogCfg = g_LogCfg;
+                }
+            }
+        }
+        catch(Exception &e)
+        {
+        }
+    }
+    delete FrmOption;
+    FrmOption = NULL;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TFrmMain::ChangePosition(TVmsFormObj *AVmsObj)
+{
+	TLabel *pLabel = NULL;
+	int     nWidth;
+
+    if (AVmsObj->TextData == "") return VERR_NONE;
+
+	try
+    {
+        pLabel = new TLabel(NULL);
+        if (pLabel == NULL) return VERR_OTHER;
+
+        try
+		{
+			pLabel->AutoSize   = true;
+            pLabel->Font->Name = CodeToFont(AVmsObj->TextFontName);
+			pLabel->Font->Size = AVmsObj->TextFontSize;
+			pLabel->Caption    = AVmsObj->TextData;
+
+			if (AVmsObj->TextFontBold)
+                pLabel->Font->Style = TFontStyles() << fsBold;
+            else
+                pLabel->Font->Style = TFontStyles();
+
+			nWidth = AVmsObj->Width - pLabel->Width;
+
+			if (nWidth > 0)
+			{
+				switch(AVmsObj->TextAlign)
+				{
+				case text_align_right:  AVmsObj->PosX += nWidth;       break;
+				case text_align_center: AVmsObj->PosX += (nWidth / 2); break;
+				}
+            }
+        }
+        catch(Exception &e)
+		{
+        }
+    }
+    __finally
+    {
+        SAFE_DELETE(pLabel);
+    }
+    return VERR_NONE;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TFrmMain::MakeVmsDownloadForm()
+{
+    int          nFormCnt;
+    int          nSaveVmsCnt, nSaveFormCnt;
+    TCDSForm    *pCDSForm;
+	TVmsForm    *pVmsForm;
+	TVmsFormObj *pVmsObj;
+
+    VMS_SCHEDULE_INFO *pSch;
+    VMS_SCHEDULE_DETL *pSchUnit;
+
+LINFO("MakeVmsDownloadForm: Start");
+//CheckResource((g_AppCfg.MaxMemory * 1024), g_AppCfg.MaxHandle, g_AppCfg.MaxThread, g_AppCfg.MaxGdi);
+//LINFO("MakeVmsDownloadForm: Memory_S(%u)", FMemSize);
+
+    nSaveVmsCnt = 0;
+    nSaveFormCnt= 0;
+
+    //VMS스케줄에 대하여 다운로드 폼을 생성한다.
+    VmsIterator it;
+    for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
+    {
+        TVmsCtlr *pObj = (TVmsCtlr*)it->second;
+
+        if (pObj->Server.UseFlag != bit_enable) continue;
+
+        if (!pObj->FProvide) continue;
+
+        nSaveVmsCnt++;
+
+        //운영모드 변경
+        pObj->RSTATE.OprMode = pObj->CTLMODE->Control;
+
+        pSch = pObj->SCHEDULE;
+
+        pObj->CTLMODE->MaxDisplayForm = pSch->Count;
+        if (pObj->CTLMODE->MaxDisplayForm > pObj->VMS_MAX_PHSE_NUM)
+        {
+            LWARN("VMS Form Max count over1: %s, %d EA", pObj->VmsNo.c_str(), pObj->CTLMODE->MaxDisplayForm);
+            pObj->CTLMODE->MaxDisplayForm = pObj->VMS_MAX_PHSE_NUM;
+        }
+        if (pObj->CTLMODE->MaxDisplayForm > INT_MAX_VMS_FORM)
+        {
+            LWARN("VMS Form Max count over2: %s, %d EA", pObj->VmsNo.c_str(), pObj->CTLMODE->MaxDisplayForm);
+            pObj->CTLMODE->MaxDisplayForm = INT_MAX_VMS_FORM;
+        }
+
+        try
+        {
+            pObj->pForms->Lock();
+
+            //최대 제공 메시지 갯수만큼 생성
+            for (int ii = 0; ii < pSch->Count && ii < pObj->CTLMODE->MaxDisplayForm; ii++)
+            {
+                nFormCnt = pObj->pForms->Count();
+                pSchUnit = &pSch->Unit[ii];
+
+                AnsiString sFormId = pSchUnit->VMS_FORM_ID;
+                pCDSForm = FormManager->FLists.Find(sFormId);
+                if (!pCDSForm)
+                {
+                    LERROR("VMS Schedule Form Not found: VmsNmbr(%s), FormId(%s) %d", pObj->VmsNo.c_str(), sFormId.c_str(), ii);
+                    continue;
+                }
+
+                //소통정보 표출폼 인 경우 표출할 구간의 소통정보가 존재하지 않는 경우
+                //폼을 생성하지 않도록 한다.
+                switch(pCDSForm->VMS_FORM_TYPE_CD)
+                {
+                case enFormKindTrfRow1:// = 11,     // 소통상황(1단)
+                case enFormKindTrfRow2:// = 12,     // 소통상황(2단)
+                case enFormKindTrfRow3:// = 13,     // 소통상황(3단)
+                case enFormKindTrfRow4:// = 14,     // 소통상황(4단)
+                    {
+                        int  ss;
+                        bool bNoData = true;
+                        AnsiString sVmsIfscId[4];
+
+                        for (ss = 0; ss < 4; ss++)
+                            sVmsIfscId[ss] = "";
+
+                        sVmsIfscId[0] = pSchUnit->FRST_VMS_IFSC_ID;
+                        sVmsIfscId[1] = pSchUnit->SECD_VMS_IFSC_ID;
+                        sVmsIfscId[2] = pSchUnit->THIR_VMS_IFSC_ID;
+                        sVmsIfscId[3] = pSchUnit->FOUR_VMS_IFSC_ID;
+
+                        for (ss = 0; ss < 4; ss++)
+                        {
+                            if (sVmsIfscId[ss] == "") continue;
+                            TCDSIfsc *pTmpIfsc = IfscManager->FLists.Find(sVmsIfscId[ss]);
+                            if (pTmpIfsc)
+                            {
+                                if (pTmpIfsc->CMTR_GRAD_CD != "0") bNoData = false;
+                            }
+                        }
+                        if (bNoData)
+                        {
+                            LWARN("VMS Schedule Form No Traffic: VmsNmbr(%s), FormId(%s)", pObj->VmsNo.c_str(), sFormId.c_str());
+                            continue;
+                        }
+                    }
+                    break;
+                }
+
+                nSaveFormCnt++;
+
+                //폼생성
+                //pVmsForm = new TVmsForm();
+                pVmsForm = pObj->pForms->AddForm();
+
+                pVmsForm->ScenarioSeq = nFormCnt;                                       /* 폼 표출순서 */
+                pVmsForm->FormId      = pCDSForm->VMS_FORM_ID;                          /* 폼 ID */
+                pVmsForm->DisplayTime = pSchUnit->DSPL_HH;                              /* 표출시간(초) */
+                pVmsForm->DisplayMode = AnsiString(pCDSForm->VMS_MSG_DSPL_MTHD_CD);     /* 표출기능 */
+                pVmsForm->DisplayDir  = AnsiString(pCDSForm->VMS_MSG_DSPL_DRCT_CD);     /* 표출방향 */
+                pVmsForm->FormKind    = pCDSForm->VMS_FORM_TYPE_CD;                     /* 폼 종류 */
+                pVmsForm->BkColor     = pCDSForm->VMS_FORM_BCKG_HUE_CD;                 /* 배경색상 */
+                pVmsForm->Width       = pObj->WIDTH;                                    /* 폼넓이 */
+                pVmsForm->Height      = pObj->HEIGHT;                                   /* 폼높이 */
+                pVmsForm->SvcRes      = false;
+                pVmsForm->FtpRes      = false;
+
+                //pObj->pForms->AddFormA(pVmsForm);
+
+                pVmsForm->Lock();
+
+                //폼객체생성
+                FOR_STL(TCDSFormObj*, pCDSObj, pCDSForm->FLists)
+                {
+                    if (pVmsForm->Count() >= MAX_VMS_OBJ_LIST)
+                    {
+                        continue;
+                    }
+
+                    //도형식 배경소통정보 폼인 경우 하단에 표출할 정보가 없는 경우
+                    //하단 소통정보 객체는 생성하지 않도록 하자.
+                    if (pVmsForm->FormKind == enFormKindTrfImg)
+                    {
+                        switch(pCDSObj->VMS_FORM_OBJECT_TYPE_CD)
+                        {
+                        case 0: //문자열
+                        case 1: //심볼
+                        case 2: //이미지
+                            //N:일반(모두표출하는것)
+                            //T:소통정보(소통정보가 있는 경우에만 표출하는것)
+                            //F:하단고정(소통정보가 없는 경우에만 표출하는것)
+                            if (pSchUnit->VMS_IFSC_ID == "")
+                            {
+                                //표출할 소통정보가 없는 경우
+                                if (pCDSObj->TRFC_FILL_CD == "T") continue; //
+                            }
+                            else
+                            {
+                                //표출할 소통정보가 있는 경우
+                                if (pCDSObj->TRFC_FILL_CD == "F") continue; //
+                            }
+
+                            break;
+                        case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: case 19:
+                            if (pSchUnit->VMS_IFSC_ID == "") continue; //하단에 표출할 정보제공구간이 없는 경우임
+                            break;
+#if 0
+                        case  1://심볼(소통정보 시점 종점 사이 화살표)
+#if 1
+                            if (pCDSObj->VMS_DSPL_TXT.Trim() == "->")
+                                if (pSchUnit->VMS_IFSC_ID == "") continue; //하단에 표출할 정보제공구간이 없는 경우임
+#else
+                            if (pSchUnit->VMS_IFSC_ID == "") continue; //하단에 표출할 정보제공구간이 없는 경우임
+#endif
+                            break;
+#endif
+                        default: break;
+                        }
+                    }
+
+                    pVmsObj = pVmsForm->AddFormObject();
+                    pVmsObj->IFSC_ID = "";
+
+                    switch(pCDSObj->VMS_FORM_OBJECT_TYPE_CD)
+                    {
+                    case  1: //이미지 심볼
+                        pVmsObj->ObjectKind = graphicID_object_data;  //요건 다운로드되어 있는 경우인데 다운로드상관없이 표출되도록하기위함
+                        //pVmsObj->ObjectKind = graphic_object_data;
+                        break;
+                    case  2: //파일이미지
+                        pVmsObj->ObjectKind = graphicID_object_data;
+                        break;
+                    case  3: //소통정보배경이미지
+                        pVmsObj->ObjectKind = graphic_object_data;
+                        break;
+                    case 17: //소통정보이미지1
+                    case 27: //소통정보이미지2
+                    case 37: //소통정보이미지3
+                    case 47: //소통정보이미지4
+                        pVmsObj->ObjectKind = graphicID_object_data;
+                        break;
+                    default:
+                        pVmsObj->ObjectKind = text_object_data;
+                        break;
+                    }
+                    pVmsObj->ObjectType    = pCDSObj->VMS_FORM_OBJECT_TYPE_CD; //NUMBER(3)	N			VMS FORM OBJECT 유형 코드
+                    pVmsObj->TextFontName  = pCDSObj->VMS_FONT_TYPE_CD;        //NUMBER(3)	N			VMS 글꼴 유형 코드
+                    //TODO
+                    pVmsObj->StrTextFontName = CodeToFont(pVmsObj->TextFontName);
+
+                    pVmsObj->TextFontColor = pCDSObj->VMS_FONT_HUE_CD;         //NUMBER(9)	N			VMS 글꼴 색상 코드
+                    pVmsObj->TextFontBold  = pCDSObj->VMS_FONT_STYL_CD;        //NUMBER(3)	Y			VMS 글꼴 방식 코드
+                    pVmsObj->TextFontSize  = pCDSObj->VMS_FONT_SIZE;           //NUMBER(3)	Y	0		VMS 글꼴 크기
+                    pVmsObj->TextAlign     = pCDSObj->VMS_FONT_ALIGN;          //NUMBER(1)	Y	0		VMS 표출 문자열정열방식(0:LEFT,1:RIGHT,2:CENTER)
+                    pVmsObj->TextData      = pCDSObj->VMS_DSPL_TXT;            //VARCHAR2(200)	Y		VMS 표출 텍스트
+                    pVmsObj->PosX          = pCDSObj->VMS_DSPL_XCRDN;          //NUMBER(5)	Y			VMS 표출 X좌표
+                    pVmsObj->PosY          = pCDSObj->VMS_DSPL_YCRDN;          //NUMBER(5)	Y			VMS 표출 Y좌표
+                    pVmsObj->Width         = pCDSObj->VMS_DSPL_WIDTH;          //NUMBER(5)	Y	0		VMS 표출 넓이
+                    pVmsObj->Height        = pCDSObj->VMS_DSPL_HEIGHT;         //NUMBER(5)	Y	0		VMS 표출 높이
+                    pVmsObj->IsBlinking    = pCDSObj->VMS_DSPL_BLINKING;       //NUMBER(1)	Y	0		VMS 표출 점멸 여부(0:지속, 1:점멸)
+                    pVmsObj->BkColor       = pCDSObj->VMS_DSPL_BKCOLOR;        //NUMBER(1)	Y	0		VMS 표출 배경색상코드
+                    pVmsObj->ObjectSize    = pCDSObj->VMS_DSPL_SIZE;           //NUMBER(7)	Y	0		VMS 표출 크기(문자:문자길이,이미지:이미지전체크기)
+                    pVmsObj->ImageId       = pCDSObj->SYMBLIB_NMBR+"0";            //NUMBER(4)	N	0		심벌라이브러리 번호
+                    pVmsObj->ImageType     = "0";   //Bitmap
+
+                    if (pVmsObj->ObjectKind != text_object_data)
+                    {
+                        if (pVmsObj->NewImage() != NULL)
+                        {
+                            try
+                            {
+                                pVmsObj->pImageData->Picture->Bitmap->Canvas->Lock();
+                                try
+                                {
+                                    pVmsObj->pImageData->Picture->Assign(pCDSObj->pImage->Picture);
+                                }
+                                catch(Exception &e)
+                                {
+                                    LERROR("SaveMemoryStream1: %s[%s] - %s", pVmsForm->FormId.c_str(), pVmsObj->ImageId.c_str(), AnsiString(e.Message).c_str());
+                                }
+                            }
+                            __finally
+                            {
+                                pVmsObj->pImageData->Picture->Bitmap->Canvas->Unlock();
+
+                                pVmsObj->pImageStream->Clear();
+                                pVmsObj->pImageStream->Position = 0;
+                                pVmsObj->pImageData->Picture->Graphic->SaveToStream((Classes::TStream*)pVmsObj->pImageStream);
+                            }
+                        }
+                    }
+
+                    //폼객체 유형별 Fill In
+                    if (pVmsObj->ObjectType == 0)       //고정문자열
+                    {
+#if 0
+                        if (pObj->FBmpDownload == false && pObj->FIsOldProtocol == false)
+                        {
+                            //신규VMS인 경우 첫자리가 0 인경우 해당 문자를 표출하지 못함
+                            if (pVmsObj->TextData != "")
+                            {
+                                if (pVmsObj->TextData.SubString(1,1) == "0")
+                                {
+                                    pVmsObj->TextData = " " + pVmsObj->TextData;
+                                    pVmsObj->PosX = pVmsObj->PosX - 5;
+                                }
+                            }
+                        }
+#endif
+                        ChangePosition(pVmsObj);
+                    }
+                    else
+                    if (pVmsObj->ObjectType == 1 ||     //심볼
+                        pVmsObj->ObjectType == 2 )      //파일이미지
+                    {
+                        ;   //처리없음
+                    }
+                    else
+                    if (pVmsObj->ObjectType == 17 ||    //소통정보이미지1
+                        pVmsObj->ObjectType == 27 ||    //소통정보이미지2
+                        pVmsObj->ObjectType == 37 ||    //소통정보이미지3
+                        pVmsObj->ObjectType == 47 )     //소통정보이미지4
+                    {
+                        if (!pVmsObj->pImageData) continue;
+
+                        TCDSImage *pSymbol = ImageManager->FLists.Find(pVmsObj->ImageId);
+                        if (!pSymbol) continue;
+
+                        try
+                        {
+                            int X, Y;
+
+                            switch(pVmsObj->ObjectType)
+                            {
+                            case 17: pVmsObj->IFSC_ID = pSchUnit->FRST_IMG_IFSC_ID; break;
+                            case 27: pVmsObj->IFSC_ID = pSchUnit->SECD_IMG_IFSC_ID; break;
+                            case 37: pVmsObj->IFSC_ID = pSchUnit->THIR_IMG_IFSC_ID; break;
+                            case 47: pVmsObj->IFSC_ID = pSchUnit->FOUR_IMG_IFSC_ID; break;
+                            }
+
+                            FOR_STL(TCDSImageCell*, pCell, pSymbol->FLists)
+                            {
+                                TCDSIfsc *pTmpIfsc = IfscManager->FLists.Find(pVmsObj->IFSC_ID);
+                                if (pTmpIfsc)
+                                {
+                                    X = pCell->POSX;
+                                    Y = pCell->POSY;
+
+                                    pVmsObj->ImageId = pCDSObj->SYMBLIB_NMBR + pTmpIfsc->CMTR_GRAD_CD;
+                                    try
+                                    {
+                                        pVmsObj->pImageData->Picture->Bitmap->Canvas->Lock();
+                                        pVmsObj->pImageData->Picture->Bitmap->Canvas->Brush->Color = GradeToFillColor(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0));
+                                        TColor clColor = pVmsObj->pImageData->Picture->Bitmap->Canvas->Pixels[X][Y];
+                                        pVmsObj->pImageData->Picture->Bitmap->Canvas->FloodFill(X, Y, clColor, fsSurface);
+                                    }
+                                    __finally
+                                    {
+                                        pVmsObj->pImageData->Picture->Bitmap->Canvas->Unlock();
+                                    }
+                                }
+                            }
+                            pVmsObj->pImageStream->Clear();
+                            pVmsObj->pImageStream->Position = 0;
+                            pVmsObj->pImageData->Picture->Graphic->SaveToStream((Classes::TStream*)pVmsObj->pImageStream);
+                        }
+                        catch(Exception &e)
+                        {
+                            LERROR("SaveMemoryStreamX: %s[%s] - %s", pVmsForm->FormId.c_str(), pVmsObj->ImageId.c_str(), AnsiString(e.Message).c_str());
+                        }
+                    }
+                    else
+                    if (pVmsObj->ObjectType == 3)       //소통정보 배경이미지
+                    {
+                        if (!pVmsObj->pImageData) continue;
+
+                        TCDSImage *pSymbol = ImageManager->FLists.Find(pVmsObj->ImageId);
+                        if (!pSymbol) continue;
+
+                        try
+                        {
+                            int X, Y;
+
+                            FOR_STL(TCDSImageCell*, pCell, pSymbol->FLists)
+                            {
+                                TCDSIfsc *pTmpIfsc = IfscManager->FLists.Find(pCell->VMS_IFSC_ID);
+                                if (pTmpIfsc)
+                                {
+                                    X = pCell->POSX;
+                                    Y = pCell->POSY;
+
+                                    try
+                                    {
+                                        pVmsObj->pImageData->Picture->Bitmap->Canvas->Lock();
+                                        pVmsObj->pImageData->Picture->Bitmap->Canvas->Brush->Color = GradeToFillColor(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0));
+                                        TColor clColor = pVmsObj->pImageData->Picture->Bitmap->Canvas->Pixels[X][Y];
+                                        pVmsObj->pImageData->Picture->Bitmap->Canvas->FloodFill(X, Y, clColor, fsSurface);
+                                    }
+                                    __finally
+                                    {
+                                        pVmsObj->pImageData->Picture->Bitmap->Canvas->Unlock();
+                                    }
+                                }
+                            }
+                            pVmsObj->pImageStream->Clear();
+                            pVmsObj->pImageStream->Position = 0;
+                            pVmsObj->pImageData->Picture->Graphic->SaveToStream((Classes::TStream*)pVmsObj->pImageStream);
+                        }
+                        catch(Exception &e)
+                        {
+                            LERROR("SaveMemoryStream2: %s[%s] - %s", pVmsForm->FormId.c_str(), pVmsObj->ImageId.c_str(), AnsiString(e.Message).c_str());
+                        }
+                    }
+                    else
+                    if (pVmsObj->ObjectType == 61 ||    //구간명
+                        pVmsObj->ObjectType == 62 ||    //시점명
+                        pVmsObj->ObjectType == 63 ||    //종점명
+                        pVmsObj->ObjectType == 64 ||    //돌발종류
+                        pVmsObj->ObjectType == 65 )     //대응문구
+                    {
+                        //돌발문안인 경우임
+                        pVmsObj->TextData = " ";
+                        VMS_EVENT_DETL *pEvt = pSchUnit->EVENT;
+                        if (pEvt)
+                        {
+                            switch(pVmsObj->ObjectType)
+                            {
+                            case 61: pVmsObj->TextData = pEvt->VMS_IFSC_NM;      break; //구간명(사용안함)
+                            case 62: pVmsObj->TextData = pEvt->STRT_LCTN_NM;     break; //VMS돌발시점명
+                            case 63: pVmsObj->TextData = pEvt->END_LCTN_NM;      break; //VMS돌발종점명
+                            case 64: pVmsObj->TextData = pEvt->VMS_INCD_DETL_NM; break; //VMS돌발세부유형명
+                            case 65: pVmsObj->TextData = pEvt->OCRR_LCTN_NM;     break; //대응문구(사용안함-발생장소로 일단넣음)
+                            }
+                        }
+                        if (pVmsObj->TextData == "") pVmsObj->TextData = " ";
+                        ChangePosition(pVmsObj);
+                        //TB_VMS_FORM_OBJECT_TYPE 테이블에 유형추가하고
+                        //돌발화면에서 필요한 항목 추가, TB_INCD_OCRR_VMS 테이블에 컬럼추가해야함
+                    }
+                    else
+                    if (pVmsObj->ObjectType == 71 ||    //발생장소
+                        pVmsObj->ObjectType == 72 ||    //해당도로
+                        pVmsObj->ObjectType == 73 ||    //통제시점명
+                        pVmsObj->ObjectType == 74 ||    //통제종점명
+                        pVmsObj->ObjectType == 75 ||    //00차로 차단
+                        pVmsObj->ObjectType == 76 ||    //00월00일 ~ 00월00일
+                        pVmsObj->ObjectType == 77 )     //대응문구
+                    {
+                        //공사/행사문안 임
+                        pVmsObj->TextData = " ";
+                        VMS_EVENT_DETL *pEvt = pSchUnit->EVENT;
+                        if (pEvt)
+                        {
+                            switch(pVmsObj->ObjectType)
+                            {
+                            case 71: pVmsObj->TextData = pEvt->OCRR_LCTN_NM;    break; //발생장소
+                            case 72: pVmsObj->TextData = pEvt->VMS_IFSC_NM;     break; //해당도로
+                            case 73: pVmsObj->TextData = pEvt->STRT_LCTN_NM;    break; //통제시점명
+                            case 74: pVmsObj->TextData = pEvt->END_LCTN_NM;     break; //통제종점명
+                            case 75:
+                                {
+                                    int nLane = pEvt->INCD_CLSR_LANE.ToIntDef(0);
+#ifdef LANG_ENG
+                                    if (nLane == 111111)
+                                        pVmsObj->TextData = "차로 차단";
+                                    else
+                                    if (nLane > 0)
+                                        pVmsObj->TextData = "일부 차단";
+                                    else
+                                        pVmsObj->TextData = " ";
+#else
+                                    if (nLane == 111111)
+                                        pVmsObj->TextData = "차로 차단";
+                                    else
+                                    if (nLane > 0)
+                                        pVmsObj->TextData = "일부 차단";
+                                    else
+                                        pVmsObj->TextData = " ";
+#endif
+                                }
+                                break; //00차로 차단
+                            case 76: //00월00일 ~ 00월00일
+                                {
+#ifdef LANG_ENG
+                                    String sFrom = pEvt->INCD_STRT_DT.SubString(5,2)     + "월" + pEvt->INCD_STRT_DT.SubString(7,2)     + "일";
+                                    String sTo   = pEvt->INCD_END_PRAR_DT.SubString(5,2) + "월" + pEvt->INCD_END_PRAR_DT.SubString(7,2) + "일";
+#else
+                                    String sFrom = pEvt->INCD_STRT_DT.SubString(5,2)     + "월" + pEvt->INCD_STRT_DT.SubString(7,2)     + "일";
+                                    String sTo   = pEvt->INCD_END_PRAR_DT.SubString(5,2) + "월" + pEvt->INCD_END_PRAR_DT.SubString(7,2) + "일";
+#endif
+                                    //문자열 맨 앞이 '0'으로 시작하는 경우 VMS에서 표출되지 않음
+                                    //if (g_AppCfg.DownloadBitmap == false)
+                                    if (pObj->FBmpDownload == false)
+                                    {
+                                        if (sFrom.SubString(1,1) == "0")
+                                        {
+                                            sFrom = " " + sFrom;
+                                            pVmsObj->PosX = pVmsObj->PosX - 5;
+                                        }
+                                    }
+                                    pVmsObj->TextData = sFrom + " ~ " + sTo;
+                                }
+                                break;
+                            case 77: pVmsObj->TextData = pEvt->OCRR_LCTN_NM;    break; //대응문구(사용안함-발생장소로 일단넣음)
+                            }
+                        }
+                        if (pVmsObj->TextData == "") pVmsObj->TextData = " ";
+                        ChangePosition(pVmsObj);
+                    }
+                    else
+                    if (pVmsObj->ObjectType == 81 ||    //돌발종류
+                        pVmsObj->ObjectType == 82 ||    //해당도로
+                        pVmsObj->ObjectType == 83 ||    //우회도로
+                        pVmsObj->ObjectType == 84 )     //발생장소
+                    {
+                        pVmsObj->TextData = " ";
+                        VMS_EVENT_DETL *pEvt = pSchUnit->EVENT;
+                        if (pEvt)
+                        {
+                            switch(pVmsObj->ObjectType)
+                            {
+                            case 81: pVmsObj->TextData = pEvt->VMS_INCD_DETL_NM;    break; //돌발종류
+                            case 82: pVmsObj->TextData = pEvt->VMS_IFSC_NM;         break; //해당도로
+                            case 83: pVmsObj->TextData = pEvt->VMS_IFSC_NM;         break; //우회도로
+                            case 84: pVmsObj->TextData = pEvt->OCRR_LCTN_NM;        break; //발생장소
+                            }
+                        }
+                        if (pVmsObj->TextData == "") pVmsObj->TextData = " ";
+                        ChangePosition(pVmsObj);
+                    }
+                    else
+                    {
+                        //객체가 가변(소통정보 표출) 인 경우 가변문자를 설정하자....
+                        AnsiString VMS_IFSC_ID = "";
+                        switch(pVmsObj->ObjectType)
+                        {
+                        case 11: case 12: case 13: case 14: case 15: case 16: case 18: case 19:
+                            VMS_IFSC_ID = pSchUnit->FRST_VMS_IFSC_ID;
+                            if (pVmsForm->FormKind == enFormKindTrfImg)
+                            {
+                                VMS_IFSC_ID = pSchUnit->VMS_IFSC_ID;
+                            }
+                            else
+                            if (pVmsForm->FormKind == enFormKindCongest && pVmsObj->ObjectType == 18)
+                            {
+                                VMS_IFSC_ID = pSchUnit->VMS_IFSC_ID;
+                            }
+                            break;
+                        case 21: case 22: case 23: case 24: case 25: case 26: case 28:
+                            VMS_IFSC_ID = pSchUnit->SECD_VMS_IFSC_ID;
+                            break;
+                        case 31: case 32: case 33: case 34: case 35: case 36: case 38:
+                            VMS_IFSC_ID = pSchUnit->THIR_VMS_IFSC_ID;
+                            break;
+                        case 41: case 42: case 43: case 44: case 45: case 46: case 48:
+                            VMS_IFSC_ID = pSchUnit->FOUR_VMS_IFSC_ID;
+                            break;
+                        case 91: case 92:
+                            VMS_IFSC_ID = pCDSObj->VMS_IFSC_ID; //축통행시간/축소통상황(고정)
+                            break;
+                        case 93: case 94: case 95: case 96:
+                            VMS_IFSC_ID = pSchUnit->VMS_IFSC_ID;
+                            break;
+                        default: continue;
+                        }
+                        pVmsObj->TextData = " ";
+                        TCDSIfsc *pTmpIfsc = IfscManager->FLists.Find(VMS_IFSC_ID);
+                        if (pTmpIfsc)
+                        {
+                            switch(pVmsObj->ObjectType)
+                            {
+                            case 11: case 21: case 31: case 41: //구간명
+                                pVmsObj->TextData = pTmpIfsc->VMS_IFSC_NM;
+                                break;
+                            case 12: case 22: case 32: case 42: case 93://시점명
+                                pVmsObj->TextData = pTmpIfsc->DSPL_STRT_NODE_NM;
+                                break;
+                            case 13: case 23: case 33: case 43: case 94://종점명
+                                pVmsObj->TextData = pTmpIfsc->DSPL_END_NODE_NM;
+                                break;
+                            case 14: case 24: case 34: case 44: case 92: case 95://소통상황
+#if 0
+                                pVmsObj->TextData = GradeToString(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0), pVmsForm->FormKind);
+#else
+                                if (pObj->VmsType == "VUTP") //도형식인 경우
+                                    pVmsObj->TextData = GradeToString(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0), enFormKindTrfImg);
+                                else
+                                    pVmsObj->TextData = GradeToString(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0), pVmsForm->FormKind);
+#endif
+                                pVmsObj->TextFontColor = GradeToColorCode(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0));
+                                break;
+                            case 19:    //소통상황(가변)
+                                {
+                                    AnsiString sGradText = GradeToString(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0), pVmsForm->FormKind);
+                                    if (pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0) == grade_smoothness)
+                                    {
+#ifdef LANG_ENG
+                                        sGradText.printf("소통원활  약 %d 분", pTmpIfsc->TRVL_HH);
+#else
+                                        sGradText.printf("소통원활  약 %d 분", pTmpIfsc->TRVL_HH);
+#endif
+                                    }
+                                    pVmsObj->TextData = sGradText;
+                                    pVmsObj->TextFontColor = GradeToColorCode(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0));
+                                }
+                                break;
+                            case 15: case 25: case 35: case 45: case 91: case 96://통행시간
+#if 0
+                                pVmsObj->TextData = AnsiString(pTmpIfsc->TRVL_HH);
+#else
+                                {
+                                    AnsiString sFmt = pCDSObj->VMS_DSPL_TXT;
+
+                                    if (sFmt.Pos("0"))
+                                    {
+                                        sFmt = StringReplace(sFmt, "0000", "%4d", TReplaceFlags() << rfReplaceAll);
+                                        sFmt = StringReplace(sFmt, "000", "%3d", TReplaceFlags() << rfReplaceAll);
+                                        sFmt = StringReplace(sFmt, "00", "%2d", TReplaceFlags() << rfReplaceAll);
+                                        sFmt = StringReplace(sFmt, "0", "%d", TReplaceFlags() << rfReplaceAll);
+
+                                        pVmsObj->TextData.printf(sFmt.c_str(), pTmpIfsc->TRVL_HH);
+                                    }
+                                    else
+                                    {
+                                        pVmsObj->TextData = AnsiString(pTmpIfsc->TRVL_HH);
+                                    }
+                                }
+#endif
+                                pVmsObj->TextFontColor = GradeToColorCode(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0));
+                                break;
+                            case 16: case 26: case 36: case 46://통행속도
+                                pVmsObj->TextData = AnsiString(pTmpIfsc->SPED);
+                                pVmsObj->TextFontColor = GradeToColorCode(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0));
+                                break;
+                            case 17: case 27: case 37: case 47: //방향이미지...???
+                                break;
+                            case 18: case 28: case 38: case 48:
+                                pVmsObj->TextData = pTmpIfsc->SPOT_NM;
+                                break;
+                            }
+                            ChangePosition(pVmsObj);
+                        }
+                    }
+                } //FOR_STL(폼객체생성)
+
+                pVmsForm->UnLock();
+
+            } //for(최대 제공 메시지 갯수만큼 생성)
+        }
+        __finally
+        {
+            pObj->pForms->UnLock();
+        }
+    } //iterator(VMS전체루프)
+
+    LINFO("MakeVmsDownloadForm: End. (VMS: %d EA, Forms %d EA)", nSaveVmsCnt, nSaveFormCnt);
+
+
+    LINFO("MakeVmsDatabaseForm: Start");
+
+    nSaveVmsCnt = 0;
+    nSaveFormCnt= 0;
+
+    //데이터베이스에 저장할 폼을 생성한다.
+    for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
+    {
+        TVmsCtlr *pObj = (TVmsCtlr*)it->second;
+
+        if (pObj->Server.UseFlag != bit_enable) continue;
+        if (!pObj->FProvide) continue;
+
+        nSaveFormCnt += MakeVmsDatabaseForm(pObj);
+        nSaveVmsCnt++;
+    }
+
+    LINFO("MakeVmsDatabaseForm: End. (VMS: %d EA, Forms %d EA)", nSaveVmsCnt, nSaveFormCnt);
+    return VERR_NONE;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TFrmMain::MakeVmsDatabaseForm(TVmsCtlr *AObj)
+{
+	int nResult = VERR_OTHER;
+    int nSelCnt = 0;
+
+
+    if (!AObj) return VERR_MEMORY_ALLOC;
+
+    int nFormCnt = AObj->pForms->Count();
+    if (nFormCnt == 0) return VERR_NONE;
+
+	try
+	{
+		try
+		{
+            AObj->pForms->Lock();
+
+            for (int ii = 0; ii < nFormCnt; ii++)
+            {
+				TVmsForm *pForm = AObj->pForms->GetItem(ii);
+
+                int nObjCnt;
+                try
+                {
+        			pForm->pBitmap->Canvas->Lock();
+
+                    pForm->FormClear(CodeToColor(pForm->BkColor));
+
+                    nObjCnt = pForm->Count();
+
+                    for (int jj = 0; jj < nObjCnt; jj++)
+                    {
+                        TVmsFormObj *pFormObj = pForm->GetItem(jj);
+                        switch(pFormObj->ObjectType)
+                        {
+                        case  1: //심볼
+                        case  2: //이미지
+                        case 17: //소통정보이미지1
+                        case 27: //소통정보이미지2
+                        case 37: //소통정보이미지3
+                        case 47: //소통정보이미지4
+                        case  3: //소통정보배경이미지
+                            pForm->pBitmap->Canvas->Draw(pFormObj->PosX, pFormObj->PosY, pFormObj->pImageData->Picture->Graphic);
+                            break;
+                        default://기타 문자열
+                            pForm->pBitmap->Canvas->Brush->Color = CodeToColor(pFormObj->BkColor);
+                            pForm->pBitmap->Canvas->Font->Color  = CodeToColor(pFormObj->TextFontColor);
+                            pForm->pBitmap->Canvas->Font->Name   = CodeToFont(pFormObj->TextFontName);
+                            pForm->pBitmap->Canvas->Font->Size   = pFormObj->TextFontSize;
+                            if (pFormObj->TextFontBold)
+                                pForm->pBitmap->Canvas->Font->Style = TFontStyles() << fsBold;
+                            else
+                                pForm->pBitmap->Canvas->Font->Style = TFontStyles();
+
+                            pForm->pBitmap->Canvas->TextOutA(pFormObj->PosX, pFormObj->PosY, pFormObj->TextData);
+                            break;
+                        }
+                    }
+
+                    try
+                    {
+                        pForm->pStream->Clear();
+                        pForm->pStream->Position = 0;
+                        pForm->pBitmap->SaveToStream(pForm->pStream);
+                    }
+                    catch(Exception &e)
+                    {
+                        LERROR("SaveMemoryStream3: %s", AnsiString(e.Message).c_str());
+                    }
+
+                    try
+                    {
+                        if (g_AppCfg.SaveFormImage)
+                        {
+                            String sFormImage;
+                            String sFormDir = g_sFormDir + AObj->VmsId + "\\";
+                            //ForceDirectories(sFormDir.c_str());
+
+                            sFormImage.printf(L"%s%s_%02d.bmp", sFormDir.c_str(), String(AObj->VmsId).c_str(), ii);
+                            pForm->pBitmap->SaveToFile(sFormImage);
+                        }
+                    }
+                    catch(Exception &e)
+                    {
+                        LERROR("SaveMemoryStream-SaveToFile: %s", AnsiString(e.Message).c_str());
+                    }
+
+#if 0
+                    try
+                    {
+                        //pForm->pBitmap->SaveToFile(g_sFormDir + AObj->VmsId + "\\" + AObj->VmsId + "_" + PHASE);
+
+                        //FTP다운로드 하는 경우 폼을 FTP디렉토리에 저장해야함
+                        if (AObj->FIsFtpDownload)
+                        {
+                            String DefForm, RunForm;
+                            DefForm.printf(L"%s9%d.bmp", String(AObj->VmsDownId).c_str(), ii);
+                            RunForm.printf(L"%s%02d.bmp",  String(AObj->VmsDownId).c_str(), ii);
+
+                            if (AObj->CTLMODE->Control == 'B')
+                            {
+                                //pForm->pBitmap->SaveToFile(g_sFtpDir + DefForm);
+                            }
+                            pForm->pBitmap->SaveToFile(g_sFtpDir + RunForm);
+                        }
+                    }
+                    catch(Exception &e)
+                    {
+                        LERROR("SaveMemoryStream-SaveToFile: %s", AnsiString(e.Message).c_str());
+                    }
+#endif
+
+                    nSelCnt++;
+                }
+                __finally
+                {
+                    pForm->pBitmap->Canvas->Unlock();
+                }
+            }
+
+            nResult = VERR_NONE;
+		}
+		catch(Exception &e)
+		{
+            LERROR("SaveMemoryStream4: %s", AnsiString(e.Message).c_str());
+		}
+	}
+	__finally
+	{
+        AObj->pForms->UnLock();
+	}
+    return nSelCnt;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmMain::OnWMUserMessage(TMessage &Msg)
+{
+    ReplyMessage(0);
+
+    if ((int)Msg.WParam == WM_MAKE_DOWNLOAD_FORM)
+    {
+        int nResult = MakeVmsDownloadForm();
+        SendDbThreadMessage(WM_SAVE_DOWNLOAD_FORM, NULL, NULL);
+        return;
+    }
+
+    if ((int)Msg.WParam == WM_WINDOW_RESTORE)
+    {
+        Application->Restore();
+        Application->BringToFront();
+    }
+
+    if ((int)Msg.WParam == WM_DATABASE_CLOSE)
+    {
+        m_bDB = state_error;
+    }
+
+    if ((int)Msg.WParam == WM_DATABASE_OPEN)
+    {
+        m_bDB = state_normal;
+    }
+
+    if ((int)Msg.WParam == WM_THREAD_TERMINATE)
+    {
+        Sleep(500);
+        AutoClose();
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmMain::OnVmsThreadMessage(TMessage &Msg)
+{
+    TVmsCtlr *pObj = (TVmsCtlr*)Msg.LParam;
+    switch(Msg.WParam)
+    {
+    case WM_VMS_SERVER_STTS:
+        FrmVmsInfo->UpdateServerState((int)pObj);
+        SendDbThreadMessage(WM_EQUIP_STATE, Msg.LParam, 1);
+        break;
+    case WM_VMS_CLIENT_STTS:
+        FrmVmsInfo->UpdateClientState((int)pObj);
+        break;
+    case WM_VMS_STATE_STTS:
+        FrmVmsInfo->UpdateClientState((int)pObj);
+        SendDbThreadMessage(WM_EQUIP_STATE, Msg.LParam, 0);
+        break;
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmMain::OnUdpDataRecvMessage(TMessage &Msg)
+{
+    int                  nResult;
+    IPCUDPMESSAGESTRUCT *RcvData = (IPCUDPMESSAGESTRUCT*)Msg.LParam;
+    INT_SENDER          *Sender  = &RcvData->Sender;
+    INT_PACKET          *Pkt     = &RcvData->Pkt;
+    INT_HEAD            *head    = &Pkt->head;
+    INT_DATA            *data    = &Pkt->data;
+    char                *pData   = &data->Data[2];
+    BYTE                 OpCode  = (BYTE)data->Data[0];
+
+    LINFO("OPR Client Req: %s.%d, %02X[%02X]", VComm_ulong2ip(Sender->IP), Sender->Port, head->OPCode, OpCode);
+
+    if (head->OPCode == INT_OP_COMM_COMMON)
+    {
+        switch(OpCode)
+        {
+        case INT_OP_VMS_POWER_CTL:
+            {
+                INT_VMS_POWER_CTL_REQ *pReq = (INT_VMS_POWER_CTL_REQ*)pData;
+                LINFO("VmsPowerCtlReq: %.*s, %s, %s, %d", INT_VMS_MAX_DATETIME, pReq->CmdTime, pReq->VmsId, pReq->OperId, pReq->Command);
+                if ((nResult = SendVmsThreadMessage(pReq->VmsId, RcvData, OpCode, (char*)pReq)) != VERR_NONE)
+                {
+                    //ClientResponse(SEND_NACK, &Req, result, NULL);
+                }
+            }
+            break;
+        case INT_OP_VMS_LUMINANCE_CTL:
+            {
+                INT_VMS_LUMINANCE_REQ *pReq = (INT_VMS_LUMINANCE_REQ*)pData;
+                LINFO("VmsLuminanceReq: %.*s, %s, %s, %d", INT_VMS_MAX_DATETIME, pReq->CmdTime, pReq->VmsId, pReq->OperId, pReq->Luminance);
+                if ((nResult = SendVmsThreadMessage(pReq->VmsId, RcvData, OpCode, (char*)pReq)) != VERR_NONE)
+                {
+                    //ClientResponse(SEND_NACK, &Req, result, NULL);
+                }
+            }
+            break;
+        case INT_OP_VMS_RESET:
+            {
+                INT_VMS_RESET_REQ *pReq = (INT_VMS_RESET_REQ*)pData;
+                LINFO("VmsResetReq: %.*s, %s, %s", INT_VMS_MAX_DATETIME, pReq->CmdTime, pReq->VmsId, pReq->OperId);
+                if ((nResult = SendVmsThreadMessage(pReq->VmsId, RcvData, OpCode, (char*)pReq)) != VERR_NONE)
+                {
+                    //ClientResponse(SEND_NACK, &Req, result, NULL);
+                }
+            }
+            break;
+        case INT_OP_VMS_PARA_SET:
+            {
+                INT_VMS_PARA_SET_REQ *pReq = (INT_VMS_PARA_SET_REQ*)pData;
+                LINFO("VmsParaSetReq: %.*s, %s, %s", INT_VMS_MAX_DATETIME, pReq->CmdTime, pReq->VmsId, pReq->OperId);
+                LINFO("VmsParaSetReq: %d.%d,%d,%d,%d,%d,%d",
+                        pReq->SchMsgTime,
+                        pReq->ModuleTemp,
+                        pReq->FanTemp,
+                        pReq->HeaterTemp,
+                        pReq->ModuleFail,
+                        pReq->RetryCount,
+                        pReq->TimeOut);
+                if ((nResult = SendVmsThreadMessage(pReq->VmsId, RcvData, OpCode, (char*)pReq)) != VERR_NONE)
+                {
+                    //ClientResponse(SEND_NACK, &Req, result, NULL);
+                }
+            }
+            break;
+        case INT_OP_VMS_PARA_SET2:
+            {
+                INT_VMS_PARA_SET_REQ2 *pReq = (INT_VMS_PARA_SET_REQ2*)pData;
+                LINFO("VmsParaSetReq: %.*s, %s, %s", INT_VMS_MAX_DATETIME, pReq->CmdTime, pReq->VmsId, pReq->OperId);
+                LINFO("VmsParaSetReq: %d.%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
+                        pReq->DefCommErr,                           // 통신장애 기본값, 제어기가 Host로부터 Poll 또는 명령을 받지 않고 경과할 수 있는 최대시간 (default ; 60초)
+                        pReq->SlotCommErr,                          // 통신장애 slot번호, 통신 fail 시 표시할 메시지 번호(default 0번)
+                        pReq->SlotPowerErr,                         // 전원장애 slot번호, 전원장애 시 표시할 메시지 번호(default 0번)
+                        pReq->NightLuminance,                       // 야간 휘도 값, 0x30 ~ 0x3F
+                        pReq->DayLuminance,                         // 주간 휘도 값, 0x40 ~ 0x4F
+                        pReq->PhaseCycleTime,                       // phase시간주기, 장애시 phase주기 (default : 3초, 범위 : 0 ~ 10초)
+                        pReq->ModuleFailRate,                       // 모듈장애율, 한개의 module을 장애로 처리하기 위한 장애 pixel백분율 (default 10%)
+                        pReq->ModuleCheckTime,                      // 모듈감시 주기, 0 ~ 255 (단위:초)
+                        pReq->BoardOnHour,                          // 전광판 On time(시), 0시 ~ 23시
+                        pReq->BoardOnMin,                           // 전광판 On time(분), 0시 ~ 23시
+                        pReq->BoardOffHour,                         // 전광판 Off time(시), 0시 ~ 23시
+                        pReq->BoardOffMin);                          // 전광판 Off time(분), 0시 ~ 23시
+                if ((nResult = SendVmsThreadMessage(pReq->VmsId, RcvData, OpCode, (char*)pReq)) != VERR_NONE)
+                {
+                    //ClientResponse(SEND_NACK, &Req, result, NULL);
+                }
+            }
+            break;
+        case INT_OP_VMS_COMMON:
+            {
+                INT_VMS_COMMON_REQ *pReq = (INT_VMS_COMMON_REQ*)pData;
+                LINFO("VmsCommonReq: %.*s, %s, %s : 0x%02x", INT_VMS_MAX_DATETIME, pReq->CmdTime, pReq->VmsId, pReq->OperId, pReq->Command);
+                if (pReq->Command == 0x01)
+                {
+                    //메시지 바로 다운로드함
+                    ProvideEvent(provide_event, NULL, NULL);
+                }
+            }
+            break;
+        case INT_OP_VMS_DIRECT:
+            {
+                INT_VMS_DIRECT_CTL_REQ *pReq = (INT_VMS_DIRECT_CTL_REQ*)pData;
+                LINFO("VmsDirectReq: %.*s, %s, %s : 0x%02x", INT_VMS_MAX_DATETIME, pReq->CmdTime, pReq->VmsId, pReq->OperId, pReq->Command);
+                if ((nResult = SendVmsThreadMessage(pReq->VmsId, RcvData, OpCode, (char*)pReq)) != VERR_NONE)
+                {
+                    //ClientResponse(SEND_NACK, &Req, result, NULL);
+                }
+            }
+            break;
+        case INT_OP_VMS_MODE:
+            {
+                INT_VMS_MODE_REQ *pReq = (INT_VMS_MODE_REQ*)pData;
+#if 0
+                LINFO("VmsModeSetReq: %.*s, %s, %s, %c", INT_VMS_MAX_DATETIME, pReq->CmdTime, pReq->VmsId, pReq->OperId, pReq->Mode);
+#else
+                LINFO("VmsModeSetReq: %.*s, %s, %s, %d EA", INT_VMS_MAX_DATETIME, pReq->CmdTime, pReq->OperId, pReq->Count);
+#endif
+    			//ProvideEvent(provide_mode, pReq->VmsId, pReq->Mode);
+    			ProvideEvent(provide_mode, (BYTE*)pReq, NULL);
+            }
+            break;
+        case INT_OP_VMS_STATE_REQ:
+            LINFO("VmsStateReq");
+            DMCOMM->SendEquipStateAllProc();
+            break;
+        case INT_OP_VMS_IMAGE_SYMBOL:
+            LINFO("VmsImageSymbolUpdate");
+            SendDbThreadMessage(WM_MASTER_IMAGE_SYMBOL, NULL, NULL);
+            break;
+        case INT_OP_VMS_IMAGE_TRAFFIC:
+            LINFO("VmsImageTrafficUpdate");
+            SendDbThreadMessage(WM_MASTER_IMAGE_TRAFFIC, NULL, NULL);
+            break;
+        case INT_OP_VMS_FORM_UPDATE:
+            LINFO("VmsFormUpdate");
+            SendDbThreadMessage(WM_MASTER_FORM, NULL, NULL);
+            break;
+        case INT_OP_VMS_IFSC_UPDATE:
+            LINFO("VmsIfscUpdate");
+            SendDbThreadMessage(WM_MASTER_VMS_IFSC, NULL, NULL);
+            break;
+        default:
+            LERROR("Unknown Client Request: %02X", OpCode);
+            break;
+        }
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmMain::TerminateApplication(void)
+{
+    LERROR("Program terminated start");
+
+    /* 연결 소켓 종료 */
+    DMCOMM->TerminateVms();
+    Sleep(500);
+    DMCOMM->TerminateVms();
+    DMCOMM->TerminateVmsClient();
+
+    SendTerminal();
+
+    if (m_CommThreadID != NULL)
+    {
+        g_SysInfo->State.hFinishEvent = CreateEvent(NULL, FALSE, FALSE, "");
+        if (g_SysInfo->State.hFinishEvent == NULL)
+        {
+            LERROR("Create thread finish event fail");
+        }
+
+        if (!PostThreadMessage(m_CommThreadID, WM_QUIT, NULL, NULL))
+        {
+            LDEBUG("PostThreadMessage fail:%d", GetLastError());
+        }
+        m_CommThreadID = NULL;
+
+        if (g_SysInfo->State.hFinishEvent != NULL)
+        {
+            DWORD dwWaitResult;
+
+            dwWaitResult = WaitForSingleObject(g_SysInfo->State.hFinishEvent, 5000);
+            if (dwWaitResult != WAIT_OBJECT_0)
+            {
+                LERROR("Wait finish event fail");
+            }
+            CloseHandle(g_SysInfo->State.hFinishEvent);
+        }
+    }
+
+    m_bAction = state_error;
+    m_bComm   = state_error;
+    m_bDB     = state_error;
+
+    SendProcessState();
+    Sleep(500);
+
+    VComm_Close();
+
+    LERROR("Program terminated end");
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmMain::UpdateProcessStatePanel()
+{
+    TColor clState;
+
+    clState = clGreen;
+    if (m_bAction != vms_normal) clState = clRed;
+    if (plStateAction->Color != clState) plStateAction->Color = clState;
+
+    if (m_bComm == state_normal)  clState = clGreen;
+    else
+    if (m_bComm == state_unknown) clState = clGray;
+    else                          clState = clRed;
+    if (plStateComm->Color != clState) plStateComm->Color = clState;
+
+    if (m_bDB == state_normal)  clState = clGreen;
+    else
+    if (m_bDB == state_unknown) clState = clGray;
+    else                        clState = clRed;
+    if (plStateDb->Color != clState) plStateDb->Color = clState;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TFrmMain::SendDbThreadMessage(UINT Msg, int wParam, int lParam)
+{
+    int result = VERR_OTHER;
+
+    if (m_CommThreadID != NULL)
+    {
+        if (PostThreadMessage(m_CommThreadID, Msg, (WPARAM)wParam, (LPARAM)lParam))
+        {
+            result = VERR_NONE;
+        }
+        else
+        {
+            result = VERR_INTERNAL;
+        }
+    }
+    return result;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TFrmMain::SendDbThreadDataMessage(UINT Msg, void *pData, int iLen)
+{
+    int   result = VERR_OTHER;
+    char *p;
+
+    if (m_CommThreadID != NULL)
+    {
+        p = new char[iLen];
+        if (p != NULL)
+        {
+            try
+            {
+                memcpy(p, pData, iLen);
+
+                if (PostThreadMessage(m_CommThreadID, Msg, (WPARAM)p, NULL))
+                {
+                    result = VERR_NONE;
+                    Sleep(50);
+                }
+                else
+                {
+                    result = VERR_INTERNAL;
+                }
+            }
+            __finally
+            {
+                if (result != VERR_NONE) delete []p;
+            }
+        }
+        else
+        {
+            result = VERR_MEMORY_ALLOC;
+        }
+    }
+    return result;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmMain::ClientResponse(int Flag, CLIENT_COMMAND *pReq, int error, void *pData)
+{
+#ifdef CENTERCOMM
+    BYTE ErrCode;
+    int sResult;
+
+    switch(error)
+    {
+    case SYS_ERR_NONE:                 break;
+    case SYS_ERR_OTHER:                ErrCode = INT_ERROR_OTHER; break;
+    case SYS_ERR_INTERNAL:             ErrCode = INT_ERROR_SYSTEM; break;
+    case SYS_ERR_MEMORY:               ErrCode = INT_ERROR_SYSTEM; break;
+    case SYS_ERR_DATABASE:             ErrCode = INT_ERROR_SYSTEM; break;
+    case SYS_ERR_RESET:                ErrCode = INT_ERROR_SYSTEM; break;
+    case SYS_ERR_START:                ErrCode = INT_ERROR_SYSTEM; break;
+    case SYS_ERR_OFFLINE:              ErrCode = INT_ERROR_OFFLINE; break;
+    case SYS_ERR_NO_RES:               ErrCode = INT_ERROR_NO_RESPONSE; break;
+    case SYS_ERR_ACCESS:               ErrCode = INT_ERROR_PROCESS; break;
+    case SYS_ERR_INVALID:              ErrCode = INT_ERROR_OTHER; break;
+    case SYS_ERR_UNKNOWN:              ErrCode = INT_ERROR_UNKNOWN_CODE; break;
+    case SYS_ERR_WRITE_LENGTH:         ErrCode = INT_ERROR_OTHER; break;
+    case SYS_ERR_PACKET_SIZE_LARGE:    ErrCode = INT_ERROR_OTHER; break;
+    case SYS_ERR_INVALID_TAG:          ErrCode = INT_ERROR_OTHER; break;
+    case SYS_ERR_CRC:                  ErrCode = INT_ERROR_OTHER; break;
+    case SYS_ERR_LENGTH:               ErrCode = INT_ERROR_LENGTH; break;
+    case SYS_ERR_ADDRESS:              ErrCode = INT_ERROR_ADDRESS; break;
+    case SYS_ERR_HEADER_OPTIONS:       ErrCode = INT_ERROR_HEADER; break;
+    case SYS_ERR_UNKNOWN_COMMAND:      ErrCode = INT_ERROR_UNKNOWN_OPCODE; break;
+    case SYS_ERR_RECEIVE_TIMEOUT:      ErrCode = INT_ERROR_OTHER; break;
+    case SYS_ERR_DATA_SIZE:            ErrCode = INT_ERROR_DISCORD; break;
+    case SYS_ERR_MISMATCH:             ErrCode = INT_ERROR_OTHER; break;
+    case SYS_ERR_INVALID_PARA:         ErrCode = INT_ERROR_INVALID_DATA; break;
+    case SYS_ERR_MOVEMENT:             ErrCode = INT_ERROR_MOVEMENT; break;
+    case SYS_ERR_UNAUTHORIZED:         ErrCode = INT_ERROR_UNAUTHORIZED; break;
+    default:                           ErrCode = INT_ERROR_OTHER; break;
+    }
+
+    if (Flag == SEND_ACK)
+    {
+        INT_ACK_RES Ack;
+
+        memset(&Ack, 0x00, sizeof(Ack));
+
+        Ack.OPCode.Type = INT_TYPE(pReq->OpCode);
+        Ack.OPCode.Kind = INT_KIND(pReq->OpCode);
+        Ack.MsgSeq = pReq->MsgSeq;
+
+        if ((sResult = AckRes(&Ack, pReq->ProcessID)) != UDP_ERR_NONE)
+        {
+            LERROR("AckRes fail %d", sResult);
+        }
+    }
+    else
+    if (Flag == SEND_NACK)
+    {
+        INT_NACK_RES Nack;
+
+        memset(&Nack, 0x00, sizeof(Nack));
+
+        Nack.OPCode.Type = INT_TYPE(pReq->OpCode);
+        Nack.OPCode.Kind = INT_KIND(pReq->OpCode);
+        Nack.MsgSeq = pReq->MsgSeq;
+        Nack.ErrCode = ErrCode;
+
+        if ((sResult = NackRes(&Nack, pReq->ProcessID)) != UDP_ERR_NONE)
+        {
+            LERROR("NackRes fail %d", sResult);
+        }
+    }
+#endif
+}
+//---------------------------------------------------------------------------
+
+bool __fastcall TFrmMain::CheckBasisTime(char *p, int Cycle, int Basis)
+{
+    char cTime[15];
+
+    CommUtil_MakeBasisTime(cTime, Cycle, Basis);
+
+    if (memcmp(p, cTime, 14) != 0)
+    {
+        memcpy(p, cTime, 14);
+        return true;
+    }
+
+    return false;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmMain::ProvideEvent(int Type, BYTE *pVmsId, BYTE Mode)
+{
+    int result;
+    PROVIDE_STRUCT Pro;
+
+    memset(&Pro, 0x00, sizeof(Pro));
+
+    Pro.Type = Type;
+    if (pVmsId)
+    {
+        INT_VMS_MODE_REQ *pReq = (INT_VMS_MODE_REQ*)pVmsId;
+        Pro.Count = pReq->Count;
+        memcpy(Pro.Unit, pReq->Unit, sizeof(Pro.Unit));
+    }
+
+#if 0
+    switch(Type)
+    {
+    case provide_event:
+        Pro.Type = Type;
+        break;
+    case provide_mode:
+        Pro.Type = Type;
+        //memcpy(Pro.VmsId, pVmsId, VMS_ID_SIZE);
+        //Pro.Mode = Mode;
+        INT_VMS_MODE_REQ *pReq
+        break;
+    default:
+        return;
+    }
+#endif
+
+    if ((result = SendDbThreadDataMessage(WM_PROVIDE_PROC, &Pro, sizeof(Pro))) != SYS_ERR_NONE)
+    {
+        LERROR("SendDbThreadDataMessage Error %d", result);
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmMain::CheckProvideSave()
+{
+    SAVE_STRUCT ProvideSave;
+    SAVE_STRUCT DownLoadSave;
+
+    memset(&ProvideSave,  0x00, sizeof(ProvideSave));
+    memset(&DownLoadSave, 0x00, sizeof(DownLoadSave));
+
+    ProvideSave.Type  = save_provide;
+    ProvideSave.Count = 0;
+
+    DownLoadSave.Type  = save_download;
+    DownLoadSave.Count = 0;
+
+    VmsIterator it;
+    for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
+    {
+        TVmsCtlr *pObj = (TVmsCtlr*)it->second;
+        if (pObj->Server.UseFlag != bit_enable) continue;
+
+        if ((pObj->DOWNLOAD->SaveFlag == false) &&
+            (CommUtil_TimeDiff(pObj->DOWNLOAD->dTimer) > VMS_DOWNLOAD_TIMEOUT))
+        {
+             DownLoadSave.pObj[DownLoadSave.Count++] = (void *)pObj;
+             pObj->DOWNLOAD->SaveFlag = true;
+        }
+
+		if ((pObj->CTLMODE->SaveFlag == false) &&
+			(CommUtil_TimeDiff(pObj->CTLMODE->pTimer) > VMS_PROVIDE_TIMEOUT))
+		{
+			ProvideSave.pObj[ProvideSave.Count++] = (void *)pObj;
+			pObj->CTLMODE->SaveFlag = true;
+		}
+    }
+
+    if (ProvideSave.Count != 0)
+    {
+        SendDbThreadDataMessage(WM_PROVIDE_SAVE, &ProvideSave, sizeof(ProvideSave));
+    }
+
+    if (DownLoadSave.Count != 0)
+    {
+        SendDbThreadDataMessage(WM_PROVIDE_SAVE, &DownLoadSave, sizeof(DownLoadSave));
+    }
+}
+//---------------------------------------------------------------------------
+
+bool __fastcall TFrmMain::CheckResource(size_t MaxMemory, DWORD MaxHandle, DWORD MaxThread, DWORD MaxGdi)
+{
+    bool result;
+    HANDLE hProcess;
+    PROCESS_MEMORY_COUNTERS pmc;
+    size_t uSize;
+    DWORD HandleCount, ThreadCount, GdiCount;
+    HANDLE hProcessSnap;
+    PROCESSENTRY32 pe32;
+    DWORD ProcessId;
+
+    result = false;
+    uSize = 0;
+    HandleCount = 0;
+    ThreadCount = 0;
+    GdiCount = 0;
+
+    hProcess = GetCurrentProcess();
+
+    if (hProcess != NULL)
+    {
+        if ( GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc)) )
+        {
+            uSize = pmc.WorkingSetSize/1024;
+
+            if ((MaxMemory != 0) && (uSize > MaxMemory))
+            {
+                LERROR("Memory usage exceeds standards!!!...[%d][%d]", MaxMemory, uSize);
+                result = true;
+            }
+        }
+
+        if ( GetProcessHandleCount( hProcess, &HandleCount) )
+        {
+            if ((MaxHandle != 0) && (HandleCount > MaxHandle))
+            {
+                LERROR("Window handle exceed standards!!!...[%d][%d]", MaxHandle, HandleCount);
+                result = true;
+            }
+        }
+
+        ProcessId = GetCurrentProcessId();
+
+        if ((hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 )) != INVALID_HANDLE_VALUE)
+        {
+            pe32.dwSize = sizeof( PROCESSENTRY32 );
+
+            if ( Process32First( hProcessSnap, &pe32 ) )
+            {
+                do
+                {
+                    if (pe32.th32ProcessID == ProcessId)
+                    {
+                        ThreadCount = pe32.cntThreads;
+
+                        if ((MaxThread != 0) && (ThreadCount > MaxThread))
+                        {
+                            LERROR("Criteria exceeded thread!!!...[%d][%d]", MaxThread, ThreadCount);
+                            result = true;
+                        }
+                        break;
+                    }
+                } while( Process32Next( hProcessSnap, &pe32 ) );
+            }
+
+            CloseHandle( hProcessSnap );
+        }
+
+        GdiCount = GetGuiResources( hProcess, GR_GDIOBJECTS);
+
+        if ((MaxGdi != 0) && (GdiCount > MaxGdi))
+        {
+            LERROR("GDI Objects exceeding standards!!!...[%d][%d]", MaxGdi, GdiCount);
+            result = true;
+        }
+        CloseHandle( hProcess );
+    }
+
+    try
+    {
+FMemSize = uSize;
+        plMemory->Caption = FormatFloat("##,##0", uSize)      ;// + " KB";
+        plHandle->Caption = FormatFloat("##,##0", HandleCount);// + " EA";
+        plThread->Caption = FormatFloat("##,##0", ThreadCount);// + " EA";
+        plGdi->Caption    = FormatFloat("##,##0", GdiCount)   ;// + " EA";
+    } catch (Exception &e) {}
+
+    return result;
+}
+//---------------------------------------------------------------------------
+
+int TFrmMain::LogWrite(int ALogKind, char *AFmt, ...)
+{
+    va_list     ap;
+    int         cnt = 0;
+    char        szFmtData[MAX_LOG_BUFFER];
+    AnsiString  sLogKind;
+
+    bool bLog = false;
+    switch(ALogKind)
+    {
+    case eLOG_INFO   : bLog = g_LogCfg.Info;    sLogKind = " [INF] "; break;
+    case eLOG_DATA   : bLog = g_LogCfg.Data;    sLogKind = " [DAT] "; break;
+    case eLOG_ERROR  : bLog = g_LogCfg.Error;   sLogKind = " [ERR] "; break;
+    case eLOG_WARNING: bLog = g_LogCfg.Warning; sLogKind = " [WAN] "; break;
+    case eLOG_DEBUG  : bLog = g_LogCfg.Debug;   sLogKind = " [DBG] "; break;
+    case eLOG_DETAIL : bLog = g_LogCfg.Detail;  sLogKind = " [DET] "; break;
+    }
+    if (!bLog) return -1;
+
+    try
+    {
+        va_start(ap, AFmt);
+        cnt = vsprintf(szFmtData, AFmt, ap);
+        va_end(ap);
+
+        ITSLog->LogWrite(NULL, ALogKind, szFmtData);
+
+        IPC_LOG_MESSAGE *pLog = &FLogMsg;//new IPC_LOG_MESSAGE;
+        if (pLog)
+        {
+            pLog->Kind = ALogKind;
+            pLog->Flag = 0;
+            pLog->Len  = strlen(szFmtData);
+            pLog->Tm   = Now();
+            memset(pLog->Msg, 0x00, sizeof(pLog->Msg));
+            sprintf(pLog->Msg, "%sMAIN %s", sLogKind.c_str(), szFmtData);
+
+            DWORD   dwResult = 0;
+            LRESULT lResult = SEND_LOGMSG(FrmSysLog->Handle, WM_LOG_DISPLAY, pLog, NULL, SMTO_NORMAL, 2000, dwResult);
+            if (lResult == 0)
+            {
+                dwResult = GetLastError();
+                if (dwResult == ERROR_TIMEOUT)
+                {
+                }
+                //SAFE_DELETE(pLog);
+            }
+        }
+    }
+    catch(Exception &e)
+    {
+    }
+
+    return cnt;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmMain::Panel16DblClick(TObject *Sender)
+{
+    CheckResource((g_AppCfg.MaxMemory * 1024), g_AppCfg.MaxHandle, g_AppCfg.MaxThread, g_AppCfg.MaxGdi);
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmMain::plStateDbDblClick(TObject *Sender)
+{
+SendDbThreadMessage(WM_MASTER_IMAGE_SYMBOL, NULL, NULL);
+Sleep(500);
+SendDbThreadMessage(WM_MASTER_FORM, NULL, NULL);
+Sleep(500);
+SendDbThreadMessage(WM_MASTER_VMS_IFSC, NULL, NULL);
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmMain::plStateActionDblClick(TObject *Sender)
+{
+ProvideEvent(provide_event, NULL, NULL);
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmMain::LoadOldVmsInfo()
+{
+//LINFO("Old Protocol Version VMS Information Loading...");
+
+    TStringList *slFile = NULL;
+
+    String sCfgFile = g_sCfgDir + "OldVMS.inf";
+    try
+    {
+        slFile = new TStringList;
+
+        slFile->Clear();
+        slFile->LoadFromFile(sCfgFile);
+
+        int      ii;
+        unsigned int hn, ln;
+        BYTE     chn, cln, val;
+        char     szData[2048];
+        BYTE     RxBuff[VMS_MAX_PACKET_SIZE];
+        int      RxLen;
+
+        RxLen = 0;
+        memset(RxBuff, 0x00, sizeof(RxBuff));
+
+        for (ii = 0; ii < slFile->Count; ii++)
+        {
+            AnsiString sVmsId = slFile->Strings[ii].Trim();
+            if (sVmsId == "") continue;
+            if (sVmsId == "\r\n") continue;
+
+            TVmsCtlr *pObj = FindVms(sVmsId);
+            if (pObj)
+            {
+                pObj->FIsOldProtocol = true;
+                //LINFO("%s : 이전 버전 프로토콜 사용", sVmsId.c_str());
+            }
+            else
+            {
+                //LINFO("%s : 이전 버전 프로토콜 사용(찾을수 없음)", sVmsId.c_str());
+            }
+        }
+    }
+    catch(Exception &e)
+    {
+        LERROR("LoadOldVmsInfo Exception: %s", AnsiString(e.Message).c_str());
+    }
+    delete slFile;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmMain::LoadFtpVmsInfo()
+{
+//LINFO("FTP Download VMS Information Loading...");
+
+    TStringList *slFile = NULL;
+
+    String sCfgFile = g_sCfgDir + "FtpVMS.inf";
+    try
+    {
+        slFile = new TStringList;
+
+        slFile->Clear();
+        slFile->LoadFromFile(sCfgFile);
+
+        int      ii;
+        unsigned int hn, ln;
+        BYTE     chn, cln, val;
+        char     szData[2048];
+        BYTE     RxBuff[VMS_MAX_PACKET_SIZE];
+        int      RxLen;
+
+        RxLen = 0;
+        memset(RxBuff, 0x00, sizeof(RxBuff));
+
+        for (ii = 0; ii < slFile->Count; ii++)
+        {
+            AnsiString sVmsId = slFile->Strings[ii].Trim();
+            if (sVmsId == "") continue;
+            if (sVmsId == "\r\n") continue;
+
+            TVmsCtlr *pObj = FindVms(sVmsId);
+            if (pObj)
+            {
+                pObj->FIsFtpDownload = true;
+                pObj->FBmpDownload   = true;    //FTP로 다운로드 하는 경우 이미지로 전송되어야함
+                //LINFO("%s : FTP Downloaod 사용", sVmsId.c_str());
+            }
+            else
+            {
+                //LINFO("%s : FTP Downloaod 사용(찾을수 없음)", sVmsId.c_str());
+            }
+        }
+    }
+    catch(Exception &e)
+    {
+        LERROR("LoadFtpVmsInfo Exception: %s", AnsiString(e.Message).c_str());
+    }
+    delete slFile;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmMain::LoadFontVmsInfo()
+{
+//LINFO("Protocol Font Name VMS Information Loading...");
+
+    TStringList *slFile = NULL;
+
+    String sCfgFile = g_sCfgDir + "FontNameVMS.inf";
+    try
+    {
+        slFile = new TStringList;
+
+        slFile->Clear();
+        slFile->LoadFromFile(sCfgFile);
+
+        int      ii;
+        unsigned int hn, ln;
+        BYTE     chn, cln, val;
+        char     szData[2048];
+        BYTE     RxBuff[VMS_MAX_PACKET_SIZE];
+        int      RxLen;
+
+        RxLen = 0;
+        memset(RxBuff, 0x00, sizeof(RxBuff));
+
+        for (ii = 0; ii < slFile->Count; ii++)
+        {
+            AnsiString sVmsId = slFile->Strings[ii].Trim();
+            if (sVmsId == "") continue;
+            if (sVmsId == "\r\n") continue;
+
+            TVmsCtlr *pObj = FindVms(sVmsId);
+            if (pObj)
+            {
+                pObj->FIsProtolFontName = true;
+                //LINFO("%s : Font Name Protocol 사용", sVmsId.c_str());
+            }
+            else
+            {
+                //LINFO("%s : Font Name Protocol 사용(찾을수 없음)", sVmsId.c_str());
+            }
+        }
+    }
+    catch(Exception &e)
+    {
+        LERROR("LoadFontVmsInfo Exception: %s", AnsiString(e.Message).c_str());
+    }
+    delete slFile;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmMain::LoadBitmapVmsInfo()
+{
+//LINFO("Bitmap Form VMS Information Loading...");
+
+    TStringList *slFile = NULL;
+
+    String sCfgFile = g_sCfgDir + "BitmapVMS.inf";
+    try
+    {
+        slFile = new TStringList;
+
+        slFile->Clear();
+        slFile->LoadFromFile(sCfgFile);
+
+        int      ii;
+        unsigned int hn, ln;
+        BYTE     chn, cln, val;
+        char     szData[2048];
+        BYTE     RxBuff[VMS_MAX_PACKET_SIZE];
+        int      RxLen;
+
+        RxLen = 0;
+        memset(RxBuff, 0x00, sizeof(RxBuff));
+
+        for (ii = 0; ii < slFile->Count; ii++)
+        {
+            AnsiString sVmsId = slFile->Strings[ii].Trim();
+            if (sVmsId == "") continue;
+            if (sVmsId == "\r\n") continue;
+
+            TVmsCtlr *pObj = FindVms(sVmsId);
+            if (pObj)
+            {
+                pObj->FBmpDownload = true;
+                //LINFO("%s : Bitmap Form 사용", sVmsId.c_str());
+            }
+            else
+            {
+                //LINFO("%s : Bitmap Form 사용(찾을수 없음)", sVmsId.c_str());
+            }
+        }
+    }
+    catch(Exception &e)
+    {
+        LERROR("LoadBitmapVmsInfo Exception: %s", AnsiString(e.Message).c_str());
+    }
+    delete slFile;
+}
+//---------------------------------------------------------------------------
+
+TVmsCtlr* __fastcall TFrmMain::FindVms(AnsiString AVmsId)
+{
+    VmsIterator it;
+    for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
+    {
+        TVmsCtlr *pObj = (TVmsCtlr*)it->second;
+        if (pObj->VmsId.AnsiCompare(AVmsId) == 0)
+        {
+            return pObj;
+        }
+    }
+
+    return NULL;
+}
+//---------------------------------------------------------------------------
+

+ 2460 - 0
SRC/FrmMainF.dfm

@@ -0,0 +1,2460 @@
+object FrmMain: TFrmMain
+  Left = 0
+  Top = 0
+  Caption = 'PASIG City - VMS Communication Server'
+  ClientHeight = 653
+  ClientWidth = 900
+  Color = clWhite
+  Constraints.MinHeight = 600
+  Constraints.MinWidth = 800
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -12
+  Font.Name = 'Tahoma'
+  Font.Style = []
+  Icon.Data = {
+    0000010001002020000001002000A81000001600000028000000200000004000
+    000001002000000000008010000000000000000000000000000000000000FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00EA8D5E01D17E532AD17E5369D27F54A1D48055CDD68156E9D78257FAD782
+    56FAD68155E9D47F54CDD27D52A1D17C516BD27D522DEA8D5E04EA8D5E02FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EA8D5E01EA8D5E01CF7C
+    5343D07D5498D38057E4D8855CFFDD895FFFE18C60FFE38D60FFE48C60FFE38D
+    60FFE38B5FFFE18A5EFFDD885CFFD88459FFD47F54E5D07C519BD17C5148EA8D
+    5E04EA8D5E01FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EA8D5E01D07E5425CF7E548BD382
+    59E9D9885FFFDF8D64FFE39067FFE59267FFE79166FFE79165FFE89065FFE890
+    63FFE89063FFE78F62FFE68E62FFE48C60FFE08A5EFFDB855BFFD58055ECD07C
+    518FD17D5228EA8D5E02FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00CF7E5546CF7F55B8D7885FFFDE8F
+    67FFE3936BFFE6966DFFE8966DFFE9966CFFE9956BFFE9956AFFEA9469FFEA93
+    68FFE99367FFE99265FFEA9164FFE89063FFE78E62FFE58D61FFE08A5EFFD884
+    59FFD27D52BDD07B514AEA8D5E02FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00CE7E554FD18159CDD88B64FFE0946DFFE499
+    72FFE79B74FFE99C75FFEB9B74FFEB9B73FFEC9B72FFEC9A70FFEC996FFFEC97
+    6DFFEB966BFFEB956AFFEB9469FFEA9367FFE99265FFE89064FFE78F62FFE28C
+    60FFDA865BFFD27D54D1CF7B5053EA8D5E01FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00CE815945D0825ACCD88F69FFE19B76FFE7A07CFFE9A3
+    7EFFEBA480FFEDA37FFFEEA37DFFEEA27BFFEFA179FFEEA077FFEE9E76FFEE9D
+    74FFEE9B72FFED9970FFEC986DFFEC966BFFEB956AFFEA9367FFE99265FFE790
+    63FFE38D61FFDA865CFFD17D53CFCD7A4F44FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00CD835C23CE815BB6D8916DFFE2A180FFE9AD8EFFEDB394FFF0B5
+    97FFF0B495FFF2B18FFFF0AE8BFFF1AA85FFF1A782FFF0A680FFF1A47DFFF0A2
+    7AFFEFA078FFEF9E75FFEE9D74FFED9B71FFED996EFFEB966BFFEB9569FFEA93
+    67FFE79165FFE28D62FFD8855BFFCE7B51B7CD7A4F23FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00CD815A87D6906BFFE0A383FFEAB598FFF0C3ACFFF3CAB4FFF5CC
+    B5FFF5C9B0FFF4C0A6FFF4BA9BFFF3B492FFF3AF8DFFF2AD88FFF2AA85FFF1A8
+    82FFF1A67FFFF0A37CFFF0A179FFEF9F76FFEE9E74FFED9B71FFEC996EFFEB97
+    6CFFEA9469FFE69166FFDF8C62FFD58259FFCD7B5188FFFFFF00FFFFFF00FFFF
+    FF00CD805840D28862E7DD9D7CFFE8B498FFD8B5A2FF8E7F76FF7D716BFF8377
+    70FFB39F93FFEECAB6FFF6C8B0FFF6C1A4FFF4BB9CFFF3B797FFF3B493FFF3B1
+    8FFFF2AE8AFFF1AA86FFF1A883FFF1A681FFF0A47EFFEFA37AFFEEA078FFED9D
+    75FFEB9A70FFE9976CFFE59268FFDC8A60FFD17F55E9CD7B5042FFFFFF00FFFF
+    FF00CE815A92D7926EFFE4A98BFFEDC3ACFF908178FF0C478EFF047EC3FF0684
+    BCFF1D3658FFCFBCB1FFF9D8C6FFF8D0BBFFF7CBB3FFF7C8AFFFF6C5ACFFF6C3
+    A7FFF4C0A3FFF4BDA0FFF4BA9BFFF3B798FFF2B494FFF2B290FFF1AF8DFFF1AC
+    88FFEEA783FFEBA17CFFE89A72FFE19169FFD8855CFFCE7B5196FFFFFF00CE81
+    5925D1865FE0DC9A79FFE7B598FFF1CFBBFF89807AFF075DBBFF00AAF6FF00B4
+    F6FF154475FFD4CBC6FFFBE8DEFFFBE1D4FFFADDCEFFF9DBCBFFF9D9C7FFF9D7
+    C5FFF8D5C2FFF7D3BFFFF7D0BDFFF7CEB9FFF6CDB5FFF6CBB3FFF6C7AFFFF4C3
+    A8FFF2BB9EFFEFB191FFEBA581FFE69972FFDC8D63FFD17F55E2CE7B5127CE82
+    5B60D48C68FFE0A282FFEBBCA4FFF4D5C6FF8E8783FF0A5AB3FF009EF6FF00AD
+    F6FF1B4A7BFF908B88FFABA5A1FFA8A09DFFA89F9AFFA99F9AFFA59C97FFA49B
+    96FFA39A94FFA49A94FFA49993FFA39791FFA79A93FFA3978FFFA3958DFFA191
+    88FF9E897DFFC29E8BFFEEB393FFE9A27FFFE0936BFFD5835BFFCE7B5163CE83
+    5C94D89370FFE3A98BFFEEC1ABFFF6DBCCFF8F8885FF0A59B3FF31C0F6FF00B0
+    F6FF0B6EB7FF575352FF5D5550FF5A5552FF5A5552FF494543FF464341FF4542
+    40FF43413FFF464341FF454240FF43413FFF494543FF464241FF454140FF4340
+    3FFF3A3636FF423A36FFF1C2A9FFEBAC8BFFE29974FFD8875FFFCE7B5297CF84
+    5EC0DA9976FFE6AE91FFEFC7B2FFF7DED0FF8F8A87FF0A58B4FFA7E1F6FF00B1
+    F6FF0081D6FF8A8B8FFFA19085FF958982FF857B74FF7D756FFF7B716DFF7870
+    6BFF756E69FF7B716DFF78706BFF756E69FF726A65FF6F6863FF6F6864FF746F
+    6AFF6D6865FF3C3837FFF4CEB9FFECB496FFE49E7AFFDA8A63FFCE7D53C1D088
+    63E1DC9D7BFFE7B397FFF2CBB7FFF7E2D5FF908B87FF0A58B4FF97DCF6FF00B1
+    F6FF007ED3FF858588FF98887CFFA49A96FFADA7A4FFA8A4A0FFA8A3A0FFA7A1
+    9EFFA59F9DFFA8A3A0FFA7A19EFFA59F9DFFA19E9AFFA09C99FF928D8BFF6F69
+    64FF6A6562FF3E3B3AFFF5D4C3FFEEB99DFFE4A17FFFDB8D65FFCF7E55E2D28A
+    66F8DDA080FFE9B79CFFF2CEBBFFF9E4D8FF908B88FF0A59B4FF97DCF6FF00B0
+    F6FF007FD5FF89898AFF99897DFFB1A7A3FFC5C1BEFFC4BFBBFFC1BEBAFFC0BC
+    BAFFC0BBB8FFC1BEBAFFC0BCBAFFC0BBB8FFBEBAB7FFBCB9B7FFA8A5A1FF726B
+    67FF706A65FF3F3D3BFFF6D8C8FFEEBCA1FFE5A381FFDA8F67FFD08057F8D28B
+    67F8DEA282FFE9B99FFFF3D0BFFFF9E6DBFF908C8AFF0A57B4FF97DCF6FF00B0
+    F6FF007FD6FF8C8A8DFFA18F84FF9C9088FF958B84FF8F8581FF8F857FFF8B83
+    7DFF89817BFF8F857FFF8B837DFF89817BFF857D78FF847C77FF817875FF7B74
+    70FF766E6AFF403E3CFFF6DACAFFEFBDA4FFE5A383FFDA8E68FFCF7F56F8D18A
+    66E1DDA182FFE9BAA1FFF3D1C1FFFAE8DEFF908C8AFF0A59B4FF97DCF6FF00B0
+    F6FF0081D7FF8F8C8FFF9F8C81FFBBB2ADFFD7D3D2FFD6D2D0FFD5D2CFFFD4D0
+    CFFFD4D0CEFFD5D2CFFFD4D0CFFFD4D0CEFFD3CFCEFFD2CFCDFFBBB8B4FF7D75
+    6FFF7B726FFF413E3EFFF6DACAFFEFBEA4FFE5A382FFDA8D67FFCF7E55E1D088
+    64C0DCA080FFE8B8A0FFF2D2C1FFF9E8DEFF908D8BFF0A57B4FF97DCF6FF00B0
+    F6FF0083D9FF8F8D90FFA49286FF9C8F85FF93857DFF8F837BFF8C8279FF8B7E
+    77FF887E76FF8C8279FF8B7E77FF887E76FF857B75FF827871FF827872FF887D
+    77FF7F7772FF413F3EFFF6DACAFFEDBDA4FFE4A281FFD88C66FFCD7D54C0CF87
+    6394DA9C7CFFE6B69DFFF1D1BFFFF9E7DEFF908D8BFF0A59B4FF97DCF6FF00B0
+    F6FF0083D9FF8F8D90FF9F8C81FFBCB4AEFFD9D5D3FFD9D5D3FFD7D4D2FFD7D4
+    D2FFD6D3D0FFD7D4D2FFD7D4D2FFD6D3D0FFD6D3D0FFD5D2CFFFC0BBB8FF887D
+    77FF847B75FF443F3EFFF5D8C9FFECBCA2FFE2A07FFFD68A64FFCD7D5494CF88
+    6360D69675FFE3B197FFEFCDBCFFF8E6DDFF908C8BFF0A57B4FF97DCF6FF00B0
+    F6FF0083D9FF919092FFA69589FFA69992FFAA9E97FFAA9D96FFA69C96FFA59C
+    95FFA59993FFA69C96FFA59C95FFA59993FFA19791FFA09690FF9C928AFF9389
+    81FF8B827CFF43403DFFF3D4C3FFEAB79CFFDF9B79FFD3865FFFCD7D5460CF88
+    6425D38F6DE0DFA98EFFECC8B5FFF6E3D9FF8E8B89FF0A59B5FF9CDDF6FF00B0
+    F6FF0088DFFF848488FF928276FF8C8179FF8C8178FF8C7F77FF8B7F77FF897E
+    76FF887D76FF8B7F77FF897E76FF887D76FF857B74FF857972FF847972FF857C
+    74FF7E756FFF413D3BFFF1CCB9FFE6B094FFDA9673FFCF8159E0CD7D5425FFFF
+    FF00D0896692DAA082FFE8C0ABFFF3DDD1FF8E8986FF0B59B5FF8AD9F6FF00B9
+    F6FF115694FF554D4AFF605E5BFF5F5E5CFF5C5B5AFF5A5957FF5C5B59FF5A58
+    56FF595755FF5C5A58FF5A5855FF595753FF5C5956FF595654FF595552FF5753
+    50FF4F4845FF82736BFFECC0A8FFE2A688FFD68F6AFFCD7E5592FFFFFF00FFFF
+    FF00D0896640D59576E8E2B49CFFEED3C4FF9B938FFF0B55AAFF00B3F6FF00B0
+    F6FF213F67FFD4D4D4FFFBFBFBFFFCFCFCFFFCFBFAFFFBF9F6FFFFFBF9FFFFF9
+    F6FFFFF8F3FFFCF2EDFFFBEFE8FFFBEDE5FFFBEBE2FFF8E7DDFFF7E2D8FFF4DC
+    CFFFF1D1C1FFEFC5AFFFE6B194FFDC9A79FFD1855FE7CD7E5640FFFFFF00FFFF
+    FF00FFFFFF00D18F6B88DCA589FFE8C4B1FFC5B7ADFF2A3857FF0D6EA1FF105B
+    86FF727273FFF2F2F2FFFFFFFFFFFFFFFEFFFFFEFCFFFFFCF9FFFFFAF6FFFFF6
+    F2FFFFF4EDFFFFF0E8FFFFECE3FFFDE8DDFFFCE3D7FFFBDED0FFF8D7C6FFF4CE
+    BBFFEFC2AAFFE8B296FFDFA080FFD58E69FFCD815987FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00CF927024D39574B8DFAF96FFE5C7B6FFC4B5ADFF98928DFFAAA4
+    A1FFEEE9E6FFFFFBF8FFFFFCFAFFFFFCFAFFFFFBF8FFFFF9F5FFFFF7F3FFFFF4
+    EDFFFFF0E8FFFFEBE2FFFDE8DAFFFBDFD2FFF9DACAFFF6D2BEFFF3C9B2FFEEBD
+    A5FFE8B093FFE0A081FFD8916DFFCE815BB5CD7F5722FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00BEFFFF01D0967648D59A7DCFE0B299FFE9C8B6FFF0D7CBFFF5E2
+    D8FFF9EAE2FFFBEFE8FFFEF2ECFFFFF3EEFFFFF3EEFFFFF3EBFFFFF1E9FFFFEE
+    E4FFFEE8DEFFFDE4D7FFFADDCEFFF8D7C5FFF4CFBAFFF1C5AEFFECBA9FFFE7AD
+    90FFE0A07FFFD8916EFFD0835DCBCD805843FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00BEFFFF02D0967653D5997ACEDDAB91FFE5BCA8FFECCB
+    B9FFF1D5C7FFF3DDD1FFF7E3D8FFF9E6DCFFFAE7DDFFFBE7DDFFFBE5DAFFFAE3
+    D5FFF9DED0FFF7D8C9FFF5D2C0FFF3CBB6FFEFC3ABFFEBB89DFFE5AD8FFFDF9F
+    7EFFD7926FFFD0845ECBCE815A4EFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00BEFFFF01D08F6C44D28F6EB5D9A183FFE0AF
+    96FFE6BDA6FFEBC6B2FFEFCEBDFFF1D3C4FFF3D6C6FFF3D6C7FFF3D5C6FFF3D3
+    C2FFF2CFBDFFF0CAB5FFEEC4ADFFEABCA3FFE7B297FFE1A889FFDC9C7AFFD690
+    6CFFCE835CB4CE825B43FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D08C6A22D08C6A86D495
+    75E7DAA285FFE0AD93FFE4B69FFFE8BDA6FFEAC0AAFFEBC2ADFFEBC2ACFFEBBF
+    A9FFE9BCA5FFE7B79DFFE5B196FFE2A98BFFDD9F7FFFD79573FFD28A66E7CE83
+    5D86CE825C22FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D08C
+    6A40D08C6A92D39372E0D89C7DFFDBA385FFDEA78BFFDFAA8EFFE0AB8FFFDFA9
+    8DFFDFA688FFDCA182FFD99B7BFFD69472FFD28B67E0CF855F92CE845E40FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00D08C6925D08C6960D08B6894D18C6AC0D28F6DE1D3906FF8D390
+    6DF8D28D6AE1D08965C0CF876294CF866160CF856025FFFFFF00FFFFFF00FFFF
+    FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF80
+    00FFFC00003FF800001FF800000FF0000007E0000007C0000003C00000038000
+    0001800000010000000000000000000000000000000000000000000000000000
+    000000000000000000000000000000000000000000008000000180000001C000
+    0003C0000003C0000007E000000FF000001FFC00003FFF0000FFFFC003FF}
+  OldCreateOrder = False
+  ShowHint = True
+  OnClose = FormClose
+  OnCloseQuery = FormCloseQuery
+  OnCreate = FormCreate
+  OnShow = FormShow
+  PixelsPerInch = 96
+  TextHeight = 14
+  object Splitter1: TSplitter
+    Left = 0
+    Top = 287
+    Width = 900
+    Height = 5
+    Cursor = crVSplit
+    Align = alTop
+    Beveled = True
+    Color = clBackground
+    MinSize = 60
+    ParentColor = False
+    ResizeStyle = rsLine
+    ExplicitTop = 271
+    ExplicitWidth = 726
+  end
+  object tobMenu: TToolBar
+    Left = 0
+    Top = 0
+    Width = 900
+    Height = 48
+    AutoSize = True
+    ButtonHeight = 44
+    ButtonWidth = 66
+    EdgeBorders = [ebLeft, ebTop, ebRight, ebBottom]
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clWindowText
+    Font.Height = -11
+    Font.Name = 'Tahoma'
+    Font.Style = []
+    Images = ilMenu
+    ParentFont = False
+    ShowCaptions = True
+    TabOrder = 0
+    object tbConnect: TToolButton
+      Left = 0
+      Top = 0
+      Cursor = crHandPoint
+      Caption = 'Server Start'
+      Enabled = False
+      ImageIndex = 0
+      OnClick = tbConnectClick
+    end
+    object tbSeparator1: TToolButton
+      Left = 66
+      Top = 0
+      Width = 8
+      Caption = 'tbSeparator1'
+      ImageIndex = 7
+      Style = tbsSeparator
+    end
+    object tbDisconnect: TToolButton
+      Left = 74
+      Top = 0
+      Cursor = crHandPoint
+      Caption = 'Server Stop'
+      Enabled = False
+      ImageIndex = 1
+      OnClick = tbDisconnectClick
+    end
+    object tbSeparator2: TToolButton
+      Left = 140
+      Top = 0
+      Width = 8
+      Caption = 'tbSeparator2'
+      ImageIndex = 3
+      Style = tbsSeparator
+    end
+    object tbOptions: TToolButton
+      Left = 148
+      Top = 0
+      Cursor = crHandPoint
+      Caption = 'Options...'
+      ImageIndex = 2
+      OnClick = tbOptionsClick
+    end
+    object tbSeparator3: TToolButton
+      Left = 214
+      Top = 0
+      Width = 8
+      Caption = 'tbSeparator3'
+      ImageIndex = 6
+      Style = tbsSeparator
+      Visible = False
+    end
+  end
+  object plBottom: TPanel
+    Left = 0
+    Top = 623
+    Width = 900
+    Height = 30
+    Align = alBottom
+    BevelKind = bkSoft
+    BevelOuter = bvNone
+    TabOrder = 1
+    object plStateAction: TPanel
+      AlignWithMargins = True
+      Left = 3
+      Top = 2
+      Width = 64
+      Height = 22
+      Margins.Top = 2
+      Margins.Right = 0
+      Margins.Bottom = 2
+      Align = alLeft
+      BevelKind = bkSoft
+      BevelOuter = bvNone
+      Caption = 'RUN'
+      Color = clGreen
+      Font.Charset = DEFAULT_CHARSET
+      Font.Color = clWhite
+      Font.Height = -13
+      Font.Name = 'Tahoma'
+      Font.Style = []
+      ParentBackground = False
+      ParentFont = False
+      TabOrder = 0
+      OnDblClick = plStateActionDblClick
+    end
+    object plStateComm: TPanel
+      AlignWithMargins = True
+      Left = 67
+      Top = 2
+      Width = 64
+      Height = 22
+      Margins.Left = 0
+      Margins.Top = 2
+      Margins.Right = 0
+      Margins.Bottom = 2
+      Align = alLeft
+      BevelKind = bkSoft
+      BevelOuter = bvNone
+      Caption = 'COM'
+      Color = clRed
+      Font.Charset = DEFAULT_CHARSET
+      Font.Color = clWhite
+      Font.Height = -13
+      Font.Name = 'Tahoma'
+      Font.Style = []
+      ParentBackground = False
+      ParentFont = False
+      TabOrder = 1
+    end
+    object plStateDb: TPanel
+      AlignWithMargins = True
+      Left = 131
+      Top = 2
+      Width = 64
+      Height = 22
+      Margins.Left = 0
+      Margins.Top = 2
+      Margins.Right = 0
+      Margins.Bottom = 2
+      Align = alLeft
+      BevelKind = bkSoft
+      BevelOuter = bvNone
+      Caption = 'DB'
+      Color = clRed
+      Font.Charset = DEFAULT_CHARSET
+      Font.Color = clWhite
+      Font.Height = -13
+      Font.Name = 'Tahoma'
+      Font.Style = []
+      ParentBackground = False
+      ParentFont = False
+      TabOrder = 2
+      OnDblClick = plStateDbDblClick
+    end
+    object plTime: TPanel
+      AlignWithMargins = True
+      Left = 732
+      Top = 2
+      Width = 161
+      Height = 22
+      Margins.Top = 2
+      Margins.Bottom = 2
+      Align = alRight
+      BevelKind = bkSoft
+      BevelOuter = bvNone
+      Caption = '2015-07-01 14:24:38'
+      Color = clBlack
+      Ctl3D = True
+      DoubleBuffered = True
+      Font.Charset = DEFAULT_CHARSET
+      Font.Color = clLime
+      Font.Height = -13
+      Font.Name = 'Tahoma'
+      Font.Style = []
+      ParentBackground = False
+      ParentCtl3D = False
+      ParentDoubleBuffered = False
+      ParentFont = False
+      TabOrder = 3
+    end
+    object Panel1: TPanel
+      AlignWithMargins = True
+      Left = 307
+      Top = 2
+      Width = 419
+      Height = 22
+      Margins.Top = 2
+      Margins.Bottom = 2
+      Align = alRight
+      BevelKind = bkSoft
+      BevelOuter = bvNone
+      ParentBackground = False
+      ParentColor = True
+      TabOrder = 4
+      object Panel16: TPanel
+        AlignWithMargins = True
+        Left = 3
+        Top = 1
+        Width = 149
+        Height = 16
+        Cursor = crHandPoint
+        Hint = 'Resource (Thread/Memory/GDI/Handle)'
+        Margins.Top = 1
+        Margins.Bottom = 1
+        Align = alClient
+        BevelOuter = bvNone
+        Caption = 'Resource(T/M/G/H)'
+        ParentBackground = False
+        TabOrder = 0
+        OnDblClick = Panel16DblClick
+      end
+      object plThread: TPanel
+        AlignWithMargins = True
+        Left = 155
+        Top = 0
+        Width = 65
+        Height = 18
+        Hint = 'Thread(EA)'
+        Margins.Left = 0
+        Margins.Top = 0
+        Margins.Right = 0
+        Margins.Bottom = 0
+        Align = alRight
+        BevelInner = bvLowered
+        BevelOuter = bvNone
+        Caption = 'Thread'
+        Color = clTeal
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindow
+        Font.Height = -12
+        Font.Name = 'Tahoma'
+        Font.Style = []
+        ParentBackground = False
+        ParentFont = False
+        TabOrder = 1
+      end
+      object plMemory: TPanel
+        AlignWithMargins = True
+        Left = 220
+        Top = 0
+        Width = 65
+        Height = 18
+        Hint = 'Memory(KB)'
+        Margins.Left = 0
+        Margins.Top = 0
+        Margins.Right = 0
+        Margins.Bottom = 0
+        Align = alRight
+        BevelInner = bvLowered
+        BevelOuter = bvNone
+        Caption = 'Memory'
+        Color = clTeal
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindow
+        Font.Height = -12
+        Font.Name = 'Tahoma'
+        Font.Style = []
+        ParentBackground = False
+        ParentFont = False
+        TabOrder = 2
+      end
+      object plGdi: TPanel
+        AlignWithMargins = True
+        Left = 285
+        Top = 0
+        Width = 65
+        Height = 18
+        Hint = 'GDI Object(EA)'
+        Margins.Left = 0
+        Margins.Top = 0
+        Margins.Right = 0
+        Margins.Bottom = 0
+        Align = alRight
+        BevelInner = bvLowered
+        BevelOuter = bvNone
+        Caption = 'GDI'
+        Color = clTeal
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindow
+        Font.Height = -12
+        Font.Name = 'Tahoma'
+        Font.Style = []
+        ParentBackground = False
+        ParentFont = False
+        TabOrder = 3
+      end
+      object plHandle: TPanel
+        AlignWithMargins = True
+        Left = 350
+        Top = 0
+        Width = 65
+        Height = 18
+        Hint = 'Handle(EA)'
+        Margins.Left = 0
+        Margins.Top = 0
+        Margins.Right = 0
+        Margins.Bottom = 0
+        Align = alRight
+        BevelInner = bvLowered
+        BevelOuter = bvNone
+        Caption = 'Handle'
+        Color = clTeal
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindow
+        Font.Height = -12
+        Font.Name = 'Tahoma'
+        Font.Style = []
+        ParentBackground = False
+        ParentFont = False
+        TabOrder = 4
+      end
+    end
+    object Panel2: TPanel
+      AlignWithMargins = True
+      Left = 198
+      Top = 1
+      Width = 103
+      Height = 24
+      Hint = #51088#50896#49324#50857#54788#54889'(Thread/Memory/GDI/Handle)'
+      Margins.Top = 1
+      Margins.Bottom = 1
+      Align = alClient
+      BevelOuter = bvNone
+      ParentBackground = False
+      TabOrder = 5
+    end
+  end
+  object pnlLog: TPanel
+    AlignWithMargins = True
+    Left = 1
+    Top = 293
+    Width = 898
+    Height = 329
+    Margins.Left = 1
+    Margins.Top = 1
+    Margins.Right = 1
+    Margins.Bottom = 1
+    Align = alClient
+    BevelOuter = bvNone
+    TabOrder = 2
+  end
+  object pnlVms: TPanel
+    AlignWithMargins = True
+    Left = 1
+    Top = 49
+    Width = 898
+    Height = 236
+    Margins.Left = 1
+    Margins.Top = 1
+    Margins.Right = 1
+    Margins.Bottom = 2
+    Align = alTop
+    BevelOuter = bvNone
+    TabOrder = 3
+  end
+  object ilMenu: TImageList
+    Height = 24
+    Width = 24
+    Left = 320
+    Top = 9
+    Bitmap = {
+      494C010103000500040018001800FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
+      0000000000003600000028000000600000001800000001002000000000000024
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000068353100753A29007F3F
+      23007F3F2300773B28006A353100000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000007F3F23007F3F23007F3F
+      23007F3F23007F3F23007F3F2300000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000056695000D77
+      A700148ABA000566950000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000008140230081402300BC580000C9630000D06A
+      0200D06A0200CB650000BE590000874320008743200000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000008140240081402400BC580000C9630000D06A
+      0200D06A0200C9630000BE590000874320008743200000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000148ABA0026CB
+      FA002DAADA00199FD60005669500000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000793D2900793D2900CF660000DE904100EBBB8900F5DEC700F7E7
+      D700F7E8D800F5DFC900EBBF9200DF954B00D16902007E3F26007E3F26000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000793D2900793D2900CF660000DE914200EBBB8900F5DEC700F7E7
+      D700F7E8D800F5DFC900ECC09400DF954B00D16902007E3F26007E3F26000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000566950023A4D800148ABA000A72A100056695000D77A700199FD6000D77
+      A700148ABA00117AA800086D9D00056695000C75A50040A3C7003EA7CC000566
+      9500000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00008F471D00C45C0000DC8A3800F3D9C000FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00F5E1CC00DF954B00CA5F00009148
+      1B00000000000000000000000000000000000000000000000000000000000000
+      00008F471D00C45C0000DC8A3800F3D9C000FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00F5E1CC00DF954B00CA5F00009148
+      1B00000000000000000000000000000000000000000000000000000000000000
+      0000117AA80023A4D8001EA2D80011BDF10018AEE300199FD6001582B00014C7
+      FB002DCCFA002DAADA001588B80058D4F60085E3FA003AAED70040A3C7000566
+      9500000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000000000000000000000954A
+      1A00C95F0000E3A66A00FEFCF900FFFFFF00F9EFE300E7B98D00D88D4300D47F
+      2B00D47F2B00D78A3D00E6B38200F7E8D800FFFFFF00FFFFFF00E6B38200CF63
+      000091481B00000000000000000000000000000000000000000000000000954A
+      1A00CA5F0000E3A66A00FEFCF900FFFFFF00F9EEE300E8B98E00D88D4400D37F
+      2B00D37F2B00D78A3D00E6B38200F7E8D800FFFFFF00FFFFFE00E6B38200CF63
+      000091481B000000000000000000000000000000000000000000000000000000
+      00000566950040A3C7003CABD200137CA9001582B0000D77A70014C7FB000CC6
+      FD0026CBFA0041D0F9001381AE001588B800147EAB0046A2C40075DFF9000566
+      9500000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000000000000091491D00C45B
+      0000E3A46500FFFFFF00FFFFFF00E9BE9300CE6E1400C85C0000C75B0000C960
+      0000C9600000C95F0000C85C0000CC6A0D00E5B37F00FFFFFF00FFFFFF00E7B4
+      7E00CA5F00007E3F26000000000000000000000000000000000091491D00C45B
+      0000E3A36300FFFFFF00FFFFFF00E9BD9200CC6A0D00C6570000C75B0000C961
+      0000C9610000C75B0000C6570000CB650500E5B27F00FFFFFF00FFFFFF00E7B4
+      7E00CA5F00007E3F260000000000000000000000000005669500086D9D001588
+      B8000B74A4005CD5F6007DE2FA0077E1FA0046CFF70035CEF9001DC9FB000CC6
+      FD001DC9FB0035CEF9005CD5F60064D8F700B2E6F300BAE7F200BAE7F200147E
+      AB00117AA8000566950000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000000000000091491D00D983
+      2C00FDFAF700FFFFFF00E4AF7900C85C0000C85C0000D9904500E4AF7900C95F
+      0000CA620000CB660000CB660000CA620000C75B0000DE9E5E00FFFEFD00FFFF
+      FF00DE9345007E3F26000000000000000000000000000000000091491D00D983
+      2C00FDFAF700FFFFFF00E7AE7500C95E0000D2792100D4802B00D47F2800CC69
+      0400CB650100D37C2500D4802B00D37C2300C95E0000DE9E5D00FFFEFD00FFFF
+      FF00DE9345007E3F2600000000000000000000000000137CA9008FE4F9005CD5
+      F600117AA80054D3F6006DDEFA007DE2FA0069DCF90041D0F9002DCCFA0014C7
+      FB0010C6FC002DCCFA004FD3F80077E1FA008FE4F90085E3FA0051D4F800147F
+      AD003AAED7002DAADA000A72A100000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000A2511300CA620000F2D4
+      B600FFFFFF00EECAA500CD660100CF6D0900CD660100DD985300FFFFFF00EBC5
+      9E00CD6B1000C95F0000CB660000CB660000CB650000C75B0000E6B58300FFFF
+      FF00F6E3D000D169020087431F000000000000000000A2511300CA620000F2D4
+      B600FFFFFF00EECAA500CC640000D1731400F9ECDF00FEFDFB00FCF6F000D076
+      1A00CC690400F8EBDD00FEFDFB00FCF6F000D1771C00C6570000E6B58300FFFF
+      FF00F6E3D000D169020087431F000000000000000000086D9D000B74A4000F78
+      A800148ABA0046CFF70064D8F7007DE2FA006DDEFA004FD3F80035CEF9001DC9
+      FB000CC6FD0014C7FB001DC9FB0014C7FB000AC4FC000AC4FC000AC4FC0014B7
+      EA00148ABA00148ABA000970A000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000A2511300DD8D3900FFFE
+      FD00FDF7F200D8863200D3751400D5791B00D2710D00DF9D5900FFFFFF00FFFF
+      FF00F5E1CC00D27C2800C85C0000CB660000CB660000CA620000CD6B0B00F8EB
+      DE00FFFFFF00DF94460087431F000000000000000000A2511300DB8B3900FFFE
+      FD00FCF7F200D9873300D2731100D77E2500FCF1E700FFFFFF00FEFAF700D37C
+      2300CD6B0A00F9EEE300FFFFFF00FEFAF700D1781E00CA5F0000CD6B0A00F8EB
+      DE00FFFFFF00DF94460087431F00000000000000000005669500199FD600199F
+      D60023A4D8003AAED70058D4F60077E1FA0077E1FA005CD5F60061A4BD0046A2
+      C4008C8A8B0040A3C70013BAEE000AC4FC000AC4FC000AC4FC000AC4FC000AC4
+      FC000AC4FC000AC4FC001489BA00000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000A5531300C6640600EAB68200FFFF
+      FF00F1D1B100D77A1D00DA822A00DA822A00D77A1D00E3A46300FFFFFF00FFFF
+      FF00FFFFFF00FBF2E900DA924900C85C0000CB650000CB660000C85C0000E6B5
+      8400FFFFFF00EBBF9200BE5900006A353100B55C0E00C6640600EAB68200FFFF
+      FF00F1D1B100D77A1C00D9812700DB883300FBF0E500FFFFFF00FDF8F400D883
+      2E00D1731300F9EDE200FFFFFF00FDF8F400D1781E00CA620000C85C0000E6B5
+      8400FFFFFF00EBBF9200BE5900007F3F230000000000056695000C75A500199F
+      D6001BA3D90031ACDB0046CFF70064D8F7007AA6B8008C8A8B00B6A5A5009896
+      96008F888900A39797008C8A8B0029A7D8000AC4FC000AC4FC000AC4FC000AC4
+      FC000AC4FC0018AEE30005669500000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000AC571100CF711500F2D4B600FFFF
+      FF00EAB68200DC842B00DF8C3900DF8C3900DC842B00E6AA6D00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FEFDFB00E2AA7200C9600000CB650000C95F0000D88C
+      3F00FFFFFF00F5DFC900CA620000773C2900B55C0E00CF711500F2D4B600FFFF
+      FF00EAB68200DC842B00DE8B3600E0914100FCF1E700FFFFFF00FDFAF700DB8B
+      3900D57B1F00FAEFE300FFFFFF00FDF8F400D1781E00CA620000CA5F0000D88C
+      3F00FFFFFF00F5DFC900CA6200007F3F230000000000056695001582B000148A
+      BA00199FD60029A7D80046CFF70060D6F60087838300E2DDE200BBB1B1009896
+      96008F888900AD989800BEAAAA00958E8E000FBFF4000AC4FC001DC9FB003BCF
+      F9003AAED700086D9D0005669500000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000B15A0F00D67D2400F8E5D100FFFF
+      FF00E8AC6F00E1903D00E3964700E3954600E08D3A00E9B07600FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EBC19600CA630200C9600000D47F
+      2B00FFFFFF00F7E8D800D06A02007F3F2300B55C0E00D77E2500F8E5D100FFFF
+      FF00E8AC6F00E1903D00E3944400E49A4E00FCF3E900FFFFFF00FEFAF700DE91
+      4200D8812900FAEFE400FFFFFF00FDF8F400D1781E00CA620000C9610000D480
+      2B00FFFFFF00F7E8D800D06A02007F3F23000000000005669500147FAD00199F
+      D600199FD6001EA2D8003AAED70054D3F60098969600E5E4E500BBB1B1009896
+      96008F888900AD989800BEAAAA00AB9696003CABD2007DE2FA00A8E6F500BAE7
+      F200BAE7F20051A3C10005669500000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000B55C0E00D9832C00F8E5D100FFFF
+      FF00ECB47A00E6994A00E89F5400E89F5400E5974700EDB67F00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FCF5EE00DD9C5C00CA630200C9600000D480
+      2C00FFFFFF00F8E7D600D06A02007F3F2300B55C0E00D9832C00F8E5D100FFFF
+      FF00ECB47A00E6994A00E89F5300E9A25B00FCF4EB00FFFFFF00FEFAF700E197
+      4C00DC883200FBF0E500FFFFFF00FDF8F400D1781E00CA620000C9610000D480
+      2B00FFFFFF00F7E7D700D06A02007F3F230000000000056695000F78A800148A
+      BA00199FD600199FD60031ACDB0046CFF70098969600E5E4E500BBB1B1009896
+      96008F888900AD989800BEAAAA00AB9696003AAED7006DDEFA008FE4F900BAE7
+      F2008FE4F90046A2C40005669500000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000B95E0C00DA852F00F6D8BA00FFFF
+      FF00F2CAA200EBA15600EDA96300EDA96300EBA15600EFBC8700FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00F8E7D600D8883600C95F0000CB660000C95F0000DA92
+      4900FFFFFF00F4DCC300C9630000753B2B00B55C0E00DA852F00F4D8BC00FFFF
+      FF00F4CCA400EBA15500EDA86100EEAD6900FDF4EC00FFFFFF00FEFAF700E49D
+      5400DE8D3A00FBF1E600FFFFFF00FDF8F400D2792100CA620000C95E0000DA92
+      4800FFFFFF00F4DCC300C96100007F3F23000000000000000000000000000566
+      95000C75A500199FD60023A4D8003AAED70098969600E5E4E500BBB1B1009896
+      96008F888900AD989800BEAAAA00AB9696003AAED7005CD5F60085E3FA00137C
+      A900056695000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000BA5D0700D8832E00F2C79A00FFFF
+      FF00FAE6D100F0AC6600F2B27100F2B27100EEA96200F2C18F00FFFFFF00FFFF
+      FF00FFFFFF00F3D8BB00D9842F00D06E0B00CE6B0700CB660000C75C0000E9BE
+      9300FFFFFF00E9B88500BC57000069353200B55C0E00D8832E00F2C79A00FFFF
+      FF00FAE6D100F0AC6600F2B16F00F2B57700FDF6EE00FFFFFF00FEFBF800E7A2
+      5C00E1924200FCF1E700FFFFFF00FDF8F400D37C2300CA620000C75C0000E9BE
+      9300FFFFFF00E9B88500BC5700007F3F23000000000000000000000000000000
+      00000B73A300199FD6001CA1D70034ACD90098969600E5E4E500BBB1B1009896
+      96008F888900AD989800BEAAAA00AB9696003AAED7004FD3F80077E1FA00086D
+      9D00000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000C5691100EFB27200FEFC
+      F900FFFDFC00F7C59200F6B97A00F6BB7E00F3B16D00F4C59600FFFFFF00FFFE
+      FD00F2CAA200DD873000D87D2100D4771A00CF6D0B00CA620000CF721600FBF2
+      E900FFFFFF00DD8D3900814024000000000000000000C5691100EFB27200FEFC
+      F900FFFDFC00F7C59100F6B87800F6BE8300FEF8F200FFFFFF00FFFDFC00EAA7
+      6200E3964700FDF4EC00FFFFFF00FEFDFB00D47F2800C95E0000CF721600FBF2
+      E900FFFFFF00DD8D390081402400000000000000000000000000000000000000
+      0000056695000B73A3000B73A3001381AE0098969600E5E4E500BBB1B1009896
+      96008F888900AD989800BEAAAA00AB9696001582B000147FAD001582B0000566
+      9500000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000C5691100E99F5300FAE1
+      C700FFFFFF00FEEEDF00FCC48B00FAC28700F6B77600F6CCA000FEF9F400EEBA
+      8500E28F3B00DE8B3600DA822A00D5791C00CF6D0900C95F0000EBC59E00FFFF
+      FF00F2D8BD00CE640000814024000000000000000000C5691100E89F5300FAE1
+      C700FFFFFF00FEEEDF00FCC38900FAC48C00FDF0E300FEF6EF00FCF1E700EAA7
+      6200E4984A00F8E6D400FBF1E600F8EBDD00D47B2200C85B0000EBC59E00FFFF
+      FF00F4D8BC00CE64000081402400000000000000000000000000000000000000
+      00000000000000000000000000000000000098969600E5E4E500BBB1B1009896
+      96008F888900AD989800BEAAAA00AB9696000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000C4660B00F5BC
+      8100FEF9F300FFFFFF00FFEAD500FCC48B00F6B77600F4BF8A00F0B87E00E79A
+      4B00E3964700DF8C3900DA822A00D3741300CD660100E5B37F00FFFFFF00FDFA
+      F700DB862F00753B2B0000000000000000000000000000000000C4660B00F5BC
+      8000FEF8F200FFFFFF00FFEAD500FBC48B00F5BC8000F2B57700EEAD6900E89F
+      5500E3964700E0914100DB883400D57A1D00CD680200E5B27F00FFFFFF00FDFA
+      F700DB862F00753B2B0000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000098969600E5E4E500BBB1B1009896
+      96008F888900AD989800BEAAAA00AB9696000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000C4660B00E89F
+      5400F9CD9F00FFFDFC00FFFFFF00FEEEDF00F7C59200EFAB6400EA9E5100E699
+      4A00E18F3C00DC842B00D77A1D00DA893700EFCDAA00FFFFFF00FFFFFF00E2A2
+      6000C45B0000753B2B0000000000000000000000000000000000C4660B00E89F
+      5500F9CD9F00FFFDFC00FFFFFF00FEEEDF00F7C59100F0AC6600EBA15500E699
+      4A00E1903D00DB832800D6791A00D9873300EFCCAA00FFFFFF00FFFFFF00E3A3
+      6300C45B0000753B2B0000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000098969600B0AAAE00878383007E7D
+      7D007C7C7C007B7A7A00928B8B00A89696000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000000000000000000000C96E
+      1700EDA76000F9CD9F00FDF7F200FFFFFF00FFFFFE00FAE6D100F4CDA500EDB6
+      7F00E9AE7200EBBB8900F2D3B400FDFAF700FFFFFF00FDF7F200E19F5D00C95F
+      000084422200000000000000000000000000000000000000000000000000C96E
+      1700EDA76000F9CD9F00FEF8F200FFFFFF00FFFFFE00FAE6D100F4CCA400EDB6
+      7E00E7AE7500EBBB8900F2D3B400FDFAF700FFFFFF00FCF7F200E19F5D00C95E
+      0000844222000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000777777009A979700BBB1B1009A97
+      97008E878800958E8E00958E8E00797979000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000C96E1700E79F5500F5BC8100F9DFC400FEFCF900FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FEFDFB00EFCDAA00D9802A00C35A00008644
+      2200000000000000000000000000000000000000000000000000000000000000
+      0000C96E1700E89F5500F5BC8000F9DFC400FEFCF900FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FEFDFB00EFCCAA00D9802A00C35A00008644
+      2200000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000958E8E00E5E4E500E3D2E200BBB1
+      B100969393008E878800A89696008E8788000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000C1640C00C1640C00E99F5300EFB27200F2C49500F5D6B500F8E3
+      CD00F6E1CB00F2CFAC00E8B17800DC883200CA620000AF530700804126000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000C1640C00C1640C00E89F5300EFB27200F2C49500F5D6B500F8E3
+      CD00F6E1CB00F2CFAC00E8B17800DC883200CA62000080412600804126000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000008E878800E5E4E500E5E4E500BBB1
+      B100B0AAAE008C8A8B00928B8B00878383000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000BE661400BE661400D5823000D9842F00D781
+      2B00D47B2200CF711500C3640900934A1B00934A1B0000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000BE661400BE661400D5823000D8842F00D781
+      2B00D47B2200CF711500C3640900934A1B00934A1B0000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000958E8E00E2DDE200E2DD
+      E200BBB1B1009A9797007E7D7D00000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000AF570C00AC581200A956
+      1500A35316009D4F1800944A1C00000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000AC581200AC581200AC58
+      1200AC581200AC581200AC581200000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000777777007777
+      7700777777007777770000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000424D3E000000000000003E000000
+      2800000060000000180000000100010000000000200100000000000000000000
+      000000000000000000000000FFFFFF00FF81FFFF81FFFFC3FF000000FE007FFE
+      007FFFC1FF000000F8001FF8001FF0000F000000F0000FF0000FF0000F000000
+      E00007E00007F0000F000000C00003C00003800003000000C00003C000038000
+      0100000080000180000180000100000080000180000180000100000000000000
+      0000800001000000000000000000800001000000000000000000800001000000
+      000000000000800001000000000000000000E00007000000000000000000F000
+      0F000000800001800001F0000F000000800001800001FF00FF000000C00003C0
+      0003FF00FF000000C00003C00003FF00FF000000E00007E00007FF00FF000000
+      F0000FF0000FFF00FF000000F8001FF8001FFF00FF000000FE007FFE007FFF81
+      FF000000FF81FFFF81FFFFC3FF00000000000000000000000000000000000000
+      000000000000}
+  end
+  object tmrAppState: TTimer
+    OnTimer = tmrAppStateTimer
+    Left = 375
+    Top = 8
+  end
+  object ImageListScope: TImageList
+    Left = 560
+    Top = 8
+    Bitmap = {
+      494C010104000900040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
+      0000000000003600000028000000400000002000000001002000000000000020
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000D6CEBD00D6CEBD00D6CEBD00D6CE
+      BD00D6CEBD00ADA59C00635A5A00313129002921210042423900847B7300C6BD
+      AD00D6CEBD00D6CEBD00D6CEBD00D6CEBD00D6CEBD00D6CEBD00D6CEBD00D6CE
+      BD00D6CEBD00ADA59C00635A5A00313129002921210042423900847B7300C6BD
+      AD00D6CEBD00D6CEBD00D6CEBD00D6CEBD000000000000000000000000000000
+      0000D6CEBD00ADA59C00635A5A00313129002921210042423900847B7300C6BD
+      AD00D6CEBD000000000000000000000000000000000000000000000000000000
+      0000D6CEBD00ADA59C00635A5A00313129002921210042423900847B7300C6BD
+      AD00D6CEBD00000000000000000000000000D6CEBD00D6CEBD00D6CEBD00BDB5
+      A500393131000000000000000000000000000000000000000000000000001010
+      1000847B7300D6CEBD00D6CEBD00D6CEBD00D6CEBD00D6CEBD00D6CEBD00BDB5
+      A500393131000000000000000000000000000000000000000000000000001010
+      1000847B7300D6CEBD00D6CEBD00D6CEBD00000000000000000000000000BDB5
+      A500393131000000000000000000000000000000000000000000000000001010
+      1000847B7300D6CEBD000000000000000000000000000000000000000000BDB5
+      A500393131000000000000000000000000000000000000000000000000001010
+      1000847B7300D6CEBD000000000000000000D6CEBD00D6CEBD00B5AD9C001818
+      18000000000000081000001863000010BD000000CE0000219C00000831000000
+      0000000000005A5A5200D6CEBD00D6CEBD00D6CEBD00D6CEBD00B5AD9C001818
+      180000000000001000000063000000BD000000CE0000009C0000003100000000
+      0000000000005A5A5200D6CEBD00D6CEBD000000000000000000B5AD9C001818
+      1800000000000010000000630000840000008400000084000000003100000000
+      0000000000005A5A5200D6CEBD00000000000000000000000000B5AD9C001818
+      1800000000000010000000848400008484000084840000848400003100000000
+      0000000000005A5A5200D6CEBD0000000000D6CEBD00C6BDB500212121000000
+      0000000842000008E7000000FF000000FF000000FF000000FF000000FF000010
+      A5000000080000000000847B7300D6CEBD00D6CEBD00C6BDB500212121000000
+      00000042000000E7000000FF000000FF000000FF000000FF000000FF000000A5
+      00000008000000000000847B7300D6CEBD0000000000C6BDB500212121000000
+      00000042000084000000FF000000FF000000FF000000FF000000FF0000008400
+      00000008000000000000847B7300D6CEBD0000000000C6BDB500212121000000
+      0000004200000084840000FFFF0000FFFF0000FFFF0000FFFF00008484000084
+      84000008000000000000847B7300D6CEBD00D6CEBD006B635A00000000000008
+      29000000EF000000FF000000FF000000FF000000FF000000FF000000FF000000
+      FF000010A5000000000010101000C6BDAD00D6CEBD006B635A00000000000029
+      000000EF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+      000000A500000000000010101000C6BDAD00000000006B635A00000000000029
+      0000FF000000FF000000FF000000FF000000FF000000FF000000FF0000008400
+      0000840000000000000010101000C6BDAD00000000006B635A00000000000029
+      000000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FF
+      FF00008484000000000010101000C6BDAD00C6BDB50018181800000000000008
+      BD000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+      FF000000FF00000831000000000084847300C6BDB500181818000000000000BD
+      000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+      000000FF0000003100000000000084847300C6BDB5001818180000000000FF00
+      0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+      0000FF000000003100000000000084847300C6BDB50018181800000000000084
+      840000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FF
+      FF0000FFFF00003100000000000084847300B5AD9C0008080800000818000008
+      EF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+      FF000000FF0000219C000000000042423900B5AD9C00080808000018000000EF
+      000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+      000000FF0000009C00000000000042423900B5AD9C000808080000180000FF00
+      0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+      0000FF000000840000000000000042423900B5AD9C00080808000018000000FF
+      FF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FF
+      FF0000FFFF00008484000000000042423900A5A5940000000000000029000000
+      FF000000FF007373DE000808FF000000FF000000FF000000FF000000FF000000
+      FF000000FF000000CE000000000029212100A5A59400000000000029000000FF
+      000000FF000094DE940084DE840000FF000000FF000000FF000000FF000000FF
+      000000FF000000CE00000000000029212100A5A594000000000000290000FF00
+      0000FF000000FF00000084000000FF000000FF000000FF000000FF000000FF00
+      0000FF000000840000000000000029212100A5A59400000000000029000000FF
+      FF0000FFFF0094DE940084DE840000FFFF0000FFFF0000FFFF0000FFFF0000FF
+      FF0000FFFF0000CE00000000000029212100ADA5940000000000000021000000
+      FF001818F700DEDEE700B5B5F7000808FF000000FF000000FF000000FF000000
+      FF000000FF000010BD000000000031312900ADA59400000000000021000000FF
+      000021F72100F7F7F700DEE7DE0018F7180000FF000000FF000000FF000000FF
+      000000FF000000BD00000000000031312900ADA5940000000000002100008400
+      0000FF000000F7F7F700DEE7DE00FF000000FF000000FF000000FF000000FF00
+      0000FF000000840000000000000031312900ADA59400000000000021000000FF
+      FF0000FFFF00F7F7F700DEE7DE0000FFFF0000FFFF0000FFFF0000FFFF0000FF
+      FF0000FFFF00008484000000000031312900BDB5A50010100800000810000008
+      DE000000FF00ADADF700FFFFFF009494DE000000FF000000FF000000FF000000
+      FF000000FF000018630000000000635A5A00BDB5A500101008000010000000DE
+      000000FF0000A5E7A500F7F7F70094DE940000FF000000FF000000FF000000FF
+      000000FF00000063000000000000635A5A00BDB5A50010100800001000008400
+      0000FF00000084000000F7F7F700FF000000FF000000FF000000FF000000FF00
+      0000FF0000008400000000000000635A5A00BDB5A500101008000010000000FF
+      FF0000FFFF00A5E7A500F7F7F70094DE940000FFFF0000FFFF0000FFFF0000FF
+      FF0000FFFF000063000000000000635A5A00D6CEBD0031312900000000000018
+      73000000FF000808FF00B5B5FF009494DE000000FF000000FF000000FF000000
+      FF000008DE000008100000000000ADA59C00D6CEBD0031312900000000000073
+      000000FF000018FF1800E7EFE70094DE940000FF000000FF000000FF000000FF
+      000000DE00000010000000000000ADA59C00D6CEBD0031312900000000000073
+      000084000000FF000000E7EFE700FF000000FF000000FF000000FF000000FF00
+      0000840000000010000000000000ADA59C00D6CEBD0031312900000000000084
+      840000FFFF0000FFFF00E7EFE70094DE940000FFFF0000FFFF0000FFFF0000FF
+      FF00008484000010000000000000ADA59C00D6CEBD00A59C9400000000000000
+      08000008B5000000FF000000FF000000FF000000FF000000FF000000FF000000
+      EF00000842000000000039313100D6CEBD00D6CEBD00A59C9400000000000008
+      000000B5000000FF000018F7180000FF000000FF000000FF000000FF000000EF
+      0000004200000000000039313100D6CEBD0000000000A59C9400000000000008
+      000084000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+      0000004200000000000039313100D6CEBD0000000000A59C9400000000000008
+      00000084840000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF000084
+      8400004200000000000039313100D6CEBD00D6CEBD00D6CEBD006B635A000000
+      000000000800001873000008DE000000FF000000FF000008EF000008BD000008
+      29000000000018181800BDB5A500D6CEBD00D6CEBD00D6CEBD006B635A000000
+      0000000800000073000000DE000000FF000000FF000000EF000000BD00000029
+      00000000000018181800BDB5A500D6CEBD0000000000D6CEBD006B635A000000
+      0000000800008400000084000000FF000000FF000000FF000000840000000029
+      00000000000018181800BDB5A5000000000000000000D6CEBD006B635A000000
+      0000000800000084840000FFFF0000FFFF0000FFFF0000FFFF00008484000029
+      00000000000018181800BDB5A50000000000D6CEBD00D6CEBD00D6CEBD006B63
+      5A00000000000000000000081000000029000000290000081800000000000000
+      000021212100B5AD9C00D6CEBD00D6CEBD00D6CEBD00D6CEBD00D6CEBD006B63
+      5A00000000000000000000100000002900000029000000180000000000000000
+      000021212100B5AD9C00D6CEBD00D6CEBD000000000000000000D6CEBD006B63
+      5A00000000000000000000100000002900000029000000180000000000000000
+      000021212100B5AD9C0000000000000000000000000000000000D6CEBD006B63
+      5A00000000000000000000100000002900000029000000180000000000000000
+      000021212100B5AD9C000000000000000000D6CEBD00D6CEBD00D6CEBD00D6CE
+      BD00A59C94003131290010100800000000000000000008080800181818006B63
+      5A00C6BDB500D6CEBD00D6CEBD00D6CEBD00D6CEBD00D6CEBD00D6CEBD00D6CE
+      BD00A59C94003131290010100800000000000000000008080800181818006B63
+      5A00C6BDB500D6CEBD00D6CEBD00D6CEBD00000000000000000000000000D6CE
+      BD00A59C94003131290010100800000000000000000008080800181818006B63
+      5A00C6BDB500000000000000000000000000000000000000000000000000D6CE
+      BD00A59C94003131290010100800000000000000000008080800181818006B63
+      5A00C6BDB500000000000000000000000000D6CEBD00D6CEBD00D6CEBD00D6CE
+      BD00D6CEBD00D6CEBD00BDB5A500ADA59400A5A59400B5AD9C00C6C6B500D6CE
+      BD00D6CEBD00D6CEBD00D6CEBD00D6CEBD00D6CEBD00D6CEBD00D6CEBD00D6CE
+      BD00D6CEBD00D6CEBD00BDB5A500ADA59400A5A59400B5AD9C00C6C6B500D6CE
+      BD00D6CEBD00D6CEBD00D6CEBD00D6CEBD000000000000000000000000000000
+      000000000000D6CEBD00BDB5A500ADA59400A5A59400B5AD9C00C6C6B5000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000D6CEBD00BDB5A500ADA59400A5A59400B5AD9C00C6C6B5000000
+      000000000000000000000000000000000000424D3E000000000000003E000000
+      2800000040000000200000000100010000000000000100000000000000000000
+      000000000000000000000000FFFFFF0000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000F007F00700000000E003E003
+      00000000C001C001000000008000800000000000800080000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000080008000000000008001800100000000C003C003
+      00000000E007E00700000000F81FF81F00000000000000000000000000000000
+      000000000000}
+  end
+  object ImglstTvMvps: TImageList
+    Left = 1168
+    Top = 105
+    Bitmap = {
+      494C010106000900040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
+      0000000000003600000028000000400000002000000001002000000000000020
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000D6CEBD00ADA59C00635A5A00313129002921210042423900847B7300C6BD
+      AD00000000000000000000000000000000000000000000000000000000000000
+      0000D6CEBD00ADA59C00635A5A00313129002921210042423900847B7300C6BD
+      AD00000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000000000000000000000BDB5
+      A500393131000000000000000000000000000000000000000000000000001010
+      1000847B7300D6CEBD000000000000000000000000000000000000000000BDB5
+      A500393131000000000000000000000000000000000000000000000000001010
+      1000847B7300D6CEBD0000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000B5AD9C001818
+      180000000000001000000063000000BD000000CE0000009C0000003100000000
+      0000000000005A5A5200D6CEBD00000000000000000000000000B5AD9C001818
+      18000000000000081000001863000010BD000000CE0000219C00000831000000
+      0000000000005A5A5200D6CEBD00000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000C6BDB500212121000000
+      00000042000000E7000000FF000000FF000000FF000000FF000000FF000000A5
+      00000008000000000000847B73000000000000000000C6BDB500212121000000
+      0000000842000008E7000000FF000000FF000000FF000000FF000000FF000010
+      A5000000080000000000847B7300000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000006B635A00000000000029
+      000000EF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+      000000A500000000000010101000C6BDAD00000000006B635A00000000000008
+      29000000EF000000FF000000FF000000FF000000FF000000FF000000FF000000
+      FF000010A5000000000010101000C6BDAD000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000C6BDB500181818000000000000BD
+      000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+      000000FF0000003100000000000084847300C6BDB50018181800000000000008
+      BD000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+      FF000000FF000008310000000000848473000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000B5AD9C00080808000018000000EF
+      000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+      000000FF0000009C00000000000042423900B5AD9C0008080800000818000008
+      EF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+      FF000000FF0000219C0000000000424239000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000A5A59400000000000029000000FF
+      000000FF000094DE940084DE840000FF000000FF000000FF000000FF000000FF
+      000000FF000000CE00000000000029212100A5A5940000000000000029000000
+      FF000000FF007373DE000808FF000000FF000000FF000000FF000000FF000000
+      FF000000FF000000CE0000000000292121000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000ADA59400000000000021000000FF
+      000021F72100F7F7F700DEE7DE0018F7180000FF000000FF000000FF000000FF
+      000000FF000000BD00000000000031312900ADA5940000000000000021000000
+      FF001818F700DEDEE700B5B5F7000808FF000000FF000000FF000000FF000000
+      FF000000FF000010BD0000000000313129000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000BDB5A500101008000010000000DE
+      000000FF0000A5E7A500F7F7F70094DE940000FF000000FF000000FF000000FF
+      000000FF00000063000000000000635A5A00BDB5A50010100800000810000008
+      DE000000FF00ADADF700FFFFFF009494DE000000FF000000FF000000FF000000
+      FF000000FF000018630000000000635A5A000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000D6CEBD0031312900000000000073
+      000000FF000018FF1800E7EFE70094DE940000FF000000FF000000FF000000FF
+      000000DE00000010000000000000ADA59C00D6CEBD0031312900000000000018
+      73000000FF000808FF00B5B5FF009494DE000000FF000000FF000000FF000000
+      FF000008DE000008100000000000ADA59C000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000A59C9400000000000008
+      000000B5000000FF000018F7180000FF000000FF000000FF000000FF000000EF
+      0000004200000000000039313100D6CEBD0000000000A59C9400000000000000
+      08000008B5000000FF000000FF000000FF000000FF000000FF000000FF000000
+      EF00000842000000000039313100D6CEBD000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000000000006B635A000000
+      0000000800000073000000DE000000FF000000FF000000EF000000BD00000029
+      00000000000018181800BDB5A5000000000000000000000000006B635A000000
+      000000000800001873000008DE000000FF000000FF000008EF000008BD000008
+      29000000000018181800BDB5A500000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000D6CEBD006B63
+      5A00000000000000000000100000002900000029000000180000000000000000
+      000021212100B5AD9C0000000000000000000000000000000000D6CEBD006B63
+      5A00000000000000000000081000000029000000290000081800000000000000
+      000021212100B5AD9C0000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000A59C94003131290010100800000000000000000008080800181818006B63
+      5A00C6BDB5000000000000000000000000000000000000000000000000000000
+      0000A59C94003131290010100800000000000000000008080800181818006B63
+      5A00C6BDB5000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000D6CEBD00BDB5A500ADA59400A5A59400B5AD9C00C6C6B5000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000D6CEBD00BDB5A500ADA59400A5A59400B5AD9C00C6C6B5000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000004221210042212100422121004221210042212100422121000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000001818180018181800181818001818180018181800181818000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000004221
+      2100422121004221210042212100422121004221210042212100422121004221
+      2100422121000000000000000000000000000000000000000000000000001818
+      1800181818001818180018181800181818001818180018181800181818001818
+      1800181818000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000A5A5A5004221210042212100A5A5
+      A500000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000422121004221
+      2100422121004263000084C6000084C6000084C6000084C60000426300004221
+      2100422121004221210000000000000000000000000000000000181818001818
+      1800181818004263940052BDE70052BDE70052BDE70052BDE700426394001818
+      1800181818001818180000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000A5A5A5004221210042212100A5A5
+      A500000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000084848400848484008484840084848400000000000000
+      0000000000000000000000000000000000000000000042212100422121004221
+      210084C6000084C60000C6C64200C6C64200C6C64200C6C6420084C6000084C6
+      0000422121004221210042212100000000000000000018181800181818001818
+      18005ACEF70052BDE70052B5DE0052B5DE0052B5DE0052B5DE0052B5DE0052BD
+      E700181818001818180018181800000000000000000000000000000000000000
+      0000000000000000000000000000000000008484630042212100422121008484
+      6300000000000000000000000000000000000000000000000000000000000000
+      00000000000084848400C6C6C600C6C6C600C6C6C600C6C6C600848484000000
+      00000000000000000000000000000000000000000000422121004221210084E7
+      000084C6000084E7000000000000000000000000000000000000C6C6420084C6
+      000084C6000042212100422121000000000000000000181818001818180052BD
+      E70052B5EF004AA5CE004284BD002173B5002173B5002173B5004AA5CE0052B5
+      DE0052BDE7001818180018181800000000000000000000000000000000008484
+      42000000000000000000C6846300C66342004263420084636300846363004263
+      4200C6422100C684630000000000000000000000000000000000000000008484
+      840000000000C6C6C60000000000000000000000000000000000C6C6C6008484
+      84000000000000000000000000000000000042212100422121004221210084E7
+      210084C600000000000084C6000084C6000084C6000084C600000000000084E7
+      000084C6000042630000422121004221210018181800181818004263940052B5
+      EF004AA5CE004284BD00EFCECE00EFCECE00EFCECE00EFCECE001063A5004AA5
+      CE0052B5DE004263940018181800181818000000000000000000422121008463
+      4200846321000000000000000000C6A58400C66342004242420042424200C642
+      2100C68463000000000000000000000000000000000000000000848484008484
+      8400000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000422121004221210084E70000C6C6
+      420084E7000084C6000084C6000084C6000084C6000084C6000084C6000084C6
+      000084C6000084C600004221210042212100181818001818180052B5DE004AA5
+      CE004284BD00EFCECE005A84AD0052739C004263940031528400EFCECE001063
+      A50052B5DE0052BDE70018181800181818000000000000000000846342008442
+      210042420000422100000000000000000000C6A58400C6634200C6634200C684
+      6300000000000000000000000000000000000000000000000000848484008484
+      8400000000008484840084848400000000000000000000000000848484008484
+      8400000000000000000000000000000000004221210042212100C6C64200C6C6
+      630084E70000C6C64200C6C6420084C6000084C6000084C60000C6C64200C6C6
+      420084C6000084C600004221210042212100181818001818180052B5EF005ACE
+      F7005ACEF7005ACEF70052B5DE004AA5CE004284BD0042639400315284001063
+      A5004AA5CE0052BDE70018181800181818000000000000000000848442008484
+      42008463420084632100422100000000000000000000C6A58400C6A584000000
+      0000000000000000000000000000000000000000000000000000848484008484
+      840084848400C6C6C60084848400000000000000000000000000C6C6C6008484
+      8400000000000000000000000000000000004221210042212100C6C66300F7CE
+      A50084E7000000000000C6C6420084E7000084C6000084C6000000000000C6C6
+      420084C6000084C60000422121004221210018181800181818006BD6F7009CE7
+      F7009CE7F70018316B00C6A5A5006BD6F70052B5DE0018316B00C6A5A5005273
+      9C004AA5CE0052BDE70018181800181818000000000000000000848463008484
+      6300C6A56300F7CEA50084844200422100000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000848484008484
+      840084848400C6C6C60084848400000000000000000000000000C6C6C6008484
+      8400000000000000000000000000000000004221210042212100F7CEA500C6DE
+      C60084E7000000000000C6C6420084E7000084E7000084C6000000000000C6C6
+      420084C6000084C60000422121004221210018181800181818006BD6F700B5EF
+      FF00CEF7FF0018316B00C6A5A500B5EFFF006BD6F70018316B00C6A5A5005273
+      9C004AA5CE0052BDE7001818180018181800000000000000000084846300C6A5
+      6300C6DEC600F7FFFF00C6DEC600848442004242000000000000000000000000
+      0000000000000000000000000000000000000000000000000000848484008484
+      840084848400C6C6C60084848400000000000000000000000000C6C6C6008484
+      840000000000000000000000000000000000422121004221210042840000F7FF
+      FF0084E7000000000000C6C6420084E7000084E7000084E7000000000000C6C6
+      420084C60000422121004221210042212100181818001818180042639400CEF7
+      FF00DEFFFF0018316B00C6A5A500CEF7FF00B5EFFF0018316B00C6A5A5005273
+      9C004AA5CE00426394001818180018181800000000000000000042424200C6A5
+      6300C6A58400C6DEC600F7CEA500C6C684008484420084634200848442000000
+      000000000000000000000000000000000000000000000000000000000000C6C6
+      C600848484008484840084848400848484000000000000000000000000000000
+      000000000000000000000000000000000000000000004221210042424200F7CE
+      A500C6DEC60084E7000084E7000084E7000084E7000084E7000084E7000084E7
+      000084C600004221210042212100000000000000000018181800181818009CE7
+      F700CEF7FF00DEFFFF00CEF7FF00B5EFFF009CE7F7006BD6F70052BDE70052B5
+      DE0052BDE7001818180018181800000000000000000000000000000000008484
+      420084846300C6A56300C6C68400C6A58400C6A58400C6A56300848463000000
+      0000000000000000000000000000000000000000000000000000000000008484
+      8400C6C6C6008484840084848400848484008484840084848400848484000000
+      0000000000000000000000000000000000000000000042212100424242004284
+      0000F7CEA500F7FFFF00C6DEC600F7CEA500C6C66300C6C6420084E7210084E7
+      0000422121004221210042212100000000000000000018181800181818001818
+      18009CE7F700CEF7FF00B5EFFF009CE7F7009CE7F7006BD6F7005ACEF70052BD
+      E700181818001818180018181800000000000000000000000000000000000000
+      0000424242008484630084846300848463008463420042212100000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000008484840084848400848484008484840084848400000000000000
+      0000000000000000000000000000000000000000000000000000422121004242
+      42004242420042840000F7CEA500C6C66300C6C6420084E70000422121004221
+      2100422121004221210000000000000000000000000000000000181818001818
+      1800181818004263940084DEF7006BD6F7006BD6F7005ACEF700426394001818
+      1800181818001818180000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000004221
+      2100422121004221210042212100422121004221210042212100422121004221
+      2100422121000000000000000000000000000000000000000000000000001818
+      1800181818001818180018181800181818001818180018181800181818001818
+      1800181818000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000004221210042212100422121004221210042212100422121000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000001818180018181800181818001818180018181800181818000000
+      000000000000000000000000000000000000424D3E000000000000003E000000
+      2800000040000000200000000100010000000000000100000000000000000000
+      000000000000000000000000FFFFFF00F00FF00F00000000E003E00300000000
+      C001C00100000000800180010000000080008000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000008000800000000000C001C00100000000C003C00300000000
+      F007F00700000000F81FF81F00000000FC03F81FF81FF81FFC03E007E007E007
+      F803C003C003C003E003800180018001C0008001800180018000000000000000
+      8001000000000000000300000000000000030000000000000003000000000000
+      000300000000000080078001800180018007800180018001C00FC003C003C003
+      E01FE007E007E007F87FF81FF81FF81F00000000000000000000000000000000
+      000000000000}
+  end
+  object ImageList1: TImageList
+    Height = 32
+    Width = 32
+    Left = 432
+    Top = 97
+    Bitmap = {
+      494C010105000900040020002000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
+      0000000000003600000028000000800000004000000001002000000000000080
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000525252005252520052525200525252005252520052525200525252005252
+      5200525252005252520052525200525252005252520052525200525252005252
+      5200525252005252520052525200525252005252520052525200525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700FFFFFF00FFFFFF00FFFFFF00FFF7FF00FFF7FF00FFF7FF00F7EF
+      F700F7EFF700F7E7F700F7E7F700F7DEF700F7DEEF00F7DEEF00EFDEEF00EFDE
+      EF00EFCEE700EFCEE700EFC6E700EFC6E700EFC6E700E7BDE700525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700FFFFFF00FFF7FF00FFF7FF00FFF7FF00F7EFF700F7EFF700F7EF
+      F700F7E7F700EFDEEF00E7D6E700E7D6E700E7D6E700EFCEE700EFCEE700EFCE
+      E700EFCEE700EFC6E700EFC6E700E7BDE700E7BDE700E7B5DE00525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700FFF7FF00FFF7FF00FFF7FF00F7EFF700F7EFF700F7EFF700F7DE
+      F700EFDEEF00E7D6E700D6BDD600D6BDD600D6BDD600DEB5D600EFC6E700EFC6
+      E700EFC6E700EFC6E700E7BDE700E7BDE700E7B5DE00E7ADDE00525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700FFF7FF00FFF7F700F7EFF700F7EFF700F7EFF700F7E7F700EFDE
+      EF00E7D6E700D6BDD600D6BDD600E7D6E700D6BDD600D6B5CE00E7BDE700E7BD
+      E700E7BDE700E7BDE700E7B5DE00E7B5DE00E7ADDE00E7ADDE00525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700F7EFF700F7EFF700F7EFF700F7E7F700F7E7F700F7DEF700E7D6
+      E700DEB5D600D6BDD600FFFFFF00FFFFFF00FFF7F700D6ADCE00DEB5D600E7BD
+      E700E7BDE700E7B5DE00E7B5DE00E7ADDE00E7ADDE00DEADDE00525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700F7EFF700F7EFF700F7E7F700F7E7F700F7DEF700EFDEEF00EFCE
+      E700D6BDD600D6B5CE00FFFFFF00FFFFFF00F7EFF700C69CBD00D6ADCE00E7B5
+      DE00E7B5DE00E7ADDE00E7ADDE00E7ADDE00DEADDE00DEA5D600525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700F7E7F700F7E7F700F7DEF700F7DEEF00F7DEEF00EFDEEF00EFCE
+      E700DEB5D600D6ADCE00C69CBD00C69CBD00BD9CBD00C69CBD00D6A5CE00E7AD
+      DE00E7ADDE00E7ADDE00DEADDE00DEADDE00DEA5D600DE9CD600525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700F7E7F700F7DEF700F7DEEF00F7DEEF00EFDEEF00EFCEE700EFC6
+      E700DEB5D600D6ADCE00D6ADCE00E7E7E700B58CAD00C69CBD00D6A5CE00DEAD
+      DE00DEADDE00DEADDE00DEA5D600DE9CD600DE9CD600DE9CD600525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700F7DEF700F7DEEF00EFDEEF00EFDEEF00EFCEE700EFCEE700EFC6
+      E700DEB5D600D6ADCE00D6ADCE00FFFFFF00C69CBD00C694BD00D69CCE00DEA5
+      D600DEA5D600DEA5D600DE9CD600DE9CD600DE9CD600D694CE00525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700EFDEEF00EFDEEF00EFCEE700EFCEE700EFC6E700EFC6E700E7BD
+      E700E7B5DE00D6A5CE00C694BD00FFF7F700E7D6E700B58CAD00C694BD00D69C
+      CE00DE9CD600DE9CD600DE9CD600DE9CD600D694CE00D68CCE00525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700EFDEEF00EFCEE700EFCEE700EFC6E700EFC6E700E7BDE700E7BD
+      E700DEADDE00D6ADCE00C694BD00D6BDD600FFFFFF00D6ADCE00B584AD00C68C
+      BD00D694CE00DE9CD600D694CE00D694CE00D68CCE00D68CCE00525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700EFCEE700EFCEE700EFC6E700EFC6E700E7BDE700E7B5DE00DEAD
+      DE00D6A5CE00D69CCE00C694BD00B58CAD00F7EFF700FFFFFF00C69CBD00B57B
+      AD00C684BD00D68CCE00D68CCE00D68CCE00D684CE00D684C600525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700EFC6E700EFC6E700EFC6E700E7BDE700DEB5D600DEA5D600D6AD
+      CE00C69CBD00C694BD00C68CBD00B57BAD00B58CAD00FFFFFF00F7EFF700B58C
+      AD00B57BAD00C684BD00D684CE00D684CE00D684C600D67BC600525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700EFC6E700E7BDE700E7BDE700E7B5DE00DEA5D600D69CCE00C694
+      BD00D6BDD600D6ADCE00B584AD00B57BAD009C6B9C00E7DEE700FFFFFF00EFCE
+      E700B573AD00C67BBD00D67BC600D684C600D67BC600CE7BC600525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700E7BDE700E7BDE700E7B5DE00E7ADDE00D69CCE00C694BD00EFCE
+      E700FFFFFF00FFFFFF00B573AD00AD63A5009C6B9400C69CBD00FFFFFF00FFFF
+      FF00A5639C00B573AD00CE7BC600CE7BC600CE73C600CE73C600525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700E7B5DE00E7B5DE00E7ADDE00DEADDE00D69CCE00B58CAD00E7DE
+      E700FFFFFF00E7DEE7009C6B9C009C6B9C0094639400D6B5CE00FFFFFF00FFFF
+      FF00A5639C00B573AD00C673BD00CE73C600CE73C600CE6BBD00525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700E7ADDE00E7ADDE00E7ADDE00DEA5D600D69CCE00B58CAD00D6BD
+      D600FFFFFF00D6B5CE009C6B94009C6394009C639400EFE7EF00FFFFFF00E7D6
+      E700AD63A500B56BAD00C673BD00CE73C600CE6BBD00CE6BBD00525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700E7ADDE00DEADDE00DEADDE00DE9CD600D694CE00C684BD00B584
+      AD00EFE7EF00F7EFF700BD9CBD00BD9CBD00E7DEE700FFFFFF00F7EFF700B57B
+      AD00B563AD00CE6BBD00CE6BBD00CE6BBD00CE63BD00CE63BD00525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700DEADDE00DEA5D600DEA5D600DE9CD600D694CE00C68CBD00C684
+      BD00B57BAD00D6ADCE00E7DEE700E7DEE700E7D6E700D6B5CE00A5639C00A563
+      9C00AD5AA500B55AAD00B55AAD00B55AAD00B55AAD00B55AAD004A4A4A000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700DEA5D600DE9CD600DE9CD600DE9CD600D694CE00D68CCE00C684
+      BD00C67BBD00B573AD00B573AD00B56BAD00AD63A500A5639C0094528C00944A
+      8C00944A8400944A8C00944A8C00944A8C00944A8C00944A8C00424242000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700DE9CD600DE9CD600DE9CD600D694CE00D68CCE00D68CCE00D684
+      CE00D67BC600C67BBD00C673BD00C673BD00B563AD0094528C007B4A7B006339
+      63005A315A005A315A0063315A0063396300734A6B00844A7B00394242000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700DE9CD600DE9CD600D694CE00D68CCE00D68CCE00D684CE00D684
+      C600D67BC600CE73C600C673BD00C673BD00B563AD0094528C00633963000808
+      08002121210039393900525252006B4A6B006B4A6B006B4A6B006B4A6B000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700DE9CD600D694CE00D68CCE00D68CCE00D684CE00D684C600D67B
+      C600CE7BC600CE73C600CE73C600CE6BBD00B563AD00944A8C005A315A002121
+      210094639400B5A5B500D6BDD600F7EFF700FFFFFF00ADA5AD00000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700D68CCE00D68CCE00D68CCE00D684C600D67BC600D67BC600CE73
+      C600CE73C600CE73C600CE6BBD00CE6BBD00B55AAD00944A8C005A315A003939
+      3900ADA5AD00D6BDD600E7E7E700FFFFFF00ADA5AD0000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700D68CCE00D684CE00D684C600D67BC600CE7BC600CE73C600CE73
+      C600CE6BBD00CE6BBD00CE63BD00CE63BD00B55AAD00944A8C005A315A005252
+      5200BD9CBD00E7DEE700FFFFFF00ADA5AD000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700D684CE00D67BC600D67BC600CE7BC600CE73C600CE73C600CE6B
+      BD00CE6BBD00CE63BD00CE63BD00CE63BD00B55AAD00944A8C0063315A006B4A
+      6B00D6BDD600F7EFF700ADA5AD00000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700D67BC600CE7BC600CE73C600CE73C600CE73C600CE6BBD00CE63
+      BD00CE63BD00CE63BD00CE63BD00CE63BD00B55AA500944A8C00734A6B009463
+      9400E7E7E700ADA5AD0000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700CE7BC600CE73C600CE73C600CE6BBD00CE6BBD00CE63BD00CE63
+      BD00CE63BD00CE63BD00CE63BD00CE63BD00B55AA500944A8C00844A7B00AD9C
+      AD00ADA5AD000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700E7E7E700E7E7E700E7E7E700E7E7E700E7E7E700E7E7E700E7E7
+      E700E7E7E700E7E7E700E7E7E700E7E7E700E7DEE700D6BDD600B5A5B500ADA5
+      AD00000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000525252005252520052525200525252005252520052525200525252005252
+      5200525252005252520052525200525252005252520052525200525252005252
+      5200525252005252520052525200525252005252520052525200525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000004A4A4A004A4A4A004A4A
+      4A00000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000004A4A4A004A4A4A004A4A
+      4A00000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000525252005252520052525200525252005252520052525200525252005252
+      5200525252005252520052525200525252005252520052525200525252005252
+      5200525252005252520052525200525252005252520052525200525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00F7F7
+      F700F7F7F700F7F7F700F7F7F700F7F7F700F7F7F700F7F7F700EFEFEF00EFEF
+      EF00EFEFEF00EFEFEF00EFEFEF00E7E7E700E7E7E700E7E7E700525252000000
+      000000000000000000000000000000000000000000008C8C8C00FFFFFF00C6BD
+      BD00000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000004A4A4A004A4A4A008C8C8C00FFFFFF008C8C
+      8C004A4A4A004A4A4A0000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000008C8C8C00FFFFFF00C6BD
+      BD00000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000004A4A4A004A4A4A008C8C8C00FFFFFF008C8C
+      8C004A4A4A004A4A4A0000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00F7FF
+      FF00F7F7F700F7F7F700F7F7F700F7F7F700F7F7F700F7F7F700EFEFEF00EFEF
+      EF00EFEFEF00EFEFEF00EFEFEF00E7E7E700E7E7E700E7E7E700525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700FFFFFF00FFFFFF00FFFFFF00FFFFFF00F7FFFF00F7F7F700F7F7
+      F700F7F7F700F7F7F700F7F7F700F7F7F700EFEFEF00EFEFEF00EFEFEF00EFEF
+      EF00EFEFEF00EFEFEF00E7E7E700E7E7E700E7E7E700E7E7E700525252000000
+      000000000000000000000000000000000000000000008C8C8400F7F7F700B5B5
+      B500000000000000000000000000000000000000000000000000000000000000
+      0000000000004A4A4A004A4A4A00A5A59C00DEDEDE00DED6D600FFFFFF00DED6
+      D600C6C6C6008C8C8C004A4A4A004A4A4A000000000000000000000000000000
+      000000000000000000000000000000000000000000008C8C8400F7F7F700B5B5
+      B500000000000000000000000000000000000000000000000000000000000000
+      0000000000004A4A4A004A4A4A00A5A5A500DEDEDE00DED6D600FFFFFF00DED6
+      D600C6C6C6008C8C8C004A4A4A004A4A4A000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00F7FFFF00F7F7
+      F700F7F7F700F7F7F700F7F7F700F7F7F700EFEFEF00EFEFEF00EFEFEF00EFEF
+      EF00EFEFEF00EFEFEF00E7E7E700E7E7E700E7E7E700E7E7E700525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700FFFFFF00FFFFFF00FFFFFF00F7FFFF00F7F7F700F7F7F700F7F7
+      F700F7F7F700F7F7F700F7F7F700EFEFEF00EFEFEF00EFEFEF00EFEFEF00EFEF
+      EF00E7E7E700E7E7E700E7E7E700E7E7E700E7E7E700E7E7E700525252000000
+      0000000000000000000000000000000000000000000084848400F7EFEF00ADA5
+      A500000000000000000000000000000000000000000000000000000000004A4A
+      4A004A4A4A00948C8C00C6C6C600C6C6C600C6C6C600DED6D600FFFFFF00DED6
+      D600C6C6C600C6C6C600C6C6C6008C8C8C004A4A4A004A4A4A00000000000000
+      0000000000000000000000000000000000000000000084848400F7EFEF00A5A5
+      A500000000000000000000000000000000000000000000000000000000004A4A
+      4A004A4A4A00948C8C00C6C6C600C6C6C600C6C6C600DED6D600FFFFFF00DED6
+      D600C6C6C600C6C6C600C6C6C6008C8C8C004A4A4A004A4A4A00000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700FFFFFF00FFFFFF00FFFFFF00F7FFFF00F7F7F700F7F7F700F7F7
+      F700F7F7F700F7F7F700F7F7F700EFEFEF00EFEFEF00EFEFEF00EFEFEF008484
+      84008484840084848400E7E7E700E7E7E700E7E7E700E7E7E700525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700FFFFFF0063636300636363006B6B6B006B6B6B006B6B6B007373
+      7300F7F7F700F7F7F700EFEFEF00EFEFEF00EFEFEF00EFEFEF00424242004242
+      42004242420042424200E7E7E700E7E7E700E7E7E700DEDEDE00525252000000
+      000000000000000000000000000000000000000000007B7B7B00EFEFE7009C94
+      940000000000000000000000000000000000000000004A4A4A004A4A4A008C8C
+      8C00BDBDBD00C6C6C600C6C6C600C6C6C600C6C6C600DED6D600FFFFFF00DED6
+      D600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C6008C8C8C004A4A4A004A4A
+      4A0000000000000000000000000000000000000000007B7B7B00EFEFE7009C9C
+      940000000000000000000000000000000000000000004A4A4A004A4A4A008C8C
+      8C00BDBDBD00C6C6C600C6C6C600C6C6C600C6C6C600DED6D600FFFFFF00DED6
+      D600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C6008C8C8C004A4A4A004A4A
+      4A00000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700FFFFFF00FFFFFF00FFFFFF00F7F7F700F7F7F700F7F7F700F7F7
+      F700F7F7F700F7F7F700EFEFEF008484840084848400EFEFEF00EFEFEF008484
+      84008CBDBD0084848400E7E7E700E7E7E7007B7B7B007B7B7B00525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700F7FFFF00F7F7F700F7F7F700F7F7F700F7F7F700F7F7F700F7F7
+      F700EFEFEF00EFEFEF00EFEFEF00EFEFEF00008C8C00009494004242420042F7
+      F70042424200009494004242420042424200DEDEDE00DEDEDE00525252000000
+      000000000000000000000000000000000000000000007B737300E7E7E7008C8C
+      8400000000000000000000000000000000004A4A4A008C8C8C00B5ADAD00C6C6
+      C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600DED6D600FFFFF700DED6
+      D600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C6008C8C
+      8C004A4A4A00000000000000000000000000000000007B7B7B00E7E7E7008C8C
+      8400000000000000000000000000000000004A4A4A008C8C8C00B5ADAD00C6C6
+      C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600DED6D600FFFFF700DED6
+      D600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C6008C8C
+      8C004A4A4A000000000000000000000000000000000000000000000000000000
+      0000E7E7E700FFFFFF00F7F7F700F7F7F700F7F7F700F7F7F700F7F7F700F7F7
+      F700EFEFEF00EFEFEF008CBDBD008CBDBD008484840084ADAD00848484007BAD
+      AD009CEFEF007B7B7B007B7B7B007B7B7B007BADAD0084ADA500525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700F7F7F7006363630063636300636363006B6B6B006B6B6B006B6B
+      6B00EFEFEF00EFEFEF00EFEFEF00EFEFEF000094940042F7F70042F7F70042F7
+      F70042F7F70042F7F7000094940042424200DEDEDE00DEDEDE00525252000000
+      00000000000000000000000000000000000000000000736B6B00DEDEDE007B7B
+      7B000000000000000000000000004A4A4A008C8C84008C8C8400C6C6C600C6C6
+      C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600EFEFEF00FFF7F700F7F7
+      F700C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600B5B5
+      B500ADADAD004A4A4A0000000000000000000000000000007300DEDEDE007B7B
+      7B000000000000000000000000004A4A4A008C8C84008C8C8400C6C6C600C6C6
+      C600C6C6C60000007300C6C6C600C6C6C600C6C6C600EFEFEF00FFF7F700F7F7
+      F700C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600C6C6C600B5B5
+      B500ADADAD004A4A4A0000000000000000000000000000000000000000000000
+      0000E7E7E700F7F7F700F7F7F700F7F7F700F7F7F700F7F7F700F7F7F700EFEF
+      EF00EFEFEF00EFEFEF0094BDBD009CEFEF00848484007BADAD007BADAD007BAD
+      AD00ADEFEF007B7B7B00ADB5B50084ADA5007BADAD0084ADA500525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700F7F7F700F7F7F700F7F7F700F7F7F700F7F7F700EFEFEF00EFEF
+      EF00EFEFEF00EFEFEF00EFEFEF00008C8C000094940042F7F700009C9C004242
+      4200009C9C0042F7F700424242004242420042424200DEDEDE00525252000000
+      000000000000000000000000000000000000000000006B6B6B00D6D6D600736B
+      6B000000000000000000000000004A4A4200ADADAD00C6C6C6008C8C8400ADAD
+      AD00C6C6C600C6C6C600C6C6C600BDBDBD0073737300A5A59C00F7F7F7009C9C
+      9C00BDBDBD00C6C6C600C6C6C600C6C6C600C6C6C600B5B5B500B5B5B500EFEF
+      EF00ADADAD004A4A4A0000000000000000000000730000007300000073006B6B
+      73000000000000000000000000004A4A4200ADADAD00C6C6C6008C8C8400ADAD
+      AD00000073000000730000007300BDBDBD00736B6B00A5A5A500F7F7F7009C9C
+      9C00C6BDBD00C6C6C600C6C6C600C6C6C600C6C6C600B5B5B500B5B5B500EFEF
+      EF00ADADAD004A4A4A0000000000000000000000000000000000000000000000
+      0000E7E7E700F7F7F700F7F7F700F7F7F700F7F7F700F7F7F700EFEFEF00EFEF
+      EF00EFEFEF008484840084848400D6D6D6009CEFEF00848484007BADAD0084AD
+      A500D6D6D6007BADAD007B7B7B0084ADA50094EFEF00CECECE00525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700F7F7F700F7F7F700F7F7F700EFEFEF00EFEFEF00EFEFEF00EFEF
+      EF00EFEFEF00EFEFEF00E7E7E7000094940042F7F70042F7F70042424200CECE
+      CE004242420042F7F70042F7F7000094940042424200D6D6D600525252000000
+      0000000000000000000000000000000000000000000063636300D6CECE005A5A
+      5A0000000000000000000000000042424200ADADAD00C6C6C600C6C6C600ADAD
+      AD00C6C6C600CECECE00635A5A006B6363007B7B7B00ADA5A500F7F7F7009C9C
+      9C0084847B008C8C8C00C6C6C600B5B5B500BDBDBD00EFEFEF00EFEFEF00EFEF
+      EF00ADADAD004A4A4A000000000000000000000073000000FF00000073000000
+      73000000000000000000000000004A424200ADADAD00C6C6C600C6C6C6000000
+      7300000073000000FF00000073006B6B63007B7B7B00ADA5A500F7F7F7009C9C
+      9C00848484008C8C8C00C6C6C600B5B5B500BDBDBD00EFEFEF00EFEFEF00EFEF
+      EF00ADADAD004A4A4A0000000000000000000000000000000000000000000000
+      0000E7E7E700F7F7F700F7F7F700F7F7F700EFEFEF00EFEFEF00EFEFEF00EFEF
+      EF008484840084ADAD007BADAD0084848400B5EFEF00B5EFEF00B5EFEF00ADEF
+      EF00A5EFEF009CEFEF009CEFEF0094EFEF007BADAD007B7B7B00525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700F7F7F7006363630063636300636363006B6B6B006B6B6B006B6B
+      6B00737373007373730073737300008C8C000094940042F7F700009C9C004242
+      4200009C9C0042F7F700424242004242420042424200D6D6D600525252000000
+      000000000000000000000000000000000000000000005A5A5A00CECECE00524A
+      520000000000000000000000000042423900B5B5B500C6C6C600C6C6C600ADAD
+      AD005A5A52004A4A4A005A5A5A007373730084848400B5ADAD00F7F7F700A59C
+      9C008C8C84008C8C8C0094948C00A5A5A500EFEFE700EFEFEF00EFEFEF00EFEF
+      EF00ADADAD004A4A4A0000000000000000006B6BFF003131FF000000FF000000
+      730000007300000000000000000042393900B5B5B500C6C6C600000073000000
+      73000000FF003131FF006B6BFF00736B6B0084848400B5ADAD00F7F7F700A59C
+      9C008C8C84008C8C8C0094948C00A5A5A500EFEFE700EFEFEF00EFEFEF00EFEF
+      EF00ADADAD004A4A4A0000000000000000000000000000000000000000000000
+      0000E7E7E700F7F7F700F7F7F700EFEFEF00EFEFEF00EFEFEF00EFEFEF00EFEF
+      EF00848484007BADAD007BADAD007BADAD00B5EFEF00B5EFEF00ADADAD00ADAD
+      AD00ADADAD00ADADAD00ADADAD00CECECE008CE7EF0073737300525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700F7EFEF00EFEFEF00EFEFEF00EFEFEF00EFEFEF00EFEFEF00E7E7
+      E700E7E7E700E7E7E700E7E7E700E7E7E7000094940042F7F70042F7F70042F7
+      F70042F7F70042F7F7000094940042424200D6D6D600D6D6D600525252000000
+      000000000000000000000000000000000000000000005A525200C6C6C6004242
+      420000000000000000000000000039393100ADADAD00B5ADAD00636363004242
+      390042424200525252006B6363007B7B7B00948C8C00BDB5B500F7EFEF00ADA5
+      A50094948C00949494009C9C9C00A5A59C00A5A5A500BDBDBD00EFEFEF00EFEF
+      EF00ADADAD004A4A4A000000000000000000000000006B6BFF003131FF000000
+      FF0000007300000073000000000039393100ADADAD0000007300000073000000
+      FF003131FF006B6BFF006B6B63007B7B7B00948C8C00BDB5B500F7F7EF00A5A5
+      A50094948C00949494009C9C9C00A5A5A500A5A5A500BDBDBD00EFEFEF00EFEF
+      EF00ADADAD004A4A4A0000000000000000000000000000000000000000000000
+      0000E7E7E700F7F7F700EFEFEF00EFEFEF00848484008484840084848400E7E7
+      E7007BADAD00C6EFF700C6EFF700B5EFEF00B5EFEF00ADADAD00A5A5A500EFEF
+      EF00CECECE00ADB5B5007B7B7B007BADAD008CE7EF008CE7EF00525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700EFEFEF00636363006363630063636300636363006B6B6B006B6B
+      6B006B6B6B0073737300737373007B7B7B00008C8C00009494004242420042F7
+      F70042424200009494004242420039393900D6D6D600D6D6D600525252000000
+      0000000000000000000000000000000000000000000052525200BDBDBD003931
+      310000000000000000000000000039313100ADADAD0042423900424239004242
+      39004A4A4A005A5A5A0073737300848484009C9C9400C6BDBD00F7EFEF00ADAD
+      AD009C9C9C00A5A59C00A5A5A500ADADAD00B5ADAD00B5B5B500BDB5B5009C9C
+      9C00ADADAD004A4A4A0000000000000000000000000052524A006B6BFF003131
+      FF000000FF0000007300000073003931310000007300000073000000FF003131
+      FF006B6BFF005A5A5A00736B6B00848484009C9C9400C6BDBD00F7EFEF00ADAD
+      AD009C9C9C00A5A5A500A5A5A500ADADAD00B5ADAD00B5B5B500BDB5B5009C9C
+      9C00ADADAD004A4A4A0000000000000000000000000000000000000000000000
+      0000E7E7E70084848400EFEFEF00EFEFEF0084848400DED6940084848400E7E7
+      E7007BADAD00738C8C00738C8C007BADAD00ADEFEF00ADADAD009CA5A500EFEF
+      EF00CECECE00ADB5B5007B7B7B00A5ADAD008CE7EF00CECECE00525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700EFEFEF00EFEFEF00EFEFEF00EFEFEF00E7E7E700E7E7E700E7E7
+      E700E7E7E700E7E7E700DEDEDE00DEDEDE00DEDEDE00DEDEDE00008C8C000094
+      940000949400008C8C00D6D6D600D6D6D600D6D6D600D6D6D600525252000000
+      000000000000000000000000000000000000000000004A4A4A00BDB5B500BDB5
+      B5003131290084847B004A4A420031313100ADADAD0042423900424239004A4A
+      4200525252006B6B63007B7B7B00948C8C00A5A59C00CEC6C600EFEFEF00B5B5
+      B500A5A5A500ADADAD00B5ADAD00B5B5B500BDB5B500BDBDBD00C6C6C6009C9C
+      9C00ADADAD004A4A4A000000000000000000000000004A4A4A00BDB5B5006B6B
+      FF003131FF000000FF000000730000007300000073000000FF003131FF006B6B
+      FF00525252006B6B63007B7B7B00948C8C00A5A5A500CEC6C600EFEFEF00B5B5
+      B500A5A5A500ADADAD00B5ADAD00B5B5B500BDB5B500BDBDBD00C6C6C6009C9C
+      9C00ADADAD004A4A4A0000000000000000000000000000000000000000000000
+      0000E7E7E70084848400ADAD840084848400ADAD8400EFE79C00848484007B7B
+      7B007B7B7B00ADAD7B0063636300738C8C00ADEFEF00A5EFEF009CA5A500EFEF
+      EF00CECECE00ADB5B500737373008CE7EF008CE7EF007BADAD00525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700EFEFEF00636363006363630063636300636363006B6B6B006B6B
+      6B006B6B6B007373730073737300737373007B7B7B007B7B7B007B7B7B00848C
+      8C008C8C8C008C8C8C008C8C8C008C8C8C00CECECE00CECECE00525252000000
+      00000000000000000000000000000000000000000000000000004A4A4200B5B5
+      B500B5B5B5004A4A4200EFEFEF0031292900ADADAD0042423900424239004A4A
+      4A005A5A5A0073737300848484009C9C9400ADADAD00D6CECE00EFEFEF00BDBD
+      BD00B5ADAD00B5B5B5007B7B73007B7B7300C6C6C600C6C6C600CECECE009C9C
+      9C00ADADAD004A4A4A00000000000000000000000000000000004A4A4200B5B5
+      B5006B6BFF003131FF000000FF00000073000000FF003131FF006B6BFF004A4A
+      4A0063635A00736B6B00848484009C9C9400ADADAD00D6CECE00EFEFEF00BDBD
+      BD00B5ADAD00B5B5B5007B7B7B007B7B7B00C6C6C600C6C6C600CECECE009C9C
+      9C00ADADAD004A4A4A0000000000000000000000000000000000000000000000
+      0000E7E7E70084848400ADAD8400ADA57B00ADA57B00EFE7AD007B7B7B00ADB5
+      B500A5A57B00ADAD7B00738C8C008CBDBD00ADEFEF00A5EFEF009CA5A500EFEF
+      EF00CECECE00ADADAD00737373007BADAD008CE7EF008CE7EF00525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700EFEFEF00E7E7E700E7E7E700E7E7E700E7E7E700E7E7E700DEDE
+      DE00DEDEDE00DEDEDE00DEDEDE00DEDEDE00DEDEDE00D6D6D600D6D6D600D6D6
+      D600D6D6D600D6D6D600D6D6D600CECECE00CECECE00CECECE00525252000000
+      0000000000000000000000000000000000000000000000000000000000002121
+      2100212121004A4A4200B5B5B50029292100ADADAD00424239004A4A42005252
+      52006B6363007B7B7B00948C8C00A5A59C00B5B5B500D6D6D600EFEFEF00C6C6
+      C600BDB5B500BDBDBD00737373002118100073737300D6CECE00D6D6D6009C9C
+      9C00ADADAD004A4A4A0000000000000000000000000000000000000000002118
+      1800211818006B6BFF003131FF000000FF003131FF006B6BFF004A4A42005252
+      5200636363007B7B7B00948C8C00A5A5A500B5B5B500DED6D600EFEFEF00C6C6
+      C600BDB5B500BDBDBD00736B6B0021181800736B6B00D6CECE00D6D6D6009C9C
+      9C00ADADAD004A4A4A0000000000000000000000000000000000000000000000
+      0000E7E7E700EFE79C0084848400ADA57B00ADA57B00D6D6D600ADAD7B007B7B
+      7B00A5A57B00EFE79400CECECE00738C8C00738C8C00ADB5B5009CA5A500A5A5
+      A500ADADAD00ADADAD0073737300ADADAD007BADAD00ADADAD00525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700E7E7E7005A5A5A00636363006363630063636300636363006B6B
+      6B006B6B6B007373730073737300737373007B7B7B007B7B7B007B7B7B00848C
+      8C008C8C8C008C8C8C008C8C8C008C8C8C00CECECE00CECECE00525252000000
+      000000000000000000000000000000000000000000000000000029292100BDBD
+      BD00BDBDBD004A4A42008484840029212100ADADAD00424239004A4A4A00635A
+      5A0073737300848484009C949400ADADAD00C6BDBD00DEDEDE00EFE7E700CECE
+      CE00C6C6C600C6C6C600423931004239310073737300DEDEDE00DEDEDE009C9C
+      9C00ADADAD004A4A4A000000000000000000000000000000000029212100BDBD
+      BD0000007300000073006B6BFF003131FF006B6BFF0000007300000073006363
+      5A00736B6B00848484009C9C9400ADADAD00C6BDBD00DEDEDE00EFE7E700CECE
+      CE00C6C6C600C6C6C6004239390042393900736B6B00DEDEDE00DEDEDE009C9C
+      9C00ADADAD004A4A4A0000000000000000000000000000000000000000000000
+      0000E7E7E700EFE7B500EFE7B500EFE7B500EFE7AD00EFE7AD00EFE7A500EFE7
+      9C00EFE79400ADAD7B007B7B7B00A5A58400A5A584007B7B7B009CA5A500CECE
+      CE00E7E7E700CECECE0073737300CECECE00CECECE00CECECE00525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700E7E7E700E7E7E700E7E7E700E7E7E700DEDEDE00DEDEDE00DEDE
+      DE00DEDEDE00DEDEDE00DEDEDE00D6D6D600D6D6D600D6D6D600D6D6D600D6D6
+      D600D6D6D600CECECE00CECECE00CECECE00CECECE00CECECE00525252000000
+      0000000000000000000000000000000000000000000031312900C6BDBD00C6BD
+      BD003931310084847B004A4A4A0021212100ADADAD004A4A4200525252006B63
+      63007B7B7B00948C8C00A5A59C00B5B5B500CECECE00E7E7E700E7E7E700D6D6
+      D600CECECE00D6CECE00D6D6D60094948C0073737300E7E7E700EFEFE7009C9C
+      9C00ADADAD004A4A4A0000000000000000000000000031292900C6BDBD000000
+      7300000073000000FF003131FF006B6BFF003131FF000000FF00000073000000
+      73007B7B7B00948C8C00A5A5A500B5B5B500CECEC600E7E7E700EFE7E700D6D6
+      D600CECECE00D6CECE00D6D6D600948C8C00736B6B00E7E7E700EFEFE7009C9C
+      9C00ADADAD004A4A4A0000000000000000000000000000000000000000000000
+      0000E7E7E700EFE7C600EFE7B500ADADAD00ADADAD00ADADAD00ADADAD00ADAD
+      AD00CECECE00EFDE94007B7B7B00A5A584009C9C840073737300D6D6D6009CA5
+      A5009CA5A5009CA5A500CECECE00CECECE00CECECE00CECECE00525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700E7E7E700E7E7E700DEDEDE00DEDEDE00DEDEDE00DEDEDE00DEDE
+      DE00DEDEDE00DEDEDE00D6D6D600D6D6D600D6D6D600D6D6D600D6D6D600CECE
+      CE00CECECE00CECECE00CECECE00CECECE00CECECE00C6C6C600525252000000
+      0000000000000000000000000000000000000000000031313100C6C6C6004242
+      390000000000000000000000000021181800ADADAD004A4A4A005A5A5A007373
+      7300848484009C949400ADADAD00C6BDBD00D6D6D600EFEFEF00E7E7E700DEDE
+      DE00D6D6D600DEDEDE0094948C00E7E7E700EFEFE700EFEFEF00F7EFEF009C9C
+      9C00ADADAD004A4A4A0000000000000000000000000039312900000073000000
+      73000000FF003131FF006B6BFF00211818006B6BFF003131FF000000FF000000
+      7300000073009C9C9400ADADAD00C6BDBD00D6D6D600EFEFEF00E7E7E700DEDE
+      DE00D6D6D600DEDEDE00948C8C00E7E7E700EFEFE700EFEFEF00F7F7EF009C9C
+      9C00ADADAD004A4A4A0000000000000000000000000000000000000000000000
+      0000E7E7E700EFE7B500ADADAD00A5A5A500EFEFEF00D6D6D600ADB5B5007B7B
+      7B00ADAD7B00EFDE9400E7DE8C00E7DE8C00E7DE8C0073737300D6D6D600CECE
+      CE00CECECE00CECECE00CECECE00CECECE00CECECE00C6C6C600525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700E7E7E7005A5A5A005A5A5A006363630063636300636363006B6B
+      6B00D6D6D600D6D6D600D6D6D600D6D6D600D6D6D600CECECE00CECECE00CECE
+      CE00CECECE00CECECE00CECECE00C6C6C600C6C6C600C6C6C600525252000000
+      0000000000000000000000000000000000000000000039313100CEC6C6004A4A
+      4A0000000000000000000000000018101000ADADAD00525252006B6363007B7B
+      7B00948C8C00A5A59C00B5B5B500CECECE00DEDEDE00F7EFEF00E7E7E700E7E7
+      E700E7DEDE00E7E7E700EFE7E700F7EFEF00F7EFEF00F7F7F700FFFFF7009C9C
+      9C00ADADAD004A4A4A0000000000000000000000000000007300000073000000
+      FF003131FF006B6BFF000000000018101000ADADAD006B6BFF003131FF000000
+      FF000000730000007300B5B5B500CECEC600DEDEDE00F7EFEF00E7E7E700E7E7
+      E700DEDEDE00E7E7E700EFE7E700EFEFEF00F7F7EF00F7F7F700FFFFF7009C9C
+      9C00ADADAD004A4A4A0000000000000000000000000000000000000000000000
+      0000E7E7E700EFE7B500ADADAD00A5A5A500EFEFEF00CECECE00ADB5B5007B7B
+      7B00ADADAD00E7DE8C00CECECE007373730073737300CECECE00CECECE00CECE
+      CE00CECECE00CECECE00CECECE00CECECE00C6C6C600C6C6C600525252000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700DEDEDE00DEDEDE00DEDEDE00DEDEDE00DEDEDE00D6D6D600D6D6
+      D600D6D6D600D6D6D600D6D6D600D6D6D600CECECE00CECECE00C6C6C600BDBD
+      BD00B5B5B500B5B5B500B5B5B500B5B5B500B5B5B500B5B5B5004A4A4A000000
+      0000000000000000000000000000000000000000000042424200CECECE005252
+      520000000000000000000000000010100800ADADAD00635A5A00737373008484
+      84009C949400ADADAD00C6BDBD00D6D6D600E7E7E700F7F7F700E7E7E700EFEF
+      EF00EFEFEF00EFEFEF00F7EFEF00F7F7F700FFFFF700FFFFFF00FFFFFF009C9C
+      9C00ADADAD004A4A4A00000000000000000000007300000073000000FF003131
+      FF006B6BFF00000000000000000010101000ADADAD0063635A006B6BFF003131
+      FF000000FF000000730000007300D6D6D600E7E7E700F7F7F700E7E7E700EFEF
+      EF00EFEFEF00EFEFEF00F7F7EF00F7F7F700FFF7F700FFFFFF00FFFFFF009C9C
+      9C00ADADAD004A4A4A0000000000000000000000000000000000000000000000
+      0000E7E7E700EFE7AD00EFE7AD009CA5A500EFEFEF00CECECE00ADB5B5007B7B
+      7B00E7DE8C00E7DE8C00ADAD7B0073737300CECECE00CECECE00C6C6C600BDC6
+      C600BDC6C600ADB5B500ADB5B500ADB5B500ADB5B500ADB5B5004A4A4A000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700DEDEDE00DEDEDE00DEDEDE00DEDEDE00D6D6D600D6D6D600D6D6
+      D600D6D6D600D6D6D600D6D6D600CECECE00CECECE00BDBDBD00A5A5A5009C9C
+      9C0094949400949494009494940094949400949494009C9C9C00424242000000
+      000000000000000000000000000000000000000000004A4A4A00D6D6D6006363
+      630000000000000000000000000010080800ADADAD006B6363007B7B7B00948C
+      8C00A5A59C00B5B5B500CECECE00DEDEDE00D6D6D600ADADAD00CEC6C600C6C6
+      C600FFF7F700FFFFFF00FFFFF700FFFFFF00FFFFFF00FFFFFF00FFFFFF009C9C
+      9C00ADADAD004A4A4A000000000000000000000073000000FF003131FF006B6B
+      FF0000000000000000000000000008080800ADADAD00636363007B7B7B006B6B
+      FF003131FF000000FF0000007300DEDEDE00D6D6D600ADADAD00CECEC600C6C6
+      C600F7F7F700FFFFFF00FFFFF700FFFFFF00FFFFFF00FFFFFF00FFFFFF009C9C
+      9C00ADADAD004A4A4A0000000000000000000000000000000000000000000000
+      0000E7E7E700EFE7AD00EFE7A5009CA5A500EFEFEF00CECECE00ADB5B5007373
+      7300ADAD7B00E7DE8C00E7DE8C0073737300CECECE00BDC6C600A5A5A5009CA5
+      A50094948C008C948C008C948C008C948C0094948C009CA5A500424A4A000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700DEDEDE00DEDEDE00DEDEDE00D6D6D600D6D6D600D6D6D600D6D6
+      D600D6D6D600D6D6D600CECECE00CECECE00C6C6BD00A5A5A500848C8C006B6B
+      6B005A5A5A005A5A5A005A5A5A0063636300737373007B7B7B00393939000000
+      00000000000000000000000000000000000000000000524A5200DED6D600736B
+      6B0000000000000000000000000008080000ADADAD0073737300848484009C9C
+      9400ADADAD00C6BDBD00D6D6D600B5ADAD00B5ADAD00B5B5B500B5B5AD00E7E7
+      E700BDB5B500D6CECE00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009C9C
+      9C00ADADAD004A4A4A0000000000000000000000FF003131FF006B6BFF00736B
+      6B0000000000000000000000000008080800ADADAD00736B6B00848484009C9C
+      94006B6BFF003131FF000000FF00B5ADAD00B5ADAD00B5B5B500B5B5AD00E7E7
+      E700BDB5B500D6CECE00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009C9C
+      9C00ADADAD004A4A4A0000000000000000000000000000000000000000000000
+      0000E7E7E700ADAD7B00ADB5B5009CA5A500A5A5A500ADB5B500ADADAD007373
+      7300ADADAD00ADA57B00ADADAD00CECECE00C6C6C600A5A5A500848484006B6B
+      6B005A5A5A005A5A5A005A5A5A0063636300737373007B7B7B00393939000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700DEDEDE005A5A5A005A5A5A005A5A5A0063636300636363006363
+      6300D6D6D600CECECE00CECECE00CECECE00BDBDBD009C9C9C006B6B6B000808
+      08002121210039393900525252006B6B6B006B6B6B006B6B6B006B6B6B000000
+      0000000000000000000000000000000000000000000052525200DEDEDE007B7B
+      7B0000000000000000000000000000000000ADADAD007B7B7B00948C8C00A5A5
+      9C00B5B5B500B5B5B500B5B5B500BDBDBD00C6BDBD00BDBDBD00B5B5B500DED6
+      D600FFFFFF00E7DEDE009C9C9C00DEDEDE00FFFFFF00FFFFFF00FFFFFF009C9C
+      9C00ADADAD004A4A4A000000000000000000000000006B6BFF00DEDEDE007B7B
+      7B0000000000000000000000000000000000ADADAD007B7B7B00948C8C00A5A5
+      A500B5B5B5006B6BFF00B5B5B500BDBDBD00C6BDBD00C6BDBD00B5B5B500DEDE
+      DE00FFFFFF00DEDEDE009C9C9C00DEDEDE00FFFFFF00FFFFFF00FFFFFF009C9C
+      9C00ADADAD004A4A4A0000000000000000000000000000000000000000000000
+      0000E7E7E700E7E7DE00D6D6D6009CA5A500CECECE00E7E7E700CECECE007373
+      7300CED6D600CECECE00CECECE00CECECE00BDC6C6009CA5A5006B6B6B000808
+      08002121210039393900525252006B6B6B006B6B6B006B6B6B006B6B6B000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700D6D6D600D6D6D600D6D6D600D6D6D600D6D6D600D6D6D600CECE
+      CE00CECECE00CECECE00CECECE00CECECE00B5B5B500949494005A5A5A002121
+      210094949400B5B5B500D6D6D600F7F7F700FFFFFF00A5ADAD00000000000000
+      000000000000000000000000000000000000000000005A5A5A00E7E7E7008484
+      840000000000000000000000000000000000ADADAD00848484009C949400BDBD
+      BD00D6D6D600CECECE00BDBDBD00C6C6C600C6BDBD00ADA5A500B5B5B500BDB5
+      B500B5B5B500DEDEDE00FFFFFF00DEDEDE0084848400D6D6D600FFFFFF009C9C
+      9C00ADADAD004A4A4A0000000000000000000000000063635A00E7E7DE008C84
+      840000000000000000000000000000000000ADADAD00848484009C9C9400BDBD
+      BD00D6D6D600CECEC600BDBDBD00C6C6BD00C6BDBD00ADA5A500B5B5AD00BDB5
+      B500B5B5B500DEDEDE00FFFFFF00DEDEDE0084848400DED6D600FFFFFF009C9C
+      9C00ADADAD004A4A4A0000000000000000000000000000000000000000000000
+      0000E7E7E700D6D6D600D6D6D600D6D6D6009CA5A5009CA5A5009CA5A500CECE
+      CE00CECECE00CECECE00CECECE00CECECE00ADB5B5008C948C005A5A5A002121
+      21008C948C00ADB5B500D6D6D600F7F7F700FFFFFF00ADADAD00000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700D6D6D6005A5A5A005A5A5A005A5A5A0063636300636363006363
+      6300CECECE00CECECE00CECECE00C6C6C600B5B5B500949494005A5A5A003939
+      3900A5A5A500C6C6C600E7E7E700FFFFFF00A5ADAD0000000000000000000000
+      0000000000000000000000000000000000000000000063636300EFE7E7009494
+      8C0000000000000000000000000000000000D6D6D6007B7B7B00C6C6C600EFEF
+      EF00F7EFEF00E7E7E700CECECE00BDBDBD004242420029292100424239007373
+      7300ADA5A500ADA5A500B5ADAD00E7E7E700FFFFF700ADADAD00847B7B00D6D6
+      D600ADADAD004A4A4A0000000000000000000000000063636300EFE7E7009494
+      940000000000000000000000000000000000D6D6D6007B7B7B00C6C6C600EFEF
+      EF00F7EFEF00EFE7E700CECECE00BDBDBD004A4242003129290042393900736B
+      6B00A5A5A500ADADAD00B5ADAD00E7E7E700FFF7F700ADADAD00847B7B00DED6
+      D600ADADAD004A4A4A0000000000000000000000000000000000000000000000
+      0000E7E7E700D6D6D600D6D6D600D6D6D600D6D6D600D6D6D600CECECE00CECE
+      CE00CECECE00CECECE00CECECE00CECECE00ADB5B5008C948C005A5A5A003939
+      3900A5ADAD00C6C6C600E7E7E700FFFFFF00ADADAD0000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700D6D6D600D6D6D600D6D6D600D6D6D600CECECE00CECECE00CECE
+      CE00CECECE00CECECE00C6C6C600C6C6C600B5B5B5008C8C94005A5A5A005252
+      5200BDBDBD00DEDEDE00FFFFFF00A5ADAD000000000000000000000000000000
+      000000000000000000000000000000000000000000006B6B6B00EFEFEF009C9C
+      9C000000000000000000000000000000000000000000EFEFEF00E7E7E700DED6
+      D6009C9C9C00BDB5B500EFEFEF00D6CECE007B7373004A4A4A00292121002921
+      210039313100847B7B00ADA5A500BDB5B500BDBDBD00BDBDBD00E7DEDE00ADAD
+      AD004A4A4A00000000000000000000000000000000006B6B6B00EFEFEF00A59C
+      9C000000000000000000000000000000000000000000EFEFEF00EFE7E700DED6
+      D6009C9C9C00BDB5B500EFEFEF00D6CECE007B7B7B004A4A4200292121002921
+      21003931310084848400A5A5A500BDB5B500C6BDBD00C6BDBD00DEDEDE00ADAD
+      AD004A4A4A000000000000000000000000000000000000000000000000000000
+      0000E7E7E700D6D6D600D6D6D600D6D6D600D6D6D600CECECE00CECECE00CECE
+      CE00CECECE00CECECE00CECECE00C6C6C600ADB5B5008C948C005A5A5A005252
+      5200BDC6C600E7E7DE00FFFFFF00ADADAD000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700D6D6D600D6D6D600CECECE00CECECE00CECECE00CECECE00CECE
+      CE00CECECE00C6C6C600C6C6C600C6C6C600B5B5B5008C8C9400636363006B6B
+      6B00D6D6D600F7F7F700A5ADAD00000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000073736B00F7F7F700ADAD
+      AD0000000000000000000000000000000000000000000000000000000000EFEF
+      EF00D6D6D600948C8C0084848400C6BDBD00D6D6D600ADA5A5007B7B7B005A5A
+      5A006363630084848400B5ADAD00BDB5B500D6D6D600F7F7F7004A4A4A004A4A
+      4A0000000000000000000000000000000000000000006B6B7300F7F7F700ADAD
+      AD0000000000000000000000000000000000000000000000000000000000EFEF
+      EF00D6D6D600948C8C0084848400C6BDBD00DED6D600ADADAD007B7B7B005A5A
+      5A006363630084848400B5ADAD00BDB5B500D6D6D600F7F7F7004A4A4A004A4A
+      4A00000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700D6D6D600D6D6D600CECECE00CECECE00CECECE00CECECE00CECE
+      CE00CECECE00C6C6C600C6C6C600C6C6C600ADB5B5008C948C00636363006B6B
+      6B00D6D6D600F7F7F700ADADAD00000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700D6D6D600CECECE00CECECE00CECECE00CECECE00CECECE00C6C6
+      C600C6C6C600C6C6C600C6C6C600C6C6C600ADADAD009494940073737300848C
+      8C00E7E7E700A5ADAD0000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000007B737300FFF7F700BDB5
+      B500000000000000000000000000000000000000000000000000000000000000
+      000000000000EFEFEF00D6CECE008C8C8C008C8C8400C6C6C600DED6D600BDB5
+      B500BDB5B500BDBDBD00D6CECE00F7EFEF004A4A4A004A4A4A00000000000000
+      000000000000000000000000000000000000000000007B7B7B00F7F7F700BDB5
+      B500000000000000000000000000000000000000000000000000000000000000
+      000000000000EFEFEF00D6CECE00948C8C008C8C8400C6C6C600DED6D600BDB5
+      B500BDB5B500BDBDBD00CECECE00F7F7EF004A4A4A004A4A4A00000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700D6D6D600CECECE00CECECE00CECECE00CECECE00CECECE00CECE
+      CE00C6C6C600C6C6C600C6C6C600C6C6C600ADADAD0094948C0073736B008484
+      8400E7E7E700ADADAD0000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700CECECE00CECECE00CECECE00CECECE00CECECE00C6C6C600C6C6
+      C600C6C6C600C6C6C600C6C6C600C6C6C600B5B5B5009C9C9C00848C8C009C9C
+      9C00A5ADAD000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000007B7B7B00FFFFFF00C6BD
+      BD00000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000EFEFEF00CECECE008C8C8400B5B5B500BDBD
+      BD00CECECE00EFEFEF004A4A4A004A4A4A000000000000000000000000000000
+      000000000000000000000000000000000000000000007B7B8400FFFFFF00C6C6
+      BD00000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000EFEFEF00CECECE008C8C8400B5B5B500BDBD
+      BD00CECECE00EFEFEF004A4A4A004A4A4A000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700CECECE00CECECE00CECECE00CECECE00CECECE00CECECE00C6C6
+      C600C6C6C600C6C6C600C6C6C600BDC6C600ADB5B5009CA5A5008484840094AD
+      9C00ADADAD000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700E7E7E700E7E7E700E7E7E700E7E7E700E7E7E700E7E7E700E7E7
+      E700E7E7E700E7E7E700E7E7E700E7E7E700DEDEDE00CECECE00BDBDBD00A5AD
+      AD00000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000084847B00FFFFFF00CEC6
+      C600000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000F7EFEF00EFE7E700F7EF
+      EF00313129004242420000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000847B7B00FFFFFF00CEC6
+      C600000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000F7F7EF00EFE7E700F7EF
+      EF00393129004A42420000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000E7E7E700E7E7E700E7E7E700E7E7E700E7E7E700E7E7E700E7E7E700E7E7
+      E700E7E7E700E7E7E700E7E7E700E7E7E700D6D6D600CECECE00BDC6C600ADAD
+      AD00000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000001008
+      0800000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000001008
+      0800000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000424D3E000000000000003E000000
+      2800000080000000400000000100010000000000000400000000000000000000
+      000000000000000000000000FFFFFF00FFFFFFFF000000000000000000000000
+      F000001F000000000000000000000000F000001F000000000000000000000000
+      F000001F000000000000000000000000F000001F000000000000000000000000
+      F000001F000000000000000000000000F000001F000000000000000000000000
+      F000001F000000000000000000000000F000001F000000000000000000000000
+      F000001F000000000000000000000000F000001F000000000000000000000000
+      F000001F000000000000000000000000F000001F000000000000000000000000
+      F000001F000000000000000000000000F000001F000000000000000000000000
+      F000001F000000000000000000000000F000001F000000000000000000000000
+      F000001F000000000000000000000000F000001F000000000000000000000000
+      F000001F000000000000000000000000F000001F000000000000000000000000
+      F000001F000000000000000000000000F000001F000000000000000000000000
+      F000001F000000000000000000000000F000003F000000000000000000000000
+      F000007F000000000000000000000000F00000FF000000000000000000000000
+      F00001FF000000000000000000000000F00003FF000000000000000000000000
+      F00007FF000000000000000000000000F0000FFF000000000000000000000000
+      FFFFFFFF000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      F000001FFFFF8FFFFFFF8FFFF000001FF000001F8FFE03FF8FFE03FFF000001F
+      F000001F8FF800FF8FF800FFF000001FF000001F8FE0003F8FE0003FF000001F
+      F000001F8F80000F8F80000FF000001FF000001F8F0000078F000007F000001F
+      F000001F8E0000038E000003F000001FF000001F8E0000030E000003F000001F
+      F000001F8E0000030E000003F000001FF000001F8E00000306000003F000001F
+      F000001F8E00000382000003F000001FF000001F8E00000380000003F000001F
+      F000001F8000000380000003F000001FF000001FC0000003C0000003F000001F
+      F000001FE0000003E0000003F000001FF000001FC0000003C0000003F000001F
+      F000001F8000000380000003F000001FF000001F8E00000380000003F000001F
+      F000001F8E00000382000003F000001FF000001F8E00000306000003F000001F
+      F000001F8E0000030E000003F000001FF000001F8E0000030E000003F000001F
+      F000001F8E0000038E000003F000001FF000003F8E0000038E000003F000003F
+      F000007F8E0000038E000003F000007FF00000FF8F0000078F000007F00000FF
+      F00001FF8F80000F8F80000FF00001FFF00003FF8FE0003F8FE0003FF00003FF
+      F00007FF8FF800FF8FF800FFF00007FFF0000FFF8FFE03FF8FFE03FFF0000FFF
+      FFFFFFFFFFFF8FFFFFFF8FFFFFFFFFFF00000000000000000000000000000000
+      000000000000}
+  end
+end

+ 166 - 0
SRC/FrmMainF.h

@@ -0,0 +1,166 @@
+
+//---------------------------------------------------------------------------
+#ifndef FrmMainFH
+#define FrmMainFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <ComCtrls.hpp>
+#include <ExtCtrls.hpp>
+#include <Graphics.hpp>
+#include <Grids.hpp>
+#include <ImgList.hpp>
+#include <ToolWin.hpp>
+#include <psapi.h>
+#include <tlhelp32.h>
+
+//#include "AppGlobalF.h"
+//#include "FrmMainCommF.h"
+#include "VmsPasigProtocolF.h"
+
+
+//---------------------------------------------------------------------------
+
+typedef enum eEN_SEND_MSG
+{
+	SEND_MSG_NONE    = 0x00,     /* 없음 */
+	SEND_MSG_PROCESS = 0x01,     /* 프로세스 */
+	SEND_MSG_EQUIP   = 0x02      /* 시설물 */
+} EN_SEND_MSG;
+
+//---------------------------------------------------------------------------
+class TFrmMain : public TForm
+{
+__published:	// IDE-managed Components
+	TImageList *ilMenu;
+	TTimer *tmrAppState;
+    TImageList *ImageListScope;
+    TImageList *ImglstTvMvps;
+    TToolBar *tobMenu;
+    TToolButton *tbConnect;
+    TToolButton *tbSeparator1;
+    TToolButton *tbDisconnect;
+    TToolButton *tbSeparator2;
+    TToolButton *tbOptions;
+    TToolButton *tbSeparator3;
+    TPanel *plBottom;
+    TPanel *plStateAction;
+    TPanel *plStateComm;
+    TPanel *plStateDb;
+    TPanel *plTime;
+    TPanel *Panel1;
+    TPanel *pnlLog;
+    TPanel *pnlVms;
+    TSplitter *Splitter1;
+    TPanel *Panel16;
+    TPanel *plThread;
+    TPanel *plMemory;
+    TPanel *plGdi;
+    TPanel *plHandle;
+    TPanel *Panel2;
+    TImageList *ImageList1;
+
+    /*
+    *  프로그램에 공통적으로 사용되는 폼이벤트
+    */
+	void __fastcall FormCreate(TObject *Sender);
+	void __fastcall FormShow(TObject *Sender);
+	void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose);
+	void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
+	void __fastcall tmrAppStateTimer(TObject *Sender);
+
+	/*
+    *  메뉴 핸들러
+    */
+	void __fastcall tbConnectClick(TObject *Sender);
+	void __fastcall tbDisconnectClick(TObject *Sender);
+	void __fastcall tbOptionsClick(TObject *Sender);
+    void __fastcall Panel16DblClick(TObject *Sender);
+    void __fastcall plStateDbDblClick(TObject *Sender);
+    void __fastcall plStateActionDblClick(TObject *Sender);
+
+private:	// User declarations
+    int             m_bAction;      /* 동작 상태 */
+    int             m_bComm;        /* 통신 상태 */
+	int             m_bDB;          /* DB 상태 */
+	BYTE            FSendMsg;       /* send message */
+
+    bool            FServerRun;     //서버 기동/정지
+    DWORD           FTickState;     //주기체크 틱
+
+	char            m_oTimer[15];   /* ON/OFF Timer */
+	char            m_tTimer[15];   /* Traffic Timer */
+	TDateTime       m_rTimer;       /* timer for receiver */
+
+    int             FCur5Min;
+    int             FCurHour;
+    int             FCurMin;
+    int             FCurSec;
+    bool            FOneMinCycle;
+
+	DWORD   m_CommThreadID;     /* 통신 데이터 처리 스레드 ID */
+	unsigned int m_CommHandle;  /* 통신 데이터 처리 스레드 핸들 */
+
+	bool __fastcall InitApplication(void);
+	void __fastcall CommClose();
+
+    bool __fastcall StartJobThread();
+    void __fastcall AutoClose();
+
+	void __fastcall TerminateApplication(void);
+	void __fastcall UpdateProcessStatePanel();
+	void __fastcall CheckCommState();
+
+	int __fastcall SendProcessState(void);
+	void __fastcall SendInitial(void);
+	void __fastcall SendTerminal(void);
+
+public:
+    int __fastcall SendDbThreadMessage(UINT Msg, int wParam, int lParam);
+	int __fastcall SendDbThreadDataMessage(UINT Msg, void *pData, int iLen);
+	int __fastcall SendVmsThreadMessage(BYTE *AVmsId, IPCUDPMESSAGESTRUCT *ARcvData, BYTE AOpCode, char *AData);
+
+	void __fastcall ClientResponse(int Flag, CLIENT_COMMAND *pReq, int error, void *pData);
+	bool __fastcall CheckBasisTime(char *p, int Cycle, int Basis);
+
+	void __fastcall ProvideEvent(int Type, BYTE *pVmsId, BYTE Mode);
+	void __fastcall CheckProvideSave();
+	/* 101 Begin */
+	bool __fastcall CheckResource(size_t MaxMemory, DWORD MaxHandle, DWORD MaxThread, DWORD MaxGdi);
+	/* 101 End */
+
+    IPC_LOG_MESSAGE FLogMsg;
+    int LogWrite(int ALogKind, char *AFmt, ...);
+
+public:		// User declarations
+	__fastcall TFrmMain(TComponent* Owner);
+
+    size_t FMemSize;
+
+    void __fastcall LoadOldVmsInfo();
+    void __fastcall LoadFtpVmsInfo();
+    void __fastcall LoadFontVmsInfo();
+    void __fastcall LoadBitmapVmsInfo();
+    TVmsCtlr* __fastcall FindVms(AnsiString AVmsId);
+
+    int __fastcall ChangePosition(TVmsFormObj *AVmsObj);
+    int __fastcall MakeVmsDownloadForm();
+    int __fastcall MakeVmsDatabaseForm(TVmsCtlr *AObj);
+
+	void __fastcall OnWMUserMessage(TMessage &Msg);
+    void __fastcall OnUdpDataRecvMessage(TMessage &Msg);
+    void __fastcall OnVmsThreadMessage(TMessage &Msg);
+
+	BEGIN_MESSAGE_MAP
+		MESSAGE_HANDLER(WM_USER,           TMessage, OnWMUserMessage)
+        MESSAGE_HANDLER(WM_VCOMMDATA_RECV, TMessage, OnUdpDataRecvMessage)
+        MESSAGE_HANDLER(WM_VMS_THREAD,     TMessage, OnVmsThreadMessage)
+	END_MESSAGE_MAP(TForm)
+
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TFrmMain *FrmMain;
+//---------------------------------------------------------------------------
+#endif

BIN
SRC/RESOURCE/NETHOOD.ICO


+ 246 - 0
SRC/SysGlobalF.cpp

@@ -0,0 +1,246 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+//---------------------------------------------------------------------------
+#include <vcl.h>
+#include <assert.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <memory.h>
+#include <Systobj.h>
+#include <winsock.h>
+#include <time.h>
+#include <inifiles.hpp>
+#include <math.h>
+
+//---------------------------------------------------------------------------
+#include "SysGlobalF.h"
+
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+
+//---------------------------------------------------------------------------
+
+String           g_sAppDir  = "";       // Application Directory
+String           g_sAppName = "";       // Program name
+String           g_sCfgDir  = "";       // Program Config Directory
+String           g_sLogDir  = "";       // Program Log Directory
+String           g_sTempDir = "";       // Program Temp Directory
+String           g_sImgDir = "";        // Program Image Directory
+String           g_sFormDir = "";       // Program Form Directory
+String           g_sFtpDir  = "";       // Application Directory
+//---------------------------------------------------------------------------
+
+/*
+ * 응용프로그램이 중복으로 실행되는 것을 막기위해 뮤텍스를 생성한다.
+ *  arguments
+ *
+ *  return
+ *      void
+ */
+bool SYS_ApplicationSingleInstance(AnsiString AProgName, AnsiString APidFile)
+{
+    bool       isRunning = false;
+    HANDLE     hMutex = 0;
+	AnsiString sMutexName;
+
+	sMutexName = "Global\\" + AProgName;
+
+	hMutex = CreateMutex(NULL, TRUE, sMutexName.c_str());
+    if (hMutex && GetLastError() == ERROR_ALREADY_EXISTS)
+    {
+        char buffer[1000];
+
+        ReleaseMutex(hMutex);
+        hMutex=0;
+        isRunning = true;
+
+        ////////////////////////////////////////////////////////////////////////////
+
+        AnsiString fn;
+        char tmp[500];
+
+        if (FileExists(APidFile))
+        {
+            TFileStream *fp = new TFileStream(APidFile, fmOpenRead);
+            HWND hwnd;
+            AnsiString nfo;
+
+            memset(buffer, 0, 1000);
+            fp->Read(buffer, 100);
+            delete fp;
+
+            hwnd = (HWND)(String(buffer).ToIntDef(0));
+            if (hwnd)
+            {
+                SendMessage(hwnd, WM_USER, WM_WINDOW_RESTORE, 0);
+            }
+        }
+    }
+
+    if (hMutex)
+    {
+        ReleaseMutex(hMutex);
+        hMutex=0;
+    }
+
+    return isRunning;
+}
+//---------------------------------------------------------------------------
+
+/*
+ * 응용프로그램의 중복실행을 막기위해 응용프로그램이 실행되면
+ * 프로세스(윈도우핸들) 정보를 파일에 저장한다.
+ *  arguments
+ *
+ *  return
+ *      void
+ */
+void SYS_WritePidFile(long AHandle)
+{
+	char   tmp[500];
+    String sPidFile;
+
+    sPidFile = g_sCfgDir + ChangeFileExt(ExtractFileName(Application->ExeName), ".pid");
+
+    try
+    {
+        TFileStream *fp = new TFileStream(sPidFile, fmCreate);
+        memset(tmp, 0x00, sizeof(tmp));
+        sprintf(tmp, "%d", (long)AHandle);
+        fp->Write(tmp, strlen(tmp));
+        delete fp;
+    }
+    catch(Exception &e)
+    {
+    }
+}
+//---------------------------------------------------------------------------
+
+/*
+ * 환경설정 정보를 저장하는 함수.
+ *  arguments
+ *      String : RegisterKey 또는 파일이름
+ *  return
+ *      bool : 실패하면 false
+ */
+bool SYS_WriteConfigInfo(String sTitle, String sItem, String sValue, String sCfgFile/*=""*/)
+{
+	String	 ConfigFile;
+	TIniFile *pIniFile = NULL;
+
+    ConfigFile = sCfgFile;
+
+    try
+    {
+        pIniFile = new TIniFile(ConfigFile);
+        if (pIniFile == NULL)
+        {
+            return false;
+        }
+
+        pIniFile->WriteString(sTitle, sItem, sValue);
+    }
+    catch(...)
+    {
+    }
+
+    if (pIniFile)
+    {
+        pIniFile->Free();
+        pIniFile = NULL;
+    }
+
+	return true;
+}
+//---------------------------------------------------------------------------
+
+/*
+ * 환경설정 정보를 읽어오는 함수.
+ *  arguments
+ *      String : RegisterKey 또는 파일이름
+ *  return
+ *      bool : 실패하면 false
+ */
+bool ReadConfigInfo(String sTitle, String sItem, String &sValue, String sCfgFile/*=""*/)
+{
+    bool     bRes;
+	String   ConfigFile;
+	TIniFile *pIniFile = NULL;
+
+    bRes = false;
+    ConfigFile = sCfgFile;
+
+    try
+    {
+        pIniFile = new TIniFile(ConfigFile);
+        if (pIniFile == NULL)
+        {
+            return bRes;
+        }
+
+        sValue = pIniFile->ReadString(sTitle, sItem, "");
+        if (sValue != "")
+        {
+            bRes = true;
+        }
+    }
+    catch(...)
+    {
+    }
+
+    if (pIniFile)
+    {
+        pIniFile->Free();
+        pIniFile = NULL;
+    }
+
+	return bRes;
+}
+//---------------------------------------------------------------------------
+
+String SYS_GetSysError()
+{
+    AnsiString sErrMsg  = "";
+    LPVOID     lpMsgBuf = NULL;
+
+    try
+    {
+        try
+        {
+            FormatMessage(
+                FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
+                NULL,
+                GetLastError(),
+                //MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+                MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT),
+                (LPTSTR) &lpMsgBuf,
+                0,
+                NULL
+            );
+
+            char *pData = (char*)lpMsgBuf;
+            if (strlen(pData) > 2)
+            {
+                pData[strlen(pData)-2] = 0x00;
+                pData[strlen(pData)-1] = 0x00;
+            }
+            sErrMsg = AnsiString(pData);
+        }
+        __finally
+        {
+            if (lpMsgBuf) LocalFree(lpMsgBuf);
+            lpMsgBuf = NULL;
+        }
+    }
+    catch(Exception &e)
+    {
+    }
+    return sErrMsg;
+}
+//---------------------------------------------------------------------------
+

+ 169 - 0
SRC/SysGlobalF.h

@@ -0,0 +1,169 @@
+//---------------------------------------------------------------------------
+
+#ifndef SysGlobalFH
+#define SysGlobalFH
+//---------------------------------------------------------------------------
+#include <vcl.h>
+#include <assert.h>
+#include <stdio.h>
+#include <windef.h>
+//---------------------------------------------------------------------------
+
+/*
+******************************************************************************
+* Define
+******************************************************************************
+*/
+#define     SAFE_DELETE(p)          {if (p != NULL) { delete p; p = NULL; }}
+
+/*
+******************************************************************************
+* Define constant
+******************************************************************************
+*/
+#define     MAINHANDLE                  Application->MainForm->Handle
+
+// SendMessageTimeout
+#define     SEND_LOGMSG(a,b,c,d,e,f,g)  ::SendMessageTimeout(a, b, (WPARAM)c, (LPARAM)d, e, f, &g)
+//#define     SEND_LOGMSG(a,b,c,d,e,f,g)  ::PostMessage(a, b, (WPARAM)c, (LPARAM)d)
+
+#define     SEND_MSG(x,y,z,p)           ::SendMessage(x, y,       (WPARAM)z, (LPARAM)p)
+#define     POST_MSG(x,y,z,p)           ::PostMessage(x, y,       (WPARAM)z, (LPARAM)p)
+#define     USER_MSG(x,y,z)             ::PostMessage(x, WM_USER, (WPARAM)y, (LPARAM)p)
+
+#define     WM_WINDOW_RESTORE           (WM_USER+0xA0)      /* 중복실행시 기존 윈도우 활성화 */
+
+#define     WM_THREAD                   (WM_USER+0xF1)      /* 스레드 연계 메시지 */
+#define     WM_TCP_CLIENT               (WM_USER+0xF2)      /* TCP Client */
+#define     WM_TCP_SERVER               (WM_USER+0xF3)      /* TCP Client */
+#define     WM_VMS_THREAD               (WM_USER+0xF4)
+
+#define     WM_VMS_SERVER_STTS          (WM_USER+0xB2)      // VMS 접속/해제(통신스레드->메인)
+#define     WM_VMS_CLIENT_STTS          (WM_USER+0xB3)      // VMS 접속/해제(통신스레드->메인)
+#define     WM_VMS_STATE_STTS           (WM_USER+0xB4)      // VMS 상태정보 업데이트
+
+// 스레드 종료 대기 시간
+#define     WAIT_THREAD_TERMINATE_TIME  5000    // Wait Thread Terminate Time(5 seconds)
+
+/*
+******************************************************************************
+* 스레드로 전달하는 메시지
+******************************************************************************
+*/
+#define     WM_EQUIP_STATE_ALL          (WM_USER+0xB2)      /* 시설물상태 개별 입력 */
+#define     WM_EQUIP_STATE              (WM_USER+0xC2)      /* 시설물상태 전체 입력 */
+
+#define     WM_DATABASE_CLOSE           (WM_USER+0xA0)      /* DATABASE CLOSE */
+#define     WM_DATABASE_REFLASH         (WM_USER+0xA1)      /* DATABASE REFLASH */
+#define     WM_DATABASE_OPEN            (WM_USER+0xA2)      /* DATABASE OPEN */
+#define     WM_LOG_DISPLAY              (WM_USER+0xA3)      /* LOG DISPLAY */
+
+#define     WM_MASTER_FORM              (WM_USER+0xD1)      /* 폼정보 변경 */
+#define     WM_MASTER_IMAGE_SYMBOL      (WM_USER+0xD2)      /* 폼이미지정보 변경 */
+#define     WM_MASTER_IMAGE_TRAFFIC     (WM_USER+0xD3)      /* 폼이미지소통정보 변경 */
+#define     WM_MASTER_VMS_IFSC          (WM_USER+0xD4)      /* VMS IFSC 정보 변경 */
+
+#define     WM_DATA_SAVE                (WM_USER+0xA8)      /* 데이터 저장 */
+#define     WM_GET_ONOFF                (WM_USER+0xA9)      /* VMS ON/OFF */
+#define     WM_PROVIDE_PROC             (WM_USER+0xAA)      /* VMS 교통정보 */
+#define     WM_PROVIDE_SAVE             (WM_USER+0xAB)      /* VMS 제공정보 저장 */
+#define     WM_DOWNLOAD_PROC            (WM_USER+0xAC)      /* VMS 다운로드 */
+
+#define     WM_MAKE_DOWNLOAD_FORM       (WM_USER+0xAD)      /* VMS 다운로드폼 생성 */
+#define     WM_SAVE_DOWNLOAD_FORM       (WM_USER+0xAE)      /* VMS 다운로드폼 저장 */
+
+/*
+******************************************************************************
+* User Define
+******************************************************************************
+*/
+typedef enum eLOG_TYPE
+{
+    LLOG     = 3,
+    LJOB     = 5,
+    LWARNING = 6,
+    LERROR   = 7,
+    LALARM   = 8,
+} LOG_TYPE;
+//---------------------------------------------------------------------------
+
+typedef struct tagThreadInfo
+{
+    TThread     *pThread;
+    DWORD        dwThreadId;
+    unsigned int nHandle;
+    bool         bRunning;
+public:
+    void Clear()
+    {
+        pThread    = NULL;
+        dwThreadId = 0;
+        nHandle    = 0;
+        bRunning   = false;
+    }
+} THREAD_INFO;
+//---------------------------------------------------------------------------
+
+typedef struct tagDatabaseInfo
+{
+    String  sProvider;
+    String  sServerName;
+    String  sCatalog;
+    String  sUserName;
+    String  sPassword;
+    String  sConnectStr;
+public:
+    void Clear()
+    {
+        sProvider   = "";
+        sServerName = "";
+        sCatalog    = "";
+        sUserName   = "";
+        sPassword   = "";
+        sConnectStr = "";
+    }
+    void MakeConnString()
+    {
+        sConnectStr  = "";
+        sConnectStr += "Provider="         + sProvider;
+        sConnectStr += ";Password="        + sPassword;
+        sConnectStr += ";Persist Security Info=True";
+        sConnectStr += ";User ID="         + sUserName;
+        if (sCatalog != "")
+        {
+            sConnectStr += ";Initial Catalog=" + sCatalog;
+        }
+        sConnectStr += ";Data Source="     + sServerName;
+    }
+} DATABASE_INFO;
+//---------------------------------------------------------------------------
+
+/*
+******************************************************************************
+* Global variable definitions
+******************************************************************************
+*/
+extern String           g_sAppDir ;       // Application Directory
+extern String           g_sAppName;       // Program name
+extern String           g_sCfgDir ;       // Program Config Directory
+extern String           g_sLogDir ;       // Program Log Directory
+extern String           g_sTempDir;       // Program Temp Directory
+extern String           g_sImgDir;        // Program Image Directory
+extern String           g_sFormDir;       // Program Form Directory
+extern String           g_sFtpDir ;       // Application Directory
+
+/*
+******************************************************************************
+* Global function definitios
+******************************************************************************
+*/
+bool SYS_ApplicationSingleInstance(AnsiString AProgName, AnsiString APidFile);
+void SYS_WritePidFile(long AHandle);
+
+bool SYS_WriteConfigInfo(String sTitle, String sItem, String sValue, String sCfgFile="");
+bool ReadConfigInfo(String sTitle, String sItem, String &sValue, String sCfgFile="");
+
+String SYS_GetSysError();
+
+
+#endif

File diff suppressed because it is too large
+ 23 - 0
SRC/VMSCommServer.cbproj


+ 123 - 0
SRC/VMSCommServer.cpp

@@ -0,0 +1,123 @@
+
+//---------------------------------------------------------------------------
+#define COMM_EXCEPTION_MESSAGE    0
+//---------------------------------------------------------------------------
+
+#include "AppGlobalF.h"
+#include <tchar.h>
+//---------------------------------------------------------------------------
+USEFORM("FRM\FrmVmsInfoF.cpp", FrmVmsInfo);
+USEFORM("FRM\FrmSysLogF.cpp", FrmSysLog);
+USEFORM("FRM\FrmOptionF.cpp", FrmOption);
+USEFORM("FrmMainF.cpp", FrmMain);
+USEFORM("FRM\FrmVmsLogF.cpp", FrmVmsLog);
+USEFORM("DM\DMCOMMF.cpp", DMCOMM); /* TDataModule: File Type */
+//---------------------------------------------------------------------------
+WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
+{
+    DateSeparator = '-';
+    TimeSeparator = ':';
+    ShortDateFormat ="yyyy-MM-dd";
+    ShortTimeFormat = "hh:nn:ss";
+    LongTimeFormat  = "hh:nn:ss";
+
+    int nPid   = (int)GetCurrentProcessId();
+    g_sAppDir  = ExtractFilePath(Application->ExeName);
+    g_sAppName = ChangeFileExt(ExtractFileName(Application->ExeName), "");
+    g_sCfgDir  = g_sAppDir + "Cfg\\";
+    g_sLogDir  = g_sAppDir + "Log\\";
+    g_sTempDir = g_sAppDir + "Temp\\";
+    g_sImgDir  = g_sAppDir + "Image\\";
+    g_sFtpDir  = g_sAppDir + "Ftp\\";
+    g_sFormDir = g_sAppDir + "Form\\";
+
+    ForceDirectories(g_sCfgDir.c_str());
+    ForceDirectories(g_sLogDir.c_str());
+    ForceDirectories(g_sTempDir.c_str());
+    ForceDirectories(g_sImgDir.c_str());
+    //ForceDirectories(g_sFtpDir.c_str());
+    ForceDirectories(g_sFormDir.c_str());
+
+    String sTmpDir = g_sLogDir + "Comm\\";
+    ForceDirectories(sTmpDir.c_str());
+
+    ChDir(g_sAppDir);
+    g_AppCfg.Clear();
+    APP_LoadConfigInfo();
+
+    ITSLog = new TITSLog(g_sLogDir,          g_sAppName,  g_AppCfg.sLogDay);
+    FDbLog = new TITSLog(g_sLogDir + "Db\\", "Database",  g_AppCfg.sLogDay);
+    ITSLog->FLogCfg = g_LogCfg;
+    FDbLog->FLogCfg = g_LogCfg;
+    LOGINFO("VMSCommServer Start....");
+
+
+	try
+	{
+        AnsiString sPidFile   = ChangeFileExt(ExtractFileName(Application->ExeName), ".pid");
+        AnsiString sMutexName = "HANTE_VMSCommServerPasig.lock";
+        if (SYS_ApplicationSingleInstance(sMutexName, g_sCfgDir+sPidFile))
+        {
+            LOGWARN("Program already running. program exit...");
+#if 0
+            int    nMsgType  = MB_OK|MB_ICONERROR|MB_APPLMODAL;
+            String sMsgTitle = g_AppCfg.sTitle;
+            String sMsgError = ExtractFileName(Application->ExeName) + "\r\nProgram is already running.\r\nPlease check the program in the task manager.";
+
+            Application->MessageBox(sMsgError.c_str(), sMsgTitle.c_str(), nMsgType);
+#endif
+            return 0;
+        }
+    }
+    catch (Exception &exception)
+    {
+        //Application->ShowException(&exception);
+        return 0;
+    }
+
+    /* allocate memory for system */
+    if ((g_SysInfo = (SYSTEM_INFORMATION *) malloc(sizeof(SYSTEM_INFORMATION))) == NULL)
+    {
+        return 0;
+    }
+    memset(g_SysInfo, 0x00, sizeof(SYSTEM_INFORMATION));
+
+	try
+	{
+		Application->Initialize();
+		Application->MainFormOnTaskBar = true;
+		Application->Title = "PASIG City - VMS Communication Server";
+         Application->CreateForm(__classid(TFrmMain), &FrmMain);
+         Application->CreateForm(__classid(TDMCOMM), &DMCOMM);
+         Application->CreateForm(__classid(TFrmVmsLog), &FrmVmsLog);
+         Application->Run();
+	}
+	catch (Exception &exception)
+	{
+		#if COMM_EXCEPTION_MESSAGE
+		Application->ShowException(&exception);
+		#endif
+	}
+	catch (...)
+	{
+		#if COMM_EXCEPTION_MESSAGE
+		try
+		{
+			throw Exception("");
+		}
+		catch (Exception &exception)
+		{
+			Application->ShowException(&exception);
+		}
+		#endif
+	}
+
+	//g_Log->WriteLog(LOG_INFO, "VMSCommSvr End...");
+    LOGINFO("VMSCommServer End....");
+
+    /* free memory */
+    free(g_SysInfo);
+
+	return 0;
+}
+//---------------------------------------------------------------------------

BIN
SRC/VMSCommServer.res


Some files were not shown because too many files changed in this diff