class Explain extends Statement {

    public enum Option {
        ANALYZE,
        COSTS,
        VERBOSE
    }

    private final Statement statement;
    // Possible values for options is `true`, `false`, `null`
    private final Map<Option, Boolean> options;

    public Explain(Statement statement, Map<Option, Boolean> options) {
        this.statement = requireNonNull(statement, "statement is null");
        this.options = options;
    }

    public Statement getStatement() {
        return statement;
    }

    public Map<Option, Boolean> options() {
        return options;
    }

    public boolean isOptionActivated(Explain.Option option) {
        // Option is activated if key is present and value true or null
        // e.g. explain (analyze true) or explain (analyze)
        return options.containsKey(option) && (options.get(option) == null || options.get(option) == true);
    }

    public boolean isOptionExplicitlyDeactivated(Explain.Option option) {
        return options.containsKey(option) && options.get(option) == false;
    }

    @Override
    public <R, C> R accept(AstVisitor<R, C> visitor, C context) {
        return visitor.visitExplain(this, context);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        Explain explain = (Explain) o;
        return Objects.equals(statement, explain.statement) &&
            Objects.equals(options, explain.options);
    }

    @Override
    public int hashCode() {
        return Objects.hash(statement, options);
    }

    public String toString() {<FILL_FUNCTION_BODY>}
}

        return "Explain{" +
               "statement=" + statement +
               ", options=" + options +
               '}';
    
<methods>public non-sealed void <init>() ,public R accept(AstVisitor<R,C>, C) <variables>