%%HP: T(3)A(D)F(.);
DIR
  DELC
    \<< SWAP trn SWAP
DELR trn
    \>>
  DELR
    \<< \-> a
      \<< M\->V DUP a -
2 + ROLL DROP 1 -
V\->M
      \>>
    \>>
  PUTC
    \<< ROT trn ROT
ROT PUTR trn
    \>>
  PUTR
    \<< \-> a v
      \<< M\->V
        IF a 0 <
        THEN DUP a
+ 2 + ROLL DROP v
OVER a + 2 + ROLLD
        ELSE v OVER
a - 3 + ROLLD 1 +
        END V\->M
      \>>
    \>>
  V\->M
    \<< OVER SIZE 1
GET \-> n m
      \<< 0 n 1 -
        FOR i i m *
n i - + ROLL OBJ\->
DROP
        NEXT n m 2
\->LIST \->ARRY
      \>>
    \>>
  M\->V
    \<< OBJ\-> OBJ\->
DROP \-> n m
      \<< 1 n
        FOR i m 1
\->LIST \->ARRY n i - m
* i + ROLLD
        NEXT n
      \>>
    \>>
  GETR
    \<< \-> r
      \<< M\->V DUP r -
2 + PICK \-> a
        \<< DROPN a
        \>>
      \>>
    \>>
  GETC
    \<< SWAP TRN SWAP
GETR trn
    \>>
  CST { A\<-\->L trn
MOP V\<-\->M V\->M M\->V
GETR GETC PUTR PUTC
DELR DELC }
  A\<-\->L
    \<<
      IF DUP TYPE 5
==
      THEN
        IF DUP 1
GET TYPE 5 ==
        THEN \-> a
          \<< 1 a
SIZE
            FOR i a
i GET OBJ\-> 1 \->LIST
\->ARRY
            NEXT a
SIZE V\->M
          \>>
        ELSE OBJ\-> 1
\->LIST \->ARRY
        END
      ELSE
        IF DUP SIZE
SIZE 2 ==
        THEN M\->V {
} SWAP 1
          FOR i i 1
+ ROLL OBJ\-> 1 GET
\->LIST 1 \->LIST + -1
          STEP
        ELSE OBJ\-> 1
GET \->LIST
        END
      END
    \>>
  trn
    \<<
      IF DUP TYPE 5
==
      THEN
        IF DUP 1
GET TYPE 5 \=/
        THEN 1
\->LIST
        END DUP
SIZE OVER 1 GET
SIZE \-> l n m
        \<< 1 m
          FOR i 1 n
            FOR j l
j GET i GET
            NEXT n
\->LIST
          NEXT m
\->LIST
        \>>
        IF DUP SIZE
1 == OVER 1 GET
TYPE 5 == AND
        THEN OBJ\->
DROP
        END
      ELSE
        IF DUP SIZE
SIZE 1 ==
        THEN V\<-\->M
        END TRN
        IF DUP SIZE
1 GET 1 ==
        THEN V\<-\->M
        END
      END
    \>>
  MOP
    \<< 1 CF DEPTH
\->LIST DUP \-> s
      \<< LIST\-> DROP
\-> a o
        \<< a DUP
          IFERR RCL
1 SF SWAP DROP
          THEN
          END 1
OVER SIZE LIST\-> 1 -
          IF
          THEN *
          END
          IFERR
            FOR i
              IF 1
FS?
              THEN
a
              END i
OVER i GET 'X' STO
o EVAL
              IFERR
PUT
              THEN
ROT (1,0) * ROT ROT
PUT
              END
            NEXT
          THEN
DROP2 'X' PURGE
            IF 1
FS?
            THEN
STO
            ELSE
DROP
            END
CLEAR s LIST\-> DROP
"MOP Error:
" ERRM
+ DOERR
          ELSE
            IF 1
FC?
            THEN
SWAP
            END
DROP
          END 1 CF
'X' PURGE
        \>>
      \>>
    \>>
  V\<-\->M
    \<<
      IF DUP SIZE
SIZE 1 ==
      THEN 1 V\->M
      ELSE M\->V DROP
      END
    \>>
END
 

