<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE CubeMarkup [
        <!ELEMENT CubeMarkup (Properties? (Cube | Language | Script)*)>
        <!ELEMENT Properties (Property*)>
        <!ELEMENT Property (PCDATA)>
        <!ATTLIST Property
                name CDATA #REQUIRED
                      >
        <!ELEMENT Cube (Description? CubeParts? CubeFacelets?)>
        <!ATTLIST Cube
                name CDATA #REQUIRED
                type (RUBIKS_CUBE | RUBIKS_OCTAGON) #REQUIRED
                scaleFactor CDATA "1.0"
                explosionFactor CDATA "0.0"
                      >
        <!ELEMENT Description (#PCDATA)>
        <!ELEMENT CubeParts (ColorTable? CubePart*)>
        <!ELEMENT ColorTable (Color)*>
        <!ELEMENT Color EMPTY>
        <!ATTLIST Color
                r CDATA #REQUIRED
                g CDATA #REQUIRED
                b CDATA #REQUIRED
                a CDATA "1.0"
        >
        <!ELEMENT CubePart EMPTY>
        <!ATTLIST CubePart
                id (LUF|RUF|RDF|LDF| LUB|RUB|RDB|LDB| LF|UF|RF|DF| LB|UB|RB|DB| LU|LD|RU|RD| L|R|U|D|F|B) #REQUIRED
                isVisible (true|false) "true"
                fillColorIndex CDATA "0"
                borderColorIndex CDATA "1"
        >
        <!ELEMENT CubeFacelets (ColorTable? CubeFacelet)>
        <!ELEMENT CubeFacelet EMPTY>
        <!ATTLIST CubeFacelet
                face (L|R|U|D|F|B) #REQUIRED
                index CDATA #REQUIRED
                isVisible (true|false) "true"
                fillColorIndex CDATA #REQUIRED
        >
        <!ELEMENT Language (Description? (FaceLanguage|ProceduralLanguage))>
        <!ATTLIST Language
                name CDATA #REQUIRED
                      >
        <!ELEMENT FaceLanguage (FaceDef+)>
        <!ELEMENT FaceDef EMPTY>
        <!ATTLIST FaceDef
                name (L|R|U|D|F|B) #REQUIRED
                      >
        <!ELEMENT ProceduralLanguage (Statement+)>
        <!ATTLIST ProceduralLanguage
                isInversionAtStartOfBlock (true|false) "false"
                isIterationAtStartOfBlock (true|false) "false"
        >
        <!ELEMENT Statement EMPTY>
        <!ATTLIST Statement
                name (
                        U| Ui| D| Di| L| Li| R| Ri| F| Fi| B| Bi|
                        U2| D2| L2| R2| F2| B2|
                        MU| MD| ML| MR| MF| MB|
                        MU2| MD2| ML2| MR2| MF2| MB2|
                        CU| CD| CL| CR| CF| CB|
                        CU2| CD2| CL2| CR2| CF2| CB2|
                        TLUF| TRUF| TLDF| TRDF|  TLUB| TRUB| TLDB| TRDB|
                        TLUFi| TRUFi| TLDFi| TRDFi|  TLUBi| TRUBi| TLDBi| TRDBi|
                        TLF| TUF| TRF| TDF|  TLU| TLD| TRU| TRD|  TLB| TUB| TRB| TDB|
                        TL| TU| TR| TB| TF | TD |
                        TLi| TUi| TRi| TBi| TFi | TDi |
                        TL2| TU2| TR2| TB2| TF2 | TD2 |
                        Divider|BeginBlock|EndBlock|BeginInversion|EndInversion|BeginIteration|EndIteration|
                        BeginCall|EndCall|BeginComment|EndComment
                ) #REQUIRED
                      >
        <!ELEMENT Script (Description? | ScriptBody)>
        <!ATTLIST Script
                name CDATA #REQUIRED
                language CDATA #REQUIRED
                preferredLanguage CDATA #IMPLIED
                preferredCube CDATA #IMPLIED
                programCounter CDATA "-1"
                      >
]>
<CubeMarkup>
        <Cube name="Rubik's Cube" type="RUBIKS_CUBE">
        </Cube>
        <Cube name="Rubik's Octagon" type="RUBIKS_OCTAGON">
        </Cube>

        <Language name="Singmaster">
                <ProceduralLanguage>
                        <Statement name="L">L</Statement>
                        <Statement name="R">R</Statement>
                        <Statement name="U">U</Statement>
                        <Statement name="D">D</Statement>
                        <Statement name="F">F</Statement>
                        <Statement name="B">B</Statement>
                        <Statement name="Li">L'</Statement>
                        <Statement name="Ri">R'</Statement>
                        <Statement name="Ui">U'</Statement>
                        <Statement name="Di">D'</Statement>
                        <Statement name="Fi">F'</Statement>
                        <Statement name="Bi">B'</Statement>
                        <Statement name="L2">L2</Statement>
                        <Statement name="R2">R2</Statement>
                        <Statement name="U2">U2</Statement>
                        <Statement name="D2">D2</Statement>
                        <Statement name="F2">F2</Statement>
                        <Statement name="B2">B2</Statement>
                        <Statement name="Divider">.</Statement>
                </ProceduralLanguage>
        </Language>
        <Language name="Superset Procedural">
                <ProceduralLanguage>
                        <Statement name="L">L</Statement>
                        <Statement name="R">R</Statement>
                        <Statement name="U">U</Statement>
                        <Statement name="D">D</Statement>
                        <Statement name="F">F</Statement>
                        <Statement name="B">B</Statement>

                        <Statement name="Li">L'</Statement>
                        <Statement name="Ri">R'</Statement>
                        <Statement name="Ui">U'</Statement>
                        <Statement name="Di">D'</Statement>
                        <Statement name="Fi">F'</Statement>
                        <Statement name="Bi">B'</Statement>

                        <Statement name="U2">U2</Statement>
                        <Statement name="D2">D2</Statement>
                        <Statement name="L2">L2</Statement>
                        <Statement name="R2">R2</Statement>
                        <Statement name="F2">F2</Statement>
                        <Statement name="B2">B2</Statement>

                        <Statement name="MU">MU</Statement>
                        <Statement name="MD">MD</Statement>
                        <Statement name="ML">ML</Statement>
                        <Statement name="MR">MR</Statement>
                        <Statement name="MF">MF</Statement>
                        <Statement name="MB">MB</Statement>

                        <Statement name="MU">MD'</Statement>
                        <Statement name="MD">MU'</Statement>
                        <Statement name="ML">MR'</Statement>
                        <Statement name="MR">ML'</Statement>
                        <Statement name="MF">MB'</Statement>
                        <Statement name="MB">MF'</Statement>

                        <Statement name="MU2">MU2</Statement>
                        <Statement name="MD2">MD2</Statement>
                        <Statement name="ML2">ML2</Statement>
                        <Statement name="MR2">MR2</Statement>
                        <Statement name="MF2">MF2</Statement>
                        <Statement name="MB2">MB2</Statement>

                        <Statement name="CU">CU</Statement>
                        <Statement name="CD">CD</Statement>
                        <Statement name="CL">CL</Statement>
                        <Statement name="CR">CR</Statement>
                        <Statement name="CF">CF</Statement>
                        <Statement name="CB">CB</Statement>

                        <Statement name="CU">CD'</Statement>
                        <Statement name="CD">CU'</Statement>
                        <Statement name="CL">CR'</Statement>
                        <Statement name="CR">CL'</Statement>
                        <Statement name="CF">CB'</Statement>
                        <Statement name="CB">CF'</Statement>

                        <Statement name="CU2">CU2</Statement>
                        <Statement name="CD2">CD2</Statement>
                        <Statement name="CL2">CL2</Statement>
                        <Statement name="CR2">CR2</Statement>
                        <Statement name="CF2">CF2</Statement>
                        <Statement name="CB2">CB2</Statement>

                        <Statement name="TLUF">TLUF</Statement>
                        <Statement name="TRUF">TRUF</Statement>
                        <Statement name="TLDF">TLDF</Statement>
                        <Statement name="TRDF">TRDF</Statement>
                        <Statement name="TLUB">TLUB</Statement>
                        <Statement name="TRUB">TRUB</Statement>
                        <Statement name="TLDB">TLDB</Statement>
                        <Statement name="TRDB">TRDB</Statement>
                        <Statement name="TLUFi">TLUF'</Statement>
                        <Statement name="TRUFi">TRUF'</Statement>
                        <Statement name="TLDFi">TLDF'</Statement>
                        <Statement name="TRDFi">TRDF'</Statement>
                        <Statement name="TLUBi">TLUB'</Statement>
                        <Statement name="TRUBi">TRUB'</Statement>
                        <Statement name="TLDBi">TLDB'</Statement>
                        <Statement name="TRDBi">TRDB'</Statement>

                        <Statement name="TLF">TLF</Statement>
                        <Statement name="TUF">TUF</Statement>
                        <Statement name="TRF">TRF</Statement>
                        <Statement name="TDF">TDF</Statement>
                        <Statement name="TLU">TLU</Statement>
                        <Statement name="TLD">TLD</Statement>
                        <Statement name="TRU">TRU</Statement>
                        <Statement name="TRD">TRD</Statement>
                        <Statement name="TLB">TLB</Statement>
                        <Statement name="TUB">TUB</Statement>
                        <Statement name="TRB">TRB</Statement>
                        <Statement name="TDB">TDB</Statement>

                        <Statement name="TL">TL</Statement>
                        <Statement name="TU">TU</Statement>
                        <Statement name="TR">TR</Statement>
                        <Statement name="TB">TB</Statement>
                        <Statement name="TF">TF</Statement>
                        <Statement name="TD">TD</Statement>

                        <Statement name="TLi">TL'</Statement>
                        <Statement name="TUi">TU'</Statement>
                        <Statement name="TRi">TR'</Statement>
                        <Statement name="TBi">TB'</Statement>
                        <Statement name="TFi">TF'</Statement>
                        <Statement name="TDi">TD'</Statement>

                        <Statement name="TL2">TL2</Statement>
                        <Statement name="TU2">TU2</Statement>
                        <Statement name="TR2">TR2</Statement>
                        <Statement name="TB2">TB2</Statement>
                        <Statement name="TF2">TF2</Statement>
                        <Statement name="TD2">TD2</Statement>

                        <Statement name="Divider">.</Statement>
                        <Statement name="BeginBlock">(</Statement>
                        <Statement name="EndBlock">)</Statement>
                        <Statement name="BeginCall">"</Statement>
                        <Statement name="EndCall">"</Statement>
                        <Statement name="BeginComment">/*</Statement>
                        <Statement name="EndComment">*/</Statement>
                </ProceduralLanguage>
        </Language>
        <Language name="Superset Facelets">
                <FaceletLanguage>
                        <FaceDef name="L">L</FaceDef>
                        <FaceDef name="R">R</FaceDef>
                        <FaceDef name="U">U</FaceDef>
                        <FaceDef name="D">D</FaceDef>
                        <FaceDef name="F">F</FaceDef>
                        <FaceDef name="B">B</FaceDef>
                </FaceletLanguage>
        </Language>
</CubeMarkup>
