@Override
    public @NotNull <SS> It<SS> createIterator(@NotNull Iterable<? extends SS> ignore1,
                                      @NotNull Function<? super SS, ? extends Iterable<? extends SS>> ignore2) {
      List<Meta> metas = ContainerUtil.reverse(JBIterable.generate(this.meta, o -> (Meta)o.original).toList());
      Meta firstMeta = metas.get(0);

      Iterable roots = firstMeta.roots;
      Function tree = firstMeta::children;
      Condition filter = firstMeta.filter.and();

      for (int i = 1, count = metas.size(); i <= count; i++) {
        Meta meta = i < count ? metas.get(i) : null;
        TreeTraversal adjusted = meta == null ? this : (TreeTraversal)meta.interceptor.fun(original);

        tree = new MappedTree(tree, ((MappedTraversal)adjusted).map, meta);
        // Must be a separate variable, otherwise javac 8u201 crashes when compiling this code
        Function fn = ((MappedTree)tree)::map;
        roots = JBIterable.from(roots).map(fn);

        Function tree0 = tree;
        Condition filter0 = filter;
        Condition<? super Object> prevFilter = filter == Conditions.alwaysTrue() ? Conditions.alwaysTrue() :
                                               o -> filter0.value(((MappedTree)tree0).reverse(o));
        filter = Conditions.and(prevFilter, meta == null ? Conditions.alwaysTrue() : meta.filter.and());
      }

      MappedTree mappedTree = (MappedTree)tree;
      return (It<SS>)original
        .createIterator(JBIterable.from(roots), mappedTree)
        .filter(filter);
    }
@Override
    public @NotNull <SS> It<SS> createIterator(@NotNull Iterable<? extends SS> ignore1,
                                      @NotNull Function<? super SS, ? extends Iterable<? extends SS>> ignore2)