enum {
    // this behaviour is confusing, but I like that
    // we support it.
    __ = (__ - 1),
    A  = (__ + 1),

    B,
    C
};

enum {
    D = C + B,
    E = C + C,
    F = C + D,
};

enum {
    G = (B + F), H = (C + F),
    I = (D + F), J = (B + I)
};
enum {
    K = A + B - C + D - E + F *
        G - H + I - J + A - B -
        J + A,
    L,
    M,
    N
};

enum : flag {
    F1, /* = 1 << 1 */
    F2, /* = 1 << 2 */
    F3  /* = 1 << 3 */
};

/* reversed enumeration */
enum : reverse {
    R1, // 3
    R2, // 2
    R3, // 1
    R4  // 0
};

void main() {
    print(ftos(A), "\n");
    print(ftos(B), "\n");
    print(ftos(C), "\n");
    print(ftos(D), "\n");
    print(ftos(E), "\n");
    print(ftos(F), "\n");
    print(ftos(G), "\n");
    print(ftos(H), "\n");
    print(ftos(I), "\n");
    print(ftos(J), "\n");
    print(ftos(K), "\n");
    print(ftos(L), "\n");
    print(ftos(M), "\n");
    print(ftos(N), "\n");

    print(ftos(F1), "\n");
    print(ftos(F2), "\n");
    print(ftos(F3), "\n");

    print(ftos(R1), "\n");
    print(ftos(R2), "\n");
    print(ftos(R3), "\n");
    print(ftos(R4), "\n");
};