boolean (@NotNull ArchiveHandler.EntryInfo entry, @NotNull CharSequence relativePath) { int endIndex = relativePath.length(); for (ArchiveHandler.EntryInfo e = entry; e != null; e = e.parent) { CharSequence shortName = e.shortName; if (!CharArrayUtil.regionMatches(relativePath, endIndex - shortName.length(), relativePath.length(), shortName)) { return false; } endIndex -= shortName.length(); if (e.parent != null && e.parent.shortName.length() != 0 && endIndex != 0) { // match "/" if (relativePath.charAt(endIndex-1) == '/') { endIndex -= 1; } else { return false; } } } return endIndex==0; }