qnaCrossTrain = function (qnaFileIdToResourceMap, luFileIdToResourceMap, interruptionIntentName, allLuEmpty) {
  try {
    for (const qnaObjectId of Array.from(qnaFileIdToResourceMap.keys())) {
      let luObjectId = qnaObjectId.toLowerCase().replace(new RegExp(helpers.FileExtTypeEnum.QnAFile + '$'), helpers.FileExtTypeEnum.LUFile)
      let fileName = path.basename(qnaObjectId, path.extname(qnaObjectId))
      const culture = fileHelper.getCultureFromPath(qnaObjectId)
      fileName = culture ? fileName.substring(0, fileName.length - culture.length - 1) : fileName

      luObjectId = Array.from(luFileIdToResourceMap.keys()).find(x => x.toLowerCase() === luObjectId)
      if (luObjectId) {
        const { luResource, qnaResource } = qnaCrossTrainCore(luFileIdToResourceMap.get(luObjectId), qnaFileIdToResourceMap.get(qnaObjectId), fileName, interruptionIntentName, allLuEmpty)
        luFileIdToResourceMap.set(luObjectId, luResource)
        qnaFileIdToResourceMap.set(qnaObjectId, qnaResource)
      } else {
        let qnaResource = qnaAddMetaData(qnaFileIdToResourceMap.get(qnaObjectId), fileName)
        qnaFileIdToResourceMap.set(qnaObjectId, qnaResource)
      }
    }
  } catch (err) {
    throw (err)
  }
}
do qna cross training with lu files
@param {Map<string, LUResource>} qnaFileIdToResourceMap map of qna file id and resource
@param {Map<string, LUResource>} luFileIdToResourceMap map of lu file id and resource
@param {string} interruptionIntentName interruption intent name
@param {boolean} allLuEmpty indicate if all lu files are section empty
@throws {exception} throws errors