protected final void processEntry(@NotNull Map<String, EntryInfo> map,
                                    @Nullable Logger logger,
                                    @NotNull String entryName,
                                    @SuppressWarnings("BoundedWildcard") @Nullable BiFunction<@NotNull EntryInfo, @NotNull String, ? extends @NotNull EntryInfo> entryFun) {
    String normalizedName = normalizeName(entryName);
    if (normalizedName.isEmpty() || normalizedName.contains("..") && ArrayUtil.contains("..", normalizedName.split("/"))) {
      if (logger != null) logger.trace("invalid entry: " + getFile() + "!/" + entryName);
      return;
    }

    if (entryFun == null) {
      directoryEntry(map, logger, normalizedName);
      return;
    }

    EntryInfo existing = map.get(normalizedName);
    if (existing != null) {
      if (logger != null) logger.trace("duplicate entry: " + getFile() + "!/" + normalizedName);
      return;
    }

    Pair<String, String> path = split(normalizedName);
    EntryInfo parent = directoryEntry(map, logger, path.first);
    map.put(normalizedName, entryFun.apply(parent, path.second));
  }
protected final void processEntry(@NotNull Map<String, EntryInfo> map,
                                    @Nullable Logger logger,
                                    @NotNull String entryName,
                                    @SuppressWarnings("BoundedWildcard") @Nullable BiFunction<@NotNull EntryInfo, @NotNull String, ? extends @NotNull EntryInfo> entryFun)