Quellcode durchsuchen

cmra connect reset

shjung vor 1 Jahr
Ursprung
Commit
9c9080f301
35 geänderte Dateien mit 6807 neuen und 164 gelöschten Zeilen
  1. 5 1
      LIB/AppGlobalF.h
  2. BIN
      LIB/VmsCommonLib.lib
  3. 3 0
      RUN/Option.ini
  4. 393 0
      VmsCmraViewer - 20240801/SRC/CDSMonitoringObjF.cpp
  5. 110 0
      VmsCmraViewer - 20240801/SRC/CDSMonitoringObjF.h
  6. 397 0
      VmsCmraViewer - 20240801/SRC/DMDbF.cpp
  7. 7 0
      VmsCmraViewer - 20240801/SRC/DMDbF.dfm
  8. 55 0
      VmsCmraViewer - 20240801/SRC/DMDbF.h
  9. 146 0
      VmsCmraViewer - 20240801/SRC/FrmCameraFullScreenF.cpp
  10. 68 0
      VmsCmraViewer - 20240801/SRC/FrmCameraFullScreenF.dfm
  11. 45 0
      VmsCmraViewer - 20240801/SRC/FrmCameraFullScreenF.h
  12. 42 0
      VmsCmraViewer - 20240801/SRC/FrmCameraInfoF.cpp
  13. 106 0
      VmsCmraViewer - 20240801/SRC/FrmCameraInfoF.dfm
  14. 42 0
      VmsCmraViewer - 20240801/SRC/FrmCameraInfoF.h
  15. 459 0
      VmsCmraViewer - 20240801/SRC/FrmCameraPlayerF.cpp
  16. 351 0
      VmsCmraViewer - 20240801/SRC/FrmCameraPlayerF.dfm
  17. 93 0
      VmsCmraViewer - 20240801/SRC/FrmCameraPlayerF.h
  18. 269 0
      VmsCmraViewer - 20240801/SRC/FrmCameraScreenF.cpp
  19. 52 0
      VmsCmraViewer - 20240801/SRC/FrmCameraScreenF.dfm
  20. 64 0
      VmsCmraViewer - 20240801/SRC/FrmCameraScreenF.h
  21. 434 0
      VmsCmraViewer - 20240801/SRC/FrmVmsCmraViewerF.cpp
  22. 3032 0
      VmsCmraViewer - 20240801/SRC/FrmVmsCmraViewerF.dfm
  23. 173 0
      VmsCmraViewer - 20240801/SRC/FrmVmsCmraViewerF.h
  24. 33 0
      VmsCmraViewer - 20240801/VmsCmraViewer.cbproj
  25. 141 0
      VmsCmraViewer - 20240801/VmsCmraViewer.cpp
  26. BIN
      VmsCmraViewer - 20240801/VmsCmraViewer.res
  27. BIN
      VmsCmraViewer - 20240801/empty-image.png
  28. 2 1
      VmsCmraViewer/SRC/CDSMonitoringObjF.h
  29. 147 70
      VmsCmraViewer/SRC/FrmCameraPlayerF.cpp
  30. 16 2
      VmsCmraViewer/SRC/FrmCameraPlayerF.dfm
  31. 12 2
      VmsCmraViewer/SRC/FrmCameraPlayerF.h
  32. 87 87
      VmsCmraViewer/VmsCmraViewer.cbproj
  33. 13 0
      VmsCommonLib/AppGlobalF.cpp
  34. 5 1
      VmsCommonLib/AppGlobalF.h
  35. 5 0
      VmsCommonLib/FRM/VMSVIEWMF.cpp

+ 5 - 1
LIB/AppGlobalF.h

@@ -157,6 +157,9 @@ typedef struct tag_AppConfig
 
     bool isLoadFromFile;
 
+    int cmraViewerResetMin;
+    int cmraViewerDelaySec;
+
     String MAGIC_ID;
     String OPER_ID;
     String PRCS_ID;
@@ -167,7 +170,8 @@ typedef struct tag_AppConfig
 
 } APP_CONFIG;
 
