// Path: json-unit-core/src/main/java/net/javacrumbs/jsonunit/core/ConfigurationWhen.java
// public interface ApplicableForPath {
//     @NotNull
//     Configuration applyForPaths(@NotNull Configuration configuration, @NotNull PathsParam pathsParam);
// }
// 
// Path: json-unit-core/src/main/java/net/javacrumbs/jsonunit/core/ConfigurationWhen.java
// public static class PathsParam {
//     private final List<String> paths;
// 
//     private PathsParam(String path) {
//         this.paths = Collections.singletonList(path);
//     }
// 
//     private PathsParam(String... paths) {
//         this.paths = Arrays.asList(paths);
//     }
// 
//     List<String> getPaths() {
//         return paths;
//     }
// 
//     Configuration apply(Configuration configuration, ApplicableForPath action) {
//         return action.applyForPaths(configuration, this);
//     }
// }
// 
// Path: json-unit-core/src/main/java/net/javacrumbs/jsonunit/core/internal/Options.java
// public class Options {
//     private static final Options EMPTY_OPTIONS = new Options(EnumSet.noneOf(Option.class));
//     private final EnumSet<Option> options;
// 
//     private Options(EnumSet<Option> options) {
//         this.options = options;
//     }
// 
//     public Options(Option first, Option... rest) {
//         this(EnumSet.of(first, rest));
//     }
// 
//     public static Options empty() {
//         return EMPTY_OPTIONS;
//     }
// 
//     public boolean contains(Option option) {
//         return options.contains(option);
//     }
// 
//     public Options with(Option option, Option... otherOptions) {
//         EnumSet<Option> optionsWith = EnumSet.copyOf(options);
//         optionsWith.addAll(EnumSet.of(option, otherOptions));
//         return new Options(optionsWith);
//     }
// 
// 
//     public Options without(Option option) {
//         EnumSet<Option> optionsWithout = EnumSet.copyOf(options);
//         optionsWithout.remove(option);
//         return new Options(optionsWithout);
//     }
// 
//     public Set<Option> values() {
//         return EnumSet.copyOf(options);
//     }
// }
// 
// Path: json-unit-core/src/main/java/net/javacrumbs/jsonunit/core/internal/PathOption.java
// public class PathOption {
//     private final List<String> paths;
//     private final Set<Option> options;
// 
//     /**
//      * True if this option is included, false if excluded.
//      */
//     private final boolean included;
// 
//     public PathOption(List<String> paths, Set<Option> options, boolean included) {
//         this.paths = Collections.unmodifiableList(paths);
//         this.options = Collections.unmodifiableSet(EnumSet.copyOf(options));
//         this.included = included;
//     }
// 
//     public List<String> getPaths() {
//         return paths;
//     }
// 
//     public Set<Option> getOptions() {
//         return options;
//     }
// 
//     boolean isIncluded() {
//         return included;
//     }
// 
//     public PathOption withPaths(List<String> newPoPaths) {
//         return new PathOption(newPoPaths, options, included);
//     }
// }
// 
// Path: json-unit-core/src/main/java/net/javacrumbs/jsonunit/core/listener/DifferenceListener.java
// public interface DifferenceListener {
//     void diff(Difference difference, DifferenceContext context);
// }


import java.util.Set;
import static java.util.Arrays.asList;
import net.javacrumbs.jsonunit.core.ConfigurationWhen.ApplicableForPath;
import net.javacrumbs.jsonunit.core.ConfigurationWhen.PathsParam;
import net.javacrumbs.jsonunit.core.internal.Options;
import net.javacrumbs.jsonunit.core.internal.PathOption;
import net.javacrumbs.jsonunit.core.listener.DifferenceListener;
import org.hamcrest.Matcher;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
    public static DifferenceListener dummyDifferenceListener() {
        return DUMMY_LISTENER;
    }

    @Nullable
    public Matcher<?> getMatcher(String matcherName) {
        return matchers.getMatcher(matcherName);
    }

    @Nullable
    public BigDecimal getTolerance() {
        return tolerance;
    }

    @NotNull
    public Options getOptions() {
        return options;
    }

    @NotNull
    public String getIgnorePlaceholder() {
        return ignorePlaceholder;
    }

    @NotNull
    public List<PathOption> getPathOptions() {
        return pathOptions;
    }

    @NotNull
