// Sealed class
public sealed class Shape
    permits Circle, Rectangle, Triangle {
    
    public abstract double area();
}

// Final subclass (cannot be extended)
public final class Circle extends Shape {
    private final double radius;
    
    public Circle(double radius) {
        this.radius = radius;
    }
    
    @Override
    public double area() {
        return Math.PI * radius * radius;
    }
}

// Final subclass
public final class Rectangle extends Shape {
    private final double width, height;
    
    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }
    
    @Override
    public double area() {
        return width * height;
    }
}

// Non-sealed subclass (can be extended)
public non-sealed class Triangle extends Shape {
    protected double base, height;
    
    public Triangle(double base, double height) {
        this.base = base;
        this.height = height;
    }
    
    @Override
    public double area() {
        return 0.5 * base * height;
    }
}

// Can extend non-sealed class
public class EquilateralTriangle extends Triangle {
    private double side;
    
    public EquilateralTriangle(double side) {
        super(side, side * Math.sqrt(3) / 2);
        this.side = side;
    }
}

// Sealed interface
public sealed interface Expression
    permits Constant, Variable, Addition, Multiplication {
    
    double evaluate();
}

public final class Constant implements Expression {
    private final double value;
    
    public Constant(double value) {
        this.value = value;
    }
    
    @Override
    public double evaluate() {
        return value;
    }
}

public final class Variable implements Expression {
    private final String name;
    private final double value;
    
    public Variable(String name, double value) {
        this.name = name;
        this.value = value;
    }
    
    @Override
    public double evaluate() {
        return value;
    }
}

public record Addition(Expression left, Expression right) implements Expression {
    @Override
    public double evaluate() {
        return left.evaluate() + right.evaluate();
    }
}

public record Multiplication(Expression left, Expression right) implements Expression {
    @Override
    public double evaluate() {
        return left.evaluate() * right.evaluate();
    }
}