-#define DEFAULT_PRCS_ID     "P08010"
+#define MAX_CMRA_VIEW_CAMERA    20
+#define DEFAULT_PRCS_ID         "P08010"
 
 /*
 ******************************************************************************

BIN
LIB/VmsCommonLib.lib


+ 3 - 0
RUN/Option.ini

@@ -19,6 +19,9 @@ NAME=ORCL
 USER=ICAIR
 PASS=ICAIR
 
+[CMRA_VIEWER]
+RESET_TIMER=0
+
 [VMS_FTP]
 SERVER  =127.0.0.1
 PORT    =3600

+ 393 - 0
VmsCmraViewer - 20240801/SRC/CDSMonitoringObjF.cpp

@@ -0,0 +1,393 @@
+//---------------------------------------------------------------------------
+
+#pragma hdrstop
+
+#include "AppGlobalF.h"
+#include "CDSMonitoringObjF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+//---------------------------------------------------------------------------
+TMonitoringScreenManager *ObjScreenManager = NULL;
+//---------------------------------------------------------------------------
+
+TMonitoringScreenManager::TMonitoringScreenManager()
+{
+}
+//---------------------------------------------------------------------------
+TMonitoringScreenManager::~TMonitoringScreenManager()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+void TMonitoringScreenManager::Init()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+
+
+//---------------------------------------------------------------------------
+TMonitoringCtlrManager *ObjCtlrManager = NULL;
+//---------------------------------------------------------------------------
+
+TMonitoringCtlrManager::TMonitoringCtlrManager(int AMonitoringType)
+{
+    FMonitoringType = AMonitoringType;
+}
+//---------------------------------------------------------------------------
+TMonitoringCtlrManager::~TMonitoringCtlrManager()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+
+bool TMonitoringCtlrManager::LoadCtlrFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    try
+    {
+        FLists.Lock();
+        FLists.RemoveAll();
+    }
+    __finally
+    {
+        FLists.UnLock();
+    }
+
+    FLists.Lock();
+    try
+    {
+        FOR_STL(TVmsCtlr*, pVmsObj, VmsCtlrManager->FLists) {
+            TMonitoringCtlr *pObj = new TMonitoringCtlr();
+
+            pObj->CTLR_NMBR = pVmsObj->VMS_CTLR_ID;
+            pObj->ID        = pVmsObj->VMS_CTLR_ID;
+            pObj->CTLR_ID   = pVmsObj->VMS_CTLR_ID;
+            pObj->NAME      = pVmsObj->VMS_NM;
+            pObj->CTLR_IP   = pVmsObj->VMS_CTLR_IP;
+            pObj->INFO1     = pVmsObj->VMS_MODL_KIND_NM;
+
+            pObj->STRM_IP   = pVmsObj->WEB_CMRA_IP;
+            pObj->STRM_ID   = pVmsObj->CMRA_LGIN_ID;
+            pObj->STRM_PSWD = pVmsObj->CMRA_LGIN_PW;
+            pObj->STRM_ADDR = pVmsObj->VMS_RTSP_ADDR.Trim();//CMRA_IMG_ADDR;
+            pObj->FULL_STRM_ADDR = pVmsObj->FULL_STRM_SESN_NM;
+            if (pObj->FULL_STRM_ADDR == "")
+            {
+                pObj->FULL_STRM_ADDR = pObj->STRM_ADDR;
+            }
+
+            FLists.Push(pObj->CTLR_NMBR, pObj);
+        }
+    }
+    __finally
+    {
+        FLists.UnLock();
+    }
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TMonitoringCtlrManager::InitMonitoringFormFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT COUNT(1) AS CNT          \r\n"
+           "  FROM TB_VMS_MONITORING        \r\n"
+           " WHERE MONITORING_TYPE = :p01   \r\n";
+
+
+    VmsCtlrManager->FLists.Lock();
+    try
+    {
+        int nFormSeq;
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+
+            ITSDb_SQLText(pADO, sQry);
+            ITSDb_SQLBind(pADO, "p01", String(FMonitoringType));
+            ITSDb_SQLOpen(pADO);
+            int nFormCnt = pADO->FieldByName("CNT")->AsInteger;
+            if (nFormCnt > 0) return true;
+
+    sQry = "INSERT INTO TB_VMS_MONITORING (     \r\n"
+           "                MONITORING_TYPE,    \r\n"
+           "                MONITORING_NM,      \r\n"
+           "                MONITORING_SEQ,     \r\n"
+           "                VMS_CTLR_ID,      \r\n"
+           "                VIEW_MODE           \r\n"
+           "                )                   \r\n"
+           "  VALUES (                          \r\n"
+           "                :p01,               \r\n"
+           "                :p02,               \r\n"
+           "                :p03,               \r\n"
+           "                :p04,               \r\n"
+           "                0                   \r\n"
+           "                )                   \r\n";
+
+
+            ITSDb_SQLText(pADO, sQry);
+
+            nFormSeq = 0;
+            FOR_STL(TVmsCtlr*, pObj, VmsCtlrManager->FLists)
+            {
+                if (pObj->USE_YN != "Y") continue;
+                if (pObj->CMRA_IMG_ADDR == "") continue;
+
+                String sFormName = "Default";
+                ITSDb_SQLBind(pADO, "p01", String(FMonitoringType));
+                ITSDb_SQLBind(pADO, "p02", sFormName);
+                ITSDb_SQLBind(pADO, "p03", String(++nFormSeq));
+                ITSDb_SQLBind(pADO, "p04", pObj->VMS_CTLR_ID);
+
+                ITSDb_SQLExec(pADO);
+                if (nFormSeq >= 16) break;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TFrmVmsCmraViewer::InitMonitoringForm", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TFrmVmsCmraViewer::InitMonitoringForm", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        VmsCtlrManager->FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TMonitoringCtlrManager::LoadMonitoringFormFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    if (ObjScreenManager == NULL)
+    {
+        ObjScreenManager = new TMonitoringScreenManager();
+    }
+    ObjScreenManager->Init();
+
+    sQry = "SELECT TRIM(A.MONITORING_NM) AS MONITORING_NM,      \r\n"
+           "       A.MONITORING_SEQ,                            \r\n"
+           "       A.VMS_CTLR_ID,                               \r\n"
+           "       A.VIEW_MODE                                  \r\n"
+           "  FROM TB_VMS_MONITORING A, TB_VMS_CTLR B           \r\n"
+           " WHERE 1=1                                          \r\n"
+           "   AND B.USE_YN = 'Y'                               \r\n"
+           "   AND B.VMS_CTLR_ID = A.VMS_CTLR_ID                \r\n"
+           "   AND A.MONITORING_TYPE = :p01                     \r\n"
+           " ORDER BY A.MONITORING_NM, A.MONITORING_SEQ         \r\n";
+
+    try
+    {
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+            pADO->Parameters->ParamByName("p01")->Value = String(FMonitoringType);
+
+			pADO->Open();
+
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String MONITORING_NM  = pADO->FieldByName("MONITORING_NM")->AsString;
+                int    MONITORING_SEQ = pADO->FieldByName("MONITORING_SEQ")->AsInteger;
+                String VMS_CTLR_ID    = pADO->FieldByName("VMS_CTLR_ID")->AsString;
+                int    VIEW_MODE      = pADO->FieldByName("VIEW_MODE")->AsInteger;
+
+                TMonitoringScreen *pObj = ObjScreenManager->FLists.Find(MONITORING_NM);
+                if (!pObj)
+                {
+                    pObj = new TMonitoringScreen();
+                    pObj->NAME = MONITORING_NM;
+                    ObjScreenManager->FLists.Push(pObj->NAME, pObj);
+                }
+                TScreenCtlr *pScr = new TScreenCtlr();
+                pScr->SEQ       = pObj->FLists.Size()+1;
+                pScr->CTLR_NMBR = VMS_CTLR_ID;
+                pScr->VIEW_MODE = VIEW_MODE;
+
+				pObj->FLists.Push(pScr->SEQ, pScr);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TMonitoringCtlrManager::LoadMonitoringFormFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TMonitoringCtlrManager::LoadMonitoringFormFromDb", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+
+        FOR_STL(TMonitoringScreen*, pObj, ObjScreenManager->FLists)
+        {
+            int nCtlrCount = pObj->FLists.Size();
+            switch(nCtlrCount)
+            {
+            case  0: case  1:                   pObj->LAYOUT = 0; break;  //1*1
+            case  2: case  3: case  4:          pObj->LAYOUT = 1; break;  //2*2
+            case  5: case  6:                   pObj->LAYOUT = 3; break;  //3*2
+            case  7: case  8: case  9:          pObj->LAYOUT = 2; break;  //3*3
+            case 10: case 11: case 12:          pObj->LAYOUT = 4; break;  //4*3
+            case 13: case 14: case 15: case 16: pObj->LAYOUT = 5; break;  //4*4
+            case 17: case 18: case 19: case 20: pObj->LAYOUT = 7; break;  //5*4
+            case 21: case 22: case 23: case 24: pObj->LAYOUT = 8; break;  //6*4
+            case 25: case 26: case 27: case 28:
+            case 29: case 30:                   pObj->LAYOUT = 9; break;  //6*5
+            default:
+                if      (nCtlrCount <= 42)      pObj->LAYOUT = 10;        //7*6
+                else if (nCtlrCount <= 56)      pObj->LAYOUT = 11;        //8*7
+                else                            pObj->LAYOUT = 12;        //8*8
+                break;
+            }
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TMonitoringCtlrManager::DelMonitoringFormFromDb(String AMonitoringName, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "DELETE TB_VMS_MONITORING      \r\n"
+           " WHERE MONITORING_TYPE = :p01 \r\n"
+           "   AND MONITORING_NM   = :p02 \r\n";
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+            pADO->Parameters->ParamByName("p01")->Value = String(FMonitoringType);
+            pADO->Parameters->ParamByName("p02")->Value = AMonitoringName;
+
+            pADO->ExecSQL();
+            //pADO->RowsAffected;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TMonitoringCtlrManager::DelMonitoringFormFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TMonitoringCtlrManager::DelMonitoringFormFromDb", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TMonitoringCtlrManager::InsMonitoringFormFromDb(String AMonitoringName, int ASeq, String ACtlrNmbr, int AViewMode, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "INSERT INTO TB_VMS_MONITORING (     \r\n"
+           "                MONITORING_TYPE,    \r\n"
+           "                MONITORING_NM,      \r\n"
+           "                MONITORING_SEQ,     \r\n"
+           "                VMS_CTLR_NMBR,      \r\n"
+           "                VIEW_MODE           \r\n"
+           "                )                   \r\n"
+           "  VALUES (                          \r\n"
+           "                :p01,               \r\n"
+           "                :p02,               \r\n"
+           "                :p03,               \r\n"
+           "                :p04,               \r\n"
+           "                :p05                \r\n"
+           "                )                   \r\n";
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+            pADO->Parameters->ParamByName("p01")->Value = String(FMonitoringType);
+            pADO->Parameters->ParamByName("p02")->Value = AMonitoringName;
+            pADO->Parameters->ParamByName("p03")->Value = ASeq;
+            pADO->Parameters->ParamByName("p04")->Value = ACtlrNmbr;
+            pADO->Parameters->ParamByName("p05")->Value = AViewMode;
+
+            pADO->ExecSQL();
+            //pADO->RowsAffected;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TMonitoringCtlrManager::InsMonitoringFormFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TMonitoringCtlrManager::InsMonitoringFormFromDb", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+

+ 110 - 0
VmsCmraViewer - 20240801/SRC/CDSMonitoringObjF.h

@@ -0,0 +1,110 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSMonitoringObjFH
+#define CDSMonitoringObjFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <stdio.h>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "ITSLibF.h"
+#include "ITSDbF.h"
+#include "AppGlobalF.h"
+//---------------------------------------------------------------------------
+
+#define MAX_CAMERA_PER_SCREEM   MAX_CMRA_VIEW_CAMERA    //64  // 8 * 8
+
+class TScreenCtlr
+{
+public:
+    TScreenCtlr() {};
+    ~TScreenCtlr(){};
+
+private:
+
+public:
+    int    SEQ;
+    String CTLR_NMBR;
+    int    VIEW_MODE;
+public:
+};
+//---------------------------------------------------------------------------
+
+class TMonitoringScreen
+{
+public:
+    TMonitoringScreen() {};
+    ~TMonitoringScreen(){ FLists.RemoveAll(); };
+
+private:
+
+public:
+    String NAME;
+    int    LAYOUT;
+    TItsMap<int, TScreenCtlr*> FLists;
+public:
+};
+//---------------------------------------------------------------------------
+
+class TMonitoringScreenManager
+{
+public:
+    TMonitoringScreenManager();
+    ~TMonitoringScreenManager();
+
+public:
+    TItsMap<String, TMonitoringScreen*> FLists;
+    void Init();
+};
+//---------------------------------------------------------------------------
+extern TMonitoringScreenManager *ObjScreenManager;
+//---------------------------------------------------------------------------
+
+class TMonitoringCtlr
+{
+public:
+    TMonitoringCtlr() {};
+    ~TMonitoringCtlr(){};
+
+private:
+
+public:
+    String CTLR_NMBR;
+    String ID;
+    String CTLR_ID;
+    String NAME;
+    String CTLR_IP;
+    String INFO1;
+    String INFO2;
+
+    String STRM_IP;
+    String STRM_ID;
+    String STRM_PSWD;
+    String STRM_ADDR;
+    String FULL_STRM_ADDR;
+public:
+};
+//---------------------------------------------------------------------------
+
+class TMonitoringCtlrManager
+{
+public:
+    TMonitoringCtlrManager(int AMonitoringType);
+    ~TMonitoringCtlrManager();
+
+public:
+    int FMonitoringType;
+
+    TItsMap<String, TMonitoringCtlr*> FLists;
+
+    bool LoadCtlrFromDb(TADOConnection *ADbConn=NULL);
+    bool InitMonitoringFormFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadMonitoringFormFromDb(TADOConnection *ADbConn=NULL);
+    bool DelMonitoringFormFromDb(String AMonitoringName, TADOConnection *ADbConn=NULL);
+    bool InsMonitoringFormFromDb(String AMonitoringName, int ASeq, String ACtlrNmbr, int AViewMode, TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TMonitoringCtlrManager *ObjCtlrManager;
+//---------------------------------------------------------------------------
+
+#endif

+ 397 - 0
VmsCmraViewer - 20240801/SRC/DMDbF.cpp

@@ -0,0 +1,397 @@
+//---------------------------------------------------------------------------
+
+#include <vcl.h>
+#pragma hdrstop
+
+#include "DMDbF.h"
+#include "ITSLogF.h"
+#include "AppGlobalF.h"
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma resource "*.dfm"
+TDMDb *DMDb;
+//---------------------------------------------------------------------------
+__fastcall TDMDb::TDMDb(TComponent* Owner)
+    : TDataModule(Owner)
+{
+    FConnString = "";
+    FException  = true;
+}
+//---------------------------------------------------------------------------
+void __fastcall TDMDb::DataModuleCreate(TObject *Sender)
+{
+//
+}
+//---------------------------------------------------------------------------
+void __fastcall TDMDb::DataModuleDestroy(TObject *Sender)
+{
+//
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TDMDb::SetErrorString(String AErrorString)
+{
+    FErrorString = AErrorString;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TDMDb::SetConnectString(String AProvider, String AServerName, String AUserName, String APassword, String ACatalog/*=""*/)
+{
+    FConnString  = "";
+    FConnString += "Provider="         + AProvider;
+    FConnString += ";Password="        + APassword;
+    FConnString += ";Persist Security Info=True";
+    FConnString += ";User ID="         + AUserName;
+    if (ACatalog != "")
+    {
+        FConnString += ";Initial Catalog=" + ACatalog;
+    }
+    FConnString += ";Data Source="     + AServerName;
+}
+//---------------------------------------------------------------------------
+void __fastcall TDMDb::SetConnectString(String AConnStr)
+{
+    FConnString  = AConnStr;
+}
+//---------------------------------------------------------------------------
+
+bool __fastcall TDMDb::Connect(String AConnStr/*=""*/)
+{
+    bool bResult = false;
+
+	try
+    {
+        Close();
+
+        FDbConn = new TADOConnection(NULL);
+        if (!FDbConn) return false;
+
+        FDbConn->ConnectionTimeout = 10;
+        FDbConn->ConnectionString  = AConnStr == "" ? FConnString : AConnStr;
+        FDbConn->KeepConnection	   = true;
+        FDbConn->LoginPrompt       = false;
+        FDbConn->Open();
+        bResult = true;
+    }
+    catch(EDatabaseError &E)
+    {
+        ErrorString = String(E.ClassName()) + E.Message;
+        if (FException)
+        {
+            DBERRORMSG("Connect", String(E.ClassName()), E.Message, "Connect");
+            throw Exception(ErrorString);
+        }
+        else
+        {
+            DBERRORLOG("Connect", String(E.ClassName()), E.Message, "Connect");
+        }
+    }
+    catch (Exception &e)
+    {
+        ErrorString = String(e.ClassName()) + e.Message;
+        if (FException)
+        {
+            DBERRORMSG("Connect", String(e.ClassName()), e.Message, "Connect");
+            throw Exception(ErrorString);
+        }
+        else
+        {
+            DBERRORLOG("Connect", String(e.ClassName()), e.Message, "Connect");
+        }
+    }
+    return bResult;
+}
+//---------------------------------------------------------------------------
+
+bool __fastcall TDMDb::Close()
+{
+    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;
+        if (FException)
+        {
+            DBERRORMSG("Close", String(E.ClassName()), E.Message, "Close");
+            throw Exception(ErrorString);
+        }
+        else
+        {
+            DBERRORLOG("Close", String(E.ClassName()), E.Message, "Close");
+        }
+    }
+    catch (Exception &e)
+    {
+        ErrorString = String(e.ClassName()) + e.Message;
+        if (FException)
+        {
+            DBERRORMSG("Close", String(e.ClassName()), e.Message, "Close");
+            throw Exception(ErrorString);
+        }
+        else
+        {
+            DBERRORLOG("Close", String(e.ClassName()), e.Message, "Close");
+        }
+    }
+    return bResult;
+}
+//---------------------------------------------------------------------------
+
+bool __fastcall TDMDb::SQLClose(TADOQuery *adoQry)
+{
+#if 0
+    try
+#endif
+    {
+        if (adoQry->Active)
+        {
+            adoQry->Recordset->Close();
+            adoQry->Close();
+            adoQry->Active = false;
+        }
+        adoQry->SQL->Clear();
+
+        return true;
+    }
+#if 0
+    catch(EDatabaseError &E)
+    {
+        ErrorString = String(E.ClassName()) + E.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    catch (Exception &exception)
+    {
+        ErrorString = String(exception.ClassName()) + exception.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    return false;
+#endif
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMDb::SQLText(TADOQuery *adoQry, String sQry)
+{
+#if 0
+    try
+#endif
+    {
+        adoQry->Close();
+        adoQry->SQL->Text = sQry;
+        return 0;
+    }
+#if 0
+    catch(EDatabaseError &E)
+    {
+        ErrorString = String(E.ClassName()) + E.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    catch (Exception &exception)
+    {
+        ErrorString = String(exception.ClassName()) + exception.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    return 0;
+#endif
+}
+//---------------------------------------------------------------------------
+
+bool __fastcall TDMDb::SQLBind(TADOQuery *adoQry, String param, String var)
+{
+#if 0
+    try
+#endif
+    {
+        adoQry->Parameters->ParamByName(param)->Value = var;
+        return true;
+    }
+#if 0
+    catch(EDatabaseError &E)
+    {
+        ErrorString = String(E.ClassName()) + E.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    catch (Exception &exception)
+    {
+        ErrorString = String(exception.ClassName()) + exception.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    return false;
+#endif
+}
+//---------------------------------------------------------------------------
+
+bool __fastcall TDMDb::SQLBindStream(TADOQuery *adoQry, String param, TStream * pStream)
+{
+#if 0
+    try
+#endif
+    {
+        adoQry->Parameters->ParamByName(param)->LoadFromStream(pStream, ftBlob);
+        return true;
+    }
+#if 0
+    catch(EDatabaseError &E)
+    {
+        ErrorString = String(E.ClassName()) + E.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    catch (Exception &exception)
+    {
+        ErrorString = String(exception.ClassName()) + exception.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    return false;
+#endif
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMDb::SQLOpen(TADOQuery *adoQry)
+{
+#if 0
+    try
+#endif
+    {
+#if 0
+        if (0)
+        {
+            String sLogSql = adoQry->SQL->Text;
+
+            sLogSql += "\r\n";
+            for (int ii = 0; ii < adoQry->Parameters->Count; ii++)
+            {
+                sLogSql += ":" + adoQry->Parameters->Items[ii]->Name + "  :  " + adoQry->Parameters->Items[ii]->Value;
+                sLogSql += "\r\n";
+            }
+
+            //LogSql(sLogSql);
+        }
+#endif
+
+        adoQry->Open();
+        adoQry->First();
+        return adoQry->RecordCount;
+    }
+#if 0
+    catch(EDatabaseError &E)
+    {
+        ErrorString = String(E.ClassName()) + E.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    catch (Exception &exception)
+    {
+        ErrorString = String(exception.ClassName()) + exception.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    return -1;
+#endif
+}
+//---------------------------------------------------------------------------
+
+int  __fastcall TDMDb::SQLExec(TADOQuery *adoQry)
+{
+#if 0
+    try
+#endif
+    {
+#if 0
+        if (0)
+        {
+            String sLogSql = adoQry->SQL->Text;
+
+            sLogSql += "\r\n";
+            for (int ii = 0; ii < adoQry->Parameters->Count; ii++)
+            {
+                sLogSql += ":" + adoQry->Parameters->Items[ii]->Name + "  :  " + adoQry->Parameters->Items[ii]->Value;
+                sLogSql += "\r\n";
+            }
+
+            //LogSql(sLogSql);
+        }
+#endif
+        adoQry->ExecSQL();
+        return adoQry->RowsAffected;
+    }
+#if 0
+    catch(EDatabaseError &E)
+    {
+        ErrorString = String(E.ClassName()) + E.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    catch (Exception &exception)
+    {
+        ErrorString = String(exception.ClassName()) + exception.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    return -1;
+#endif
+}
+//---------------------------------------------------------------------------
+
+bool __fastcall TDMDb::SQLClear(TADOQuery *adoQry)
+{
+#if 0
+    try
+#endif
+    {
+        adoQry->Close();
+        adoQry->SQL->Clear();
+
+        return true;
+    }
+#if 0
+    catch(EDatabaseError &E)
+    {
+        ErrorString = String(E.ClassName()) + E.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    catch (Exception &exception)
+    {
+        ErrorString = String(exception.ClassName()) + exception.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    return false;
+#endif
+}
+//---------------------------------------------------------------------------
+
+bool __fastcall TDMDb::LocateItem(TADOQuery *adoQry, String sFldNm, String sFldVal)
+{
+#if 0
+    try
+#endif
+    {
+        TLocateOptions Opts;
+        Opts.Clear();
+        Opts << loPartialKey;
+
+        return adoQry->Locate(sFldNm, sFldVal, Opts);
+    }
+#if 0
+    catch(EDatabaseError &E)
+    {
+        ErrorString = String(E.ClassName()) + E.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    catch (Exception &exception)
+    {
+        ErrorString = String(exception.ClassName()) + exception.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    return false;
+#endif
+}
+//---------------------------------------------------------------------------
+

+ 7 - 0
VmsCmraViewer - 20240801/SRC/DMDbF.dfm

@@ -0,0 +1,7 @@
+object DMDb: TDMDb
+  OldCreateOrder = False
+  OnCreate = DataModuleCreate
+  OnDestroy = DataModuleDestroy
+  Height = 150
+  Width = 215
+end

+ 55 - 0
VmsCmraViewer - 20240801/SRC/DMDbF.h

@@ -0,0 +1,55 @@
+//---------------------------------------------------------------------------
+
+#ifndef DMDbFH
+#define DMDbFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+//---------------------------------------------------------------------------
+#define ERRMSG(v,w,x,y) ITSLog->LogDbError(v,w,x,y,__FILE__, String(__FUNC__), __LINE__,true)
+#define ERRLOG(v,w,x,y) ITSLog->LogDbError(v,w,x,y,__FILE__, String(__FUNC__), __LINE__,false)
+//---------------------------------------------------------------------------
+class TDMDb : public TDataModule
+{
+__published:	// IDE-managed Components
+    void __fastcall DataModuleCreate(TObject *Sender);
+    void __fastcall DataModuleDestroy(TObject *Sender);
+private:	// User declarations
+    TADOConnection *FDbConn;
+    String          FErrorString;
+    String          FConnString;
+    bool            FException;
+
+public:		// User declarations
+    __fastcall TDMDb(TComponent* Owner);
+
+    void __fastcall SetException(bool AException=true) { FException = AException; }
+
+    TADOConnection *GetConnection() { return FDbConn; }
+    void __fastcall SetConnectString(String AProvider, String AServerName, String AUserName, String APassword, String ACatalog="");
+    void __fastcall SetConnectString(String AConnStr);
+
+    bool __fastcall Connect(String AConnStr="");
+    bool __fastcall Close();
+
+    bool __fastcall SQLClose(TADOQuery *adoQry);
+    bool __fastcall SQLClear(TADOQuery *adoQry);
+    int  __fastcall SQLText(TADOQuery *adoQry, String sQry);
+    bool __fastcall SQLBind(TADOQuery *adoQry, String param, String var);
+    bool __fastcall SQLBindStream(TADOQuery *adoQry, String param, TStream * pStream);
+    int  __fastcall SQLOpen(TADOQuery *adoQry);
+    int  __fastcall SQLExec(TADOQuery *adoQry);
+    bool __fastcall LocateItem(TADOQuery *adoQry, String sFldNm, String sFldVal);
+
+    void __fastcall SetErrorString(String AErrorString);
+	__property String  ErrorString = {read=FErrorString, write=SetErrorString};
+	__property String  ConnString  = {read=FConnString,  write=FConnString};
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TDMDb *DMDb;
+//---------------------------------------------------------------------------
+#endif

+ 146 - 0
VmsCmraViewer - 20240801/SRC/FrmCameraFullScreenF.cpp

@@ -0,0 +1,146 @@
+//---------------------------------------------------------------------------
+
+#include <vcl.h>
+#pragma hdrstop
+
+#include "FrmCameraFullScreenF.h"
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma link "PasLibVlcPlayerUnit"
+#pragma resource "*.dfm"
+TFrmCameraFullScreen *FrmCameraFullScreen = NULL;
+//---------------------------------------------------------------------------
+__fastcall TFrmCameraFullScreen::TFrmCameraFullScreen(TComponent* Owner)
+    : TForm(Owner)
+{
+    this->Color = clBlack;
+    PnlStream->ParentColor = false;
+    PnlStream->Color = clBlack;
+}
+//---------------------------------------------------------------------------
+void __fastcall TFrmCameraFullScreen::PnlStreamDblClick(TObject *Sender)
+{
+    Close();
+}
+//---------------------------------------------------------------------------
+void __fastcall TFrmCameraFullScreen::FormClose(TObject *Sender, TCloseAction &Action)
+{
+    Disconnect();
+
+    FrmCameraFullScreen = NULL;
+}
+//---------------------------------------------------------------------------
+void __fastcall TFrmCameraFullScreen::FormDblClick(TObject *Sender)
+{
+    Close();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraFullScreen::FormShow(TObject *Sender)
+{
+    Refresh();
+    Application->ProcessMessages();
+
+    this->Color = clBlack;
+    PnlStream->ParentColor = false;
+    PnlStream->Color = clBlack;
+
+    Connect();
+}
+//---------------------------------------------------------------------------
+void __fastcall TFrmCameraFullScreen::AdjustVideoFit()
+{
+    try {
+        if (FConHandle > 0) {
+            String ratioData = IntToStr(PasLibVlcPlayer1->Width) + ":" + IntToStr(PasLibVlcPlayer1->Height);
+            PasLibVlcPlayer1->SetVideoAspectRatio(ratioData);
+        }
+    }
+    catch(Exception &e) {
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraFullScreen::Connect()
+{
+    Disconnect();
+
+    PnlStream->Caption = "--- 영상 연결 중 ---";
+
+    try
+    {
+        PasLibVlcPlayer1->Play(RTSP_ADDR);
+        FConHandle = 1;
+
+        Application->ProcessMessages();
+        AdjustVideoFit();
+
+        Application->ProcessMessages();
+    }
+    catch(Exception &e)
+    {
+    }
+    FPlay = true;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraFullScreen::Disconnect()
+{
+    if (!FPlay) return;
+
+    FPlay = false;
+    PnlStream->Caption = "--- 영상 연결 해제 ---";
+    try
+    {
+        if (FConHandle > 0)
+        {
+            PasLibVlcPlayer1->Stop();
+        }
+        Application->ProcessMessages();
+        FConHandle = 0;
+    }
+    catch(Exception &e)
+    {
+    }
+
+    PnlStream->Caption = "*** 영상 연결 종료 ***";
+    FConHandle = 0;
+    FPlay = false;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraFullScreen::TmrCloseTimer(TObject *Sender)
+{
+    TmrClose->Enabled = false;
+    Close();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraFullScreen::PasLibVlcPlayer1DblClick(TObject *Sender)
+{
+    Close();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraFullScreen::PasLibVlcPlayer1MediaPlayerPlaying(TObject *Sender)
+{
+    AdjustVideoFit();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraFullScreen::PasLibVlcPlayer1MediaPlayerPositionChanged(TObject *Sender, float position)
+{
+    if (PasLibVlcPlayer1->Visible == false) {
+        PasLibVlcPlayer1->Visible = true;
+        PnlStream->Refresh();
+        AdjustVideoFit();
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraFullScreen::FormKeyPress(TObject *Sender, wchar_t &Key)
+{
+    Close();
+}
+//---------------------------------------------------------------------------
+

+ 68 - 0
VmsCmraViewer - 20240801/SRC/FrmCameraFullScreenF.dfm

@@ -0,0 +1,68 @@
+object FrmCameraFullScreen: TFrmCameraFullScreen
+  Left = 0
+  Top = 0
+  BorderStyle = bsNone
+  Caption = #49828#53944#47532#48141#50689#49345
+  ClientHeight = 350
+  ClientWidth = 690
+  Color = clBlack
+  DefaultMonitor = dmDesktop
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  Font.Style = []
+  FormStyle = fsStayOnTop
+  OldCreateOrder = False
+  Position = poDesigned
+  OnClose = FormClose
+  OnDblClick = FormDblClick
+  OnKeyPress = FormKeyPress
+  OnShow = FormShow
+  PixelsPerInch = 96
+  TextHeight = 13
+  object PnlStream: TPanel
+    Left = 0
+    Top = 0
+    Width = 690
+    Height = 350
+    Align = alClient
+    BevelOuter = bvNone
+    Caption = '  '
+    Color = clBlack
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clWhite
+    Font.Height = -21
+    Font.Name = #47569#51008' '#44256#46357
+    Font.Style = [fsBold]
+    ParentBackground = False
+    ParentFont = False
+    TabOrder = 0
+    OnDblClick = PnlStreamDblClick
+    object PasLibVlcPlayer1: TPasLibVlcPlayer
+      Left = 0
+      Top = 0
+      Width = 690
+      Height = 350
+      Align = alClient
+      Visible = False
+      OnDblClick = PasLibVlcPlayer1DblClick
+      OsdShow = False
+      SnapShotFmt = 'png'
+      OnMediaPlayerPlaying = PasLibVlcPlayer1MediaPlayerPlaying
+      OnMediaPlayerPositionChanged = PasLibVlcPlayer1MediaPlayerPositionChanged
+      MouseEventsHandler = mehComponent
+      ExplicitLeft = 3
+      ExplicitTop = 3
+      ExplicitWidth = 885
+      ExplicitHeight = 589
+    end
+  end
+  object TmrClose: TTimer
+    Enabled = False
+    Interval = 500
+    OnTimer = TmrCloseTimer
+    Left = 516
+    Top = 76
+  end
+end

+ 45 - 0
VmsCmraViewer - 20240801/SRC/FrmCameraFullScreenF.h

@@ -0,0 +1,45 @@
+//---------------------------------------------------------------------------
+
+#ifndef FrmCameraFullScreenFH
+#define FrmCameraFullScreenFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <ExtCtrls.hpp>
+#include "PasLibVlcPlayerUnit.hpp"
+//---------------------------------------------------------------------------
+class TFrmCameraFullScreen : public TForm
+{
+__published:	// IDE-managed Components
+    TPanel *PnlStream;
+    TTimer *TmrClose;
+    TPasLibVlcPlayer *PasLibVlcPlayer1;
+    void __fastcall PnlStreamDblClick(TObject *Sender);
+    void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
+    void __fastcall FormDblClick(TObject *Sender);
+    void __fastcall FormShow(TObject *Sender);
+    void __fastcall TmrCloseTimer(TObject *Sender);
+    void __fastcall PasLibVlcPlayer1DblClick(TObject *Sender);
+    void __fastcall PasLibVlcPlayer1MediaPlayerPlaying(TObject *Sender);
+    void __fastcall PasLibVlcPlayer1MediaPlayerPositionChanged(TObject *Sender, float position);
+    void __fastcall FormKeyPress(TObject *Sender, wchar_t &Key);
+private:	// User declarations
+public:
+    String RTSP_ADDR;
+
+    bool    FPlay;
+    long    FConHandle;
+
+    void __fastcall Connect();
+    void __fastcall Disconnect();
+    void __fastcall AdjustVideoFit();
+
+public:		// User declarations
+    __fastcall TFrmCameraFullScreen(TComponent* Owner);
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TFrmCameraFullScreen *FrmCameraFullScreen;
+//---------------------------------------------------------------------------
+#endif

+ 42 - 0
VmsCmraViewer - 20240801/SRC/FrmCameraInfoF.cpp

@@ -0,0 +1,42 @@
+//---------------------------------------------------------------------------
+
+#include <vcl.h>
+#include "AppGlobalF.h"
+#pragma hdrstop
+
+#include "FrmCameraInfoF.h"
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma link "cxContainer"
+#pragma link "cxControls"
+#pragma link "cxEdit"
+#pragma link "cxGraphics"
+#pragma link "cxLabel"
+#pragma link "cxLookAndFeelPainters"
+#pragma link "cxLookAndFeels"
+#pragma link "dxSkinBlack"
+#pragma link "dxSkinBlue"
+#pragma link "dxSkinsCore"
+#pragma resource "*.dfm"
+TFrmCameraInfo *FrmCameraInfo = NULL;
+//---------------------------------------------------------------------------
+__fastcall TFrmCameraInfo::TFrmCameraInfo(TComponent* Owner)
+    : TForm(Owner)
+{
+    if (g_AppCfg.sLang != "kr")
+    {
+        Caption = "Information";
+        Font->Name = "Tahoma";
+        cxLabel1->Caption = "Controller No: ";
+        cxLabel2->Caption = "Controller Name: ";
+        cxLabel3->Caption = "Stream Address: ";
+        cxLabel4->Caption = "Stream Address(Full): ";
+    }
+}
+//---------------------------------------------------------------------------
+void __fastcall TFrmCameraInfo::FormClose(TObject *Sender, TCloseAction &Action)
+{
+    FrmCameraInfo = NULL;
+}
+//---------------------------------------------------------------------------
+

+ 106 - 0
VmsCmraViewer - 20240801/SRC/FrmCameraInfoF.dfm

@@ -0,0 +1,106 @@
+object FrmCameraInfo: TFrmCameraInfo
+  Left = 0
+  Top = 0
+  BorderIcons = [biSystemMenu]
+  BorderStyle = bsSingle
+  Caption = #49828#53944#47532#48141' '#51221#48372
+  ClientHeight = 90
+  ClientWidth = 541
+  Color = clBtnFace
+  DefaultMonitor = dmDesktop
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -12
+  Font.Name = #47569#51008' '#44256#46357
+  Font.Style = []
+  FormStyle = fsStayOnTop
+  OldCreateOrder = False
+  Position = poMainFormCenter
+  OnClose = FormClose
+  PixelsPerInch = 96
+  TextHeight = 15
+  object cxLabel1: TcxLabel
+    Left = 8
+    Top = 11
+    AutoSize = False
+    Caption = #51228#50612#44592' '#48264#54840': '
+    Properties.Alignment.Horz = taRightJustify
+    Properties.Alignment.Vert = taVCenter
+    Transparent = True
+    Height = 17
+    Width = 124
+    AnchorX = 132
+    AnchorY = 20
+  end
+  object cxLabel2: TcxLabel
+    Left = 8
+    Top = 38
+    AutoSize = False
+    Caption = #51228#50612#44592' '#47749#52845': '
+    Properties.Alignment.Horz = taRightJustify
+    Properties.Alignment.Vert = taVCenter
+    Transparent = True
+    Height = 17
+    Width = 124
+    AnchorX = 132
+    AnchorY = 47
+  end
+  object cxLabel3: TcxLabel
+    Left = 8
+    Top = 64
+    AutoSize = False
+    Caption = #49828#53944#47532#48141' '#51452#49548': '
+    Properties.Alignment.Horz = taRightJustify
+    Properties.Alignment.Vert = taVCenter
+    Transparent = True
+    Height = 17
+    Width = 124
+    AnchorX = 132
+    AnchorY = 73
+  end
+  object Edit1: TEdit
+    Left = 132
+    Top = 10
+    Width = 121
+    Height = 23
+    ImeName = 'Microsoft IME 2010'
+    TabOrder = 3
+  end
+  object Edit2: TEdit
+    Left = 132
+    Top = 36
+    Width = 258
+    Height = 23
+    ImeName = 'Microsoft IME 2010'
+    TabOrder = 4
+  end
+  object Edit3: TEdit
+    Left = 132
+    Top = 62
+    Width = 414
+    Height = 23
+    ImeName = 'Microsoft IME 2010'
+    TabOrder = 5
+  end
+  object cxLabel4: TcxLabel
+    Left = 8
+    Top = 95
+    AutoSize = False
+    Caption = #49828#53944#47532#48141' '#51452#49548': '
+    Properties.Alignment.Horz = taRightJustify
+    Properties.Alignment.Vert = taVCenter
+    Transparent = True
+    Height = 17
+    Width = 124
+    AnchorX = 132
+    AnchorY = 104
+  end
+  object Edit4: TEdit
+    Left = 132
+    Top = 93
+    Width = 414
+    Height = 23
+    ImeName = 'Microsoft IME 2010'
+    TabOrder = 7
+  end
+end

+ 42 - 0
VmsCmraViewer - 20240801/SRC/FrmCameraInfoF.h

@@ -0,0 +1,42 @@
+//---------------------------------------------------------------------------
+
+#ifndef FrmCameraInfoFH
+#define FrmCameraInfoFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <ExtCtrls.hpp>
+#include "cxContainer.hpp"
+#include "cxControls.hpp"
+#include "cxEdit.hpp"
+#include "cxGraphics.hpp"
+#include "cxLabel.hpp"
+#include "cxLookAndFeelPainters.hpp"
+#include "cxLookAndFeels.hpp"
+#include "dxSkinBlack.hpp"
+#include "dxSkinBlue.hpp"
+#include "dxSkinsCore.hpp"
+//---------------------------------------------------------------------------
+class TFrmCameraInfo : public TForm
+{
+__published:	// IDE-managed Components
+    TcxLabel *cxLabel1;
+    TcxLabel *cxLabel2;
+    TcxLabel *cxLabel3;
+    TEdit *Edit1;
+    TEdit *Edit2;
+    TEdit *Edit3;
+    TcxLabel *cxLabel4;
+    TEdit *Edit4;
+    void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
+private:	// User declarations
+public:
+public:		// User declarations
+    __fastcall TFrmCameraInfo(TComponent* Owner);
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TFrmCameraInfo *FrmCameraInfo;
+//---------------------------------------------------------------------------
+#endif

+ 459 - 0
VmsCmraViewer - 20240801/SRC/FrmCameraPlayerF.cpp

@@ -0,0 +1,459 @@
+//---------------------------------------------------------------------------
+
+#include <vcl.h>
+#include "AppGlobalF.h"
+#include "FrmCameraPlayerF.h"
+#include "FrmCameraFullScreenF.h"
+#include "FrmCameraInfoF.h"
+#include "FrmCameraScreenF.h"
+#pragma hdrstop
+
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma link "dxGDIPlusClasses"
+#pragma link "PasLibVlcPlayerUnit"
+#pragma resource "*.dfm"
+
+TFrmCameraPlayer *FrmCameraPlayer = NULL;
+//---------------------------------------------------------------------------
+__fastcall TFrmCameraPlayer::TFrmCameraPlayer(TComponent* Owner)
+    : TForm(Owner)
+{
+    IsTerm = false;
+    FPlay = false;
+    FAutoPlay = true;
+    FUserStop = false;
+    FConHandle = 0;
+
+    FFullScreen = false;
+
+    FParent = this->Parent;
+    PnlCamera->Tag = (int)this;
+
+    //mmLog->Lines->Clear();
+}
+//---------------------------------------------------------------------------
+void __fastcall TFrmCameraPlayer::TmrShowTimer(TObject *Sender)
+{
+    TmrShow->Enabled = false;
+    if (IsTerm) {
+        return;
+    }
+
+    if (Installed)
+    {
+        PopupMenu = PopupMenu1;
+        ImgNoData->Visible = false;
+        //PnlName->Caption = CTLR_NMBR + ": " + NAME;
+        PnlName->Caption = " " + NAME;
+        Play();
+    }
+    else
+    {
+        PasLibVlcPlayer1->Visible = false;
+        PopupMenu = NULL;
+        PnlCamera->Caption = " " + NAME;
+        LoadEmptyImage();
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraPlayer::LoadEmptyImage()
+{
+    try
+    {
+#if 0
+        String sImageFile = g_AppCfg.sEmptyImg;
+        if (sImageFile != "")
+        {
+            ImgNoData->Picture->LoadFromFile(sImageFile);
+            ImgNoData->Align = alClient;
+        }
+#endif
+        ImgNoData->Visible = true;
+    }
+    catch(Exception &e)
+    {
+        ImgNoData->Visible = true;
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraPlayer::FormShow(TObject *Sender)
+{
+    Refresh();
+    this->FLastBounds = this->BoundsRect;
+//    TmrShow->Enabled = true;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraPlayer::FormClose(TObject *Sender, TCloseAction &Action)
+{
+    try {
+        FAutoPlay = false;
+        Stop();
+    } catch(...) {}
+
+    Action = caFree;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraPlayer::FormDestroy(TObject *Sender)
+{
+    try {
+        FAutoPlay = false;
+        Stop();
+    } catch(...) {}
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraPlayer::MnuConnectClick(TObject *Sender)
+{
+    FUserStop = true;
+    Play();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraPlayer::MnuDisconnectClick(TObject *Sender)
+{
+    PasLibVlcPlayer1->Visible = false;
+    PasLibVlcPlayer1->Refresh();
+    PnlCamera->Refresh();
+
+    FUserStop = true;
+    FAutoPlay = false;
+    Stop();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraPlayer::AutoPlay()
+{
+    FAutoPlay = true;
+    TmrShow->Enabled = true;
+}
+//---------------------------------------------------------------------------
+void __fastcall TFrmCameraPlayer::CameraLog(String ALogMsg)
+{
+    PnlCamera->Caption = ALogMsg;
+    PnlCamera->Refresh();
+
+#if 0
+    AnsiString strmAddr = AnsiString(STRM_ADDR);
+    if (strmAddr == "") {
+        strmAddr = "Empty Addr";
+    }
+    AnsiString sAutoPlay = FAutoPlay ? "AutoPlay:True" : "AutoPlay:False";
+    AnsiString sUserStop = FUserStop ? "UserStop:True" : "UserStop:False";
+
+    LOGINFO("%s,%s, %s: %s", sAutoPlay.c_str(), sUserStop.c_str(), strmAddr.c_str(), AnsiString(ALogMsg).c_str());
+#endif
+
+    Application->ProcessMessages();
+}
+//---------------------------------------------------------------------------
+void __fastcall TFrmCameraPlayer::CameraInfo(String ALogInfo)
+{
+    lblRate->Caption = ALogInfo;
+    lblRate->Refresh();
+    reMemo->Lines->Add(ALogInfo);
+    Application->ProcessMessages();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraPlayer::Play()
+{
+    if (FPlay) return;
+
+    if (PasLibVlcPlayer1->Visible) {
+        PasLibVlcPlayer1->Visible = false;
+    }
+
+    Stop();
+
+    if (STRM_ADDR == "") {
+        CameraLog("### 영상정보가 없습니다 ###");
+        return;
+    }
+
+    CameraLog("--- 영상 연결 중 ---");
+    try
+    {
+        ///--udp-caching=500 --tcp-caching=500 --realrtsp-caching=500
+        //ffplay.exe rtsp://224.1.1.1:8086 -fflags nobuffer -flags low_delay -avioflags direct -fflags discardcorrupt
+
+        //PasLibVlcPlayer1->VLC->Path = "plugins";
+        //PasLibVlcPlayer1->VLC->AddOption("http-caching=300");
+        PasLibVlcPlayer1->VLC->AddOption("live-capture-caching=300");
+        PasLibVlcPlayer1->VLC->AddOption("file-caching=300");
+        PasLibVlcPlayer1->VLC->AddOption("disk-caching=300");
+        PasLibVlcPlayer1->VLC->AddOption("network-caching=300");
+        //PasLibVlcPlayer1->VLC->AddOption("avcodec-hw=none");
+        //PasLibVlcPlayer1->VLC->AddOption("avcodec-hw={any,d3d11va,dxva2,none}");
+        //PasLibVlcPlayer1->VLC->AddOption("avcodec-threads=0");
+        //PasLibVlcPlayer1->VLC->AddOption("no-sout-all");
+        //PasLibVlcPlayer1->VLC->AddOption("sout-keep");
+
+        //PasLibVlcPlayer1->VLC->AddOption(":file-caching=300");
+        //PasLibVlcPlayer1->VLC->AddOption(":network-caching=300");
+        //PasLibVlcPlayer1->VLC->AddOption(":avcodec-hw=none");
+        //PasLibVlcPlayer1->VLC->AddOption("--avcodec-threads=0");
+        //PasLibVlcPlayer1->VLC->AddOption(":no-sout-all");
+        //PasLibVlcPlayer1->VLC->AddOption(":sout-keep");
+
+        PasLibVlcPlayer1->Play(STRM_ADDR);
+        FConHandle = 1;
+
+        Application->ProcessMessages();
+        AdjustVideoFit();
+
+        if (FConHandle > 0)
+        {
+            if (ImgNoData->Visible == true) {
+                ImgNoData->Visible = false;
+            }
+        }
+
+        //PnlName->Caption = libvlc_get_install_path();
+
+        Application->ProcessMessages();
+    }
+    catch(Exception &e)
+    {
+    }
+    FPlay = true;
+}
+//---------------------------------------------------------------------------
+void __fastcall TFrmCameraPlayer::Stop()
+{
+    if (!FPlay) return;
+
+    FPlay = false;
+    if (STRM_ADDR == "") {
+        return;
+    }
+
+    CameraLog("--- 영상 연결 해제 ---");
+    try
+    {
+        if (FConHandle > 0)
+        {
+            PasLibVlcPlayer1->Stop();
+        }
+        Application->ProcessMessages();
+        FConHandle = 0;
+    }
+    catch(Exception &e)
+    {
+    }
+
+    CameraLog("*** 영상 연결 종료 ***");
+    FConHandle = 0;
+    FPlay = false;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraPlayer::AdjustVideoFit()
+{
+    try {
+        if (FConHandle > 0 && PasLibVlcPlayer1->IsPlay()) {
+            String ratioData = IntToStr(PasLibVlcPlayer1->Width) + ":" + IntToStr(PasLibVlcPlayer1->Height);
+            PasLibVlcPlayer1->SetVideoAspectRatio(ratioData);
+        }
+    }
+    catch(Exception &e) {
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraPlayer::Term()
+{
+    IsTerm = true;
+    Stop();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraPlayer::InitCamera(bool AInstalled, String ACtlrNmbr, String AName, String AStrmAddr, String AFullStrmAddr, int AViewMode)
+{
+    FAutoPlay      = true;
+    Installed      = AInstalled;
+    CTLR_NMBR      = ACtlrNmbr;
+    NAME           = AName;
+    STRM_ADDR      = AStrmAddr;
+    FULL_STRM_ADDR = AFullStrmAddr;
+    VIEW_MODE      = AViewMode;
+
+    Caption = NAME;
+    PnlName->Caption = NAME;
+    PnlCamera->Caption = AStrmAddr;
+    FUserStop = false;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraPlayer::PnlCameraDblClick(TObject *Sender)
+{
+    // 여기서 더블클릭은 최대화면을 호출하는 것임
+#if 0
+    FrmCameraScreen->TmrFullScreen->Enabled = false;
+    FrmCameraScreen->FFullScreenIdx = Tag;
+    FrmCameraScreen->TmrFullScreen->Enabled = true;
+#endif
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraPlayer::PasLibVlcPlayer1DblClick(TObject *Sender)
+{
+    FrmCameraScreen->TmrFullScreen->Enabled = false;
+    FrmCameraScreen->FFullScreenIdx = Tag;
+    FrmCameraScreen->TmrFullScreen->Enabled = true;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraPlayer::MnuInfoClick(TObject *Sender)
+{
+    FrmCameraInfo = new TFrmCameraInfo(this);
+    FrmCameraInfo->Edit1->Text = CTLR_NMBR;
+    FrmCameraInfo->Edit2->Text = NAME;
+    FrmCameraInfo->Edit3->Text = STRM_ADDR;
+    FrmCameraInfo->Edit4->Text = FULL_STRM_ADDR;
+    FrmCameraInfo->ShowModal();
+    delete FrmCameraInfo;
+    FrmCameraInfo = NULL;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraPlayer::PasLibVlcPlayer1MediaPlayerPlaying(TObject *Sender)
+{
+    // 표출시작
+#if 0
+    if (FConHandle > 0)
+    {
+        if (PasLibVlcPlayer1->Visible == false) {
+            PasLibVlcPlayer1->Visible = true;
+        }
+        if (ImgNoData->Visible == true) {
+            ImgNoData->Visible = false;
+        }
+    }
+#endif
+    AdjustVideoFit();
+    FUserStop = false;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraPlayer::PasLibVlcPlayer1MediaPlayerMediaChanged(TObject *Sender, UnicodeString mrl)
+{
+    // 스트리밍 변경됨
+    CameraLog("@@@ 영상 연결 중.. @@@");
+    AdjustVideoFit();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraPlayer::PasLibVlcPlayer1MediaPlayerStopped(TObject *Sender)
+{
+    CameraLog("@@@ 영상 표출이 종료됨 @@@");
+    if (FAutoPlay && FUserStop) {
+        if (PasLibVlcPlayer1->Visible) {
+            PasLibVlcPlayer1->Visible = false;
+        }
+        //CameraLog("@@@ 영상 표출 종료 @@@");
+    }
+
+    FPlay = false;
+
+    if (FAutoPlay) {
+        TmrShow->Enabled = false;
+        TmrShow->Interval = 1000;
+        TmrShow->Enabled = true;
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraPlayer::PasLibVlcPlayer1MediaPlayerEncounteredError(TObject *Sender)
+{
+    if (PasLibVlcPlayer1->Visible) {
+        PasLibVlcPlayer1->Visible = false;
+    }
+    CameraLog("@@@ 영상 표출 오류 @@@");
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraPlayer::PasLibVlcPlayer1MediaPlayerOpening(TObject *Sender)
+{
+    if (PasLibVlcPlayer1->Visible == false) {
+        PasLibVlcPlayer1->Visible = true;
+        PnlCamera->Refresh();
+        AdjustVideoFit();
+    }
+    if (ImgNoData->Visible == true) {
+        ImgNoData->Visible = false;
+    }
+    CameraInfo("PlayerOpening");
+#if 0
+    // 표출시작
+    if (FConHandle > 0)
+    {
+        if (PasLibVlcPlayer1->Visible == false) {
+            PasLibVlcPlayer1->Visible = true;
+        }
+        if (ImgNoData->Visible == true) {
+            ImgNoData->Visible = false;
+        }
+    }
+    AdjustVideoFit();
+#endif
+    // 영상이 연결됨
+    AdjustVideoFit();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraPlayer::PasLibVlcPlayer1MediaPlayerPositionChanged(TObject *Sender, float position)
+{
+#if 0
+    if (PasLibVlcPlayer1->Visible == false) {
+        PasLibVlcPlayer1->Visible = true;
+        PnlCamera->Refresh();
+        AdjustVideoFit();
+    }
+    if (ImgNoData->Visible == true) {
+        ImgNoData->Visible = false;
+    }
+    CameraInfo("Changed: " + String(position) + ", " + String(PasLibVlcPlayer1->GetState()));
+#endif
+#if 0
+  case PasLibVlcPlayer1.GetState() of
+    plvPlayer_NothingSpecial: stateName := 'Idle';
+    plvPlayer_Opening:        stateName := 'Opening';
+    plvPlayer_Buffering:      stateName := 'Buffering';
+    plvPlayer_Playing:        stateName := 'Playing';
+    plvPlayer_Paused:         stateName := 'Paused';
+    plvPlayer_Stopped:        stateName := 'Stopped';
+    plvPlayer_Ended:          stateName := 'Ended';
+    plvPlayer_Error:          stateName := 'Error';
+    else                      stateName := 'Unknown';
+  end;
+
+  var
+  info : string;
+  sar_num, sar_den : LongWord;
+begin
+  info := 'Aspect ratio = ' + PasLibVlcPlayer1.GetVideoAspectRatio();
+  if (PasLibVlcPlayer1.GetVideoSampleAspectRatio(sar_num, sar_den)) then
+  begin
+    info := info + ', SampleAspectRatio = ' + IntToStr(sar_num) + ':' + IntToStr(sar_den);
+  end;
+  MessageDlg(
+    info,
+    mtInformation, [mbOK], 0);
+end;
+
+main libvlc debug: configured with /builds/videolan/vlc/extras/package/win32/../../../configure  '--enable-update-check' '--enable-lua' '--enable-faad' '--enable-flac' '--enable-theora' '--enable-avcodec' '--enable-merge-ffmpeg' '--enable-dca' '--enable-mpc' '--enable-libass' '--enable-schroedinger' '--enable-realrtsp' '--enable-live555' '--enable-shout' '--enable-goom' '--enable-sse' '--enable-mmx' '--enable-libcddb' '--enable-zvbi' '--disable-telx' '--enable-nls' '--host=i686-w64-mingw32' '--with-contrib=../contrib/i686-w64-mingw32' '--with-breakpad=https://win.crashes.videolan.org' '--enable-qt' '--enable-skins2' '--enable-dvdread' '--enable-caca' 'host_alias=i686-w64-mingw32' 'CFLAGS= -D_WIN32_WINNT=0x0502 -DWINVER=0x502 -D__MSVCRT_VERSION__=0x700 ' 'CXXFLAGS= -D_WIN32_WINNT=0x0502 -DWINVER=0x502 -D__MSVCRT_VERSION__=0x700 ' 'PKG_CONFIG=pkg-config' 'PKG_CONFIG_LIBDIR=/usr/i686-w64-mingw32/lib/pkgconfig:/usr/lib/i686-w64-mingw32/pkgconfig'
+#endif
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraPlayer::PasLibVlcPlayer1MediaPlayerTimeChanged(TObject *Sender, __int64 time)
+{
+    CameraInfo("TimeChanged: " + String(time));
+}
+//---------------------------------------------------------------------------
+

+ 351 - 0
VmsCmraViewer - 20240801/SRC/FrmCameraPlayerF.dfm

@@ -0,0 +1,351 @@
+object FrmCameraPlayer: TFrmCameraPlayer
+  Left = 0
+  Top = 0
+  Align = alCustom
+  BorderStyle = bsNone
+  Caption = #50689#49345
+  ClientHeight = 212
+  ClientWidth = 380
+  Color = clSilver
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -12
+  Font.Name = 'Tahoma'
+  Font.Style = []
+  Padding.Left = 1
+  Padding.Bottom = 1
+  OldCreateOrder = False
+  Position = poDesigned
+  OnClose = FormClose
+  OnDestroy = FormDestroy
+  OnShow = FormShow
+  ExplicitWidth = 320
+  ExplicitHeight = 240
+  DesignSize = (
+    380
+    212)
+  PixelsPerInch = 96
+  TextHeight = 14
+  object PnlCamera: TPanel
+    Left = 1
+    Top = 20
+    Width = 379
+    Height = 191
+    Anchors = [akLeft, akTop, akRight, akBottom]
+    BevelOuter = bvNone
+    Color = clBlack
+    DoubleBuffered = True
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clWhite
+    Font.Height = -12
+    Font.Name = #47569#51008' '#44256#46357
+    Font.Style = [fsBold]
+    ParentBackground = False
+    ParentDoubleBuffered = False
+    ParentFont = False
+    TabOrder = 0
+    OnDblClick = PnlCameraDblClick
+    object ImgNoData: TImage
+      Left = 0
+      Top = 0
+      Width = 240
+      Height = 191
+      Align = alClient
+      Center = True
+      Picture.Data = {
+        0B546478504E47496D61676589504E470D0A1A0A0000000D49484452000001D4
+        00000024080600000030C2CBC10000000467414D410000B18E7CFB5193000000
+        206348524D0000870F00008C0F0000FD520000814000007D790000E98B00003C
+        E5000019CC733C857700000A396943435050686F746F73686F70204943432070
+        726F66696C65000048C79D96775454D71687CFBD777AA1CD30D2197A932E3080
+        F42E201D045118660618CA00C30C4D6C88A840441111014590A08001A3A148AC
+        88622128A8600F48105062308AA8A86446D64A7C7979EFE5E5F7C7BDDFDA67EF
+        73F7D97B9FB52E00244F1F2E2F059602209927E0077A38D3578547D0B1FD0006
+        788001A6003059E9A9BE41EEC140242F37177ABAC809FC8BDE0C0148FCBE65E8
+        E94FA783FF4FD2AC54BE0000C85FC4E66C4E3A4BC4F9224ECA14A48AED3322A6
+        C6248A194689992F4A50C472628E5BE4A59F7D16D951CCEC641E5BC4E29C53D9
+        C96C31F788787B86902362C447C405195C4EA6886F8B58334998CC15F15B716C
+        3287990E008A24B60B38AC78119B8898C40F0E7411F1720070A4B82F38E60B16
+        70B204E243B9A4A466F3B971F102BA2E4B8F6E6A6DCDA07B723293380281A13F
+        9395C8E4B3E92E29C9A94C5E36008B67FE2C19716DE9A2225B9A5A5B5A1A9A19
+        997E51A8FFBAF83725EEED22BD0AF8DC3388D6F787EDAFFC52EA0060CC8A6AB3
+        EB0F5BCC7E003AB6022077FF0F9BE6210024457D6BBFF1C57968E27989170852
+        6D8C8D3333338DB81C9691B8A0BFEB7F3AFC0D7DF13D23F176BF9787EECA8965
+        0A93047471DD58294929423E3D3D95C9E2D00DFF3CC4FF38F0AFF3581AC889E5
+        F0393C5144A868CAB8BC3851BB796CAE809BC2A37379FFA989FF30EC4F5A9C6B
+        9128F59F0035CA0848DDA002E4E73E80A21001127950DCF5DFFBE6830F05E29B
+        17A63AB138F79F05FDFBAE7089F891CE8DFB1CE712184C6709F9198B6BE26B09
+        D08000240115C80315A001748121300356C016380237B002F88160100ED60216
+        8807C9800F32412ED80C0A4011D805F6824A5003EA41236801274007380D2E80
+        CBE03AB809EE800760048C83E76006BC01F310046121324481E42155480B3280
+        CC2006640FB9413E5020140E454371100F1242B9D016A8082A852AA15AA811FA
+        163A055D80AE4203D03D68149A827E85DEC3084C82A9B032AC0D1BC30CD809F6
+        8683E135701C9C06E7C0F9F04EB802AE838FC1EDF005F83A7C071E819FC3B308
+        4088080D51430C1106E282F82111482CC24736208548395287B4205D482F720B
+        1941A69177280C8A82A2A30C51B6284F54088A854A436D4015A32A514751EDA8
+        1ED42DD4286A06F5094D462BA10DD036682FF42A741C3A135D802E4737A0DBD0
+        97D077D0E3E837180C8686D1C158613C31E19804CC3A4C31E600A615731E3380
+        19C3CC62B15879AC01D60EEB87656205D802EC7EEC31EC39EC20761CFB1647C4
+        A9E2CC70EEB8081C0F97872BC735E1CEE2067113B879BC145E0B6F83F7C3B3F1
+        D9F8127C3DBE0B7F033F8E9F274813740876846042026133A182D042B8447848
+        78452412D589D6C4002297B88958413C4EBC421C25BE23C990F4492EA4489290
+        B4937484749E748FF48A4C266B931DC91164017927B9917C91FC98FC56822261
+        24E125C196D8285125D12E3128F142122FA925E924B9563247B25CF2A4E40DC9
+        6929BC94B6948B14536A835495D429A961A959698AB4A9B49F74B274B17493F4
+        55E94919AC8CB68C9B0C5B265FE6B0CC4599310A42D1A0B85058942D947ACA25
+        CA381543D5A17A5113A845D46FA8FDD4195919D965B2A1B259B255B267644768
+        084D9BE6454BA295D04ED08668EF97282F715AC259B26349CB92C12573728A72
+        8E721CB942B956B93B72EFE5E9F26EF289F2BBE53BE41F29A014F41502143215
+        0E2A5C529856A42ADA2AB2140B154F28DE578295F4950295D6291D56EA539A55
+        5651F6504E55DEAF7C51795A85A6E2A892A052A67256654A95A26AAFCA552D53
+        3DA7FA8C2E4B77A227D12BE83DF4193525354F35A15AAD5ABFDABCBA8E7A887A
+        9E7AABFA230D8206432356A34CA35B63465355D3573357B359F3BE165E8BA115
+        AFB54FAB576B4E5B473B4C7B9B7687F6A48E9C8E974E8E4EB3CE435DB2AE836E
+        9A6E9DEE6D3D8C1E432F51EF80DE4D7D58DF423F5EBF4AFF86016C6069C03538
+        6030B014BDD47A296F69DDD2614392A193618661B3E1A811CDC8C728CFA8C3E8
+        85B1A67184F16EE35EE34F2616264926F5260F4C654C5798E6997699FE6AA66F
+        C632AB32BB6D4E367737DF68DE69FE7299C132CEB283CBEE5A502C7C2DB65974
+        5B7CB4B4B2E45BB6584E59695A455B555B0D33A80C7F4631E38A35DADAD97AA3
+        F569EB77369636029B1336BFD81ADA26DA36D94E2ED759CE595EBF7CCC4EDD8E
+        69576B37624FB78FB63F643FE2A0E6C074A87378E2A8E1C8766C709C70D2734A
+        703AE6F4C2D9C499EFDCE63CE762E3B2DEE5BC2BE2EAE15AE8DAEF26E316E256
+        E9F6D85DDD3DCEBDD97DC6C3C2639DC7794FB4A7B7E76ECF612F652F9657A3D7
+        CC0AAB15EB57F47893BC83BC2BBD9FF8E8FBF07DBA7C61DF15BE7B7C1FAED45A
+        C95BD9E107FCBCFCF6F83DF2D7F14FF3FF3E0013E01F5015F034D0343037B037
+        88121415D414F426D839B824F841886E8830A43B54323432B431742ECC35AC34
+        6C6495F1AAF5ABAE872B8473C33B23B011A1110D11B3ABDD56EF5D3D1E691159
+        1039B446674DD69AAB6B15D626AD3D132519C58C3A198D8E0E8B6E8AFEC0F463
+        D6316763BC62AA6366582EAC7DACE76C4776197B8A63C729E54CC4DAC596C64E
+        C6D9C5ED899B8A77882F8F9FE6BA702BB92F133C136A12E612FD128F242E2485
+        25B526E392A3934FF1647889BC9E149594AC94815483D482D491349BB4BD6933
+        7C6F7E433A94BE26BD534015FD4CF50975855B85A319F61955196F3343334F66
+        4967F1B2FAB2F5B377644FE4B8E77CBD0EB58EB5AE3B572D7773EEE87AA7F5B5
+        1BA00D311BBA376A6CCCDF38BEC963D3D1CD84CD899B7FC833C92BCD7BBD256C
+        4B57BE72FEA6FCB1AD1E5B9B0B240AF805C3DB6CB7D56C476DE76EEFDF61BE63
+        FF8E4F85ECC26B452645E5451F8A59C5D7BE32FDAAE2AB859DB13BFB4B2C4B0E
+        EEC2ECE2ED1ADAEDB0FB68A974694EE9D81EDF3DED65F4B2C2B2D77BA3F65E2D
+        5F565EB38FB04FB86FA4C2A7A273BFE6FE5DFB3F54C657DEA972AE6AAD56AADE
+        513D77807D60F0A0E3C1961AE59AA29AF787B887EED67AD4B6D769D7951FC61C
+        CE38FCB43EB4BEF76BC6D78D0D0A0D450D1F8FF08E8C1C0D3CDAD368D5D8D8A4
+        D454D20C370B9BA78E451EBBF98DEB379D2D862DB5ADB4D6A2E3E0B8F0F8B36F
+        A3BF1D3AE17DA2FB24E364CB775ADF55B751DA0ADBA1F6ECF6998EF88E91CEF0
+        CE81532B4E7577D976B57D6FF4FD91D36AA7ABCEC89E29394B389B7F76E15CCE
+        B9D9F3A9E7A72FC45D18EB8EEA7E7071D5C5DB3D013DFD97BC2F5DB9EC7EF962
+        AF53EFB92B76574E5FB5B97AEA1AE35AC775CBEBED7D167D6D3F58FCD0D66FD9
+        DF7EC3EA46E74DEB9B5D03CB07CE0E3A0C5EB8E57AEBF26DAFDBD7EFACBC3330
+        14327477387278E42EFBEEE4BDA47B2FEF67DC9F7FB0E921FA61E123A947E58F
+        951ED7FDA8F763EB88E5C89951D7D1BE27414F1E8CB1C69EFF94FED387F1FCA7
+        E4A7E513AA138D936693A7A7DCA76E3E5BFD6CFC79EAF3F9E9829FA57FAE7EA1
+        FBE2BB5F1C7FE99B593533FE92FF72E1D7E257F2AF8EBC5EF6BA7BD67FF6F19B
+        E437F373856FE5DF1E7DC778D7FB3EECFDC47CE607EC878A8F7A1FBB3E797F7A
+        B890BCB0F01BF784F3FBE2E61DC2000000097048597300000B1300000B130100
+        9A9C1800000CD649444154785EED9D3B72DD3A1286EF129C4FE22568095E82B3
+        C9A654B3022F41D1A45AC12DE74E9C385734B196A025289E48F37F009A6A82CD
+        C7397A43DD557F916880E0E388F8D80048FDF5F0F090FA843A62FFFBFB1FDFA4
+        2F2D99D6DBAF3F5FA58B964A4B9B5974DFA5C656E84C8DAFC804CFAFD2BDF4B0
+        22F26EA46BE952FADA361DD77EFDF926FD907E4A37D2C3866EDB566969E17D97
+        1A5BA13335BEFEF99FFF5E483FA42BE952FA865A5B60702542BD927E4B6BA0BD
+        9300ECB4ED87B65F7FBE4897D26FE95E8AC079270158CA3D9E77DD16001B84AF
+        24CA8CFFE091B6B0E8BE4B8DADD0991A5F82E777E9A774273D74C2471E65A62E
+        5FA029FD94B6E00A803F5E37315DB715926B10BD9580E4231C6B972FBE35F812
+        D15E4BD92DFC092DBAEF52632B74A6C6973741F3AB44B47A2BF57045C0751681
+        0A9A74F902D008AC0017F0BEFFC8AC46935B5DB940760EC41A75AE6D43F9EF52
+        8E3D7F728BEEBBD4D80A9DA9F1B56602275DC1003402EB8D742A584F8F586BD7
+        295022BA035C74B1022B9616F53D0D5A35BADC03E9FC81A082D48EC58BE894EE
+        DD8468DA64D17D971A5BA13335BEF64CE004AC003402EB6F69069B06CE08AA08
+        E07E6F45D7AD426EABDBB5D77920ABDB44F521BA76E7E3C1358A8D408A807B82
+        346D61D17D971A5BA13335BE8E9AC04957F07D03A917BECB56AC98A07921DD36
+        8846A21B38864F85DC5190F662BBFD4951759C14604675A0EB56B25A8D940166
+        54967A726C346DD5A2FB2E35B642676A7C9D62022763AC5BE3AB33480A9ACCFA
+        8D808A00EE23882AB4B6BA5E4FD10CF033ABDDB56BC05E02791BBE73F0A6A505
+        16DD77A9B1153A53E3EB1C6BF08CA00A6C7BA832B61A0115DD954215A65B11E3
+        395A46AAB51B392A8BD87F3F564A176F045F7CEBD07E61FBD7E5BF2FA59BA6E1
+        A3639DE357E9AA69BF07E29D5974DFA5C656E84C8DAF734DE0A40B38822AAFDA
+        CC1A7981932EE0E8159B3A9E7A2C3265ECD22621D9FB9D5B80A47C85FB7EF40B
+        4CE75DD035928DCA02D35588A9C107720F4D2FD2F8AB5EC0F2A2FB782DD3F1F3
+        7060E7521FB03AE31C5D99ABE6FE3016DD77A9B1153A53E3EB292670F2218808
+        AA8CABEE41F5A664543046E0326D4783750213EF7F46DB52F75EF40B949F05A6
+        981AFC04EA09A6E3F7D70B2D26ADC9F72180AA63FBC2F1354DE711DD77A9B115
+        3A53E3EBA926709E0B55A24C601775A99A6280D5714D262F99885AA308942875
+        1BA6BD3D01A6981AD204EA41D3B1D3956BE7615AFE261FC474EC21F8A3FB2E35
+        B642676A7C3D87099CA742D5A2D3ADD756D01C6015C06BD1E8169823FD6EB53E
+        DA13618AA9215D0055CB8BE6477471FE90EE24CAB09C45654A13E9FC6C795617
+        EB6512949633A0B6B4AF6F76AC4A53E6B6E55B991F2D7B32F9BE4BFEF8EFA5DF
+        D2541FEBD2E173D93295BD6EDBB10FF665FB9DF518283DDB67E46B2AC7D1F2A9
+        DBF2ADACD5CFFEA27DF4C7C136FD6F6375523FD7CBCE9DEBD05F63CA5D46F75D
+        6A6C85CED4F87A2E1338AF1D487BA8C65F4A5A7FA71345D1E31A4C4F5534664A
+        941B953D0C53AC35A2D6A81A507DE4E21B6CEF2BC7A325515B54069507112D3D
+        507D236EBAA71CA6751AFDC92F1900D00455ADFB3A91AF97EDCA35D072EF5CD0
+        FCDAAE98CAD9F61C230F10B6FD0CF64A2F22BFCE37BB062DDFFF0ED1714EFFC0
+        40EBBEAE92D7A5A72107E7EBEBECAFDFE48FEEBBD4D80A9DA9F1F59C26701E9E
+        FD2B4831F61901CCD4CFB8A59B372A77AA229852F75A847BD26C5E35A07B4045
+        4442F87CC36D653D58A6484A4B405BA2252DFBC6DBEAF3B0B4FAACE16749E48B
+        AC5C9904A4A5EF7AA59CC173316148CBC3E7B2652A63755BBD4488B6FD6C7292
+        D27E9F115011FB2F1173CBEF810AB4FDF920BB9EFEBAF908D843B3FC3DBA3462
+        3BEA445CC3C57162D17D971A5BA13335BE9ED3806683E73E54D72342B49CEDB9
+        DF3D7C44CB68731BA6274F805143BA07D4A9AB59EB1E8C56D6D2288CECE5F7DB
+        4D917CE7679F7EBFD33BB35AF7E50001DD958B7298D21E9440E6F0B96C99CAD8
+        759AAEB1D64328B3EEFC6B11EAEC214969FF3BF82E6BEB66461CB307F9ECDFEE
+        29EDCB1AA82D0D4CFB7D2E8E138BEEBBD4D80A9DA9F1F5DC2668F2F107BA7923
+        A83E8E5B6E03B28EB17A7B3A5023981225AFC17439C67AC0D490EE01D503A407
+        A08F1457FFA7AAF24278F57EC983724D94F3DBF5638644A0BEECA17369EED094
+        EFCF93889C6D91BF76FE4161B1CFC8E74DBEA9AEE62AA6B48F52D9A7AFA77F98
+        F0E764FBB5F4E26F54BEF098A2FB2E35B642676A7CBD84099CDF3A907AD5466B
+        1B908B06B2F8E2B24714C174EB759AC777584F341A5AD7A8BE35503D3C382EF2
+        7BB14F96566ED6C5ADF4EC7C9A2CBD7A2ECD1D9AF27DE4B725EBEE5EEC33F279
+        936F0DA8FE218363F6F5CCC6ED5BFE54B6F92C9D404DAD2A74A6C6D74B99C0C9
+        3F2C8F807A64866F3421E9DC3154A0D98FC7EEBD9B3A87EF094643EB1AD59380
+        DA7C8B71BBDEE40FE1D5FBA5D5EE4C6FCAF390E9A1E2C71781EFE1735933E5DB
+        39B25FEAF3F211B175B32EF619F9BCC9B706543F46CD03C7D6D8EDAC6CF3593A
+        819A5A55E84C8DAF9734E0D9C1F42850178D55B1635F54F26256F03CD2DC87E9
+        6C86E9A94643EB1AD57380EA1B71C6060BDC594AD6A81F026AF3F97149EAB6FA
+        3826CA532F13950C722C6D5B5F5FF94DC873BE9381AA3C9B753CCD44F626FFE2
+        2140CBC53E239F37F9FCEFC079738E7E1BCED322605F3682B82F6BBE3DA0F220
+        C203C897E8BE4B8DADD0991A5F2F698267349E5AA380FD2EDC65976B1DF3DC7A
+        D5C64499E5FB90FB303D6BDCD49B1AD0A7029586DF43D0CBA016C22BF26B09A0
+        0C9691AC9CEF1EEEC5F61EC4E63F07A81681CEC62BBD29CF9F3FC7BFD867E4F3
+        269FFF1D224D0F4E5ADFBB465337B8F3850F7DF2FB88BE948BEEBBD4D80A9DA9
+        F1F5D226807EEF805A775ABFC71B41CD341BCB9BAC4271ED1BBEC0726BBB2D98
+        9E3D6EEA4D0DE8EC8302CD47836D3EDF3803B159594CEB401540599EC922D4B5
+        EDD6FC444AFEB84CEC633A67AD0329A2395F86ED7C9993CEA5375726ECCEC694
+        E7EB627DB1CFC8E7ADF90D6A44C556162D1EB6E48BAED114D19BB9BCF081407E
+        EAF1D7F03ABAEF52632B74A6C6D76B9820DA7FF4815766005C0436D3F2D599DE
+        2A944DEB30AC91ED164CD12A04D23E9E359815A036D79B5974DFA5C656E84C8D
+        AFD73241D48FA7DA4CDF3DC82D27279D6AF57DD7B557634C8B0827ED635B0235
+        F5960A9DA9F1F55A2688FA8F3ED40929EBDFCEF53A6F92508D80F9776F519D5E
+        AB6379691FD712A8A9B754E84C8DAFD73481F4029836A80253A0B7173D2266EB
+        AE8EB9CDACD6C984A723F53E3D0276A6C69BB14F5E05A1316759BAA15B9AB140
+        7BED8449378875B629F9AD2CE518DBEC659387D8C6C43822E37E65ECCFE547DB
+        FBB147CA001BC6FA58E7B8FC316CD661E67D5ADA9866769D7716DD77A9B1153A
+        53E3EBB5CD41D566FB1E89524D4C468A66EF32464AD72EF947408A9E15A69860
+        0224EDFBAECC1A35C801AF021F7C2D5DF2254054F25BD908A83EDF6FEF27D194
+        1F53CB08861C931D0B10657B9B8D4A3DECD3EF63B30E33A5D9C6839CF4EA0CDF
+        CF6AD17D971A5BA13335BEDEC21C54EBEB0EA7BF5F6A3AF20A4DA4678729D680
+        625002420639EF272225CDEB234486A51C4BF27B93DFCAFBD73C4A79098801F1
+        09A8664AFBA8B540B7ADDB471C6C56AB3F463441B3E5972E71FC5D9E1D978730
+        69EA3FD69BF0492CBAEF52632B74A6C6D75B99832A5F40DA7BA5E539F52230C5
+        0412A2BDF22E2B4BD26DDD8387089172F88061819A648064E96511254B20681F
+        46B0AE658B74F10139EA30D0E263BD449712D1B045A36CBF3846A9AF03591D94
+        2F5DBA5A52966D0CB894214DF959D7F067B7E8BE4B8DADD0991A5F6F6982291F
+        7E60F62F407D0DA83EE92B487B2690003BEB4A6569F03158014F00E8FF959807
+        AA8DB12203A9A511B0038C064BEB4236A0DA3826B2E340E633F8B12FD21C0BFB
+        9FBA9DDBFA661D1265CAC3835B1AE8B3CBB7B3E8BE4B8DADD0991A5FEFCA2A54
+        9FEB9F887BD135FC2A0DBD805220D792C51A683C30011350B2894625BFAD032C
+        0F330319F522600A5889302963F9E5C7D4D2A06BDB5206E84D51A3D6D9377EDB
+        9E7CEA2D5DB55A5A1DF87D1D1C3BE7C0BAC1D9603C3D00E04F7BB4E8BE4B8DAD
+        D0991A5FEFD2EA44A5A3938BB6441DCCF87DF217908E9A800238671716C84806
+        2BD667E0E9F20B683B517E1A836569A634C04306548B7CA7D9B65A27829C3E94
+        6169C966210350BF0F1B67F575005C1B879DCDE455DA1E1466E795562DBAEF52
+        632B74A6C6D7BBB5C7D75FCE997864207DF5C931024A016A5B7A59346AE021A2
+        5BE447A6BC0976BDC9DF03D52246A0C9BE002C11E53476AC75F667C748194B97
+        19D4CD17D5B1FACE6E2BC73609D4CEA2FB2E35B642676A7C7D08AB9F16E4230D
+        5BB381C9A3CCF2B59A57B4061683A4970195686E353FB2AD7CF9AD2B7802AED6
+        81AA751D03C5C5D8B17C6C431E6580FBAC7ED2CD6F756C4E3452BE9D57CEF0ED
+        2CBAEF52632B74A6C6D787B5FAEE6936DE69EFDEA2FB2E35B21EFEFA3F27DE24
+        2EAB23AD690000000049454E44AE426082}
+      Visible = False
+      ExplicitLeft = 208
+      ExplicitTop = 90
+      ExplicitWidth = 171
+      ExplicitHeight = 101
+    end
+    object PasLibVlcPlayer1: TPasLibVlcPlayer
+      Left = 0
+      Top = 0
+      Width = 240
+      Height = 191
+      Align = alClient
+      OnDblClick = PasLibVlcPlayer1DblClick
+      SpuShow = False
+      OsdShow = False
+      SnapShotFmt = 'png'
+      OnMediaPlayerMediaChanged = PasLibVlcPlayer1MediaPlayerMediaChanged
+      OnMediaPlayerOpening = PasLibVlcPlayer1MediaPlayerOpening
+      OnMediaPlayerPlaying = PasLibVlcPlayer1MediaPlayerPlaying
+      OnMediaPlayerStopped = PasLibVlcPlayer1MediaPlayerStopped
+      OnMediaPlayerEncounteredError = PasLibVlcPlayer1MediaPlayerEncounteredError
+      OnMediaPlayerTimeChanged = PasLibVlcPlayer1MediaPlayerTimeChanged
+      OnMediaPlayerPositionChanged = PasLibVlcPlayer1MediaPlayerPositionChanged
+      MouseEventsHandler = mehComponent
+      ExplicitWidth = 379
+    end
+    object reMemo: TMemo
+      Left = 240
+      Top = 0
+      Width = 139
+      Height = 191
+      Align = alRight
+      Font.Charset = DEFAULT_CHARSET
+      Font.Color = clBlack
+      Font.Height = -12
+      Font.Name = #47569#51008' '#44256#46357
+      Font.Style = [fsBold]
+      Lines.Strings = (
+        'reMemo')
+      ParentFont = False
+      ScrollBars = ssVertical
+      TabOrder = 1
+    end
+  end
+  object PnlName: TPanel
+    Left = 1
+    Top = 0
+    Width = 379
+    Height = 20
+    Align = alTop
+    Alignment = taLeftJustify
+    BevelOuter = bvNone
+    Caption = 'Title'
+    Color = clBlue
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clWhite
+    Font.Height = -12
+    Font.Name = 'Tahoma'
+    Font.Style = [fsBold]
+    ParentBackground = False
+    ParentFont = False
+    TabOrder = 1
+    object lblRate: TLabel
+      Left = 375
+      Top = 0
+      Width = 4
+      Height = 14
+      Align = alClient
+      Alignment = taRightJustify
+      Caption = '-'
+      Font.Charset = DEFAULT_CHARSET
+      Font.Color = clWhite
+      Font.Height = -12
+      Font.Name = 'Tahoma'
+      Font.Style = []
+      ParentFont = False
+    end
+  end
+  object TmrShow: TTimer
+    Enabled = False
+    Interval = 500
+    OnTimer = TmrShowTimer
+    Left = 212
+    Top = 36
+  end
+  object PopupMenu1: TPopupMenu
+    AutoHotkeys = maManual
+    Left = 108
+    Top = 124
+    object MnuConnect: TMenuItem
+      Caption = #50689#49345' '#50672#44208
+      OnClick = MnuConnectClick
+    end
+    object MnuDisconnect: TMenuItem
+      Caption = #50689#49345' '#50672#44208' '#51333#47308
+      OnClick = MnuDisconnectClick
+    end
+    object N1: TMenuItem
+      Caption = '-'
+    end
+    object MnuInfo: TMenuItem
+      Caption = #50689#49345' '#51221#48372'...'
+      OnClick = MnuInfoClick
+    end
+  end
+end

+ 93 - 0
VmsCmraViewer - 20240801/SRC/FrmCameraPlayerF.h

@@ -0,0 +1,93 @@
+//---------------------------------------------------------------------------
+
+#ifndef FrmCameraPlayerFH
+#define FrmCameraPlayerFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <ExtCtrls.hpp>
+#include <OleCtrls.hpp>
+#include <Menus.hpp>
+#include "dxGDIPlusClasses.hpp"
+#include "PasLibVlcPlayerUnit.hpp"
+#include <ComCtrls.hpp>
+//---------------------------------------------------------------------------
+
+class TFrmCameraPlayer : public TForm
+{
+__published:	// IDE-managed Components
+    TTimer *TmrShow;
+    TPopupMenu *PopupMenu1;
+    TMenuItem *MnuConnect;
+    TMenuItem *MnuDisconnect;
+    TPanel *PnlCamera;
+    TPanel *PnlName;
+    TMenuItem *MnuInfo;
+    TMenuItem *N1;
+    TPasLibVlcPlayer *PasLibVlcPlayer1;
+    TImage *ImgNoData;
+    TLabel *lblRate;
+    TMemo *reMemo;
+    void __fastcall TmrShowTimer(TObject *Sender);
+    void __fastcall FormShow(TObject *Sender);
+    void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
+    void __fastcall FormDestroy(TObject *Sender);
+    void __fastcall MnuConnectClick(TObject *Sender);
+    void __fastcall MnuDisconnectClick(TObject *Sender);
+    void __fastcall PnlCameraDblClick(TObject *Sender);
+    void __fastcall MnuInfoClick(TObject *Sender);
+    void __fastcall PasLibVlcPlayer1DblClick(TObject *Sender);
+    void __fastcall PasLibVlcPlayer1MediaPlayerPlaying(TObject *Sender);
+    void __fastcall PasLibVlcPlayer1MediaPlayerStopped(TObject *Sender);
+    void __fastcall PasLibVlcPlayer1MediaPlayerMediaChanged(TObject *Sender, UnicodeString mrl);
+    void __fastcall PasLibVlcPlayer1MediaPlayerEncounteredError(TObject *Sender);
+    void __fastcall PasLibVlcPlayer1MediaPlayerOpening(TObject *Sender);
+    void __fastcall PasLibVlcPlayer1MediaPlayerPositionChanged(TObject *Sender, float position);
+    void __fastcall PasLibVlcPlayer1MediaPlayerTimeChanged(TObject *Sender, __int64 time);
+private:	// User declarations
+
+public:		// User declarations
+
+    bool    FFullScreen;
+    TRect   FLastBounds;
+    TWinControl *FParent;
+
+    bool    FPlay;
+    bool    FAutoPlay;
+    bool    FUserStop;
+    long    FConHandle;
+
+    String  FId;
+    String  FName;
+    String  FStreamingType;
+    String  FViewAddress;
+    String  FFullAddress;
+
+    bool    IsTerm;
+    bool    Installed;
+    String  CTLR_NMBR;
+    String  NAME;
+    String  STRM_ADDR;
+    String  FULL_STRM_ADDR;
+    int     VIEW_MODE;
+
+    void __fastcall InitCamera(bool AInstalled, String ACtlrNmbr, String AName, String AStrmAddr, String AFullStrmAddr, int AViewMode);
+    void __fastcall LoadEmptyImage();
+
+    void __fastcall AutoPlay();
+    void __fastcall Play();
+    void __fastcall Stop();
+    void __fastcall Term();
+    void __fastcall AdjustVideoFit();
+    void __fastcall CameraLog(String ALogMsg);
+    void __fastcall CameraInfo(String ALogInfo);
+
+    __fastcall TFrmCameraPlayer(TComponent* Owner);
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TFrmCameraPlayer *FrmCameraPlayer;
+//---------------------------------------------------------------------------
+#endif
+

+ 269 - 0
VmsCmraViewer - 20240801/SRC/FrmCameraScreenF.cpp

@@ -0,0 +1,269 @@
+//---------------------------------------------------------------------------
+
+#include <vcl.h>
+#include "AppGlobalF.h"
+#pragma hdrstop
+
+#include "FrmCameraScreenF.h"
+#include "FrmCameraFullScreenF.h"
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma link "FFBaseComponent"
+#pragma link "FFLog"
+#pragma resource "*.dfm"
+TFrmCameraScreen *FrmCameraScreen = NULL;
+//---------------------------------------------------------------------------
+__fastcall TFrmCameraScreen::TFrmCameraScreen(TComponent* Owner)
+    : TForm(Owner)
+{
+    FTitle = Caption;
+
+    screeForm.screenCnt = 0;
+    for(int ii = 0; ii < MAX_CAMERA_PER_SCREEM; ii++)
+    {
+        screeForm.info[ii].show      = false;
+        screeForm.info[ii].installed = false;
+        screeForm.info[ii].CTLR_NMBR = 0;
+        screeForm.info[ii].frmCam    = NULL;
+    }
+}
+//---------------------------------------------------------------------------
+void __fastcall TFrmCameraScreen::CommClose()
+{
+    try
+    {
+        for(int ii = 0; ii < screeForm.screenCnt && ii < MAX_CAMERA_PER_SCREEM; ii++)
+        {
+            if (!screeForm.info[ii].frmCam)
+                continue;
+            screeForm.info[ii].frmCam->Term();
+        }
+    }
+    catch(...)
+    {
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraScreen::SetLayout(int ALayout)
+{
+    switch(ALayout)
+    {
+    case  0:/* (1 * 1) */ FCols = 1; FRows = 1; break;
+    case  1:/* (2 * 2) */ FCols = 2; FRows = 2; break;
+    case  2:/* (3 * 3) */ FCols = 3; FRows = 3; break;
+    case  3:/* (3 * 2) */ FCols = 3; FRows = 2; break;
+    case  4:/* (4 * 3) */ FCols = 4; FRows = 3; break;
+    case  5:/* (4 * 4) */ FCols = 4; FRows = 4; break;
+    case  6:/* (4 * 5) */ FCols = 4; FRows = 5; break;
+    case  7:/* (5 * 4) */ FCols = 5; FRows = 4; break;
+    case  8:/* (6 * 4) */ FCols = 6; FRows = 4; break;
+    case  9:/* (6 * 5) */ FCols = 6; FRows = 5; break;
+    case 10:/* (7 * 6) */ FCols = 7; FRows = 6; break;
+    case 11:/* (8 * 7) */ FCols = 8; FRows = 7; break;
+    case 12:/* (8 * 8) */ FCols = 8; FRows = 8; break;
+    default: ALayout = 0; FCols = 1; FRows = 1; break;
+    }
+    FLayout = ALayout;
+    FScreenCnt = FCols * FRows;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraScreen::ResetScreenForm(String AScreenName)
+{
+    TMonitoringScreen* pObj = ObjScreenManager->FLists.Find(AScreenName);
+    if (!pObj)
+    {
+        String sMsg = "모니터링 화면 변경\r\n화면정보를 찾을 수 없습니다..\r\n[" + AScreenName + "]";
+        Application->MessageBox(sMsg.c_str(), FTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
+		return;
+    }
+
+    SetLayout(pObj->LAYOUT);
+
+    int ii;
+    for(ii = 0; ii < screeForm.screenCnt && ii < MAX_CAMERA_PER_SCREEM; ii++)
+    {
+        screeForm.info[ii].show      = false;
+        screeForm.info[ii].installed = false;
+        screeForm.info[ii].CTLR_NMBR = 0;
+        if (screeForm.info[ii].frmCam)
+        {
+            screeForm.info[ii].frmCam->Term();
+        }
+    }
+
+    screeForm.screenCnt = FScreenCnt;
+    for(ii = 0; ii < screeForm.screenCnt && ii < MAX_CAMERA_PER_SCREEM; ii++)
+    {
+        screeForm.info[ii].show = true;
+        if (screeForm.info[ii].frmCam == NULL)
+        {
+            screeForm.info[ii].frmCam = new TFrmCameraPlayer(this);
+            screeForm.info[ii].frmCam->Parent = PnlCamera;
+        }
+        screeForm.info[ii].frmCam->IsTerm = false;
+
+        screeForm.info[ii].frmCam->Tag = ii;
+        screeForm.info[ii].installed = false;
+        screeForm.info[ii].CTLR_NMBR = 0;
+
+        //String NAME           = "--Empty--";
+        String NAME           = "";
+        String STRM_ADDR      = "";
+        String FULL_STRM_ADDR = "";
+        int    VIEW_MODE      = 0;
+
+        TScreenCtlr *pScr = pObj->FLists.Find(ii+1);
+        if (pScr)
+        {
+            TMonitoringCtlr *pCtlr = ObjCtlrManager->FLists.Find(pScr->CTLR_NMBR);
+            if (pCtlr)
+            {
+                screeForm.info[ii].installed = true;
+                screeForm.info[ii].CTLR_NMBR = pScr->CTLR_NMBR;
+
+                NAME           = pCtlr->NAME;
+                STRM_ADDR      = pCtlr->STRM_ADDR;
+                FULL_STRM_ADDR = pCtlr->FULL_STRM_ADDR;
+            }
+        }
+        screeForm.info[ii].frmCam->InitCamera(screeForm.info[ii].installed,
+                                              screeForm.info[ii].CTLR_NMBR,
+                                              NAME,
+                                              STRM_ADDR,
+                                              FULL_STRM_ADDR,
+                                              VIEW_MODE);
+        screeForm.info[ii].frmCam->AutoPlay();
+    }
+
+    for(ii = 0; ii < MAX_CAMERA_PER_SCREEM; ii++)
+    {
+        if (screeForm.info[ii].show == false)
+        {
+            if (screeForm.info[ii].frmCam)
+            {
+                screeForm.info[ii].frmCam->Hide();
+            }
+        }
+    }
+    RecalFormSize();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraScreen::RecalFormSize()
+{
+    Application->ProcessMessages();
+
+    int nRows = 0;
+    int nCols = 0;
+    int nTop  = 0;
+    int nLeft = 0;
+    int nTotTop, nTotLeft;
+
+    int nWidth = (PnlCamera->Width - FCols+2) / FCols;
+    int nHeight= (PnlCamera->Height- FRows+2) / FRows;
+
+    int nTopMargin = 2;
+    int nLeftMargin = 1;
+
+    try
+    {
+        //LockWindowUpdate(Handle);
+
+        for(int ii = 0; ii < screeForm.screenCnt && ii < MAX_CAMERA_PER_SCREEM; ii++)
+        {
+            if (!screeForm.info[ii].frmCam)
+                continue;
+
+            screeForm.info[ii].frmCam->Width = nWidth;
+            screeForm.info[ii].frmCam->Height= nHeight;
+
+            nTotTop  = (nRows * screeForm.info[ii].frmCam->Height)+(nTop*(nRows+1));
+            nTotLeft = (nCols * screeForm.info[ii].frmCam->Width)+(nLeft*(nCols+1));
+            screeForm.info[ii].frmCam->Top = nTopMargin + nTotTop;
+            screeForm.info[ii].frmCam->Left= nLeftMargin + nTotLeft;
+
+            if ((ii%FCols) == (FCols-1))
+            {
+                nRows++;
+                nCols = 0;
+            }
+            else
+            {
+                nCols++;
+            }
+
+            if (!screeForm.info[ii].frmCam->Showing)
+            {
+                screeForm.info[ii].frmCam->Show();
+            }
+            screeForm.info[ii].frmCam->AdjustVideoFit();
+        }
+    }
+    __finally
+    {
+        //LockWindowUpdate(0);
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraScreen::Play()
+{
+    int ii;
+    for(ii = 0; ii < screeForm.screenCnt && ii < MAX_CAMERA_PER_SCREEM; ii++)
+    {
+        if (!screeForm.info[ii].frmCam)
+            continue;
+        screeForm.info[ii].frmCam->AutoPlay();
+    }
+}
+//---------------------------------------------------------------------------
+void __fastcall TFrmCameraScreen::Stop()
+{
+    TmrStop->Enabled = true;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraScreen::TmrFullScreenTimer(TObject *Sender)
+{
+    TmrFullScreen->Enabled = false;
+    if (FFullScreenIdx < screeForm.screenCnt && FFullScreenIdx < MAX_CAMERA_PER_SCREEM)
+    {
+        if (screeForm.info[FFullScreenIdx].frmCam)
+        {
+            Stop();
+
+            TFrmCameraFullScreen *pFrmFullScreen = new TFrmCameraFullScreen(this);
+            pFrmFullScreen->BoundsRect = this->Monitor->BoundsRect;
+            pFrmFullScreen->PnlStream->Align = alNone;
+            pFrmFullScreen->PnlStream->Align = alClient;
+
+            pFrmFullScreen->RTSP_ADDR = screeForm.info[FFullScreenIdx].frmCam->FULL_STRM_ADDR;
+
+            pFrmFullScreen->ShowModal();
+            PnlCamera->Parent = this;
+            PnlCamera->Tag = (int)this;
+
+            delete pFrmFullScreen;
+            pFrmFullScreen = NULL;
+
+            Play();
+        }
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraScreen::TmrStopTimer(TObject *Sender)
+{
+    TmrStop->Enabled = false;
+    int ii;
+    for(ii = 0; ii < screeForm.screenCnt && ii < MAX_CAMERA_PER_SCREEM; ii++)
+    {
+        if (!screeForm.info[ii].frmCam)
+            continue;
+        screeForm.info[ii].frmCam->Stop();
+    }
+}
+//---------------------------------------------------------------------------
+

+ 52 - 0
VmsCmraViewer - 20240801/SRC/FrmCameraScreenF.dfm

@@ -0,0 +1,52 @@
+object FrmCameraScreen: TFrmCameraScreen
+  Left = 0
+  Top = 0
+  Margins.Left = 1
+  Margins.Top = 1
+  Margins.Right = 1
+  Margins.Bottom = 1
+  Align = alClient
+  BorderIcons = []
+  BorderStyle = bsNone
+  Caption = #52852#47700#46972' '#47784#45768#53552#47553
+  ClientHeight = 669
+  ClientWidth = 1112
+  Color = clGray
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -12
+  Font.Name = #47569#51008' '#44256#46357
+  Font.Style = []
+  OldCreateOrder = False
+  Position = poDesigned
+  ExplicitWidth = 320
+  ExplicitHeight = 240
+  PixelsPerInch = 96
+  TextHeight = 15
+  object PnlCamera: TPanel
+    Left = 0
+    Top = 0
+    Width = 1112
+    Height = 669
+    Align = alClient
+    BevelEdges = [beLeft, beTop, beBottom]
+    BevelOuter = bvNone
+    ParentBackground = False
+    ParentColor = True
+    TabOrder = 0
+  end
+  object TmrFullScreen: TTimer
+    Enabled = False
+    Interval = 500
+    OnTimer = TmrFullScreenTimer
+    Left = 544
+    Top = 320
+  end
+  object TmrStop: TTimer
+    Enabled = False
+    Interval = 500
+    OnTimer = TmrStopTimer
+    Left = 320
+    Top = 288
+  end
+end

+ 64 - 0
VmsCmraViewer - 20240801/SRC/FrmCameraScreenF.h

@@ -0,0 +1,64 @@
+//---------------------------------------------------------------------------
+
+#ifndef FrmCameraScreenFH
+#define FrmCameraScreenFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <ExtCtrls.hpp>
+//---------------------------------------------------------------------------
+#include "FrmCameraPlayerF.h"
+#include "CDSMonitoringObjF.h"
+#include "FFBaseComponent.hpp"
+#include "FFLog.hpp"
+
+typedef struct
+{
+    int screenCnt;
+    struct
+    {
+        bool              show;
+        bool              installed;
+        String            CTLR_NMBR;
+        TFrmCameraPlayer *frmCam;
+    } info[MAX_CAMERA_PER_SCREEM];
+} SCREEN_FORM;
+
+class TFrmCameraScreen : public TForm
+{
+__published:	// IDE-managed Components
+    TPanel *PnlCamera;
+    TTimer *TmrFullScreen;
+    TTimer *TmrStop;
+    void __fastcall TmrFullScreenTimer(TObject *Sender);
+    void __fastcall TmrStopTimer(TObject *Sender);
+private:	// User declarations
+public:		// User declarations
+    __fastcall TFrmCameraScreen(TComponent* Owner);
+
+public:
+    String FTitle;
+    int    FCols, FRows;
+    int    FLayout;
+    int    FScreenCnt;
+
+    int    FFullScreenIdx;
+
+    SCREEN_FORM screeForm;
+
+    void __fastcall CommClose();
+    void __fastcall SetLayout(int ALayout);
+    void __fastcall ResetScreenForm(String AScreenName);
+    void __fastcall RecalFormSize();
+    void __fastcall Play();
+    void __fastcall Stop();
+
+    __property int Layout = { read=FLayout, write=SetLayout };
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TFrmCameraScreen *FrmCameraScreen;
+//---------------------------------------------------------------------------
+#endif
+

+ 434 - 0
VmsCmraViewer - 20240801/SRC/FrmVmsCmraViewerF.cpp

@@ -0,0 +1,434 @@
+//---------------------------------------------------------------------------
+
+#include <vcl.h>
+#include "AppGlobalF.h"
+#include "ITSSkinF.h"
+#include "ITSUtilF.h"
+#include "FrmVmsCmraViewerF.h"
+#include "DMDbF.h"
+#pragma hdrstop
+
+#include "FrmVmsCmraViewerF.h"
+#include "FrmCameraScreenF.h"
+#include "VMSVIEWMF.h"
+
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma link "cxContainer"
+#pragma link "cxControls"
+#pragma link "cxEdit"
+#pragma link "cxGraphics"
+#pragma link "cxGroupBox"
+#pragma link "cxLabel"
+#pragma link "cxLookAndFeelPainters"
+#pragma link "cxLookAndFeels"
+#pragma link "cxPC"
+#pragma link "cxPCdxBarPopupMenu"
+#pragma link "cxSplitter"
+#pragma link "dxSkinBlack"
+#pragma link "dxSkinBlue"
+#pragma link "dxSkinCaramel"
+#pragma link "dxSkinCoffee"
+#pragma link "dxSkinDarkRoom"
+#pragma link "dxSkinDarkSide"
+#pragma link "dxSkinFoggy"
+#pragma link "dxSkinGlassOceans"
+#pragma link "dxSkiniMaginary"
+#pragma link "dxSkinLilian"
+#pragma link "dxSkinLiquidSky"
+#pragma link "dxSkinLondonLiquidSky"
+#pragma link "dxSkinMcSkin"
+#pragma link "dxSkinMoneyTwins"
+#pragma link "dxSkinOffice2007Black"
+#pragma link "dxSkinOffice2007Blue"
+#pragma link "dxSkinOffice2007Green"
+#pragma link "dxSkinOffice2007Pink"
+#pragma link "dxSkinOffice2007Silver"
+#pragma link "dxSkinOffice2010Black"
+#pragma link "dxSkinOffice2010Blue"
+#pragma link "dxSkinOffice2010Silver"
+#pragma link "dxSkinsCore"
+#pragma link "dxSkinscxPCPainter"
+#pragma link "dxSkinSeven"
+#pragma link "dxSkinSharp"
+#pragma link "dxSkinSilver"
+#pragma link "dxSkinStardust"
+#pragma link "cxClasses"
+#pragma link "cxCustomData"
+#pragma link "cxData"
+#pragma link "cxDataStorage"
+#pragma link "cxFilter"
+#pragma link "cxGrid"
+#pragma link "cxGridCustomTableView"
+#pragma link "cxGridCustomView"
+#pragma link "cxGridLevel"
+#pragma link "cxGridTableView"
+#pragma link "cxStyles"
+#pragma link "cxTextEdit"
+#pragma link "cxGridCardView"
+#pragma link "cxGridCustomLayoutView"
+#pragma link "cxCheckBox"
+#pragma link "cxDropDownEdit"
+#pragma link "cxImage"
+#pragma link "cxButtons"
+#pragma link "FRAME_VmsMsgListF"
+#pragma link "cxHint"
+#pragma link "dxCustomHint"
+#pragma link "dxScreenTip"
+#pragma link "dxSkinsForm"
+#pragma link "dxGDIPlusClasses"
+#pragma link "cxMaskEdit"
+#pragma resource "*.dfm"
+TFrmVmsCmraViewer *FrmVmsCmraViewer = NULL;
+
+//---------------------------------------------------------------------------
+__fastcall TFrmVmsCmraViewer::TFrmVmsCmraViewer(TComponent* Owner)
+    : TForm(Owner)
+{
+    //CMM_SetFormPosition(g_AppCfg.bSaveForm);
+
+    ITSSkin_Initialize(Application, g_AppCfg.sLang);
+    ITSSkin_Caption(false);
+    ITSSkin_Load(this);
+    //CMM_LoadForm(g_sFormsDir, this);
+
+    SetColorScheme(g_AppCfg.sSkinName);
+
+    FMonitoringType = enMonitoringCamera;
+
+    //if (FormStyle != fsMDIChild) CMM_LoadForm(g_sFormsDir, this);
+
+    FSelVmsObj= NULL;
+    FSelForm  = NULL;
+
+    FReady = false;
+}
+//---------------------------------------------------------------------------
+void __fastcall TFrmVmsCmraViewer::SetColorScheme(String ASkinName)
+{
+    dxSkinController1->SkinName = ASkinName;
+    dxSkinController1->Refresh();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmVmsCmraViewer::CommClose()
+{
+    try
+    {
+        //if (FormStyle != fsMDIChild) CMM_SaveForm(g_sFormsDir, this);
+
+        if (FrmCameraScreen) {
+            FrmCameraScreen->CommClose();
+        }
+
+        ITSSkin_Term();
+        //CMM_SaveForm(g_sFormsDir, this);
+    }
+    catch(...)
+    {
+    }
+}
+//---------------------------------------------------------------------------
+void __fastcall TFrmVmsCmraViewer::FormCreate(TObject *Sender)
+{
+    FrmCameraScreen = new TFrmCameraScreen(PnlBack);
+    FrmCameraScreen->Parent = PnlBack;
+    FrmCameraScreen->Show();
+
+    //Application->ShowMainForm = true;
+}
+//---------------------------------------------------------------------------
+void __fastcall TFrmVmsCmraViewer::InitDbLoading()
+{
+    Application->ProcessMessages();
+
+    ObjScreenManager = new TMonitoringScreenManager();
+    ObjCtlrManager   = new TMonitoringCtlrManager(enMonitoringCamera);
+
+    if (DbOpen()) {
+        if (SysCodeManager == NULL) {
+            SysCodeManager = new TSysCodeManager();
+        }
+        SysCodeManager->LoadFromDb(DMDb->GetConnection());
+
+        if (!VmsTypeManager)
+        {
+            VmsTypeManager = new TVmsTypeManager();
+        }
+        VmsTypeManager->LoadFromDb(DMDb->GetConnection());
+
+        if (!VmsCtlrManager) {
+            VmsCtlrManager = new TVmsCtlrManager();
+        }
+        VmsCtlrManager->LoadVmsModlSize(DMDb->GetConnection());
+        VmsCtlrManager->LoadFromDb(DMDb->GetConnection());
+        VmsCtlrManager->LoadStatusFromDb(DMDb->GetConnection());
+
+        ObjCtlrManager->LoadCtlrFromDb(DMDb->GetConnection());
+        ObjCtlrManager->InitMonitoringFormFromDb(DMDb->GetConnection());
+        ObjCtlrManager->LoadMonitoringFormFromDb(DMDb->GetConnection());
+    }
+    DbClose();
+}
+//---------------------------------------------------------------------------
+void __fastcall TFrmVmsCmraViewer::FormShow(TObject *Sender)
+{
+    Application->ProcessMessages();
+    InitDbLoading();
+    Refresh();
+    Application->ProcessMessages();
+
+    FWindowState = WindowState;
+    FLastAlign = Align;
+    FLastBounds = BoundsRect;
+
+    TmrShow->Enabled = true;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmVmsCmraViewer::LoadLocalSkin()
+{
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmVmsCmraViewer::TmrShowTimer(TObject *Sender)
+{
+    TmrShow->Enabled = false;
+    FormInit();
+}
+//---------------------------------------------------------------------------
+void __fastcall TFrmVmsCmraViewer::FormInit()
+{
+    IsLoading = true;
+    CreateMonitoringScreen();
+
+    PnlBack->ParentColor = true;
+}
+//---------------------------------------------------------------------------
+void __fastcall TFrmVmsCmraViewer::CreateMonitoringScreen()
+{
+    Application->ProcessMessages();
+    CbScreenList->Properties->OnChange = NULL;
+    try
+    {
+        //LockWindowUpdate(Handle);
+        CbScreenList->Properties->Items->Clear();
+        FOR_STL(TMonitoringScreen*, pObj, ObjScreenManager->FLists)
+        {
+			CbScreenList->Properties->Items->Add(" " + pObj->NAME + " ");
+        }
+        CbScreenList->ItemIndex = 0;
+    }
+    __finally
+    {
+        CbScreenList->Properties->OnChange = CbScreenListPropertiesChange;
+        ResetScreenForm();
+        //LockWindowUpdate(0);
+    }
+}
+//---------------------------------------------------------------------------
+void __fastcall TFrmVmsCmraViewer::FormClose(TObject *Sender, TCloseAction &Action)
+{
+    try {
+        CommClose();
+
+        FrmVmsCmraViewer = NULL;
+        Action = caFree;
+    } catch(...) {}
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmVmsCmraViewer::ResetScreenForm()
+{
+    if (FrmCameraScreen && IsLoading) {
+        FrmCameraScreen->ResetScreenForm(CbScreenList->Text.Trim());
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmVmsCmraViewer::BtnMonitoringMngrClick(TObject *Sender)
+{
+    if (DbOpen()) {
+        TVMSVIEWM *pForm = new TVMSVIEWM(this);
+        pForm->FMonitoringType = FMonitoringType;
+        pForm->FDbConnection = DMDb->GetConnection();
+        pForm->ShowModal();
+        bool bUpdate = pForm->FUpdate;
+        SAFE_DELETE(pForm);
+
+        if (bUpdate) {
+            ObjCtlrManager->LoadMonitoringFormFromDb(DMDb->GetConnection());
+            CreateMonitoringScreen();
+        }
+    }
+    DbClose();
+    EdFocus->SetFocus();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmVmsCmraViewer::ApplicationEvents1Minimize(TObject *Sender)
+{
+    //영상표출을 정지한다.
+    if (FrmCameraScreen && IsLoading) {
+        FrmCameraScreen->Stop();
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmVmsCmraViewer::ApplicationEvents1Restore(TObject *Sender)
+{
+    //영상표출을 재상영한다.
+    if (FrmCameraScreen && IsLoading) {
+        FrmCameraScreen->Play();
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmVmsCmraViewer::FormResize(TObject *Sender)
+{
+    if (IsFormResizing == false)
+    {
+        RecalFormSize();
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmVmsCmraViewer::WMEnterSizeMove(TMessage &Msg)
+{
+    IsFormResizing = true;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmVmsCmraViewer::WMExitSizeMove(TMessage &Msg)
+{
+    IsFormResizing = false;
+    RecalFormSize();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmVmsCmraViewer::RecalFormSize()
+{
+    int nNewW = Width;
+    int nNewH = Height;
+
+    if (nNewW == FOldWidth && nNewH == FOldHeight) {
+        return;
+    }
+
+    Application->ProcessMessages();
+    FOldWidth = nNewW;
+    FOldHeight= nNewH;
+
+    if (FrmCameraScreen && IsLoading) {
+        FrmCameraScreen->RecalFormSize();
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmVmsCmraViewer::CbScreenListPropertiesChange(TObject *Sender)
+{
+    EdFocus->SetFocus();
+    ResetScreenForm();
+}
+//---------------------------------------------------------------------------
+bool __fastcall TFrmVmsCmraViewer::DbOpen()
+{
+    if (g_AppCfg.itsdb.sConnectStr == "")
+    {
+        DMDb->SetConnectString(g_AppCfg.itsdb.sProvider, g_AppCfg.itsdb.sServerName, g_AppCfg.itsdb.sUserName, g_AppCfg.itsdb.sPassword);
+    }
+    else
+    {
+        DMDb->SetConnectString(g_AppCfg.itsdb.sConnectStr);
+    }
+    if (!DMDb->Connect())
+    {
+        Application->MessageBox(L"데이터베이스 연결에 실패하였습니다.\r\n\r\n프로그램을 다시 시작하십시요.",
+                                L"데이터베이스 연결 오류!!!",
+                                MB_OK|MB_ICONERROR);
+        return false;
+    }
+    return true;
+}
+//---------------------------------------------------------------------------
+void __fastcall TFrmVmsCmraViewer::DbClose()
+{
+    DMDb->Close();
+}
+//---------------------------------------------------------------------------
+void __fastcall TFrmVmsCmraViewer::FullScreen()
+{
+    if (WindowState == wsMaximized) {
+        // 최대화면에서 전체화면 표출시 화면위치좌표 오류
+        return;
+    }
+
+    FWindowState = WindowState;
+    FLastAlign = Align;
+    FLastBounds = BoundsRect;
+
+    BorderStyle = bsNone;
+    if (FWindowState != wsMaximized) {
+        WindowState = wsMaximized;
+    }
+    PnlMenu->Visible = false;
+
+    Application->ProcessMessages();
+    Refresh();
+    if (FrmCameraScreen && IsLoading) {
+        FrmCameraScreen->RecalFormSize();
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmVmsCmraViewer::NormalStreen()
+{
+    BorderStyle = bsSizeable;
+    WindowState = FWindowState;
+    PnlMenu->Visible = true;
+
+#if 0
+    if (FWindowState != wsMaximized) {
+        Left = FLastBounds.Left;
+        Top = FLastBounds.Top;
+        Width = FLastBounds.Width();
+        Height = FLastBounds.Height();
+    }
+#endif
+
+    Application->ProcessMessages();
+    Refresh();
+    if (FrmCameraScreen && IsLoading) {
+        FrmCameraScreen->RecalFormSize();
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmVmsCmraViewer::MnuFullScreenClick(TObject *Sender)
+{
+    if (PnlMenu->Visible) {
+        FullScreen();
+    }
+    else {
+        NormalStreen();
+    }
+}
+//---------------------------------------------------------------------------
+
+
+
+void __fastcall TFrmVmsCmraViewer::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
+{
+    if (Key == VK_ESCAPE) {
+        if (PnlMenu->Visible == false) {
+            NormalStreen();
+            //Key = 0;
+        }
+    }
+    else if (Key == VK_F12) {
+        MnuFullScreenClick((TObject*)MnuFullScreen);
+        //Key = 0;
+    }
+}
+//---------------------------------------------------------------------------
+

+ 3032 - 0
VmsCmraViewer - 20240801/SRC/FrmVmsCmraViewerF.dfm

@@ -0,0 +1,3032 @@
+object FrmVmsCmraViewer: TFrmVmsCmraViewer
+  Left = 0
+  Top = 0
+  HorzScrollBar.Visible = False
+  VertScrollBar.Visible = False
+  Caption = 'VMS '#50689#49345' '#47784#45768#53552#47553
+  ClientHeight = 802
+  ClientWidth = 1445
+  Color = clBtnFace
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -12
+  Font.Name = #47569#51008' '#44256#46357
+  Font.Style = []
+  Icon.Data = {
+    000001000100100F000000000000540500001600000028000000100000001E00
+    000001000800000000002C01000000000000000000000000000000000000FFFF
+    FF00F1F3F300FFF1E100FFF2D400FFF0CE00FFECDC00FFEDD200FEE0D200FFE5
+    C400FFDBC100E2DFDB00EADEC900FCD3BD00FFD4B000FECEB200EFCAAC00EEC0
+    A100FCB69B00F9B59500FFAC9A00FCA19700FCAE8500E2B59300EEAB8C00E4A2
+    8800E2A48500E9969A00E39D9B00C6B8AA00DDA08700D4A28500CC9EA800D398
+    8200A9C5D30089E3FF0085EAFF0087E5FF008AD2F20085D5FA0086D2F30088D1
+    EF0088CFF00087CFEF0098AEC1008EBCD600BFB3A800B2A1980098B5A600DCAE
+    7E00DCA47E00CCA97500D69A7C00CC9B7F00C9917A00CF927600C4927900CC8F
+    7700C68B7300CC896A00C4876B00BC967F00BC8C7100B9856C00B5806300B682
+    5700C5756600DA773800DB6C3600C56C3900C6622A00B17E6400B2746200B46F
+    5600A3614000955E4600815B4A0081574D00BC6B3700B5693C00A8703800A172
+    3300A0742A00AE6C3B00B05627007BFFFF0070FBFF007CE2FF007ADAFF007FD4
+    FD0075DAFF0074D2FF007ACFEE006EDDFF0068D2FF0062CEFF0045CAFF007BBE
+    E0007CB2D10074B8DC007DB8CD007AACCA007BABC50044B7EE0073A4BD007960
+    4F007F7532000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000FFFFFF006A6A
+    6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A684B6A6A6A
+    6A6A6A6A6A6A4C4944433A39336A6A6A6A6A4A5345424D3D2E2B3C3E376A6A48
+    38404E1C212C5B565655343B1E6A6A46526554595726262727573336166A6A3F
+    5267232A2829252827593133106A6A3D5265242527252525275931190E6A6A35
+    4F6422252525252527573117096A6A205061222525252525265C3012066A6A1D
+    51602426585A5E5D5E5F3215036A6A1869665762632F2D1F1B13110C006A6A38
+    47411A14110D060205050000006A6A0F080405070B0A6A6A6A6A6A6A6A6A6A6A
+    6A6A6A6A6A6A6A6A6A6A6A6A6A6AFFF80000FF000000F0000000800000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    00000001000080FF0000}
+  KeyPreview = True
+  OldCreateOrder = False
+  Position = poOwnerFormCenter
+  ShowHint = True
+  OnClose = FormClose
+  OnCreate = FormCreate
+  OnKeyDown = FormKeyDown
+  OnResize = FormResize
+  OnShow = FormShow
+  PixelsPerInch = 96
+  TextHeight = 15
+  object EdFocus: TEdit
+    Left = -10
+    Top = -10
+    Width = 2
+    Height = 23
+    ImeName = 'Microsoft Office IME 2007'
+    TabOrder = 0
+    Text = 'EdFocus'
+  end
+  object PnlTitle: TPanel
+    Left = 0
+    Top = 0
+    Width = 1445
+    Height = 50
+    Align = alTop
+    BevelOuter = bvNone
+    ParentColor = True
+    TabOrder = 1
+    Visible = False
+    DesignSize = (
+      1445
+      50)
+    object ImgCaption: TImage
+      Left = 4
+      Top = 4
+      Width = 1436
+      Height = 40
+      Anchors = [akLeft, akTop, akRight]
+      Picture.Data = {
+        0B546478504E47496D61676589504E470D0A1A0A0000000D494844520000188A
+        000000CC0806000000B8B31E9B0000000467414D410000B18F0BFC6105000000
+        097048597300002C4A00002C4A01777A744D0000FFB249444154785EECDD59D7
+        40012396E14F54A84CA1A864168A22531399D260287332CB1045D2DC4E7FD5FF
+        B0D6C777BABB8EF6BAF75E6BBFEB39B8FEC473F0DC9FF8A33FFEE45FFD53BF34
+        333333333333333333333333333333333333333333333333FF9F5F7CC02F3CE0
+        E73F807F77B39F7BC0BFFD007EF6013F73B39FFE007EEA013FF9809FF8007EFC
+        66FFE601FFFA03F8B107FCE8CD7EE403F8E107FCAB07FCCB0FE05FDCEC9F3FE0
+        873E807FF6801FBCD90F7C00DFFF80EF7BC0F77E00FFF466DFF380EFBED93FF9
+        20FEF1CDFED103FEE107F00F1EF05D37FBCE0FE03B1EF0ED37FBB60FE2EFDFEC
+        5B1FF02D1FC0DF7BC0DFBDD9377F00DFF480BF73B3BFFD417CE3CDBEE1015FFF
+        01FCAD077CDDCDBEF603F89A077CF5CDBEEA83F8CA9B7DC503BEFC03F89B0FF8
+        B29BFD8D0FE0AF3FE0AFDDEC4B3F882FB9D9A73E59EFF6573E802F7EC017DDEC
+        0B3F80BFFC802FB8D9E77F109F77B3CF7DC0E77C007FE9017FF1667FE103F8EC
+        077CD6CD3EF383F8F337FB730FF8B31FC0673CE0D36FF6673E804FBBDB273FF9
+        C94F143E158AF8D418F0FF666666666666666666666666666666666666666666
+        6666665EE80F6FF67F1F703CE0FFDCEC7F3FE07FDDEC7F3EE07FDCECBF3FE0BF
+        3DE0BFDEEC0F1EF05F6EF6FB0FF8CF0FF8BD9BFDEE03FED3CDFEE3037EE766BF
+        FD80FFF080DFBAD96F3EE0376EF6EB0FF8F70FF8B59BFDEA037EE566BFFC0045
+        DC4A0AB8D51470AB29B0565260ADA6C05A49F1B39AE2673505D04A8A93D51427
+        2B294C565338ACA470584DE1B09AC25E2545BD6A0A7B9514DDAA29BA555374AB
+        A420564D51AC9282583505AB4A8A55D514ACAA292855524CAAA6985449A1A79A
+        624F35C59E4A8A3DD514622A29C4545388A9A448524D91A49A424925458C6A8A
+        18951431AA2930545364A8A4C0504D01A092E23F3505804A8AF3D414E7A929D0
+        535238A7A6784E49E19C9AC23635856D4A0ADBD4149E29293A535378A6A4204C
+        4D51989AA230A573ACE50E0AB694146CA929A8525350A5A4A04A4DB193926227
+        35C54E4A0A91D41422A92946525228A4A6504849A1909A221E35853C4A8A78D4
+        14D92829B0515364A3A400464D018C9A221825C5296A0A549414A7A8291E5153
+        3CA2A478444D718712E30E25451FAE5828626666666666666666666666666666
+        666666666666666666DE4C718792C20EB5E3018A3B941476A829EE5052D8A1A6
+        B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE2
+        0E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B
+        941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC50
+        53D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D
+        718792C20E35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C5
+        1D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476
+        A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1
+        A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879A
+        E20E25851D6A8A3B941476A829EC5053DCA1748E3ADC41718792C20E35851D6A
+        8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829
+        EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0
+        434D718792C20E35851D6A8A3B941476A829EE5062DCA1A4E8C3150B45CCCCCC
+        CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC9B29EE5052D8A1763C4071
+        8792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D
+        6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A8
+        29EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6
+        B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C2
+        0E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3B
+        D414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC50
+        53DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D
+        718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E2585
+        1D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94CE51
+        873B28EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8
+        A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D7187
+        92C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A
+        8C3B94147DB862A1889999999999999999999999999999999999999999999999
+        7933C51D4A0A3BD48E0728EE5052D8A1A6B8434961879AE20E25851D6A0A3BD4
+        14772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052
+        D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961
+        879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D
+        6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A8
+        29EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4
+        B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C2
+        0E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3B
+        D414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE50
+        52D8A1A6B0434D7187D239EA7007C51D4A0A3BD41476A829EE5052D8A1A6B843
+        4961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25
+        851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414
+        76A829EE5052D8A1A6B84389718792A20F572C14313333333333333333333333
+        3333333333333333333333336FA6B843496187DAF100C51D4A0A3BD414772829
+        EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0
+        434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E
+        35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B94
+        1476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052
+        D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61
+        879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D
+        4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD4147728
+        29EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4
+        B0434D718792C20E35C51D4A0A3BD41476A829EE503A471DEEA0B8434961879A
+        C20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A
+        3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE
+        5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772831EE5052F4E18A8522
+        6666666666666666666666666666666666666666666666E6CD14772829EC503B
+        1EA0B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D7187
+        92C20E35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A
+        0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829
+        EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B8
+        434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E
+        25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94
+        1476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053
+        D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D71
+        8792C20E35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D
+        4AE7A8C31D14772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476
+        A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1
+        A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879A
+        E20E25C61D4A8A3E5CB150C4CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
+        CCCCCCBC99E20E25851D6AC70314772829EC5053DCA1A4B0434D718792C20E35
+        851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414
+        772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DC
+        A1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D7187
+        92C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A
+        0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829
+        EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8
+        434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E
+        35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4
+        14772829EC5053D8A1A6B843E91C75B883E20E25851D6A0A3BD414772829EC50
+        53DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D
+        718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E2585
+        1D6A0A3BD414772829EC5053DCA1C4B84349D1872B168A989999999999999999
+        9999999999999999999999999999993753DCA1A4B043ED7880E20E25851D6A8A
+        3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE
+        5052D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B043
+        4D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35
+        C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414
+        772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8
+        A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B843496187
+        9AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A
+        8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829
+        EE5052D8A1A6B8434961879AE20E25851D6A0A3BD41477289DA30E7750DCA1A4
+        B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C2
+        0E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3B
+        D414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B9418772829FA70
+        C542113333333333333333333333333333333333333333333333F3668A3B9414
+        76A81D0F50DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1
+        A6B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879A
+        E20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A
+        3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC
+        5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B043
+        4D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35
+        C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B9414
+        76A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8
+        A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D6187
+        9AE20EA573D4E10E8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D
+        4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD4147728
+        29EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4
+        B0434D718712E30E25451FAE5828626666666666666666666666666666666666
+        666666666666DE4C718792C20EB5E3018A3B941476A829EE5052D8A1A6B84349
+        61879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E2585
+        1D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476
+        A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1
+        A6B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792
+        C20E35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A
+        3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC
+        5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B843
+        4961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25
+        851D6A8A3B941476A829EC5053DCA1748E3ADC41718792C20E35851D6A8A3B94
+        1476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053
+        D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D71
+        8792C20E35851D6A8A3B941476A829EE5062DCA1A4E8C3150B45CCCCCCCCCCCC
+        CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC9B29EE5052D8A1763C40718792C2
+        0E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3B
+        D414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE50
+        52D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B84349
+        61879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E3585
+        1D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41477
+        2829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1
+        A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792
+        C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A
+        3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94CE51873B28
+        EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8
+        434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E
+        35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A8C3B94
+        147DB862A18899999999999999999999999999999999999999999999997933C5
+        1D4A0A3BD48E0728EE5052D8A1A6B8434961879AE20E25851D6A0A3BD4147728
+        29EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6
+        B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE2
+        0E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B
+        941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE50
+        52D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D
+        61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C5
+        1D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD41477
+        2829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1
+        A6B0434D7187D239EA7007C51D4A0A3BD41476A829EE5052D8A1A6B843496187
+        9AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A
+        8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829
+        EE5052D8A1A6B84389718792A20F572C14313333333333333333333333333333
+        3333333333333333336FA6B843496187DAF100C51D4A0A3BD414772829EC5053
+        DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D71
+        8792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D
+        4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A8
+        29EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6
+        B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE2
+        0E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3B
+        D41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC50
+        53DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D
+        718792C20E35C51D4A0A3BD41476A829EE503A471DEEA0B8434961879AC20E35
+        C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B9414
+        76A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8
+        A1A6B8434961879AC20E35C51D4A0A3BD414772831EE5052F4E18A8522666666
+        6666666666666666666666666666666666666666E6CD14772829EC503B1EA0B8
+        434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E
+        35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD4
+        14772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053
+        DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B8434961
+        879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D
+        6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A8
+        29EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6
+        B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C2
+        0E35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4AE7A8
+        C31D14772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC
+        5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B843
+        4961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25
+        C61D4A8A3E5CB150C4CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
+        BC99E20E25851D6AC70314772829EC5053DCA1A4B0434D718792C20E35851D6A
+        8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829
+        EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0
+        434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E
+        35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4
+        14772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052
+        D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961
+        879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D
+        6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4147728
+        29EC5053D8A1A6B843E91C75B883E20E25851D6A0A3BD414772829EC5053DCA1
+        A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792
+        C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A
+        3BD414772829EC5053DCA1C4B84349D1872B168A989999999999999999999999
+        9999999999999999999999993753DCA1A4B043ED7880E20E25851D6A8A3B9414
+        76A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8
+        A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D6187
+        9AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A
+        0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414772829
+        EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0
+        434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E
+        25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B94
+        1476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052
+        D8A1A6B8434961879AE20E25851D6A0A3BD41477289DA30E7750DCA1A4B0434D
+        61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C5
+        1D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD41477
+        2829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B9418772829FA70C54211
+        3333333333333333333333333333333333333333333333F3668A3B941476A81D
+        0F50DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B843
+        4961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25
+        851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD414
+        76A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053DC
+        A1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D7187
+        92C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A
+        0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829
+        EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8
+        434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E
+        A573D4E10E8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3B
+        D41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC50
+        53DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D
+        718712E30E25451FAE5828626666666666666666666666666666666666666666
+        666666DE4C718792C20EB5E3018A3B941476A829EE5052D8A1A6B8434961879A
+        C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A8A
+        3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE
+        5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B843
+        4961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35
+        851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414
+        772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053DC
+        A1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B843496187
+        9AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A
+        8A3B941476A829EC5053DCA1748E3ADC41718792C20E35851D6A8A3B941476A8
+        29EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6
+        B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C2
+        0E35851D6A8A3B941476A829EE5062DCA1A4E8C3150B45CCCCCCCCCCCCCCCCCC
+        CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC9B29EE5052D8A1763C40718792C20E35C5
+        1D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD41477
+        2829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1
+        A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879A
+        E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A
+        3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC
+        5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B043
+        4D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35
+        C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414
+        772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94CE51873B28EE5052
+        D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961
+        879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D
+        6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A8C3B94147DB8
+        62A18899999999999999999999999999999999999999999999997933C51D4A0A
+        3BD48E0728EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC50
+        53DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D
+        718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E2585
+        1D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476
+        A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1
+        A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879A
+        E20E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A
+        3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC
+        5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B043
+        4D7187D239EA7007C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E
+        25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B94
+        1476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052
+        D8A1A6B84389718792A20F572C14313333333333333333333333333333333333
+        3333333333336FA6B843496187DAF100C51D4A0A3BD414772829EC5053DCA1A4
+        B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C2
+        0E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3B
+        D414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC50
+        53DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B84349
+        61879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E2585
+        1D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476
+        A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1
+        A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792
+        C20E35C51D4A0A3BD41476A829EE503A471DEEA0B8434961879AC20E35C51D4A
+        0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829
+        EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8
+        434961879AC20E35C51D4A0A3BD414772831EE5052F4E18A8522666666666666
+        6666666666666666666666666666666666E6CD14772829EC503B1EA0B8434961
+        879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35851D
+        6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD4147728
+        29EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4
+        B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC2
+        0E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B
+        941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE50
+        52D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B84349
+        61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E3585
+        1D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4AE7A8C31D14
+        772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053DC
+        A1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B843496187
+        9AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25C61D4A
+        8A3E5CB150C4CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBC99E2
+        0E25851D6AC70314772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94
+        1476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053
+        D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D71
+        8792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D
+        4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4147728
+        29EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6
+        B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE2
+        0E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B
+        941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC50
+        53D8A1A6B843E91C75B883E20E25851D6A0A3BD414772829EC5053DCA1A4B043
+        4D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35
+        C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414
+        772829EC5053DCA1C4B84349D1872B168A989999999999999999999999999999
+        9999999999999999993753DCA1A4B043ED7880E20E25851D6A8A3B941476A829
+        EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8
+        434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E
+        25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4
+        1476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053
+        DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D71
+        8792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D
+        6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A8
+        29EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6
+        B8434961879AE20E25851D6A0A3BD41477289DA30E7750DCA1A4B0434D61879A
+        E20E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A
+        3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC
+        5053DCA1A4B0434D61879AE20E25851D6A8A3B9418772829FA70C54211333333
+        3333333333333333333333333333333333333333F3668A3B941476A81D0F50DC
+        A1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B843496187
+        9AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A
+        8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829
+        EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0
+        434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E
+        35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD4
+        14772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053
+        DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961
+        879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20EA573D4
+        E10E8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476
+        A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1
+        A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718712
+        E30E25451FAE5828626666666666666666666666666666666666666666666666
+        DE4C718792C20EB5E3018A3B941476A829EE5052D8A1A6B8434961879AC20E35
+        C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B9414
+        76A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8
+        A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B843496187
+        9AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A
+        8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829
+        EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0
+        434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E
+        35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B94
+        1476A829EC5053DCA1748E3ADC41718792C20E35851D6A8A3B941476A829EE50
+        52D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B84349
+        61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E3585
+        1D6A8A3B941476A829EE5062DCA1A4E8C3150B45CCCCCCCCCCCCCCCCCCCCCCCC
+        CCCCCCCCCCCCCCCCCCCCCCCC9B29EE5052D8A1763C40718792C20E35C51D4A0A
+        3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC
+        5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B043
+        4D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25
+        851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B9414
+        76A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8
+        A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D7187
+        92C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A
+        0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829
+        EC5053DCA1A4B0434D718792C20E35851D6A8A3B94CE51873B28EE5052D8A1A6
+        B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE2
+        0E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B
+        941476A829EE5052D8A1A6B0434D718792C20E35C51D4A8C3B94147DB862A188
+        99999999999999999999999999999999999999999999997933C51D4A0A3BD48E
+        0728EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1
+        A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792
+        C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A
+        3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE
+        5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B843
+        4961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25
+        851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414
+        76A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DC
+        A1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D7187
+        D239EA7007C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D
+        6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A8
+        29EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6
+        B84389718792A20F572C14313333333333333333333333333333333333333333
+        3333336FA6B843496187DAF100C51D4A0A3BD414772829EC5053DCA1A4B0434D
+        61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35C5
+        1D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD41477
+        2829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1
+        A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879A
+        C20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A
+        3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE
+        5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B043
+        4D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35
+        C51D4A0A3BD41476A829EE503A471DEEA0B8434961879AC20E35C51D4A0A3BD4
+        14772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053
+        DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961
+        879AC20E35C51D4A0A3BD414772831EE5052F4E18A8522666666666666666666
+        6666666666666666666666666666E6CD14772829EC503B1EA0B8434961879AE2
+        0E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B
+        941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC50
+        53D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D
+        718792C20E35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C5
+        1D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476
+        A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1
+        A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879A
+        E20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A
+        3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4AE7A8C31D14772829
+        EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0
+        434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E
+        35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25C61D4A8A3E5C
+        B150C4CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBC99E20E2585
+        1D6AC70314772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A8
+        29EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6
+        B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C2
+        0E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3B
+        D414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC50
+        53DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D
+        718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E2585
+        1D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476
+        A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1
+        A6B843E91C75B883E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D7187
+        92C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A
+        0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829
+        EC5053DCA1C4B84349D1872B168A989999999999999999999999999999999999
+        9999999999993753DCA1A4B043ED7880E20E25851D6A8A3B941476A829EE5052
+        D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961
+        879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D
+        6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A8
+        29EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4
+        B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C2
+        0E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3B
+        D414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE50
+        52D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B84349
+        61879AE20E25851D6A0A3BD41477289DA30E7750DCA1A4B0434D61879AE20E25
+        851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414
+        76A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DC
+        A1A4B0434D61879AE20E25851D6A8A3B9418772829FA70C54211333333333333
+        3333333333333333333333333333333333F3668A3B941476A81D0F50DCA1A4B0
+        434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E
+        35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B94
+        1476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052
+        D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61
+        879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D
+        4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD4147728
+        29EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4
+        B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC2
+        0E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20EA573D4E10E8A
+        3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE
+        5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B043
+        4D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718712E30E25
+        451FAE5828626666666666666666666666666666666666666666666666DE4C71
+        8792C20EB5E3018A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A
+        0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829
+        EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B8
+        434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E
+        25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94
+        1476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053
+        D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D71
+        8792C20E35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D
+        4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A8
+        29EC5053DCA1748E3ADC41718792C20E35851D6A8A3B941476A829EE5052D8A1
+        A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879A
+        E20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A
+        3B941476A829EE5062DCA1A4E8C3150B45CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
+        CCCCCCCCCCCCCCCCCC9B29EE5052D8A1763C40718792C20E35C51D4A0A3BD414
+        772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DC
+        A1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D7187
+        92C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A
+        0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829
+        EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8
+        434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E
+        35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4
+        14772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053
+        DCA1A4B0434D718792C20E35851D6A8A3B94CE51873B28EE5052D8A1A6B0434D
+        718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E2585
+        1D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476
+        A829EE5052D8A1A6B0434D718792C20E35C51D4A8C3B94147DB862A188999999
+        99999999999999999999999999999999999999997933C51D4A0A3BD48E0728EE
+        5052D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B043
+        4D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35
+        C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414
+        772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8
+        A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B843496187
+        9AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A
+        8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829
+        EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0
+        434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D7187D239EA
+        7007C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3B
+        D414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE50
+        52D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B84389
+        718792A20F572C14313333333333333333333333333333333333333333333333
+        6FA6B843496187DAF100C51D4A0A3BD414772829EC5053DCA1A4B0434D61879A
+        E20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A
+        3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC
+        5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B043
+        4D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35
+        C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B9414
+        76A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8
+        A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D6187
+        9AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A
+        0A3BD41476A829EE503A471DEEA0B8434961879AC20E35C51D4A0A3BD4147728
+        29EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4
+        B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC2
+        0E35C51D4A0A3BD414772831EE5052F4E18A8522666666666666666666666666
+        6666666666666666666666E6CD14772829EC503B1EA0B8434961879AE20E2585
+        1D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476
+        A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1
+        A6B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792
+        C20E35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A
+        3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC
+        5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B843
+        4961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25
+        851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B9414
+        76A829EE5052D8A1A6B8434961879AC20E35C51D4AE7A8C31D14772829EC5053
+        D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D71
+        8792C20E35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D
+        4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25C61D4A8A3E5CB150C4
+        CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBC99E20E25851D6AC7
+        0314772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE50
+        52D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B84349
+        61879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E3585
+        1D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41477
+        2829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1
+        A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792
+        C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A
+        3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE
+        5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843
+        E91C75B883E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E
+        35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4
+        14772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053
+        DCA1C4B84349D1872B168A989999999999999999999999999999999999999999
+        9999993753DCA1A4B043ED7880E20E25851D6A8A3B941476A829EE5052D8A1A6
+        B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE2
+        0E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B
+        941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE50
+        52D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D
+        61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C5
+        1D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD41477
+        2829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1
+        A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879A
+        E20E25851D6A0A3BD41477289DA30E7750DCA1A4B0434D61879AE20E25851D6A
+        8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829
+        EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0
+        434D61879AE20E25851D6A8A3B9418772829FA70C54211333333333333333333
+        3333333333333333333333333333F3668A3B941476A81D0F50DCA1A4B0434D71
+        8792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D
+        4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A8
+        29EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6
+        B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE2
+        0E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3B
+        D41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC50
+        53DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D
+        718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C5
+        1D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20EA573D4E10E8A3B9414
+        76A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8
+        A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D6187
+        9AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718712E30E25451FAE
+        5828626666666666666666666666666666666666666666666666DE4C718792C2
+        0EB5E3018A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD4
+        14772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053
+        DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B8434961
+        879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D
+        6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A8
+        29EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6
+        B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C2
+        0E35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3B
+        D414772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC50
+        53DCA1748E3ADC41718792C20E35851D6A8A3B941476A829EE5052D8A1A6B843
+        4961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25
+        851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B9414
+        76A829EE5062DCA1A4E8C3150B45CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
+        CCCCCCCCCCCC9B29EE5052D8A1763C40718792C20E35C51D4A0A3BD414772829
+        EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0
+        434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E
+        35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4
+        14772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052
+        D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961
+        879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D
+        6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4147728
+        29EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4
+        B0434D718792C20E35851D6A8A3B94CE51873B28EE5052D8A1A6B0434D718792
+        C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A
+        3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE
+        5052D8A1A6B0434D718792C20E35C51D4A8C3B94147DB862A188999999999999
+        99999999999999999999999999999999997933C51D4A0A3BD48E0728EE5052D8
+        A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D6187
+        9AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A
+        0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414772829
+        EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0
+        434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E
+        25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B94
+        1476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052
+        D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61
+        879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D7187D239EA7007C5
+        1D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD41477
+        2829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1
+        A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B84389718792
+        A20F572C143133333333333333333333333333333333333333333333336FA6B8
+        43496187DAF100C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25
+        851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD414
+        76A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053DC
+        A1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D7187
+        92C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A
+        0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829
+        EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8
+        434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E
+        25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD4
+        1476A829EE503A471DEEA0B8434961879AC20E35C51D4A0A3BD414772829EC50
+        53DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D
+        718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C5
+        1D4A0A3BD414772831EE5052F4E18A8522666666666666666666666666666666
+        6666666666666666E6CD14772829EC503B1EA0B8434961879AE20E25851D6A8A
+        3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE
+        5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B843
+        4961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35
+        851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414
+        772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053DC
+        A1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B843496187
+        9AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A
+        8A3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829
+        EE5052D8A1A6B8434961879AC20E35C51D4AE7A8C31D14772829EC5053D8A1A6
+        B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C2
+        0E35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3B
+        D414772829EC5053D8A1A6B8434961879AE20E25C61D4A8A3E5CB150C4CCCCCC
+        CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBC99E20E25851D6AC7031477
+        2829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1
+        A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879A
+        E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A
+        3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC
+        5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B043
+        4D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35
+        C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414
+        772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8
+        A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843E91C75
+        B883E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D
+        6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4147728
+        29EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1C4
+        B84349D1872B168A989999999999999999999999999999999999999999999999
+        3753DCA1A4B043ED7880E20E25851D6A8A3B941476A829EE5052D8A1A6B0434D
+        718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E2585
+        1D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476
+        A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1
+        A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879A
+        E20E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A
+        3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC
+        5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B043
+        4D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25
+        851D6A0A3BD41477289DA30E7750DCA1A4B0434D61879AE20E25851D6A8A3B94
+        1476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052
+        D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61
+        879AE20E25851D6A8A3B9418772829FA70C54211333333333333333333333333
+        3333333333333333333333F3668A3B941476A81D0F50DCA1A4B0434D718792C2
+        0E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3B
+        D414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC50
+        53DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B84349
+        61879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E2585
+        1D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476
+        A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1
+        A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792
+        C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A
+        3BD414772829EC5053DCA1A4B0434D61879AE20EA573D4E10E8A3B941476A829
+        EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8
+        434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E
+        25851D6A8A3B941476A829EC5053DCA1A4B0434D718712E30E25451FAE582862
+        6666666666666666666666666666666666666666666666DE4C718792C20EB5E3
+        018A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD4147728
+        29EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4
+        B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC2
+        0E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B
+        941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE50
+        52D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B84349
+        61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E3585
+        1D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD41477
+        2829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1
+        748E3ADC41718792C20E35851D6A8A3B941476A829EE5052D8A1A6B843496187
+        9AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A
+        8A3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829
+        EE5062DCA1A4E8C3150B45CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
+        CCCCCC9B29EE5052D8A1763C40718792C20E35C51D4A0A3BD414772829EC5053
+        D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D71
+        8792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D
+        4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4147728
+        29EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6
+        B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE2
+        0E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B
+        941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC50
+        53D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D
+        718792C20E35851D6A8A3B94CE51873B28EE5052D8A1A6B0434D718792C20E35
+        C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414
+        772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8
+        A1A6B0434D718792C20E35C51D4A8C3B94147DB862A188999999999999999999
+        99999999999999999999999999997933C51D4A0A3BD48E0728EE5052D8A1A6B8
+        434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E
+        25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4
+        1476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053
+        DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D71
+        8792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D
+        6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A8
+        29EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6
+        B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE2
+        0E25851D6A8A3B941476A829EE5052D8A1A6B0434D7187D239EA7007C51D4A0A
+        3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC
+        5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B043
+        4D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B84389718792A20F57
+        2C143133333333333333333333333333333333333333333333336FA6B8434961
+        87DAF100C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A
+        8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829
+        EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0
+        434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E
+        35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD4
+        14772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053
+        DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961
+        879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D
+        6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A8
+        29EE503A471DEEA0B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1
+        A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792
+        C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A
+        3BD414772831EE5052F4E18A8522666666666666666666666666666666666666
+        6666666666E6CD14772829EC503B1EA0B8434961879AE20E25851D6A8A3B9414
+        76A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8
+        A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B843496187
+        9AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A
+        8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829
+        EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0
+        434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E
+        35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B94
+        1476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052
+        D8A1A6B8434961879AC20E35C51D4AE7A8C31D14772829EC5053D8A1A6B84349
+        61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E3585
+        1D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD41477
+        2829EC5053D8A1A6B8434961879AE20E25C61D4A8A3E5CB150C4CCCCCCCCCCCC
+        CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBC99E20E25851D6AC70314772829EC
+        5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B043
+        4D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25
+        851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B9414
+        76A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8
+        A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D7187
+        92C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A
+        0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829
+        EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0
+        434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843E91C75B883E2
+        0E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B
+        941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC50
+        53D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1C4B84349
+        D1872B168A9899999999999999999999999999999999999999999999993753DC
+        A1A4B043ED7880E20E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792
+        C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A
+        3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE
+        5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B843
+        4961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25
+        851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414
+        76A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DC
+        A1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D7187
+        92C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A
+        0A3BD41477289DA30E7750DCA1A4B0434D61879AE20E25851D6A8A3B941476A8
+        29EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6
+        B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE2
+        0E25851D6A8A3B9418772829FA70C54211333333333333333333333333333333
+        3333333333333333F3668A3B941476A81D0F50DCA1A4B0434D718792C20E35C5
+        1D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD41477
+        2829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1
+        A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879A
+        C20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A
+        3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE
+        5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B043
+        4D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35
+        C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414
+        772829EC5053DCA1A4B0434D61879AE20EA573D4E10E8A3B941476A829EC5053
+        DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961
+        879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D
+        6A8A3B941476A829EC5053DCA1A4B0434D718712E30E25451FAE582862666666
+        6666666666666666666666666666666666666666DE4C718792C20EB5E3018A3B
+        941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC50
+        53D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D
+        718792C20E35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C5
+        1D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476
+        A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1
+        A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879A
+        E20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A
+        3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC
+        5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1748E3A
+        DC41718792C20E35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E
+        35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B94
+        1476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5062
+        DCA1A4E8C3150B45CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
+        9B29EE5052D8A1763C40718792C20E35C51D4A0A3BD414772829EC5053D8A1A6
+        B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C2
+        0E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3B
+        D414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC50
+        53DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D
+        718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E2585
+        1D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476
+        A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1
+        A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792
+        C20E35851D6A8A3B94CE51873B28EE5052D8A1A6B0434D718792C20E35C51D4A
+        0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829
+        EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0
+        434D718792C20E35C51D4A8C3B94147DB862A188999999999999999999999999
+        99999999999999999999997933C51D4A0A3BD48E0728EE5052D8A1A6B8434961
+        879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D
+        6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A8
+        29EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4
+        B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C2
+        0E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3B
+        D414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE50
+        52D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B84349
+        61879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E2585
+        1D6A8A3B941476A829EE5052D8A1A6B0434D7187D239EA7007C51D4A0A3BD414
+        76A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DC
+        A1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D7187
+        92C20E35C51D4A0A3BD41476A829EE5052D8A1A6B84389718792A20F572C1431
+        33333333333333333333333333333333333333333333336FA6B843496187DAF1
+        00C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B94
+        1476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052
+        D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61
+        879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D
+        4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD4147728
+        29EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4
+        B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC2
+        0E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B
+        941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE50
+        3A471DEEA0B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B043
+        4D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35
+        C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414
+        772831EE5052F4E18A8522666666666666666666666666666666666666666666
+        6666E6CD14772829EC503B1EA0B8434961879AE20E25851D6A8A3B941476A829
+        EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B8
+        434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E
+        25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94
+        1476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053
+        D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D71
+        8792C20E35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D
+        4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A8
+        29EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6
+        B8434961879AC20E35C51D4AE7A8C31D14772829EC5053D8A1A6B8434961879A
+        E20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A
+        3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC
+        5053D8A1A6B8434961879AE20E25C61D4A8A3E5CB150C4CCCCCCCCCCCCCCCCCC
+        CCCCCCCCCCCCCCCCCCCCCCCCCCCCBC99E20E25851D6AC70314772829EC5053DC
+        A1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D7187
+        92C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A
+        0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829
+        EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8
+        434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E
+        35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4
+        14772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053
+        DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D71
+        8792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843E91C75B883E20E2585
+        1D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476
+        A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1
+        A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1C4B84349D1872B
+        168A9899999999999999999999999999999999999999999999993753DCA1A4B0
+        43ED7880E20E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35
+        C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414
+        772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8
+        A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B843496187
+        9AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A
+        8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829
+        EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0
+        434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E
+        35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD4
+        1477289DA30E7750DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE50
+        52D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B84349
+        61879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E2585
+        1D6A8A3B9418772829FA70C54211333333333333333333333333333333333333
+        3333333333F3668A3B941476A81D0F50DCA1A4B0434D718792C20E35C51D4A0A
+        3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC
+        5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B043
+        4D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35
+        C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B9414
+        76A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8
+        A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D6187
+        9AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A
+        0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829
+        EC5053DCA1A4B0434D61879AE20EA573D4E10E8A3B941476A829EC5053DCA1A4
+        B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC2
+        0E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B
+        941476A829EC5053DCA1A4B0434D718712E30E25451FAE582862666666666666
+        6666666666666666666666666666666666DE4C718792C20EB5E3018A3B941476
+        A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1
+        A6B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792
+        C20E35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A
+        3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC
+        5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B843
+        4961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25
+        851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B9414
+        76A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8
+        A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1748E3ADC4171
+        8792C20E35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D
+        4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A8
+        29EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5062DCA1A4
+        E8C3150B45CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC9B29EE
+        5052D8A1763C40718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B84349
+        61879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E3585
+        1D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41477
+        2829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1
+        A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792
+        C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A
+        3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE
+        5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843
+        4961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35
+        851D6A8A3B94CE51873B28EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4
+        14772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053
+        DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D71
+        8792C20E35C51D4A8C3B94147DB862A188999999999999999999999999999999
+        99999999999999997933C51D4A0A3BD48E0728EE5052D8A1A6B8434961879AE2
+        0E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B
+        941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE50
+        52D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D
+        61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C5
+        1D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD41477
+        2829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1
+        A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879A
+        E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A
+        3B941476A829EE5052D8A1A6B0434D7187D239EA7007C51D4A0A3BD41476A829
+        EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0
+        434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E
+        35C51D4A0A3BD41476A829EE5052D8A1A6B84389718792A20F572C1431333333
+        33333333333333333333333333333333333333336FA6B843496187DAF100C51D
+        4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A8
+        29EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6
+        B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE2
+        0E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3B
+        D41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC50
+        53DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D
+        718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C5
+        1D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476
+        A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE503A471D
+        EEA0B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D6187
+        9AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A
+        0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772831
+        EE5052F4E18A85226666666666666666666666666666666666666666666666E6
+        CD14772829EC503B1EA0B8434961879AE20E25851D6A8A3B941476A829EC5053
+        DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B8434961
+        879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D
+        6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A8
+        29EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6
+        B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C2
+        0E35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3B
+        D414772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC50
+        53DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B84349
+        61879AC20E35C51D4AE7A8C31D14772829EC5053D8A1A6B8434961879AE20E25
+        851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B9414
+        76A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8
+        A1A6B8434961879AE20E25C61D4A8A3E5CB150C4CCCCCCCCCCCCCCCCCCCCCCCC
+        CCCCCCCCCCCCCCCCCCCCCCBC99E20E25851D6AC70314772829EC5053DCA1A4B0
+        434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E
+        35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4
+        14772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052
+        D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961
+        879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D
+        6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4147728
+        29EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4
+        B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C2
+        0E35C51D4A0A3BD414772829EC5053D8A1A6B843E91C75B883E20E25851D6A0A
+        3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE
+        5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843
+        4961879AE20E25851D6A0A3BD414772829EC5053DCA1C4B84349D1872B168A98
+        99999999999999999999999999999999999999999999993753DCA1A4B043ED78
+        80E20E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A
+        0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414772829
+        EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0
+        434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E
+        25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B94
+        1476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052
+        D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61
+        879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D
+        4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD4147728
+        9DA30E7750DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1
+        A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879A
+        E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A
+        3B9418772829FA70C54211333333333333333333333333333333333333333333
+        3333F3668A3B941476A81D0F50DCA1A4B0434D718792C20E35C51D4A0A3BD414
+        76A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053DC
+        A1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D7187
+        92C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A
+        0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829
+        EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8
+        434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E
+        25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD4
+        1476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053
+        DCA1A4B0434D61879AE20EA573D4E10E8A3B941476A829EC5053DCA1A4B0434D
+        718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C5
+        1D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476
+        A829EC5053DCA1A4B0434D718712E30E25451FAE582862666666666666666666
+        6666666666666666666666666666DE4C718792C20EB5E3018A3B941476A829EE
+        5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B843
+        4961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35
+        851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414
+        772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053DC
+        A1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B843496187
+        9AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A
+        8A3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829
+        EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8
+        434961879AE20E25851D6A8A3B941476A829EC5053DCA1748E3ADC41718792C2
+        0E35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3B
+        D414772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC50
+        53DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5062DCA1A4E8C315
+        0B45CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC9B29EE5052D8
+        A1763C40718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879A
+        E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A
+        3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC
+        5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B043
+        4D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35
+        C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414
+        772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8
+        A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843496187
+        9AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A
+        8A3B94CE51873B28EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4147728
+        29EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4
+        B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C2
+        0E35C51D4A8C3B94147DB862A188999999999999999999999999999999999999
+        99999999997933C51D4A0A3BD48E0728EE5052D8A1A6B8434961879AE20E2585
+        1D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476
+        A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1
+        A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879A
+        E20E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A
+        3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC
+        5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B043
+        4D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25
+        851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B9414
+        76A829EE5052D8A1A6B0434D7187D239EA7007C51D4A0A3BD41476A829EE5052
+        D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61
+        879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D
+        4A0A3BD41476A829EE5052D8A1A6B84389718792A20F572C1431333333333333
+        33333333333333333333333333333333336FA6B843496187DAF100C51D4A0A3B
+        D414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC50
+        53DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B84349
+        61879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E2585
+        1D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476
+        A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1
+        A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792
+        C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A
+        3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC
+        5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE503A471DEEA0B8
+        434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E
+        25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD4
+        1476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772831EE5052
+        F4E18A85226666666666666666666666666666666666666666666666E6CD1477
+        2829EC503B1EA0B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4
+        B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC2
+        0E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B
+        941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE50
+        52D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B84349
+        61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E3585
+        1D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD41477
+        2829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1
+        A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B8434961879A
+        C20E35C51D4AE7A8C31D14772829EC5053D8A1A6B8434961879AE20E25851D6A
+        8A3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829
+        EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8
+        434961879AE20E25C61D4A8A3E5CB150C4CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
+        CCCCCCCCCCCCCCCCBC99E20E25851D6AC70314772829EC5053DCA1A4B0434D71
+        8792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D
+        4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4147728
+        29EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6
+        B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE2
+        0E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B
+        941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC50
+        53D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D
+        718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C5
+        1D4A0A3BD414772829EC5053D8A1A6B843E91C75B883E20E25851D6A0A3BD414
+        772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8
+        A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843496187
+        9AE20E25851D6A0A3BD414772829EC5053DCA1C4B84349D1872B168A98999999
+        99999999999999999999999999999999999999993753DCA1A4B043ED7880E20E
+        25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4
+        1476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053
+        DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D71
+        8792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D
+        6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A8
+        29EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6
+        B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE2
+        0E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3B
+        D41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD41477289DA30E
+        7750DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B043
+        4D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25
+        851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B9418
+        772829FA70C542113333333333333333333333333333333333333333333333F3
+        668A3B941476A81D0F50DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829
+        EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0
+        434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E
+        35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD4
+        14772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053
+        DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961
+        879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D
+        6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A8
+        29EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4
+        B0434D61879AE20EA573D4E10E8A3B941476A829EC5053DCA1A4B0434D718792
+        C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A
+        3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC
+        5053DCA1A4B0434D718712E30E25451FAE582862666666666666666666666666
+        6666666666666666666666DE4C718792C20EB5E3018A3B941476A829EE5052D8
+        A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B843496187
+        9AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A
+        8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829
+        EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0
+        434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E
+        35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B94
+        1476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052
+        D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961
+        879AE20E25851D6A8A3B941476A829EC5053DCA1748E3ADC41718792C20E3585
+        1D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD41477
+        2829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1
+        A4B0434D718792C20E35851D6A8A3B941476A829EE5062DCA1A4E8C3150B45CC
+        CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC9B29EE5052D8A1763C
+        40718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25
+        851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B9414
+        76A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8
+        A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D7187
+        92C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A
+        0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829
+        EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0
+        434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E
+        25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94
+        CE51873B28EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC50
+        53D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D
+        718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C5
+        1D4A8C3B94147DB862A188999999999999999999999999999999999999999999
+        99997933C51D4A0A3BD48E0728EE5052D8A1A6B8434961879AE20E25851D6A0A
+        3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE
+        5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B843
+        4961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25
+        851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414
+        76A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DC
+        A1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D7187
+        92C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A
+        0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829
+        EE5052D8A1A6B0434D7187D239EA7007C51D4A0A3BD41476A829EE5052D8A1A6
+        B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE2
+        0E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3B
+        D41476A829EE5052D8A1A6B84389718792A20F572C1431333333333333333333
+        33333333333333333333333333336FA6B843496187DAF100C51D4A0A3BD41477
+        2829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1
+        A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879A
+        C20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A
+        3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE
+        5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B043
+        4D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35
+        C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414
+        772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DC
+        A1A4B0434D718792C20E35C51D4A0A3BD41476A829EE503A471DEEA0B8434961
+        879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D
+        6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A8
+        29EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772831EE5052F4E18A
+        85226666666666666666666666666666666666666666666666E6CD14772829EC
+        503B1EA0B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D
+        718792C20E35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C5
+        1D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476
+        A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1
+        A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879A
+        E20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A
+        3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC
+        5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B043
+        4D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35
+        C51D4AE7A8C31D14772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B94
+        1476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052
+        D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961
+        879AE20E25C61D4A8A3E5CB150C4CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
+        CCCCCCCCCCBC99E20E25851D6AC70314772829EC5053DCA1A4B0434D718792C2
+        0E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3B
+        D414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC50
+        53DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D
+        718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E2585
+        1D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476
+        A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1
+        A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792
+        C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A
+        3BD414772829EC5053D8A1A6B843E91C75B883E20E25851D6A0A3BD414772829
+        EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0
+        434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E
+        25851D6A0A3BD414772829EC5053DCA1C4B84349D1872B168A98999999999999
+        99999999999999999999999999999999993753DCA1A4B043ED7880E20E25851D
+        6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A8
+        29EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4
+        B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C2
+        0E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3B
+        D414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE50
+        52D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B84349
+        61879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E2585
+        1D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476
+        A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD41477289DA30E7750DC
+        A1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D7187
+        92C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A
+        0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B9418772829
+        FA70C542113333333333333333333333333333333333333333333333F3668A3B
+        941476A81D0F50DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052
+        D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61
+        879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D
+        4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD4147728
+        29EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4
+        B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC2
+        0E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B
+        941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE50
+        52D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D
+        61879AE20EA573D4E10E8A3B941476A829EC5053DCA1A4B0434D718792C20E35
+        C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414
+        772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DC
+        A1A4B0434D718712E30E25451FAE582862666666666666666666666666666666
+        6666666666666666DE4C718792C20EB5E3018A3B941476A829EE5052D8A1A6B8
+        434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E
+        25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94
+        1476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053
+        D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D71
+        8792C20E35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D
+        4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A8
+        29EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6
+        B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE2
+        0E25851D6A8A3B941476A829EC5053DCA1748E3ADC41718792C20E35851D6A8A
+        3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC
+        5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B043
+        4D718792C20E35851D6A8A3B941476A829EE5062DCA1A4E8C3150B45CCCCCCCC
+        CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC9B29EE5052D8A1763C407187
+        92C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A
+        0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829
+        EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8
+        434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E
+        35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4
+        14772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053
+        DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D71
+        8792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D
+        6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94CE5187
+        3B28EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1
+        A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792
+        C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A8C
+        3B94147DB862A188999999999999999999999999999999999999999999999979
+        33C51D4A0A3BD48E0728EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414
+        772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8
+        A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B843496187
+        9AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A
+        8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829
+        EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0
+        434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E
+        35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD4
+        14772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052
+        D8A1A6B0434D7187D239EA7007C51D4A0A3BD41476A829EE5052D8A1A6B84349
+        61879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E2585
+        1D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476
+        A829EE5052D8A1A6B84389718792A20F572C1431333333333333333333333333
+        33333333333333333333336FA6B843496187DAF100C51D4A0A3BD414772829EC
+        5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B043
+        4D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35
+        C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B9414
+        76A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8
+        A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D6187
+        9AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A
+        0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829
+        EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0
+        434D718792C20E35C51D4A0A3BD41476A829EE503A471DEEA0B8434961879AC2
+        0E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B
+        941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE50
+        52D8A1A6B8434961879AC20E35C51D4A0A3BD414772831EE5052F4E18A852266
+        66666666666666666666666666666666666666666666E6CD14772829EC503B1E
+        A0B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792
+        C20E35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A
+        3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC
+        5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B843
+        4961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25
+        851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B9414
+        76A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8
+        A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D7187
+        92C20E35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A
+        E7A8C31D14772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A8
+        29EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6
+        B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE2
+        0E25C61D4A8A3E5CB150C4CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
+        CCCCBC99E20E25851D6AC70314772829EC5053DCA1A4B0434D718792C20E3585
+        1D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41477
+        2829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1
+        A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792
+        C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A
+        3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE
+        5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843
+        4961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35
+        851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414
+        772829EC5053D8A1A6B843E91C75B883E20E25851D6A0A3BD414772829EC5053
+        DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D71
+        8792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D
+        6A0A3BD414772829EC5053DCA1C4B84349D1872B168A98999999999999999999
+        99999999999999999999999999993753DCA1A4B043ED7880E20E25851D6A8A3B
+        941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE50
+        52D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D
+        61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C5
+        1D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD41477
+        2829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1
+        A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879A
+        E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A
+        3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE
+        5052D8A1A6B8434961879AE20E25851D6A0A3BD41477289DA30E7750DCA1A4B0
+        434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E
+        35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD4
+        14772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B9418772829FA70C5
+        42113333333333333333333333333333333333333333333333F3668A3B941476
+        A81D0F50DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6
+        B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE2
+        0E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3B
+        D41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC50
+        53DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D
+        718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C5
+        1D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476
+        A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1
+        A6B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879A
+        E20EA573D4E10E8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A
+        0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829
+        EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0
+        434D718712E30E25451FAE582862666666666666666666666666666666666666
+        6666666666DE4C718792C20EB5E3018A3B941476A829EE5052D8A1A6B8434961
+        879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D
+        6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A8
+        29EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6
+        B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C2
+        0E35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3B
+        D414772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC50
+        53DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B84349
+        61879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E2585
+        1D6A8A3B941476A829EC5053DCA1748E3ADC41718792C20E35851D6A8A3B9414
+        76A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8
+        A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D7187
+        92C20E35851D6A8A3B941476A829EE5062DCA1A4E8C3150B45CCCCCCCCCCCCCC
+        CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC9B29EE5052D8A1763C40718792C20E
+        35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4
+        14772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052
+        D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961
+        879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D
+        6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4147728
+        29EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4
+        B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C2
+        0E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3B
+        D414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94CE51873B28EE
+        5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843
+        4961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35
+        851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A8C3B9414
+        7DB862A18899999999999999999999999999999999999999999999997933C51D
+        4A0A3BD48E0728EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414772829
+        EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0
+        434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E
+        25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B94
+        1476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052
+        D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61
+        879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D
+        4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD4147728
+        29EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6
+        B0434D7187D239EA7007C51D4A0A3BD41476A829EE5052D8A1A6B8434961879A
+        E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A
+        3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE
+        5052D8A1A6B84389718792A20F572C1431333333333333333333333333333333
+        33333333333333336FA6B843496187DAF100C51D4A0A3BD414772829EC5053DC
+        A1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D7187
+        92C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A
+        0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829
+        EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8
+        434961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E
+        25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD4
+        1476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053
+        DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D71
+        8792C20E35C51D4A0A3BD41476A829EE503A471DEEA0B8434961879AC20E35C5
+        1D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476
+        A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1
+        A6B8434961879AC20E35C51D4A0A3BD414772831EE5052F4E18A852266666666
+        66666666666666666666666666666666666666E6CD14772829EC503B1EA0B843
+        4961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35
+        851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414
+        772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053DC
+        A1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B843496187
+        9AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A
+        8A3B941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829
+        EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8
+        434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E
+        35851D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4AE7A8C3
+        1D14772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC50
+        53DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B84349
+        61879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25C6
+        1D4A8A3E5CB150C4CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBC
+        99E20E25851D6AC70314772829EC5053DCA1A4B0434D718792C20E35851D6A8A
+        3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC
+        5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B043
+        4D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35
+        C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414
+        772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8
+        A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843496187
+        9AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A
+        8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829
+        EC5053D8A1A6B843E91C75B883E20E25851D6A0A3BD414772829EC5053DCA1A4
+        B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C2
+        0E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3B
+        D414772829EC5053DCA1C4B84349D1872B168A98999999999999999999999999
+        99999999999999999999993753DCA1A4B043ED7880E20E25851D6A8A3B941476
+        A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1
+        A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D61879A
+        E20E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A
+        3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC
+        5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EE5052D8A1A6B043
+        4D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25
+        851D6A0A3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B9414
+        76A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8
+        A1A6B8434961879AE20E25851D6A0A3BD41477289DA30E7750DCA1A4B0434D61
+        879AE20E25851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D
+        4A0A3BD41476A829EE5052D8A1A6B8434961879AE20E25851D6A0A3BD4147728
+        29EC5053DCA1A4B0434D61879AE20E25851D6A8A3B9418772829FA70C5421133
+        33333333333333333333333333333333333333333333F3668A3B941476A81D0F
+        50DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B84349
+        61879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20E2585
+        1D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476
+        A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053DCA1
+        A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792
+        C20E35C51D4A0A3BD41476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A
+        3BD414772829EC5053DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC
+        5053DCA1A4B0434D718792C20E35C51D4A0A3BD41476A829EE5052D8A1A6B843
+        4961879AC20E35C51D4A0A3BD414772829EC5053DCA1A4B0434D61879AE20EA5
+        73D4E10E8A3B941476A829EC5053DCA1A4B0434D718792C20E35C51D4A0A3BD4
+        1476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053
+        DCA1A4B0434D61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D71
+        8712E30E25451FAE582862666666666666666666666666666666666666666666
+        6666DE4C718792C20EB5E3018A3B941476A829EE5052D8A1A6B8434961879AC2
+        0E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A8A3B
+        941476A829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE50
+        52D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B84349
+        61879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E3585
+        1D6A8A3B941476A829EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD41477
+        2829EC5053D8A1A6B8434961879AE20E25851D6A8A3B941476A829EC5053DCA1
+        A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B8434961879A
+        C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A8A
+        3B941476A829EC5053DCA1748E3ADC41718792C20E35851D6A8A3B941476A829
+        EE5052D8A1A6B8434961879AC20E35C51D4A0A3BD414772829EC5053D8A1A6B8
+        434961879AE20E25851D6A8A3B941476A829EC5053DCA1A4B0434D718792C20E
+        35851D6A8A3B941476A829EE5062DCA1A4E8C3150B45CCCCCCCCCCCCCCCCCCCC
+        CCCCCCCCCCCCCCCCCCCCCCCCCCCC9B29EE5052D8A1763C40718792C20E35C51D
+        4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4147728
+        29EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6
+        B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE2
+        0E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B
+        941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC50
+        53D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B043ED
+        4FDABB631BBA912808829738633F412E5116D1DC2F02635406EBACF1A6157728
+        29EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4
+        B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C2
+        0E35C51D4A0A3BD414772829EC5053D8A1A6B843E91E757883E20E25851D6A0A
+        3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE
+        5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843
+        4961879AE20E25851D6A0A3BD414772829EC5053DCA1C4B84349D18727168A98
+        99999999999999999999999999999999999999999999992F53DCA1A4B043ED3A
+        40718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25
+        851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B9414
+        76A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8
+        A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D7187
+        92C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A
+        0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829
+        EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0
+        434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E
+        25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94
+        EE51873728EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC50
+        53D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D
+        718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C5
+        1D4A8C3B94147D7862A188999999999999999999999999999999999999999999
+        9999F932C51D4A0A3BD4AE0314772829EC5053DCA1A4B0434D718792C20E3585
+        1D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41477
+        2829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1
+        A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792
+        C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A
+        3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE
+        5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843
+        4961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35
+        851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414
+        772829EC5053D8A1A6B843E91E757883E20E25851D6A0A3BD414772829EC5053
+        DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D71
+        8792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D
+        6A0A3BD414772829EC5053DCA1C4B84349D18727168A98999999999999999999
+        99999999999999999999999999992F53DCA1A4B043ED3A40718792C20E35C51D
+        4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4147728
+        29EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6
+        B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE2
+        0E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B
+        941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC50
+        53D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D
+        718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C5
+        1D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD41477
+        2829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94EE51873728EE5052D8
+        A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843496187
+        9AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A
+        8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A8C3B94147D7862
+        A1889999999999999999999999999999999999999999999999F932C51D4A0A3B
+        D4AE0314772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829
+        EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8
+        434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E
+        35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4
+        14772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053
+        DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D71
+        8792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D
+        6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A8
+        29EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6
+        B843E91E757883E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792
+        C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A
+        3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC
+        5053DCA1C4B84349D18727168A98999999999999999999999999999999999999
+        99999999992F53DCA1A4B043ED3A40718792C20E35C51D4A0A3BD414772829EC
+        5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B043
+        4D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35
+        C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414
+        772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8
+        A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843496187
+        9AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A
+        8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829
+        EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0
+        434D718792C20E35851D6A8A3B94EE51873728EE5052D8A1A6B0434D718792C2
+        0E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3B
+        D414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE50
+        52D8A1A6B0434D718792C20E35C51D4A8C3B94147D7862A18899999999999999
+        99999999999999999999999999999999F932C51D4A0A3BD4AE0314772829EC50
+        53DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D
+        718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E2585
+        1D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476
+        A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1
+        A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792
+        C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A
+        3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC
+        5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B043
+        4D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843E91E757883E20E
+        25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94
+        1476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053
+        D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1C4B84349D1
+        8727168A9899999999999999999999999999999999999999999999992F53DCA1
+        A4B043ED3A40718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961
+        879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D
+        6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4147728
+        29EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4
+        B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C2
+        0E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3B
+        D414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE50
+        52D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B84349
+        61879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E3585
+        1D6A8A3B94EE51873728EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414
+        772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DC
+        A1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D7187
+        92C20E35C51D4A8C3B94147D7862A18899999999999999999999999999999999
+        99999999999999F932C51D4A0A3BD4AE0314772829EC5053DCA1A4B0434D7187
+        92C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A
+        0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829
+        EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0
+        434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E
+        25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94
+        1476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053
+        D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D71
+        8792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D
+        4A0A3BD414772829EC5053D8A1A6B843E91E757883E20E25851D6A0A3BD41477
+        2829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1
+        A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879A
+        E20E25851D6A0A3BD414772829EC5053DCA1C4B84349D18727168A9899999999
+        999999999999999999999999999999999999992F53DCA1A4B043ED3A40718792
+        C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A
+        3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE
+        5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843
+        4961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35
+        851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414
+        772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DC
+        A1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D7187
+        92C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A
+        0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94EE518737
+        28EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6
+        B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C2
+        0E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A8C3B
+        94147D7862A1889999999999999999999999999999999999999999999999F932
+        C51D4A0A3BD4AE0314772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B
+        941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC50
+        53D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D
+        718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C5
+        1D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD41477
+        2829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1
+        A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879A
+        E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A
+        3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC
+        5053D8A1A6B843E91E757883E20E25851D6A0A3BD414772829EC5053DCA1A4B0
+        434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E
+        35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4
+        14772829EC5053DCA1C4B84349D18727168A9899999999999999999999999999
+        999999999999999999992F53DCA1A4B043ED3A40718792C20E35C51D4A0A3BD4
+        14772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053
+        DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D71
+        8792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D
+        6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A8
+        29EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6
+        B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C2
+        0E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3B
+        D414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC50
+        53DCA1A4B0434D718792C20E35851D6A8A3B94EE51873728EE5052D8A1A6B043
+        4D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25
+        851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B9414
+        76A829EE5052D8A1A6B0434D718792C20E35C51D4A8C3B94147D7862A1889999
+        999999999999999999999999999999999999999999F932C51D4A0A3BD4AE0314
+        772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8
+        A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843496187
+        9AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A
+        8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829
+        EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0
+        434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E
+        35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4
+        14772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052
+        D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843E91E
+        757883E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E3585
+        1D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41477
+        2829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1
+        C4B84349D18727168A9899999999999999999999999999999999999999999999
+        992F53DCA1A4B043ED3A40718792C20E35C51D4A0A3BD414772829EC5053D8A1
+        A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792
+        C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A
+        3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC
+        5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B043
+        4D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25
+        851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B9414
+        76A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8
+        A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D7187
+        92C20E35851D6A8A3B94EE51873728EE5052D8A1A6B0434D718792C20E35C51D
+        4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4147728
+        29EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6
+        B0434D718792C20E35C51D4A8C3B94147D7862A1889999999999999999999999
+        999999999999999999999999F932C51D4A0A3BD4AE0314772829EC5053DCA1A4
+        B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C2
+        0E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3B
+        D414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE50
+        52D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B84349
+        61879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E3585
+        1D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41477
+        2829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1
+        A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792
+        C20E35C51D4A0A3BD414772829EC5053D8A1A6B843E91E757883E20E25851D6A
+        0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829
+        EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8
+        434961879AE20E25851D6A0A3BD414772829EC5053DCA1C4B84349D18727168A
+        9899999999999999999999999999999999999999999999992F53DCA1A4B043ED
+        3A40718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E
+        25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94
+        1476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053
+        D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D71
+        8792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D
+        4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4147728
+        29EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6
+        B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE2
+        0E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B
+        94EE51873728EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC
+        5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B043
+        4D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35
+        C51D4A8C3B94147D7862A1889999999999999999999999999999999999999999
+        999999F932C51D4A0A3BD4AE0314772829EC5053DCA1A4B0434D718792C20E35
+        851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414
+        772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DC
+        A1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D7187
+        92C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A
+        0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829
+        EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8
+        434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E
+        35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4
+        14772829EC5053D8A1A6B843E91E757883E20E25851D6A0A3BD414772829EC50
+        53DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D
+        718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E2585
+        1D6A0A3BD414772829EC5053DCA1C4B84349D18727168A989999999999999999
+        9999999999999999999999999999992F53DCA1A4B043ED3A40718792C20E35C5
+        1D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD41477
+        2829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1
+        A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879A
+        E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A
+        3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC
+        5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B043
+        4D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35
+        C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414
+        772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94EE51873728EE5052
+        D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961
+        879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D
+        6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A8C3B94147D78
+        62A1889999999999999999999999999999999999999999999999F932C51D4A0A
+        3BD4AE0314772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A8
+        29EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6
+        B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C2
+        0E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3B
+        D414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC50
+        53DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D
+        718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E2585
+        1D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476
+        A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1
+        A6B843E91E757883E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D7187
+        92C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A
+        0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829
+        EC5053DCA1C4B84349D18727168A989999999999999999999999999999999999
+        9999999999992F53DCA1A4B043ED3A40718792C20E35C51D4A0A3BD414772829
+        EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0
+        434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E
+        35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4
+        14772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052
+        D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961
+        879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D
+        6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4147728
+        29EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4
+        B0434D718792C20E35851D6A8A3B94EE51873728EE5052D8A1A6B0434D718792
+        C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A
+        3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE
+        5052D8A1A6B0434D718792C20E35C51D4A8C3B94147D7862A188999999999999
+        9999999999999999999999999999999999F932C51D4A0A3BD4AE0314772829EC
+        5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B043
+        4D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25
+        851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B9414
+        76A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8
+        A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D7187
+        92C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A
+        0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829
+        EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0
+        434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843E91E757883E2
+        0E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B
+        941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC50
+        53D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1C4B84349
+        D18727168A9899999999999999999999999999999999999999999999992F53DC
+        A1A4B043ED3A40718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B84349
+        61879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E3585
+        1D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41477
+        2829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1
+        A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792
+        C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A
+        3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE
+        5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843
+        4961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35
+        851D6A8A3B94EE51873728EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4
+        14772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053
+        DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D71
+        8792C20E35C51D4A8C3B94147D7862A188999999999999999999999999999999
+        9999999999999999F932C51D4A0A3BD4AE0314772829EC5053DCA1A4B0434D71
+        8792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D
+        4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4147728
+        29EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6
+        B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE2
+        0E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B
+        941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC50
+        53D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D
+        718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C5
+        1D4A0A3BD414772829EC5053D8A1A6B843E91E757883E20E25851D6A0A3BD414
+        772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8
+        A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843496187
+        9AE20E25851D6A0A3BD414772829EC5053DCA1C4B84349D18727168A98999999
+        99999999999999999999999999999999999999992F53DCA1A4B043ED3A407187
+        92C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A
+        0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829
+        EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8
+        434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E
+        35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4
+        14772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053
+        DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D71
+        8792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D
+        6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94EE5187
+        3728EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1
+        A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792
+        C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A8C
+        3B94147D7862A1889999999999999999999999999999999999999999999999F9
+        32C51D4A0A3BD4AE0314772829EC5053DCA1A4B0434D718792C20E35851D6A8A
+        3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC
+        5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B043
+        4D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35
+        C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414
+        772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8
+        A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843496187
+        9AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A
+        8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829
+        EC5053D8A1A6B843E91E757883E20E25851D6A0A3BD414772829EC5053DCA1A4
+        B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C2
+        0E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3B
+        D414772829EC5053DCA1C4B84349D18727168A98999999999999999999999999
+        99999999999999999999992F53DCA1A4B043ED3A40718792C20E35C51D4A0A3B
+        D414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC50
+        53DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D
+        718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E2585
+        1D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476
+        A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1
+        A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792
+        C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A
+        3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC
+        5053DCA1A4B0434D718792C20E35851D6A8A3B94EE51873728EE5052D8A1A6B0
+        434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E
+        25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94
+        1476A829EE5052D8A1A6B0434D718792C20E35C51D4A8C3B94147D7862A18899
+        99999999999999999999999999999999999999999999F932C51D4A0A3BD4AE03
+        14772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052
+        D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961
+        879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D
+        6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4147728
+        29EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4
+        B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C2
+        0E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3B
+        D414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE50
+        52D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843E9
+        1E757883E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35
+        851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414
+        772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DC
+        A1C4B84349D18727168A98999999999999999999999999999999999999999999
+        99992F53DCA1A4B043ED3A40718792C20E35C51D4A0A3BD414772829EC5053D8
+        A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D7187
+        92C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A
+        0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829
+        EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0
+        434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E
+        25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94
+        1476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053
+        D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D71
+        8792C20E35851D6A8A3B94EE51873728EE5052D8A1A6B0434D718792C20E35C5
+        1D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD41477
+        2829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1
+        A6B0434D718792C20E35C51D4A8C3B94147D7862A18899999999999999999999
+        99999999999999999999999999F932C51D4A0A3BD4AE0314772829EC5053DCA1
+        A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792
+        C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A
+        3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE
+        5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843
+        4961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35
+        851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414
+        772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DC
+        A1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D7187
+        92C20E35C51D4A0A3BD414772829EC5053D8A1A6B843E91E757883E20E25851D
+        6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A8
+        29EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6
+        B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1C4B84349D1872716
+        8A9899999999999999999999999999999999999999999999992F53DCA1A4B043
+        ED3A40718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE2
+        0E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B
+        941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC50
+        53D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D
+        718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C5
+        1D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD41477
+        2829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1
+        A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879A
+        E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A
+        3B94EE51873728EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829
+        EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0
+        434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E
+        35C51D4A8C3B94147D7862A18899999999999999999999999999999999999999
+        99999999F932C51D4A0A3BD4AE0314772829EC5053DCA1A4B0434D718792C20E
+        35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4
+        14772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053
+        DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D71
+        8792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D
+        6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A8
+        29EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6
+        B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C2
+        0E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3B
+        D414772829EC5053D8A1A6B843E91E757883E20E25851D6A0A3BD414772829EC
+        5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B043
+        4D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25
+        851D6A0A3BD414772829EC5053DCA1C4B84349D18727168A9899999999999999
+        999999999999999999999999999999992F53DCA1A4B043ED3A40718792C20E35
+        C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414
+        772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8
+        A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843496187
+        9AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A
+        8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829
+        EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0
+        434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E
+        35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4
+        14772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94EE51873728EE50
+        52D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B84349
+        61879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E3585
+        1D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A8C3B94147D
+        7862A1889999999999999999999999999999999999999999999999F932C51D4A
+        0A3BD4AE0314772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476
+        A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1
+        A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792
+        C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A
+        3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC
+        5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B043
+        4D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25
+        851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B9414
+        76A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8
+        A1A6B843E91E757883E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D71
+        8792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D
+        4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4147728
+        29EC5053DCA1C4B84349D18727168A9899999999999999999999999999999999
+        999999999999992F53DCA1A4B043ED3A40718792C20E35C51D4A0A3BD4147728
+        29EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4
+        B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C2
+        0E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3B
+        D414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE50
+        52D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B84349
+        61879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E3585
+        1D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41477
+        2829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1
+        A4B0434D718792C20E35851D6A8A3B94EE51873728EE5052D8A1A6B0434D7187
+        92C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A
+        0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829
+        EE5052D8A1A6B0434D718792C20E35C51D4A8C3B94147D7862A1889999999999
+        999999999999999999999999999999999999F932C51D4A0A3BD4AE0314772829
+        EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0
+        434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E
+        25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94
+        1476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053
+        D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D71
+        8792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D
+        4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4147728
+        29EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6
+        B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843E91E757883
+        E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A
+        3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC
+        5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1C4B843
+        49D18727168A9899999999999999999999999999999999999999999999992F53
+        DCA1A4B043ED3A40718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843
+        4961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35
+        851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414
+        772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DC
+        A1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D7187
+        92C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A
+        0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829
+        EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8
+        434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E
+        35851D6A8A3B94EE51873728EE5052D8A1A6B0434D718792C20E35C51D4A0A3B
+        D414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC50
+        53DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D
+        718792C20E35C51D4A8C3B94147D7862A1889999999999999999999999999999
+        999999999999999999F932C51D4A0A3BD4AE0314772829EC5053DCA1A4B0434D
+        718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C5
+        1D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD41477
+        2829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1
+        A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879A
+        E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A
+        3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC
+        5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B043
+        4D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35
+        C51D4A0A3BD414772829EC5053D8A1A6B843E91E757883E20E25851D6A0A3BD4
+        14772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052
+        D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961
+        879AE20E25851D6A0A3BD414772829EC5053DCA1C4B84349D18727168A989999
+        9999999999999999999999999999999999999999992F53DCA1A4B043ED3A4071
+        8792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D
+        6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A8
+        29EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6
+        B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C2
+        0E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3B
+        D414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC50
+        53DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D
+        718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E2585
+        1D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94EE51
+        873728EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8
+        A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D7187
+        92C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A
+        8C3B94147D7862A1889999999999999999999999999999999999999999999999
+        F932C51D4A0A3BD4AE0314772829EC5053DCA1A4B0434D718792C20E35851D6A
+        8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829
+        EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0
+        434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E
+        35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4
+        14772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052
+        D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961
+        879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D
+        6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4147728
+        29EC5053D8A1A6B843E91E757883E20E25851D6A0A3BD414772829EC5053DCA1
+        A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792
+        C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A
+        3BD414772829EC5053DCA1C4B84349D18727168A989999999999999999999999
+        9999999999999999999999992F53DCA1A4B043ED3A40718792C20E35C51D4A0A
+        3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC
+        5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B043
+        4D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25
+        851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B9414
+        76A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8
+        A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D7187
+        92C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A
+        0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829
+        EC5053DCA1A4B0434D718792C20E35851D6A8A3B94EE51873728EE5052D8A1A6
+        B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE2
+        0E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B
+        941476A829EE5052D8A1A6B0434D718792C20E35C51D4A8C3B94147D7862A188
+        9999999999999999999999999999999999999999999999F932C51D4A0A3BD4AE
+        0314772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE50
+        52D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B84349
+        61879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E3585
+        1D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41477
+        2829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1
+        A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792
+        C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A
+        3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE
+        5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843
+        E91E757883E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E
+        35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4
+        14772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053
+        DCA1C4B84349D18727168A989999999999999999999999999999999999999999
+        9999992F53DCA1A4B043ED3A40718792C20E35C51D4A0A3BD414772829EC5053
+        D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D71
+        8792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D
+        4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4147728
+        29EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6
+        B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE2
+        0E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B
+        941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC50
+        53D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D
+        718792C20E35851D6A8A3B94EE51873728EE5052D8A1A6B0434D718792C20E35
+        C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414
+        772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8
+        A1A6B0434D718792C20E35C51D4A8C3B94147D7862A188999999999999999999
+        9999999999999999999999999999F932C51D4A0A3BD4AE0314772829EC5053DC
+        A1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D7187
+        92C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A
+        0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829
+        EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8
+        434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E
+        35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4
+        14772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053
+        DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D71
+        8792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843E91E757883E20E2585
+        1D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476
+        A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1
+        A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1C4B84349D18727
+        168A9899999999999999999999999999999999999999999999992F53DCA1A4B0
+        43ED3A40718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879A
+        E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A
+        3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC
+        5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B043
+        4D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35
+        C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414
+        772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8
+        A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843496187
+        9AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A
+        8A3B94EE51873728EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4147728
+        29EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4
+        B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C2
+        0E35C51D4A8C3B94147D7862A188999999999999999999999999999999999999
+        9999999999F932C51D4A0A3BD4AE0314772829EC5053DCA1A4B0434D718792C2
+        0E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3B
+        D414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC50
+        53DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D
+        718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E2585
+        1D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476
+        A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1
+        A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792
+        C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A
+        3BD414772829EC5053D8A1A6B843E91E757883E20E25851D6A0A3BD414772829
+        EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0
+        434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E
+        25851D6A0A3BD414772829EC5053DCA1C4B84349D18727168A98999999999999
+        99999999999999999999999999999999992F53DCA1A4B043ED3A40718792C20E
+        35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4
+        14772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052
+        D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961
+        879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D
+        6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4147728
+        29EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4
+        B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C2
+        0E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3B
+        D414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94EE51873728EE
+        5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843
+        4961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35
+        851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A8C3B9414
+        7D7862A1889999999999999999999999999999999999999999999999F932C51D
+        4A0A3BD4AE0314772829EC50B38CFFC7000054074944415453DCA1A4B0434D71
+        8792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D
+        4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4147728
+        29EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6
+        B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE2
+        0E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B
+        941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC50
+        53D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D
+        718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C5
+        1D4A0A3BD414772829EC5053D8A1A6B843E91E757883E20E25851D6A0A3BD414
+        772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8
+        A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843496187
+        9AE20E25851D6A0A3BD414772829EC5053DCA1C4B84349D18727168A98999999
+        99999999999999999999999999999999999999992F53DCA1A4B043ED3A407187
+        92C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A
+        0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829
+        EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8
+        434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E
+        35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4
+        14772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053
+        DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D71
+        8792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D
+        6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94EE5187
+        3728EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1
+        A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792
+        C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A8C
+        3B94147D7862A1889999999999999999999999999999999999999999999999F9
+        32C51D4A0A3BD4AE0314772829EC5053DCA1A4B0434D718792C20E35851D6A8A
+        3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC
+        5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B043
+        4D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35
+        C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414
+        772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8
+        A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843496187
+        9AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A
+        8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829
+        EC5053D8A1A6B843E91E757883E20E25851D6A0A3BD414772829EC5053DCA1A4
+        B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C2
+        0E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3B
+        D414772829EC5053DCA1C4B84349D18727168A98999999999999999999999999
+        99999999999999999999992F53DCA1A4B043ED3A40718792C20E35C51D4A0A3B
+        D414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC50
+        53DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D
+        718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E2585
+        1D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476
+        A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1
+        A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792
+        C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A
+        3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC
+        5053DCA1A4B0434D718792C20E35851D6A8A3B94EE51873728EE5052D8A1A6B0
+        434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E
+        25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94
+        1476A829EE5052D8A1A6B0434D718792C20E35C51D4A8C3B94147D7862A18899
+        99999999999999999999999999999999999999999999F932C51D4A0A3BD4AE03
+        14772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052
+        D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961
+        879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D
+        6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4147728
+        29EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4
+        B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C2
+        0E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3B
+        D414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE50
+        52D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843E9
+        1E757883E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35
+        851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414
+        772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DC
+        A1C4B84349D18727168A98999999999999999999999999999999999999999999
+        99992F53DCA1A4B043ED3A40718792C20E35C51D4A0A3BD414772829EC5053D8
+        A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D7187
+        92C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A
+        0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829
+        EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0
+        434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E
+        25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94
+        1476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053
+        D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D71
+        8792C20E35851D6A8A3B94EE51873728EE5052D8A1A6B0434D718792C20E35C5
+        1D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD41477
+        2829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1
+        A6B0434D718792C20E35C51D4A8C3B94147D7862A18899999999999999999999
+        99999999999999999999999999F932C51D4A0A3BD4AE0314772829EC5053DCA1
+        A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792
+        C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A
+        3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE
+        5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843
+        4961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35
+        851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414
+        772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DC
+        A1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D7187
+        92C20E35C51D4A0A3BD414772829EC5053D8A1A6B843E91E757883E20E25851D
+        6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A8
+        29EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6
+        B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1C4B84349D1872716
+        8A9899999999999999999999999999999999999999999999992F53DCA1A4B043
+        ED3A40718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE2
+        0E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B
+        941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC50
+        53D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D
+        718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C5
+        1D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD41477
+        2829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1
+        A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879A
+        E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A
+        3B94EE51873728EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829
+        EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0
+        434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E
+        35C51D4A8C3B94147D7862A18899999999999999999999999999999999999999
+        99999999F932C51D4A0A3BD4AE0314772829EC5053DCA1A4B0434D718792C20E
+        35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4
+        14772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053
+        DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D71
+        8792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D
+        6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A8
+        29EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6
+        B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C2
+        0E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3B
+        D414772829EC5053D8A1A6B843E91E757883E20E25851D6A0A3BD414772829EC
+        5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B043
+        4D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25
+        851D6A0A3BD414772829EC5053DCA1C4B84349D18727168A9899999999999999
+        999999999999999999999999999999992F53DCA1A4B043ED3A40718792C20E35
+        C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414
+        772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8
+        A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843496187
+        9AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A
+        8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829
+        EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0
+        434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E
+        35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4
+        14772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94EE51873728EE50
+        52D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B84349
+        61879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E3585
+        1D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A8C3B94147D
+        7862A1889999999999999999999999999999999999999999999999F932C51D4A
+        0A3BD4AE0314772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476
+        A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1
+        A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792
+        C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A
+        3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC
+        5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B043
+        4D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25
+        851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B9414
+        76A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8
+        A1A6B843E91E757883E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D71
+        8792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D
+        4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4147728
+        29EC5053DCA1C4B84349D18727168A9899999999999999999999999999999999
+        999999999999992F53DCA1A4B043ED3A40718792C20E35C51D4A0A3BD4147728
+        29EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4
+        B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C2
+        0E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3B
+        D414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE50
+        52D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B84349
+        61879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E3585
+        1D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41477
+        2829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1
+        A4B0434D718792C20E35851D6A8A3B94EE51873728EE5052D8A1A6B0434D7187
+        92C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A
+        0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829
+        EE5052D8A1A6B0434D718792C20E35C51D4A8C3B94147D7862A1889999999999
+        999999999999999999999999999999999999F932C51D4A0A3BD4AE0314772829
+        EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0
+        434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E
+        25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94
+        1476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053
+        D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D71
+        8792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D
+        4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4147728
+        29EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6
+        B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843E91E757883
+        E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A
+        3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC
+        5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1C4B843
+        49D18727168A9899999999999999999999999999999999999999999999992F53
+        DCA1A4B043ED3A40718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843
+        4961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35
+        851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414
+        772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DC
+        A1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D7187
+        92C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A
+        0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829
+        EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8
+        434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E
+        35851D6A8A3B94EE51873728EE5052D8A1A6B0434D718792C20E35C51D4A0A3B
+        D414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC50
+        53DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D
+        718792C20E35C51D4A8C3B94147D7862A1889999999999999999999999999999
+        999999999999999999F932C51D4A0A3BD4AE0314772829EC5053DCA1A4B0434D
+        718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C5
+        1D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD41477
+        2829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1
+        A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879A
+        E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A
+        3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC
+        5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B043
+        4D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35
+        C51D4A0A3BD414772829EC5053D8A1A6B843E91E757883E20E25851D6A0A3BD4
+        14772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052
+        D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961
+        879AE20E25851D6A0A3BD414772829EC5053DCA1C4B84349D18727168A989999
+        9999999999999999999999999999999999999999992F53DCA1A4B043ED3A4071
+        8792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D
+        6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A8
+        29EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6
+        B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C2
+        0E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3B
+        D414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC50
+        53DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D
+        718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E2585
+        1D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94EE51
+        873728EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8
+        A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D7187
+        92C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A
+        8C3B94147D7862A1889999999999999999999999999999999999999999999999
+        F932C51D4A0A3BD4AE0314772829EC5053DCA1A4B0434D718792C20E35851D6A
+        8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829
+        EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0
+        434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E
+        35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4
+        14772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052
+        D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961
+        879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D
+        6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4147728
+        29EC5053D8A1A6B843E91E757883E20E25851D6A0A3BD414772829EC5053DCA1
+        A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792
+        C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A
+        3BD414772829EC5053DCA1C4B84349D18727168A989999999999999999999999
+        9999999999999999999999992F53DCA1A4B043ED3A40718792C20E35C51D4A0A
+        3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC
+        5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B043
+        4D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25
+        851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B9414
+        76A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8
+        A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D7187
+        92C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A
+        0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829
+        EC5053DCA1A4B0434D718792C20E35851D6A8A3B94EE51873728EE5052D8A1A6
+        B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE2
+        0E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B
+        941476A829EE5052D8A1A6B0434D718792C20E35C51D4A8C3B94147D7862A188
+        9999999999999999999999999999999999999999999999F932C51D4A0A3BD4AE
+        0314772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE50
+        52D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B84349
+        61879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E3585
+        1D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41477
+        2829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1
+        A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792
+        C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A
+        3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE
+        5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843
+        E91E757883E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E
+        35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4
+        14772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053
+        DCA1C4B84349D18727168A989999999999999999999999999999999999999999
+        9999992F53DCA1A4B043ED3A40718792C20E35C51D4A0A3BD414772829EC5053
+        D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D71
+        8792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D
+        4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4147728
+        29EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6
+        B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE2
+        0E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B
+        941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC50
+        53D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D
+        718792C20E35851D6A8A3B94EE51873728EE5052D8A1A6B0434D718792C20E35
+        C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414
+        772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8
+        A1A6B0434D718792C20E35C51D4A8C3B94147D7862A188999999999999999999
+        9999999999999999999999999999F932C51D4A0A3BD4AE0314772829EC5053DC
+        A1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D7187
+        92C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A
+        0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829
+        EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8
+        434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E
+        35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4
+        14772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053
+        DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D71
+        8792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843E91E757883E20E2585
+        1D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476
+        A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1
+        A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1C4B84349D18727
+        168A9899999999999999999999999999999999999999999999992F53DCA1A4B0
+        43ED3A40718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879A
+        E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A
+        3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC
+        5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B043
+        4D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35
+        C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414
+        772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8
+        A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843496187
+        9AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A
+        8A3B94EE51873728EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4147728
+        29EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4
+        B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C2
+        0E35C51D4A8C3B94147D7862A188999999999999999999999999999999999999
+        9999999999F932C51D4A0A3BD4AE0314772829EC5053DCA1A4B0434D718792C2
+        0E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3B
+        D414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC50
+        53DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D
+        718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E2585
+        1D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476
+        A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1
+        A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792
+        C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A
+        3BD414772829EC5053D8A1A6B843E91E757883E20E25851D6A0A3BD414772829
+        EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0
+        434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E
+        25851D6A0A3BD414772829EC5053DCA1C4B84349D18727168A98999999999999
+        99999999999999999999999999999999992F53DCA1A4B043ED3A40718792C20E
+        35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4
+        14772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052
+        D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961
+        879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D
+        6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4147728
+        29EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4
+        B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C2
+        0E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3B
+        D414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94EE51873728EE
+        5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843
+        4961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35
+        851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A8C3B9414
+        7D7862A1889999999999999999999999999999999999999999999999F932C51D
+        4A0A3BD4AE0314772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B9414
+        76A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8
+        A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D7187
+        92C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A
+        0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829
+        EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0
+        434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E
+        25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94
+        1476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053
+        D8A1A6B843E91E757883E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D
+        718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C5
+        1D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD41477
+        2829EC5053DCA1C4B84349D18727168A98999999999999999999999999999999
+        99999999999999992F53DCA1A4B043ED3A40718792C20E35C51D4A0A3BD41477
+        2829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1
+        A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792
+        C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A
+        3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE
+        5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843
+        4961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35
+        851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414
+        772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DC
+        A1A4B0434D718792C20E35851D6A8A3B94EE51873728EE5052D8A1A6B0434D71
+        8792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D
+        6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A8
+        29EE5052D8A1A6B0434D718792C20E35C51D4A8C3B94147D7862A18899999999
+        99999999999999999999999999999999999999F932C51D4A0A3BD4AE03147728
+        29EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6
+        B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE2
+        0E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B
+        941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC50
+        53D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D
+        718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C5
+        1D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD41477
+        2829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1
+        A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843E91E7578
+        83E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A
+        8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829
+        EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1C4B8
+        4349D18727168A9899999999999999999999999999999999999999999999992F
+        53DCA1A4B043ED3A40718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8
+        434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E
+        35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4
+        14772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053
+        DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D71
+        8792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D
+        6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A8
+        29EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6
+        B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C2
+        0E35851D6A8A3B94EE51873728EE5052D8A1A6B0434D718792C20E35C51D4A0A
+        3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC
+        5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B043
+        4D718792C20E35C51D4A8C3B94147D7862A18899999999999999999999999999
+        99999999999999999999F932C51D4A0A3BD4AE0314772829EC5053DCA1A4B043
+        4D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35
+        C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414
+        772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8
+        A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843496187
+        9AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A
+        8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829
+        EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0
+        434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E
+        35C51D4A0A3BD414772829EC5053D8A1A6B843E91E757883E20E25851D6A0A3B
+        D414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE50
+        52D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B84349
+        61879AE20E25851D6A0A3BD414772829EC5053DCA1C4B84349D18727168A9899
+        999999999999999999999999999999999999999999992F53DCA1A4B043ED3A40
+        718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E2585
+        1D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476
+        A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1
+        A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792
+        C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A
+        3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC
+        5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B043
+        4D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25
+        851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94EE
+        51873728EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053
+        D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D71
+        8792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D
+        4A8C3B94147D7862A18899999999999999999999999999999999999999999999
+        99F932C51D4A0A3BD4AE0314772829EC5053DCA1A4B0434D718792C20E35851D
+        6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4147728
+        29EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4
+        B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C2
+        0E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3B
+        D414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE50
+        52D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B84349
+        61879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E3585
+        1D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41477
+        2829EC5053D8A1A6B843E91E757883E20E25851D6A0A3BD414772829EC5053DC
+        A1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D7187
+        92C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A
+        0A3BD414772829EC5053DCA1C4B84349D18727168A9899999999999999999999
+        999999999999999999999999992F53DCA1A4B043ED3A40718792C20E35C51D4A
+        0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829
+        EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0
+        434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E
+        25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94
+        1476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053
+        D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D71
+        8792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D
+        4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4147728
+        29EC5053DCA1A4B0434D718792C20E35851D6A8A3B94EE51873728EE5052D8A1
+        A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879A
+        E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A
+        3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A8C3B94147D7862A1
+        889999999999999999999999999999999999999999999999F932C51D4A0A3BD4
+        AE0314772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE
+        5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843
+        4961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35
+        851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414
+        772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DC
+        A1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D7187
+        92C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A
+        0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829
+        EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8
+        43E91E757883E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C2
+        0E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3B
+        D414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC50
+        53DCA1C4B84349D18727168A9899999999999999999999999999999999999999
+        999999992F53DCA1A4B043ED3A40718792C20E35C51D4A0A3BD414772829EC50
+        53D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D
+        718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C5
+        1D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD41477
+        2829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1
+        A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879A
+        E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A
+        3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC
+        5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B043
+        4D718792C20E35851D6A8A3B94EE51873728EE5052D8A1A6B0434D718792C20E
+        35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4
+        14772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052
+        D8A1A6B0434D718792C20E35C51D4A8C3B94147D7862A1889999999999999999
+        999999999999999999999999999999F932C51D4A0A3BD4AE0314772829EC5053
+        DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D71
+        8792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D
+        6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A8
+        29EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6
+        B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C2
+        0E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3B
+        D414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC50
+        53DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D
+        718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843E91E757883E20E25
+        851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B9414
+        76A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8
+        A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1C4B84349D187
+        27168A9899999999999999999999999999999999999999999999992F53DCA1A4
+        B043ED3A40718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843496187
+        9AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A
+        8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829
+        EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0
+        434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E
+        35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4
+        14772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052
+        D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961
+        879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D
+        6A8A3B94EE51873728EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41477
+        2829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1
+        A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792
+        C20E35C51D4A8C3B94147D7862A1889999999999999999999999999999999999
+        999999999999F932C51D4A0A3BD4AE0314772829EC5053DCA1A4B0434D718792
+        C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A
+        3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC
+        5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B043
+        4D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25
+        851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B9414
+        76A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8
+        A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D7187
+        92C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A
+        0A3BD414772829EC5053D8A1A6B843E91E757883E20E25851D6A0A3BD4147728
+        29EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6
+        B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE2
+        0E25851D6A0A3BD414772829EC5053DCA1C4B84349D18727168A989999999999
+        9999999999999999999999999999999999992F53DCA1A4B043ED3A40718792C2
+        0E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3B
+        D414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE50
+        52D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B84349
+        61879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E3585
+        1D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41477
+        2829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1
+        A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792
+        C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A
+        3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94EE51873728
+        EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8
+        434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E
+        35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A8C3B94
+        147D7862A1889999999999999999999999999999999999999999999999F932C5
+        1D4A0A3BD4AE0314772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94
+        1476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053
+        D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D71
+        8792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D
+        4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4147728
+        29EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6
+        B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE2
+        0E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B
+        941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC50
+        53D8A1A6B843E91E757883E20E25851D6A0A3BD414772829EC5053DCA1A4B043
+        4D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35
+        C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414
+        772829EC5053DCA1C4B84349D18727168A989999999999999999999999999999
+        9999999999999999992F53DCA1A4B043ED3A40718792C20E35C51D4A0A3BD414
+        772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DC
+        A1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D7187
+        92C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A
+        0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829
+        EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8
+        434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E
+        35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4
+        14772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053
+        DCA1A4B0434D718792C20E35851D6A8A3B94EE51873728EE5052D8A1A6B0434D
+        718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E2585
+        1D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476
+        A829EE5052D8A1A6B0434D718792C20E35C51D4A8C3B94147D7862A188999999
+        9999999999999999999999999999999999999999F932C51D4A0A3BD4AE031477
+        2829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1
+        A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879A
+        E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A
+        3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC
+        5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B043
+        4D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35
+        C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414
+        772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8
+        A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843E91E75
+        7883E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D
+        6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4147728
+        29EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1C4
+        B84349D18727168A989999999999999999999999999999999999999999999999
+        2F53DCA1A4B043ED3A40718792C20E35C51D4A0A3BD414772829EC5053D8A1A6
+        B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C2
+        0E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3B
+        D414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC50
+        53DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D
+        718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E2585
+        1D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476
+        A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1
+        A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792
+        C20E35851D6A8A3B94EE51873728EE5052D8A1A6B0434D718792C20E35C51D4A
+        0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829
+        EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0
+        434D718792C20E35C51D4A8C3B94147D7862A188999999999999999999999999
+        9999999999999999999999F932C51D4A0A3BD4AE0314772829EC5053DCA1A4B0
+        434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E
+        35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4
+        14772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052
+        D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961
+        879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D
+        6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4147728
+        29EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4
+        B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C2
+        0E35C51D4A0A3BD414772829EC5053D8A1A6B843E91E757883E20E25851D6A0A
+        3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE
+        5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843
+        4961879AE20E25851D6A0A3BD414772829EC5053DCA1C4B84349D18727168A98
+        99999999999999999999999999999999999999999999992F53DCA1A4B043ED3A
+        40718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25
+        851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B9414
+        76A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8
+        A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D7187
+        92C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A
+        0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829
+        EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0
+        434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E
+        25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94
+        EE51873728EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC50
+        53D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D
+        718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C5
+        1D4A8C3B94147D7862A188999999999999999999999999999999999999999999
+        9999F932C51D4A0A3BD4AE0314772829EC5053DCA1A4B0434D718792C20E3585
+        1D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD41477
+        2829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1
+        A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792
+        C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A
+        3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE
+        5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843
+        4961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35
+        851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414
+        772829EC5053D8A1A6B843E91E757883E20E25851D6A0A3BD414772829EC5053
+        DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D71
+        8792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D
+        6A0A3BD414772829EC5053DCA1C4B84349D18727168A98999999999999999999
+        99999999999999999999999999992F53DCA1A4B043ED3A40718792C20E35C51D
+        4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD4147728
+        29EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6
+        B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE2
+        0E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B
+        941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC50
+        53D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D
+        718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C5
+        1D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD41477
+        2829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94EE51873728EE5052D8
+        A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843496187
+        9AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A
+        8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A8C3B94147D7862
+        A1889999999999999999999999999999999999999999999999F932C51D4A0A3B
+        D4AE0314772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829
+        EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8
+        434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E
+        35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4
+        14772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053
+        DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D71
+        8792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D
+        6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A8
+        29EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6
+        B843E91E757883E20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792
+        C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A
+        3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC
+        5053DCA1C4B84349D18727168A98999999999999999999999999999999999999
+        99999999992F53DCA1A4B043ED3A40718792C20E35C51D4A0A3BD414772829EC
+        5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B043
+        4D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35
+        C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414
+        772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8
+        A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843496187
+        9AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A
+        8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829
+        EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0
+        434D718792C20E35851D6A8A3B94EE51873728EE5052D8A1A6B0434D718792C2
+        0E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3B
+        D414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE50
+        52D8A1A6B0434D718792C20E35C51D4A8C3B94147D7862A18899999999999999
+        99999999999999999999999999999999F932C51D4A0A3BD4AE0314772829EC50
+        53DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D
+        718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E2585
+        1D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476
+        A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1
+        A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792
+        C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A
+        3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC
+        5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B043
+        4D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B843E91E757883E20E
+        25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B94
+        1476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053
+        D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1C4B84349D1
+        8727168A9899999999999999999999999999999999999999999999992F53DCA1
+        A4B043ED3A40718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B8434961
+        879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E35851D
+        6A8A3B941476A829EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD4147728
+        29EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DCA1A4
+        B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D718792C2
+        0E35C51D4A0A3BD414772829EC5053D8A1A6B8434961879AE20E25851D6A0A3B
+        D414772829EC5053DCA1A4B0434D718792C20E35851D6A8A3B941476A829EE50
+        52D8A1A6B0434D718792C20E35C51D4A0A3BD414772829EC5053D8A1A6B84349
+        61879AE20E25851D6A0A3BD414772829EC5053DCA1A4B0434D718792C20E3585
+        1D6A8A3B94EE51873728EE5052D8A1A6B0434D718792C20E35C51D4A0A3BD414
+        772829EC5053D8A1A6B8434961879AE20E25851D6A0A3BD414772829EC5053DC
+        A1A4B0434D718792C20E35851D6A8A3B941476A829EE5052D8A1A6B0434D7187
+        92C20E35C51D4A8C3B94147D78E26F28E2EFE3D7476266666666666666666666
+        6666666666666666666666666666DEA703EE394F47EEF31B1A0398F3349A30E7
+        6958627E43231C739E864AE63C0DBACC6F68F866CED338D09CA711A5F90D8D4D
+        CD791AE59AF3345C36BFA181B7394F4378739EC602E73734AC38E7697C72CED3
+        48E7FC86C64CE73C0DBECE791AC69DDFB88F07CF6F686879CED318F5FC8646BB
+        E73C8D9BCF791A809FDFD058FE9CC7A8C09CA520C3BFE9FFFFFE00EF68D3C862
+        73D6CE0000000049454E44AE426082}
+      Stretch = True
+    end
+    object LblCaption: TLabel
+      Left = 19
+      Top = 11
+      Width = 237
+      Height = 25
+      Caption = #53440#51060#53952'                                    '
+      Font.Charset = DEFAULT_CHARSET
+      Font.Color = 14391349
+      Font.Height = -19
+      Font.Name = 'Segoe UI'
+      Font.Style = [fsBold]
+      ParentFont = False
+      ParentShowHint = False
+      ShowHint = True
+    end
+    object ImgCaptionLeft: TImage
+      Left = 4
+      Top = 4
+      Width = 10
+      Height = 40
+      Picture.Data = {
+        0B546478504E47496D61676589504E470D0A1A0A0000000D4948445200000010
+        000000CC08060000007A0F23350000000467414D410000B18F0BFC6105000000
+        097048597300002C4A00002C4A01777A744D00000064494441546843EDCC2101
+        80400000312261F0444412871E1F06B80A3C726276CB768E6BC251704FB80482
+        9740108120024104820804110822104420884010812002410482080411082210
+        44208840108120024104820804110822104420C83FC1FEDD581FD122915AE652
+        2FA10000000049454E44AE426082}
+      Stretch = True
+    end
+    object BtnSearch: TcxButton
+      Left = 1357
+      Top = 11
+      Width = 80
+      Height = 25
+      Cursor = crHandPoint
+      Hint = #51312#54924
+      Anchors = [akTop, akRight]
+      Caption = #51312#54924
+      Colors.Default = 10737865
+      LookAndFeel.NativeStyle = False
+      TabOrder = 0
+      Font.Charset = DEFAULT_CHARSET
+      Font.Color = clBlack
+      Font.Height = -13
+      Font.Name = #47569#51008' '#44256#46357
+      Font.Style = [fsBold]
+      ParentFont = False
+    end
+  end
+  object PnlMenu: TPanel
+    Left = 0
+    Top = 50
+    Width = 1445
+    Height = 26
+    Align = alTop
+    BevelOuter = bvNone
+    PopupMenu = PopupMenu1
+    TabOrder = 2
+    object LblScreenList: TcxLabel
+      Left = 0
+      Top = 0
+      Align = alLeft
+      Caption = '  '#54868#47732#47785#47197': '
+      ParentFont = False
+      Style.Font.Charset = ANSI_CHARSET
+      Style.Font.Color = clWindowText
+      Style.Font.Height = -13
+      Style.Font.Name = #47569#51008' '#44256#46357
+      Style.Font.Style = []
+      Style.IsFontAssigned = True
+      Properties.Alignment.Horz = taCenter
+      Properties.Alignment.Vert = taVCenter
+      Transparent = True
+      AnchorX = 37
+      AnchorY = 13
+    end
+    object CbScreenList: TcxComboBox
+      Left = 74
+      Top = 0
+      Cursor = crHandPoint
+      Align = alLeft
+      ParentFont = False
+      Properties.Alignment.Vert = taVCenter
+      Properties.DropDownListStyle = lsFixedList
+      Properties.OnChange = CbScreenListPropertiesChange
+      Style.Font.Charset = ANSI_CHARSET
+      Style.Font.Color = clWindowText
+      Style.Font.Height = -13
+      Style.Font.Name = #47569#51008' '#44256#46357
+      Style.Font.Style = []
+      Style.IsFontAssigned = True
+      TabOrder = 1
+      ExplicitHeight = 21
+      Width = 407
+    end
+    object BtnMonitoringMngr: TcxButton
+      Tag = 2
+      Left = 1332
+      Top = 0
+      Width = 113
+      Height = 26
+      Cursor = crHandPoint
+      Hint = 'Monitoring Screen management'
+      Align = alRight
+      Caption = #54868#47732#44288#47532
+      Colors.Default = 10737865
+      Glyph.Data = {
+        36040000424D3604000000000000360000002800000010000000100000000100
+        2000000000000004000000000000000000000000000000000000000000000000
+        0000A47958C4CA9269F4D19668FFCE9263FFCB8E5EFFC98A5BFFC78756FFC384
+        52FFC38452FFC38452FFC38452FFC38452FFC38452FF81522EB0000000000000
+        0000D7A175FFF8F2EDFFF7F0EAFFF6EDE6FFF4EAE2FFF3E7DEFFF1E4DBFFF0E2
+        D8FFF0E2D8FFF0E2D8FFF0E2D8FFF0E2D8FFF0E2D8FFC3895CFD000000000000
+        0000D9A47AFFF9F3EEFFEBD2BEFFFFFFFFFFEBD3BFFFFFFFFFFFFFFFFFFFFFFF
+        FFFFEAC7ADFFFFFFFFFFFFFFFFFFFFFFFFFFF0E2D8FFC68C5FFF000000000000
+        0000DDA87EFFF9F3EFFFEBD0BAFFEBD0BBFFEBD0BBFFEBD0BBFFEBD0BBFFEBD1
+        BDFFEACDB5FFEACDB5FFEACDB5FFEACDB5FFF0E2D8FFC68A5CFF000000000000
+        0000DFAA82FFF9F3EFFFEACEB7FFFFFFFFFFEBD0BBFFFFFFFFFFFFFFFFFFFFFF
+        FFFFEACFBAFFFBF6F2FFFFFFFFFFFFFFFFFFF0E2D8FFC88D5FFF000000000303
+        0305D8AC8AFFE3DEDBFFD2BBA9FFDBC2ADFFE3C7B0FFEACCB3FFEACCB3FFEACE
+        B7FFE8C7ACFFE8C7ACFFE8C8B0FFE8C8AEFFF0E2D8FFC48654FF040404064444
+        446AAFA49CFFABABAAFFA4A09CFFA7A7A7FFB6A79CFFF3F3F3FFFFFFFFFFFFFF
+        FFFFE8C7ACFFFFFFFFFFFFFFFFFFFFFFFFFFF1E5DBFFC68655FF707070A9CBCB
+        CBFFEAEAEAFFF0F0F0FFF2F2F2FFECECECFFCACACAFF9A9591FFE9C9AEFFE9C9
+        B0FFE8C7ACFFE9C9B0FFE8C8B0FFE8CCB5FFF2E7DEFFC88A59FFA2A2A2F0FAFA
+        FAFFD7D7D7FFE2E2E2FFCACACAFFCFCFCFFFFFFFFFFF939393FFFFFFFFFFFFFF
+        FFFFE8C7ACFFFFFFFFFFFFFFFFFFFFFFFFFFF7F1EBFFCB8F5FFF9E9E9EE8F8F8
+        F8FFD1D1D1FFECECECFFC5C5C5FFC6C6C6FFFFFFFFFF9A9A9AFFE9C3A6FFE9C3
+        A6FFE9C3A6FFE9C3A6FFE9C3A6FFE9C3A6FFFBF7F4FFCE9364FFA1A1A1E8F8F8
+        F8FFD5D5D5FFEFEFEFFFCBCBCBFFCBCBCBFFFFFFFFFF9E9E9EFFFFFFFFFFFFFF
+        FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF7F4FFD1976AFFA4A4A4E8F8F8
+        F8FFDBDBDBFFEFEFEFFFD0D0D0FFD0D0D0FFFFFFFFFFA2A2A2FF8BCB93FF87C9
+        8EFF82C689FF7EC384FF7AC180FF76BE7CFFFBF7F4FFD49B6FFFA6A6A6E9F2F2
+        F2FFD9D9D9FFE4E4E4FFE2E2E2FFC8C8C8FFF1F1F1FFA5A5A5FFFBF7F4FFFBF7
+        F4FFFBF7F4FFFBF7F4FFFBF7F4FFFBF7F4FFFBF7F4FFD19C71F8ABABABEDF6F6
+        F6FFF4F4F4FFF9F9F9FFFBFBFBFFF6F6F6FFF6F6F6FFA8A8A8FFE7B793FFE6B5
+        90FFE4B28CFFE2AF88FFE0AC84FFDDA980FFDCA57DFFAD8161CA787878A4D6D6
+        D6FFEDEDEDFFF9F9F9FFFBFBFBFFF0F0F0FFD9D9D9FF919191D8000000000000
+        00000000000000000000000000000000000000000000000000000C0C0C104F4F
+        4F6C8B8B8BC0A9A9A9EBACACACF3919191D05F5F5F8A19191925000000000000
+        0000000000000000000000000000000000000000000000000000}
+      Spacing = 6
+      TabOrder = 2
+      Font.Charset = ANSI_CHARSET
+      Font.Color = clWindowText
+      Font.Height = -13
+      Font.Name = #47569#51008' '#44256#46357
+      Font.Style = []
+      ParentFont = False
+      OnClick = BtnMonitoringMngrClick
+    end
+  end
+  object PnlBack: TPanel
+    Left = 0
+    Top = 76
+    Width = 1445
+    Height = 726
+    Align = alClient
+    BevelOuter = bvNone
+    ParentBackground = False
+    ParentColor = True
+    TabOrder = 3
+  end
+  object TmrShow: TTimer
+    Enabled = False
+    Interval = 500
+    OnTimer = TmrShowTimer
+    Left = 492
+    Top = 300
+  end
+  object dxSkinController1: TdxSkinController
+    NativeStyle = False
+    SkinName = 'Blue'
+    Left = 268
+  end
+  object cxHintStyleController1: TcxHintStyleController
+    HintStyleClassName = 'TcxHintStyle'
+    HintStyle.BorderColor = clAqua
+    HintStyle.CallOutPosition = cxbpAuto
+    HintStyle.CaptionFont.Charset = DEFAULT_CHARSET
+    HintStyle.CaptionFont.Color = clWindowText
+    HintStyle.CaptionFont.Height = -11
+    HintStyle.CaptionFont.Name = 'Tahoma'
+    HintStyle.CaptionFont.Style = []
+    HintStyle.Color = clAqua
+    HintStyle.Font.Charset = DEFAULT_CHARSET
+    HintStyle.Font.Color = clWindowText
+    HintStyle.Font.Height = -12
+    HintStyle.Font.Name = #47569#51008' '#44256#46357
+    HintStyle.Font.Style = [fsBold]
+    HintHidePause = 1500
+    Left = 352
+  end
+  object ApplicationEvents1: TApplicationEvents
+    OnMinimize = ApplicationEvents1Minimize
+    OnRestore = ApplicationEvents1Restore
+    Left = 272
+    Top = 156
+  end
+  object PopupMenu1: TPopupMenu
+    Left = 824
+    Top = 8
+    object MnuFullScreen: TMenuItem
+      Caption = #51204#52404#54868#47732
+      OnClick = MnuFullScreenClick
+    end
+  end
+end

+ 173 - 0
VmsCmraViewer - 20240801/SRC/FrmVmsCmraViewerF.h

@@ -0,0 +1,173 @@
+//---------------------------------------------------------------------------
+
+#ifndef FrmVmsCmraViewerFH
+#define FrmVmsCmraViewerFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <DB.hpp>
+#include <Menus.hpp>
+#include <ExtCtrls.hpp>
+#include <ADODB.hpp>
+#include <ImgList.hpp>
+#include <Graphics.hpp>
+#include <ComCtrls.hpp>
+//---------------------------------------------------------------------------
+
+#include "CenterCommF.h"
+#include "WindowMsgF.h"
+#include "CDSVmsCtlrF.h"
+#include "VMSMODL0F.h"
+#include "VMSBACKMF.h"
+//---------------------------------------------------------------------------
+#include "cxContainer.hpp"
+#include "cxControls.hpp"
+#include "cxEdit.hpp"
+#include "cxGraphics.hpp"
+#include "cxGroupBox.hpp"
+#include "cxLabel.hpp"
+#include "cxLookAndFeelPainters.hpp"
+#include "cxLookAndFeels.hpp"
+#include "cxPC.hpp"
+#include "cxPCdxBarPopupMenu.hpp"
+#include "cxSplitter.hpp"
+#include "dxSkinBlack.hpp"
+#include "dxSkinBlue.hpp"
+#include "dxSkinCaramel.hpp"
+#include "dxSkinCoffee.hpp"
+#include "dxSkinDarkRoom.hpp"
+#include "dxSkinDarkSide.hpp"
+#include "dxSkinFoggy.hpp"
+#include "dxSkinGlassOceans.hpp"
+#include "dxSkiniMaginary.hpp"
+#include "dxSkinLilian.hpp"
+#include "dxSkinLiquidSky.hpp"
+#include "dxSkinLondonLiquidSky.hpp"
+#include "dxSkinMcSkin.hpp"
+#include "dxSkinMoneyTwins.hpp"
+#include "dxSkinOffice2007Black.hpp"
+#include "dxSkinOffice2007Blue.hpp"
+#include "dxSkinOffice2007Green.hpp"
+#include "dxSkinOffice2007Pink.hpp"
+#include "dxSkinOffice2007Silver.hpp"
+#include "dxSkinOffice2010Black.hpp"
+#include "dxSkinOffice2010Blue.hpp"
+#include "dxSkinOffice2010Silver.hpp"
+#include "dxSkinsCore.hpp"
+#include "dxSkinscxPCPainter.hpp"
+#include "dxSkinSeven.hpp"
+#include "dxSkinSharp.hpp"
+#include "dxSkinSilver.hpp"
+#include "dxSkinStardust.hpp"
+#include "cxClasses.hpp"
+#include "cxCustomData.hpp"
+#include "cxData.hpp"
+#include "cxDataStorage.hpp"
+#include "cxFilter.hpp"
+#include "cxGrid.hpp"
+#include "cxGridCustomTableView.hpp"
+#include "cxGridCustomView.hpp"
+#include "cxGridLevel.hpp"
+#include "cxGridTableView.hpp"
+#include "cxStyles.hpp"
+#include "cxTextEdit.hpp"
+#include "cxGridCardView.hpp"
+#include "cxGridCustomLayoutView.hpp"
+#include "cxCheckBox.hpp"
+#include "cxDropDownEdit.hpp"
+#include "cxImage.hpp"
+#include "cxButtons.hpp"
+#include "FRAME_VmsMsgListF.h"
+#include "cxHint.hpp"
+#include "dxCustomHint.hpp"
+#include "dxScreenTip.hpp"
+#include "dxSkinsForm.hpp"
+#include "dxGDIPlusClasses.hpp"
+#include "cxMaskEdit.hpp"
+#include <AppEvnts.hpp>
+
+class TFrmVmsCmraViewer : public TForm
+{
+__published:	// IDE-managed Components
+    TTimer *TmrShow;
+    TdxSkinController *dxSkinController1;
+    TcxHintStyleController *cxHintStyleController1;
+    TEdit *EdFocus;
+    TPanel *PnlTitle;
+    TImage *ImgCaption;
+    TLabel *LblCaption;
+    TImage *ImgCaptionLeft;
+    TcxButton *BtnSearch;
+    TPanel *PnlMenu;
+    TcxLabel *LblScreenList;
+    TcxComboBox *CbScreenList;
+    TcxButton *BtnMonitoringMngr;
+    TApplicationEvents *ApplicationEvents1;
+    TPanel *PnlBack;
+    TPopupMenu *PopupMenu1;
+    TMenuItem *MnuFullScreen;
+    void __fastcall FormCreate(TObject *Sender);
+    void __fastcall FormShow(TObject *Sender);
+    void __fastcall TmrShowTimer(TObject *Sender);
+    void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
+    void __fastcall BtnMonitoringMngrClick(TObject *Sender);
+    void __fastcall ApplicationEvents1Minimize(TObject *Sender);
+    void __fastcall ApplicationEvents1Restore(TObject *Sender);
+    void __fastcall FormResize(TObject *Sender);
+    void __fastcall CbScreenListPropertiesChange(TObject *Sender);
+    void __fastcall MnuFullScreenClick(TObject *Sender);
+    void __fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift);
+private:	// User declarations
+    void __fastcall CommClose();
+
+public:
+    TVmsCtlr  *FSelVmsObj;
+    TVMSMODL0 *FSelForm;
+
+    int       FMonitoringType;
+    bool      FReady;
+
+    bool      IsLoading;
+    bool      IsFormResizing;
+    int       FOldWidth, FOldHeight;
+
+    TWindowState FWindowState;
+    TAlign    FLastAlign;
+    TRect     FLastBounds;
+
+public:		// User declarations
+    __fastcall TFrmVmsCmraViewer(TComponent* Owner);
+
+    void __fastcall SetColorScheme(String ASkinName);
+    void __fastcall LoadLocalSkin();
+
+    void __fastcall InitDbLoading();
+
+    void __fastcall FormInit();
+    void __fastcall RecalFormSize();
+
+    void __fastcall ResetScreenForm();
+    void __fastcall CreateMonitoringScreen();
+
+    bool __fastcall DbOpen();
+    void __fastcall DbClose();
+
+    void __fastcall FullScreen();
+    void __fastcall NormalStreen();
+
+    void __fastcall WMEnterSizeMove(TMessage &Msg);
+    void __fastcall WMExitSizeMove(TMessage &Msg);
+
+    BEGIN_MESSAGE_MAP
+        MESSAGE_HANDLER(WM_ENTERSIZEMOVE, TMessage, WMEnterSizeMove)
+        MESSAGE_HANDLER(WM_EXITSIZEMOVE, TMessage, WMExitSizeMove)
+    END_MESSAGE_MAP(TForm)
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TFrmVmsCmraViewer *FrmVmsCmraViewer;
+//---------------------------------------------------------------------------
+
+#endif
+

Datei-Diff unterdrückt, da er zu groß ist
+ 33 - 0
VmsCmraViewer - 20240801/VmsCmraViewer.cbproj


+ 141 - 0
VmsCmraViewer - 20240801/VmsCmraViewer.cpp

@@ -0,0 +1,141 @@
+//---------------------------------------------------------------------------
+
+#include <vcl.h>
+#pragma hdrstop
+#include <tchar.h>
+#include <cxFormats.hpp>
+//---------------------------------------------------------------------------
+#include "AppGlobalF.h"
+#include "ITSDbF.h"
+#include "FrmVmsCmraViewerF.h"
+
+//---------------------------------------------------------------------------
+USEFORM("SRC\FrmVmsCmraViewerF.cpp", FrmVmsCmraViewer);
+USEFORM("SRC\FrmCameraScreenF.cpp", FrmCameraScreen);
+USEFORM("SRC\FrmCameraPlayerF.cpp", FrmCameraPlayer);
+USEFORM("SRC\FrmCameraFullScreenF.cpp", FrmCameraFullScreen);
+USEFORM("SRC\FrmCameraInfoF.cpp", FrmCameraInfo);
+USEFORM("SRC\DMDbF.cpp", DMDb); /* TDataModule: File Type */
+//---------------------------------------------------------------------------
+WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
+{
+    if (!CheckApplicationParam()) {
+        return 0;
+    }
+    if (!ApplicationSingleRun("TFrmVmsCmraViewer", "VMS 영상 모니터링")) {
+        return 0;
+    }
+
+    DateSeparator = '-';
+    TimeSeparator = ':';
+    ShortDateFormat ="yyyy-MM-dd";
+    ShortTimeFormat = "hh:nn:ss";
+    LongTimeFormat  = "hh:nn:ss";
+
+    cxFormatController()->BeginUpdate();
+    cxFormatController()->UseDelphiDateTimeFormats = true;
+    cxFormatController()->EndUpdate();
+    cxFormatController()->GetFormats();
+    cxFormatController()->NotifyListeners();
+
+    g_nPid     = (int)GetCurrentProcessId();
+    g_sAppDir  = ExtractFilePath(Application->ExeName);
+    g_sAppName = ChangeFileExt(ExtractFileName(Application->ExeName), "");
+    g_sCfgDir  = g_sAppDir + g_IniFileDir + "\\";
+    g_sLogDir  = g_sAppDir + "Log\\";
+    ForceDirectories(g_sLogDir.c_str());
+    ChDir(g_sAppDir);
+
+    /*
+    *  시스템 운영환경을 ini 파일에서 읽어 온다.
+    */
+    LoadDefaultConfigInfo(g_IniFileName);
+
+    ITSLog = new TITSLog(g_sLogDir, g_sAppName, g_AppCfg.sLogDay);
+    ITSLog->FLogCfg = g_LogCfg;
+
+#if 0
+	if (!ITSDb_Initialize())
+	{
+        if (g_AppCfg.sLang == "kr")
+        {
+            Application->MessageBox(L"Database 자원을 시스템으로부터 얻지 못했습니다.\r\n\r\n프로그램을 종료합니다.",
+                                    L"프로그램 시작 오류!!!",
+                                    MB_OK|MB_ICONERROR);
+        }
+        else
+        {
+            Application->MessageBox(L"Database resource could not be obtained from the system.\r\n\r\nExit the program.",
+                                    L"Program Start Error!!!",
+                                    MB_OK|MB_ICONERROR);
+        }
+        goto prog_exit;
+	}
+    if (g_AppCfg.itsdb.sConnectStr == "")
+    {
+        ITSDb_SetInfo(g_AppCfg.itsdb.sProvider, g_AppCfg.itsdb.sServerName, g_AppCfg.itsdb.sUserName, g_AppCfg.itsdb.sPassword);
+    }
+    else
+    {
+        ITSDb_SetConnStr(g_AppCfg.itsdb.sConnectStr);
+    }
+
+    if (!ITSDb_Open())
+    {
+        if (g_AppCfg.sLang == "kr")
+        {
+            Application->MessageBox(L"데이터베이스 접속에 실패하였습니다.\r\n\r\n프로그램을 종료합니다.",
+                                    L"프로그램 시작 오류!!!",
+                                    MB_OK|MB_ICONERROR);
+        }
+        else
+        {
+            Application->MessageBox(L"Database connection failed.\r\n\r\nExit the program.",
+                                    L"Program Start Error!!!",
+                                    MB_OK|MB_ICONERROR);
+        }
+        goto prog_exit;
+    }
+#endif
+    try
+    {
+        ReportMemoryLeaksOnShutdown = true;
+        Application->Initialize();
+        Application->MainFormOnTaskBar = true;
+        Application->Title = g_AppCfg.sTitle;
+        Application->Title = "VMS 영상 모니터링";
+         Application->CreateForm(__classid(TFrmVmsCmraViewer), &FrmVmsCmraViewer);
+         Application->CreateForm(__classid(TDMDb), &DMDb);
+         Application->Run();
+    }
+    catch (Exception &exception)
+    {
+         Application->ShowException(&exception);
+    }
+    catch (...)
+    {
+         try
+         {
+             throw Exception("");
+         }
+         catch (Exception &exception)
+         {
+             Application->ShowException(&exception);
+         }
+    }
+
+prog_exit:
+    try
+    {
+#if 0
+        ITSDb_Finalize();
+#endif
+    }
+    catch(...)
+    {
+    }
+    
+    return 0;
+}
+//---------------------------------------------------------------------------
+

BIN
VmsCmraViewer - 20240801/VmsCmraViewer.res


BIN
VmsCmraViewer - 20240801/empty-image.png


+ 2 - 1
VmsCmraViewer/SRC/CDSMonitoringObjF.h

@@ -9,9 +9,10 @@
 #include <DB.hpp>
 #include "ITSLibF.h"
 #include "ITSDbF.h"
+#include "AppGlobalF.h"
 //---------------------------------------------------------------------------
 
-#define MAX_CAMERA_PER_SCREEM   64  // 8 * 8
+#define MAX_CAMERA_PER_SCREEM   MAX_CMRA_VIEW_CAMERA    //64  // 8 * 8
 
 class TScreenCtlr
 {

+ 147 - 70
VmsCmraViewer/SRC/FrmCameraPlayerF.cpp

@@ -21,7 +21,6 @@ __fastcall TFrmCameraPlayer::TFrmCameraPlayer(TComponent* Owner)
 {
     IsTerm = false;
     FPlay = false;
-    FAutoPlay = true;
     FUserStop = false;
     FConHandle = 0;
 
@@ -29,10 +28,23 @@ __fastcall TFrmCameraPlayer::TFrmCameraPlayer(TComponent* Owner)
 
     FParent = this->Parent;
     PnlCamera->Tag = (int)this;
+    FTimeChangeTick = 0;
+    TmrReset->Enabled = false;
+    TmrTick->Enabled = false;
+    SetResetTimer();
+    FIsResetVideo = false;
 
     //mmLog->Lines->Clear();
 }
 //---------------------------------------------------------------------------
+void __fastcall TFrmCameraPlayer::SetResetTimer()
+{
+    if (g_AppCfg.cmraViewerResetMin > 0) {
+        TmrReset->Interval = g_AppCfg.cmraViewerResetMin * 60 * 1000;
+    }
+}
+//---------------------------------------------------------------------------
+
 void __fastcall TFrmCameraPlayer::TmrShowTimer(TObject *Sender)
 {
     TmrShow->Enabled = false;
@@ -90,7 +102,8 @@ void __fastcall TFrmCameraPlayer::FormShow(TObject *Sender)
 void __fastcall TFrmCameraPlayer::FormClose(TObject *Sender, TCloseAction &Action)
 {
     try {
-        FAutoPlay = false;
+        FUserStop = false;
+        TmrTick->Enabled = false;
         Stop();
     } catch(...) {}
 
@@ -101,7 +114,8 @@ void __fastcall TFrmCameraPlayer::FormClose(TObject *Sender, TCloseAction &Actio
 void __fastcall TFrmCameraPlayer::FormDestroy(TObject *Sender)
 {
     try {
-        FAutoPlay = false;
+        FUserStop = false;
+        TmrTick->Enabled = false;
         Stop();
     } catch(...) {}
 }
@@ -109,7 +123,9 @@ void __fastcall TFrmCameraPlayer::FormDestroy(TObject *Sender)
 
 void __fastcall TFrmCameraPlayer::MnuConnectClick(TObject *Sender)
 {
-    FUserStop = true;
+    FPlay = false;
+    FUserStop = false;
+    Application->ProcessMessages();
     Play();
 }
 //---------------------------------------------------------------------------
@@ -121,14 +137,13 @@ void __fastcall TFrmCameraPlayer::MnuDisconnectClick(TObject *Sender)
     PnlCamera->Refresh();
 
     FUserStop = true;
-    FAutoPlay = false;
+    Application->ProcessMessages();
     Stop();
 }
 //---------------------------------------------------------------------------
 
 void __fastcall TFrmCameraPlayer::AutoPlay()
 {
-    FAutoPlay = true;
     TmrShow->Enabled = true;
 }
 //---------------------------------------------------------------------------
@@ -137,17 +152,13 @@ void __fastcall TFrmCameraPlayer::CameraLog(String ALogMsg)
     PnlCamera->Caption = ALogMsg;
     PnlCamera->Refresh();
 
-#if 0
-    AnsiString strmAddr = AnsiString(STRM_ADDR);
-    if (strmAddr == "") {
-        strmAddr = "Empty Addr";
-    }
-    AnsiString sAutoPlay = FAutoPlay ? "AutoPlay:True" : "AutoPlay:False";
-    AnsiString sUserStop = FUserStop ? "UserStop:True" : "UserStop:False";
-
-    LOGINFO("%s,%s, %s: %s", sAutoPlay.c_str(), sUserStop.c_str(), strmAddr.c_str(), AnsiString(ALogMsg).c_str());
-#endif
-
+    Application->ProcessMessages();
+}
+//---------------------------------------------------------------------------
+void __fastcall TFrmCameraPlayer::CameraInfo(String ALogInfo)
+{
+    //lblRate->Caption = ALogInfo;
+    //lblRate->Refresh();
     Application->ProcessMessages();
 }
 //---------------------------------------------------------------------------
@@ -217,6 +228,9 @@ void __fastcall TFrmCameraPlayer::Play()
 //---------------------------------------------------------------------------
 void __fastcall TFrmCameraPlayer::Stop()
 {
+    TmrReset->Enabled = false;
+    TmrTick->Enabled = false;
+
     if (!FPlay) return;
 
     FPlay = false;
@@ -266,7 +280,6 @@ void __fastcall TFrmCameraPlayer::Term()
 
 void __fastcall TFrmCameraPlayer::InitCamera(bool AInstalled, String ACtlrNmbr, String AName, String AStrmAddr, String AFullStrmAddr, int AViewMode)
 {
-    FAutoPlay      = true;
     Installed      = AInstalled;
     CTLR_NMBR      = ACtlrNmbr;
     NAME           = AName;
@@ -281,17 +294,6 @@ void __fastcall TFrmCameraPlayer::InitCamera(bool AInstalled, String ACtlrNmbr,
 }
 //---------------------------------------------------------------------------
 
-void __fastcall TFrmCameraPlayer::PnlCameraDblClick(TObject *Sender)
-{
-    // 여기서 더블클릭은 최대화면을 호출하는 것임
-#if 0
-    FrmCameraScreen->TmrFullScreen->Enabled = false;
-    FrmCameraScreen->FFullScreenIdx = Tag;
-    FrmCameraScreen->TmrFullScreen->Enabled = true;
-#endif
-}
-//---------------------------------------------------------------------------
-
 void __fastcall TFrmCameraPlayer::PasLibVlcPlayer1DblClick(TObject *Sender)
 {
     FrmCameraScreen->TmrFullScreen->Enabled = false;
@@ -313,83 +315,157 @@ void __fastcall TFrmCameraPlayer::MnuInfoClick(TObject *Sender)
 }
 //---------------------------------------------------------------------------
 
-void __fastcall TFrmCameraPlayer::PasLibVlcPlayer1MediaPlayerPlaying(TObject *Sender)
+void __fastcall TFrmCameraPlayer::PasLibVlcPlayer1MediaPlayerOpening(TObject *Sender)
 {
-    // 표출시작
-#if 0
-    if (FConHandle > 0)
-    {
-        if (PasLibVlcPlayer1->Visible == false) {
-            PasLibVlcPlayer1->Visible = true;
-        }
-        if (ImgNoData->Visible == true) {
-            ImgNoData->Visible = false;
-        }
+    // 1. Opening
+    if (PasLibVlcPlayer1->Visible == false) {
+        PasLibVlcPlayer1->Visible = true;
+        PnlCamera->Refresh();
+        AdjustVideoFit();
     }
-#endif
-    AdjustVideoFit();
+    if (ImgNoData->Visible == true) {
+        ImgNoData->Visible = false;
+    }
+    FTimeChangeTick = 0;
+    //CameraInfo("PlayerOpening");
+    // 영상이 연결됨
+    //AdjustVideoFit();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraPlayer::PasLibVlcPlayer1MediaPlayerPlaying(TObject *Sender)
+{
+    // 2. Playing
+    //CameraInfo("PlayerPlaying");
+    FTimeChangeTick = 0;
     FUserStop = false;
+    TmrTick->Enabled = false;
+
+    AdjustVideoFit();
+
+    TmrReset->Enabled = false;
+    FIsResetVideo = false;
+
+    if (g_AppCfg.cmraViewerDelaySec > 0) {
+        TmrTick->Enabled = true;
+    }
+
+    if (g_AppCfg.cmraViewerResetMin > 0) {
+        SetResetTimer();
+        TmrReset->Enabled = true;
+    }
 }
 //---------------------------------------------------------------------------
 
+void __fastcall TFrmCameraPlayer::PasLibVlcPlayer1MediaPlayerTimeChanged(TObject *Sender, __int64 time)
+{
+    // 3. TimeChanged
+    FTimeChangeTick = GetTickCount();
+}
+//---------------------------------------------------------------------------
+
+
 void __fastcall TFrmCameraPlayer::PasLibVlcPlayer1MediaPlayerMediaChanged(TObject *Sender, UnicodeString mrl)
 {
     // 스트리밍 변경됨
     CameraLog("@@@ 영상 연결 중.. @@@");
-    AdjustVideoFit();
+    //AdjustVideoFit();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCameraPlayer::PasLibVlcPlayer1MediaPlayerEncounteredError(TObject *Sender)
+{
+    // 에러가 발생하고 PlayerStopped 이벤트가 발생됨
+    if (PasLibVlcPlayer1->Visible) {
+        PasLibVlcPlayer1->Visible = false;
+    }
+    CameraLog("@@@ 영상 표출 오류 @@@");
 }
 //---------------------------------------------------------------------------
 
 void __fastcall TFrmCameraPlayer::PasLibVlcPlayer1MediaPlayerStopped(TObject *Sender)
 {
-    CameraLog("@@@ 영상 표출이 종료됨 @@@");
-    if (FAutoPlay && FUserStop) {
+    if (FIsResetVideo == false) {
+        CameraLog("@@@ 영상 표출이 종료됨 @@@");
+    }
+
+    if (FUserStop) {
         if (PasLibVlcPlayer1->Visible) {
             PasLibVlcPlayer1->Visible = false;
         }
-        //CameraLog("@@@ 영상 표출 종료 @@@");
     }
 
     FPlay = false;
 
-    if (FAutoPlay) {
+    if (FIsResetVideo == false && FUserStop == false) {
         TmrShow->Enabled = false;
         TmrShow->Interval = 1000;
         TmrShow->Enabled = true;
     }
 }
 //---------------------------------------------------------------------------
-
-void __fastcall TFrmCameraPlayer::PasLibVlcPlayer1MediaPlayerEncounteredError(TObject *Sender)
+void __fastcall TFrmCameraPlayer::TmrResetTimer(TObject *Sender)
 {
-    if (PasLibVlcPlayer1->Visible) {
-        PasLibVlcPlayer1->Visible = false;
+    TmrReset->Enabled = false;
+    //CameraInfo("TmrReset");
+    if (FUserStop == false) {
+        ResetVideoCamera();
     }
-    CameraLog("@@@ 영상 표출 오류 @@@");
 }
 //---------------------------------------------------------------------------
-
-void __fastcall TFrmCameraPlayer::PasLibVlcPlayer1MediaPlayerOpening(TObject *Sender)
+void __fastcall TFrmCameraPlayer::ResetVideoCamera()
 {
-#if 0
-    // 표출시작
-    if (FConHandle > 0)
+    TmrReset->Enabled = false;
+    FIsResetVideo = true;
+    try
     {
-        if (PasLibVlcPlayer1->Visible == false) {
-            PasLibVlcPlayer1->Visible = true;
-        }
-        if (ImgNoData->Visible == true) {
-            ImgNoData->Visible = false;
-        }
+        PasLibVlcPlayer1->Stop();
+        Application->ProcessMessages();
     }
-    AdjustVideoFit();
-#endif
-    AdjustVideoFit();
+    catch(Exception &e) {
+    }
+    Application->ProcessMessages();
+    Application->ProcessMessages();
+    Application->ProcessMessages();
+    Application->ProcessMessages();
+    Application->ProcessMessages();
+    Application->ProcessMessages();
+    FTimeChangeTick = 0;
+    try
+    {
+        PasLibVlcPlayer1->Play(STRM_ADDR);
+        FConHandle = 1;
+    }
+    catch(Exception &e) {
+    }
+    Application->ProcessMessages();
+    Application->ProcessMessages();
 }
 //---------------------------------------------------------------------------
 
-void __fastcall TFrmCameraPlayer::PasLibVlcPlayer1MediaPlayerPositionChanged(TObject *Sender, float position)
+void __fastcall TFrmCameraPlayer::TmrTickTimer(TObject *Sender)
 {
+    TmrTick->Enabled = false;
+    if (FUserStop == false && g_AppCfg.cmraViewerDelaySec > 0 && FTimeChangeTick > 0) {
+        //CameraInfo("TmrTickTimer: " + String(GetTickCount() - FTimeChangeTick));
+        if ((GetTickCount() - FTimeChangeTick) > (g_AppCfg.cmraViewerDelaySec * 1000)) {
+            ResetVideoCamera();
+            return;
+        }
+    }
+
+    if (FUserStop == false && g_AppCfg.cmraViewerDelaySec > 0 && FTimeChangeTick > 0) {
+        TmrTick->Enabled = true;
+    }
+}
+//---------------------------------------------------------------------------
+
+
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//void __fastcall TFrmCameraPlayer::PasLibVlcPlayer1MediaPlayerPositionChanged(TObject *Sender, float position)
+#if 0
     if (PasLibVlcPlayer1->Visible == false) {
         PasLibVlcPlayer1->Visible = true;
         PnlCamera->Refresh();
@@ -398,6 +474,8 @@ void __fastcall TFrmCameraPlayer::PasLibVlcPlayer1MediaPlayerPositionChanged(TOb
     if (ImgNoData->Visible == true) {
         ImgNoData->Visible = false;
     }
+    CameraInfo("Changed: " + String(position) + ", " + String(PasLibVlcPlayer1->GetState()));
+#endif
 #if 0
   case PasLibVlcPlayer1.GetState() of
     plvPlayer_NothingSpecial: stateName := 'Idle';
@@ -426,8 +504,7 @@ begin
 end;
 
 main libvlc debug: configured with /builds/videolan/vlc/extras/package/win32/../../../configure  '--enable-update-check' '--enable-lua' '--enable-faad' '--enable-flac' '--enable-theora' '--enable-avcodec' '--enable-merge-ffmpeg' '--enable-dca' '--enable-mpc' '--enable-libass' '--enable-schroedinger' '--enable-realrtsp' '--enable-live555' '--enable-shout' '--enable-goom' '--enable-sse' '--enable-mmx' '--enable-libcddb' '--enable-zvbi' '--disable-telx' '--enable-nls' '--host=i686-w64-mingw32' '--with-contrib=../contrib/i686-w64-mingw32' '--with-breakpad=https://win.crashes.videolan.org' '--enable-qt' '--enable-skins2' '--enable-dvdread' '--enable-caca' 'host_alias=i686-w64-mingw32' 'CFLAGS= -D_WIN32_WINNT=0x0502 -DWINVER=0x502 -D__MSVCRT_VERSION__=0x700 ' 'CXXFLAGS= -D_WIN32_WINNT=0x0502 -DWINVER=0x502 -D__MSVCRT_VERSION__=0x700 ' 'PKG_CONFIG=pkg-config' 'PKG_CONFIG_LIBDIR=/usr/i686-w64-mingw32/lib/pkgconfig:/usr/lib/i686-w64-mingw32/pkgconfig'
-
 #endif
-}
-//---------------------------------------------------------------------------
+
+
 

+ 16 - 2
VmsCmraViewer/SRC/FrmCameraPlayerF.dfm

@@ -44,7 +44,6 @@ object FrmCameraPlayer: TFrmCameraPlayer
     ParentDoubleBuffered = False
     ParentFont = False
     TabOrder = 0
-    OnDblClick = PnlCameraDblClick
     object ImgNoData: TImage
       Left = 0
       Top = 0
@@ -264,8 +263,9 @@ object FrmCameraPlayer: TFrmCameraPlayer
       OnMediaPlayerPlaying = PasLibVlcPlayer1MediaPlayerPlaying
       OnMediaPlayerStopped = PasLibVlcPlayer1MediaPlayerStopped
       OnMediaPlayerEncounteredError = PasLibVlcPlayer1MediaPlayerEncounteredError
-      OnMediaPlayerPositionChanged = PasLibVlcPlayer1MediaPlayerPositionChanged
+      OnMediaPlayerTimeChanged = PasLibVlcPlayer1MediaPlayerTimeChanged
       MouseEventsHandler = mehComponent
+      ExplicitWidth = 240
     end
   end
   object PnlName: TPanel
@@ -314,4 +314,18 @@ object FrmCameraPlayer: TFrmCameraPlayer
       OnClick = MnuInfoClick
     end
   end
+  object TmrReset: TTimer
+    Enabled = False
+    Interval = 1800
+    OnTimer = TmrResetTimer
+    Left = 244
+    Top = 124
+  end
+  object TmrTick: TTimer
+    Enabled = False
+    Interval = 3000
+    OnTimer = TmrTickTimer
+    Left = 52
+    Top = 68
+  end
 end

+ 12 - 2
VmsCmraViewer/SRC/FrmCameraPlayerF.h

@@ -12,6 +12,7 @@
 #include <Menus.hpp>
 #include "dxGDIPlusClasses.hpp"
 #include "PasLibVlcPlayerUnit.hpp"
+#include <ComCtrls.hpp>
 //---------------------------------------------------------------------------
 
 class TFrmCameraPlayer : public TForm
@@ -27,13 +28,14 @@ __published:	// IDE-managed Components
     TMenuItem *N1;
     TPasLibVlcPlayer *PasLibVlcPlayer1;
     TImage *ImgNoData;
+    TTimer *TmrReset;
+    TTimer *TmrTick;
     void __fastcall TmrShowTimer(TObject *Sender);
     void __fastcall FormShow(TObject *Sender);
     void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
     void __fastcall FormDestroy(TObject *Sender);
     void __fastcall MnuConnectClick(TObject *Sender);
     void __fastcall MnuDisconnectClick(TObject *Sender);
-    void __fastcall PnlCameraDblClick(TObject *Sender);
     void __fastcall MnuInfoClick(TObject *Sender);
     void __fastcall PasLibVlcPlayer1DblClick(TObject *Sender);
     void __fastcall PasLibVlcPlayer1MediaPlayerPlaying(TObject *Sender);
@@ -41,7 +43,9 @@ __published:	// IDE-managed Components
     void __fastcall PasLibVlcPlayer1MediaPlayerMediaChanged(TObject *Sender, UnicodeString mrl);
     void __fastcall PasLibVlcPlayer1MediaPlayerEncounteredError(TObject *Sender);
     void __fastcall PasLibVlcPlayer1MediaPlayerOpening(TObject *Sender);
-    void __fastcall PasLibVlcPlayer1MediaPlayerPositionChanged(TObject *Sender, float position);
+    void __fastcall PasLibVlcPlayer1MediaPlayerTimeChanged(TObject *Sender, __int64 time);
+    void __fastcall TmrResetTimer(TObject *Sender);
+    void __fastcall TmrTickTimer(TObject *Sender);
 private:	// User declarations
 
 public:		// User declarations
@@ -69,6 +73,9 @@ public:		// User declarations
     String  FULL_STRM_ADDR;
     int     VIEW_MODE;
 
+    DWORD   FTimeChangeTick;
+    bool    FIsResetVideo;
+
     void __fastcall InitCamera(bool AInstalled, String ACtlrNmbr, String AName, String AStrmAddr, String AFullStrmAddr, int AViewMode);
     void __fastcall LoadEmptyImage();
 
@@ -78,6 +85,9 @@ public:		// User declarations
     void __fastcall Term();
     void __fastcall AdjustVideoFit();
     void __fastcall CameraLog(String ALogMsg);
+    void __fastcall CameraInfo(String ALogInfo);
+    void __fastcall SetResetTimer();
+    void __fastcall ResetVideoCamera();
 
     __fastcall TFrmCameraPlayer(TComponent* Owner);
 };

+ 87 - 87
VmsCmraViewer/VmsCmraViewer.cbproj

@@ -79,121 +79,121 @@
 			<ILINK_TranslatedLibraryPath>$(BDS)\lib\$(LANGDIR)\release;$(ILINK_TranslatedLibraryPath)</ILINK_TranslatedLibraryPath>
 		</PropertyGroup>
 		<ItemGroup>
-			<None Include="..\..\C01.COMMON\ITSDb\ITSDbF.h">
-				<BuildOrder>230</BuildOrder>
+			<None Include="..\LIB\VMSBACKMF.h">
+				<BuildOrder>24</BuildOrder>
 			</None>
-			<None Include="..\..\C01.COMMON\ITSLib\ITSLibF.h">
-				<BuildOrder>16</BuildOrder>
+			<None Include="..\LIB\VMSBACKMF.dfm"/>
+			<None Include="..\LIB\VMSEDT0MF.dfm"/>
+			<None Include="..\LIB\VmsCommInfoF.h">
+				<BuildOrder>25</BuildOrder>
 			</None>
-			<LibFiles Include="..\LIB\VmsCommonLib.lib">
-				<IgnorePath>true</IgnorePath>
-				<BuildOrder>15</BuildOrder>
-			</LibFiles>
-			<None Include="..\..\C01.COMMON\LIB\FilterGrid.hpp">
-				<BuildOrder>231</BuildOrder>
+			<None Include="..\LIB\FrmLangF.h">
+				<BuildOrder>22</BuildOrder>
 			</None>
-			<DelphiCompile Include="..\..\C01.COMMON\LIB\FilterGrid.pas">
-				<BuildOrder>232</BuildOrder>
-			</DelphiCompile>
+			<None Include="..\LIB\CDSFontF.h">
+				<BuildOrder>28</BuildOrder>
+			</None>
+			<None Include="..\..\C01.COMMON\ITSLog\ITSLogF.h">
+				<BuildOrder>11</BuildOrder>
+			</None>
+			<None Include="..\LIB\FrmLangF.dfm"/>
+			<None Include="..\LIB\AppGlobalF.h">
+				<BuildOrder>20</BuildOrder>
+			</None>
+			<None Include="..\LIB\VMSSEL0MF.h">
+				<BuildOrder>33</BuildOrder>
+			</None>
+			<None Include="..\LIB\VMSSEL0MF.dfm"/>
+			<None Include="..\LIB\WindowMsgF.h">
+				<BuildOrder>34</BuildOrder>
+			</None>
+			<None Include="..\LIB\VMSMODL0F.h">
+				<BuildOrder>31</BuildOrder>
+			</None>
+			<None Include="..\LIB\VMSFORM0F.dfm"/>
+			<None Include="..\LIB\VMSEDT0MF.h">
+				<BuildOrder>27</BuildOrder>
+			</None>
+			<None Include="..\LIB\VMSMODL0F.dfm"/>
+			<None Include="..\LIB\VMSFORM0F.h">
+				<BuildOrder>29</BuildOrder>
+			</None>
+			<ResFiles Include="VmsCmraViewer.res">
+				<BuildOrder>1</BuildOrder>
+			</ResFiles>
 			<None Include="..\LIB\VmsCommonLibF.h">
 				<BuildOrder>16</BuildOrder>
 			</None>
-			<None Include="..\..\C01.COMMON\ITSUtil\ITSUtilF.h">
+			<DelphiCompile Include="..\..\C01.COMMON\LIB\FilterGrid.pas">
 				<BuildOrder>232</BuildOrder>
-			</None>
+			</DelphiCompile>
 			<CppCompile Include="VmsCmraViewer.cpp">
 				<BuildOrder>0</BuildOrder>
 			</CppCompile>
+			<None Include="..\..\C01.COMMON\ITSUtil\ITSUtilF.h">
+				<BuildOrder>232</BuildOrder>
+			</None>
+			<None Include="..\..\C01.COMMON\ITSLib\ITSLibF.h">
+				<BuildOrder>16</BuildOrder>
+			</None>
+			<None Include="..\..\C01.COMMON\ITSDb\ITSDbF.h">
+				<BuildOrder>230</BuildOrder>
+			</None>
+			<None Include="..\..\C01.COMMON\LIB\FilterGrid.hpp">
+				<BuildOrder>231</BuildOrder>
+			</None>
+			<LibFiles Include="..\LIB\VmsCommonLib.lib">
+				<IgnorePath>true</IgnorePath>
+				<BuildOrder>15</BuildOrder>
+			</LibFiles>
 			<None Include="..\..\C01.COMMON\ITSSkin\ITSSkinF.h">
 				<BuildOrder>231</BuildOrder>
 			</None>
-			<CppCompile Include="SRC\CDSMonitoringObjF.cpp">
-				<DependentOn>SRC\CDSMonitoringObjF.h</DependentOn>
-				<BuildOrder>32</BuildOrder>
-			</CppCompile>
-			<CppCompile Include="SRC\FrmCameraFullScreenF.cpp">
-				<Form>FrmCameraFullScreen</Form>
-				<DependentOn>SRC\FrmCameraFullScreenF.h</DependentOn>
-				<BuildOrder>31</BuildOrder>
-			</CppCompile>
-			<CppCompile Include="SRC\DMDbF.cpp">
-				<Form>DMDb</Form>
-				<DesignClass>TDataModule</DesignClass>
-				<DependentOn>SRC\DMDbF.h</DependentOn>
-				<BuildOrder>34</BuildOrder>
-			</CppCompile>
-			<CppCompile Include="SRC\FrmCameraInfoF.cpp">
-				<Form>FrmCameraInfo</Form>
-				<DependentOn>SRC\FrmCameraInfoF.h</DependentOn>
-				<BuildOrder>33</BuildOrder>
-			</CppCompile>
+			<LibFiles Include="..\..\C01.COMMON\ITSLib\ITSLib.lib">
+				<IgnorePath>true</IgnorePath>
+				<BuildOrder>15</BuildOrder>
+			</LibFiles>
 			<CppCompile Include="SRC\FrmVmsCmraViewerF.cpp">
 				<Form>FrmVmsCmraViewer</Form>
 				<DependentOn>SRC\FrmVmsCmraViewerF.h</DependentOn>
 				<BuildOrder>28</BuildOrder>
 			</CppCompile>
-			<LibFiles Include="..\..\C01.COMMON\ITSLib\ITSLib.lib">
-				<IgnorePath>true</IgnorePath>
-				<BuildOrder>15</BuildOrder>
-			</LibFiles>
+			<CppCompile Include="SRC\FrmCameraScreenF.cpp">
+				<Form>FrmCameraScreen</Form>
+				<DependentOn>SRC\FrmCameraScreenF.h</DependentOn>
+				<BuildOrder>29</BuildOrder>
+			</CppCompile>
 			<CppCompile Include="SRC\FrmCameraPlayerF.cpp">
 				<Form>FrmCameraPlayer</Form>
 				<DependentOn>SRC\FrmCameraPlayerF.h</DependentOn>
 				<BuildOrder>30</BuildOrder>
 			</CppCompile>
-			<CppCompile Include="SRC\FrmCameraScreenF.cpp">
-				<Form>FrmCameraScreen</Form>
-				<DependentOn>SRC\FrmCameraScreenF.h</DependentOn>
-				<BuildOrder>29</BuildOrder>
+			<CppCompile Include="SRC\FrmCameraFullScreenF.cpp">
+				<Form>FrmCameraFullScreen</Form>
+				<DependentOn>SRC\FrmCameraFullScreenF.h</DependentOn>
+				<BuildOrder>31</BuildOrder>
 			</CppCompile>
-			<ResFiles Include="VmsCmraViewer.res">
-				<BuildOrder>1</BuildOrder>
-			</ResFiles>
-			<None Include="..\LIB\CDSFontF.h">
-				<BuildOrder>28</BuildOrder>
-			</None>
-			<None Include="..\LIB\FrmLangF.h">
-				<BuildOrder>22</BuildOrder>
-			</None>
-			<None Include="..\LIB\FrmLangF.dfm"/>
-			<None Include="..\..\C01.COMMON\ITSLog\ITSLogF.h">
-				<BuildOrder>11</BuildOrder>
-			</None>
-			<None Include="..\LIB\VMSBACKMF.dfm"/>
-			<None Include="..\LIB\VMSBACKMF.h">
-				<BuildOrder>24</BuildOrder>
-			</None>
-			<None Include="..\LIB\VmsCommInfoF.h">
-				<BuildOrder>25</BuildOrder>
-			</None>
-			<None Include="..\LIB\VMSEDT0MF.dfm"/>
-			<None Include="..\LIB\AppGlobalF.h">
-				<BuildOrder>20</BuildOrder>
-			</None>
-			<None Include="..\LIB\VMSEDT0MF.h">
-				<BuildOrder>27</BuildOrder>
-			</None>
-			<None Include="..\LIB\VMSFORM0F.dfm"/>
-			<None Include="..\LIB\VMSFORM0F.h">
-				<BuildOrder>29</BuildOrder>
-			</None>
-			<None Include="..\LIB\VMSMODL0F.dfm"/>
-			<None Include="..\LIB\VMSSEL0MF.dfm"/>
-			<None Include="..\LIB\VMSSEL0MF.h">
+			<CppCompile Include="SRC\CDSMonitoringObjF.cpp">
+				<DependentOn>SRC\CDSMonitoringObjF.h</DependentOn>
+				<BuildOrder>32</BuildOrder>
+			</CppCompile>
+			<CppCompile Include="SRC\FrmCameraInfoF.cpp">
+				<Form>FrmCameraInfo</Form>
+				<DependentOn>SRC\FrmCameraInfoF.h</DependentOn>
 				<BuildOrder>33</BuildOrder>
-			</None>
-			<None Include="..\LIB\VMSMODL0F.h">
-				<BuildOrder>31</BuildOrder>
-			</None>
-			<None Include="..\LIB\WindowMsgF.h">
+			</CppCompile>
+			<CppCompile Include="SRC\DMDbF.cpp">
+				<Form>DMDb</Form>
+				<DesignClass>TDataModule</DesignClass>
+				<DependentOn>SRC\DMDbF.h</DependentOn>
 				<BuildOrder>34</BuildOrder>
-			</None>
-			<FormResources Include="SRC\FrmCameraFullScreenF.dfm"/>
-			<FormResources Include="SRC\DMDbF.dfm"/>
-			<FormResources Include="SRC\FrmCameraInfoF.dfm"/>
+			</CppCompile>
 			<FormResources Include="SRC\FrmVmsCmraViewerF.dfm"/>
-			<FormResources Include="SRC\FrmCameraPlayerF.dfm"/>
 			<FormResources Include="SRC\FrmCameraScreenF.dfm"/>
+			<FormResources Include="SRC\FrmCameraPlayerF.dfm"/>
+			<FormResources Include="SRC\FrmCameraFullScreenF.dfm"/>
+			<FormResources Include="SRC\FrmCameraInfoF.dfm"/>
+			<FormResources Include="SRC\DMDbF.dfm"/>
 			<BuildConfiguration Include="Base">
 				<Key>Base</Key>
 			</BuildConfiguration>

+ 13 - 0
VmsCommonLib/AppGlobalF.cpp

@@ -195,6 +195,19 @@ bool LoadDefaultConfigInfo(String ACfgFile/*=""*/)
         g_AppCfg.vmsFtp.USER    = pIniFile->ReadString("VMS_FTP", "USER",    "icair_vms");
         g_AppCfg.vmsFtp.PSWD    = pIniFile->ReadString("VMS_FTP", "PSWD",    "icair_vms");
         g_AppCfg.vmsFtp.PASSIVE = pIniFile->ReadString("VMS_FTP", "PASSIVE", "1").ToIntDef(0) == 0 ? false : true;
+
+        //cmraViewerResetMin
+        g_AppCfg.cmraViewerResetMin = pIniFile->ReadString("CMRA_VIEWER", "RESET_TIMER_MIN",    "30").ToIntDef(30);
+        if (g_AppCfg.cmraViewerResetMin <= 0) g_AppCfg.cmraViewerResetMin = 0;
+        if (g_AppCfg.cmraViewerResetMin > 0 && g_AppCfg.cmraViewerResetMin < 5) g_AppCfg.cmraViewerResetMin = 5;
+        if (g_AppCfg.cmraViewerResetMin > 120) g_AppCfg.cmraViewerResetMin = 120;
+
+        //cmraViewerDelaySec
+        g_AppCfg.cmraViewerDelaySec = pIniFile->ReadString("CMRA_VIEWER", "DELAY_TIMER_SEC",    "10").ToIntDef(10);
+        if (g_AppCfg.cmraViewerDelaySec <= 0) g_AppCfg.cmraViewerDelaySec = 0;
+        if (g_AppCfg.cmraViewerDelaySec > 0 && g_AppCfg.cmraViewerDelaySec < 5) g_AppCfg.cmraViewerDelaySec = 5;
+        if (g_AppCfg.cmraViewerDelaySec > 120) g_AppCfg.cmraViewerDelaySec = 120;
+
     }
     __finally
     {

+ 5 - 1
VmsCommonLib/AppGlobalF.h

@@ -157,6 +157,9 @@ typedef struct tag_AppConfig
 
     bool isLoadFromFile;
 
+    int cmraViewerResetMin;
+    int cmraViewerDelaySec;
+
     String MAGIC_ID;
     String OPER_ID;
     String PRCS_ID;
@@ -167,7 +170,8 @@ typedef struct tag_AppConfig
 
 } APP_CONFIG;
 
-#define DEFAULT_PRCS_ID     "P08010"
+#define MAX_CMRA_VIEW_CAMERA    20
+#define DEFAULT_PRCS_ID         "P08010"
 
 /*
 ******************************************************************************

+ 5 - 0
VmsCommonLib/FRM/VMSVIEWMF.cpp

@@ -765,6 +765,11 @@ void __fastcall TVMSVIEWM::BtnListAddClick(TObject *Sender)
                 String sVmsName = VarToStr(pSrcList->DataController->Values[nSelIdx][FRAMEVmsList1->Column03->Index]);
 
                 if (FindVmsInfo(sVmsNmbr)) continue;
+                if (pGDC->RecordCount > MAX_CMRA_VIEW_CAMERA) {
+                    Application->MessageBox(L"VMS 모니터링 화면 등록\r\nVMS 모니터링 화면은 최대 20개 까지 등록할 수 있습니다.",
+                                            FTitle.c_str(), MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
+                    break;
+                }
 
                 int nRow = pGDC->AppendRecord();
 

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.