generators.ET0LTreeGrammar:
(
  { S1, S2,
    A-L1, A-L2, A-R1, A-R2, AH-L2, AH-R2,
    BOT-L1, BOT-L2, BOT-R1, BOT-R2,
    L-WAIT1, R-WAIT1, L-WAIT2, R-WAIT2,
    L-WAIT-BOT0, R-WAIT-BOT0, L-WAIT-BOT1, R-WAIT-BOT1, L-WAIT-BOT2, R-WAIT-BOT2, H1, H2
  },
  { lr:4, l:3, r:3, +:2, mir:1, rot:1, left:2, right:2, flip:1, up:4, tile:0, single:0, double:0, trinity:0, -:0 },
  {
    {
      BOT-L1 -> left[flip[single], BOT-L2],
      BOT-L2 -> left[double, BOT-L1],
      BOT-R1 -> right[flip[single], BOT-R2],
      BOT-R2 -> right[double, BOT-R1],
      S1 -> up[flip[tile], A-L2, A-R2, S2],
      S2 -> up[tile, A-L1, A-R1, S1],
      A-L1 -> left[flip[tile], A-L2],
      A-L2 -> left[tile, A-L1],
      A-R1 -> right[flip[tile], A-R2],
      A-R2 -> right[tile, A-R1],
      H1 -> up[flip[single], AH-L2, AH-R2, S2],
      L-WAIT-BOT1 -> left[flip[rot[single]], A-L2],
      R-WAIT-BOT1 -> right[flip[rot[rot[single]]], A-R2],
      L-WAIT1 -> left[flip[rot[rot[double]]], AH-L2],
      R-WAIT1 -> right[flip[rot[double]], AH-R2],
      AH-L2 -> left[rot[rot[single]], A-L1],
      AH-R2 -> right[rot[single], A-R1]
    },
    {
      S1 -> up[flip[tile], L-WAIT-BOT2, R-WAIT-BOT2, H2],
      BOT-L1 -> left[flip[single], BOT-L2],
      BOT-L2 -> left[double, BOT-L1],
      BOT-R1 -> right[flip[single], BOT-R2],
      BOT-R2 -> right[double, BOT-R1],
      A-L1 -> left[flip[tile], A-L2],
      A-L2 -> left[tile, A-L1],
      A-R1 -> right[flip[tile], A-R2],
      A-R2 -> right[tile, A-R1],
      H1 -> up[flip[trinity], L-WAIT-BOT0, R-WAIT-BOT0, H2],
      L-WAIT-BOT1 -> left[flip[rot[single]], A-L2],
      R-WAIT-BOT1 -> right[flip[rot[rot[single]]], A-R2],
      L-WAIT1 -> left[flip[rot[rot[double]]], AH-L2],
      R-WAIT1 -> right[flip[rot[double]], AH-R2],
      AH-L2 -> left[rot[rot[single]], A-L1],
      AH-R2 -> right[rot[single], A-R1]
    },
    {
      S1 -> up[flip[double], L-WAIT-BOT2, R-WAIT-BOT2, H2],
      BOT-L1 -> left[flip[single], BOT-L2],
      BOT-L2 -> left[double, BOT-L1],
      BOT-R1 -> right[flip[single], BOT-R2],
      BOT-R2 -> right[double, BOT-R1],
      A-L1 -> left[flip[tile], A-L2],
      A-L2 -> left[tile, A-L1],
      A-R1 -> right[flip[tile], A-R2],
      A-R2 -> right[tile, A-R1],
      H2 -> up[-, L-WAIT1, R-WAIT1, H1],
      H1 -> up[-, L-WAIT2, R-WAIT2, H2],
      L-WAIT-BOT1 -> left[flip[double], L-WAIT-BOT2],
      L-WAIT-BOT2 -> left[single, L-WAIT-BOT1],
      L-WAIT-BOT0 -> left[rot[double], L-WAIT-BOT1],
      R-WAIT-BOT1 -> right[flip[double], R-WAIT-BOT2],
      R-WAIT-BOT2 -> right[single, R-WAIT-BOT1],
      R-WAIT-BOT0 -> right[rot[rot[double]], R-WAIT-BOT1],
      L-WAIT1 -> left[-, L-WAIT2],
      R-WAIT1 -> right[-, R-WAIT2],
      L-WAIT2 -> left[-, L-WAIT1],
      R-WAIT2 -> right[-, R-WAIT1],
      AH-L2 -> left[rot[rot[single]], A-L1],
      AH-R2 -> right[rot[single], A-R1]
    },
    {
      BOT-L1 -> left[flip[rot[double]], trinity],
      BOT-R1 -> right[flip[rot[rot[double]]], trinity],
      S1 -> up[flip[double], rot[rot[double]], rot[double], trinity],
      A-L1 -> left[flip[rot[rot[single]]], rot[rot[double]]],
      A-R1 -> right[flip[rot[single]], rot[double]]
    }
      
  },
  up[double, BOT-L1, BOT-R1, S1],
%  ((3 3)* 1 1)* 4
  (((3 3)* (3 3 2 3)*)* 1 1)* 4
)