// Path: json-unit-core/src/main/java/net/javacrumbs/jsonunit/core/ConfigurationWhen.java
// public interface ApplicableForPath {
//     @NotNull
//     Configuration applyForPaths(@NotNull Configuration configuration, @NotNull PathsParam pathsParam);
// }
// 
// Path: json-unit-core/src/main/java/net/javacrumbs/jsonunit/core/ConfigurationWhen.java
// public static class PathsParam {
//     private final List<String> paths;
// 
//     private PathsParam(String path) {
//         this.paths = Collections.singletonList(path);
//     }
// 
//     private PathsParam(String... paths) {
//         this.paths = Arrays.asList(paths);
//     }
// 
//     List<String> getPaths() {
//         return paths;
//     }
// 
//     Configuration apply(Configuration configuration, ApplicableForPath action) {
//         return action.applyForPaths(configuration, this);
//     }
// }
// 
// Path: json-unit-core/src/main/java/net/javacrumbs/jsonunit/core/internal/Options.java
// public class Options {
//     private static final Options EMPTY_OPTIONS = new Options(EnumSet.noneOf(Option.class));
//     private final EnumSet<Option> options;
// 
//     private Options(EnumSet<Option> options) {
//         this.options = options;
//     }
// 
//     public Options(Option first, Option... rest) {
//         this(EnumSet.of(first, rest));
//     }
// 
//     public static Options empty() {
//         return EMPTY_OPTIONS;
//     }
// 
//     public boolean contains(Option option) {
//         return options.contains(option);
//     }
// 
//     public Options with(Option option, Option... otherOptions) {
//         EnumSet<Option> optionsWith = EnumSet.copyOf(options);
//         optionsWith.addAll(EnumSet.of(option, otherOptions));
//         return new Options(optionsWith);
//     }
// 
// 
//     public Options without(Option option) {
//         EnumSet<Option> optionsWithout = EnumSet.copyOf(options);
//         optionsWithout.remove(option);
//         return new Options(optionsWithout);
//     }
// 
//     public Set<Option> values() {
//         return EnumSet.copyOf(options);
//     }
// }
// 
// Path: json-unit-core/src/main/java/net/javacrumbs/jsonunit/core/internal/PathOption.java
// public class PathOption {
//     private final List<String> paths;
//     private final Set<Option> options;
// 
//     /**
//      * True if this option is included, false if excluded.
//      */
//     private final boolean included;
// 
//     public PathOption(List<String> paths, Set<Option> options, boolean included) {
//         this.paths = Collections.unmodifiableList(paths);
//         this.options = Collections.unmodifiableSet(EnumSet.copyOf(options));
//         this.included = included;
//     }
// 
//     public List<String> getPaths() {
//         return paths;
//     }
// 
//     public Set<Option> getOptions() {
//         return options;
//     }
// 
//     boolean isIncluded() {
//         return included;
//     }
// 
//     public PathOption withPaths(List<String> newPoPaths) {
//         return new PathOption(newPoPaths, options, included);
//     }
// }
// 
// Path: json-unit-core/src/main/java/net/javacrumbs/jsonunit/core/listener/DifferenceListener.java
// public interface DifferenceListener {
//     void diff(Difference difference, DifferenceContext context);
// }


// Path: json-unit-core/src/main/java/net/javacrumbs/jsonunit/core/Configuration.java
import java.util.Set;
import static java.util.Arrays.asList;
import net.javacrumbs.jsonunit.core.ConfigurationWhen.ApplicableForPath;
import net.javacrumbs.jsonunit.core.ConfigurationWhen.PathsParam;
import net.javacrumbs.jsonunit.core.internal.Options;
import net.javacrumbs.jsonunit.core.internal.PathOption;
import net.javacrumbs.jsonunit.core.listener.DifferenceListener;
import org.hamcrest.Matcher;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;

    public static DifferenceListener dummyDifferenceListener() {
        return DUMMY_LISTENER;
    }

    @Nullable
    public Matcher<?> getMatcher(String matcherName) {
        return matchers.getMatcher(matcherName);
    }

    @Nullable
    public BigDecimal getTolerance() {
        return tolerance;
    }

    @NotNull
    public Options getOptions() {
        return options;
    }

    @NotNull
    public String getIgnorePlaceholder() {
        return ignorePlaceholder;
    }

    @NotNull
    public List<PathOption> getPathOptions() {
        return pathOptions;
    }

    @NotNull
    public Set<String> getPathsToBeIgnored() {