MediaWiki:Skin/Projekt:Adventure2/parser.js: Unterschied zwischen den Versionen

aus Kamelopedia, der wüsten Enzyklopädie
Zur Navigation springen Zur Suche springen
(a2 initialisieren, falls nötig)
 
(17 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
 +
if (window.a2 === undefined)
 +
window.a2 = {};
 +
 
a2.parser = (function(){
 
a2.parser = (function(){
 
   /*
 
   /*
Zeile 52: Zeile 55:
 
         "ActionFunctions": parse_ActionFunctions,
 
         "ActionFunctions": parse_ActionFunctions,
 
         "ActionFunction": parse_ActionFunction,
 
         "ActionFunction": parse_ActionFunction,
 +
        "Channel": parse_Channel,
 
         "PageDec": parse_PageDec,
 
         "PageDec": parse_PageDec,
 
         "PageVirtualClause": parse_PageVirtualClause,
 
         "PageVirtualClause": parse_PageVirtualClause,
Zeile 59: Zeile 63:
 
         "ItemVirtualClause": parse_ItemVirtualClause,
 
         "ItemVirtualClause": parse_ItemVirtualClause,
 
         "ItemVirtualList": parse_ItemVirtualList,
 
         "ItemVirtualList": parse_ItemVirtualList,
 +
        "StringKwArgClause": parse_StringKwArgClause,
 +
        "StringKwArg": parse_StringKwArg,
 
         "L": parse_L,
 
         "L": parse_L,
 
         "R": parse_R,
 
         "R": parse_R,
Zeile 67: Zeile 73:
 
         "ItemVirtual": parse_ItemVirtual,
 
         "ItemVirtual": parse_ItemVirtual,
 
         "Page": parse_Page,
 
         "Page": parse_Page,
 +
        "Time": parse_Time,
 +
        "Overlay": parse_Overlay,
 
         "S": parse_S,
 
         "S": parse_S,
 
         "String": parse_String,
 
         "String": parse_String,
Zeile 83: Zeile 91:
 
       }
 
       }
 
        
 
        
       var pos = 0;
+
       var pos = { offset: 0, line: 1, column: 1, seenCR: false };
 
       var reportFailures = 0;
 
       var reportFailures = 0;
       var rightmostFailuresPos = 0;
+
       var rightmostFailuresPos = { offset: 0, line: 1, column: 1, seenCR: false };
 
       var rightmostFailuresExpected = [];
 
       var rightmostFailuresExpected = [];
 +
      var cache = {};
 
        
 
        
 
       function padLeft(input, padding, length) {
 
       function padLeft(input, padding, length) {
Zeile 113: Zeile 122:
 
          
 
          
 
         return '\\' + escapeChar + padLeft(charCode.toString(16).toUpperCase(), '0', length);
 
         return '\\' + escapeChar + padLeft(charCode.toString(16).toUpperCase(), '0', length);
 +
      }
 +
     
 +
      function clone(object) {
 +
        var result = {};
 +
        for (var key in object) {
 +
          result[key] = object[key];
 +
        }
 +
        return result;
 +
      }
 +
     
 +
      function advance(pos, n) {
 +
        var endOffset = pos.offset + n;
 +
       
 +
        for (var offset = pos.offset; offset < endOffset; offset++) {
 +
          var ch = input.charAt(offset);
 +
          if (ch === "\n") {
 +
            if (!pos.seenCR) { pos.line++; }
 +
            pos.column = 1;
 +
            pos.seenCR = false;
 +
          } else if (ch === "\r" || ch === "\u2028" || ch === "\u2029") {
 +
            pos.line++;
 +
            pos.column = 1;
 +
            pos.seenCR = true;
 +
          } else {
 +
            pos.column++;
 +
            pos.seenCR = false;
 +
          }
 +
        }
 +
       
 +
        pos.offset += n;
 
       }
 
       }
 
        
 
        
 
       function matchFailed(failure) {
 
       function matchFailed(failure) {
         if (pos < rightmostFailuresPos) {
+
         if (pos.offset < rightmostFailuresPos.offset) {
 
           return;
 
           return;
 
         }
 
         }
 
          
 
          
         if (pos > rightmostFailuresPos) {
+
         if (pos.offset > rightmostFailuresPos.offset) {
           rightmostFailuresPos = pos;
+
           rightmostFailuresPos = clone(pos);
 
           rightmostFailuresExpected = [];
 
           rightmostFailuresExpected = [];
 
         }
 
         }
Zeile 129: Zeile 168:
 
        
 
        
 
       function parse_start() {
 
       function parse_start() {
 +
        var cacheKey = "start@" + pos.offset;
 +
        var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 +
       
 
         var result0, result1, result2;
 
         var result0, result1, result2;
 
         var pos0, pos1;
 
         var pos0, pos1;
 
          
 
          
         pos0 = pos;
+
         pos0 = clone(pos);
         pos1 = pos;
+
         pos1 = clone(pos);
 
         result0 = parse_S();
 
         result0 = parse_S();
 
         result0 = result0 !== null ? result0 : "";
 
         result0 = result0 !== null ? result0 : "";
Zeile 147: Zeile 193:
 
           } else {
 
           } else {
 
             result0 = null;
 
             result0 = null;
             pos = pos1;
+
             pos = clone(pos1);
 
           }
 
           }
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
           pos = pos1;
+
           pos = clone(pos1);
 
         }
 
         }
 
         if (result0 !== null) {
 
         if (result0 !== null) {
           result0 = (function(offset, d) {return d;})(pos0, result0[1]);
+
           result0 = (function(offset, line, column, d) {return d;})(pos0.offset, pos0.line, pos0.column, result0[1]);
 
         }
 
         }
 
         if (result0 === null) {
 
         if (result0 === null) {
           pos = pos0;
+
           pos = clone(pos0);
 
         }
 
         }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 
         return result0;
 
         return result0;
 
       }
 
       }
 
        
 
        
 
       function parse_Declaration() {
 
       function parse_Declaration() {
 +
        var cacheKey = "Declaration@" + pos.offset;
 +
        var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 +
       
 
         var result0;
 
         var result0;
 
          
 
          
Zeile 172: Zeile 230:
 
           }
 
           }
 
         }
 
         }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 
         return result0;
 
         return result0;
 
       }
 
       }
 
        
 
        
 
       function parse_EventDec() {
 
       function parse_EventDec() {
 +
        var cacheKey = "EventDec@" + pos.offset;
 +
        var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 +
       
 
         var result0, result1, result2, result3, result4, result5, result6, result7, result8;
 
         var result0, result1, result2, result3, result4, result5, result6, result7, result8;
 
         var pos0, pos1, pos2;
 
         var pos0, pos1, pos2;
 
          
 
          
         pos0 = pos;
+
         pos0 = clone(pos);
         pos1 = pos;
+
         pos1 = clone(pos);
 
         result0 = parse_S();
 
         result0 = parse_S();
 
         result0 = result0 !== null ? result0 : "";
 
         result0 = result0 !== null ? result0 : "";
 
         if (result0 !== null) {
 
         if (result0 !== null) {
           if (input.substr(pos, 5) === "event") {
+
           if (input.substr(pos.offset, 5) === "event") {
 
             result1 = "event";
 
             result1 = "event";
             pos += 5;
+
             advance(pos, 5);
 
           } else {
 
           } else {
 
             result1 = null;
 
             result1 = null;
Zeile 194: Zeile 264:
 
           }
 
           }
 
           if (result1 !== null) {
 
           if (result1 !== null) {
             pos2 = pos;
+
             pos2 = clone(pos);
 
             result2 = parse_S();
 
             result2 = parse_S();
 
             if (result2 !== null) {
 
             if (result2 !== null) {
Zeile 202: Zeile 272:
 
               } else {
 
               } else {
 
                 result2 = null;
 
                 result2 = null;
                 pos = pos2;
+
                 pos = clone(pos2);
 
               }
 
               }
 
             } else {
 
             } else {
 
               result2 = null;
 
               result2 = null;
               pos = pos2;
+
               pos = clone(pos2);
 
             }
 
             }
 
             result2 = result2 !== null ? result2 : "";
 
             result2 = result2 !== null ? result2 : "";
Zeile 228: Zeile 298:
 
                         } else {
 
                         } else {
 
                           result0 = null;
 
                           result0 = null;
                           pos = pos1;
+
                           pos = clone(pos1);
 
                         }
 
                         }
 
                       } else {
 
                       } else {
 
                         result0 = null;
 
                         result0 = null;
                         pos = pos1;
+
                         pos = clone(pos1);
 
                       }
 
                       }
 
                     } else {
 
                     } else {
 
                       result0 = null;
 
                       result0 = null;
                       pos = pos1;
+
                       pos = clone(pos1);
 
                     }
 
                     }
 
                   } else {
 
                   } else {
 
                     result0 = null;
 
                     result0 = null;
                     pos = pos1;
+
                     pos = clone(pos1);
 
                   }
 
                   }
 
                 } else {
 
                 } else {
 
                   result0 = null;
 
                   result0 = null;
                   pos = pos1;
+
                   pos = clone(pos1);
 
                 }
 
                 }
 
               } else {
 
               } else {
 
                 result0 = null;
 
                 result0 = null;
                 pos = pos1;
+
                 pos = clone(pos1);
 
               }
 
               }
 
             } else {
 
             } else {
 
               result0 = null;
 
               result0 = null;
               pos = pos1;
+
               pos = clone(pos1);
 
             }
 
             }
 
           } else {
 
           } else {
 
             result0 = null;
 
             result0 = null;
             pos = pos1;
+
             pos = clone(pos1);
 
           }
 
           }
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
           pos = pos1;
+
           pos = clone(pos1);
 
         }
 
         }
 
         if (result0 !== null) {
 
         if (result0 !== null) {
           result0 = (function(offset, n, tr, co, ac) { return ["event", {name:n?n[1]:":anonymous:", trigger:tr, condition:(co?co:function(){return true;}), action:(ac?ac:function(){return true;})}]; })(pos0, result0[2], result0[4], result0[5], result0[6]);
+
           result0 = (function(offset, line, column, n, tr, co, ac) { return ["event", {name:n?n[1]:":anonymous:", trigger:tr, condition:(co?co:function(){return true;}), action:(ac?ac:function(){return true;})}]; })(pos0.offset, pos0.line, pos0.column, result0[2], result0[4], result0[5], result0[6]);
 
         }
 
         }
 
         if (result0 === null) {
 
         if (result0 === null) {
           pos = pos0;
+
           pos = clone(pos0);
 
         }
 
         }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 
         return result0;
 
         return result0;
 
       }
 
       }
 
        
 
        
 
       function parse_TriggerClause() {
 
       function parse_TriggerClause() {
 +
        var cacheKey = "TriggerClause@" + pos.offset;
 +
        var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 +
       
 
         var result0, result1, result2, result3, result4;
 
         var result0, result1, result2, result3, result4;
 
         var pos0, pos1;
 
         var pos0, pos1;
 
          
 
          
         pos0 = pos;
+
         pos0 = clone(pos);
         pos1 = pos;
+
         pos1 = clone(pos);
         if (input.substr(pos, 2) === "on") {
+
         if (input.substr(pos.offset, 2) === "on") {
 
           result0 = "on";
 
           result0 = "on";
           pos += 2;
+
           advance(pos, 2);
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
Zeile 299: Zeile 381:
 
                 } else {
 
                 } else {
 
                   result0 = null;
 
                   result0 = null;
                   pos = pos1;
+
                   pos = clone(pos1);
 
                 }
 
                 }
 
               } else {
 
               } else {
 
                 result0 = null;
 
                 result0 = null;
                 pos = pos1;
+
                 pos = clone(pos1);
 
               }
 
               }
 
             } else {
 
             } else {
 
               result0 = null;
 
               result0 = null;
               pos = pos1;
+
               pos = clone(pos1);
 
             }
 
             }
 
           } else {
 
           } else {
 
             result0 = null;
 
             result0 = null;
             pos = pos1;
+
             pos = clone(pos1);
 
           }
 
           }
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
           pos = pos1;
+
           pos = clone(pos1);
 
         }
 
         }
 
         if (result0 !== null) {
 
         if (result0 !== null) {
           result0 = (function(offset, tr) {return tr;})(pos0, result0[3]);
+
           result0 = (function(offset, line, column, tr) {return tr;})(pos0.offset, pos0.line, pos0.column, result0[3]);
 
         }
 
         }
 
         if (result0 === null) {
 
         if (result0 === null) {
           pos = pos0;
+
           pos = clone(pos0);
 
         }
 
         }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 
         return result0;
 
         return result0;
 
       }
 
       }
 
        
 
        
 
       function parse_TriggerFunctions() {
 
       function parse_TriggerFunctions() {
 +
        var cacheKey = "TriggerFunctions@" + pos.offset;
 +
        var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 +
       
 
         var result0, result1, result2;
 
         var result0, result1, result2;
 
         var pos0, pos1;
 
         var pos0, pos1;
 
          
 
          
         pos0 = pos;
+
         pos0 = clone(pos);
         pos1 = pos;
+
         pos1 = clone(pos);
 
         result0 = parse_TriggerFunction();
 
         result0 = parse_TriggerFunction();
 
         if (result0 !== null) {
 
         if (result0 !== null) {
Zeile 341: Zeile 435:
 
             } else {
 
             } else {
 
               result0 = null;
 
               result0 = null;
               pos = pos1;
+
               pos = clone(pos1);
 
             }
 
             }
 
           } else {
 
           } else {
 
             result0 = null;
 
             result0 = null;
             pos = pos1;
+
             pos = clone(pos1);
 
           }
 
           }
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
           pos = pos1;
+
           pos = clone(pos1);
 
         }
 
         }
 
         if (result0 !== null) {
 
         if (result0 !== null) {
           result0 = (function(offset, t, o) {o.push(t); return o;})(pos0, result0[0], result0[2]);
+
           result0 = (function(offset, line, column, t, o) {o.push(t); return o;})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
 
         }
 
         }
 
         if (result0 === null) {
 
         if (result0 === null) {
           pos = pos0;
+
           pos = clone(pos0);
 
         }
 
         }
 
         if (result0 === null) {
 
         if (result0 === null) {
           pos0 = pos;
+
           pos0 = clone(pos);
 
           result0 = parse_TriggerFunction();
 
           result0 = parse_TriggerFunction();
 
           if (result0 !== null) {
 
           if (result0 !== null) {
             result0 = (function(offset, t) {return [t];})(pos0, result0);
+
             result0 = (function(offset, line, column, t) {return [t];})(pos0.offset, pos0.line, pos0.column, result0);
 
           }
 
           }
 
           if (result0 === null) {
 
           if (result0 === null) {
             pos = pos0;
+
             pos = clone(pos0);
 
           }
 
           }
 
         }
 
         }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 
         return result0;
 
         return result0;
 
       }
 
       }
 
        
 
        
 
       function parse_TriggerFunction() {
 
       function parse_TriggerFunction() {
 +
        var cacheKey = "TriggerFunction@" + pos.offset;
 +
        var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 +
       
 
         var result0, result1, result2, result3, result4, result5;
 
         var result0, result1, result2, result3, result4, result5;
 
         var pos0, pos1;
 
         var pos0, pos1;
 
          
 
          
         pos0 = pos;
+
         pos0 = clone(pos);
         pos1 = pos;
+
         pos1 = clone(pos);
 
         result0 = parse_TriggerPageOrVirtOp();
 
         result0 = parse_TriggerPageOrVirtOp();
 
         if (result0 !== null) {
 
         if (result0 !== null) {
Zeile 390: Zeile 496:
 
               } else {
 
               } else {
 
                 result0 = null;
 
                 result0 = null;
                 pos = pos1;
+
                 pos = clone(pos1);
 
               }
 
               }
 
             } else {
 
             } else {
 
               result0 = null;
 
               result0 = null;
               pos = pos1;
+
               pos = clone(pos1);
 
             }
 
             }
 
           } else {
 
           } else {
 
             result0 = null;
 
             result0 = null;
             pos = pos1;
+
             pos = clone(pos1);
 
           }
 
           }
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
           pos = pos1;
+
           pos = clone(pos1);
 
         }
 
         }
 
         if (result0 !== null) {
 
         if (result0 !== null) {
           result0 = (function(offset, t, a) {return t+"."+a;})(pos0, result0[0], result0[2]);
+
           result0 = (function(offset, line, column, t, a) {return t+"."+a;})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
 
         }
 
         }
 
         if (result0 === null) {
 
         if (result0 === null) {
           pos = pos0;
+
           pos = clone(pos0);
 
         }
 
         }
 
         if (result0 === null) {
 
         if (result0 === null) {
           pos0 = pos;
+
           pos0 = clone(pos);
           pos1 = pos;
+
           pos1 = clone(pos);
 
           result0 = parse_TriggerItemOrVirtOp();
 
           result0 = parse_TriggerItemOrVirtOp();
 
           if (result0 !== null) {
 
           if (result0 !== null) {
Zeile 427: Zeile 533:
 
                 } else {
 
                 } else {
 
                   result0 = null;
 
                   result0 = null;
                   pos = pos1;
+
                   pos = clone(pos1);
 
                 }
 
                 }
 
               } else {
 
               } else {
 
                 result0 = null;
 
                 result0 = null;
                 pos = pos1;
+
                 pos = clone(pos1);
 
               }
 
               }
 
             } else {
 
             } else {
 
               result0 = null;
 
               result0 = null;
               pos = pos1;
+
               pos = clone(pos1);
 
             }
 
             }
 
           } else {
 
           } else {
 
             result0 = null;
 
             result0 = null;
             pos = pos1;
+
             pos = clone(pos1);
 
           }
 
           }
 
           if (result0 !== null) {
 
           if (result0 !== null) {
             result0 = (function(offset, t, a) {return t+"."+a;})(pos0, result0[0], result0[2]);
+
             result0 = (function(offset, line, column, t, a) {return t+"."+a;})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
 
           }
 
           }
 
           if (result0 === null) {
 
           if (result0 === null) {
             pos = pos0;
+
             pos = clone(pos0);
 
           }
 
           }
 
           if (result0 === null) {
 
           if (result0 === null) {
             pos0 = pos;
+
             pos0 = clone(pos);
             pos1 = pos;
+
             pos1 = clone(pos);
             if (input.substr(pos, 5) === "click") {
+
             if (input.substr(pos.offset, 5) === "click") {
 
               result0 = "click";
 
               result0 = "click";
               pos += 5;
+
               advance(pos, 5);
 
             } else {
 
             } else {
 
               result0 = null;
 
               result0 = null;
Zeile 469: Zeile 575:
 
                   } else {
 
                   } else {
 
                     result0 = null;
 
                     result0 = null;
                     pos = pos1;
+
                     pos = clone(pos1);
 
                   }
 
                   }
 
                 } else {
 
                 } else {
 
                   result0 = null;
 
                   result0 = null;
                   pos = pos1;
+
                   pos = clone(pos1);
 
                 }
 
                 }
 
               } else {
 
               } else {
 
                 result0 = null;
 
                 result0 = null;
                 pos = pos1;
+
                 pos = clone(pos1);
 
               }
 
               }
 
             } else {
 
             } else {
 
               result0 = null;
 
               result0 = null;
               pos = pos1;
+
               pos = clone(pos1);
 
             }
 
             }
 
             if (result0 !== null) {
 
             if (result0 !== null) {
               result0 = (function(offset, t, a) {return t+"."+a;})(pos0, result0[0], result0[2]);
+
               result0 = (function(offset, line, column, t, a) {return t+"."+a;})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
 
             }
 
             }
 
             if (result0 === null) {
 
             if (result0 === null) {
               pos = pos0;
+
               pos = clone(pos0);
 
             }
 
             }
 
             if (result0 === null) {
 
             if (result0 === null) {
               pos0 = pos;
+
               pos0 = clone(pos);
               pos1 = pos;
+
               pos1 = clone(pos);
               if (input.substr(pos, 7) === "combine") {
+
               if (input.substr(pos.offset, 7) === "combine") {
 
                 result0 = "combine";
 
                 result0 = "combine";
                 pos += 7;
+
                 advance(pos, 7);
 
               } else {
 
               } else {
 
                 result0 = null;
 
                 result0 = null;
Zeile 521: Zeile 627:
 
                         } else {
 
                         } else {
 
                           result0 = null;
 
                           result0 = null;
                           pos = pos1;
+
                           pos = clone(pos1);
 
                         }
 
                         }
 
                       } else {
 
                       } else {
 
                         result0 = null;
 
                         result0 = null;
                         pos = pos1;
+
                         pos = clone(pos1);
 
                       }
 
                       }
 
                     } else {
 
                     } else {
 
                       result0 = null;
 
                       result0 = null;
                       pos = pos1;
+
                       pos = clone(pos1);
 
                     }
 
                     }
 
                   } else {
 
                   } else {
 
                     result0 = null;
 
                     result0 = null;
                     pos = pos1;
+
                     pos = clone(pos1);
 
                   }
 
                   }
 
                 } else {
 
                 } else {
 
                   result0 = null;
 
                   result0 = null;
                   pos = pos1;
+
                   pos = clone(pos1);
 
                 }
 
                 }
 
               } else {
 
               } else {
 
                 result0 = null;
 
                 result0 = null;
                 pos = pos1;
+
                 pos = clone(pos1);
 
               }
 
               }
 
               if (result0 !== null) {
 
               if (result0 !== null) {
                 result0 = (function(offset, t, a, b) {return [t,a,b].join(".")})(pos0, result0[0], result0[2], result0[4]);
+
                 result0 = (function(offset, line, column, t, a, b) {return [t,a,b].join(".")})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2], result0[4]);
 
               }
 
               }
 
               if (result0 === null) {
 
               if (result0 === null) {
                 pos = pos0;
+
                 pos = clone(pos0);
 
               }
 
               }
 
               if (result0 === null) {
 
               if (result0 === null) {
                 pos0 = pos;
+
                 pos0 = clone(pos);
                 pos1 = pos;
+
                 pos1 = clone(pos);
                 if (input.substr(pos, 5) === "apply") {
+
                 if (input.substr(pos.offset, 5) === "apply") {
 
                   result0 = "apply";
 
                   result0 = "apply";
                   pos += 5;
+
                   advance(pos, 5);
 
                 } else {
 
                 } else {
 
                   result0 = null;
 
                   result0 = null;
Zeile 578: Zeile 684:
 
                           } else {
 
                           } else {
 
                             result0 = null;
 
                             result0 = null;
                             pos = pos1;
+
                             pos = clone(pos1);
 
                           }
 
                           }
 
                         } else {
 
                         } else {
 
                           result0 = null;
 
                           result0 = null;
                           pos = pos1;
+
                           pos = clone(pos1);
 
                         }
 
                         }
 
                       } else {
 
                       } else {
 
                         result0 = null;
 
                         result0 = null;
                         pos = pos1;
+
                         pos = clone(pos1);
 
                       }
 
                       }
 
                     } else {
 
                     } else {
 
                       result0 = null;
 
                       result0 = null;
                       pos = pos1;
+
                       pos = clone(pos1);
 
                     }
 
                     }
 
                   } else {
 
                   } else {
 
                     result0 = null;
 
                     result0 = null;
                     pos = pos1;
+
                     pos = clone(pos1);
 
                   }
 
                   }
 
                 } else {
 
                 } else {
 
                   result0 = null;
 
                   result0 = null;
                   pos = pos1;
+
                   pos = clone(pos1);
 
                 }
 
                 }
 
                 if (result0 !== null) {
 
                 if (result0 !== null) {
                   result0 = (function(offset, t, a, b) {return [t,a,b].join(".")})(pos0, result0[0], result0[2], result0[4]);
+
                   result0 = (function(offset, line, column, t, a, b) {return [t,a,b].join(".")})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2], result0[4]);
 
                 }
 
                 }
 
                 if (result0 === null) {
 
                 if (result0 === null) {
                   pos = pos0;
+
                   pos = clone(pos0);
 
                 }
 
                 }
 
               }
 
               }
Zeile 610: Zeile 716:
 
           }
 
           }
 
         }
 
         }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 
         return result0;
 
         return result0;
 
       }
 
       }
 
        
 
        
 
       function parse_TriggerPageOrVirtOp() {
 
       function parse_TriggerPageOrVirtOp() {
 +
        var cacheKey = "TriggerPageOrVirtOp@" + pos.offset;
 +
        var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 +
       
 
         var result0;
 
         var result0;
 
          
 
          
         if (input.substr(pos, 5) === "enter") {
+
         if (input.substr(pos.offset, 5) === "enter") {
 
           result0 = "enter";
 
           result0 = "enter";
           pos += 5;
+
           advance(pos, 5);
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
Zeile 626: Zeile 744:
 
         }
 
         }
 
         if (result0 === null) {
 
         if (result0 === null) {
           if (input.substr(pos, 5) === "leave") {
+
           if (input.substr(pos.offset, 5) === "leave") {
 
             result0 = "leave";
 
             result0 = "leave";
             pos += 5;
+
             advance(pos, 5);
 
           } else {
 
           } else {
 
             result0 = null;
 
             result0 = null;
Zeile 636: Zeile 754:
 
           }
 
           }
 
         }
 
         }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 
         return result0;
 
         return result0;
 
       }
 
       }
 
        
 
        
 
       function parse_TriggerItemOrVirtOp() {
 
       function parse_TriggerItemOrVirtOp() {
 +
        var cacheKey = "TriggerItemOrVirtOp@" + pos.offset;
 +
        var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 +
       
 
         var result0;
 
         var result0;
 
          
 
          
         if (input.substr(pos, 3) === "add") {
+
         if (input.substr(pos.offset, 3) === "add") {
 
           result0 = "add";
 
           result0 = "add";
           pos += 3;
+
           advance(pos, 3);
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
Zeile 652: Zeile 782:
 
         }
 
         }
 
         if (result0 === null) {
 
         if (result0 === null) {
           if (input.substr(pos, 6) === "remove") {
+
           if (input.substr(pos.offset, 6) === "remove") {
 
             result0 = "remove";
 
             result0 = "remove";
             pos += 6;
+
             advance(pos, 6);
 
           } else {
 
           } else {
 
             result0 = null;
 
             result0 = null;
Zeile 662: Zeile 792:
 
           }
 
           }
 
           if (result0 === null) {
 
           if (result0 === null) {
             if (input.substr(pos, 8) === "activate") {
+
             if (input.substr(pos.offset, 8) === "activate") {
 
               result0 = "activate";
 
               result0 = "activate";
               pos += 8;
+
               advance(pos, 8);
 
             } else {
 
             } else {
 
               result0 = null;
 
               result0 = null;
Zeile 673: Zeile 803:
 
           }
 
           }
 
         }
 
         }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 
         return result0;
 
         return result0;
 
       }
 
       }
 
        
 
        
 
       function parse_ConditionClause() {
 
       function parse_ConditionClause() {
 +
        var cacheKey = "ConditionClause@" + pos.offset;
 +
        var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 +
       
 
         var result0, result1, result2, result3;
 
         var result0, result1, result2, result3;
 
         var pos0, pos1;
 
         var pos0, pos1;
 
          
 
          
         pos0 = pos;
+
         pos0 = clone(pos);
         pos1 = pos;
+
         pos1 = clone(pos);
         if (input.substr(pos, 2) === "if") {
+
         if (input.substr(pos.offset, 2) === "if") {
 
           result0 = "if";
 
           result0 = "if";
           pos += 2;
+
           advance(pos, 2);
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
Zeile 701: Zeile 843:
 
               } else {
 
               } else {
 
                 result0 = null;
 
                 result0 = null;
                 pos = pos1;
+
                 pos = clone(pos1);
 
               }
 
               }
 
             } else {
 
             } else {
 
               result0 = null;
 
               result0 = null;
               pos = pos1;
+
               pos = clone(pos1);
 
             }
 
             }
 
           } else {
 
           } else {
 
             result0 = null;
 
             result0 = null;
             pos = pos1;
+
             pos = clone(pos1);
 
           }
 
           }
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
           pos = pos1;
+
           pos = clone(pos1);
 
         }
 
         }
 
         if (result0 !== null) {
 
         if (result0 !== null) {
           result0 = (function(offset, co) {return co;})(pos0, result0[2]);
+
           result0 = (function(offset, line, column, co) {return co;})(pos0.offset, pos0.line, pos0.column, result0[2]);
 
         }
 
         }
 
         if (result0 === null) {
 
         if (result0 === null) {
           pos = pos0;
+
           pos = clone(pos0);
 
         }
 
         }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 
         return result0;
 
         return result0;
 
       }
 
       }
 
        
 
        
 
       function parse_ConditionFunction() {
 
       function parse_ConditionFunction() {
 +
        var cacheKey = "ConditionFunction@" + pos.offset;
 +
        var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 +
       
 
         var result0, result1, result2, result3;
 
         var result0, result1, result2, result3;
 
         var pos0, pos1;
 
         var pos0, pos1;
 
          
 
          
         pos0 = pos;
+
         pos0 = clone(pos);
         pos1 = pos;
+
         pos1 = clone(pos);
         if (input.substr(pos, 4) === "page") {
+
         if (input.substr(pos.offset, 4) === "page") {
 
           result0 = "page";
 
           result0 = "page";
           pos += 4;
+
           advance(pos, 4);
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
Zeile 749: Zeile 903:
 
               } else {
 
               } else {
 
                 result0 = null;
 
                 result0 = null;
                 pos = pos1;
+
                 pos = clone(pos1);
 
               }
 
               }
 
             } else {
 
             } else {
 
               result0 = null;
 
               result0 = null;
               pos = pos1;
+
               pos = clone(pos1);
 
             }
 
             }
 
           } else {
 
           } else {
 
             result0 = null;
 
             result0 = null;
             pos = pos1;
+
             pos = clone(pos1);
 
           }
 
           }
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
           pos = pos1;
+
           pos = clone(pos1);
 
         }
 
         }
 
         if (result0 !== null) {
 
         if (result0 !== null) {
           result0 = (function(offset, p) {return function(){return a2.cpage == p};})(pos0, result0[2]);
+
           result0 = (function(offset, line, column, p) {return function(){return a2.cpage == p};})(pos0.offset, pos0.line, pos0.column, result0[2]);
 
         }
 
         }
 
         if (result0 === null) {
 
         if (result0 === null) {
           pos = pos0;
+
           pos = clone(pos0);
 
         }
 
         }
 
         if (result0 === null) {
 
         if (result0 === null) {
           pos0 = pos;
+
           pos0 = clone(pos);
           pos1 = pos;
+
           pos1 = clone(pos);
           if (input.substr(pos, 3) === "any") {
+
           if (input.substr(pos.offset, 3) === "any") {
 
             result0 = "any";
 
             result0 = "any";
             pos += 3;
+
             advance(pos, 3);
 
           } else {
 
           } else {
 
             result0 = null;
 
             result0 = null;
Zeile 791: Zeile 945:
 
                 } else {
 
                 } else {
 
                   result0 = null;
 
                   result0 = null;
                   pos = pos1;
+
                   pos = clone(pos1);
 
                 }
 
                 }
 
               } else {
 
               } else {
 
                 result0 = null;
 
                 result0 = null;
                 pos = pos1;
+
                 pos = clone(pos1);
 
               }
 
               }
 
             } else {
 
             } else {
 
               result0 = null;
 
               result0 = null;
               pos = pos1;
+
               pos = clone(pos1);
 
             }
 
             }
 
           } else {
 
           } else {
 
             result0 = null;
 
             result0 = null;
             pos = pos1;
+
             pos = clone(pos1);
 
           }
 
           }
 
           if (result0 !== null) {
 
           if (result0 !== null) {
             result0 = (function(offset, a) {return function(){for(var j=0; j<a.length; j++) if (a[j]()) return true; return false; }})(pos0, result0[2]);
+
             result0 = (function(offset, line, column, a) {return function(){for(var j=0; j<a.length; j++) if (a[j]()) return true; return false; }})(pos0.offset, pos0.line, pos0.column, result0[2]);
 
           }
 
           }
 
           if (result0 === null) {
 
           if (result0 === null) {
             pos = pos0;
+
             pos = clone(pos0);
 
           }
 
           }
 
           if (result0 === null) {
 
           if (result0 === null) {
             pos0 = pos;
+
             pos0 = clone(pos);
             pos1 = pos;
+
             pos1 = clone(pos);
             if (input.substr(pos, 3) === "all") {
+
             if (input.substr(pos.offset, 3) === "all") {
 
               result0 = "all";
 
               result0 = "all";
               pos += 3;
+
               advance(pos, 3);
 
             } else {
 
             } else {
 
               result0 = null;
 
               result0 = null;
Zeile 833: Zeile 987:
 
                   } else {
 
                   } else {
 
                     result0 = null;
 
                     result0 = null;
                     pos = pos1;
+
                     pos = clone(pos1);
 
                   }
 
                   }
 
                 } else {
 
                 } else {
 
                   result0 = null;
 
                   result0 = null;
                   pos = pos1;
+
                   pos = clone(pos1);
 
                 }
 
                 }
 
               } else {
 
               } else {
 
                 result0 = null;
 
                 result0 = null;
                 pos = pos1;
+
                 pos = clone(pos1);
 
               }
 
               }
 
             } else {
 
             } else {
 
               result0 = null;
 
               result0 = null;
               pos = pos1;
+
               pos = clone(pos1);
 
             }
 
             }
 
             if (result0 !== null) {
 
             if (result0 !== null) {
               result0 = (function(offset, a) {return function(){for(var j=0; j<a.length; j++) if (!a[j]()) return false; return true; }})(pos0, result0[2]);
+
               result0 = (function(offset, line, column, a) {return function(){for(var j=0; j<a.length; j++) if (!a[j]()) return false; return true; }})(pos0.offset, pos0.line, pos0.column, result0[2]);
 
             }
 
             }
 
             if (result0 === null) {
 
             if (result0 === null) {
               pos = pos0;
+
               pos = clone(pos0);
 
             }
 
             }
 
             if (result0 === null) {
 
             if (result0 === null) {
               pos0 = pos;
+
               pos0 = clone(pos);
               pos1 = pos;
+
               pos1 = clone(pos);
               if (input.substr(pos, 3) === "not") {
+
               if (input.substr(pos.offset, 3) === "not") {
 
                 result0 = "not";
 
                 result0 = "not";
                 pos += 3;
+
                 advance(pos, 3);
 
               } else {
 
               } else {
 
                 result0 = null;
 
                 result0 = null;
Zeile 875: Zeile 1.029:
 
                     } else {
 
                     } else {
 
                       result0 = null;
 
                       result0 = null;
                       pos = pos1;
+
                       pos = clone(pos1);
 
                     }
 
                     }
 
                   } else {
 
                   } else {
 
                     result0 = null;
 
                     result0 = null;
                     pos = pos1;
+
                     pos = clone(pos1);
 
                   }
 
                   }
 
                 } else {
 
                 } else {
 
                   result0 = null;
 
                   result0 = null;
                   pos = pos1;
+
                   pos = clone(pos1);
 
                 }
 
                 }
 
               } else {
 
               } else {
 
                 result0 = null;
 
                 result0 = null;
                 pos = pos1;
+
                 pos = clone(pos1);
 
               }
 
               }
 
               if (result0 !== null) {
 
               if (result0 !== null) {
                 result0 = (function(offset, f) {return function(){ return !f()};})(pos0, result0[2]);
+
                 result0 = (function(offset, line, column, f) {return function(){ return !f()};})(pos0.offset, pos0.line, pos0.column, result0[2]);
 
               }
 
               }
 
               if (result0 === null) {
 
               if (result0 === null) {
                 pos = pos0;
+
                 pos = clone(pos0);
 
               }
 
               }
 
               if (result0 === null) {
 
               if (result0 === null) {
                 pos0 = pos;
+
                 pos0 = clone(pos);
                 pos1 = pos;
+
                 pos1 = clone(pos);
                 if (input.substr(pos, 4) === "have") {
+
                 if (input.substr(pos.offset, 4) === "have") {
 
                   result0 = "have";
 
                   result0 = "have";
                   pos += 4;
+
                   advance(pos, 4);
 
                 } else {
 
                 } else {
 
                   result0 = null;
 
                   result0 = null;
Zeile 917: Zeile 1.071:
 
                       } else {
 
                       } else {
 
                         result0 = null;
 
                         result0 = null;
                         pos = pos1;
+
                         pos = clone(pos1);
 
                       }
 
                       }
 
                     } else {
 
                     } else {
 
                       result0 = null;
 
                       result0 = null;
                       pos = pos1;
+
                       pos = clone(pos1);
 
                     }
 
                     }
 
                   } else {
 
                   } else {
 
                     result0 = null;
 
                     result0 = null;
                     pos = pos1;
+
                     pos = clone(pos1);
 
                   }
 
                   }
 
                 } else {
 
                 } else {
 
                   result0 = null;
 
                   result0 = null;
                   pos = pos1;
+
                   pos = clone(pos1);
 
                 }
 
                 }
 
                 if (result0 !== null) {
 
                 if (result0 !== null) {
                   result0 = (function(offset, i) {return function(){return !!a2.items[i]};})(pos0, result0[2]);
+
                   result0 = (function(offset, line, column, i) {return function(){return !!a2.items[i]};})(pos0.offset, pos0.line, pos0.column, result0[2]);
 
                 }
 
                 }
 
                 if (result0 === null) {
 
                 if (result0 === null) {
                   pos = pos0;
+
                   pos = clone(pos0);
 
                 }
 
                 }
 
                 if (result0 === null) {
 
                 if (result0 === null) {
                   pos0 = pos;
+
                   pos0 = clone(pos);
                   pos1 = pos;
+
                   pos1 = clone(pos);
                   if (input.substr(pos, 4) === "page") {
+
                   if (input.substr(pos.offset, 4) === "page") {
 
                     result0 = "page";
 
                     result0 = "page";
                     pos += 4;
+
                     advance(pos, 4);
 
                   } else {
 
                   } else {
 
                     result0 = null;
 
                     result0 = null;
Zeile 959: Zeile 1.113:
 
                         } else {
 
                         } else {
 
                           result0 = null;
 
                           result0 = null;
                           pos = pos1;
+
                           pos = clone(pos1);
 
                         }
 
                         }
 
                       } else {
 
                       } else {
 
                         result0 = null;
 
                         result0 = null;
                         pos = pos1;
+
                         pos = clone(pos1);
 
                       }
 
                       }
 
                     } else {
 
                     } else {
 
                       result0 = null;
 
                       result0 = null;
                       pos = pos1;
+
                       pos = clone(pos1);
 
                     }
 
                     }
 
                   } else {
 
                   } else {
 
                     result0 = null;
 
                     result0 = null;
                     pos = pos1;
+
                     pos = clone(pos1);
 
                   }
 
                   }
 
                   if (result0 !== null) {
 
                   if (result0 !== null) {
                     result0 = (function(offset, v) {return function(){return !!a2.hasVirtual(v);};})(pos0, result0[2]);
+
                     result0 = (function(offset, line, column, v) {return function(){return !!a2.util.hasVirtual(v);};})(pos0.offset, pos0.line, pos0.column, result0[2]);
 
                   }
 
                   }
 
                   if (result0 === null) {
 
                   if (result0 === null) {
                     pos = pos0;
+
                     pos = clone(pos0);
 
                   }
 
                   }
 
                   if (result0 === null) {
 
                   if (result0 === null) {
                     pos0 = pos;
+
                     pos0 = clone(pos);
                     pos1 = pos;
+
                     pos1 = clone(pos);
                     if (input.substr(pos, 4) === "have") {
+
                     if (input.substr(pos.offset, 4) === "have") {
 
                       result0 = "have";
 
                       result0 = "have";
                       pos += 4;
+
                       advance(pos, 4);
 
                     } else {
 
                     } else {
 
                       result0 = null;
 
                       result0 = null;
Zeile 1.001: Zeile 1.155:
 
                           } else {
 
                           } else {
 
                             result0 = null;
 
                             result0 = null;
                             pos = pos1;
+
                             pos = clone(pos1);
 
                           }
 
                           }
 
                         } else {
 
                         } else {
 
                           result0 = null;
 
                           result0 = null;
                           pos = pos1;
+
                           pos = clone(pos1);
 
                         }
 
                         }
 
                       } else {
 
                       } else {
 
                         result0 = null;
 
                         result0 = null;
                         pos = pos1;
+
                         pos = clone(pos1);
 
                       }
 
                       }
 
                     } else {
 
                     } else {
 
                       result0 = null;
 
                       result0 = null;
                       pos = pos1;
+
                       pos = clone(pos1);
 
                     }
 
                     }
 
                     if (result0 !== null) {
 
                     if (result0 !== null) {
                       result0 = (function(offset, v) {return function(){return !!a2.hasVirtual(v);};})(pos0, result0[2]);
+
                       result0 = (function(offset, line, column, v) {return function(){return !!a2.util.hasVirtual(v);};})(pos0.offset, pos0.line, pos0.column, result0[2]);
 
                     }
 
                     }
 
                     if (result0 === null) {
 
                     if (result0 === null) {
                       pos = pos0;
+
                       pos = clone(pos0);
 
                     }
 
                     }
                  }
+
                    if (result0 === null) {
                }
+
                      pos0 = clone(pos);
              }
+
                      pos1 = clone(pos);
            }
+
                      if (input.substr(pos.offset, 7) === "visible") {
          }
+
                        result0 = "visible";
        }
+
                        advance(pos, 7);
        return result0;
+
                      } else {
      }
+
                        result0 = null;
     
+
                        if (reportFailures === 0) {
      function parse_ConditionArgs() {
+
                          matchFailed("\"visible\"");
        var result0, result1, result2;
+
                        }
        var pos0, pos1;
+
                      }
       
+
                      if (result0 !== null) {
        pos0 = pos;
+
                        result1 = parse_L();
        pos1 = pos;
+
                        if (result1 !== null) {
        result0 = parse_ConditionFunction();
+
                          result2 = parse_Overlay();
        if (result0 !== null) {
+
                          if (result2 !== null) {
          result1 = parse_C();
+
                            result3 = parse_R();
          if (result1 !== null) {
+
                            if (result3 !== null) {
            result2 = parse_ConditionArgs();
+
                              result0 = [result0, result1, result2, result3];
            if (result2 !== null) {
+
                            } else {
              result0 = [result0, result1, result2];
+
                              result0 = null;
            } else {
+
                              pos = clone(pos1);
              result0 = null;
+
                            }
              pos = pos1;
+
                          } else {
            }
+
                            result0 = null;
          } else {
+
                            pos = clone(pos1);
            result0 = null;
+
                          }
            pos = pos1;
+
                        } else {
          }
+
                          result0 = null;
        } else {
+
                          pos = clone(pos1);
          result0 = null;
+
                        }
          pos = pos1;
+
                      } else {
        }
+
                        result0 = null;
        if (result0 !== null) {
+
                        pos = clone(pos1);
          result0 = (function(offset, f, a) {a.push(f); return a;})(pos0, result0[0], result0[2]);
+
                      }
        }
+
                      if (result0 !== null) {
        if (result0 === null) {
+
                        result0 = (function(offset, line, column, o) {return function(){return $("#overlay_"+o+":visible").length;};})(pos0.offset, pos0.line, pos0.column, result0[2]);
          pos = pos0;
+
                      }
        }
+
                      if (result0 === null) {
        if (result0 === null) {
+
                        pos = clone(pos0);
          pos0 = pos;
+
                      }
          result0 = parse_ConditionFunction();
+
                      if (result0 === null) {
          if (result0 !== null) {
+
                        pos0 = clone(pos);
            result0 = (function(offset, f) {return [f];})(pos0, result0);
+
                        pos1 = clone(pos);
          }
+
                        if (input.substr(pos.offset, 12) === "timeoutIsSet") {
          if (result0 === null) {
+
                          result0 = "timeoutIsSet";
            pos = pos0;
+
                          advance(pos, 12);
 +
                        } else {
 +
                          result0 = null;
 +
                          if (reportFailures === 0) {
 +
                            matchFailed("\"timeoutIsSet\"");
 +
                          }
 +
                        }
 +
                        if (result0 !== null) {
 +
                          result1 = parse_L();
 +
                          if (result1 !== null) {
 +
                            result2 = parse_R();
 +
                            if (result2 !== null) {
 +
                              result0 = [result0, result1, result2];
 +
                            } else {
 +
                              result0 = null;
 +
                              pos = clone(pos1);
 +
                            }
 +
                          } else {
 +
                            result0 = null;
 +
                            pos = clone(pos1);
 +
                          }
 +
                        } else {
 +
                          result0 = null;
 +
                          pos = clone(pos1);
 +
                        }
 +
                        if (result0 !== null) {
 +
                          result0 = (function(offset, line, column) {return function(){return a2.util.timeoutIsSet();};})(pos0.offset, pos0.line, pos0.column);
 +
                        }
 +
                        if (result0 === null) {
 +
                          pos = clone(pos0);
 +
                        }
 +
                      }
 +
                    }
 +
                  }
 +
                }
 +
              }
 +
            }
 
           }
 
           }
 
         }
 
         }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 
         return result0;
 
         return result0;
 
       }
 
       }
 
        
 
        
       function parse_ActionClause() {
+
       function parse_ConditionArgs() {
         var result0, result1, result2, result3;
+
        var cacheKey = "ConditionArgs@" + pos.offset;
 +
        var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 +
       
 +
         var result0, result1, result2;
 
         var pos0, pos1;
 
         var pos0, pos1;
 
          
 
          
         pos0 = pos;
+
         pos0 = clone(pos);
         pos1 = pos;
+
         pos1 = clone(pos);
        if (input.substr(pos, 2) === "do") {
+
         result0 = parse_ConditionFunction();
          result0 = "do";
 
          pos += 2;
 
         } else {
 
          result0 = null;
 
          if (reportFailures === 0) {
 
            matchFailed("\"do\"");
 
          }
 
        }
 
 
         if (result0 !== null) {
 
         if (result0 !== null) {
           result1 = parse_S();
+
           result1 = parse_C();
 
           if (result1 !== null) {
 
           if (result1 !== null) {
             result2 = parse_ActionFunctions();
+
             result2 = parse_ConditionArgs();
 
             if (result2 !== null) {
 
             if (result2 !== null) {
               result3 = parse_CC();
+
               result0 = [result0, result1, result2];
              if (result3 !== null) {
 
                result0 = [result0, result1, result2, result3];
 
              } else {
 
                result0 = null;
 
                pos = pos1;
 
              }
 
 
             } else {
 
             } else {
 
               result0 = null;
 
               result0 = null;
               pos = pos1;
+
               pos = clone(pos1);
 
             }
 
             }
 
           } else {
 
           } else {
 
             result0 = null;
 
             result0 = null;
             pos = pos1;
+
             pos = clone(pos1);
 
           }
 
           }
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
           pos = pos1;
+
           pos = clone(pos1);
 
         }
 
         }
 
         if (result0 !== null) {
 
         if (result0 !== null) {
           result0 = (function(offset, ac) {return ac;})(pos0, result0[2]);
+
           result0 = (function(offset, line, column, f, a) {a.push(f); return a;})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
 +
        }
 +
        if (result0 === null) {
 +
          pos = clone(pos0);
 
         }
 
         }
 
         if (result0 === null) {
 
         if (result0 === null) {
           pos = pos0;
+
           pos0 = clone(pos);
 +
          result0 = parse_ConditionFunction();
 +
          if (result0 !== null) {
 +
            result0 = (function(offset, line, column, f) {return [f];})(pos0.offset, pos0.line, pos0.column, result0);
 +
          }
 +
          if (result0 === null) {
 +
            pos = clone(pos0);
 +
          }
 
         }
 
         }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 
         return result0;
 
         return result0;
 
       }
 
       }
 
        
 
        
       function parse_ActionFunctions() {
+
       function parse_ActionClause() {
         var result0, result1, result2;
+
         var cacheKey = "ActionClause@" + pos.offset;
         var pos0, pos1;
+
         var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 
          
 
          
         pos0 = pos;
+
        var result0, result1, result2, result3;
         pos1 = pos;
+
        var pos0, pos1;
         result0 = parse_ActionFunction();
+
       
 +
         pos0 = clone(pos);
 +
         pos1 = clone(pos);
 +
        if (input.substr(pos.offset, 2) === "do") {
 +
          result0 = "do";
 +
          advance(pos, 2);
 +
         } else {
 +
          result0 = null;
 +
          if (reportFailures === 0) {
 +
            matchFailed("\"do\"");
 +
          }
 +
        }
 
         if (result0 !== null) {
 
         if (result0 !== null) {
           result1 = parse_C();
+
           result1 = parse_S();
 
           if (result1 !== null) {
 
           if (result1 !== null) {
 
             result2 = parse_ActionFunctions();
 
             result2 = parse_ActionFunctions();
 
             if (result2 !== null) {
 
             if (result2 !== null) {
               result0 = [result0, result1, result2];
+
               result3 = parse_CC();
 +
              if (result3 !== null) {
 +
                result0 = [result0, result1, result2, result3];
 +
              } else {
 +
                result0 = null;
 +
                pos = clone(pos1);
 +
              }
 
             } else {
 
             } else {
 
               result0 = null;
 
               result0 = null;
               pos = pos1;
+
               pos = clone(pos1);
 
             }
 
             }
 
           } else {
 
           } else {
 
             result0 = null;
 
             result0 = null;
             pos = pos1;
+
             pos = clone(pos1);
 
           }
 
           }
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
           pos = pos1;
+
           pos = clone(pos1);
 
         }
 
         }
 
         if (result0 !== null) {
 
         if (result0 !== null) {
           result0 = (function(offset, f, a) {return function(real){a(real); f(real);};})(pos0, result0[0], result0[2]);
+
           result0 = (function(offset, line, column, ac) {return ac;})(pos0.offset, pos0.line, pos0.column, result0[2]);
 
         }
 
         }
 
         if (result0 === null) {
 
         if (result0 === null) {
           pos = pos0;
+
           pos = clone(pos0);
        }
 
        if (result0 === null) {
 
          result0 = parse_ActionFunction();
 
 
         }
 
         }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 
         return result0;
 
         return result0;
 
       }
 
       }
 
        
 
        
       function parse_ActionFunction() {
+
       function parse_ActionFunctions() {
         var result0, result1, result2, result3, result4, result5, result6;
+
        var cacheKey = "ActionFunctions@" + pos.offset;
 +
        var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 +
       
 +
         var result0, result1, result2;
 
         var pos0, pos1;
 
         var pos0, pos1;
 
          
 
          
         pos0 = pos;
+
         pos0 = clone(pos);
         pos1 = pos;
+
         pos1 = clone(pos);
        if (input.substr(pos, 4) === "goto") {
+
         result0 = parse_ActionFunction();
          result0 = "goto";
 
          pos += 4;
 
         } else {
 
          result0 = null;
 
          if (reportFailures === 0) {
 
            matchFailed("\"goto\"");
 
          }
 
        }
 
 
         if (result0 !== null) {
 
         if (result0 !== null) {
           result1 = parse_L();
+
           result1 = parse_C();
 
           if (result1 !== null) {
 
           if (result1 !== null) {
             result2 = parse_Page();
+
             result2 = parse_ActionFunctions();
 
             if (result2 !== null) {
 
             if (result2 !== null) {
               result3 = parse_R();
+
               result0 = [result0, result1, result2];
              if (result3 !== null) {
 
                result0 = [result0, result1, result2, result3];
 
              } else {
 
                result0 = null;
 
                pos = pos1;
 
              }
 
 
             } else {
 
             } else {
 
               result0 = null;
 
               result0 = null;
               pos = pos1;
+
               pos = clone(pos1);
 
             }
 
             }
 
           } else {
 
           } else {
 
             result0 = null;
 
             result0 = null;
             pos = pos1;
+
             pos = clone(pos1);
 
           }
 
           }
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
           pos = pos1;
+
           pos = clone(pos1);
 
         }
 
         }
 
         if (result0 !== null) {
 
         if (result0 !== null) {
           result0 = (function(offset, f, p) {return function(real){a2.util.goto(p)};})(pos0, result0[0], result0[2]);
+
           result0 = (function(offset, line, column, f, a) {return function(real){f(real); a(real);};})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
 
         }
 
         }
 
         if (result0 === null) {
 
         if (result0 === null) {
           pos = pos0;
+
           pos = clone(pos0);
 
         }
 
         }
 
         if (result0 === null) {
 
         if (result0 === null) {
           pos0 = pos;
+
           result0 = parse_ActionFunction();
          pos1 = pos;
+
        }
          if (input.substr(pos, 3) === "add") {
+
       
            result0 = "add";
+
        cache[cacheKey] = {
            pos += 3;
+
          nextPos: clone(pos),
          } else {
+
          result:  result0
            result0 = null;
+
        };
            if (reportFailures === 0) {
+
        return result0;
              matchFailed("\"add\"");
+
      }
            }
+
     
          }
+
      function parse_ActionFunction() {
          if (result0 !== null) {
+
        var cacheKey = "ActionFunction@" + pos.offset;
            result1 = parse_L();
+
        var cachedResult = cache[cacheKey];
            if (result1 !== null) {
+
        if (cachedResult) {
              result2 = parse_Identifier();
+
          pos = clone(cachedResult.nextPos);
              if (result2 !== null) {
+
          return cachedResult.result;
                result3 = parse_R();
+
        }
                if (result3 !== null) {
+
       
                  result0 = [result0, result1, result2, result3];
+
        var result0, result1, result2, result3, result4, result5, result6;
                } else {
+
        var pos0, pos1;
                  result0 = null;
+
       
                  pos = pos1;
+
        pos0 = clone(pos);
                }
+
        pos1 = clone(pos);
 +
        if (input.substr(pos.offset, 4) === "goto") {
 +
          result0 = "goto";
 +
          advance(pos, 4);
 +
        } else {
 +
          result0 = null;
 +
          if (reportFailures === 0) {
 +
            matchFailed("\"goto\"");
 +
          }
 +
        }
 +
        if (result0 !== null) {
 +
          result1 = parse_L();
 +
          if (result1 !== null) {
 +
            result2 = parse_Page();
 +
            if (result2 !== null) {
 +
              result3 = parse_R();
 +
              if (result3 !== null) {
 +
                result0 = [result0, result1, result2, result3];
 
               } else {
 
               } else {
 
                 result0 = null;
 
                 result0 = null;
                 pos = pos1;
+
                 pos = clone(pos1);
 
               }
 
               }
 
             } else {
 
             } else {
 
               result0 = null;
 
               result0 = null;
               pos = pos1;
+
               pos = clone(pos1);
 
             }
 
             }
 
           } else {
 
           } else {
 
             result0 = null;
 
             result0 = null;
             pos = pos1;
+
             pos = clone(pos1);
 
           }
 
           }
           if (result0 !== null) {
+
        } else {
            result0 = (function(offset, f, i) {return function(real){a2.util.add(i)};})(pos0, result0[0], result0[2]);
+
           result0 = null;
 +
          pos = clone(pos1);
 +
        }
 +
        if (result0 !== null) {
 +
          result0 = (function(offset, line, column, f, p) {return function(real){a2.util.goto(p)};})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
 +
        }
 +
        if (result0 === null) {
 +
          pos = clone(pos0);
 +
        }
 +
        if (result0 === null) {
 +
          pos0 = clone(pos);
 +
          pos1 = clone(pos);
 +
          if (input.substr(pos.offset, 3) === "add") {
 +
            result0 = "add";
 +
            advance(pos, 3);
 +
          } else {
 +
            result0 = null;
 +
            if (reportFailures === 0) {
 +
              matchFailed("\"add\"");
 +
            }
 
           }
 
           }
           if (result0 === null) {
+
           if (result0 !== null) {
             pos = pos0;
+
            result1 = parse_L();
           }
+
            if (result1 !== null) {
           if (result0 === null) {
+
              result2 = parse_Identifier();
             pos0 = pos;
+
              if (result2 !== null) {
             pos1 = pos;
+
                result3 = parse_R();
             if (input.substr(pos, 6) === "remove") {
+
                if (result3 !== null) {
               result0 = "remove";
+
                  result0 = [result0, result1, result2, result3];
               pos += 6;
+
                } else {
 +
                  result0 = null;
 +
                  pos = clone(pos1);
 +
                }
 +
              } else {
 +
                result0 = null;
 +
                pos = clone(pos1);
 +
              }
 +
             } else {
 +
              result0 = null;
 +
              pos = clone(pos1);
 +
            }
 +
          } else {
 +
            result0 = null;
 +
            pos = clone(pos1);
 +
          }
 +
          if (result0 !== null) {
 +
            result0 = (function(offset, line, column, f, i) {return function(real){a2.util.add(i)};})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
 +
          }
 +
          if (result0 === null) {
 +
            pos = clone(pos0);
 +
           }
 +
           if (result0 === null) {
 +
             pos0 = clone(pos);
 +
             pos1 = clone(pos);
 +
             if (input.substr(pos.offset, 6) === "remove") {
 +
               result0 = "remove";
 +
               advance(pos, 6);
 
             } else {
 
             } else {
 
               result0 = null;
 
               result0 = null;
Zeile 1.268: Zeile 1.550:
 
                   } else {
 
                   } else {
 
                     result0 = null;
 
                     result0 = null;
                     pos = pos1;
+
                     pos = clone(pos1);
 
                   }
 
                   }
 
                 } else {
 
                 } else {
 
                   result0 = null;
 
                   result0 = null;
                   pos = pos1;
+
                   pos = clone(pos1);
 
                 }
 
                 }
 
               } else {
 
               } else {
 
                 result0 = null;
 
                 result0 = null;
                 pos = pos1;
+
                 pos = clone(pos1);
 
               }
 
               }
 
             } else {
 
             } else {
 
               result0 = null;
 
               result0 = null;
               pos = pos1;
+
               pos = clone(pos1);
 
             }
 
             }
 
             if (result0 !== null) {
 
             if (result0 !== null) {
               result0 = (function(offset, f, i) {return function(real){a2.util.remove(i)};})(pos0, result0[0], result0[2]);
+
               result0 = (function(offset, line, column, f, i) {return function(real){a2.util.remove(i)};})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
 
             }
 
             }
 
             if (result0 === null) {
 
             if (result0 === null) {
               pos = pos0;
+
               pos = clone(pos0);
 
             }
 
             }
 
             if (result0 === null) {
 
             if (result0 === null) {
               pos0 = pos;
+
               pos0 = clone(pos);
               pos1 = pos;
+
               pos1 = clone(pos);
               if (input.substr(pos, 5) === "print") {
+
               if (input.substr(pos.offset, 5) === "print") {
 
                 result0 = "print";
 
                 result0 = "print";
                 pos += 5;
+
                 advance(pos, 5);
 
               } else {
 
               } else {
 
                 result0 = null;
 
                 result0 = null;
Zeile 1.310: Zeile 1.592:
 
                     } else {
 
                     } else {
 
                       result0 = null;
 
                       result0 = null;
                       pos = pos1;
+
                       pos = clone(pos1);
 
                     }
 
                     }
 
                   } else {
 
                   } else {
 
                     result0 = null;
 
                     result0 = null;
                     pos = pos1;
+
                     pos = clone(pos1);
 
                   }
 
                   }
 
                 } else {
 
                 } else {
 
                   result0 = null;
 
                   result0 = null;
                   pos = pos1;
+
                   pos = clone(pos1);
 
                 }
 
                 }
 
               } else {
 
               } else {
 
                 result0 = null;
 
                 result0 = null;
                 pos = pos1;
+
                 pos = clone(pos1);
 
               }
 
               }
 
               if (result0 !== null) {
 
               if (result0 !== null) {
                 result0 = (function(offset, f, s) {return function(real){a2.util.print(s)};})(pos0, result0[0], result0[2]);
+
                 result0 = (function(offset, line, column, f, s) {return function(real){a2.util.print(s)};})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
 
               }
 
               }
 
               if (result0 === null) {
 
               if (result0 === null) {
                 pos = pos0;
+
                 pos = clone(pos0);
 
               }
 
               }
 
               if (result0 === null) {
 
               if (result0 === null) {
                 pos0 = pos;
+
                 pos0 = clone(pos);
                 pos1 = pos;
+
                 pos1 = clone(pos);
                 if (input.substr(pos, 6) === "remove") {
+
                 if (input.substr(pos.offset, 3) === "ask") {
                   result0 = "remove";
+
                   result0 = "ask";
                   pos += 6;
+
                   advance(pos, 3);
 
                 } else {
 
                 } else {
 
                   result0 = null;
 
                   result0 = null;
 
                   if (reportFailures === 0) {
 
                   if (reportFailures === 0) {
                     matchFailed("\"remove\"");
+
                     matchFailed("\"ask\"");
 
                   }
 
                   }
 
                 }
 
                 }
Zeile 1.345: Zeile 1.627:
 
                   result1 = parse_L();
 
                   result1 = parse_L();
 
                   if (result1 !== null) {
 
                   if (result1 !== null) {
                     result2 = parse_ItemVirtual();
+
                     result2 = parse_String();
 
                     if (result2 !== null) {
 
                     if (result2 !== null) {
                       result3 = parse_R();
+
                       result3 = parse_C();
 
                       if (result3 !== null) {
 
                       if (result3 !== null) {
                         result0 = [result0, result1, result2, result3];
+
                         result4 = parse_StringKwArgClause();
 +
                        if (result4 !== null) {
 +
                          result5 = parse_R();
 +
                          if (result5 !== null) {
 +
                            result0 = [result0, result1, result2, result3, result4, result5];
 +
                          } else {
 +
                            result0 = null;
 +
                            pos = clone(pos1);
 +
                          }
 +
                        } else {
 +
                          result0 = null;
 +
                          pos = clone(pos1);
 +
                        }
 
                       } else {
 
                       } else {
 
                         result0 = null;
 
                         result0 = null;
                         pos = pos1;
+
                         pos = clone(pos1);
 
                       }
 
                       }
 
                     } else {
 
                     } else {
 
                       result0 = null;
 
                       result0 = null;
                       pos = pos1;
+
                       pos = clone(pos1);
 
                     }
 
                     }
 
                   } else {
 
                   } else {
 
                     result0 = null;
 
                     result0 = null;
                     pos = pos1;
+
                     pos = clone(pos1);
 
                   }
 
                   }
 
                 } else {
 
                 } else {
 
                   result0 = null;
 
                   result0 = null;
                   pos = pos1;
+
                   pos = clone(pos1);
 
                 }
 
                 }
 
                 if (result0 !== null) {
 
                 if (result0 !== null) {
                   result0 = (function(offset, f, i) {return function(real){a2.util.removeAll(i)};})(pos0, result0[0], result0[2]);
+
                   result0 = (function(offset, line, column, f, s, c) {return function(real){a2.util.print(s,c);};})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2], result0[4]);
 
                 }
 
                 }
 
                 if (result0 === null) {
 
                 if (result0 === null) {
                   pos = pos0;
+
                   pos = clone(pos0);
 
                 }
 
                 }
 
                 if (result0 === null) {
 
                 if (result0 === null) {
                   pos0 = pos;
+
                   pos0 = clone(pos);
                   pos1 = pos;
+
                   pos1 = clone(pos);
                   if (input.substr(pos, 6) === "remove") {
+
                   if (input.substr(pos.offset, 12) === "clearTimeout") {
                     result0 = "remove";
+
                     result0 = "clearTimeout";
                     pos += 6;
+
                     advance(pos, 12);
 
                   } else {
 
                   } else {
 
                     result0 = null;
 
                     result0 = null;
 
                     if (reportFailures === 0) {
 
                     if (reportFailures === 0) {
                       matchFailed("\"remove\"");
+
                       matchFailed("\"clearTimeout\"");
 
                     }
 
                     }
 
                   }
 
                   }
Zeile 1.387: Zeile 1.681:
 
                     result1 = parse_L();
 
                     result1 = parse_L();
 
                     if (result1 !== null) {
 
                     if (result1 !== null) {
                       if (input.substr(pos, 2) === "${") {
+
                      result2 = parse_R();
                         result2 = "${";
+
                       if (result2 !== null) {
                        pos += 2;
+
                         result0 = [result0, result1, result2];
 
                       } else {
 
                       } else {
                         result2 = null;
+
                         result0 = null;
                         if (reportFailures === 0) {
+
                         pos = clone(pos1);
                          matchFailed("\"${\"");
 
                        }
 
 
                       }
 
                       }
                       if (result2 !== null) {
+
                    } else {
                        result3 = parse_TriggerItemOrVirtOp();
+
                      result0 = null;
                        if (result3 === null) {
+
                       pos = clone(pos1);
                          if (input.substr(pos, 7) === "combine") {
+
                    }
                            result3 = "combine";
+
                  } else {
                             pos += 7;
+
                    result0 = null;
 +
                    pos = clone(pos1);
 +
                  }
 +
                  if (result0 !== null) {
 +
                    result0 = (function(offset, line, column, f) {return function(real){a2.timer.clear();};})(pos0.offset, pos0.line, pos0.column, result0[0]);
 +
                  }
 +
                  if (result0 === null) {
 +
                    pos = clone(pos0);
 +
                  }
 +
                  if (result0 === null) {
 +
                    pos0 = clone(pos);
 +
                    pos1 = clone(pos);
 +
                    if (input.substr(pos.offset, 11) === "showOverlay") {
 +
                      result0 = "showOverlay";
 +
                      advance(pos, 11);
 +
                    } else {
 +
                      result0 = null;
 +
                      if (reportFailures === 0) {
 +
                        matchFailed("\"showOverlay\"");
 +
                      }
 +
                    }
 +
                    if (result0 !== null) {
 +
                      result1 = parse_L();
 +
                      if (result1 !== null) {
 +
                        result2 = parse_Overlay();
 +
                        if (result2 !== null) {
 +
                          result3 = parse_R();
 +
                          if (result3 !== null) {
 +
                             result0 = [result0, result1, result2, result3];
 
                           } else {
 
                           } else {
                             result3 = null;
+
                             result0 = null;
                             if (reportFailures === 0) {
+
                             pos = clone(pos1);
                              matchFailed("\"combine\"");
 
                            }
 
                          }
 
                          if (result3 === null) {
 
                            if (input.substr(pos, 5) === "apply") {
 
                              result3 = "apply";
 
                              pos += 5;
 
                            } else {
 
                              result3 = null;
 
                              if (reportFailures === 0) {
 
                                matchFailed("\"apply\"");
 
                              }
 
                            }
 
 
                           }
 
                           }
 +
                        } else {
 +
                          result0 = null;
 +
                          pos = clone(pos1);
 
                         }
 
                         }
                         if (result3 !== null) {
+
                      } else {
                          if (/^[12]/.test(input.charAt(pos))) {
+
                         result0 = null;
                            result4 = input.charAt(pos);
+
                        pos = clone(pos1);
                            pos++;
+
                      }
                          } else {
+
                    } else {
                            result4 = null;
+
                      result0 = null;
                            if (reportFailures === 0) {
+
                      pos = clone(pos1);
                              matchFailed("[12]");
+
                    }
                            }
+
                    if (result0 !== null) {
                          }
+
                      result0 = (function(offset, line, column, f, o) {return function(real){ $("#overlay_"+o).show();};})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
                          if (result4 !== null) {
+
                    }
                            if (input.charCodeAt(pos) === 125) {
+
                    if (result0 === null) {
                              result5 = "}";
+
                      pos = clone(pos0);
                              pos++;
+
                    }
                            } else {
+
                    if (result0 === null) {
                              result5 = null;
+
                      pos0 = clone(pos);
                              if (reportFailures === 0) {
+
                      pos1 = clone(pos);
                                matchFailed("\"}\"");
+
                      if (input.substr(pos.offset, 11) === "hideOverlay") {
                              }
+
                        result0 = "hideOverlay";
                            }
+
                        advance(pos, 11);
                            if (result5 !== null) {
+
                      } else {
                              result6 = parse_R();
+
                        result0 = null;
                              if (result6 !== null) {
+
                        if (reportFailures === 0) {
                                result0 = [result0, result1, result2, result3, result4, result5, result6];
+
                          matchFailed("\"hideOverlay\"");
                              } else {
+
                        }
                                result0 = null;
+
                      }
                                pos = pos1;
+
                      if (result0 !== null) {
                              }
+
                        result1 = parse_L();
 +
                        if (result1 !== null) {
 +
                          result2 = parse_Overlay();
 +
                          if (result2 !== null) {
 +
                            result3 = parse_R();
 +
                            if (result3 !== null) {
 +
                              result0 = [result0, result1, result2, result3];
 
                             } else {
 
                             } else {
 
                               result0 = null;
 
                               result0 = null;
                               pos = pos1;
+
                               pos = clone(pos1);
 
                             }
 
                             }
 
                           } else {
 
                           } else {
 
                             result0 = null;
 
                             result0 = null;
                             pos = pos1;
+
                             pos = clone(pos1);
 
                           }
 
                           }
 
                         } else {
 
                         } else {
 
                           result0 = null;
 
                           result0 = null;
                           pos = pos1;
+
                           pos = clone(pos1);
 
                         }
 
                         }
 
                       } else {
 
                       } else {
 
                         result0 = null;
 
                         result0 = null;
                         pos = pos1;
+
                         pos = clone(pos1);
 +
                      }
 +
                      if (result0 !== null) {
 +
                        result0 = (function(offset, line, column, f, o) {return function(real){ $("#overlay_"+o).hide();};})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
 +
                      }
 +
                      if (result0 === null) {
 +
                        pos = clone(pos0);
 
                       }
 
                       }
                    } else {
+
                      if (result0 === null) {
                      result0 = null;
+
                        pos0 = clone(pos);
                      pos = pos1;
+
                        pos1 = clone(pos);
                    }
+
                        if (input.substr(pos.offset, 6) === "remove") {
                  } else {
+
                          result0 = "remove";
                    result0 = null;
+
                          advance(pos, 6);
                    pos = pos1;
+
                        } else {
                  }
+
                          result0 = null;
                  if (result0 !== null) {
+
                          if (reportFailures === 0) {
                    result0 = (function(offset, f, rt, rn) {return function(real){if (rt == real[0] && a2.virtualTriggerMap[rt] && a2.virtualTriggerMap[rt][rn]) a2.util.remove(real[rn]);};})(pos0, result0[0], result0[3], result0[4]);
+
                            matchFailed("\"remove\"");
                  }
+
                          }
                  if (result0 === null) {
+
                        }
                    pos = pos0;
+
                        if (result0 !== null) {
                  }
+
                          result1 = parse_L();
                }
+
                          if (result1 !== null) {
              }
+
                            result2 = parse_ItemVirtual();
            }
+
                            if (result2 !== null) {
          }
+
                              result3 = parse_R();
        }
+
                              if (result3 !== null) {
        return result0;
+
                                result0 = [result0, result1, result2, result3];
      }
+
                              } else {
     
+
                                result0 = null;
      function parse_PageDec() {
+
                                pos = clone(pos1);
        var result0, result1, result2, result3;
+
                              }
        var pos0, pos1;
+
                            } else {
       
+
                              result0 = null;
        pos0 = pos;
+
                              pos = clone(pos1);
        pos1 = pos;
+
                            }
        if (input.substr(pos, 4) === "page") {
+
                          } else {
          result0 = "page";
+
                            result0 = null;
          pos += 4;
+
                            pos = clone(pos1);
        } else {
+
                          }
          result0 = null;
+
                        } else {
          if (reportFailures === 0) {
+
                          result0 = null;
            matchFailed("\"page\"");
+
                          pos = clone(pos1);
          }
+
                        }
        }
+
                        if (result0 !== null) {
        if (result0 !== null) {
+
                          result0 = (function(offset, line, column, f, i) {return function(real){a2.util.removeAll(i)};})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
          result1 = parse_CC();
+
                        }
          if (result1 !== null) {
+
                        if (result0 === null) {
            result2 = parse_PageVirtualClause();
+
                          pos = clone(pos0);
            result2 = result2 !== null ? result2 : "";
+
                        }
            if (result2 !== null) {
+
                        if (result0 === null) {
              result3 = parse_End();
+
                          pos0 = clone(pos);
              if (result3 !== null) {
+
                          pos1 = clone(pos);
                result0 = [result0, result1, result2, result3];
+
                          if (input.substr(pos.offset, 6) === "remove") {
              } else {
+
                            result0 = "remove";
                result0 = null;
+
                            advance(pos, 6);
                pos = pos1;
+
                          } else {
              }
+
                            result0 = null;
            } else {
+
                            if (reportFailures === 0) {
              result0 = null;
+
                              matchFailed("\"remove\"");
              pos = pos1;
+
                            }
            }
+
                          }
          } else {
+
                          if (result0 !== null) {
            result0 = null;
+
                            result1 = parse_L();
            pos = pos1;
+
                            if (result1 !== null) {
          }
+
                              if (input.substr(pos.offset, 2) === "${") {
        } else {
+
                                result2 = "${";
          result0 = null;
+
                                advance(pos, 2);
          pos = pos1;
+
                              } else {
        }
+
                                result2 = null;
        if (result0 !== null) {
+
                                if (reportFailures === 0) {
          result0 = (function(offset, pv) {return ["page", {virt:pv}];})(pos0, result0[2]);
+
                                  matchFailed("\"${\"");
        }
+
                                }
        if (result0 === null) {
+
                              }
          pos = pos0;
+
                              if (result2 !== null) {
 +
                                result3 = parse_TriggerItemOrVirtOp();
 +
                                if (result3 === null) {
 +
                                  if (input.substr(pos.offset, 7) === "combine") {
 +
                                    result3 = "combine";
 +
                                    advance(pos, 7);
 +
                                  } else {
 +
                                    result3 = null;
 +
                                    if (reportFailures === 0) {
 +
                                      matchFailed("\"combine\"");
 +
                                    }
 +
                                  }
 +
                                  if (result3 === null) {
 +
                                    if (input.substr(pos.offset, 5) === "apply") {
 +
                                      result3 = "apply";
 +
                                      advance(pos, 5);
 +
                                    } else {
 +
                                      result3 = null;
 +
                                      if (reportFailures === 0) {
 +
                                        matchFailed("\"apply\"");
 +
                                      }
 +
                                    }
 +
                                  }
 +
                                }
 +
                                if (result3 !== null) {
 +
                                  if (/^[12]/.test(input.charAt(pos.offset))) {
 +
                                    result4 = input.charAt(pos.offset);
 +
                                    advance(pos, 1);
 +
                                  } else {
 +
                                    result4 = null;
 +
                                    if (reportFailures === 0) {
 +
                                      matchFailed("[12]");
 +
                                    }
 +
                                  }
 +
                                  if (result4 !== null) {
 +
                                    if (input.charCodeAt(pos.offset) === 125) {
 +
                                      result5 = "}";
 +
                                      advance(pos, 1);
 +
                                    } else {
 +
                                      result5 = null;
 +
                                      if (reportFailures === 0) {
 +
                                        matchFailed("\"}\"");
 +
                                      }
 +
                                    }
 +
                                    if (result5 !== null) {
 +
                                      result6 = parse_R();
 +
                                      if (result6 !== null) {
 +
                                        result0 = [result0, result1, result2, result3, result4, result5, result6];
 +
                                      } else {
 +
                                        result0 = null;
 +
                                        pos = clone(pos1);
 +
                                      }
 +
                                    } else {
 +
                                      result0 = null;
 +
                                      pos = clone(pos1);
 +
                                    }
 +
                                  } else {
 +
                                    result0 = null;
 +
                                    pos = clone(pos1);
 +
                                  }
 +
                                } else {
 +
                                  result0 = null;
 +
                                  pos = clone(pos1);
 +
                                }
 +
                              } else {
 +
                                result0 = null;
 +
                                pos = clone(pos1);
 +
                              }
 +
                            } else {
 +
                              result0 = null;
 +
                              pos = clone(pos1);
 +
                            }
 +
                          } else {
 +
                            result0 = null;
 +
                            pos = clone(pos1);
 +
                          }
 +
                          if (result0 !== null) {
 +
                            result0 = (function(offset, line, column, f, rt, rn) {return function(real){if (rt == real[0] && a2.virtualTriggerMap[rt] && a2.virtualTriggerMap[rt][parseInt(rn)-1]) a2.util.remove(real[parseInt(rn)]);};})(pos0.offset, pos0.line, pos0.column, result0[0], result0[3], result0[4]);
 +
                          }
 +
                          if (result0 === null) {
 +
                            pos = clone(pos0);
 +
                          }
 +
                          if (result0 === null) {
 +
                            pos0 = clone(pos);
 +
                            pos1 = clone(pos);
 +
                            if (input.substr(pos.offset, 10) === "setTimeout") {
 +
                              result0 = "setTimeout";
 +
                              advance(pos, 10);
 +
                            } else {
 +
                              result0 = null;
 +
                              if (reportFailures === 0) {
 +
                                matchFailed("\"setTimeout\"");
 +
                              }
 +
                            }
 +
                            if (result0 !== null) {
 +
                              result1 = parse_L();
 +
                              if (result1 !== null) {
 +
                                result2 = parse_Time();
 +
                                if (result2 !== null) {
 +
                                  result3 = parse_R();
 +
                                  if (result3 !== null) {
 +
                                    result4 = parse_C();
 +
                                    if (result4 !== null) {
 +
                                      result5 = parse_ActionFunctions();
 +
                                      if (result5 !== null) {
 +
                                        result0 = [result0, result1, result2, result3, result4, result5];
 +
                                      } else {
 +
                                        result0 = null;
 +
                                        pos = clone(pos1);
 +
                                      }
 +
                                    } else {
 +
                                      result0 = null;
 +
                                      pos = clone(pos1);
 +
                                    }
 +
                                  } else {
 +
                                    result0 = null;
 +
                                    pos = clone(pos1);
 +
                                  }
 +
                                } else {
 +
                                  result0 = null;
 +
                                  pos = clone(pos1);
 +
                                }
 +
                              } else {
 +
                                result0 = null;
 +
                                pos = clone(pos1);
 +
                              }
 +
                            } else {
 +
                              result0 = null;
 +
                              pos = clone(pos1);
 +
                            }
 +
                            if (result0 !== null) {
 +
                              result0 = (function(offset, line, column, t, a) {return function(real){a2.timer.set(t, function(){a(real)});};})(pos0.offset, pos0.line, pos0.column, result0[2], result0[5]);
 +
                            }
 +
                            if (result0 === null) {
 +
                              pos = clone(pos0);
 +
                            }
 +
                            if (result0 === null) {
 +
                              pos0 = clone(pos);
 +
                              pos1 = clone(pos);
 +
                              if (input.substr(pos.offset, 4) === "play") {
 +
                                result0 = "play";
 +
                                advance(pos, 4);
 +
                              } else {
 +
                                result0 = null;
 +
                                if (reportFailures === 0) {
 +
                                  matchFailed("\"play\"");
 +
                                }
 +
                              }
 +
                              if (result0 !== null) {
 +
                                result1 = parse_L();
 +
                                if (result1 !== null) {
 +
                                  result2 = parse_Channel();
 +
                                  if (result2 !== null) {
 +
                                    result3 = parse_C();
 +
                                    if (result3 !== null) {
 +
                                      result4 = parse_String();
 +
                                      if (result4 !== null) {
 +
                                        result5 = parse_R();
 +
                                        if (result5 !== null) {
 +
                                          result0 = [result0, result1, result2, result3, result4, result5];
 +
                                        } else {
 +
                                          result0 = null;
 +
                                          pos = clone(pos1);
 +
                                        }
 +
                                      } else {
 +
                                        result0 = null;
 +
                                        pos = clone(pos1);
 +
                                      }
 +
                                    } else {
 +
                                      result0 = null;
 +
                                      pos = clone(pos1);
 +
                                    }
 +
                                  } else {
 +
                                    result0 = null;
 +
                                    pos = clone(pos1);
 +
                                  }
 +
                                } else {
 +
                                  result0 = null;
 +
                                  pos = clone(pos1);
 +
                                }
 +
                              } else {
 +
                                result0 = null;
 +
                                pos = clone(pos1);
 +
                              }
 +
                              if (result0 !== null) {
 +
                                result0 = (function(offset, line, column, f, chan, file) {return function(real){a2.audio.play(chan, file)};})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2], result0[4]);
 +
                              }
 +
                              if (result0 === null) {
 +
                                pos = clone(pos0);
 +
                              }
 +
                              if (result0 === null) {
 +
                                pos0 = clone(pos);
 +
                                pos1 = clone(pos);
 +
                                if (input.substr(pos.offset, 4) === "stop") {
 +
                                  result0 = "stop";
 +
                                  advance(pos, 4);
 +
                                } else {
 +
                                  result0 = null;
 +
                                  if (reportFailures === 0) {
 +
                                    matchFailed("\"stop\"");
 +
                                  }
 +
                                }
 +
                                if (result0 !== null) {
 +
                                  result1 = parse_L();
 +
                                  if (result1 !== null) {
 +
                                    result2 = parse_Channel();
 +
                                    if (result2 !== null) {
 +
                                      result3 = parse_R();
 +
                                      if (result3 !== null) {
 +
                                        result0 = [result0, result1, result2, result3];
 +
                                      } else {
 +
                                        result0 = null;
 +
                                        pos = clone(pos1);
 +
                                      }
 +
                                    } else {
 +
                                      result0 = null;
 +
                                      pos = clone(pos1);
 +
                                    }
 +
                                  } else {
 +
                                    result0 = null;
 +
                                    pos = clone(pos1);
 +
                                  }
 +
                                } else {
 +
                                  result0 = null;
 +
                                  pos = clone(pos1);
 +
                                }
 +
                                if (result0 !== null) {
 +
                                  result0 = (function(offset, line, column, f, chan) {return function(real){a2.audio.stop(chan)};})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
 +
                                }
 +
                                if (result0 === null) {
 +
                                  pos = clone(pos0);
 +
                                }
 +
                              }
 +
                            }
 +
                          }
 +
                        }
 +
                      }
 +
                    }
 +
                  }
 +
                }
 +
              }
 +
            }
 +
          }
 
         }
 
         }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 
         return result0;
 
         return result0;
 
       }
 
       }
 
        
 
        
       function parse_PageVirtualClause() {
+
       function parse_Channel() {
         var result0, result1, result2, result3;
+
        var cacheKey = "Channel@" + pos.offset;
         var pos0, pos1;
+
        var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 +
       
 +
         var result0;
 +
         var pos0;
 
          
 
          
         pos0 = pos;
+
         pos0 = clone(pos);
        pos1 = pos;
+
         if (input.substr(pos.offset, 5) === "music") {
         if (input.substr(pos, 8) === "provides") {
+
           result0 = "music";
           result0 = "provides";
+
           advance(pos, 5);
           pos += 8;
 
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
 
           if (reportFailures === 0) {
 
           if (reportFailures === 0) {
             matchFailed("\"provides\"");
+
             matchFailed("\"music\"");
 
           }
 
           }
 
         }
 
         }
 
         if (result0 !== null) {
 
         if (result0 !== null) {
           result1 = parse_S();
+
           result0 = (function(offset, line, column) {return "music";})(pos0.offset, pos0.line, pos0.column);
           if (result1 !== null) {
+
        }
             result2 = parse_PageVirtualList();
+
        if (result0 === null) {
             if (result2 !== null) {
+
           pos = clone(pos0);
               result3 = parse_CC();
+
        }
              if (result3 !== null) {
+
        if (result0 === null) {
                result0 = [result0, result1, result2, result3];
+
          pos0 = clone(pos);
              } else {
+
          if (input.substr(pos.offset, 5) === "noise") {
                result0 = null;
+
             result0 = "noise";
                pos = pos1;
+
            advance(pos, 5);
               }
+
          } else {
 +
            result0 = null;
 +
             if (reportFailures === 0) {
 +
               matchFailed("\"noise\"");
 +
            }
 +
          }
 +
          if (result0 !== null) {
 +
            result0 = (function(offset, line, column) {return "noise";})(pos0.offset, pos0.line, pos0.column);
 +
          }
 +
          if (result0 === null) {
 +
            pos = clone(pos0);
 +
          }
 +
          if (result0 === null) {
 +
            pos0 = clone(pos);
 +
            if (input.substr(pos.offset, 10) === "background") {
 +
              result0 = "background";
 +
               advance(pos, 10);
 
             } else {
 
             } else {
 
               result0 = null;
 
               result0 = null;
               pos = pos1;
+
              if (reportFailures === 0) {
 +
                matchFailed("\"background\"");
 +
              }
 +
            }
 +
            if (result0 !== null) {
 +
              result0 = (function(offset, line, column) {return "background";})(pos0.offset, pos0.line, pos0.column);
 +
            }
 +
            if (result0 === null) {
 +
               pos = clone(pos0);
 
             }
 
             }
          } else {
 
            result0 = null;
 
            pos = pos1;
 
 
           }
 
           }
        } else {
 
          result0 = null;
 
          pos = pos1;
 
        }
 
        if (result0 !== null) {
 
          result0 = (function(offset, v) {return v;})(pos0, result0[2]);
 
        }
 
        if (result0 === null) {
 
          pos = pos0;
 
 
         }
 
         }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 
         return result0;
 
         return result0;
 
       }
 
       }
 
        
 
        
       function parse_PageVirtualList() {
+
       function parse_PageDec() {
         var result0, result1, result2;
+
        var cacheKey = "PageDec@" + pos.offset;
 +
        var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 +
       
 +
         var result0, result1, result2, result3;
 
         var pos0, pos1;
 
         var pos0, pos1;
 
          
 
          
         pos0 = pos;
+
         pos0 = clone(pos);
         pos1 = pos;
+
         pos1 = clone(pos);
        result0 = parse_PageVirtual();
+
         if (input.substr(pos.offset, 4) === "page") {
         if (result0 !== null) {
+
          result0 = "page";
          result1 = parse_C();
+
           advance(pos, 4);
          if (result1 !== null) {
 
            result2 = parse_PageVirtualList();
 
            if (result2 !== null) {
 
              result0 = [result0, result1, result2];
 
            } else {
 
              result0 = null;
 
              pos = pos1;
 
            }
 
           } else {
 
            result0 = null;
 
            pos = pos1;
 
          }
 
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
           pos = pos1;
+
           if (reportFailures === 0) {
 +
            matchFailed("\"page\"");
 +
          }
 
         }
 
         }
 
         if (result0 !== null) {
 
         if (result0 !== null) {
           result0 = (function(offset, v, vl) {vl.push(v); return vl;})(pos0, result0[0], result0[2]);
+
           result1 = parse_CC();
         }
+
          if (result1 !== null) {
         if (result0 === null) {
+
            result2 = parse_PageVirtualClause();
           pos = pos0;
+
            result2 = result2 !== null ? result2 : "";
 +
            if (result2 !== null) {
 +
              result3 = parse_End();
 +
              if (result3 !== null) {
 +
                result0 = [result0, result1, result2, result3];
 +
              } else {
 +
                result0 = null;
 +
                pos = clone(pos1);
 +
              }
 +
            } else {
 +
              result0 = null;
 +
              pos = clone(pos1);
 +
            }
 +
          } else {
 +
            result0 = null;
 +
            pos = clone(pos1);
 +
          }
 +
        } else {
 +
          result0 = null;
 +
          pos = clone(pos1);
 +
         }
 +
         if (result0 !== null) {
 +
           result0 = (function(offset, line, column, pv) {return ["page", {virt:pv}];})(pos0.offset, pos0.line, pos0.column, result0[2]);
 
         }
 
         }
 
         if (result0 === null) {
 
         if (result0 === null) {
           pos0 = pos;
+
           pos = clone(pos0);
          result0 = parse_PageVirtual();
 
          if (result0 !== null) {
 
            result0 = (function(offset, v) {return [v];})(pos0, result0);
 
          }
 
          if (result0 === null) {
 
            pos = pos0;
 
          }
 
 
         }
 
         }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 
         return result0;
 
         return result0;
 
       }
 
       }
 
        
 
        
       function parse_ItemDec() {
+
       function parse_PageVirtualClause() {
         var result0, result1, result2, result3, result4;
+
         var cacheKey = "PageVirtualClause@" + pos.offset;
         var pos0, pos1;
+
         var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 
          
 
          
         pos0 = pos;
+
        var result0, result1, result2, result3;
         pos1 = pos;
+
        var pos0, pos1;
         if (input.substr(pos, 4) === "item") {
+
       
           result0 = "item";
+
         pos0 = clone(pos);
           pos += 4;
+
         pos1 = clone(pos);
 +
         if (input.substr(pos.offset, 8) === "provides") {
 +
           result0 = "provides";
 +
           advance(pos, 8);
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
 
           if (reportFailures === 0) {
 
           if (reportFailures === 0) {
             matchFailed("\"item\"");
+
             matchFailed("\"provides\"");
 
           }
 
           }
 
         }
 
         }
 
         if (result0 !== null) {
 
         if (result0 !== null) {
           result1 = parse_CC();
+
           result1 = parse_S();
 
           if (result1 !== null) {
 
           if (result1 !== null) {
             result2 = parse_TitleClause();
+
             result2 = parse_PageVirtualList();
            result2 = result2 !== null ? result2 : "";
 
 
             if (result2 !== null) {
 
             if (result2 !== null) {
               result3 = parse_ItemVirtualClause();
+
               result3 = parse_CC();
              result3 = result3 !== null ? result3 : "";
 
 
               if (result3 !== null) {
 
               if (result3 !== null) {
                 result4 = parse_End();
+
                 result0 = [result0, result1, result2, result3];
                if (result4 !== null) {
 
                  result0 = [result0, result1, result2, result3, result4];
 
                } else {
 
                  result0 = null;
 
                  pos = pos1;
 
                }
 
 
               } else {
 
               } else {
 
                 result0 = null;
 
                 result0 = null;
                 pos = pos1;
+
                 pos = clone(pos1);
 
               }
 
               }
 
             } else {
 
             } else {
 
               result0 = null;
 
               result0 = null;
               pos = pos1;
+
               pos = clone(pos1);
 
             }
 
             }
 
           } else {
 
           } else {
 
             result0 = null;
 
             result0 = null;
             pos = pos1;
+
             pos = clone(pos1);
 
           }
 
           }
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
           pos = pos1;
+
           pos = clone(pos1);
 
         }
 
         }
 
         if (result0 !== null) {
 
         if (result0 !== null) {
           result0 = (function(offset, t, iv) {return ["item", {virt:iv, title:t}];})(pos0, result0[2], result0[3]);
+
           result0 = (function(offset, line, column, v) {return v;})(pos0.offset, pos0.line, pos0.column, result0[2]);
 
         }
 
         }
 
         if (result0 === null) {
 
         if (result0 === null) {
           pos = pos0;
+
           pos = clone(pos0);
 
         }
 
         }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 
         return result0;
 
         return result0;
 
       }
 
       }
 
        
 
        
       function parse_TitleClause() {
+
       function parse_PageVirtualList() {
         var result0, result1, result2, result3;
+
        var cacheKey = "PageVirtualList@" + pos.offset;
 +
        var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 +
       
 +
         var result0, result1, result2;
 
         var pos0, pos1;
 
         var pos0, pos1;
 
          
 
          
         pos0 = pos;
+
         pos0 = clone(pos);
         pos1 = pos;
+
         pos1 = clone(pos);
        if (input.substr(pos, 5) === "title") {
+
         result0 = parse_PageVirtual();
          result0 = "title";
+
         if (result0 !== null) {
          pos += 5;
+
           result1 = parse_C();
         } else {
 
          result0 = null;
 
          if (reportFailures === 0) {
 
            matchFailed("\"title\"");
 
          }
 
        }
 
         if (result0 !== null) {
 
           result1 = parse_S();
 
 
           if (result1 !== null) {
 
           if (result1 !== null) {
             result2 = parse_String();
+
             result2 = parse_PageVirtualList();
 
             if (result2 !== null) {
 
             if (result2 !== null) {
               result3 = parse_CC();
+
               result0 = [result0, result1, result2];
              if (result3 !== null) {
 
                result0 = [result0, result1, result2, result3];
 
              } else {
 
                result0 = null;
 
                pos = pos1;
 
              }
 
 
             } else {
 
             } else {
 
               result0 = null;
 
               result0 = null;
               pos = pos1;
+
               pos = clone(pos1);
 
             }
 
             }
 
           } else {
 
           } else {
 
             result0 = null;
 
             result0 = null;
             pos = pos1;
+
             pos = clone(pos1);
 
           }
 
           }
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
           pos = pos1;
+
           pos = clone(pos1);
 
         }
 
         }
 
         if (result0 !== null) {
 
         if (result0 !== null) {
           result0 = (function(offset, s) {return s;})(pos0, result0[2]);
+
           result0 = (function(offset, line, column, v, vl) {vl.push(v); return vl;})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
 +
        }
 +
        if (result0 === null) {
 +
          pos = clone(pos0);
 
         }
 
         }
 
         if (result0 === null) {
 
         if (result0 === null) {
           pos = pos0;
+
           pos0 = clone(pos);
 +
          result0 = parse_PageVirtual();
 +
          if (result0 !== null) {
 +
            result0 = (function(offset, line, column, v) {return [v];})(pos0.offset, pos0.line, pos0.column, result0);
 +
          }
 +
          if (result0 === null) {
 +
            pos = clone(pos0);
 +
          }
 
         }
 
         }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 
         return result0;
 
         return result0;
 
       }
 
       }
 
        
 
        
       function parse_ItemVirtualClause() {
+
       function parse_ItemDec() {
         var result0, result1, result2, result3;
+
        var cacheKey = "ItemDec@" + pos.offset;
 +
        var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 +
       
 +
         var result0, result1, result2, result3, result4;
 
         var pos0, pos1;
 
         var pos0, pos1;
 
          
 
          
         pos0 = pos;
+
         pos0 = clone(pos);
         pos1 = pos;
+
         pos1 = clone(pos);
         if (input.substr(pos, 8) === "provides") {
+
         if (input.substr(pos.offset, 4) === "item") {
           result0 = "provides";
+
           result0 = "item";
           pos += 8;
+
           advance(pos, 4);
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
 
           if (reportFailures === 0) {
 
           if (reportFailures === 0) {
             matchFailed("\"provides\"");
+
             matchFailed("\"item\"");
 
           }
 
           }
 
         }
 
         }
 
         if (result0 !== null) {
 
         if (result0 !== null) {
           result1 = parse_S();
+
           result1 = parse_CC();
 
           if (result1 !== null) {
 
           if (result1 !== null) {
             result2 = parse_ItemVirtualList();
+
             result2 = parse_TitleClause();
 +
            result2 = result2 !== null ? result2 : "";
 
             if (result2 !== null) {
 
             if (result2 !== null) {
               result3 = parse_CC();
+
               result3 = parse_ItemVirtualClause();
 +
              result3 = result3 !== null ? result3 : "";
 
               if (result3 !== null) {
 
               if (result3 !== null) {
                 result0 = [result0, result1, result2, result3];
+
                 result4 = parse_End();
 +
                if (result4 !== null) {
 +
                  result0 = [result0, result1, result2, result3, result4];
 +
                } else {
 +
                  result0 = null;
 +
                  pos = clone(pos1);
 +
                }
 
               } else {
 
               } else {
 
                 result0 = null;
 
                 result0 = null;
                 pos = pos1;
+
                 pos = clone(pos1);
 
               }
 
               }
 
             } else {
 
             } else {
 
               result0 = null;
 
               result0 = null;
               pos = pos1;
+
               pos = clone(pos1);
 
             }
 
             }
 
           } else {
 
           } else {
 
             result0 = null;
 
             result0 = null;
             pos = pos1;
+
             pos = clone(pos1);
 
           }
 
           }
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
           pos = pos1;
+
           pos = clone(pos1);
 
         }
 
         }
 
         if (result0 !== null) {
 
         if (result0 !== null) {
           result0 = (function(offset, v) {return v;})(pos0, result0[2]);
+
           result0 = (function(offset, line, column, t, iv) {return ["item", {virt:iv, title:t}];})(pos0.offset, pos0.line, pos0.column, result0[2], result0[3]);
 
         }
 
         }
 
         if (result0 === null) {
 
         if (result0 === null) {
           pos = pos0;
+
           pos = clone(pos0);
 
         }
 
         }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 
         return result0;
 
         return result0;
 
       }
 
       }
 
        
 
        
       function parse_ItemVirtualList() {
+
       function parse_TitleClause() {
         var result0, result1, result2;
+
        var cacheKey = "TitleClause@" + pos.offset;
 +
        var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 +
       
 +
         var result0, result1, result2, result3;
 
         var pos0, pos1;
 
         var pos0, pos1;
 
          
 
          
         pos0 = pos;
+
         pos0 = clone(pos);
         pos1 = pos;
+
         pos1 = clone(pos);
         result0 = parse_ItemVirtual();
+
        if (input.substr(pos.offset, 5) === "title") {
         if (result0 !== null) {
+
          result0 = "title";
           result1 = parse_C();
+
          advance(pos, 5);
 +
         } else {
 +
          result0 = null;
 +
          if (reportFailures === 0) {
 +
            matchFailed("\"title\"");
 +
          }
 +
        }
 +
         if (result0 !== null) {
 +
           result1 = parse_S();
 
           if (result1 !== null) {
 
           if (result1 !== null) {
             result2 = parse_ItemVirtualList();
+
             result2 = parse_String();
 
             if (result2 !== null) {
 
             if (result2 !== null) {
               result0 = [result0, result1, result2];
+
               result3 = parse_CC();
 +
              if (result3 !== null) {
 +
                result0 = [result0, result1, result2, result3];
 +
              } else {
 +
                result0 = null;
 +
                pos = clone(pos1);
 +
              }
 
             } else {
 
             } else {
 
               result0 = null;
 
               result0 = null;
               pos = pos1;
+
               pos = clone(pos1);
 
             }
 
             }
 
           } else {
 
           } else {
 
             result0 = null;
 
             result0 = null;
             pos = pos1;
+
             pos = clone(pos1);
 
           }
 
           }
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
           pos = pos1;
+
           pos = clone(pos1);
 
         }
 
         }
 
         if (result0 !== null) {
 
         if (result0 !== null) {
           result0 = (function(offset, v, vl) {vl.push(v); return vl;})(pos0, result0[0], result0[2]);
+
           result0 = (function(offset, line, column, s) {return s;})(pos0.offset, pos0.line, pos0.column, result0[2]);
 
         }
 
         }
 
         if (result0 === null) {
 
         if (result0 === null) {
           pos = pos0;
+
           pos = clone(pos0);
        }
 
        if (result0 === null) {
 
          pos0 = pos;
 
          result0 = parse_ItemVirtual();
 
          if (result0 !== null) {
 
            result0 = (function(offset, v) {return [v];})(pos0, result0);
 
          }
 
          if (result0 === null) {
 
            pos = pos0;
 
          }
 
 
         }
 
         }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 
         return result0;
 
         return result0;
 
       }
 
       }
 
        
 
        
       function parse_L() {
+
       function parse_ItemVirtualClause() {
         var result0, result1, result2;
+
         var cacheKey = "ItemVirtualClause@" + pos.offset;
         var pos0;
+
         var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 
          
 
          
         pos0 = pos;
+
        var result0, result1, result2, result3;
         result0 = parse_S();
+
        var pos0, pos1;
         result0 = result0 !== null ? result0 : "";
+
       
 +
         pos0 = clone(pos);
 +
         pos1 = clone(pos);
 +
        if (input.substr(pos.offset, 8) === "provides") {
 +
          result0 = "provides";
 +
          advance(pos, 8);
 +
         } else {
 +
          result0 = null;
 +
          if (reportFailures === 0) {
 +
            matchFailed("\"provides\"");
 +
          }
 +
        }
 
         if (result0 !== null) {
 
         if (result0 !== null) {
           if (input.charCodeAt(pos) === 40) {
+
           result1 = parse_S();
            result1 = "(";
 
            pos++;
 
          } else {
 
            result1 = null;
 
            if (reportFailures === 0) {
 
              matchFailed("\"(\"");
 
            }
 
          }
 
 
           if (result1 !== null) {
 
           if (result1 !== null) {
             result2 = parse_S();
+
             result2 = parse_ItemVirtualList();
            result2 = result2 !== null ? result2 : "";
 
 
             if (result2 !== null) {
 
             if (result2 !== null) {
               result0 = [result0, result1, result2];
+
               result3 = parse_CC();
 +
              if (result3 !== null) {
 +
                result0 = [result0, result1, result2, result3];
 +
              } else {
 +
                result0 = null;
 +
                pos = clone(pos1);
 +
              }
 
             } else {
 
             } else {
 
               result0 = null;
 
               result0 = null;
               pos = pos0;
+
               pos = clone(pos1);
 
             }
 
             }
 
           } else {
 
           } else {
 
             result0 = null;
 
             result0 = null;
             pos = pos0;
+
             pos = clone(pos1);
 
           }
 
           }
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
           pos = pos0;
+
           pos = clone(pos1);
 +
        }
 +
        if (result0 !== null) {
 +
          result0 = (function(offset, line, column, v) {return v;})(pos0.offset, pos0.line, pos0.column, result0[2]);
 +
        }
 +
        if (result0 === null) {
 +
          pos = clone(pos0);
 
         }
 
         }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 
         return result0;
 
         return result0;
 
       }
 
       }
 
        
 
        
       function parse_R() {
+
       function parse_ItemVirtualList() {
 +
        var cacheKey = "ItemVirtualList@" + pos.offset;
 +
        var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 +
       
 
         var result0, result1, result2;
 
         var result0, result1, result2;
         var pos0;
+
         var pos0, pos1;
 
          
 
          
         pos0 = pos;
+
         pos0 = clone(pos);
         result0 = parse_S();
+
         pos1 = clone(pos);
         result0 = result0 !== null ? result0 : "";
+
         result0 = parse_ItemVirtual();
 
         if (result0 !== null) {
 
         if (result0 !== null) {
           if (input.charCodeAt(pos) === 41) {
+
           result1 = parse_C();
            result1 = ")";
 
            pos++;
 
          } else {
 
            result1 = null;
 
            if (reportFailures === 0) {
 
              matchFailed("\")\"");
 
            }
 
          }
 
 
           if (result1 !== null) {
 
           if (result1 !== null) {
             result2 = parse_S();
+
             result2 = parse_ItemVirtualList();
            result2 = result2 !== null ? result2 : "";
 
 
             if (result2 !== null) {
 
             if (result2 !== null) {
 
               result0 = [result0, result1, result2];
 
               result0 = [result0, result1, result2];
 
             } else {
 
             } else {
 
               result0 = null;
 
               result0 = null;
               pos = pos0;
+
               pos = clone(pos1);
 
             }
 
             }
 
           } else {
 
           } else {
 
             result0 = null;
 
             result0 = null;
             pos = pos0;
+
             pos = clone(pos1);
 
           }
 
           }
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
           pos = pos0;
+
           pos = clone(pos1);
 +
        }
 +
        if (result0 !== null) {
 +
          result0 = (function(offset, line, column, v, vl) {vl.push(v); return vl;})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
 +
        }
 +
        if (result0 === null) {
 +
          pos = clone(pos0);
 +
        }
 +
        if (result0 === null) {
 +
          pos0 = clone(pos);
 +
          result0 = parse_ItemVirtual();
 +
          if (result0 !== null) {
 +
            result0 = (function(offset, line, column, v) {return [v];})(pos0.offset, pos0.line, pos0.column, result0);
 +
          }
 +
          if (result0 === null) {
 +
            pos = clone(pos0);
 +
          }
 
         }
 
         }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 
         return result0;
 
         return result0;
 
       }
 
       }
 
        
 
        
       function parse_C() {
+
       function parse_StringKwArgClause() {
 +
        var cacheKey = "StringKwArgClause@" + pos.offset;
 +
        var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 +
       
 
         var result0, result1, result2;
 
         var result0, result1, result2;
         var pos0;
+
         var pos0, pos1;
 
          
 
          
         pos0 = pos;
+
         pos0 = clone(pos);
         result0 = parse_S();
+
         pos1 = clone(pos);
         result0 = result0 !== null ? result0 : "";
+
         result0 = parse_StringKwArg();
 
         if (result0 !== null) {
 
         if (result0 !== null) {
           if (input.charCodeAt(pos) === 44) {
+
           result1 = parse_C();
            result1 = ",";
 
            pos++;
 
          } else {
 
            result1 = null;
 
            if (reportFailures === 0) {
 
              matchFailed("\",\"");
 
            }
 
          }
 
 
           if (result1 !== null) {
 
           if (result1 !== null) {
             result2 = parse_S();
+
             result2 = parse_StringKwArgClause();
            result2 = result2 !== null ? result2 : "";
 
 
             if (result2 !== null) {
 
             if (result2 !== null) {
 
               result0 = [result0, result1, result2];
 
               result0 = [result0, result1, result2];
 
             } else {
 
             } else {
 
               result0 = null;
 
               result0 = null;
               pos = pos0;
+
               pos = clone(pos1);
 
             }
 
             }
 
           } else {
 
           } else {
 
             result0 = null;
 
             result0 = null;
             pos = pos0;
+
             pos = clone(pos1);
 
           }
 
           }
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
           pos = pos0;
+
           pos = clone(pos1);
 +
        }
 +
        if (result0 !== null) {
 +
          result0 = (function(offset, line, column, k, r) {return [k].concat(r); })(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
 +
        }
 +
        if (result0 === null) {
 +
          pos = clone(pos0);
 +
        }
 +
        if (result0 === null) {
 +
          pos0 = clone(pos);
 +
          result0 = parse_StringKwArg();
 +
          if (result0 !== null) {
 +
            result0 = (function(offset, line, column, k) { return [k]; })(pos0.offset, pos0.line, pos0.column, result0);
 +
          }
 +
          if (result0 === null) {
 +
            pos = clone(pos0);
 +
          }
 
         }
 
         }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 
         return result0;
 
         return result0;
 
       }
 
       }
 
        
 
        
       function parse_CC() {
+
       function parse_StringKwArg() {
         var result0, result1, result2;
+
         var cacheKey = "StringKwArg@" + pos.offset;
         var pos0;
+
         var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 
          
 
          
         pos0 = pos;
+
        var result0, result1, result2, result3, result4;
         result0 = parse_S();
+
        var pos0, pos1;
         result0 = result0 !== null ? result0 : "";
+
       
 +
         pos0 = clone(pos);
 +
         pos1 = clone(pos);
 +
         result0 = parse_Identifier();
 
         if (result0 !== null) {
 
         if (result0 !== null) {
           if (input.charCodeAt(pos) === 59) {
+
           result1 = parse_S();
            result1 = ";";
+
          result1 = result1 !== null ? result1 : "";
            pos++;
+
          if (result1 !== null) {
          } else {
+
            if (input.charCodeAt(pos.offset) === 61) {
            result1 = null;
+
              result2 = "=";
            if (reportFailures === 0) {
+
              advance(pos, 1);
              matchFailed("\";\"");
+
            } else {
 +
              result2 = null;
 +
              if (reportFailures === 0) {
 +
                matchFailed("\"=\"");
 +
              }
 
             }
 
             }
          }
 
          if (result1 !== null) {
 
            result2 = parse_S();
 
            result2 = result2 !== null ? result2 : "";
 
 
             if (result2 !== null) {
 
             if (result2 !== null) {
               result0 = [result0, result1, result2];
+
               result3 = parse_S();
 +
              result3 = result3 !== null ? result3 : "";
 +
              if (result3 !== null) {
 +
                result4 = parse_String();
 +
                if (result4 !== null) {
 +
                  result0 = [result0, result1, result2, result3, result4];
 +
                } else {
 +
                  result0 = null;
 +
                  pos = clone(pos1);
 +
                }
 +
              } else {
 +
                result0 = null;
 +
                pos = clone(pos1);
 +
              }
 
             } else {
 
             } else {
 
               result0 = null;
 
               result0 = null;
               pos = pos0;
+
               pos = clone(pos1);
 
             }
 
             }
 
           } else {
 
           } else {
 
             result0 = null;
 
             result0 = null;
             pos = pos0;
+
             pos = clone(pos1);
 
           }
 
           }
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
           pos = pos0;
+
           pos = clone(pos1);
 
         }
 
         }
 +
        if (result0 !== null) {
 +
          result0 = (function(offset, line, column, i, s) {return [i,s];})(pos0.offset, pos0.line, pos0.column, result0[0], result0[4]);
 +
        }
 +
        if (result0 === null) {
 +
          pos = clone(pos0);
 +
        }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 
         return result0;
 
         return result0;
 
       }
 
       }
 
        
 
        
       function parse_Identifier() {
+
       function parse_L() {
 +
        var cacheKey = "L@" + pos.offset;
 +
        var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 +
       
 
         var result0, result1, result2;
 
         var result0, result1, result2;
         var pos0, pos1;
+
         var pos0;
 
          
 
          
         pos0 = pos;
+
         pos0 = clone(pos);
         pos1 = pos;
+
         result0 = parse_S();
        if (/^[a-z\xE4\xF6\xFC_]/.test(input.charAt(pos))) {
+
         result0 = result0 !== null ? result0 : "";
          result0 = input.charAt(pos);
 
          pos++;
 
         } else {
 
          result0 = null;
 
          if (reportFailures === 0) {
 
            matchFailed("[a-z\\xE4\\xF6\\xFC_]");
 
          }
 
        }
 
 
         if (result0 !== null) {
 
         if (result0 !== null) {
          result1 = [];
+
           if (input.charCodeAt(pos.offset) === 40) {
           if (/^[a-z\xE4\xF6\xFC_]/.test(input.charAt(pos))) {
+
             result1 = "(";
             result2 = input.charAt(pos);
+
             advance(pos, 1);
             pos++;
 
 
           } else {
 
           } else {
             result2 = null;
+
             result1 = null;
 
             if (reportFailures === 0) {
 
             if (reportFailures === 0) {
               matchFailed("[a-z\\xE4\\xF6\\xFC_]");
+
               matchFailed("\"(\"");
 
             }
 
             }
 
           }
 
           }
           while (result2 !== null) {
+
           if (result1 !== null) {
             result1.push(result2);
+
             result2 = parse_S();
             if (/^[a-z\xE4\xF6\xFC_]/.test(input.charAt(pos))) {
+
            result2 = result2 !== null ? result2 : "";
               result2 = input.charAt(pos);
+
             if (result2 !== null) {
              pos++;
+
               result0 = [result0, result1, result2];
 
             } else {
 
             } else {
               result2 = null;
+
               result0 = null;
               if (reportFailures === 0) {
+
               pos = clone(pos0);
                matchFailed("[a-z\\xE4\\xF6\\xFC_]");
 
              }
 
 
             }
 
             }
          }
 
          if (result1 !== null) {
 
            result0 = [result0, result1];
 
 
           } else {
 
           } else {
 
             result0 = null;
 
             result0 = null;
             pos = pos1;
+
             pos = clone(pos0);
 
           }
 
           }
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
           pos = pos1;
+
           pos = clone(pos0);
        }
 
        if (result0 !== null) {
 
          result0 = (function(offset, i1, i2) {return i1+i2.join("");})(pos0, result0[0], result0[1]);
 
        }
 
        if (result0 === null) {
 
          pos = pos0;
 
 
         }
 
         }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 
         return result0;
 
         return result0;
 
       }
 
       }
 
        
 
        
       function parse_PageVirtual() {
+
       function parse_R() {
         var result0, result1;
+
        var cacheKey = "R@" + pos.offset;
         var pos0, pos1;
+
        var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 +
       
 +
         var result0, result1, result2;
 +
         var pos0;
 
          
 
          
         pos0 = pos;
+
         pos0 = clone(pos);
         pos1 = pos;
+
         result0 = parse_S();
        if (input.charCodeAt(pos) === 64) {
+
         result0 = result0 !== null ? result0 : "";
          result0 = "@";
 
          pos++;
 
         } else {
 
          result0 = null;
 
          if (reportFailures === 0) {
 
            matchFailed("\"@\"");
 
          }
 
        }
 
 
         if (result0 !== null) {
 
         if (result0 !== null) {
           result1 = parse_Identifier();
+
           if (input.charCodeAt(pos.offset) === 41) {
 +
            result1 = ")";
 +
            advance(pos, 1);
 +
          } else {
 +
            result1 = null;
 +
            if (reportFailures === 0) {
 +
              matchFailed("\")\"");
 +
            }
 +
          }
 
           if (result1 !== null) {
 
           if (result1 !== null) {
             result0 = [result0, result1];
+
             result2 = parse_S();
 +
            result2 = result2 !== null ? result2 : "";
 +
            if (result2 !== null) {
 +
              result0 = [result0, result1, result2];
 +
            } else {
 +
              result0 = null;
 +
              pos = clone(pos0);
 +
            }
 
           } else {
 
           } else {
 
             result0 = null;
 
             result0 = null;
             pos = pos1;
+
             pos = clone(pos0);
 
           }
 
           }
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
           pos = pos1;
+
           pos = clone(pos0);
        }
 
        if (result0 !== null) {
 
          result0 = (function(offset, p, i) {return p+i;})(pos0, result0[0], result0[1]);
 
        }
 
        if (result0 === null) {
 
          pos = pos0;
 
 
         }
 
         }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 
         return result0;
 
         return result0;
 
       }
 
       }
 
        
 
        
       function parse_ItemVirtual() {
+
       function parse_C() {
         var result0, result1;
+
        var cacheKey = "C@" + pos.offset;
         var pos0, pos1;
+
        var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 +
       
 +
         var result0, result1, result2;
 +
         var pos0;
 
          
 
          
         pos0 = pos;
+
         pos0 = clone(pos);
         pos1 = pos;
+
         result0 = parse_S();
         if (input.charCodeAt(pos) === 58) {
+
        result0 = result0 !== null ? result0 : "";
          result0 = ":";
+
         if (result0 !== null) {
          pos++;
+
          if (input.charCodeAt(pos.offset) === 44) {
        } else {
+
            result1 = ",";
          result0 = null;
+
            advance(pos, 1);
          if (reportFailures === 0) {
+
          } else {
            matchFailed("\":\"");
+
            result1 = null;
 +
            if (reportFailures === 0) {
 +
              matchFailed("\",\"");
 +
            }
 
           }
 
           }
        }
 
        if (result0 !== null) {
 
          result1 = parse_Identifier();
 
 
           if (result1 !== null) {
 
           if (result1 !== null) {
             result0 = [result0, result1];
+
             result2 = parse_S();
 +
            result2 = result2 !== null ? result2 : "";
 +
            if (result2 !== null) {
 +
              result0 = [result0, result1, result2];
 +
            } else {
 +
              result0 = null;
 +
              pos = clone(pos0);
 +
            }
 
           } else {
 
           } else {
 
             result0 = null;
 
             result0 = null;
             pos = pos1;
+
             pos = clone(pos0);
 
           }
 
           }
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
           pos = pos1;
+
           pos = clone(pos0);
        }
 
        if (result0 !== null) {
 
          result0 = (function(offset, p, i) {return p+i;})(pos0, result0[0], result0[1]);
 
        }
 
        if (result0 === null) {
 
          pos = pos0;
 
 
         }
 
         }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 
         return result0;
 
         return result0;
 
       }
 
       }
 
        
 
        
       function parse_Page() {
+
       function parse_CC() {
         var result0, result1;
+
        var cacheKey = "CC@" + pos.offset;
 +
        var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 +
       
 +
         var result0, result1, result2;
 
         var pos0;
 
         var pos0;
 
          
 
          
         pos0 = pos;
+
         pos0 = clone(pos);
         if (/^[0-9]/.test(input.charAt(pos))) {
+
        result0 = parse_S();
          result1 = input.charAt(pos);
+
        result0 = result0 !== null ? result0 : "";
           pos++;
+
         if (result0 !== null) {
        } else {
+
          if (input.charCodeAt(pos.offset) === 59) {
          result1 = null;
+
            result1 = ";";
          if (reportFailures === 0) {
+
            advance(pos, 1);
            matchFailed("[0-9]");
+
           } else {
 +
            result1 = null;
 +
            if (reportFailures === 0) {
 +
              matchFailed("\";\"");
 +
            }
 
           }
 
           }
        }
+
          if (result1 !== null) {
        if (result1 !== null) {
+
            result2 = parse_S();
          result0 = [];
+
            result2 = result2 !== null ? result2 : "";
          while (result1 !== null) {
+
             if (result2 !== null) {
            result0.push(result1);
+
               result0 = [result0, result1, result2];
             if (/^[0-9]/.test(input.charAt(pos))) {
 
               result1 = input.charAt(pos);
 
              pos++;
 
 
             } else {
 
             } else {
               result1 = null;
+
               result0 = null;
               if (reportFailures === 0) {
+
               pos = clone(pos0);
                matchFailed("[0-9]");
 
              }
 
 
             }
 
             }
 +
          } else {
 +
            result0 = null;
 +
            pos = clone(pos0);
 
           }
 
           }
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
 +
          pos = clone(pos0);
 
         }
 
         }
         if (result0 !== null) {
+
          
           result0 = (function(offset, p) {return p.join("");})(pos0, result0);
+
        cache[cacheKey] = {
         }
+
           nextPos: clone(pos),
        if (result0 === null) {
+
          result:  result0
          pos = pos0;
+
         };
        }
+
         return result0;
         return result0;
 
 
       }
 
       }
 
        
 
        
       function parse_S() {
+
       function parse_Identifier() {
         var result0, result1, result2, result3, result4;
+
        var cacheKey = "Identifier@" + pos.offset;
 +
        var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 +
       
 +
         var result0, result1, result2;
 
         var pos0, pos1;
 
         var pos0, pos1;
 
          
 
          
         pos0 = pos;
+
         pos0 = clone(pos);
         result0 = [];
+
         pos1 = clone(pos);
         if (/^[ \t\n]/.test(input.charAt(pos))) {
+
         if (/^[a-z\xE4\xF6\xFC_]/.test(input.charAt(pos.offset))) {
           result1 = input.charAt(pos);
+
           result0 = input.charAt(pos.offset);
           pos++;
+
           advance(pos, 1);
 
         } else {
 
         } else {
           result1 = null;
+
           result0 = null;
 
           if (reportFailures === 0) {
 
           if (reportFailures === 0) {
             matchFailed("[ \\t\\n]");
+
             matchFailed("[a-z\\xE4\\xF6\\xFC_]");
          }
 
        }
 
        while (result1 !== null) {
 
          result0.push(result1);
 
          if (/^[ \t\n]/.test(input.charAt(pos))) {
 
            result1 = input.charAt(pos);
 
            pos++;
 
          } else {
 
            result1 = null;
 
            if (reportFailures === 0) {
 
              matchFailed("[ \\t\\n]");
 
            }
 
 
           }
 
           }
 
         }
 
         }
 
         if (result0 !== null) {
 
         if (result0 !== null) {
           if (input.substr(pos, 2) === "/*") {
+
          result1 = [];
             result1 = "/*";
+
           if (/^[a-z\xE4\xF6\xFC_]/.test(input.charAt(pos.offset))) {
             pos += 2;
+
             result2 = input.charAt(pos.offset);
 +
             advance(pos, 1);
 
           } else {
 
           } else {
             result1 = null;
+
             result2 = null;
 
             if (reportFailures === 0) {
 
             if (reportFailures === 0) {
               matchFailed("\"/*\"");
+
               matchFailed("[a-z\\xE4\\xF6\\xFC_]");
 
             }
 
             }
 
           }
 
           }
           if (result1 !== null) {
+
           while (result2 !== null) {
             result2 = [];
+
             result1.push(result2);
             if (/^[^*]/.test(input.charAt(pos))) {
+
             if (/^[a-z\xE4\xF6\xFC_]/.test(input.charAt(pos.offset))) {
               result3 = input.charAt(pos);
+
               result2 = input.charAt(pos.offset);
               pos++;
+
               advance(pos, 1);
 
             } else {
 
             } else {
               result3 = null;
+
               result2 = null;
 
               if (reportFailures === 0) {
 
               if (reportFailures === 0) {
                 matchFailed("[^*]");
+
                 matchFailed("[a-z\\xE4\\xF6\\xFC_]");
 
               }
 
               }
 
             }
 
             }
            if (result3 === null) {
+
          }
              pos1 = pos;
+
          if (result1 !== null) {
              if (/^[*]/.test(input.charAt(pos))) {
+
            result0 = [result0, result1];
                result3 = input.charAt(pos);
+
          } else {
                pos++;
+
            result0 = null;
              } else {
+
            pos = clone(pos1);
                result3 = null;
+
          }
                if (reportFailures === 0) {
+
        } else {
                  matchFailed("[*]");
+
          result0 = null;
                }
+
          pos = clone(pos1);
              }
+
        }
              if (result3 !== null) {
+
        if (result0 !== null) {
                if (/^[^\/]/.test(input.charAt(pos))) {
+
          result0 = (function(offset, line, column, i1, i2) {return i1+i2.join("");})(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]);
                  result4 = input.charAt(pos);
+
        }
                  pos++;
+
        if (result0 === null) {
                } else {
+
          pos = clone(pos0);
                  result4 = null;
+
        }
                  if (reportFailures === 0) {
+
       
                    matchFailed("[^\\/]");
+
        cache[cacheKey] = {
                  }
+
          nextPos: clone(pos),
                }
+
          result:  result0
                if (result4 !== null) {
+
        };
                  result3 = [result3, result4];
+
        return result0;
                } else {
+
      }
                  result3 = null;
+
     
                  pos = pos1;
+
      function parse_PageVirtual() {
                }
+
        var cacheKey = "PageVirtual@" + pos.offset;
              } else {
+
        var cachedResult = cache[cacheKey];
                result3 = null;
+
        if (cachedResult) {
                pos = pos1;
+
          pos = clone(cachedResult.nextPos);
              }
+
          return cachedResult.result;
            }
+
        }
            while (result3 !== null) {
+
       
              result2.push(result3);
+
        var result0, result1;
              if (/^[^*]/.test(input.charAt(pos))) {
+
        var pos0, pos1;
                result3 = input.charAt(pos);
+
       
                pos++;
+
        pos0 = clone(pos);
              } else {
+
        pos1 = clone(pos);
                result3 = null;
+
        if (input.charCodeAt(pos.offset) === 64) {
                if (reportFailures === 0) {
+
          result0 = "@";
                  matchFailed("[^*]");
+
          advance(pos, 1);
                }
+
        } else {
              }
+
          result0 = null;
              if (result3 === null) {
+
          if (reportFailures === 0) {
                pos1 = pos;
+
            matchFailed("\"@\"");
                if (/^[*]/.test(input.charAt(pos))) {
+
          }
                  result3 = input.charAt(pos);
+
        }
                  pos++;
+
        if (result0 !== null) {
                } else {
+
          result1 = parse_Identifier();
                  result3 = null;
+
          if (result1 !== null) {
                  if (reportFailures === 0) {
+
            result0 = [result0, result1];
                    matchFailed("[*]");
+
          } else {
                  }
+
            result0 = null;
                }
+
            pos = clone(pos1);
                if (result3 !== null) {
+
          }
                  if (/^[^\/]/.test(input.charAt(pos))) {
+
        } else {
                    result4 = input.charAt(pos);
+
          result0 = null;
                    pos++;
+
          pos = clone(pos1);
                  } else {
+
        }
                    result4 = null;
+
        if (result0 !== null) {
                    if (reportFailures === 0) {
+
          result0 = (function(offset, line, column, p, i) {return p+i;})(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]);
                      matchFailed("[^\\/]");
+
        }
                    }
+
        if (result0 === null) {
                  }
+
          pos = clone(pos0);
                  if (result4 !== null) {
+
        }
                    result3 = [result3, result4];
+
       
                  } else {
+
        cache[cacheKey] = {
                    result3 = null;
+
          nextPos: clone(pos),
                    pos = pos1;
+
          result:  result0
                  }
+
        };
                } else {
+
        return result0;
                  result3 = null;
+
      }
                  pos = pos1;
+
     
                }
+
      function parse_ItemVirtual() {
              }
+
        var cacheKey = "ItemVirtual@" + pos.offset;
            }
+
        var cachedResult = cache[cacheKey];
            if (result2 !== null) {
+
        if (cachedResult) {
              if (input.substr(pos, 2) === "*/") {
+
          pos = clone(cachedResult.nextPos);
                result3 = "*/";
+
          return cachedResult.result;
                pos += 2;
+
        }
              } else {
+
       
                result3 = null;
+
        var result0, result1;
                if (reportFailures === 0) {
+
        var pos0, pos1;
                  matchFailed("\"*/\"");
+
       
                }
+
        pos0 = clone(pos);
              }
+
        pos1 = clone(pos);
              if (result3 !== null) {
+
        if (input.charCodeAt(pos.offset) === 58) {
                result4 = parse_S();
+
          result0 = ":";
                result4 = result4 !== null ? result4 : "";
+
          advance(pos, 1);
                if (result4 !== null) {
+
        } else {
                  result0 = [result0, result1, result2, result3, result4];
+
          result0 = null;
                } else {
+
          if (reportFailures === 0) {
                  result0 = null;
+
            matchFailed("\":\"");
                  pos = pos0;
+
          }
                }
+
        }
              } else {
+
        if (result0 !== null) {
                result0 = null;
+
          result1 = parse_Identifier();
                pos = pos0;
+
          if (result1 !== null) {
              }
+
            result0 = [result0, result1];
            } else {
 
              result0 = null;
 
              pos = pos0;
 
            }
 
 
           } else {
 
           } else {
 
             result0 = null;
 
             result0 = null;
             pos = pos0;
+
             pos = clone(pos1);
 
           }
 
           }
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
           pos = pos0;
+
           pos = clone(pos1);
 +
        }
 +
        if (result0 !== null) {
 +
          result0 = (function(offset, line, column, p, i) {return p+i;})(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]);
 
         }
 
         }
 
         if (result0 === null) {
 
         if (result0 === null) {
           pos0 = pos;
+
           pos = clone(pos0);
          result0 = [];
+
        }
           if (/^[ \t\n]/.test(input.charAt(pos))) {
+
       
            result1 = input.charAt(pos);
+
        cache[cacheKey] = {
            pos++;
+
          nextPos: clone(pos),
          } else {
+
          result:  result0
            result1 = null;
+
        };
            if (reportFailures === 0) {
+
        return result0;
              matchFailed("[ \\t\\n]");
+
      }
            }
+
     
 +
      function parse_Page() {
 +
        var cacheKey = "Page@" + pos.offset;
 +
        var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
           return cachedResult.result;
 +
        }
 +
       
 +
        var result0, result1;
 +
        var pos0;
 +
       
 +
        pos0 = clone(pos);
 +
        if (/^[0-9]/.test(input.charAt(pos.offset))) {
 +
          result1 = input.charAt(pos.offset);
 +
          advance(pos, 1);
 +
        } else {
 +
          result1 = null;
 +
          if (reportFailures === 0) {
 +
            matchFailed("[0-9]");
 
           }
 
           }
 +
        }
 +
        if (result1 !== null) {
 +
          result0 = [];
 
           while (result1 !== null) {
 
           while (result1 !== null) {
 
             result0.push(result1);
 
             result0.push(result1);
             if (/^[ \t\n]/.test(input.charAt(pos))) {
+
             if (/^[0-9]/.test(input.charAt(pos.offset))) {
               result1 = input.charAt(pos);
+
               result1 = input.charAt(pos.offset);
               pos++;
+
               advance(pos, 1);
 
             } else {
 
             } else {
 
               result1 = null;
 
               result1 = null;
 
               if (reportFailures === 0) {
 
               if (reportFailures === 0) {
                 matchFailed("[ \\t\\n]");
+
                 matchFailed("[0-9]");
 
               }
 
               }
 
             }
 
             }
 
           }
 
           }
           if (result0 !== null) {
+
        } else {
            if (input.substr(pos, 2) === "//") {
+
           result0 = null;
              result1 = "//";
+
        }
              pos += 2;
+
        if (result0 !== null) {
            } else {
+
          result0 = (function(offset, line, column, p) {return p.join("");})(pos0.offset, pos0.line, pos0.column, result0);
              result1 = null;
+
        }
              if (reportFailures === 0) {
+
        if (result0 === null) {
                matchFailed("\"//\"");
+
          pos = clone(pos0);
              }
+
        }
            }
+
       
            if (result1 !== null) {
+
        cache[cacheKey] = {
              result2 = [];
+
          nextPos: clone(pos),
              if (/^[^\n]/.test(input.charAt(pos))) {
+
          result:  result0
                result3 = input.charAt(pos);
+
        };
                pos++;
+
        return result0;
              } else {
+
      }
                result3 = null;
+
     
                if (reportFailures === 0) {
+
      function parse_Time() {
                  matchFailed("[^\\n]");
+
        var cacheKey = "Time@" + pos.offset;
                }
+
        var cachedResult = cache[cacheKey];
              }
+
        if (cachedResult) {
              while (result3 !== null) {
+
          pos = clone(cachedResult.nextPos);
                result2.push(result3);
+
          return cachedResult.result;
                if (/^[^\n]/.test(input.charAt(pos))) {
+
        }
                  result3 = input.charAt(pos);
+
       
                  pos++;
+
        var result0, result1, result2;
                } else {
+
        var pos0, pos1;
                  result3 = null;
+
       
                  if (reportFailures === 0) {
+
        pos0 = clone(pos);
                    matchFailed("[^\\n]");
+
        pos1 = clone(pos);
                  }
+
        if (/^[1-9]/.test(input.charAt(pos.offset))) {
                }
+
          result0 = input.charAt(pos.offset);
              }
+
          advance(pos, 1);
              if (result2 !== null) {
+
        } else {
                if (/^[\n]/.test(input.charAt(pos))) {
+
          result0 = null;
                  result3 = input.charAt(pos);
+
          if (reportFailures === 0) {
                  pos++;
+
            matchFailed("[1-9]");
                } else {
+
          }
                  result3 = null;
+
        }
                  if (reportFailures === 0) {
+
        if (result0 !== null) {
                    matchFailed("[\\n]");
+
          result1 = [];
                  }
+
          if (/^[0-9]/.test(input.charAt(pos.offset))) {
                }
+
            result2 = input.charAt(pos.offset);
                if (result3 !== null) {
+
            advance(pos, 1);
                  result4 = parse_S();
+
          } else {
                  result4 = result4 !== null ? result4 : "";
+
            result2 = null;
                  if (result4 !== null) {
+
            if (reportFailures === 0) {
                    result0 = [result0, result1, result2, result3, result4];
+
              matchFailed("[0-9]");
                  } else {
 
                    result0 = null;
 
                    pos = pos0;
 
                  }
 
                } else {
 
                  result0 = null;
 
                  pos = pos0;
 
                }
 
              } else {
 
                result0 = null;
 
                pos = pos0;
 
              }
 
            } else {
 
              result0 = null;
 
              pos = pos0;
 
 
             }
 
             }
          } else {
 
            result0 = null;
 
            pos = pos0;
 
 
           }
 
           }
           if (result0 === null) {
+
           while (result2 !== null) {
             if (/^[ \t\n]/.test(input.charAt(pos))) {
+
            result1.push(result2);
               result1 = input.charAt(pos);
+
             if (/^[0-9]/.test(input.charAt(pos.offset))) {
               pos++;
+
               result2 = input.charAt(pos.offset);
 +
               advance(pos, 1);
 
             } else {
 
             } else {
               result1 = null;
+
               result2 = null;
 
               if (reportFailures === 0) {
 
               if (reportFailures === 0) {
                 matchFailed("[ \\t\\n]");
+
                 matchFailed("[0-9]");
 
               }
 
               }
 
             }
 
             }
            if (result1 !== null) {
 
              result0 = [];
 
              while (result1 !== null) {
 
                result0.push(result1);
 
                if (/^[ \t\n]/.test(input.charAt(pos))) {
 
                  result1 = input.charAt(pos);
 
                  pos++;
 
                } else {
 
                  result1 = null;
 
                  if (reportFailures === 0) {
 
                    matchFailed("[ \\t\\n]");
 
                  }
 
                }
 
              }
 
            } else {
 
              result0 = null;
 
            }
 
 
           }
 
           }
 +
          if (result1 !== null) {
 +
            result0 = [result0, result1];
 +
          } else {
 +
            result0 = null;
 +
            pos = clone(pos1);
 +
          }
 +
        } else {
 +
          result0 = null;
 +
          pos = clone(pos1);
 +
        }
 +
        if (result0 !== null) {
 +
          result0 = (function(offset, line, column, p, q) {return parseInt(p+q.join(""));})(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]);
 +
        }
 +
        if (result0 === null) {
 +
          pos = clone(pos0);
 
         }
 
         }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 
         return result0;
 
         return result0;
 
       }
 
       }
 
        
 
        
       function parse_String() {
+
       function parse_Overlay() {
         var result0, result1, result2;
+
         var cacheKey = "Overlay@" + pos.offset;
         var pos0, pos1;
+
         var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 
          
 
          
         pos0 = pos;
+
         var result0, result1;
         pos1 = pos;
+
        var pos0;
         if (input.charCodeAt(pos) === 39) {
+
          
           result0 = "'";
+
        pos0 = clone(pos);
           pos++;
+
         if (/^[a-z]/.test(input.charAt(pos.offset))) {
 +
           result1 = input.charAt(pos.offset);
 +
           advance(pos, 1);
 
         } else {
 
         } else {
           result0 = null;
+
           result1 = null;
 
           if (reportFailures === 0) {
 
           if (reportFailures === 0) {
             matchFailed("\"'\"");
+
             matchFailed("[a-z]");
 
           }
 
           }
 
         }
 
         }
         if (result0 !== null) {
+
         if (result1 !== null) {
           result1 = [];
+
           result0 = [];
          result2 = parse_SingleStringChar();
+
           while (result1 !== null) {
           while (result2 !== null) {
+
             result0.push(result1);
             result1.push(result2);
+
             if (/^[a-z]/.test(input.charAt(pos.offset))) {
             result2 = parse_SingleStringChar();
+
               result1 = input.charAt(pos.offset);
          }
+
               advance(pos, 1);
          if (result1 !== null) {
 
            if (input.charCodeAt(pos) === 39) {
 
               result2 = "'";
 
               pos++;
 
 
             } else {
 
             } else {
               result2 = null;
+
               result1 = null;
 
               if (reportFailures === 0) {
 
               if (reportFailures === 0) {
                 matchFailed("\"'\"");
+
                 matchFailed("[a-z]");
 
               }
 
               }
 
             }
 
             }
            if (result2 !== null) {
 
              result0 = [result0, result1, result2];
 
            } else {
 
              result0 = null;
 
              pos = pos1;
 
            }
 
          } else {
 
            result0 = null;
 
            pos = pos1;
 
 
           }
 
           }
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
          pos = pos1;
 
 
         }
 
         }
 
         if (result0 !== null) {
 
         if (result0 !== null) {
           result0 = (function(offset, s) { return s.join("");})(pos0, result0[1]);
+
           result0 = (function(offset, line, column, p) {return p.join("");})(pos0.offset, pos0.line, pos0.column, result0);
 
         }
 
         }
 
         if (result0 === null) {
 
         if (result0 === null) {
           pos = pos0;
+
           pos = clone(pos0);
 
         }
 
         }
         if (result0 === null) {
+
          
           pos0 = pos;
+
        cache[cacheKey] = {
           pos1 = pos;
+
          nextPos: clone(pos),
          if (input.charCodeAt(pos) === 34) {
+
          result:  result0
             result0 = "\"";
+
        };
             pos++;
+
        return result0;
 +
      }
 +
     
 +
      function parse_S() {
 +
        var cacheKey = "S@" + pos.offset;
 +
        var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
           pos = clone(cachedResult.nextPos);
 +
           return cachedResult.result;
 +
        }
 +
       
 +
        var result0, result1, result2, result3, result4;
 +
        var pos0, pos1;
 +
       
 +
        pos0 = clone(pos);
 +
        result0 = [];
 +
        if (/^[ \t\n]/.test(input.charAt(pos.offset))) {
 +
          result1 = input.charAt(pos.offset);
 +
          advance(pos, 1);
 +
        } else {
 +
          result1 = null;
 +
          if (reportFailures === 0) {
 +
             matchFailed("[ \\t\\n]");
 +
          }
 +
        }
 +
        while (result1 !== null) {
 +
          result0.push(result1);
 +
          if (/^[ \t\n]/.test(input.charAt(pos.offset))) {
 +
            result1 = input.charAt(pos.offset);
 +
             advance(pos, 1);
 
           } else {
 
           } else {
             result0 = null;
+
             result1 = null;
 
             if (reportFailures === 0) {
 
             if (reportFailures === 0) {
               matchFailed("\"\\\"\"");
+
               matchFailed("[ \\t\\n]");
 
             }
 
             }
 
           }
 
           }
          if (result0 !== null) {
+
        }
             result1 = [];
+
        if (result0 !== null) {
             result2 = parse_DoubleStringChar();
+
          if (input.substr(pos.offset, 2) === "/*") {
             while (result2 !== null) {
+
             result1 = "/*";
               result1.push(result2);
+
            advance(pos, 2);
               result2 = parse_DoubleStringChar();
+
          } else {
 +
            result1 = null;
 +
             if (reportFailures === 0) {
 +
              matchFailed("\"/*\"");
 +
             }
 +
          }
 +
          if (result1 !== null) {
 +
            result2 = [];
 +
            if (/^[^*]/.test(input.charAt(pos.offset))) {
 +
               result3 = input.charAt(pos.offset);
 +
              advance(pos, 1);
 +
            } else {
 +
              result3 = null;
 +
               if (reportFailures === 0) {
 +
                matchFailed("[^*]");
 +
              }
 
             }
 
             }
             if (result1 !== null) {
+
             if (result3 === null) {
               if (input.charCodeAt(pos) === 34) {
+
              pos1 = clone(pos);
                 result2 = "\"";
+
               if (/^[*]/.test(input.charAt(pos.offset))) {
                 pos++;
+
                 result3 = input.charAt(pos.offset);
 +
                 advance(pos, 1);
 
               } else {
 
               } else {
                 result2 = null;
+
                 result3 = null;
 
                 if (reportFailures === 0) {
 
                 if (reportFailures === 0) {
                   matchFailed("\"\\\"\"");
+
                   matchFailed("[*]");
 +
                }
 +
              }
 +
              if (result3 !== null) {
 +
                if (/^[^\/]/.test(input.charAt(pos.offset))) {
 +
                  result4 = input.charAt(pos.offset);
 +
                  advance(pos, 1);
 +
                } else {
 +
                  result4 = null;
 +
                  if (reportFailures === 0) {
 +
                    matchFailed("[^\\/]");
 +
                  }
 +
                }
 +
                if (result4 !== null) {
 +
                  result3 = [result3, result4];
 +
                } else {
 +
                  result3 = null;
 +
                  pos = clone(pos1);
 
                 }
 
                 }
 +
              } else {
 +
                result3 = null;
 +
                pos = clone(pos1);
 
               }
 
               }
               if (result2 !== null) {
+
            }
                 result0 = [result0, result1, result2];
+
            while (result3 !== null) {
 +
              result2.push(result3);
 +
              if (/^[^*]/.test(input.charAt(pos.offset))) {
 +
                result3 = input.charAt(pos.offset);
 +
                advance(pos, 1);
 +
              } else {
 +
                result3 = null;
 +
                if (reportFailures === 0) {
 +
                  matchFailed("[^*]");
 +
                }
 +
              }
 +
              if (result3 === null) {
 +
                pos1 = clone(pos);
 +
                if (/^[*]/.test(input.charAt(pos.offset))) {
 +
                  result3 = input.charAt(pos.offset);
 +
                  advance(pos, 1);
 +
                } else {
 +
                  result3 = null;
 +
                  if (reportFailures === 0) {
 +
                    matchFailed("[*]");
 +
                  }
 +
                }
 +
                if (result3 !== null) {
 +
                  if (/^[^\/]/.test(input.charAt(pos.offset))) {
 +
                    result4 = input.charAt(pos.offset);
 +
                    advance(pos, 1);
 +
                  } else {
 +
                    result4 = null;
 +
                    if (reportFailures === 0) {
 +
                      matchFailed("[^\\/]");
 +
                    }
 +
                  }
 +
                  if (result4 !== null) {
 +
                    result3 = [result3, result4];
 +
                  } else {
 +
                    result3 = null;
 +
                    pos = clone(pos1);
 +
                  }
 +
                } else {
 +
                  result3 = null;
 +
                  pos = clone(pos1);
 +
                }
 +
              }
 +
            }
 +
            if (result2 !== null) {
 +
              if (input.substr(pos.offset, 2) === "*/") {
 +
                result3 = "*/";
 +
                advance(pos, 2);
 +
              } else {
 +
                result3 = null;
 +
                if (reportFailures === 0) {
 +
                  matchFailed("\"*/\"");
 +
                }
 +
              }
 +
              if (result3 !== null) {
 +
                result4 = parse_S();
 +
                result4 = result4 !== null ? result4 : "";
 +
                if (result4 !== null) {
 +
                  result0 = [result0, result1, result2, result3, result4];
 +
                } else {
 +
                  result0 = null;
 +
                  pos = clone(pos0);
 +
                }
 +
              } else {
 +
                result0 = null;
 +
                pos = clone(pos0);
 +
              }
 +
            } else {
 +
              result0 = null;
 +
              pos = clone(pos0);
 +
            }
 +
          } else {
 +
            result0 = null;
 +
            pos = clone(pos0);
 +
          }
 +
        } else {
 +
          result0 = null;
 +
          pos = clone(pos0);
 +
        }
 +
        if (result0 === null) {
 +
          pos0 = clone(pos);
 +
          result0 = [];
 +
          if (/^[ \t\n]/.test(input.charAt(pos.offset))) {
 +
            result1 = input.charAt(pos.offset);
 +
            advance(pos, 1);
 +
          } else {
 +
            result1 = null;
 +
            if (reportFailures === 0) {
 +
              matchFailed("[ \\t\\n]");
 +
            }
 +
          }
 +
          while (result1 !== null) {
 +
            result0.push(result1);
 +
            if (/^[ \t\n]/.test(input.charAt(pos.offset))) {
 +
              result1 = input.charAt(pos.offset);
 +
              advance(pos, 1);
 +
            } else {
 +
              result1 = null;
 +
              if (reportFailures === 0) {
 +
                matchFailed("[ \\t\\n]");
 +
              }
 +
            }
 +
          }
 +
          if (result0 !== null) {
 +
            if (input.substr(pos.offset, 2) === "//") {
 +
              result1 = "//";
 +
              advance(pos, 2);
 +
            } else {
 +
              result1 = null;
 +
              if (reportFailures === 0) {
 +
                matchFailed("\"//\"");
 +
              }
 +
            }
 +
            if (result1 !== null) {
 +
              result2 = [];
 +
              if (/^[^\n]/.test(input.charAt(pos.offset))) {
 +
                result3 = input.charAt(pos.offset);
 +
                advance(pos, 1);
 +
              } else {
 +
                result3 = null;
 +
                if (reportFailures === 0) {
 +
                  matchFailed("[^\\n]");
 +
                }
 +
              }
 +
              while (result3 !== null) {
 +
                result2.push(result3);
 +
                if (/^[^\n]/.test(input.charAt(pos.offset))) {
 +
                  result3 = input.charAt(pos.offset);
 +
                  advance(pos, 1);
 +
                } else {
 +
                  result3 = null;
 +
                  if (reportFailures === 0) {
 +
                    matchFailed("[^\\n]");
 +
                  }
 +
                }
 +
               }
 +
              if (result2 !== null) {
 +
                result3 = parse_S();
 +
                result3 = result3 !== null ? result3 : "";
 +
                if (result3 !== null) {
 +
                  result0 = [result0, result1, result2, result3];
 +
                } else {
 +
                  result0 = null;
 +
                  pos = clone(pos0);
 +
                }
 +
              } else {
 +
                result0 = null;
 +
                pos = clone(pos0);
 +
              }
 +
            } else {
 +
              result0 = null;
 +
              pos = clone(pos0);
 +
            }
 +
          } else {
 +
            result0 = null;
 +
            pos = clone(pos0);
 +
          }
 +
          if (result0 === null) {
 +
            if (/^[ \t\n]/.test(input.charAt(pos.offset))) {
 +
              result1 = input.charAt(pos.offset);
 +
              advance(pos, 1);
 +
            } else {
 +
              result1 = null;
 +
              if (reportFailures === 0) {
 +
                matchFailed("[ \\t\\n]");
 +
              }
 +
            }
 +
            if (result1 !== null) {
 +
              result0 = [];
 +
              while (result1 !== null) {
 +
                result0.push(result1);
 +
                if (/^[ \t\n]/.test(input.charAt(pos.offset))) {
 +
                  result1 = input.charAt(pos.offset);
 +
                  advance(pos, 1);
 +
                } else {
 +
                  result1 = null;
 +
                  if (reportFailures === 0) {
 +
                    matchFailed("[ \\t\\n]");
 +
                  }
 +
                 }
 +
              }
 +
            } else {
 +
              result0 = null;
 +
            }
 +
          }
 +
        }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 +
        return result0;
 +
      }
 +
     
 +
      function parse_String() {
 +
        var cacheKey = "String@" + pos.offset;
 +
        var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 +
       
 +
        var result0, result1, result2;
 +
        var pos0, pos1;
 +
       
 +
        pos0 = clone(pos);
 +
        pos1 = clone(pos);
 +
        if (input.charCodeAt(pos.offset) === 39) {
 +
          result0 = "'";
 +
          advance(pos, 1);
 +
        } else {
 +
          result0 = null;
 +
          if (reportFailures === 0) {
 +
            matchFailed("\"'\"");
 +
          }
 +
        }
 +
        if (result0 !== null) {
 +
          result1 = [];
 +
          result2 = parse_SingleStringChar();
 +
          while (result2 !== null) {
 +
            result1.push(result2);
 +
            result2 = parse_SingleStringChar();
 +
          }
 +
          if (result1 !== null) {
 +
            if (input.charCodeAt(pos.offset) === 39) {
 +
              result2 = "'";
 +
              advance(pos, 1);
 +
            } else {
 +
              result2 = null;
 +
              if (reportFailures === 0) {
 +
                matchFailed("\"'\"");
 +
              }
 +
            }
 +
            if (result2 !== null) {
 +
              result0 = [result0, result1, result2];
 +
            } else {
 +
              result0 = null;
 +
              pos = clone(pos1);
 +
            }
 +
          } else {
 +
            result0 = null;
 +
            pos = clone(pos1);
 +
          }
 +
        } else {
 +
          result0 = null;
 +
          pos = clone(pos1);
 +
        }
 +
        if (result0 !== null) {
 +
          result0 = (function(offset, line, column, s) { return s.join("");})(pos0.offset, pos0.line, pos0.column, result0[1]);
 +
        }
 +
        if (result0 === null) {
 +
          pos = clone(pos0);
 +
        }
 +
        if (result0 === null) {
 +
          pos0 = clone(pos);
 +
          pos1 = clone(pos);
 +
          if (input.charCodeAt(pos.offset) === 34) {
 +
            result0 = "\"";
 +
            advance(pos, 1);
 +
          } else {
 +
            result0 = null;
 +
            if (reportFailures === 0) {
 +
              matchFailed("\"\\\"\"");
 +
            }
 +
          }
 +
          if (result0 !== null) {
 +
            result1 = [];
 +
            result2 = parse_DoubleStringChar();
 +
            while (result2 !== null) {
 +
              result1.push(result2);
 +
              result2 = parse_DoubleStringChar();
 +
            }
 +
            if (result1 !== null) {
 +
              if (input.charCodeAt(pos.offset) === 34) {
 +
                result2 = "\"";
 +
                advance(pos, 1);
 +
              } else {
 +
                result2 = null;
 +
                if (reportFailures === 0) {
 +
                  matchFailed("\"\\\"\"");
 +
                }
 +
              }
 +
              if (result2 !== null) {
 +
                result0 = [result0, result1, result2];
 +
              } else {
 +
                result0 = null;
 +
                pos = clone(pos1);
 +
              }
 +
            } else {
 +
              result0 = null;
 +
              pos = clone(pos1);
 +
            }
 +
          } else {
 +
            result0 = null;
 +
            pos = clone(pos1);
 +
          }
 +
          if (result0 !== null) {
 +
            result0 = (function(offset, line, column, s) { return s.join("");})(pos0.offset, pos0.line, pos0.column, result0[1]);
 +
          }
 +
          if (result0 === null) {
 +
            pos = clone(pos0);
 +
          }
 +
        }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 +
        return result0;
 +
      }
 +
     
 +
      function parse_SingleStringChar() {
 +
        var cacheKey = "SingleStringChar@" + pos.offset;
 +
        var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 +
       
 +
        var result0;
 +
       
 +
        result0 = parse_EscapeSequence();
 +
        if (result0 === null) {
 +
          if (/^[^']/.test(input.charAt(pos.offset))) {
 +
            result0 = input.charAt(pos.offset);
 +
            advance(pos, 1);
 +
          } else {
 +
            result0 = null;
 +
            if (reportFailures === 0) {
 +
              matchFailed("[^']");
 +
            }
 +
          }
 +
        }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 +
        return result0;
 +
      }
 +
     
 +
      function parse_DoubleStringChar() {
 +
        var cacheKey = "DoubleStringChar@" + pos.offset;
 +
        var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 +
       
 +
        var result0;
 +
       
 +
        result0 = parse_EscapeSequence();
 +
        if (result0 === null) {
 +
          if (/^[^"]/.test(input.charAt(pos.offset))) {
 +
            result0 = input.charAt(pos.offset);
 +
            advance(pos, 1);
 +
          } else {
 +
            result0 = null;
 +
            if (reportFailures === 0) {
 +
              matchFailed("[^\"]");
 +
            }
 +
          }
 +
        }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 +
        return result0;
 +
      }
 +
     
 +
      function parse_EscapeSequence() {
 +
        var cacheKey = "EscapeSequence@" + pos.offset;
 +
        var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 +
       
 +
        var result0;
 +
        var pos0;
 +
       
 +
        pos0 = clone(pos);
 +
        if (input.substr(pos.offset, 2) === "\\n") {
 +
          result0 = "\\n";
 +
          advance(pos, 2);
 +
        } else {
 +
          result0 = null;
 +
          if (reportFailures === 0) {
 +
            matchFailed("\"\\\\n\"");
 +
          }
 +
        }
 +
        if (result0 !== null) {
 +
          result0 = (function(offset, line, column) {return "\n";})(pos0.offset, pos0.line, pos0.column);
 +
        }
 +
        if (result0 === null) {
 +
          pos = clone(pos0);
 +
        }
 +
        if (result0 === null) {
 +
          pos0 = clone(pos);
 +
          if (input.substr(pos.offset, 2) === "\\\"") {
 +
            result0 = "\\\"";
 +
            advance(pos, 2);
 +
          } else {
 +
            result0 = null;
 +
            if (reportFailures === 0) {
 +
              matchFailed("\"\\\\\\\"\"");
 +
            }
 +
          }
 +
          if (result0 !== null) {
 +
            result0 = (function(offset, line, column) {return '"';})(pos0.offset, pos0.line, pos0.column);
 +
          }
 +
          if (result0 === null) {
 +
            pos = clone(pos0);
 +
          }
 +
          if (result0 === null) {
 +
            pos0 = clone(pos);
 +
            if (input.substr(pos.offset, 2) === "\\'") {
 +
              result0 = "\\'";
 +
              advance(pos, 2);
 +
            } else {
 +
              result0 = null;
 +
              if (reportFailures === 0) {
 +
                matchFailed("\"\\\\'\"");
 +
              }
 +
            }
 +
            if (result0 !== null) {
 +
              result0 = (function(offset, line, column) {return "'";})(pos0.offset, pos0.line, pos0.column);
 +
            }
 +
            if (result0 === null) {
 +
              pos = clone(pos0);
 +
            }
 +
          }
 +
        }
 +
       
 +
        cache[cacheKey] = {
 +
          nextPos: clone(pos),
 +
          result:  result0
 +
        };
 +
        return result0;
 +
      }
 +
     
 +
      function parse_End() {
 +
        var cacheKey = "End@" + pos.offset;
 +
        var cachedResult = cache[cacheKey];
 +
        if (cachedResult) {
 +
          pos = clone(cachedResult.nextPos);
 +
          return cachedResult.result;
 +
        }
 +
       
 +
        var result0, result1, result2, result3;
 +
        var pos0;
 +
       
 +
        pos0 = clone(pos);
 +
        if (input.substr(pos.offset, 3) === "end") {
 +
          result0 = "end";
 +
          advance(pos, 3);
 +
        } else {
 +
          result0 = null;
 +
          if (reportFailures === 0) {
 +
            matchFailed("\"end\"");
 +
          }
 +
        }
 +
        if (result0 !== null) {
 +
          result1 = parse_S();
 +
          result1 = result1 !== null ? result1 : "";
 +
          if (result1 !== null) {
 +
            if (input.charCodeAt(pos.offset) === 46) {
 +
              result2 = ".";
 +
              advance(pos, 1);
 +
            } else {
 +
              result2 = null;
 +
              if (reportFailures === 0) {
 +
                matchFailed("\".\"");
 +
              }
 +
            }
 +
            if (result2 !== null) {
 +
              result3 = parse_S();
 +
              result3 = result3 !== null ? result3 : "";
 +
              if (result3 !== null) {
 +
                result0 = [result0, result1, result2, result3];
 
               } else {
 
               } else {
 
                 result0 = null;
 
                 result0 = null;
                 pos = pos1;
+
                 pos = clone(pos0);
 
               }
 
               }
 
             } else {
 
             } else {
 
               result0 = null;
 
               result0 = null;
               pos = pos1;
+
               pos = clone(pos0);
            }
 
          } else {
 
            result0 = null;
 
            pos = pos1;
 
          }
 
          if (result0 !== null) {
 
            result0 = (function(offset, s) { return s.join("");})(pos0, result0[1]);
 
          }
 
          if (result0 === null) {
 
            pos = pos0;
 
          }
 
        }
 
        return result0;
 
      }
 
     
 
      function parse_SingleStringChar() {
 
        var result0;
 
       
 
        result0 = parse_EscapeSequence();
 
        if (result0 === null) {
 
          if (/^[^']/.test(input.charAt(pos))) {
 
            result0 = input.charAt(pos);
 
            pos++;
 
          } else {
 
            result0 = null;
 
            if (reportFailures === 0) {
 
              matchFailed("[^']");
 
 
             }
 
             }
          }
 
        }
 
        return result0;
 
      }
 
     
 
      function parse_DoubleStringChar() {
 
        var result0;
 
       
 
        result0 = parse_EscapeSequence();
 
        if (result0 === null) {
 
          if (/^[^"]/.test(input.charAt(pos))) {
 
            result0 = input.charAt(pos);
 
            pos++;
 
 
           } else {
 
           } else {
 
             result0 = null;
 
             result0 = null;
             if (reportFailures === 0) {
+
             pos = clone(pos0);
              matchFailed("[^\"]");
 
            }
 
 
           }
 
           }
        }
 
        return result0;
 
      }
 
     
 
      function parse_EscapeSequence() {
 
        var result0;
 
        var pos0;
 
       
 
        pos0 = pos;
 
        if (input.substr(pos, 2) === "\\n") {
 
          result0 = "\\n";
 
          pos += 2;
 
 
         } else {
 
         } else {
 
           result0 = null;
 
           result0 = null;
          if (reportFailures === 0) {
+
           pos = clone(pos0);
            matchFailed("\"\\\\n\"");
 
          }
 
        }
 
        if (result0 !== null) {
 
          result0 = (function(offset) {return "\n";})(pos0);
 
        }
 
        if (result0 === null) {
 
           pos = pos0;
 
        }
 
        if (result0 === null) {
 
          pos0 = pos;
 
          if (input.substr(pos, 2) === "\\\"") {
 
            result0 = "\\\"";
 
            pos += 2;
 
          } else {
 
            result0 = null;
 
            if (reportFailures === 0) {
 
              matchFailed("\"\\\\\\\"\"");
 
            }
 
          }
 
          if (result0 !== null) {
 
            result0 = (function(offset) {return '"';})(pos0);
 
          }
 
          if (result0 === null) {
 
            pos = pos0;
 
          }
 
          if (result0 === null) {
 
            pos0 = pos;
 
            if (input.substr(pos, 2) === "\\'") {
 
              result0 = "\\'";
 
              pos += 2;
 
            } else {
 
              result0 = null;
 
              if (reportFailures === 0) {
 
                matchFailed("\"\\\\'\"");
 
              }
 
            }
 
            if (result0 !== null) {
 
              result0 = (function(offset) {return "'";})(pos0);
 
            }
 
            if (result0 === null) {
 
              pos = pos0;
 
            }
 
          }
 
 
         }
 
         }
        return result0;
 
      }
 
     
 
      function parse_End() {
 
        var result0, result1, result2, result3;
 
        var pos0;
 
 
          
 
          
         pos0 = pos;
+
         cache[cacheKey] = {
        if (input.substr(pos, 3) === "end") {
+
           nextPos: clone(pos),
          result0 = "end";
+
           result:  result0
          pos += 3;
+
         };
        } else {
 
          result0 = null;
 
          if (reportFailures === 0) {
 
            matchFailed("\"end\"");
 
          }
 
        }
 
        if (result0 !== null) {
 
           result1 = parse_S();
 
          result1 = result1 !== null ? result1 : "";
 
          if (result1 !== null) {
 
            if (input.charCodeAt(pos) === 46) {
 
              result2 = ".";
 
              pos++;
 
            } else {
 
              result2 = null;
 
              if (reportFailures === 0) {
 
                matchFailed("\".\"");
 
              }
 
            }
 
            if (result2 !== null) {
 
              result3 = parse_S();
 
              result3 = result3 !== null ? result3 : "";
 
              if (result3 !== null) {
 
                result0 = [result0, result1, result2, result3];
 
              } else {
 
                result0 = null;
 
                pos = pos0;
 
              }
 
            } else {
 
              result0 = null;
 
              pos = pos0;
 
            }
 
           } else {
 
            result0 = null;
 
            pos = pos0;
 
          }
 
         } else {
 
          result0 = null;
 
          pos = pos0;
 
        }
 
 
         return result0;
 
         return result0;
 
       }
 
       }
Zeile 2.689: Zeile 3.861:
 
       }
 
       }
 
        
 
        
      function computeErrorPosition() {
 
        /*
 
        * The first idea was to use |String.split| to break the input up to the
 
        * error position along newlines and derive the line and column from
 
        * there. However IE's |split| implementation is so broken that it was
 
        * enough to prevent it.
 
        */
 
       
 
        var line = 1;
 
        var column = 1;
 
        var seenCR = false;
 
       
 
        for (var i = 0; i < Math.max(pos, rightmostFailuresPos); i++) {
 
          var ch = input.charAt(i);
 
          if (ch === "\n") {
 
            if (!seenCR) { line++; }
 
            column = 1;
 
            seenCR = false;
 
          } else if (ch === "\r" || ch === "\u2028" || ch === "\u2029") {
 
            line++;
 
            column = 1;
 
            seenCR = true;
 
          } else {
 
            column++;
 
            seenCR = false;
 
          }
 
        }
 
       
 
        return { line: line, column: column };
 
      }
 
 
        
 
        
 
        
 
        
Zeile 2.729: Zeile 3.871:
 
       *
 
       *
 
       *    - |result !== null|
 
       *    - |result !== null|
       *    - |pos === input.length|
+
       *    - |pos.offset === input.length|
 
       *    - |rightmostFailuresExpected| may or may not contain something
 
       *    - |rightmostFailuresExpected| may or may not contain something
 
       *
 
       *
Zeile 2.735: Zeile 3.877:
 
       *
 
       *
 
       *    - |result !== null|
 
       *    - |result !== null|
       *    - |pos < input.length|
+
       *    - |pos.offset < input.length|
 
       *    - |rightmostFailuresExpected| may or may not contain something
 
       *    - |rightmostFailuresExpected| may or may not contain something
 
       *
 
       *
Zeile 2.741: Zeile 3.883:
 
       *
 
       *
 
       *  - |result === null|
 
       *  - |result === null|
       *  - |pos === 0|
+
       *  - |pos.offset === 0|
 
       *  - |rightmostFailuresExpected| contains at least one failure
 
       *  - |rightmostFailuresExpected| contains at least one failure
 
       *
 
       *
Zeile 2.747: Zeile 3.889:
 
       * handle these states.
 
       * handle these states.
 
       */
 
       */
       if (result === null || pos !== input.length) {
+
       if (result === null || pos.offset !== input.length) {
         var offset = Math.max(pos, rightmostFailuresPos);
+
         var offset = Math.max(pos.offset, rightmostFailuresPos.offset);
 
         var found = offset < input.length ? input.charAt(offset) : null;
 
         var found = offset < input.length ? input.charAt(offset) : null;
         var errorPosition = computeErrorPosition();
+
         var errorPosition = pos.offset > rightmostFailuresPos.offset ? pos : rightmostFailuresPos;
 
          
 
          
 
         throw new this.SyntaxError(
 
         throw new this.SyntaxError(

Aktuelle Version vom 22. Juli 2015, 22:05 Uhr

if (window.a2 === undefined)
	window.a2 = {};
	
a2.parser = (function(){
  /*
   * Generated by PEG.js 0.7.0.
   *
   * http://pegjs.majda.cz/
   */
  
  function quote(s) {
    /*
     * ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a
     * string literal except for the closing quote character, backslash,
     * carriage return, line separator, paragraph separator, and line feed.
     * Any character may appear in the form of an escape sequence.
     *
     * For portability, we also escape escape all control and non-ASCII
     * characters. Note that "\0" and "\v" escape sequences are not used
     * because JSHint does not like the first and IE the second.
     */
     return '"' + s
      .replace(/\\/g, '\\\\')  // backslash
      .replace(/"/g, '\\"')    // closing quote character
      .replace(/\x08/g, '\\b') // backspace
      .replace(/\t/g, '\\t')   // horizontal tab
      .replace(/\n/g, '\\n')   // line feed
      .replace(/\f/g, '\\f')   // form feed
      .replace(/\r/g, '\\r')   // carriage return
      .replace(/[\x00-\x07\x0B\x0E-\x1F\x80-\uFFFF]/g, escape)
      + '"';
  }
  
  var result = {
    /*
     * Parses the input with a generated parser. If the parsing is successfull,
     * returns a value explicitly or implicitly specified by the grammar from
     * which the parser was generated (see |PEG.buildParser|). If the parsing is
     * unsuccessful, throws |PEG.parser.SyntaxError| describing the error.
     */
    parse: function(input, startRule) {
      var parseFunctions = {
        "start": parse_start,
        "Declaration": parse_Declaration,
        "EventDec": parse_EventDec,
        "TriggerClause": parse_TriggerClause,
        "TriggerFunctions": parse_TriggerFunctions,
        "TriggerFunction": parse_TriggerFunction,
        "TriggerPageOrVirtOp": parse_TriggerPageOrVirtOp,
        "TriggerItemOrVirtOp": parse_TriggerItemOrVirtOp,
        "ConditionClause": parse_ConditionClause,
        "ConditionFunction": parse_ConditionFunction,
        "ConditionArgs": parse_ConditionArgs,
        "ActionClause": parse_ActionClause,
        "ActionFunctions": parse_ActionFunctions,
        "ActionFunction": parse_ActionFunction,
        "Channel": parse_Channel,
        "PageDec": parse_PageDec,
        "PageVirtualClause": parse_PageVirtualClause,
        "PageVirtualList": parse_PageVirtualList,
        "ItemDec": parse_ItemDec,
        "TitleClause": parse_TitleClause,
        "ItemVirtualClause": parse_ItemVirtualClause,
        "ItemVirtualList": parse_ItemVirtualList,
        "StringKwArgClause": parse_StringKwArgClause,
        "StringKwArg": parse_StringKwArg,
        "L": parse_L,
        "R": parse_R,
        "C": parse_C,
        "CC": parse_CC,
        "Identifier": parse_Identifier,
        "PageVirtual": parse_PageVirtual,
        "ItemVirtual": parse_ItemVirtual,
        "Page": parse_Page,
        "Time": parse_Time,
        "Overlay": parse_Overlay,
        "S": parse_S,
        "String": parse_String,
        "SingleStringChar": parse_SingleStringChar,
        "DoubleStringChar": parse_DoubleStringChar,
        "EscapeSequence": parse_EscapeSequence,
        "End": parse_End
      };
      
      if (startRule !== undefined) {
        if (parseFunctions[startRule] === undefined) {
          throw new Error("Invalid rule name: " + quote(startRule) + ".");
        }
      } else {
        startRule = "start";
      }
      
      var pos = { offset: 0, line: 1, column: 1, seenCR: false };
      var reportFailures = 0;
      var rightmostFailuresPos = { offset: 0, line: 1, column: 1, seenCR: false };
      var rightmostFailuresExpected = [];
      var cache = {};
      
      function padLeft(input, padding, length) {
        var result = input;
        
        var padLength = length - input.length;
        for (var i = 0; i < padLength; i++) {
          result = padding + result;
        }
        
        return result;
      }
      
      function escape(ch) {
        var charCode = ch.charCodeAt(0);
        var escapeChar;
        var length;
        
        if (charCode <= 0xFF) {
          escapeChar = 'x';
          length = 2;
        } else {
          escapeChar = 'u';
          length = 4;
        }
        
        return '\\' + escapeChar + padLeft(charCode.toString(16).toUpperCase(), '0', length);
      }
      
      function clone(object) {
        var result = {};
        for (var key in object) {
          result[key] = object[key];
        }
        return result;
      }
      
      function advance(pos, n) {
        var endOffset = pos.offset + n;
        
        for (var offset = pos.offset; offset < endOffset; offset++) {
          var ch = input.charAt(offset);
          if (ch === "\n") {
            if (!pos.seenCR) { pos.line++; }
            pos.column = 1;
            pos.seenCR = false;
          } else if (ch === "\r" || ch === "\u2028" || ch === "\u2029") {
            pos.line++;
            pos.column = 1;
            pos.seenCR = true;
          } else {
            pos.column++;
            pos.seenCR = false;
          }
        }
        
        pos.offset += n;
      }
      
      function matchFailed(failure) {
        if (pos.offset < rightmostFailuresPos.offset) {
          return;
        }
        
        if (pos.offset > rightmostFailuresPos.offset) {
          rightmostFailuresPos = clone(pos);
          rightmostFailuresExpected = [];
        }
        
        rightmostFailuresExpected.push(failure);
      }
      
      function parse_start() {
        var cacheKey = "start@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1, result2;
        var pos0, pos1;
        
        pos0 = clone(pos);
        pos1 = clone(pos);
        result0 = parse_S();
        result0 = result0 !== null ? result0 : "";
        if (result0 !== null) {
          result1 = [];
          result2 = parse_Declaration();
          while (result2 !== null) {
            result1.push(result2);
            result2 = parse_Declaration();
          }
          if (result1 !== null) {
            result0 = [result0, result1];
          } else {
            result0 = null;
            pos = clone(pos1);
          }
        } else {
          result0 = null;
          pos = clone(pos1);
        }
        if (result0 !== null) {
          result0 = (function(offset, line, column, d) {return d;})(pos0.offset, pos0.line, pos0.column, result0[1]);
        }
        if (result0 === null) {
          pos = clone(pos0);
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_Declaration() {
        var cacheKey = "Declaration@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0;
        
        result0 = parse_EventDec();
        if (result0 === null) {
          result0 = parse_PageDec();
          if (result0 === null) {
            result0 = parse_ItemDec();
          }
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_EventDec() {
        var cacheKey = "EventDec@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1, result2, result3, result4, result5, result6, result7, result8;
        var pos0, pos1, pos2;
        
        pos0 = clone(pos);
        pos1 = clone(pos);
        result0 = parse_S();
        result0 = result0 !== null ? result0 : "";
        if (result0 !== null) {
          if (input.substr(pos.offset, 5) === "event") {
            result1 = "event";
            advance(pos, 5);
          } else {
            result1 = null;
            if (reportFailures === 0) {
              matchFailed("\"event\"");
            }
          }
          if (result1 !== null) {
            pos2 = clone(pos);
            result2 = parse_S();
            if (result2 !== null) {
              result3 = parse_Identifier();
              if (result3 !== null) {
                result2 = [result2, result3];
              } else {
                result2 = null;
                pos = clone(pos2);
              }
            } else {
              result2 = null;
              pos = clone(pos2);
            }
            result2 = result2 !== null ? result2 : "";
            if (result2 !== null) {
              result3 = parse_CC();
              if (result3 !== null) {
                result4 = parse_TriggerClause();
                if (result4 !== null) {
                  result5 = parse_ConditionClause();
                  result5 = result5 !== null ? result5 : "";
                  if (result5 !== null) {
                    result6 = parse_ActionClause();
                    result6 = result6 !== null ? result6 : "";
                    if (result6 !== null) {
                      result7 = parse_End();
                      if (result7 !== null) {
                        result8 = parse_S();
                        result8 = result8 !== null ? result8 : "";
                        if (result8 !== null) {
                          result0 = [result0, result1, result2, result3, result4, result5, result6, result7, result8];
                        } else {
                          result0 = null;
                          pos = clone(pos1);
                        }
                      } else {
                        result0 = null;
                        pos = clone(pos1);
                      }
                    } else {
                      result0 = null;
                      pos = clone(pos1);
                    }
                  } else {
                    result0 = null;
                    pos = clone(pos1);
                  }
                } else {
                  result0 = null;
                  pos = clone(pos1);
                }
              } else {
                result0 = null;
                pos = clone(pos1);
              }
            } else {
              result0 = null;
              pos = clone(pos1);
            }
          } else {
            result0 = null;
            pos = clone(pos1);
          }
        } else {
          result0 = null;
          pos = clone(pos1);
        }
        if (result0 !== null) {
          result0 = (function(offset, line, column, n, tr, co, ac) { return ["event", {name:n?n[1]:":anonymous:", trigger:tr, condition:(co?co:function(){return true;}), action:(ac?ac:function(){return true;})}]; })(pos0.offset, pos0.line, pos0.column, result0[2], result0[4], result0[5], result0[6]);
        }
        if (result0 === null) {
          pos = clone(pos0);
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_TriggerClause() {
        var cacheKey = "TriggerClause@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1, result2, result3, result4;
        var pos0, pos1;
        
        pos0 = clone(pos);
        pos1 = clone(pos);
        if (input.substr(pos.offset, 2) === "on") {
          result0 = "on";
          advance(pos, 2);
        } else {
          result0 = null;
          if (reportFailures === 0) {
            matchFailed("\"on\"");
          }
        }
        if (result0 !== null) {
          result1 = parse_S();
          if (result1 !== null) {
            result2 = parse_S();
            result2 = result2 !== null ? result2 : "";
            if (result2 !== null) {
              result3 = parse_TriggerFunctions();
              if (result3 !== null) {
                result4 = parse_CC();
                if (result4 !== null) {
                  result0 = [result0, result1, result2, result3, result4];
                } else {
                  result0 = null;
                  pos = clone(pos1);
                }
              } else {
                result0 = null;
                pos = clone(pos1);
              }
            } else {
              result0 = null;
              pos = clone(pos1);
            }
          } else {
            result0 = null;
            pos = clone(pos1);
          }
        } else {
          result0 = null;
          pos = clone(pos1);
        }
        if (result0 !== null) {
          result0 = (function(offset, line, column, tr) {return tr;})(pos0.offset, pos0.line, pos0.column, result0[3]);
        }
        if (result0 === null) {
          pos = clone(pos0);
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_TriggerFunctions() {
        var cacheKey = "TriggerFunctions@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1, result2;
        var pos0, pos1;
        
        pos0 = clone(pos);
        pos1 = clone(pos);
        result0 = parse_TriggerFunction();
        if (result0 !== null) {
          result1 = parse_C();
          if (result1 !== null) {
            result2 = parse_TriggerFunctions();
            if (result2 !== null) {
              result0 = [result0, result1, result2];
            } else {
              result0 = null;
              pos = clone(pos1);
            }
          } else {
            result0 = null;
            pos = clone(pos1);
          }
        } else {
          result0 = null;
          pos = clone(pos1);
        }
        if (result0 !== null) {
          result0 = (function(offset, line, column, t, o) {o.push(t); return o;})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
        }
        if (result0 === null) {
          pos = clone(pos0);
        }
        if (result0 === null) {
          pos0 = clone(pos);
          result0 = parse_TriggerFunction();
          if (result0 !== null) {
            result0 = (function(offset, line, column, t) {return [t];})(pos0.offset, pos0.line, pos0.column, result0);
          }
          if (result0 === null) {
            pos = clone(pos0);
          }
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_TriggerFunction() {
        var cacheKey = "TriggerFunction@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1, result2, result3, result4, result5;
        var pos0, pos1;
        
        pos0 = clone(pos);
        pos1 = clone(pos);
        result0 = parse_TriggerPageOrVirtOp();
        if (result0 !== null) {
          result1 = parse_L();
          if (result1 !== null) {
            result2 = parse_Page();
            if (result2 === null) {
              result2 = parse_PageVirtual();
            }
            if (result2 !== null) {
              result3 = parse_R();
              if (result3 !== null) {
                result0 = [result0, result1, result2, result3];
              } else {
                result0 = null;
                pos = clone(pos1);
              }
            } else {
              result0 = null;
              pos = clone(pos1);
            }
          } else {
            result0 = null;
            pos = clone(pos1);
          }
        } else {
          result0 = null;
          pos = clone(pos1);
        }
        if (result0 !== null) {
          result0 = (function(offset, line, column, t, a) {return t+"."+a;})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
        }
        if (result0 === null) {
          pos = clone(pos0);
        }
        if (result0 === null) {
          pos0 = clone(pos);
          pos1 = clone(pos);
          result0 = parse_TriggerItemOrVirtOp();
          if (result0 !== null) {
            result1 = parse_L();
            if (result1 !== null) {
              result2 = parse_Identifier();
              if (result2 === null) {
                result2 = parse_ItemVirtual();
              }
              if (result2 !== null) {
                result3 = parse_R();
                if (result3 !== null) {
                  result0 = [result0, result1, result2, result3];
                } else {
                  result0 = null;
                  pos = clone(pos1);
                }
              } else {
                result0 = null;
                pos = clone(pos1);
              }
            } else {
              result0 = null;
              pos = clone(pos1);
            }
          } else {
            result0 = null;
            pos = clone(pos1);
          }
          if (result0 !== null) {
            result0 = (function(offset, line, column, t, a) {return t+"."+a;})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
          }
          if (result0 === null) {
            pos = clone(pos0);
          }
          if (result0 === null) {
            pos0 = clone(pos);
            pos1 = clone(pos);
            if (input.substr(pos.offset, 5) === "click") {
              result0 = "click";
              advance(pos, 5);
            } else {
              result0 = null;
              if (reportFailures === 0) {
                matchFailed("\"click\"");
              }
            }
            if (result0 !== null) {
              result1 = parse_L();
              if (result1 !== null) {
                result2 = parse_Identifier();
                if (result2 !== null) {
                  result3 = parse_R();
                  if (result3 !== null) {
                    result0 = [result0, result1, result2, result3];
                  } else {
                    result0 = null;
                    pos = clone(pos1);
                  }
                } else {
                  result0 = null;
                  pos = clone(pos1);
                }
              } else {
                result0 = null;
                pos = clone(pos1);
              }
            } else {
              result0 = null;
              pos = clone(pos1);
            }
            if (result0 !== null) {
              result0 = (function(offset, line, column, t, a) {return t+"."+a;})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
            }
            if (result0 === null) {
              pos = clone(pos0);
            }
            if (result0 === null) {
              pos0 = clone(pos);
              pos1 = clone(pos);
              if (input.substr(pos.offset, 7) === "combine") {
                result0 = "combine";
                advance(pos, 7);
              } else {
                result0 = null;
                if (reportFailures === 0) {
                  matchFailed("\"combine\"");
                }
              }
              if (result0 !== null) {
                result1 = parse_L();
                if (result1 !== null) {
                  result2 = parse_Identifier();
                  if (result2 === null) {
                    result2 = parse_ItemVirtual();
                  }
                  if (result2 !== null) {
                    result3 = parse_C();
                    if (result3 !== null) {
                      result4 = parse_Identifier();
                      if (result4 === null) {
                        result4 = parse_ItemVirtual();
                      }
                      if (result4 !== null) {
                        result5 = parse_R();
                        if (result5 !== null) {
                          result0 = [result0, result1, result2, result3, result4, result5];
                        } else {
                          result0 = null;
                          pos = clone(pos1);
                        }
                      } else {
                        result0 = null;
                        pos = clone(pos1);
                      }
                    } else {
                      result0 = null;
                      pos = clone(pos1);
                    }
                  } else {
                    result0 = null;
                    pos = clone(pos1);
                  }
                } else {
                  result0 = null;
                  pos = clone(pos1);
                }
              } else {
                result0 = null;
                pos = clone(pos1);
              }
              if (result0 !== null) {
                result0 = (function(offset, line, column, t, a, b) {return [t,a,b].join(".")})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2], result0[4]);
              }
              if (result0 === null) {
                pos = clone(pos0);
              }
              if (result0 === null) {
                pos0 = clone(pos);
                pos1 = clone(pos);
                if (input.substr(pos.offset, 5) === "apply") {
                  result0 = "apply";
                  advance(pos, 5);
                } else {
                  result0 = null;
                  if (reportFailures === 0) {
                    matchFailed("\"apply\"");
                  }
                }
                if (result0 !== null) {
                  result1 = parse_L();
                  if (result1 !== null) {
                    result2 = parse_Identifier();
                    if (result2 === null) {
                      result2 = parse_ItemVirtual();
                    }
                    if (result2 !== null) {
                      result3 = parse_C();
                      if (result3 !== null) {
                        result4 = parse_Identifier();
                        if (result4 !== null) {
                          result5 = parse_R();
                          if (result5 !== null) {
                            result0 = [result0, result1, result2, result3, result4, result5];
                          } else {
                            result0 = null;
                            pos = clone(pos1);
                          }
                        } else {
                          result0 = null;
                          pos = clone(pos1);
                        }
                      } else {
                        result0 = null;
                        pos = clone(pos1);
                      }
                    } else {
                      result0 = null;
                      pos = clone(pos1);
                    }
                  } else {
                    result0 = null;
                    pos = clone(pos1);
                  }
                } else {
                  result0 = null;
                  pos = clone(pos1);
                }
                if (result0 !== null) {
                  result0 = (function(offset, line, column, t, a, b) {return [t,a,b].join(".")})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2], result0[4]);
                }
                if (result0 === null) {
                  pos = clone(pos0);
                }
              }
            }
          }
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_TriggerPageOrVirtOp() {
        var cacheKey = "TriggerPageOrVirtOp@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0;
        
        if (input.substr(pos.offset, 5) === "enter") {
          result0 = "enter";
          advance(pos, 5);
        } else {
          result0 = null;
          if (reportFailures === 0) {
            matchFailed("\"enter\"");
          }
        }
        if (result0 === null) {
          if (input.substr(pos.offset, 5) === "leave") {
            result0 = "leave";
            advance(pos, 5);
          } else {
            result0 = null;
            if (reportFailures === 0) {
              matchFailed("\"leave\"");
            }
          }
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_TriggerItemOrVirtOp() {
        var cacheKey = "TriggerItemOrVirtOp@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0;
        
        if (input.substr(pos.offset, 3) === "add") {
          result0 = "add";
          advance(pos, 3);
        } else {
          result0 = null;
          if (reportFailures === 0) {
            matchFailed("\"add\"");
          }
        }
        if (result0 === null) {
          if (input.substr(pos.offset, 6) === "remove") {
            result0 = "remove";
            advance(pos, 6);
          } else {
            result0 = null;
            if (reportFailures === 0) {
              matchFailed("\"remove\"");
            }
          }
          if (result0 === null) {
            if (input.substr(pos.offset, 8) === "activate") {
              result0 = "activate";
              advance(pos, 8);
            } else {
              result0 = null;
              if (reportFailures === 0) {
                matchFailed("\"activate\"");
              }
            }
          }
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_ConditionClause() {
        var cacheKey = "ConditionClause@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1, result2, result3;
        var pos0, pos1;
        
        pos0 = clone(pos);
        pos1 = clone(pos);
        if (input.substr(pos.offset, 2) === "if") {
          result0 = "if";
          advance(pos, 2);
        } else {
          result0 = null;
          if (reportFailures === 0) {
            matchFailed("\"if\"");
          }
        }
        if (result0 !== null) {
          result1 = parse_S();
          if (result1 !== null) {
            result2 = parse_ConditionFunction();
            if (result2 !== null) {
              result3 = parse_CC();
              if (result3 !== null) {
                result0 = [result0, result1, result2, result3];
              } else {
                result0 = null;
                pos = clone(pos1);
              }
            } else {
              result0 = null;
              pos = clone(pos1);
            }
          } else {
            result0 = null;
            pos = clone(pos1);
          }
        } else {
          result0 = null;
          pos = clone(pos1);
        }
        if (result0 !== null) {
          result0 = (function(offset, line, column, co) {return co;})(pos0.offset, pos0.line, pos0.column, result0[2]);
        }
        if (result0 === null) {
          pos = clone(pos0);
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_ConditionFunction() {
        var cacheKey = "ConditionFunction@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1, result2, result3;
        var pos0, pos1;
        
        pos0 = clone(pos);
        pos1 = clone(pos);
        if (input.substr(pos.offset, 4) === "page") {
          result0 = "page";
          advance(pos, 4);
        } else {
          result0 = null;
          if (reportFailures === 0) {
            matchFailed("\"page\"");
          }
        }
        if (result0 !== null) {
          result1 = parse_L();
          if (result1 !== null) {
            result2 = parse_Page();
            if (result2 !== null) {
              result3 = parse_R();
              if (result3 !== null) {
                result0 = [result0, result1, result2, result3];
              } else {
                result0 = null;
                pos = clone(pos1);
              }
            } else {
              result0 = null;
              pos = clone(pos1);
            }
          } else {
            result0 = null;
            pos = clone(pos1);
          }
        } else {
          result0 = null;
          pos = clone(pos1);
        }
        if (result0 !== null) {
          result0 = (function(offset, line, column, p) {return function(){return a2.cpage == p};})(pos0.offset, pos0.line, pos0.column, result0[2]);
        }
        if (result0 === null) {
          pos = clone(pos0);
        }
        if (result0 === null) {
          pos0 = clone(pos);
          pos1 = clone(pos);
          if (input.substr(pos.offset, 3) === "any") {
            result0 = "any";
            advance(pos, 3);
          } else {
            result0 = null;
            if (reportFailures === 0) {
              matchFailed("\"any\"");
            }
          }
          if (result0 !== null) {
            result1 = parse_L();
            if (result1 !== null) {
              result2 = parse_ConditionArgs();
              if (result2 !== null) {
                result3 = parse_R();
                if (result3 !== null) {
                  result0 = [result0, result1, result2, result3];
                } else {
                  result0 = null;
                  pos = clone(pos1);
                }
              } else {
                result0 = null;
                pos = clone(pos1);
              }
            } else {
              result0 = null;
              pos = clone(pos1);
            }
          } else {
            result0 = null;
            pos = clone(pos1);
          }
          if (result0 !== null) {
            result0 = (function(offset, line, column, a) {return function(){for(var j=0; j<a.length; j++) if (a[j]()) return true; return false; }})(pos0.offset, pos0.line, pos0.column, result0[2]);
          }
          if (result0 === null) {
            pos = clone(pos0);
          }
          if (result0 === null) {
            pos0 = clone(pos);
            pos1 = clone(pos);
            if (input.substr(pos.offset, 3) === "all") {
              result0 = "all";
              advance(pos, 3);
            } else {
              result0 = null;
              if (reportFailures === 0) {
                matchFailed("\"all\"");
              }
            }
            if (result0 !== null) {
              result1 = parse_L();
              if (result1 !== null) {
                result2 = parse_ConditionArgs();
                if (result2 !== null) {
                  result3 = parse_R();
                  if (result3 !== null) {
                    result0 = [result0, result1, result2, result3];
                  } else {
                    result0 = null;
                    pos = clone(pos1);
                  }
                } else {
                  result0 = null;
                  pos = clone(pos1);
                }
              } else {
                result0 = null;
                pos = clone(pos1);
              }
            } else {
              result0 = null;
              pos = clone(pos1);
            }
            if (result0 !== null) {
              result0 = (function(offset, line, column, a) {return function(){for(var j=0; j<a.length; j++) if (!a[j]()) return false; return true; }})(pos0.offset, pos0.line, pos0.column, result0[2]);
            }
            if (result0 === null) {
              pos = clone(pos0);
            }
            if (result0 === null) {
              pos0 = clone(pos);
              pos1 = clone(pos);
              if (input.substr(pos.offset, 3) === "not") {
                result0 = "not";
                advance(pos, 3);
              } else {
                result0 = null;
                if (reportFailures === 0) {
                  matchFailed("\"not\"");
                }
              }
              if (result0 !== null) {
                result1 = parse_L();
                if (result1 !== null) {
                  result2 = parse_ConditionFunction();
                  if (result2 !== null) {
                    result3 = parse_R();
                    if (result3 !== null) {
                      result0 = [result0, result1, result2, result3];
                    } else {
                      result0 = null;
                      pos = clone(pos1);
                    }
                  } else {
                    result0 = null;
                    pos = clone(pos1);
                  }
                } else {
                  result0 = null;
                  pos = clone(pos1);
                }
              } else {
                result0 = null;
                pos = clone(pos1);
              }
              if (result0 !== null) {
                result0 = (function(offset, line, column, f) {return function(){ return !f()};})(pos0.offset, pos0.line, pos0.column, result0[2]);
              }
              if (result0 === null) {
                pos = clone(pos0);
              }
              if (result0 === null) {
                pos0 = clone(pos);
                pos1 = clone(pos);
                if (input.substr(pos.offset, 4) === "have") {
                  result0 = "have";
                  advance(pos, 4);
                } else {
                  result0 = null;
                  if (reportFailures === 0) {
                    matchFailed("\"have\"");
                  }
                }
                if (result0 !== null) {
                  result1 = parse_L();
                  if (result1 !== null) {
                    result2 = parse_Identifier();
                    if (result2 !== null) {
                      result3 = parse_R();
                      if (result3 !== null) {
                        result0 = [result0, result1, result2, result3];
                      } else {
                        result0 = null;
                        pos = clone(pos1);
                      }
                    } else {
                      result0 = null;
                      pos = clone(pos1);
                    }
                  } else {
                    result0 = null;
                    pos = clone(pos1);
                  }
                } else {
                  result0 = null;
                  pos = clone(pos1);
                }
                if (result0 !== null) {
                  result0 = (function(offset, line, column, i) {return function(){return !!a2.items[i]};})(pos0.offset, pos0.line, pos0.column, result0[2]);
                }
                if (result0 === null) {
                  pos = clone(pos0);
                }
                if (result0 === null) {
                  pos0 = clone(pos);
                  pos1 = clone(pos);
                  if (input.substr(pos.offset, 4) === "page") {
                    result0 = "page";
                    advance(pos, 4);
                  } else {
                    result0 = null;
                    if (reportFailures === 0) {
                      matchFailed("\"page\"");
                    }
                  }
                  if (result0 !== null) {
                    result1 = parse_L();
                    if (result1 !== null) {
                      result2 = parse_PageVirtual();
                      if (result2 !== null) {
                        result3 = parse_R();
                        if (result3 !== null) {
                          result0 = [result0, result1, result2, result3];
                        } else {
                          result0 = null;
                          pos = clone(pos1);
                        }
                      } else {
                        result0 = null;
                        pos = clone(pos1);
                      }
                    } else {
                      result0 = null;
                      pos = clone(pos1);
                    }
                  } else {
                    result0 = null;
                    pos = clone(pos1);
                  }
                  if (result0 !== null) {
                    result0 = (function(offset, line, column, v) {return function(){return !!a2.util.hasVirtual(v);};})(pos0.offset, pos0.line, pos0.column, result0[2]);
                  }
                  if (result0 === null) {
                    pos = clone(pos0);
                  }
                  if (result0 === null) {
                    pos0 = clone(pos);
                    pos1 = clone(pos);
                    if (input.substr(pos.offset, 4) === "have") {
                      result0 = "have";
                      advance(pos, 4);
                    } else {
                      result0 = null;
                      if (reportFailures === 0) {
                        matchFailed("\"have\"");
                      }
                    }
                    if (result0 !== null) {
                      result1 = parse_L();
                      if (result1 !== null) {
                        result2 = parse_ItemVirtual();
                        if (result2 !== null) {
                          result3 = parse_R();
                          if (result3 !== null) {
                            result0 = [result0, result1, result2, result3];
                          } else {
                            result0 = null;
                            pos = clone(pos1);
                          }
                        } else {
                          result0 = null;
                          pos = clone(pos1);
                        }
                      } else {
                        result0 = null;
                        pos = clone(pos1);
                      }
                    } else {
                      result0 = null;
                      pos = clone(pos1);
                    }
                    if (result0 !== null) {
                      result0 = (function(offset, line, column, v) {return function(){return !!a2.util.hasVirtual(v);};})(pos0.offset, pos0.line, pos0.column, result0[2]);
                    }
                    if (result0 === null) {
                      pos = clone(pos0);
                    }
                    if (result0 === null) {
                      pos0 = clone(pos);
                      pos1 = clone(pos);
                      if (input.substr(pos.offset, 7) === "visible") {
                        result0 = "visible";
                        advance(pos, 7);
                      } else {
                        result0 = null;
                        if (reportFailures === 0) {
                          matchFailed("\"visible\"");
                        }
                      }
                      if (result0 !== null) {
                        result1 = parse_L();
                        if (result1 !== null) {
                          result2 = parse_Overlay();
                          if (result2 !== null) {
                            result3 = parse_R();
                            if (result3 !== null) {
                              result0 = [result0, result1, result2, result3];
                            } else {
                              result0 = null;
                              pos = clone(pos1);
                            }
                          } else {
                            result0 = null;
                            pos = clone(pos1);
                          }
                        } else {
                          result0 = null;
                          pos = clone(pos1);
                        }
                      } else {
                        result0 = null;
                        pos = clone(pos1);
                      }
                      if (result0 !== null) {
                        result0 = (function(offset, line, column, o) {return function(){return $("#overlay_"+o+":visible").length;};})(pos0.offset, pos0.line, pos0.column, result0[2]);
                      }
                      if (result0 === null) {
                        pos = clone(pos0);
                      }
                      if (result0 === null) {
                        pos0 = clone(pos);
                        pos1 = clone(pos);
                        if (input.substr(pos.offset, 12) === "timeoutIsSet") {
                          result0 = "timeoutIsSet";
                          advance(pos, 12);
                        } else {
                          result0 = null;
                          if (reportFailures === 0) {
                            matchFailed("\"timeoutIsSet\"");
                          }
                        }
                        if (result0 !== null) {
                          result1 = parse_L();
                          if (result1 !== null) {
                            result2 = parse_R();
                            if (result2 !== null) {
                              result0 = [result0, result1, result2];
                            } else {
                              result0 = null;
                              pos = clone(pos1);
                            }
                          } else {
                            result0 = null;
                            pos = clone(pos1);
                          }
                        } else {
                          result0 = null;
                          pos = clone(pos1);
                        }
                        if (result0 !== null) {
                          result0 = (function(offset, line, column) {return function(){return a2.util.timeoutIsSet();};})(pos0.offset, pos0.line, pos0.column);
                        }
                        if (result0 === null) {
                          pos = clone(pos0);
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_ConditionArgs() {
        var cacheKey = "ConditionArgs@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1, result2;
        var pos0, pos1;
        
        pos0 = clone(pos);
        pos1 = clone(pos);
        result0 = parse_ConditionFunction();
        if (result0 !== null) {
          result1 = parse_C();
          if (result1 !== null) {
            result2 = parse_ConditionArgs();
            if (result2 !== null) {
              result0 = [result0, result1, result2];
            } else {
              result0 = null;
              pos = clone(pos1);
            }
          } else {
            result0 = null;
            pos = clone(pos1);
          }
        } else {
          result0 = null;
          pos = clone(pos1);
        }
        if (result0 !== null) {
          result0 = (function(offset, line, column, f, a) {a.push(f); return a;})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
        }
        if (result0 === null) {
          pos = clone(pos0);
        }
        if (result0 === null) {
          pos0 = clone(pos);
          result0 = parse_ConditionFunction();
          if (result0 !== null) {
            result0 = (function(offset, line, column, f) {return [f];})(pos0.offset, pos0.line, pos0.column, result0);
          }
          if (result0 === null) {
            pos = clone(pos0);
          }
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_ActionClause() {
        var cacheKey = "ActionClause@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1, result2, result3;
        var pos0, pos1;
        
        pos0 = clone(pos);
        pos1 = clone(pos);
        if (input.substr(pos.offset, 2) === "do") {
          result0 = "do";
          advance(pos, 2);
        } else {
          result0 = null;
          if (reportFailures === 0) {
            matchFailed("\"do\"");
          }
        }
        if (result0 !== null) {
          result1 = parse_S();
          if (result1 !== null) {
            result2 = parse_ActionFunctions();
            if (result2 !== null) {
              result3 = parse_CC();
              if (result3 !== null) {
                result0 = [result0, result1, result2, result3];
              } else {
                result0 = null;
                pos = clone(pos1);
              }
            } else {
              result0 = null;
              pos = clone(pos1);
            }
          } else {
            result0 = null;
            pos = clone(pos1);
          }
        } else {
          result0 = null;
          pos = clone(pos1);
        }
        if (result0 !== null) {
          result0 = (function(offset, line, column, ac) {return ac;})(pos0.offset, pos0.line, pos0.column, result0[2]);
        }
        if (result0 === null) {
          pos = clone(pos0);
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_ActionFunctions() {
        var cacheKey = "ActionFunctions@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1, result2;
        var pos0, pos1;
        
        pos0 = clone(pos);
        pos1 = clone(pos);
        result0 = parse_ActionFunction();
        if (result0 !== null) {
          result1 = parse_C();
          if (result1 !== null) {
            result2 = parse_ActionFunctions();
            if (result2 !== null) {
              result0 = [result0, result1, result2];
            } else {
              result0 = null;
              pos = clone(pos1);
            }
          } else {
            result0 = null;
            pos = clone(pos1);
          }
        } else {
          result0 = null;
          pos = clone(pos1);
        }
        if (result0 !== null) {
          result0 = (function(offset, line, column, f, a) {return function(real){f(real); a(real);};})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
        }
        if (result0 === null) {
          pos = clone(pos0);
        }
        if (result0 === null) {
          result0 = parse_ActionFunction();
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_ActionFunction() {
        var cacheKey = "ActionFunction@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1, result2, result3, result4, result5, result6;
        var pos0, pos1;
        
        pos0 = clone(pos);
        pos1 = clone(pos);
        if (input.substr(pos.offset, 4) === "goto") {
          result0 = "goto";
          advance(pos, 4);
        } else {
          result0 = null;
          if (reportFailures === 0) {
            matchFailed("\"goto\"");
          }
        }
        if (result0 !== null) {
          result1 = parse_L();
          if (result1 !== null) {
            result2 = parse_Page();
            if (result2 !== null) {
              result3 = parse_R();
              if (result3 !== null) {
                result0 = [result0, result1, result2, result3];
              } else {
                result0 = null;
                pos = clone(pos1);
              }
            } else {
              result0 = null;
              pos = clone(pos1);
            }
          } else {
            result0 = null;
            pos = clone(pos1);
          }
        } else {
          result0 = null;
          pos = clone(pos1);
        }
        if (result0 !== null) {
          result0 = (function(offset, line, column, f, p) {return function(real){a2.util.goto(p)};})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
        }
        if (result0 === null) {
          pos = clone(pos0);
        }
        if (result0 === null) {
          pos0 = clone(pos);
          pos1 = clone(pos);
          if (input.substr(pos.offset, 3) === "add") {
            result0 = "add";
            advance(pos, 3);
          } else {
            result0 = null;
            if (reportFailures === 0) {
              matchFailed("\"add\"");
            }
          }
          if (result0 !== null) {
            result1 = parse_L();
            if (result1 !== null) {
              result2 = parse_Identifier();
              if (result2 !== null) {
                result3 = parse_R();
                if (result3 !== null) {
                  result0 = [result0, result1, result2, result3];
                } else {
                  result0 = null;
                  pos = clone(pos1);
                }
              } else {
                result0 = null;
                pos = clone(pos1);
              }
            } else {
              result0 = null;
              pos = clone(pos1);
            }
          } else {
            result0 = null;
            pos = clone(pos1);
          }
          if (result0 !== null) {
            result0 = (function(offset, line, column, f, i) {return function(real){a2.util.add(i)};})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
          }
          if (result0 === null) {
            pos = clone(pos0);
          }
          if (result0 === null) {
            pos0 = clone(pos);
            pos1 = clone(pos);
            if (input.substr(pos.offset, 6) === "remove") {
              result0 = "remove";
              advance(pos, 6);
            } else {
              result0 = null;
              if (reportFailures === 0) {
                matchFailed("\"remove\"");
              }
            }
            if (result0 !== null) {
              result1 = parse_L();
              if (result1 !== null) {
                result2 = parse_Identifier();
                if (result2 !== null) {
                  result3 = parse_R();
                  if (result3 !== null) {
                    result0 = [result0, result1, result2, result3];
                  } else {
                    result0 = null;
                    pos = clone(pos1);
                  }
                } else {
                  result0 = null;
                  pos = clone(pos1);
                }
              } else {
                result0 = null;
                pos = clone(pos1);
              }
            } else {
              result0 = null;
              pos = clone(pos1);
            }
            if (result0 !== null) {
              result0 = (function(offset, line, column, f, i) {return function(real){a2.util.remove(i)};})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
            }
            if (result0 === null) {
              pos = clone(pos0);
            }
            if (result0 === null) {
              pos0 = clone(pos);
              pos1 = clone(pos);
              if (input.substr(pos.offset, 5) === "print") {
                result0 = "print";
                advance(pos, 5);
              } else {
                result0 = null;
                if (reportFailures === 0) {
                  matchFailed("\"print\"");
                }
              }
              if (result0 !== null) {
                result1 = parse_L();
                if (result1 !== null) {
                  result2 = parse_String();
                  if (result2 !== null) {
                    result3 = parse_R();
                    if (result3 !== null) {
                      result0 = [result0, result1, result2, result3];
                    } else {
                      result0 = null;
                      pos = clone(pos1);
                    }
                  } else {
                    result0 = null;
                    pos = clone(pos1);
                  }
                } else {
                  result0 = null;
                  pos = clone(pos1);
                }
              } else {
                result0 = null;
                pos = clone(pos1);
              }
              if (result0 !== null) {
                result0 = (function(offset, line, column, f, s) {return function(real){a2.util.print(s)};})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
              }
              if (result0 === null) {
                pos = clone(pos0);
              }
              if (result0 === null) {
                pos0 = clone(pos);
                pos1 = clone(pos);
                if (input.substr(pos.offset, 3) === "ask") {
                  result0 = "ask";
                  advance(pos, 3);
                } else {
                  result0 = null;
                  if (reportFailures === 0) {
                    matchFailed("\"ask\"");
                  }
                }
                if (result0 !== null) {
                  result1 = parse_L();
                  if (result1 !== null) {
                    result2 = parse_String();
                    if (result2 !== null) {
                      result3 = parse_C();
                      if (result3 !== null) {
                        result4 = parse_StringKwArgClause();
                        if (result4 !== null) {
                          result5 = parse_R();
                          if (result5 !== null) {
                            result0 = [result0, result1, result2, result3, result4, result5];
                          } else {
                            result0 = null;
                            pos = clone(pos1);
                          }
                        } else {
                          result0 = null;
                          pos = clone(pos1);
                        }
                      } else {
                        result0 = null;
                        pos = clone(pos1);
                      }
                    } else {
                      result0 = null;
                      pos = clone(pos1);
                    }
                  } else {
                    result0 = null;
                    pos = clone(pos1);
                  }
                } else {
                  result0 = null;
                  pos = clone(pos1);
                }
                if (result0 !== null) {
                  result0 = (function(offset, line, column, f, s, c) {return function(real){a2.util.print(s,c);};})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2], result0[4]);
                }
                if (result0 === null) {
                  pos = clone(pos0);
                }
                if (result0 === null) {
                  pos0 = clone(pos);
                  pos1 = clone(pos);
                  if (input.substr(pos.offset, 12) === "clearTimeout") {
                    result0 = "clearTimeout";
                    advance(pos, 12);
                  } else {
                    result0 = null;
                    if (reportFailures === 0) {
                      matchFailed("\"clearTimeout\"");
                    }
                  }
                  if (result0 !== null) {
                    result1 = parse_L();
                    if (result1 !== null) {
                      result2 = parse_R();
                      if (result2 !== null) {
                        result0 = [result0, result1, result2];
                      } else {
                        result0 = null;
                        pos = clone(pos1);
                      }
                    } else {
                      result0 = null;
                      pos = clone(pos1);
                    }
                  } else {
                    result0 = null;
                    pos = clone(pos1);
                  }
                  if (result0 !== null) {
                    result0 = (function(offset, line, column, f) {return function(real){a2.timer.clear();};})(pos0.offset, pos0.line, pos0.column, result0[0]);
                  }
                  if (result0 === null) {
                    pos = clone(pos0);
                  }
                  if (result0 === null) {
                    pos0 = clone(pos);
                    pos1 = clone(pos);
                    if (input.substr(pos.offset, 11) === "showOverlay") {
                      result0 = "showOverlay";
                      advance(pos, 11);
                    } else {
                      result0 = null;
                      if (reportFailures === 0) {
                        matchFailed("\"showOverlay\"");
                      }
                    }
                    if (result0 !== null) {
                      result1 = parse_L();
                      if (result1 !== null) {
                        result2 = parse_Overlay();
                        if (result2 !== null) {
                          result3 = parse_R();
                          if (result3 !== null) {
                            result0 = [result0, result1, result2, result3];
                          } else {
                            result0 = null;
                            pos = clone(pos1);
                          }
                        } else {
                          result0 = null;
                          pos = clone(pos1);
                        }
                      } else {
                        result0 = null;
                        pos = clone(pos1);
                      }
                    } else {
                      result0 = null;
                      pos = clone(pos1);
                    }
                    if (result0 !== null) {
                      result0 = (function(offset, line, column, f, o) {return function(real){ $("#overlay_"+o).show();};})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
                    }
                    if (result0 === null) {
                      pos = clone(pos0);
                    }
                    if (result0 === null) {
                      pos0 = clone(pos);
                      pos1 = clone(pos);
                      if (input.substr(pos.offset, 11) === "hideOverlay") {
                        result0 = "hideOverlay";
                        advance(pos, 11);
                      } else {
                        result0 = null;
                        if (reportFailures === 0) {
                          matchFailed("\"hideOverlay\"");
                        }
                      }
                      if (result0 !== null) {
                        result1 = parse_L();
                        if (result1 !== null) {
                          result2 = parse_Overlay();
                          if (result2 !== null) {
                            result3 = parse_R();
                            if (result3 !== null) {
                              result0 = [result0, result1, result2, result3];
                            } else {
                              result0 = null;
                              pos = clone(pos1);
                            }
                          } else {
                            result0 = null;
                            pos = clone(pos1);
                          }
                        } else {
                          result0 = null;
                          pos = clone(pos1);
                        }
                      } else {
                        result0 = null;
                        pos = clone(pos1);
                      }
                      if (result0 !== null) {
                        result0 = (function(offset, line, column, f, o) {return function(real){ $("#overlay_"+o).hide();};})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
                      }
                      if (result0 === null) {
                        pos = clone(pos0);
                      }
                      if (result0 === null) {
                        pos0 = clone(pos);
                        pos1 = clone(pos);
                        if (input.substr(pos.offset, 6) === "remove") {
                          result0 = "remove";
                          advance(pos, 6);
                        } else {
                          result0 = null;
                          if (reportFailures === 0) {
                            matchFailed("\"remove\"");
                          }
                        }
                        if (result0 !== null) {
                          result1 = parse_L();
                          if (result1 !== null) {
                            result2 = parse_ItemVirtual();
                            if (result2 !== null) {
                              result3 = parse_R();
                              if (result3 !== null) {
                                result0 = [result0, result1, result2, result3];
                              } else {
                                result0 = null;
                                pos = clone(pos1);
                              }
                            } else {
                              result0 = null;
                              pos = clone(pos1);
                            }
                          } else {
                            result0 = null;
                            pos = clone(pos1);
                          }
                        } else {
                          result0 = null;
                          pos = clone(pos1);
                        }
                        if (result0 !== null) {
                          result0 = (function(offset, line, column, f, i) {return function(real){a2.util.removeAll(i)};})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
                        }
                        if (result0 === null) {
                          pos = clone(pos0);
                        }
                        if (result0 === null) {
                          pos0 = clone(pos);
                          pos1 = clone(pos);
                          if (input.substr(pos.offset, 6) === "remove") {
                            result0 = "remove";
                            advance(pos, 6);
                          } else {
                            result0 = null;
                            if (reportFailures === 0) {
                              matchFailed("\"remove\"");
                            }
                          }
                          if (result0 !== null) {
                            result1 = parse_L();
                            if (result1 !== null) {
                              if (input.substr(pos.offset, 2) === "${") {
                                result2 = "${";
                                advance(pos, 2);
                              } else {
                                result2 = null;
                                if (reportFailures === 0) {
                                  matchFailed("\"${\"");
                                }
                              }
                              if (result2 !== null) {
                                result3 = parse_TriggerItemOrVirtOp();
                                if (result3 === null) {
                                  if (input.substr(pos.offset, 7) === "combine") {
                                    result3 = "combine";
                                    advance(pos, 7);
                                  } else {
                                    result3 = null;
                                    if (reportFailures === 0) {
                                      matchFailed("\"combine\"");
                                    }
                                  }
                                  if (result3 === null) {
                                    if (input.substr(pos.offset, 5) === "apply") {
                                      result3 = "apply";
                                      advance(pos, 5);
                                    } else {
                                      result3 = null;
                                      if (reportFailures === 0) {
                                        matchFailed("\"apply\"");
                                      }
                                    }
                                  }
                                }
                                if (result3 !== null) {
                                  if (/^[12]/.test(input.charAt(pos.offset))) {
                                    result4 = input.charAt(pos.offset);
                                    advance(pos, 1);
                                  } else {
                                    result4 = null;
                                    if (reportFailures === 0) {
                                      matchFailed("[12]");
                                    }
                                  }
                                  if (result4 !== null) {
                                    if (input.charCodeAt(pos.offset) === 125) {
                                      result5 = "}";
                                      advance(pos, 1);
                                    } else {
                                      result5 = null;
                                      if (reportFailures === 0) {
                                        matchFailed("\"}\"");
                                      }
                                    }
                                    if (result5 !== null) {
                                      result6 = parse_R();
                                      if (result6 !== null) {
                                        result0 = [result0, result1, result2, result3, result4, result5, result6];
                                      } else {
                                        result0 = null;
                                        pos = clone(pos1);
                                      }
                                    } else {
                                      result0 = null;
                                      pos = clone(pos1);
                                    }
                                  } else {
                                    result0 = null;
                                    pos = clone(pos1);
                                  }
                                } else {
                                  result0 = null;
                                  pos = clone(pos1);
                                }
                              } else {
                                result0 = null;
                                pos = clone(pos1);
                              }
                            } else {
                              result0 = null;
                              pos = clone(pos1);
                            }
                          } else {
                            result0 = null;
                            pos = clone(pos1);
                          }
                          if (result0 !== null) {
                            result0 = (function(offset, line, column, f, rt, rn) {return function(real){if (rt == real[0] && a2.virtualTriggerMap[rt] && a2.virtualTriggerMap[rt][parseInt(rn)-1]) a2.util.remove(real[parseInt(rn)]);};})(pos0.offset, pos0.line, pos0.column, result0[0], result0[3], result0[4]);
                          }
                          if (result0 === null) {
                            pos = clone(pos0);
                          }
                          if (result0 === null) {
                            pos0 = clone(pos);
                            pos1 = clone(pos);
                            if (input.substr(pos.offset, 10) === "setTimeout") {
                              result0 = "setTimeout";
                              advance(pos, 10);
                            } else {
                              result0 = null;
                              if (reportFailures === 0) {
                                matchFailed("\"setTimeout\"");
                              }
                            }
                            if (result0 !== null) {
                              result1 = parse_L();
                              if (result1 !== null) {
                                result2 = parse_Time();
                                if (result2 !== null) {
                                  result3 = parse_R();
                                  if (result3 !== null) {
                                    result4 = parse_C();
                                    if (result4 !== null) {
                                      result5 = parse_ActionFunctions();
                                      if (result5 !== null) {
                                        result0 = [result0, result1, result2, result3, result4, result5];
                                      } else {
                                        result0 = null;
                                        pos = clone(pos1);
                                      }
                                    } else {
                                      result0 = null;
                                      pos = clone(pos1);
                                    }
                                  } else {
                                    result0 = null;
                                    pos = clone(pos1);
                                  }
                                } else {
                                  result0 = null;
                                  pos = clone(pos1);
                                }
                              } else {
                                result0 = null;
                                pos = clone(pos1);
                              }
                            } else {
                              result0 = null;
                              pos = clone(pos1);
                            }
                            if (result0 !== null) {
                              result0 = (function(offset, line, column, t, a) {return function(real){a2.timer.set(t, function(){a(real)});};})(pos0.offset, pos0.line, pos0.column, result0[2], result0[5]);
                            }
                            if (result0 === null) {
                              pos = clone(pos0);
                            }
                            if (result0 === null) {
                              pos0 = clone(pos);
                              pos1 = clone(pos);
                              if (input.substr(pos.offset, 4) === "play") {
                                result0 = "play";
                                advance(pos, 4);
                              } else {
                                result0 = null;
                                if (reportFailures === 0) {
                                  matchFailed("\"play\"");
                                }
                              }
                              if (result0 !== null) {
                                result1 = parse_L();
                                if (result1 !== null) {
                                  result2 = parse_Channel();
                                  if (result2 !== null) {
                                    result3 = parse_C();
                                    if (result3 !== null) {
                                      result4 = parse_String();
                                      if (result4 !== null) {
                                        result5 = parse_R();
                                        if (result5 !== null) {
                                          result0 = [result0, result1, result2, result3, result4, result5];
                                        } else {
                                          result0 = null;
                                          pos = clone(pos1);
                                        }
                                      } else {
                                        result0 = null;
                                        pos = clone(pos1);
                                      }
                                    } else {
                                      result0 = null;
                                      pos = clone(pos1);
                                    }
                                  } else {
                                    result0 = null;
                                    pos = clone(pos1);
                                  }
                                } else {
                                  result0 = null;
                                  pos = clone(pos1);
                                }
                              } else {
                                result0 = null;
                                pos = clone(pos1);
                              }
                              if (result0 !== null) {
                                result0 = (function(offset, line, column, f, chan, file) {return function(real){a2.audio.play(chan, file)};})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2], result0[4]);
                              }
                              if (result0 === null) {
                                pos = clone(pos0);
                              }
                              if (result0 === null) {
                                pos0 = clone(pos);
                                pos1 = clone(pos);
                                if (input.substr(pos.offset, 4) === "stop") {
                                  result0 = "stop";
                                  advance(pos, 4);
                                } else {
                                  result0 = null;
                                  if (reportFailures === 0) {
                                    matchFailed("\"stop\"");
                                  }
                                }
                                if (result0 !== null) {
                                  result1 = parse_L();
                                  if (result1 !== null) {
                                    result2 = parse_Channel();
                                    if (result2 !== null) {
                                      result3 = parse_R();
                                      if (result3 !== null) {
                                        result0 = [result0, result1, result2, result3];
                                      } else {
                                        result0 = null;
                                        pos = clone(pos1);
                                      }
                                    } else {
                                      result0 = null;
                                      pos = clone(pos1);
                                    }
                                  } else {
                                    result0 = null;
                                    pos = clone(pos1);
                                  }
                                } else {
                                  result0 = null;
                                  pos = clone(pos1);
                                }
                                if (result0 !== null) {
                                  result0 = (function(offset, line, column, f, chan) {return function(real){a2.audio.stop(chan)};})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
                                }
                                if (result0 === null) {
                                  pos = clone(pos0);
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_Channel() {
        var cacheKey = "Channel@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0;
        var pos0;
        
        pos0 = clone(pos);
        if (input.substr(pos.offset, 5) === "music") {
          result0 = "music";
          advance(pos, 5);
        } else {
          result0 = null;
          if (reportFailures === 0) {
            matchFailed("\"music\"");
          }
        }
        if (result0 !== null) {
          result0 = (function(offset, line, column) {return "music";})(pos0.offset, pos0.line, pos0.column);
        }
        if (result0 === null) {
          pos = clone(pos0);
        }
        if (result0 === null) {
          pos0 = clone(pos);
          if (input.substr(pos.offset, 5) === "noise") {
            result0 = "noise";
            advance(pos, 5);
          } else {
            result0 = null;
            if (reportFailures === 0) {
              matchFailed("\"noise\"");
            }
          }
          if (result0 !== null) {
            result0 = (function(offset, line, column) {return "noise";})(pos0.offset, pos0.line, pos0.column);
          }
          if (result0 === null) {
            pos = clone(pos0);
          }
          if (result0 === null) {
            pos0 = clone(pos);
            if (input.substr(pos.offset, 10) === "background") {
              result0 = "background";
              advance(pos, 10);
            } else {
              result0 = null;
              if (reportFailures === 0) {
                matchFailed("\"background\"");
              }
            }
            if (result0 !== null) {
              result0 = (function(offset, line, column) {return "background";})(pos0.offset, pos0.line, pos0.column);
            }
            if (result0 === null) {
              pos = clone(pos0);
            }
          }
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_PageDec() {
        var cacheKey = "PageDec@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1, result2, result3;
        var pos0, pos1;
        
        pos0 = clone(pos);
        pos1 = clone(pos);
        if (input.substr(pos.offset, 4) === "page") {
          result0 = "page";
          advance(pos, 4);
        } else {
          result0 = null;
          if (reportFailures === 0) {
            matchFailed("\"page\"");
          }
        }
        if (result0 !== null) {
          result1 = parse_CC();
          if (result1 !== null) {
            result2 = parse_PageVirtualClause();
            result2 = result2 !== null ? result2 : "";
            if (result2 !== null) {
              result3 = parse_End();
              if (result3 !== null) {
                result0 = [result0, result1, result2, result3];
              } else {
                result0 = null;
                pos = clone(pos1);
              }
            } else {
              result0 = null;
              pos = clone(pos1);
            }
          } else {
            result0 = null;
            pos = clone(pos1);
          }
        } else {
          result0 = null;
          pos = clone(pos1);
        }
        if (result0 !== null) {
          result0 = (function(offset, line, column, pv) {return ["page", {virt:pv}];})(pos0.offset, pos0.line, pos0.column, result0[2]);
        }
        if (result0 === null) {
          pos = clone(pos0);
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_PageVirtualClause() {
        var cacheKey = "PageVirtualClause@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1, result2, result3;
        var pos0, pos1;
        
        pos0 = clone(pos);
        pos1 = clone(pos);
        if (input.substr(pos.offset, 8) === "provides") {
          result0 = "provides";
          advance(pos, 8);
        } else {
          result0 = null;
          if (reportFailures === 0) {
            matchFailed("\"provides\"");
          }
        }
        if (result0 !== null) {
          result1 = parse_S();
          if (result1 !== null) {
            result2 = parse_PageVirtualList();
            if (result2 !== null) {
              result3 = parse_CC();
              if (result3 !== null) {
                result0 = [result0, result1, result2, result3];
              } else {
                result0 = null;
                pos = clone(pos1);
              }
            } else {
              result0 = null;
              pos = clone(pos1);
            }
          } else {
            result0 = null;
            pos = clone(pos1);
          }
        } else {
          result0 = null;
          pos = clone(pos1);
        }
        if (result0 !== null) {
          result0 = (function(offset, line, column, v) {return v;})(pos0.offset, pos0.line, pos0.column, result0[2]);
        }
        if (result0 === null) {
          pos = clone(pos0);
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_PageVirtualList() {
        var cacheKey = "PageVirtualList@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1, result2;
        var pos0, pos1;
        
        pos0 = clone(pos);
        pos1 = clone(pos);
        result0 = parse_PageVirtual();
        if (result0 !== null) {
          result1 = parse_C();
          if (result1 !== null) {
            result2 = parse_PageVirtualList();
            if (result2 !== null) {
              result0 = [result0, result1, result2];
            } else {
              result0 = null;
              pos = clone(pos1);
            }
          } else {
            result0 = null;
            pos = clone(pos1);
          }
        } else {
          result0 = null;
          pos = clone(pos1);
        }
        if (result0 !== null) {
          result0 = (function(offset, line, column, v, vl) {vl.push(v); return vl;})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
        }
        if (result0 === null) {
          pos = clone(pos0);
        }
        if (result0 === null) {
          pos0 = clone(pos);
          result0 = parse_PageVirtual();
          if (result0 !== null) {
            result0 = (function(offset, line, column, v) {return [v];})(pos0.offset, pos0.line, pos0.column, result0);
          }
          if (result0 === null) {
            pos = clone(pos0);
          }
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_ItemDec() {
        var cacheKey = "ItemDec@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1, result2, result3, result4;
        var pos0, pos1;
        
        pos0 = clone(pos);
        pos1 = clone(pos);
        if (input.substr(pos.offset, 4) === "item") {
          result0 = "item";
          advance(pos, 4);
        } else {
          result0 = null;
          if (reportFailures === 0) {
            matchFailed("\"item\"");
          }
        }
        if (result0 !== null) {
          result1 = parse_CC();
          if (result1 !== null) {
            result2 = parse_TitleClause();
            result2 = result2 !== null ? result2 : "";
            if (result2 !== null) {
              result3 = parse_ItemVirtualClause();
              result3 = result3 !== null ? result3 : "";
              if (result3 !== null) {
                result4 = parse_End();
                if (result4 !== null) {
                  result0 = [result0, result1, result2, result3, result4];
                } else {
                  result0 = null;
                  pos = clone(pos1);
                }
              } else {
                result0 = null;
                pos = clone(pos1);
              }
            } else {
              result0 = null;
              pos = clone(pos1);
            }
          } else {
            result0 = null;
            pos = clone(pos1);
          }
        } else {
          result0 = null;
          pos = clone(pos1);
        }
        if (result0 !== null) {
          result0 = (function(offset, line, column, t, iv) {return ["item", {virt:iv, title:t}];})(pos0.offset, pos0.line, pos0.column, result0[2], result0[3]);
        }
        if (result0 === null) {
          pos = clone(pos0);
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_TitleClause() {
        var cacheKey = "TitleClause@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1, result2, result3;
        var pos0, pos1;
        
        pos0 = clone(pos);
        pos1 = clone(pos);
        if (input.substr(pos.offset, 5) === "title") {
          result0 = "title";
          advance(pos, 5);
        } else {
          result0 = null;
          if (reportFailures === 0) {
            matchFailed("\"title\"");
          }
        }
        if (result0 !== null) {
          result1 = parse_S();
          if (result1 !== null) {
            result2 = parse_String();
            if (result2 !== null) {
              result3 = parse_CC();
              if (result3 !== null) {
                result0 = [result0, result1, result2, result3];
              } else {
                result0 = null;
                pos = clone(pos1);
              }
            } else {
              result0 = null;
              pos = clone(pos1);
            }
          } else {
            result0 = null;
            pos = clone(pos1);
          }
        } else {
          result0 = null;
          pos = clone(pos1);
        }
        if (result0 !== null) {
          result0 = (function(offset, line, column, s) {return s;})(pos0.offset, pos0.line, pos0.column, result0[2]);
        }
        if (result0 === null) {
          pos = clone(pos0);
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_ItemVirtualClause() {
        var cacheKey = "ItemVirtualClause@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1, result2, result3;
        var pos0, pos1;
        
        pos0 = clone(pos);
        pos1 = clone(pos);
        if (input.substr(pos.offset, 8) === "provides") {
          result0 = "provides";
          advance(pos, 8);
        } else {
          result0 = null;
          if (reportFailures === 0) {
            matchFailed("\"provides\"");
          }
        }
        if (result0 !== null) {
          result1 = parse_S();
          if (result1 !== null) {
            result2 = parse_ItemVirtualList();
            if (result2 !== null) {
              result3 = parse_CC();
              if (result3 !== null) {
                result0 = [result0, result1, result2, result3];
              } else {
                result0 = null;
                pos = clone(pos1);
              }
            } else {
              result0 = null;
              pos = clone(pos1);
            }
          } else {
            result0 = null;
            pos = clone(pos1);
          }
        } else {
          result0 = null;
          pos = clone(pos1);
        }
        if (result0 !== null) {
          result0 = (function(offset, line, column, v) {return v;})(pos0.offset, pos0.line, pos0.column, result0[2]);
        }
        if (result0 === null) {
          pos = clone(pos0);
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_ItemVirtualList() {
        var cacheKey = "ItemVirtualList@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1, result2;
        var pos0, pos1;
        
        pos0 = clone(pos);
        pos1 = clone(pos);
        result0 = parse_ItemVirtual();
        if (result0 !== null) {
          result1 = parse_C();
          if (result1 !== null) {
            result2 = parse_ItemVirtualList();
            if (result2 !== null) {
              result0 = [result0, result1, result2];
            } else {
              result0 = null;
              pos = clone(pos1);
            }
          } else {
            result0 = null;
            pos = clone(pos1);
          }
        } else {
          result0 = null;
          pos = clone(pos1);
        }
        if (result0 !== null) {
          result0 = (function(offset, line, column, v, vl) {vl.push(v); return vl;})(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
        }
        if (result0 === null) {
          pos = clone(pos0);
        }
        if (result0 === null) {
          pos0 = clone(pos);
          result0 = parse_ItemVirtual();
          if (result0 !== null) {
            result0 = (function(offset, line, column, v) {return [v];})(pos0.offset, pos0.line, pos0.column, result0);
          }
          if (result0 === null) {
            pos = clone(pos0);
          }
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_StringKwArgClause() {
        var cacheKey = "StringKwArgClause@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1, result2;
        var pos0, pos1;
        
        pos0 = clone(pos);
        pos1 = clone(pos);
        result0 = parse_StringKwArg();
        if (result0 !== null) {
          result1 = parse_C();
          if (result1 !== null) {
            result2 = parse_StringKwArgClause();
            if (result2 !== null) {
              result0 = [result0, result1, result2];
            } else {
              result0 = null;
              pos = clone(pos1);
            }
          } else {
            result0 = null;
            pos = clone(pos1);
          }
        } else {
          result0 = null;
          pos = clone(pos1);
        }
        if (result0 !== null) {
          result0 = (function(offset, line, column, k, r) {return [k].concat(r); })(pos0.offset, pos0.line, pos0.column, result0[0], result0[2]);
        }
        if (result0 === null) {
          pos = clone(pos0);
        }
        if (result0 === null) {
          pos0 = clone(pos);
          result0 = parse_StringKwArg();
          if (result0 !== null) {
            result0 = (function(offset, line, column, k) { return [k]; })(pos0.offset, pos0.line, pos0.column, result0);
          }
          if (result0 === null) {
            pos = clone(pos0);
          }
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_StringKwArg() {
        var cacheKey = "StringKwArg@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1, result2, result3, result4;
        var pos0, pos1;
        
        pos0 = clone(pos);
        pos1 = clone(pos);
        result0 = parse_Identifier();
        if (result0 !== null) {
          result1 = parse_S();
          result1 = result1 !== null ? result1 : "";
          if (result1 !== null) {
            if (input.charCodeAt(pos.offset) === 61) {
              result2 = "=";
              advance(pos, 1);
            } else {
              result2 = null;
              if (reportFailures === 0) {
                matchFailed("\"=\"");
              }
            }
            if (result2 !== null) {
              result3 = parse_S();
              result3 = result3 !== null ? result3 : "";
              if (result3 !== null) {
                result4 = parse_String();
                if (result4 !== null) {
                  result0 = [result0, result1, result2, result3, result4];
                } else {
                  result0 = null;
                  pos = clone(pos1);
                }
              } else {
                result0 = null;
                pos = clone(pos1);
              }
            } else {
              result0 = null;
              pos = clone(pos1);
            }
          } else {
            result0 = null;
            pos = clone(pos1);
          }
        } else {
          result0 = null;
          pos = clone(pos1);
        }
        if (result0 !== null) {
          result0 = (function(offset, line, column, i, s) {return [i,s];})(pos0.offset, pos0.line, pos0.column, result0[0], result0[4]);
        }
        if (result0 === null) {
          pos = clone(pos0);
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_L() {
        var cacheKey = "L@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1, result2;
        var pos0;
        
        pos0 = clone(pos);
        result0 = parse_S();
        result0 = result0 !== null ? result0 : "";
        if (result0 !== null) {
          if (input.charCodeAt(pos.offset) === 40) {
            result1 = "(";
            advance(pos, 1);
          } else {
            result1 = null;
            if (reportFailures === 0) {
              matchFailed("\"(\"");
            }
          }
          if (result1 !== null) {
            result2 = parse_S();
            result2 = result2 !== null ? result2 : "";
            if (result2 !== null) {
              result0 = [result0, result1, result2];
            } else {
              result0 = null;
              pos = clone(pos0);
            }
          } else {
            result0 = null;
            pos = clone(pos0);
          }
        } else {
          result0 = null;
          pos = clone(pos0);
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_R() {
        var cacheKey = "R@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1, result2;
        var pos0;
        
        pos0 = clone(pos);
        result0 = parse_S();
        result0 = result0 !== null ? result0 : "";
        if (result0 !== null) {
          if (input.charCodeAt(pos.offset) === 41) {
            result1 = ")";
            advance(pos, 1);
          } else {
            result1 = null;
            if (reportFailures === 0) {
              matchFailed("\")\"");
            }
          }
          if (result1 !== null) {
            result2 = parse_S();
            result2 = result2 !== null ? result2 : "";
            if (result2 !== null) {
              result0 = [result0, result1, result2];
            } else {
              result0 = null;
              pos = clone(pos0);
            }
          } else {
            result0 = null;
            pos = clone(pos0);
          }
        } else {
          result0 = null;
          pos = clone(pos0);
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_C() {
        var cacheKey = "C@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1, result2;
        var pos0;
        
        pos0 = clone(pos);
        result0 = parse_S();
        result0 = result0 !== null ? result0 : "";
        if (result0 !== null) {
          if (input.charCodeAt(pos.offset) === 44) {
            result1 = ",";
            advance(pos, 1);
          } else {
            result1 = null;
            if (reportFailures === 0) {
              matchFailed("\",\"");
            }
          }
          if (result1 !== null) {
            result2 = parse_S();
            result2 = result2 !== null ? result2 : "";
            if (result2 !== null) {
              result0 = [result0, result1, result2];
            } else {
              result0 = null;
              pos = clone(pos0);
            }
          } else {
            result0 = null;
            pos = clone(pos0);
          }
        } else {
          result0 = null;
          pos = clone(pos0);
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_CC() {
        var cacheKey = "CC@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1, result2;
        var pos0;
        
        pos0 = clone(pos);
        result0 = parse_S();
        result0 = result0 !== null ? result0 : "";
        if (result0 !== null) {
          if (input.charCodeAt(pos.offset) === 59) {
            result1 = ";";
            advance(pos, 1);
          } else {
            result1 = null;
            if (reportFailures === 0) {
              matchFailed("\";\"");
            }
          }
          if (result1 !== null) {
            result2 = parse_S();
            result2 = result2 !== null ? result2 : "";
            if (result2 !== null) {
              result0 = [result0, result1, result2];
            } else {
              result0 = null;
              pos = clone(pos0);
            }
          } else {
            result0 = null;
            pos = clone(pos0);
          }
        } else {
          result0 = null;
          pos = clone(pos0);
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_Identifier() {
        var cacheKey = "Identifier@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1, result2;
        var pos0, pos1;
        
        pos0 = clone(pos);
        pos1 = clone(pos);
        if (/^[a-z\xE4\xF6\xFC_]/.test(input.charAt(pos.offset))) {
          result0 = input.charAt(pos.offset);
          advance(pos, 1);
        } else {
          result0 = null;
          if (reportFailures === 0) {
            matchFailed("[a-z\\xE4\\xF6\\xFC_]");
          }
        }
        if (result0 !== null) {
          result1 = [];
          if (/^[a-z\xE4\xF6\xFC_]/.test(input.charAt(pos.offset))) {
            result2 = input.charAt(pos.offset);
            advance(pos, 1);
          } else {
            result2 = null;
            if (reportFailures === 0) {
              matchFailed("[a-z\\xE4\\xF6\\xFC_]");
            }
          }
          while (result2 !== null) {
            result1.push(result2);
            if (/^[a-z\xE4\xF6\xFC_]/.test(input.charAt(pos.offset))) {
              result2 = input.charAt(pos.offset);
              advance(pos, 1);
            } else {
              result2 = null;
              if (reportFailures === 0) {
                matchFailed("[a-z\\xE4\\xF6\\xFC_]");
              }
            }
          }
          if (result1 !== null) {
            result0 = [result0, result1];
          } else {
            result0 = null;
            pos = clone(pos1);
          }
        } else {
          result0 = null;
          pos = clone(pos1);
        }
        if (result0 !== null) {
          result0 = (function(offset, line, column, i1, i2) {return i1+i2.join("");})(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]);
        }
        if (result0 === null) {
          pos = clone(pos0);
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_PageVirtual() {
        var cacheKey = "PageVirtual@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1;
        var pos0, pos1;
        
        pos0 = clone(pos);
        pos1 = clone(pos);
        if (input.charCodeAt(pos.offset) === 64) {
          result0 = "@";
          advance(pos, 1);
        } else {
          result0 = null;
          if (reportFailures === 0) {
            matchFailed("\"@\"");
          }
        }
        if (result0 !== null) {
          result1 = parse_Identifier();
          if (result1 !== null) {
            result0 = [result0, result1];
          } else {
            result0 = null;
            pos = clone(pos1);
          }
        } else {
          result0 = null;
          pos = clone(pos1);
        }
        if (result0 !== null) {
          result0 = (function(offset, line, column, p, i) {return p+i;})(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]);
        }
        if (result0 === null) {
          pos = clone(pos0);
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_ItemVirtual() {
        var cacheKey = "ItemVirtual@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1;
        var pos0, pos1;
        
        pos0 = clone(pos);
        pos1 = clone(pos);
        if (input.charCodeAt(pos.offset) === 58) {
          result0 = ":";
          advance(pos, 1);
        } else {
          result0 = null;
          if (reportFailures === 0) {
            matchFailed("\":\"");
          }
        }
        if (result0 !== null) {
          result1 = parse_Identifier();
          if (result1 !== null) {
            result0 = [result0, result1];
          } else {
            result0 = null;
            pos = clone(pos1);
          }
        } else {
          result0 = null;
          pos = clone(pos1);
        }
        if (result0 !== null) {
          result0 = (function(offset, line, column, p, i) {return p+i;})(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]);
        }
        if (result0 === null) {
          pos = clone(pos0);
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_Page() {
        var cacheKey = "Page@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1;
        var pos0;
        
        pos0 = clone(pos);
        if (/^[0-9]/.test(input.charAt(pos.offset))) {
          result1 = input.charAt(pos.offset);
          advance(pos, 1);
        } else {
          result1 = null;
          if (reportFailures === 0) {
            matchFailed("[0-9]");
          }
        }
        if (result1 !== null) {
          result0 = [];
          while (result1 !== null) {
            result0.push(result1);
            if (/^[0-9]/.test(input.charAt(pos.offset))) {
              result1 = input.charAt(pos.offset);
              advance(pos, 1);
            } else {
              result1 = null;
              if (reportFailures === 0) {
                matchFailed("[0-9]");
              }
            }
          }
        } else {
          result0 = null;
        }
        if (result0 !== null) {
          result0 = (function(offset, line, column, p) {return p.join("");})(pos0.offset, pos0.line, pos0.column, result0);
        }
        if (result0 === null) {
          pos = clone(pos0);
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_Time() {
        var cacheKey = "Time@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1, result2;
        var pos0, pos1;
        
        pos0 = clone(pos);
        pos1 = clone(pos);
        if (/^[1-9]/.test(input.charAt(pos.offset))) {
          result0 = input.charAt(pos.offset);
          advance(pos, 1);
        } else {
          result0 = null;
          if (reportFailures === 0) {
            matchFailed("[1-9]");
          }
        }
        if (result0 !== null) {
          result1 = [];
          if (/^[0-9]/.test(input.charAt(pos.offset))) {
            result2 = input.charAt(pos.offset);
            advance(pos, 1);
          } else {
            result2 = null;
            if (reportFailures === 0) {
              matchFailed("[0-9]");
            }
          }
          while (result2 !== null) {
            result1.push(result2);
            if (/^[0-9]/.test(input.charAt(pos.offset))) {
              result2 = input.charAt(pos.offset);
              advance(pos, 1);
            } else {
              result2 = null;
              if (reportFailures === 0) {
                matchFailed("[0-9]");
              }
            }
          }
          if (result1 !== null) {
            result0 = [result0, result1];
          } else {
            result0 = null;
            pos = clone(pos1);
          }
        } else {
          result0 = null;
          pos = clone(pos1);
        }
        if (result0 !== null) {
          result0 = (function(offset, line, column, p, q) {return parseInt(p+q.join(""));})(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]);
        }
        if (result0 === null) {
          pos = clone(pos0);
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_Overlay() {
        var cacheKey = "Overlay@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1;
        var pos0;
        
        pos0 = clone(pos);
        if (/^[a-z]/.test(input.charAt(pos.offset))) {
          result1 = input.charAt(pos.offset);
          advance(pos, 1);
        } else {
          result1 = null;
          if (reportFailures === 0) {
            matchFailed("[a-z]");
          }
        }
        if (result1 !== null) {
          result0 = [];
          while (result1 !== null) {
            result0.push(result1);
            if (/^[a-z]/.test(input.charAt(pos.offset))) {
              result1 = input.charAt(pos.offset);
              advance(pos, 1);
            } else {
              result1 = null;
              if (reportFailures === 0) {
                matchFailed("[a-z]");
              }
            }
          }
        } else {
          result0 = null;
        }
        if (result0 !== null) {
          result0 = (function(offset, line, column, p) {return p.join("");})(pos0.offset, pos0.line, pos0.column, result0);
        }
        if (result0 === null) {
          pos = clone(pos0);
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_S() {
        var cacheKey = "S@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1, result2, result3, result4;
        var pos0, pos1;
        
        pos0 = clone(pos);
        result0 = [];
        if (/^[ \t\n]/.test(input.charAt(pos.offset))) {
          result1 = input.charAt(pos.offset);
          advance(pos, 1);
        } else {
          result1 = null;
          if (reportFailures === 0) {
            matchFailed("[ \\t\\n]");
          }
        }
        while (result1 !== null) {
          result0.push(result1);
          if (/^[ \t\n]/.test(input.charAt(pos.offset))) {
            result1 = input.charAt(pos.offset);
            advance(pos, 1);
          } else {
            result1 = null;
            if (reportFailures === 0) {
              matchFailed("[ \\t\\n]");
            }
          }
        }
        if (result0 !== null) {
          if (input.substr(pos.offset, 2) === "/*") {
            result1 = "/*";
            advance(pos, 2);
          } else {
            result1 = null;
            if (reportFailures === 0) {
              matchFailed("\"/*\"");
            }
          }
          if (result1 !== null) {
            result2 = [];
            if (/^[^*]/.test(input.charAt(pos.offset))) {
              result3 = input.charAt(pos.offset);
              advance(pos, 1);
            } else {
              result3 = null;
              if (reportFailures === 0) {
                matchFailed("[^*]");
              }
            }
            if (result3 === null) {
              pos1 = clone(pos);
              if (/^[*]/.test(input.charAt(pos.offset))) {
                result3 = input.charAt(pos.offset);
                advance(pos, 1);
              } else {
                result3 = null;
                if (reportFailures === 0) {
                  matchFailed("[*]");
                }
              }
              if (result3 !== null) {
                if (/^[^\/]/.test(input.charAt(pos.offset))) {
                  result4 = input.charAt(pos.offset);
                  advance(pos, 1);
                } else {
                  result4 = null;
                  if (reportFailures === 0) {
                    matchFailed("[^\\/]");
                  }
                }
                if (result4 !== null) {
                  result3 = [result3, result4];
                } else {
                  result3 = null;
                  pos = clone(pos1);
                }
              } else {
                result3 = null;
                pos = clone(pos1);
              }
            }
            while (result3 !== null) {
              result2.push(result3);
              if (/^[^*]/.test(input.charAt(pos.offset))) {
                result3 = input.charAt(pos.offset);
                advance(pos, 1);
              } else {
                result3 = null;
                if (reportFailures === 0) {
                  matchFailed("[^*]");
                }
              }
              if (result3 === null) {
                pos1 = clone(pos);
                if (/^[*]/.test(input.charAt(pos.offset))) {
                  result3 = input.charAt(pos.offset);
                  advance(pos, 1);
                } else {
                  result3 = null;
                  if (reportFailures === 0) {
                    matchFailed("[*]");
                  }
                }
                if (result3 !== null) {
                  if (/^[^\/]/.test(input.charAt(pos.offset))) {
                    result4 = input.charAt(pos.offset);
                    advance(pos, 1);
                  } else {
                    result4 = null;
                    if (reportFailures === 0) {
                      matchFailed("[^\\/]");
                    }
                  }
                  if (result4 !== null) {
                    result3 = [result3, result4];
                  } else {
                    result3 = null;
                    pos = clone(pos1);
                  }
                } else {
                  result3 = null;
                  pos = clone(pos1);
                }
              }
            }
            if (result2 !== null) {
              if (input.substr(pos.offset, 2) === "*/") {
                result3 = "*/";
                advance(pos, 2);
              } else {
                result3 = null;
                if (reportFailures === 0) {
                  matchFailed("\"*/\"");
                }
              }
              if (result3 !== null) {
                result4 = parse_S();
                result4 = result4 !== null ? result4 : "";
                if (result4 !== null) {
                  result0 = [result0, result1, result2, result3, result4];
                } else {
                  result0 = null;
                  pos = clone(pos0);
                }
              } else {
                result0 = null;
                pos = clone(pos0);
              }
            } else {
              result0 = null;
              pos = clone(pos0);
            }
          } else {
            result0 = null;
            pos = clone(pos0);
          }
        } else {
          result0 = null;
          pos = clone(pos0);
        }
        if (result0 === null) {
          pos0 = clone(pos);
          result0 = [];
          if (/^[ \t\n]/.test(input.charAt(pos.offset))) {
            result1 = input.charAt(pos.offset);
            advance(pos, 1);
          } else {
            result1 = null;
            if (reportFailures === 0) {
              matchFailed("[ \\t\\n]");
            }
          }
          while (result1 !== null) {
            result0.push(result1);
            if (/^[ \t\n]/.test(input.charAt(pos.offset))) {
              result1 = input.charAt(pos.offset);
              advance(pos, 1);
            } else {
              result1 = null;
              if (reportFailures === 0) {
                matchFailed("[ \\t\\n]");
              }
            }
          }
          if (result0 !== null) {
            if (input.substr(pos.offset, 2) === "//") {
              result1 = "//";
              advance(pos, 2);
            } else {
              result1 = null;
              if (reportFailures === 0) {
                matchFailed("\"//\"");
              }
            }
            if (result1 !== null) {
              result2 = [];
              if (/^[^\n]/.test(input.charAt(pos.offset))) {
                result3 = input.charAt(pos.offset);
                advance(pos, 1);
              } else {
                result3 = null;
                if (reportFailures === 0) {
                  matchFailed("[^\\n]");
                }
              }
              while (result3 !== null) {
                result2.push(result3);
                if (/^[^\n]/.test(input.charAt(pos.offset))) {
                  result3 = input.charAt(pos.offset);
                  advance(pos, 1);
                } else {
                  result3 = null;
                  if (reportFailures === 0) {
                    matchFailed("[^\\n]");
                  }
                }
              }
              if (result2 !== null) {
                result3 = parse_S();
                result3 = result3 !== null ? result3 : "";
                if (result3 !== null) {
                  result0 = [result0, result1, result2, result3];
                } else {
                  result0 = null;
                  pos = clone(pos0);
                }
              } else {
                result0 = null;
                pos = clone(pos0);
              }
            } else {
              result0 = null;
              pos = clone(pos0);
            }
          } else {
            result0 = null;
            pos = clone(pos0);
          }
          if (result0 === null) {
            if (/^[ \t\n]/.test(input.charAt(pos.offset))) {
              result1 = input.charAt(pos.offset);
              advance(pos, 1);
            } else {
              result1 = null;
              if (reportFailures === 0) {
                matchFailed("[ \\t\\n]");
              }
            }
            if (result1 !== null) {
              result0 = [];
              while (result1 !== null) {
                result0.push(result1);
                if (/^[ \t\n]/.test(input.charAt(pos.offset))) {
                  result1 = input.charAt(pos.offset);
                  advance(pos, 1);
                } else {
                  result1 = null;
                  if (reportFailures === 0) {
                    matchFailed("[ \\t\\n]");
                  }
                }
              }
            } else {
              result0 = null;
            }
          }
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_String() {
        var cacheKey = "String@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1, result2;
        var pos0, pos1;
        
        pos0 = clone(pos);
        pos1 = clone(pos);
        if (input.charCodeAt(pos.offset) === 39) {
          result0 = "'";
          advance(pos, 1);
        } else {
          result0 = null;
          if (reportFailures === 0) {
            matchFailed("\"'\"");
          }
        }
        if (result0 !== null) {
          result1 = [];
          result2 = parse_SingleStringChar();
          while (result2 !== null) {
            result1.push(result2);
            result2 = parse_SingleStringChar();
          }
          if (result1 !== null) {
            if (input.charCodeAt(pos.offset) === 39) {
              result2 = "'";
              advance(pos, 1);
            } else {
              result2 = null;
              if (reportFailures === 0) {
                matchFailed("\"'\"");
              }
            }
            if (result2 !== null) {
              result0 = [result0, result1, result2];
            } else {
              result0 = null;
              pos = clone(pos1);
            }
          } else {
            result0 = null;
            pos = clone(pos1);
          }
        } else {
          result0 = null;
          pos = clone(pos1);
        }
        if (result0 !== null) {
          result0 = (function(offset, line, column, s) { return s.join("");})(pos0.offset, pos0.line, pos0.column, result0[1]);
        }
        if (result0 === null) {
          pos = clone(pos0);
        }
        if (result0 === null) {
          pos0 = clone(pos);
          pos1 = clone(pos);
          if (input.charCodeAt(pos.offset) === 34) {
            result0 = "\"";
            advance(pos, 1);
          } else {
            result0 = null;
            if (reportFailures === 0) {
              matchFailed("\"\\\"\"");
            }
          }
          if (result0 !== null) {
            result1 = [];
            result2 = parse_DoubleStringChar();
            while (result2 !== null) {
              result1.push(result2);
              result2 = parse_DoubleStringChar();
            }
            if (result1 !== null) {
              if (input.charCodeAt(pos.offset) === 34) {
                result2 = "\"";
                advance(pos, 1);
              } else {
                result2 = null;
                if (reportFailures === 0) {
                  matchFailed("\"\\\"\"");
                }
              }
              if (result2 !== null) {
                result0 = [result0, result1, result2];
              } else {
                result0 = null;
                pos = clone(pos1);
              }
            } else {
              result0 = null;
              pos = clone(pos1);
            }
          } else {
            result0 = null;
            pos = clone(pos1);
          }
          if (result0 !== null) {
            result0 = (function(offset, line, column, s) { return s.join("");})(pos0.offset, pos0.line, pos0.column, result0[1]);
          }
          if (result0 === null) {
            pos = clone(pos0);
          }
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_SingleStringChar() {
        var cacheKey = "SingleStringChar@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0;
        
        result0 = parse_EscapeSequence();
        if (result0 === null) {
          if (/^[^']/.test(input.charAt(pos.offset))) {
            result0 = input.charAt(pos.offset);
            advance(pos, 1);
          } else {
            result0 = null;
            if (reportFailures === 0) {
              matchFailed("[^']");
            }
          }
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_DoubleStringChar() {
        var cacheKey = "DoubleStringChar@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0;
        
        result0 = parse_EscapeSequence();
        if (result0 === null) {
          if (/^[^"]/.test(input.charAt(pos.offset))) {
            result0 = input.charAt(pos.offset);
            advance(pos, 1);
          } else {
            result0 = null;
            if (reportFailures === 0) {
              matchFailed("[^\"]");
            }
          }
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_EscapeSequence() {
        var cacheKey = "EscapeSequence@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0;
        var pos0;
        
        pos0 = clone(pos);
        if (input.substr(pos.offset, 2) === "\\n") {
          result0 = "\\n";
          advance(pos, 2);
        } else {
          result0 = null;
          if (reportFailures === 0) {
            matchFailed("\"\\\\n\"");
          }
        }
        if (result0 !== null) {
          result0 = (function(offset, line, column) {return "\n";})(pos0.offset, pos0.line, pos0.column);
        }
        if (result0 === null) {
          pos = clone(pos0);
        }
        if (result0 === null) {
          pos0 = clone(pos);
          if (input.substr(pos.offset, 2) === "\\\"") {
            result0 = "\\\"";
            advance(pos, 2);
          } else {
            result0 = null;
            if (reportFailures === 0) {
              matchFailed("\"\\\\\\\"\"");
            }
          }
          if (result0 !== null) {
            result0 = (function(offset, line, column) {return '"';})(pos0.offset, pos0.line, pos0.column);
          }
          if (result0 === null) {
            pos = clone(pos0);
          }
          if (result0 === null) {
            pos0 = clone(pos);
            if (input.substr(pos.offset, 2) === "\\'") {
              result0 = "\\'";
              advance(pos, 2);
            } else {
              result0 = null;
              if (reportFailures === 0) {
                matchFailed("\"\\\\'\"");
              }
            }
            if (result0 !== null) {
              result0 = (function(offset, line, column) {return "'";})(pos0.offset, pos0.line, pos0.column);
            }
            if (result0 === null) {
              pos = clone(pos0);
            }
          }
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      function parse_End() {
        var cacheKey = "End@" + pos.offset;
        var cachedResult = cache[cacheKey];
        if (cachedResult) {
          pos = clone(cachedResult.nextPos);
          return cachedResult.result;
        }
        
        var result0, result1, result2, result3;
        var pos0;
        
        pos0 = clone(pos);
        if (input.substr(pos.offset, 3) === "end") {
          result0 = "end";
          advance(pos, 3);
        } else {
          result0 = null;
          if (reportFailures === 0) {
            matchFailed("\"end\"");
          }
        }
        if (result0 !== null) {
          result1 = parse_S();
          result1 = result1 !== null ? result1 : "";
          if (result1 !== null) {
            if (input.charCodeAt(pos.offset) === 46) {
              result2 = ".";
              advance(pos, 1);
            } else {
              result2 = null;
              if (reportFailures === 0) {
                matchFailed("\".\"");
              }
            }
            if (result2 !== null) {
              result3 = parse_S();
              result3 = result3 !== null ? result3 : "";
              if (result3 !== null) {
                result0 = [result0, result1, result2, result3];
              } else {
                result0 = null;
                pos = clone(pos0);
              }
            } else {
              result0 = null;
              pos = clone(pos0);
            }
          } else {
            result0 = null;
            pos = clone(pos0);
          }
        } else {
          result0 = null;
          pos = clone(pos0);
        }
        
        cache[cacheKey] = {
          nextPos: clone(pos),
          result:  result0
        };
        return result0;
      }
      
      
      function cleanupExpected(expected) {
        expected.sort();
        
        var lastExpected = null;
        var cleanExpected = [];
        for (var i = 0; i < expected.length; i++) {
          if (expected[i] !== lastExpected) {
            cleanExpected.push(expected[i]);
            lastExpected = expected[i];
          }
        }
        return cleanExpected;
      }
      
      
      
      var result = parseFunctions[startRule]();
      
      /*
       * The parser is now in one of the following three states:
       *
       * 1. The parser successfully parsed the whole input.
       *
       *    - |result !== null|
       *    - |pos.offset === input.length|
       *    - |rightmostFailuresExpected| may or may not contain something
       *
       * 2. The parser successfully parsed only a part of the input.
       *
       *    - |result !== null|
       *    - |pos.offset < input.length|
       *    - |rightmostFailuresExpected| may or may not contain something
       *
       * 3. The parser did not successfully parse any part of the input.
       *
       *   - |result === null|
       *   - |pos.offset === 0|
       *   - |rightmostFailuresExpected| contains at least one failure
       *
       * All code following this comment (including called functions) must
       * handle these states.
       */
      if (result === null || pos.offset !== input.length) {
        var offset = Math.max(pos.offset, rightmostFailuresPos.offset);
        var found = offset < input.length ? input.charAt(offset) : null;
        var errorPosition = pos.offset > rightmostFailuresPos.offset ? pos : rightmostFailuresPos;
        
        throw new this.SyntaxError(
          cleanupExpected(rightmostFailuresExpected),
          found,
          offset,
          errorPosition.line,
          errorPosition.column
        );
      }
      
      return result;
    },
    
    /* Returns the parser source code. */
    toSource: function() { return this._source; }
  };
  
  /* Thrown when a parser encounters a syntax error. */
  
  result.SyntaxError = function(expected, found, offset, line, column) {
    function buildMessage(expected, found) {
      var expectedHumanized, foundHumanized;
      
      switch (expected.length) {
        case 0:
          expectedHumanized = "end of input";
          break;
        case 1:
          expectedHumanized = expected[0];
          break;
        default:
          expectedHumanized = expected.slice(0, expected.length - 1).join(", ")
            + " or "
            + expected[expected.length - 1];
      }
      
      foundHumanized = found ? quote(found) : "end of input";
      
      return "Expected " + expectedHumanized + " but " + foundHumanized + " found.";
    }
    
    this.name = "SyntaxError";
    this.expected = expected;
    this.found = found;
    this.message = buildMessage(expected, found);
    this.offset = offset;
    this.line = line;
    this.column = column;
  };
  
  result.SyntaxError.prototype = Error.prototype;
  
  return result;
})();