From 63439977901d54a01924ed76290931aeddbce66c Mon Sep 17 00:00:00 2001 From: LYW <leeyeanwoo@diteam.co.kr> Date: 화, 05 7월 2022 18:16:55 +0900 Subject: [PATCH] Ongoing80 #4220 CF AOI Review 알람 추가 --- DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp | 234 +++++++++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 189 insertions(+), 45 deletions(-) diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp index 93a3018..10f02ce 100644 --- a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp +++ b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp @@ -21,10 +21,6 @@ #define LOCAL_AOIRAWDFS_PATH "D:\\DIT_ResultData\\Raw" #define LOCAL_AOIRAWBIN_PATH "D:\\DIT_ResultData\\RawBin" -//TEST -// #define NETWORK_AOIRAWDFS_PATH "D:\\DIT_ResultData\\Raw" -// #define NETWORK_AOIRAWBIN_PATH "D:\\DIT_ResultData\\RawBin" - #define NETWORK_AOIRAWDFS_PATH "\\\\126.100.100.1\\d\\DIT_ResultData\\Raw" #define NETWORK_AOIRAWBIN_PATH "\\\\126.100.100.1\\d\\DIT_ResultData\\RawBin" @@ -39,7 +35,9 @@ /* <LJC 20211122 : #3820 ADD Start> */ #define NETWORK_AOIRAWMERGELOCAL_PATH "D:\\DIT_ResultData\\RawMerge" /* <LJC 20211122 : #3820 ADD End> */ - +/* <KMH 20220407 : #4053 ADD Start> */ +#define LOCAL_LOGDATA_PATH "D:\\DIT_LogData" +/* <KMH 20220407 : #4053 ADD End> */ char* g_pCellCode = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; void _TimeDelay(int delay) @@ -67,6 +65,20 @@ CreateDirectory(LOCAL_AOIRAWDFS_PATH, NULL); CreateDirectory(LOCAL_AOIRAWBIN_PATH, NULL); CreateDirectory("D:\\Raw_im", NULL); + + /* <KMH 20220407 : #4053 ADD Start> */ + CFileFind FileFinder; + SYSTEMTIME st; + GetLocalTime(&st); + char strLogFolderPath [256]; + sprintf(strLogFolderPath, "%s\\%02d%02d%02d", LOCAL_LOGDATA_PATH,st.wYear, st.wMonth, st.wDay); + + BOOL bFind = FileFinder.FindFile(strLogFolderPath); + if (!bFind) + { + CreateDirectory(strLogFolderPath, NULL); + } + /* <KMH 20220407 : #4053 ADD End> */ m_MuraResultFile.readOptionFile("C:\\DIT_Review\\ReviewServerConfig\\MacroInfo.cfg"); m_GlassRawRTMS.SetMuraResult(&m_MuraResultFile); @@ -80,6 +92,8 @@ BOOL CGlassRawCPJT::SequenceGlassLoading( CgrmGlassRawData* pData ) { + + AKLOG("Sequence : Glass Loading Signal Start ");/* <KMH 20220407 : #4053 ADD > */ SetEnableFtpAck(FALSE); m_nRawMergeIdx = 0; if(m_StackResult.getStackUse()) @@ -94,14 +108,24 @@ { File.FindNextFile(); strStackFileLocalPath = File.GetFilePath(); - DeleteFile(strStackFileLocalPath); - Sleep(10); + /* <KMH 20220407 : #4053 MOD Start> */ + if (DeleteFile(strStackFileLocalPath)) + /*< SWK 20220413 - #4053 MOD Start >*/ +// { +// AKLOG(" Fucntion : Delete Stack File Sucess[%s] ", strStackFileLocalPath); +// } +// /* <KMH 20220407 : #4053 MOD End> */ +// Sleep(10); +// } +// else +// { +// AKLOG(" Function : Delete Stack File Fail [%s]", strStackFileLocalPath);/* <KMH 20220407 : #4053 MOD > */ +// } + AKLOG(" Function : Delete Stack File Sucess[%s] ", strStackFileLocalPath); + else + AKLOG(" Function : Delete Stack File Fail [%s]", strStackFileLocalPath); } - else - { - AKLOG("Delete Stack File Fail [%s]", strStackFileLocalPath); - } - + /*< SWK 20220413 - #4053 MOD End >*/ //201218 CJH - Stack Download �떆�룄 SendMessageFTPDownloadStack(pData->GetGlassData()); @@ -117,20 +141,38 @@ { File.FindNextFile(); strRawFileLocalPath = File.GetFilePath(); - DeleteFile(strRawFileLocalPath); - Sleep(10); + /* <KMH 20220407 : #4053 MOD Start> */ + if (DeleteFile(strRawFileLocalPath)) + /*< SWK 20220413 - #4053 MOD Start >*/ +// { +// AKLOG(" Fucntion : Delete RawMerge File Sucess[%s] ", strRawFileLocalPath); +// } +// /* <KMH 20220407 : #4053 MOD End> */ +// Sleep(10); +// } +// else +// { +// AKLOG(" Function : Delete RawMerge File Fail [%s]", strRawFileLocalPath); /* <KMH 20220407 : #4053 ADD > */ +// } + AKLOG(" Function : Delete RawMerge File Sucess[%s] ", strRawFileLocalPath); + else + AKLOG(" Function : Delete RawMerge File Fail [%s]", strRawFileLocalPath); } + /*< SWK 20220413 - #4053 MOD End >*/ SetEnableFtpAck(TRUE); DownLoadMergeFile(pData); } /* <LJC 20211122 : #3820 ADD End> */ /*< KJG 20211024 - #3487 ADD End >*/ + AKLOG("Sequence : Glass Loading Signal End "); return TRUE; } BOOL CGlassRawCPJT::SequenceInspectEnd( CgrmGlassRawData* pData ) { + AKLOG(" Sequence : InspectionEnd Signal Start"); /* <KMH 20220407 : #4053 ADD > */ + m_bReviewEndCheck = FALSE; //210128 m_tmReviewEnd = m_tmReviewStart = CTime::GetCurrentTime(); @@ -220,9 +262,15 @@ fclose(pf); } } + else + { + SendMessageFTPUploadImage(pData->GetGlassData(), FTPCMD_MURA_IMAGE);/* <KMH 20220407 : #4053 ADD > */ + } + /* <KYH 211129 : #3806 ADD End> */ - SendMessageFTPUploadImage(pData->GetGlassData(), FTPCMD_MURA_IMAGE);//0405nwh + + AKLOG(" Sequence : InspectionEnd Signal End"); /* <KMH 20220407 : #4053 ADD > */ return TRUE; } @@ -325,14 +373,7 @@ //if(1) ReadMuraFile(pData); 211012 KJG - QD Macro 媛쒕퀎 �뾽濡쒕뱶 �븯誘�濡� Macro �뜲�씠�꽣 �쟻�젣 �젣嫄� �슂泥� - if(WriteAOIFile(pData) == FALSE) - return FALSE; - - //210126 CJH - Review End�뿉�꽌留� RTMS 寃곌낵�뙆�씪 �깮�꽦�븯�룄濡� 蹂�寃� - if (m_GlassRawRTMS.WriteAOIFile(pData) == FALSE) - return FALSE; - - if(1) + if (1) { _grmGlassData* pGlassData = pData->GetGlassData(); @@ -342,6 +383,15 @@ SendMessageFTPUploadImage(pGlassData, FTPCMD_MURA_IMAGE);//0405nwh } + + if(WriteAOIFile(pData) == FALSE) + return FALSE; + + //210126 CJH - Review End�뿉�꽌留� RTMS 寃곌낵�뙆�씪 �깮�꽦�븯�룄濡� 蹂�寃� + if (m_GlassRawRTMS.WriteAOIFile(pData) == FALSE) + return FALSE; + + @@ -351,6 +401,7 @@ BOOL CGlassRawCPJT::SequenceFtpUpload(char* pRawFilePathName) { + AKLOG(" Sequence : FTP Upload Signal Start "); // Manual Upload 湲곕뒫 [21-02-05 KJG] CTime tmFileCreate; _grmGlassData GlassData; @@ -423,7 +474,7 @@ fclose(pf); - + AKLOG(" Sequence : FTP Upload Signal End "); return TRUE; } @@ -538,10 +589,32 @@ CString strValue; /*< KJG 20211229 - #3846 MOD Start >*/ //strValue = "ITEM PANEL MODULETYPE MODULEID PROCESSID PRODUCTID STEPID PROD_TYPE BATCHID H_PANELID E_PANELID P_PANELID OPERID COMP_COUNT PPID GRADE CODE R_GRADE MAP_IMAGE L_TIME U_TIME S_TIME E_TIME T_DEFECT TR PR NG TB TW RB RW T_STACK NO_DEFECT MAX_AVG_GRAY MAX_PORTION OK_CELL RJ_CELL RW_CELL NR_CELL CSTID SLOT_NO JOB_END TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT IMG_COUNT RECIPE SHRINK RAW_CUT CRACK_DEFECT"; +/* < KMH 20220613 : #3957 MOD Start > */ + /* <LJC 20220425 : #3957 MOD Start> */ + // strValue = "ITEM PANEL MODULETYPE MODULEID PROCESSID PRODUCTID STEPID PROD_TYPE BATCHID H_PANELID E_PANELID P_PANELID OPERID COMP_COUNT PPID GRADE CODE R_GRADE MAP_IMAGE L_TIME U_TIME S_TIME E_TIME T_DEFECT TR PR NG TB TW RB RW T_STACK NO_DEFECT MAX_NG MAX_PORTION OK_CELL RJ_CELL RW_CELL NR_CELL CSTID SLOT_NO JOB_END TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT IMG_COUNT RECIPE SHRINK RAW_CUT CRACK_DEFECT CODE_COUNT1 CODE_COUNT2 CODE_COUNT3 CODE_COUNT4 CODE_COUNT5 CODE_COUNT6 CODE_COUNT7 CODE_COUNT8 CODE_COUNT9 CODE_COUNT10"; //56ea strValue = "ITEM PANEL MODULETYPE MODULEID PROCESSID PRODUCTID STEPID PROD_TYPE BATCHID H_PANELID E_PANELID P_PANELID OPERID COMP_COUNT PPID GRADE CODE R_GRADE MAP_IMAGE L_TIME U_TIME S_TIME E_TIME T_DEFECT TR PR NG TB TW RB RW T_STACK NO_DEFECT MAX_NG MAX_PORTION OK_CELL RJ_CELL RW_CELL NR_CELL CSTID SLOT_NO JOB_END TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT IMG_COUNT RECIPE SHRINK RAW_CUT CRACK_DEFECT"; //56ea + for (int i = 0; i < RAW_CODE_MAX; i++) + { + CString strDefectCode = pGlassData->m_strRawDefectCode[i]; + if (strDefectCode == "") { strDefectCode = "*"; } + strValue += " " + strDefectCode; + } + /* <LJC 20220425 : #3957 MOD End> */ +/* < KMH 20220613 : #3957 MOD End > */ /*< KJG 20211229 - #3846 MOD End >*/ strLine += strValue; strLine += "\n"; - strValue = "ITEM SUBPANEL SUBPANELID COORD_X COORD_Y SIZE_X SIZE_Y GATELINE DATALINE GRADE CODE R_GRADE T_DEFECT TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT TR PR NG RB RW TB TW T_STACK NO_DEFECT"; //31ea /* <KYH 211129 : #3796 MOD Start> */ +/* < KMH 20220614 : #3957 MOD Start > */ + /* <LJC 20220425 : #3957 MOD Start> */ + //strValue = "ITEM SUBPANEL SUBPANELID COORD_X COORD_Y SIZE_X SIZE_Y GATELINE DATALINE GRADE CODE R_GRADE T_DEFECT TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT TR PR NG RB RW TB TW T_STACK NO_DEFECT CODE_COUNT1 CODE_COUNT2 CODE_COUNT3 CODE_COUNT4 CODE_COUNT5 CODE_COUNT6 CODE_COUNT7 CODE_COUNT8 CODE_COUNT9 CODE_COUNT10"; //31ea /* <KYH 211129 : #3796 MOD Start> */ + strValue = "ITEM SUBPANEL SUBPANELID COORD_X COORD_Y SIZE_X SIZE_Y GATELINE DATALINE GRADE CODE R_GRADE T_DEFECT TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT TR PR NG RB RW TB TW T_STACK NO_DEFECT"; //56ea + for (int i = 0; i < RAW_CODE_MAX; i++) + { + CString strDefectCode = pGlassData->m_strRawDefectCode[i]; + if (strDefectCode == "") { strDefectCode = "*"; } + strValue += " " + strDefectCode; + } + /* <LJC 20220425 : #3957 MOD End> */ +/* < KMH 20220614 : #3957 MOD End > */ strLine += strValue; strLine += "\n"; strValue = "ITEM DEFECT ID DEF_NO COORD_X COORD_Y GATELINE DATALINE SIZE_S SIZE_W SIZE_L SIZE_H GRADE CODE STACK_FLAG STACK_COUNT STACK_STEP IMAGE_FILE LINE_CODE VC_CODE DCR_CODE DEFECT_SIZE REPEAT_DEFECT WSI_HEIGHT CS_HEIGHT C_GRADE GRAY_MIN GRAY_MAX GRAY_AVG GRAY_DEF WSI_IMAGE USE_CCDIMAGE SCAN_NUM CAM_POSITION CCD_NO R_GRAY_MIN R_GRAY_MAX R_GRAY_AVG R_HEIGHT G_HEIGHT B_HEIGHT INS_CHANNEL COMPACTNESS THICKNESS MAJOR MINOR WSI_TYPE DEFECT_TYPE SHRINK CLASS_CODE"; //50ea strLine += strValue; @@ -930,7 +1003,19 @@ { SPRINTRAW(12, "UNUSE"); } - + /* <LJC 20220425 : #3957 ADD Start> */ + for (int i = 0; i < RAW_CODE_MAX; i++) + { + if (pGlassData->m_nDefectCode[i] >= 0) + { + SPRINTRAW(12, "%d", pGlassData->m_nDefectCode[i]); + } + else + { + SPRINTRAW(12, "*"); + } + } + /* <LJC 20220425 : #3957 ADD End> */ SPRINTRAWEND; //以묒슂!!! �젮 留덉�留됱뿉 瑗� �엳�뼱�빞�븿!!!(�궘�젣湲덉�) [源��깭�쁽2020/9/23] } @@ -971,7 +1056,10 @@ SPRINTRAW(8, "SUBPANEL"); // 03 12 SUBPANELID // Subpanel ID //SPRINTRAW(12, "%d", pCellData->m_nCellID); - SPRINTRAW(12, "%s%c%c", pData->GetGlassData()->m_strGlassID, '0' + pCellData->m_nCellID / 36, g_pCellCode[pCellData->m_nCellID % 36]); + /* < KMH 20220609 : #4183 MOD Start > */ + //SPRINTRAW(12, "%s%c%c", pData->GetGlassData()->m_strGlassID, '0' + pCellData->m_nCellID / 36, g_pCellCode[pCellData->m_nCellID % 36]); + SPRINTRAW(12, "%s%s", pData->GetGlassData()->m_strGlassID, pCellData->m_strCellName); + /* < KMH 20220609 : #4183 MOD End > */ // 湲��씪�뒪 �썝�젏 湲곗� Y醫뚰몴 諛섎� // 肄붾꼫而� 湲곗��쑝濡� 寃곌낵�뙆�씪 醫뚰몴媛� �깮�꽦�릺�뒗�뜲 怨좉컼�궗�뿉 紐낇솗�븳 �솗�씤 �븘�슂 @@ -1056,7 +1144,19 @@ // 31 6 NO_DEFECT 異붽� SPRINTRAW(12, "%d", pCellData->m_nDefectNumJudgeND); //KYH ND �뜲�씠�꽣 異붽� /* <KYH 211129 : #3796 MOD End> */ - + /* <LJC 20220425 : #3957 ADD Start> */ + for (int i = 0; i < RAW_CODE_MAX; i++) + { + if (pCellData->m_nDefectCode[i] >= 0) + { + SPRINTRAW(12, "%d", pCellData->m_nDefectCode[i]); + } + else + { + SPRINTRAW(12, "*"); + } + } + /* <LJC 20220425 : #3957 ADD End> */ SPRINTRAWEND; //以묒슂!!! �젮 留덉�留됱뿉 瑗� �엳�뼱�빞�븿!!!(�궘�젣湲덉�) [源��깭�쁽2020/9/23] } @@ -1114,7 +1214,10 @@ // 02 6 DEFECT // DEFECT SPRINTRAW(6, "DEFECT"); // 03 12 ID // Subpanel ID - SPRINTRAW(12, "%s%c%c", pData->GetGlassData()->m_strGlassID, '0' + pDefectData->m_nCellIdx / 36, g_pCellCode[pDefectData->m_nCellIdx % 36]); + /* < KMH 20220609 : #4183 MOD Start > */ + //SPRINTRAW(12, "%s%c%c", pData->GetGlassData()->m_strGlassID, '0' + pDefectData->m_nCellIdx / 36, g_pCellCode[pDefectData->m_nCellIdx % 36]); + SPRINTRAW(12, "%s%s", pData->GetGlassData()->m_strGlassID, pDefectData->m_strCellName); + /* < KMH 20220609 : #4183 MOD End > */ // 04 5 DEF_NO // Defect Number of Panel // RAW �뙆�씪�슜 Defect Index //SPRINTRAW(5, "%d", pDefectData->m_nDefectIdx); @@ -1584,10 +1687,10 @@ cds.lpData = &upParam; DWORD dwReturn = 0; - if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 30000, (PDWORD_PTR)(dwReturn)) == FALSE) - { - } - + if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 5000, (PDWORD_PTR)(dwReturn)) == FALSE) + AKLOG(" FunCtion FTP : RAW File Upload Signal Fail[%d]", FTPCMD_RAW);/* <KMH 20220407 : #4053 ADD > */ + else + AKLOG(" FunCtion FTP : RAW File Upload Signal Sucess[%d]", FTPCMD_RAW);/* <KMH 20220407 : #4053 ADD > */ } void CGlassRawCPJT::SendMessageFTPDownloadStack( _grmGlassData* pGlassData ) @@ -1626,9 +1729,19 @@ cds.lpData = &upParam; DWORD dwReturn = 0; - if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 20000, (PDWORD_PTR)(dwReturn)) == FALSE) - { - } + if (SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 5000, (PDWORD_PTR)(dwReturn)) == FALSE) + /*< SWK 20220413 - #4053 MOD Start >*/ +// { +// AKLOG(" Fucntion FTP : Stack File Download Signal Fail[%d]", FTPCMD_STACK);/* <KMH 20220407 : #4053 ADD > */ +// } +// else +// { +// AKLOG(" Fucntion FTP : Stack File Download Signal Sucess[%d]", FTPCMD_STACK);/* <KMH 20220407 : #4053 ADD > */ +// } + AKLOG(" Function FTP : Stack File Download Signal Fail[%d]", FTPCMD_STACK); + else + AKLOG(" Function FTP : Stack File Download Signal Success[%d]", FTPCMD_STACK); + /*< SWK 20220413 - #4053 MOD End >*/ } void CGlassRawCPJT::SendMessageFTPDownloadDataFile( _grmGlassData* pGlassData ) @@ -1666,9 +1779,19 @@ cds.lpData = &upParam; DWORD dwReturn = 0; - if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 20000, (PDWORD_PTR)(dwReturn)) == FALSE) - { - } + if (SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 5000, (PDWORD_PTR)(dwReturn)) == FALSE) + /*< SWK 20220413 - #4053 MOD Start >*/ +// { +// AKLOG(" Fucntion FTP : RawMerge File Download Signal Sucess[%d]", FTPCMD_RAWMERGE);/* <KMH 20220407 : #4053 ADD > */ +// } +// else +// { +// AKLOG(" Fucntion FTP : RawMerge File Download Signal Fail[%d]", FTPCMD_RAWMERGE);/* <KMH 20220407 : #4053 ADD > */ +// } + AKLOG(" Function FTP : RawMerge File Download Signal Fail[%d]", FTPCMD_RAWMERGE); + else + AKLOG(" Function FTP : RawMerge File Download Signal Success[%d]", FTPCMD_RAWMERGE); + /*< SWK 20220413 - #4053 MOD End >*/ /*< KJG 20211024 - #3487 ADD End >*/ } @@ -1708,9 +1831,19 @@ cds.lpData = &upParam; DWORD dwReturn = 0; - if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 20000, (PDWORD_PTR)(dwReturn)) == FALSE) - { - } + if (SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 5000, (PDWORD_PTR)(dwReturn)) == FALSE) + /*< SWK 20220413 - #4053 MOD Start >*/ +// { +// AKLOG(" Fucntion FTP : Image Upload Signla Sucess[%d]", sort);/* <KMH 20220407 : #4053 ADD > */ +// } +// else +// { +// AKLOG(" Fucntion FTP : Image Upload Signla Fail[%d]", sort);/* <KMH 20220407 : #4053 ADD > */ +// } + AKLOG(" Function FTP : Image Upload Signal Fail[%d]", sort); + else + AKLOG(" Function FTP : Image Upload Signal Success[%d]", sort); + /*< SWK 20220413 - #4053 MOD End >*/ } @@ -1764,9 +1897,20 @@ cds.lpData = &upParam; DWORD dwReturn = 0; - if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 20000, (PDWORD_PTR)(dwReturn)) == FALSE) - { - } + if (SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 5000, (PDWORD_PTR)(dwReturn)) == FALSE) + /*< SWK 20220413 - #4053 MOD Start >*/ +// { +// AKLOG(" Fucntion FTP : Index File Upload Signla Sucess[%d]", FTPCMD_INDEX);/* <KMH 20220407 : #4053 ADD > */ +// } +// else +// { +// AKLOG(" Fucntion FTP : Index File Upload Signla Fail[%d]", FTPCMD_INDEX);/* <KMH 20220407 : #4053 ADD > */ +// } + AKLOG(" Function FTP : Index File Upload Signal Fail[%d]", FTPCMD_INDEX); + else + AKLOG(" Function FTP : Index File Upload Signal Success[%d]", FTPCMD_INDEX); + /*< SWK 20220413 - #4053 MOD End >*/ + return TRUE; } -- Gitblit v1.9.3