docs: static boolean matchPath(String[] tokenizedPattern, String[] strDirs, boolean isCaseSensitive) {
          int patIdxStart = 0;
          int patIdxEnd = tokenizedPattern.length - 1;
          int strIdxStart = 0;
          int strIdxEnd = strDirs.length - 1;
  
          // up to first '**'
          while (patIdxStart <= patIdxEnd && strIdxStart <= strIdxEnd) {
              String patDir = tokenizedPattern[patIdxStart];
              if (patDir.equals(DEEP_TREE_MATCH)) {
                  break;
              }
              if (!match(patDir, strDirs[strIdxStart], isCaseSensitive)) {
                  return false;
              }
              patIdxStart++;
              strIdxStart++;
          }
          if (strIdxStart > strIdxEnd) {
              // String is exhausted
              for (int i = patIdxStart; i <= patIdxEnd; i++) {
                  if (!tokenizedPattern[i].equals(DEEP_TREE_MATCH)) {
                      return false;
                  }
              }
              return true;
          } else {
              if (patIdxStart > patIdxEnd) {
                  // String not exhausted, but pattern is. Failure.
                  return false;
              }
          }
  
          // up to last '**'
          while (patIdxStart <= patIdxEnd && strIdxStart <= strIdxEnd) {
              String patDir = tokenizedPattern[patIdxEnd];
              if (patDir.equals(DEEP_TREE_MATCH)) {
                  break;
              }
              if (!match(patDir, strDirs[strIdxEnd], isCaseSensitive)) {
                  return false;
              }
              patIdxEnd--;
              strIdxEnd--;
          }
          if (strIdxStart > strIdxEnd) {
              // String is exhausted
              for (int i = patIdxStart; i <= patIdxEnd; i++) {
                  if (!tokenizedPattern[i].equals(DEEP_TREE_MATCH)) {
                      return false;
                  }
              }
              return true;
          }
  
          while (patIdxStart != patIdxEnd && strIdxStart <= strIdxEnd) {
              int patIdxTmp = -1;
              for (int i = patIdxStart + 1; i <= patIdxEnd; i++) {
                  if (tokenizedPattern[i].equals(DEEP_TREE_MATCH)) {
                      patIdxTmp = i;
                      break;
                  }
              }
              if (patIdxTmp == patIdxStart + 1) {
                  // '**/**' situation, so skip one
                  patIdxStart++;
                  continue;
              }
              // Find the pattern between padIdxStart & padIdxTmp in str between
              // strIdxStart & strIdxEnd
              int patLength = (patIdxTmp - patIdxStart - 1);
              int strLength = (strIdxEnd - strIdxStart + 1);
              int foundIdx = -1;
              strLoop:
              for (int i = 0; i <= strLength - patLength; i++) {
                  for (int j = 0; j < patLength; j++) {
                      String subPat = tokenizedPattern[patIdxStart + j + 1];
                      String subStr = strDirs[strIdxStart + i + j];
                      if (!match(subPat, subStr, isCaseSensitive)) {
                          continue strLoop;
                      }
                  }
  
                  foundIdx = strIdxStart + i;
                  break;
              }
  
              if (foundIdx == -1) {
                  return false;
              }
  
              patIdxStart = patIdxTmp;
              strIdxStart = foundIdx + patLength;
          }
  
          for (int i = patIdxStart; i <= patIdxEnd; i++) {
              if (!tokenizedPattern[i].equals(DEEP_TREE_MATCH)) {
                  return false;
              }
          }
  
          return true;
      }