minor adjustment to readme
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / esquery / parser.js
1 /*
2  * Generated by PEG.js 0.10.0.
3  *
4  * http://pegjs.org/
5  */
6 (function(root, factory) {
7   if (typeof define === "function" && define.amd) {
8     define([], factory);
9   } else if (typeof module === "object" && module.exports) {
10     module.exports = factory();
11   }
12 })(this, function() {
13   "use strict";
14
15   function peg$subclass(child, parent) {
16     function ctor() { this.constructor = child; }
17     ctor.prototype = parent.prototype;
18     child.prototype = new ctor();
19   }
20
21   function peg$SyntaxError(message, expected, found, location) {
22     this.message  = message;
23     this.expected = expected;
24     this.found    = found;
25     this.location = location;
26     this.name     = "SyntaxError";
27
28     if (typeof Error.captureStackTrace === "function") {
29       Error.captureStackTrace(this, peg$SyntaxError);
30     }
31   }
32
33   peg$subclass(peg$SyntaxError, Error);
34
35   peg$SyntaxError.buildMessage = function(expected, found) {
36     var DESCRIBE_EXPECTATION_FNS = {
37           literal: function(expectation) {
38             return "\"" + literalEscape(expectation.text) + "\"";
39           },
40
41           "class": function(expectation) {
42             var escapedParts = "",
43                 i;
44
45             for (i = 0; i < expectation.parts.length; i++) {
46               escapedParts += expectation.parts[i] instanceof Array
47                 ? classEscape(expectation.parts[i][0]) + "-" + classEscape(expectation.parts[i][1])
48                 : classEscape(expectation.parts[i]);
49             }
50
51             return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]";
52           },
53
54           any: function(expectation) {
55             return "any character";
56           },
57
58           end: function(expectation) {
59             return "end of input";
60           },
61
62           other: function(expectation) {
63             return expectation.description;
64           }
65         };
66
67     function hex(ch) {
68       return ch.charCodeAt(0).toString(16).toUpperCase();
69     }
70
71     function literalEscape(s) {
72       return s
73         .replace(/\\/g, '\\\\')
74         .replace(/"/g,  '\\"')
75         .replace(/\0/g, '\\0')
76         .replace(/\t/g, '\\t')
77         .replace(/\n/g, '\\n')
78         .replace(/\r/g, '\\r')
79         .replace(/[\x00-\x0F]/g,          function(ch) { return '\\x0' + hex(ch); })
80         .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return '\\x'  + hex(ch); });
81     }
82
83     function classEscape(s) {
84       return s
85         .replace(/\\/g, '\\\\')
86         .replace(/\]/g, '\\]')
87         .replace(/\^/g, '\\^')
88         .replace(/-/g,  '\\-')
89         .replace(/\0/g, '\\0')
90         .replace(/\t/g, '\\t')
91         .replace(/\n/g, '\\n')
92         .replace(/\r/g, '\\r')
93         .replace(/[\x00-\x0F]/g,          function(ch) { return '\\x0' + hex(ch); })
94         .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return '\\x'  + hex(ch); });
95     }
96
97     function describeExpectation(expectation) {
98       return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);
99     }
100
101     function describeExpected(expected) {
102       var descriptions = new Array(expected.length),
103           i, j;
104
105       for (i = 0; i < expected.length; i++) {
106         descriptions[i] = describeExpectation(expected[i]);
107       }
108
109       descriptions.sort();
110
111       if (descriptions.length > 0) {
112         for (i = 1, j = 1; i < descriptions.length; i++) {
113           if (descriptions[i - 1] !== descriptions[i]) {
114             descriptions[j] = descriptions[i];
115             j++;
116           }
117         }
118         descriptions.length = j;
119       }
120
121       switch (descriptions.length) {
122         case 1:
123           return descriptions[0];
124
125         case 2:
126           return descriptions[0] + " or " + descriptions[1];
127
128         default:
129           return descriptions.slice(0, -1).join(", ")
130             + ", or "
131             + descriptions[descriptions.length - 1];
132       }
133     }
134
135     function describeFound(found) {
136       return found ? "\"" + literalEscape(found) + "\"" : "end of input";
137     }
138
139     return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found.";
140   };
141
142   function peg$parse(input, options) {
143     options = options !== void 0 ? options : {};
144
145     var peg$FAILED = {},
146
147         peg$startRuleFunctions = { start: peg$parsestart },
148         peg$startRuleFunction  = peg$parsestart,
149
150         peg$c0 = function(ss) {
151             return ss.length === 1 ? ss[0] : { type: 'matches', selectors: ss };
152           },
153         peg$c1 = function() { return void 0; },
154         peg$c2 = " ",
155         peg$c3 = peg$literalExpectation(" ", false),
156         peg$c4 = /^[^ [\],():#!=><~+.]/,
157         peg$c5 = peg$classExpectation([" ", "[", "]", ",", "(", ")", ":", "#", "!", "=", ">", "<", "~", "+", "."], true, false),
158         peg$c6 = function(i) { return i.join(''); },
159         peg$c7 = ">",
160         peg$c8 = peg$literalExpectation(">", false),
161         peg$c9 = function() { return 'child'; },
162         peg$c10 = "~",
163         peg$c11 = peg$literalExpectation("~", false),
164         peg$c12 = function() { return 'sibling'; },
165         peg$c13 = "+",
166         peg$c14 = peg$literalExpectation("+", false),
167         peg$c15 = function() { return 'adjacent'; },
168         peg$c16 = function() { return 'descendant'; },
169         peg$c17 = ",",
170         peg$c18 = peg$literalExpectation(",", false),
171         peg$c19 = function(s, ss) {
172           return [s].concat(ss.map(function (s) { return s[3]; }));
173         },
174         peg$c20 = function(a, ops) {
175             return ops.reduce(function (memo, rhs) {
176               return { type: rhs[0], left: memo, right: rhs[1] };
177             }, a);
178           },
179         peg$c21 = "!",
180         peg$c22 = peg$literalExpectation("!", false),
181         peg$c23 = function(subject, as) {
182             const b = as.length === 1 ? as[0] : { type: 'compound', selectors: as };
183             if(subject) b.subject = true;
184             return b;
185           },
186         peg$c24 = "*",
187         peg$c25 = peg$literalExpectation("*", false),
188         peg$c26 = function(a) { return { type: 'wildcard', value: a }; },
189         peg$c27 = "#",
190         peg$c28 = peg$literalExpectation("#", false),
191         peg$c29 = function(i) { return { type: 'identifier', value: i }; },
192         peg$c30 = "[",
193         peg$c31 = peg$literalExpectation("[", false),
194         peg$c32 = "]",
195         peg$c33 = peg$literalExpectation("]", false),
196         peg$c34 = function(v) { return v; },
197         peg$c35 = /^[><!]/,
198         peg$c36 = peg$classExpectation([">", "<", "!"], false, false),
199         peg$c37 = "=",
200         peg$c38 = peg$literalExpectation("=", false),
201         peg$c39 = function(a) { return (a || '') + '='; },
202         peg$c40 = /^[><]/,
203         peg$c41 = peg$classExpectation([">", "<"], false, false),
204         peg$c42 = ".",
205         peg$c43 = peg$literalExpectation(".", false),
206         peg$c44 = function(name, op, value) {
207               return { type: 'attribute', name: name, operator: op, value: value };
208             },
209         peg$c45 = function(name) { return { type: 'attribute', name: name }; },
210         peg$c46 = "\"",
211         peg$c47 = peg$literalExpectation("\"", false),
212         peg$c48 = /^[^\\"]/,
213         peg$c49 = peg$classExpectation(["\\", "\""], true, false),
214         peg$c50 = "\\",
215         peg$c51 = peg$literalExpectation("\\", false),
216         peg$c52 = peg$anyExpectation(),
217         peg$c53 = function(a, b) { return a + b; },
218         peg$c54 = function(d) {
219                 return { type: 'literal', value: strUnescape(d.join('')) };
220               },
221         peg$c55 = "'",
222         peg$c56 = peg$literalExpectation("'", false),
223         peg$c57 = /^[^\\']/,
224         peg$c58 = peg$classExpectation(["\\", "'"], true, false),
225         peg$c59 = /^[0-9]/,
226         peg$c60 = peg$classExpectation([["0", "9"]], false, false),
227         peg$c61 = function(a, b) {
228                 // Can use `a.flat().join('')` once supported
229                 const leadingDecimals = a ? [].concat.apply([], a).join('') : '';
230                 return { type: 'literal', value: parseFloat(leadingDecimals + b.join('')) };
231               },
232         peg$c62 = function(i) { return { type: 'literal', value: i }; },
233         peg$c63 = "type(",
234         peg$c64 = peg$literalExpectation("type(", false),
235         peg$c65 = /^[^ )]/,
236         peg$c66 = peg$classExpectation([" ", ")"], true, false),
237         peg$c67 = ")",
238         peg$c68 = peg$literalExpectation(")", false),
239         peg$c69 = function(t) { return { type: 'type', value: t.join('') }; },
240         peg$c70 = /^[imsu]/,
241         peg$c71 = peg$classExpectation(["i", "m", "s", "u"], false, false),
242         peg$c72 = "/",
243         peg$c73 = peg$literalExpectation("/", false),
244         peg$c74 = /^[^\/]/,
245         peg$c75 = peg$classExpectation(["/"], true, false),
246         peg$c76 = function(d, flgs) { return {
247               type: 'regexp', value: new RegExp(d.join(''), flgs ? flgs.join('') : '') };
248             },
249         peg$c77 = function(i, is) {
250           return { type: 'field', name: is.reduce(function(memo, p){ return memo + p[0] + p[1]; }, i)};
251         },
252         peg$c78 = ":not(",
253         peg$c79 = peg$literalExpectation(":not(", false),
254         peg$c80 = function(ss) { return { type: 'not', selectors: ss }; },
255         peg$c81 = ":matches(",
256         peg$c82 = peg$literalExpectation(":matches(", false),
257         peg$c83 = function(ss) { return { type: 'matches', selectors: ss }; },
258         peg$c84 = ":has(",
259         peg$c85 = peg$literalExpectation(":has(", false),
260         peg$c86 = function(ss) { return { type: 'has', selectors: ss }; },
261         peg$c87 = ":first-child",
262         peg$c88 = peg$literalExpectation(":first-child", false),
263         peg$c89 = function() { return nth(1); },
264         peg$c90 = ":last-child",
265         peg$c91 = peg$literalExpectation(":last-child", false),
266         peg$c92 = function() { return nthLast(1); },
267         peg$c93 = ":nth-child(",
268         peg$c94 = peg$literalExpectation(":nth-child(", false),
269         peg$c95 = function(n) { return nth(parseInt(n.join(''), 10)); },
270         peg$c96 = ":nth-last-child(",
271         peg$c97 = peg$literalExpectation(":nth-last-child(", false),
272         peg$c98 = function(n) { return nthLast(parseInt(n.join(''), 10)); },
273         peg$c99 = ":",
274         peg$c100 = peg$literalExpectation(":", false),
275         peg$c101 = "statement",
276         peg$c102 = peg$literalExpectation("statement", true),
277         peg$c103 = "expression",
278         peg$c104 = peg$literalExpectation("expression", true),
279         peg$c105 = "declaration",
280         peg$c106 = peg$literalExpectation("declaration", true),
281         peg$c107 = "function",
282         peg$c108 = peg$literalExpectation("function", true),
283         peg$c109 = "pattern",
284         peg$c110 = peg$literalExpectation("pattern", true),
285         peg$c111 = function(c) {
286           return { type: 'class', name: c };
287         },
288
289         peg$currPos          = 0,
290         peg$savedPos         = 0,
291         peg$posDetailsCache  = [{ line: 1, column: 1 }],
292         peg$maxFailPos       = 0,
293         peg$maxFailExpected  = [],
294         peg$silentFails      = 0,
295
296         peg$resultsCache = {},
297
298         peg$result;
299
300     if ("startRule" in options) {
301       if (!(options.startRule in peg$startRuleFunctions)) {
302         throw new Error("Can't start parsing from rule \"" + options.startRule + "\".");
303       }
304
305       peg$startRuleFunction = peg$startRuleFunctions[options.startRule];
306     }
307
308     function text() {
309       return input.substring(peg$savedPos, peg$currPos);
310     }
311
312     function location() {
313       return peg$computeLocation(peg$savedPos, peg$currPos);
314     }
315
316     function expected(description, location) {
317       location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos)
318
319       throw peg$buildStructuredError(
320         [peg$otherExpectation(description)],
321         input.substring(peg$savedPos, peg$currPos),
322         location
323       );
324     }
325
326     function error(message, location) {
327       location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos)
328
329       throw peg$buildSimpleError(message, location);
330     }
331
332     function peg$literalExpectation(text, ignoreCase) {
333       return { type: "literal", text: text, ignoreCase: ignoreCase };
334     }
335
336     function peg$classExpectation(parts, inverted, ignoreCase) {
337       return { type: "class", parts: parts, inverted: inverted, ignoreCase: ignoreCase };
338     }
339
340     function peg$anyExpectation() {
341       return { type: "any" };
342     }
343
344     function peg$endExpectation() {
345       return { type: "end" };
346     }
347
348     function peg$otherExpectation(description) {
349       return { type: "other", description: description };
350     }
351
352     function peg$computePosDetails(pos) {
353       var details = peg$posDetailsCache[pos], p;
354
355       if (details) {
356         return details;
357       } else {
358         p = pos - 1;
359         while (!peg$posDetailsCache[p]) {
360           p--;
361         }
362
363         details = peg$posDetailsCache[p];
364         details = {
365           line:   details.line,
366           column: details.column
367         };
368
369         while (p < pos) {
370           if (input.charCodeAt(p) === 10) {
371             details.line++;
372             details.column = 1;
373           } else {
374             details.column++;
375           }
376
377           p++;
378         }
379
380         peg$posDetailsCache[pos] = details;
381         return details;
382       }
383     }
384
385     function peg$computeLocation(startPos, endPos) {
386       var startPosDetails = peg$computePosDetails(startPos),
387           endPosDetails   = peg$computePosDetails(endPos);
388
389       return {
390         start: {
391           offset: startPos,
392           line:   startPosDetails.line,
393           column: startPosDetails.column
394         },
395         end: {
396           offset: endPos,
397           line:   endPosDetails.line,
398           column: endPosDetails.column
399         }
400       };
401     }
402
403     function peg$fail(expected) {
404       if (peg$currPos < peg$maxFailPos) { return; }
405
406       if (peg$currPos > peg$maxFailPos) {
407         peg$maxFailPos = peg$currPos;
408         peg$maxFailExpected = [];
409       }
410
411       peg$maxFailExpected.push(expected);
412     }
413
414     function peg$buildSimpleError(message, location) {
415       return new peg$SyntaxError(message, null, null, location);
416     }
417
418     function peg$buildStructuredError(expected, found, location) {
419       return new peg$SyntaxError(
420         peg$SyntaxError.buildMessage(expected, found),
421         expected,
422         found,
423         location
424       );
425     }
426
427     function peg$parsestart() {
428       var s0, s1, s2, s3;
429
430       var key    = peg$currPos * 30 + 0,
431           cached = peg$resultsCache[key];
432
433       if (cached) {
434         peg$currPos = cached.nextPos;
435
436         return cached.result;
437       }
438
439       s0 = peg$currPos;
440       s1 = peg$parse_();
441       if (s1 !== peg$FAILED) {
442         s2 = peg$parseselectors();
443         if (s2 !== peg$FAILED) {
444           s3 = peg$parse_();
445           if (s3 !== peg$FAILED) {
446             peg$savedPos = s0;
447             s1 = peg$c0(s2);
448             s0 = s1;
449           } else {
450             peg$currPos = s0;
451             s0 = peg$FAILED;
452           }
453         } else {
454           peg$currPos = s0;
455           s0 = peg$FAILED;
456         }
457       } else {
458         peg$currPos = s0;
459         s0 = peg$FAILED;
460       }
461       if (s0 === peg$FAILED) {
462         s0 = peg$currPos;
463         s1 = peg$parse_();
464         if (s1 !== peg$FAILED) {
465           peg$savedPos = s0;
466           s1 = peg$c1();
467         }
468         s0 = s1;
469       }
470
471       peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
472
473       return s0;
474     }
475
476     function peg$parse_() {
477       var s0, s1;
478
479       var key    = peg$currPos * 30 + 1,
480           cached = peg$resultsCache[key];
481
482       if (cached) {
483         peg$currPos = cached.nextPos;
484
485         return cached.result;
486       }
487
488       s0 = [];
489       if (input.charCodeAt(peg$currPos) === 32) {
490         s1 = peg$c2;
491         peg$currPos++;
492       } else {
493         s1 = peg$FAILED;
494         if (peg$silentFails === 0) { peg$fail(peg$c3); }
495       }
496       while (s1 !== peg$FAILED) {
497         s0.push(s1);
498         if (input.charCodeAt(peg$currPos) === 32) {
499           s1 = peg$c2;
500           peg$currPos++;
501         } else {
502           s1 = peg$FAILED;
503           if (peg$silentFails === 0) { peg$fail(peg$c3); }
504         }
505       }
506
507       peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
508
509       return s0;
510     }
511
512     function peg$parseidentifierName() {
513       var s0, s1, s2;
514
515       var key    = peg$currPos * 30 + 2,
516           cached = peg$resultsCache[key];
517
518       if (cached) {
519         peg$currPos = cached.nextPos;
520
521         return cached.result;
522       }
523
524       s0 = peg$currPos;
525       s1 = [];
526       if (peg$c4.test(input.charAt(peg$currPos))) {
527         s2 = input.charAt(peg$currPos);
528         peg$currPos++;
529       } else {
530         s2 = peg$FAILED;
531         if (peg$silentFails === 0) { peg$fail(peg$c5); }
532       }
533       if (s2 !== peg$FAILED) {
534         while (s2 !== peg$FAILED) {
535           s1.push(s2);
536           if (peg$c4.test(input.charAt(peg$currPos))) {
537             s2 = input.charAt(peg$currPos);
538             peg$currPos++;
539           } else {
540             s2 = peg$FAILED;
541             if (peg$silentFails === 0) { peg$fail(peg$c5); }
542           }
543         }
544       } else {
545         s1 = peg$FAILED;
546       }
547       if (s1 !== peg$FAILED) {
548         peg$savedPos = s0;
549         s1 = peg$c6(s1);
550       }
551       s0 = s1;
552
553       peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
554
555       return s0;
556     }
557
558     function peg$parsebinaryOp() {
559       var s0, s1, s2, s3;
560
561       var key    = peg$currPos * 30 + 3,
562           cached = peg$resultsCache[key];
563
564       if (cached) {
565         peg$currPos = cached.nextPos;
566
567         return cached.result;
568       }
569
570       s0 = peg$currPos;
571       s1 = peg$parse_();
572       if (s1 !== peg$FAILED) {
573         if (input.charCodeAt(peg$currPos) === 62) {
574           s2 = peg$c7;
575           peg$currPos++;
576         } else {
577           s2 = peg$FAILED;
578           if (peg$silentFails === 0) { peg$fail(peg$c8); }
579         }
580         if (s2 !== peg$FAILED) {
581           s3 = peg$parse_();
582           if (s3 !== peg$FAILED) {
583             peg$savedPos = s0;
584             s1 = peg$c9();
585             s0 = s1;
586           } else {
587             peg$currPos = s0;
588             s0 = peg$FAILED;
589           }
590         } else {
591           peg$currPos = s0;
592           s0 = peg$FAILED;
593         }
594       } else {
595         peg$currPos = s0;
596         s0 = peg$FAILED;
597       }
598       if (s0 === peg$FAILED) {
599         s0 = peg$currPos;
600         s1 = peg$parse_();
601         if (s1 !== peg$FAILED) {
602           if (input.charCodeAt(peg$currPos) === 126) {
603             s2 = peg$c10;
604             peg$currPos++;
605           } else {
606             s2 = peg$FAILED;
607             if (peg$silentFails === 0) { peg$fail(peg$c11); }
608           }
609           if (s2 !== peg$FAILED) {
610             s3 = peg$parse_();
611             if (s3 !== peg$FAILED) {
612               peg$savedPos = s0;
613               s1 = peg$c12();
614               s0 = s1;
615             } else {
616               peg$currPos = s0;
617               s0 = peg$FAILED;
618             }
619           } else {
620             peg$currPos = s0;
621             s0 = peg$FAILED;
622           }
623         } else {
624           peg$currPos = s0;
625           s0 = peg$FAILED;
626         }
627         if (s0 === peg$FAILED) {
628           s0 = peg$currPos;
629           s1 = peg$parse_();
630           if (s1 !== peg$FAILED) {
631             if (input.charCodeAt(peg$currPos) === 43) {
632               s2 = peg$c13;
633               peg$currPos++;
634             } else {
635               s2 = peg$FAILED;
636               if (peg$silentFails === 0) { peg$fail(peg$c14); }
637             }
638             if (s2 !== peg$FAILED) {
639               s3 = peg$parse_();
640               if (s3 !== peg$FAILED) {
641                 peg$savedPos = s0;
642                 s1 = peg$c15();
643                 s0 = s1;
644               } else {
645                 peg$currPos = s0;
646                 s0 = peg$FAILED;
647               }
648             } else {
649               peg$currPos = s0;
650               s0 = peg$FAILED;
651             }
652           } else {
653             peg$currPos = s0;
654             s0 = peg$FAILED;
655           }
656           if (s0 === peg$FAILED) {
657             s0 = peg$currPos;
658             if (input.charCodeAt(peg$currPos) === 32) {
659               s1 = peg$c2;
660               peg$currPos++;
661             } else {
662               s1 = peg$FAILED;
663               if (peg$silentFails === 0) { peg$fail(peg$c3); }
664             }
665             if (s1 !== peg$FAILED) {
666               s2 = peg$parse_();
667               if (s2 !== peg$FAILED) {
668                 peg$savedPos = s0;
669                 s1 = peg$c16();
670                 s0 = s1;
671               } else {
672                 peg$currPos = s0;
673                 s0 = peg$FAILED;
674               }
675             } else {
676               peg$currPos = s0;
677               s0 = peg$FAILED;
678             }
679           }
680         }
681       }
682
683       peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
684
685       return s0;
686     }
687
688     function peg$parseselectors() {
689       var s0, s1, s2, s3, s4, s5, s6, s7;
690
691       var key    = peg$currPos * 30 + 4,
692           cached = peg$resultsCache[key];
693
694       if (cached) {
695         peg$currPos = cached.nextPos;
696
697         return cached.result;
698       }
699
700       s0 = peg$currPos;
701       s1 = peg$parseselector();
702       if (s1 !== peg$FAILED) {
703         s2 = [];
704         s3 = peg$currPos;
705         s4 = peg$parse_();
706         if (s4 !== peg$FAILED) {
707           if (input.charCodeAt(peg$currPos) === 44) {
708             s5 = peg$c17;
709             peg$currPos++;
710           } else {
711             s5 = peg$FAILED;
712             if (peg$silentFails === 0) { peg$fail(peg$c18); }
713           }
714           if (s5 !== peg$FAILED) {
715             s6 = peg$parse_();
716             if (s6 !== peg$FAILED) {
717               s7 = peg$parseselector();
718               if (s7 !== peg$FAILED) {
719                 s4 = [s4, s5, s6, s7];
720                 s3 = s4;
721               } else {
722                 peg$currPos = s3;
723                 s3 = peg$FAILED;
724               }
725             } else {
726               peg$currPos = s3;
727               s3 = peg$FAILED;
728             }
729           } else {
730             peg$currPos = s3;
731             s3 = peg$FAILED;
732           }
733         } else {
734           peg$currPos = s3;
735           s3 = peg$FAILED;
736         }
737         while (s3 !== peg$FAILED) {
738           s2.push(s3);
739           s3 = peg$currPos;
740           s4 = peg$parse_();
741           if (s4 !== peg$FAILED) {
742             if (input.charCodeAt(peg$currPos) === 44) {
743               s5 = peg$c17;
744               peg$currPos++;
745             } else {
746               s5 = peg$FAILED;
747               if (peg$silentFails === 0) { peg$fail(peg$c18); }
748             }
749             if (s5 !== peg$FAILED) {
750               s6 = peg$parse_();
751               if (s6 !== peg$FAILED) {
752                 s7 = peg$parseselector();
753                 if (s7 !== peg$FAILED) {
754                   s4 = [s4, s5, s6, s7];
755                   s3 = s4;
756                 } else {
757                   peg$currPos = s3;
758                   s3 = peg$FAILED;
759                 }
760               } else {
761                 peg$currPos = s3;
762                 s3 = peg$FAILED;
763               }
764             } else {
765               peg$currPos = s3;
766               s3 = peg$FAILED;
767             }
768           } else {
769             peg$currPos = s3;
770             s3 = peg$FAILED;
771           }
772         }
773         if (s2 !== peg$FAILED) {
774           peg$savedPos = s0;
775           s1 = peg$c19(s1, s2);
776           s0 = s1;
777         } else {
778           peg$currPos = s0;
779           s0 = peg$FAILED;
780         }
781       } else {
782         peg$currPos = s0;
783         s0 = peg$FAILED;
784       }
785
786       peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
787
788       return s0;
789     }
790
791     function peg$parseselector() {
792       var s0, s1, s2, s3, s4, s5;
793
794       var key    = peg$currPos * 30 + 5,
795           cached = peg$resultsCache[key];
796
797       if (cached) {
798         peg$currPos = cached.nextPos;
799
800         return cached.result;
801       }
802
803       s0 = peg$currPos;
804       s1 = peg$parsesequence();
805       if (s1 !== peg$FAILED) {
806         s2 = [];
807         s3 = peg$currPos;
808         s4 = peg$parsebinaryOp();
809         if (s4 !== peg$FAILED) {
810           s5 = peg$parsesequence();
811           if (s5 !== peg$FAILED) {
812             s4 = [s4, s5];
813             s3 = s4;
814           } else {
815             peg$currPos = s3;
816             s3 = peg$FAILED;
817           }
818         } else {
819           peg$currPos = s3;
820           s3 = peg$FAILED;
821         }
822         while (s3 !== peg$FAILED) {
823           s2.push(s3);
824           s3 = peg$currPos;
825           s4 = peg$parsebinaryOp();
826           if (s4 !== peg$FAILED) {
827             s5 = peg$parsesequence();
828             if (s5 !== peg$FAILED) {
829               s4 = [s4, s5];
830               s3 = s4;
831             } else {
832               peg$currPos = s3;
833               s3 = peg$FAILED;
834             }
835           } else {
836             peg$currPos = s3;
837             s3 = peg$FAILED;
838           }
839         }
840         if (s2 !== peg$FAILED) {
841           peg$savedPos = s0;
842           s1 = peg$c20(s1, s2);
843           s0 = s1;
844         } else {
845           peg$currPos = s0;
846           s0 = peg$FAILED;
847         }
848       } else {
849         peg$currPos = s0;
850         s0 = peg$FAILED;
851       }
852
853       peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
854
855       return s0;
856     }
857
858     function peg$parsesequence() {
859       var s0, s1, s2, s3;
860
861       var key    = peg$currPos * 30 + 6,
862           cached = peg$resultsCache[key];
863
864       if (cached) {
865         peg$currPos = cached.nextPos;
866
867         return cached.result;
868       }
869
870       s0 = peg$currPos;
871       if (input.charCodeAt(peg$currPos) === 33) {
872         s1 = peg$c21;
873         peg$currPos++;
874       } else {
875         s1 = peg$FAILED;
876         if (peg$silentFails === 0) { peg$fail(peg$c22); }
877       }
878       if (s1 === peg$FAILED) {
879         s1 = null;
880       }
881       if (s1 !== peg$FAILED) {
882         s2 = [];
883         s3 = peg$parseatom();
884         if (s3 !== peg$FAILED) {
885           while (s3 !== peg$FAILED) {
886             s2.push(s3);
887             s3 = peg$parseatom();
888           }
889         } else {
890           s2 = peg$FAILED;
891         }
892         if (s2 !== peg$FAILED) {
893           peg$savedPos = s0;
894           s1 = peg$c23(s1, s2);
895           s0 = s1;
896         } else {
897           peg$currPos = s0;
898           s0 = peg$FAILED;
899         }
900       } else {
901         peg$currPos = s0;
902         s0 = peg$FAILED;
903       }
904
905       peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
906
907       return s0;
908     }
909
910     function peg$parseatom() {
911       var s0;
912
913       var key    = peg$currPos * 30 + 7,
914           cached = peg$resultsCache[key];
915
916       if (cached) {
917         peg$currPos = cached.nextPos;
918
919         return cached.result;
920       }
921
922       s0 = peg$parsewildcard();
923       if (s0 === peg$FAILED) {
924         s0 = peg$parseidentifier();
925         if (s0 === peg$FAILED) {
926           s0 = peg$parseattr();
927           if (s0 === peg$FAILED) {
928             s0 = peg$parsefield();
929             if (s0 === peg$FAILED) {
930               s0 = peg$parsenegation();
931               if (s0 === peg$FAILED) {
932                 s0 = peg$parsematches();
933                 if (s0 === peg$FAILED) {
934                   s0 = peg$parsehas();
935                   if (s0 === peg$FAILED) {
936                     s0 = peg$parsefirstChild();
937                     if (s0 === peg$FAILED) {
938                       s0 = peg$parselastChild();
939                       if (s0 === peg$FAILED) {
940                         s0 = peg$parsenthChild();
941                         if (s0 === peg$FAILED) {
942                           s0 = peg$parsenthLastChild();
943                           if (s0 === peg$FAILED) {
944                             s0 = peg$parseclass();
945                           }
946                         }
947                       }
948                     }
949                   }
950                 }
951               }
952             }
953           }
954         }
955       }
956
957       peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
958
959       return s0;
960     }
961
962     function peg$parsewildcard() {
963       var s0, s1;
964
965       var key    = peg$currPos * 30 + 8,
966           cached = peg$resultsCache[key];
967
968       if (cached) {
969         peg$currPos = cached.nextPos;
970
971         return cached.result;
972       }
973
974       s0 = peg$currPos;
975       if (input.charCodeAt(peg$currPos) === 42) {
976         s1 = peg$c24;
977         peg$currPos++;
978       } else {
979         s1 = peg$FAILED;
980         if (peg$silentFails === 0) { peg$fail(peg$c25); }
981       }
982       if (s1 !== peg$FAILED) {
983         peg$savedPos = s0;
984         s1 = peg$c26(s1);
985       }
986       s0 = s1;
987
988       peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
989
990       return s0;
991     }
992
993     function peg$parseidentifier() {
994       var s0, s1, s2;
995
996       var key    = peg$currPos * 30 + 9,
997           cached = peg$resultsCache[key];
998
999       if (cached) {
1000         peg$currPos = cached.nextPos;
1001
1002         return cached.result;
1003       }
1004
1005       s0 = peg$currPos;
1006       if (input.charCodeAt(peg$currPos) === 35) {
1007         s1 = peg$c27;
1008         peg$currPos++;
1009       } else {
1010         s1 = peg$FAILED;
1011         if (peg$silentFails === 0) { peg$fail(peg$c28); }
1012       }
1013       if (s1 === peg$FAILED) {
1014         s1 = null;
1015       }
1016       if (s1 !== peg$FAILED) {
1017         s2 = peg$parseidentifierName();
1018         if (s2 !== peg$FAILED) {
1019           peg$savedPos = s0;
1020           s1 = peg$c29(s2);
1021           s0 = s1;
1022         } else {
1023           peg$currPos = s0;
1024           s0 = peg$FAILED;
1025         }
1026       } else {
1027         peg$currPos = s0;
1028         s0 = peg$FAILED;
1029       }
1030
1031       peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
1032
1033       return s0;
1034     }
1035
1036     function peg$parseattr() {
1037       var s0, s1, s2, s3, s4, s5;
1038
1039       var key    = peg$currPos * 30 + 10,
1040           cached = peg$resultsCache[key];
1041
1042       if (cached) {
1043         peg$currPos = cached.nextPos;
1044
1045         return cached.result;
1046       }
1047
1048       s0 = peg$currPos;
1049       if (input.charCodeAt(peg$currPos) === 91) {
1050         s1 = peg$c30;
1051         peg$currPos++;
1052       } else {
1053         s1 = peg$FAILED;
1054         if (peg$silentFails === 0) { peg$fail(peg$c31); }
1055       }
1056       if (s1 !== peg$FAILED) {
1057         s2 = peg$parse_();
1058         if (s2 !== peg$FAILED) {
1059           s3 = peg$parseattrValue();
1060           if (s3 !== peg$FAILED) {
1061             s4 = peg$parse_();
1062             if (s4 !== peg$FAILED) {
1063               if (input.charCodeAt(peg$currPos) === 93) {
1064                 s5 = peg$c32;
1065                 peg$currPos++;
1066               } else {
1067                 s5 = peg$FAILED;
1068                 if (peg$silentFails === 0) { peg$fail(peg$c33); }
1069               }
1070               if (s5 !== peg$FAILED) {
1071                 peg$savedPos = s0;
1072                 s1 = peg$c34(s3);
1073                 s0 = s1;
1074               } else {
1075                 peg$currPos = s0;
1076                 s0 = peg$FAILED;
1077               }
1078             } else {
1079               peg$currPos = s0;
1080               s0 = peg$FAILED;
1081             }
1082           } else {
1083             peg$currPos = s0;
1084             s0 = peg$FAILED;
1085           }
1086         } else {
1087           peg$currPos = s0;
1088           s0 = peg$FAILED;
1089         }
1090       } else {
1091         peg$currPos = s0;
1092         s0 = peg$FAILED;
1093       }
1094
1095       peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
1096
1097       return s0;
1098     }
1099
1100     function peg$parseattrOps() {
1101       var s0, s1, s2;
1102
1103       var key    = peg$currPos * 30 + 11,
1104           cached = peg$resultsCache[key];
1105
1106       if (cached) {
1107         peg$currPos = cached.nextPos;
1108
1109         return cached.result;
1110       }
1111
1112       s0 = peg$currPos;
1113       if (peg$c35.test(input.charAt(peg$currPos))) {
1114         s1 = input.charAt(peg$currPos);
1115         peg$currPos++;
1116       } else {
1117         s1 = peg$FAILED;
1118         if (peg$silentFails === 0) { peg$fail(peg$c36); }
1119       }
1120       if (s1 === peg$FAILED) {
1121         s1 = null;
1122       }
1123       if (s1 !== peg$FAILED) {
1124         if (input.charCodeAt(peg$currPos) === 61) {
1125           s2 = peg$c37;
1126           peg$currPos++;
1127         } else {
1128           s2 = peg$FAILED;
1129           if (peg$silentFails === 0) { peg$fail(peg$c38); }
1130         }
1131         if (s2 !== peg$FAILED) {
1132           peg$savedPos = s0;
1133           s1 = peg$c39(s1);
1134           s0 = s1;
1135         } else {
1136           peg$currPos = s0;
1137           s0 = peg$FAILED;
1138         }
1139       } else {
1140         peg$currPos = s0;
1141         s0 = peg$FAILED;
1142       }
1143       if (s0 === peg$FAILED) {
1144         if (peg$c40.test(input.charAt(peg$currPos))) {
1145           s0 = input.charAt(peg$currPos);
1146           peg$currPos++;
1147         } else {
1148           s0 = peg$FAILED;
1149           if (peg$silentFails === 0) { peg$fail(peg$c41); }
1150         }
1151       }
1152
1153       peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
1154
1155       return s0;
1156     }
1157
1158     function peg$parseattrEqOps() {
1159       var s0, s1, s2;
1160
1161       var key    = peg$currPos * 30 + 12,
1162           cached = peg$resultsCache[key];
1163
1164       if (cached) {
1165         peg$currPos = cached.nextPos;
1166
1167         return cached.result;
1168       }
1169
1170       s0 = peg$currPos;
1171       if (input.charCodeAt(peg$currPos) === 33) {
1172         s1 = peg$c21;
1173         peg$currPos++;
1174       } else {
1175         s1 = peg$FAILED;
1176         if (peg$silentFails === 0) { peg$fail(peg$c22); }
1177       }
1178       if (s1 === peg$FAILED) {
1179         s1 = null;
1180       }
1181       if (s1 !== peg$FAILED) {
1182         if (input.charCodeAt(peg$currPos) === 61) {
1183           s2 = peg$c37;
1184           peg$currPos++;
1185         } else {
1186           s2 = peg$FAILED;
1187           if (peg$silentFails === 0) { peg$fail(peg$c38); }
1188         }
1189         if (s2 !== peg$FAILED) {
1190           peg$savedPos = s0;
1191           s1 = peg$c39(s1);
1192           s0 = s1;
1193         } else {
1194           peg$currPos = s0;
1195           s0 = peg$FAILED;
1196         }
1197       } else {
1198         peg$currPos = s0;
1199         s0 = peg$FAILED;
1200       }
1201
1202       peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
1203
1204       return s0;
1205     }
1206
1207     function peg$parseattrName() {
1208       var s0, s1, s2;
1209
1210       var key    = peg$currPos * 30 + 13,
1211           cached = peg$resultsCache[key];
1212
1213       if (cached) {
1214         peg$currPos = cached.nextPos;
1215
1216         return cached.result;
1217       }
1218
1219       s0 = peg$currPos;
1220       s1 = [];
1221       s2 = peg$parseidentifierName();
1222       if (s2 === peg$FAILED) {
1223         if (input.charCodeAt(peg$currPos) === 46) {
1224           s2 = peg$c42;
1225           peg$currPos++;
1226         } else {
1227           s2 = peg$FAILED;
1228           if (peg$silentFails === 0) { peg$fail(peg$c43); }
1229         }
1230       }
1231       if (s2 !== peg$FAILED) {
1232         while (s2 !== peg$FAILED) {
1233           s1.push(s2);
1234           s2 = peg$parseidentifierName();
1235           if (s2 === peg$FAILED) {
1236             if (input.charCodeAt(peg$currPos) === 46) {
1237               s2 = peg$c42;
1238               peg$currPos++;
1239             } else {
1240               s2 = peg$FAILED;
1241               if (peg$silentFails === 0) { peg$fail(peg$c43); }
1242             }
1243           }
1244         }
1245       } else {
1246         s1 = peg$FAILED;
1247       }
1248       if (s1 !== peg$FAILED) {
1249         peg$savedPos = s0;
1250         s1 = peg$c6(s1);
1251       }
1252       s0 = s1;
1253
1254       peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
1255
1256       return s0;
1257     }
1258
1259     function peg$parseattrValue() {
1260       var s0, s1, s2, s3, s4, s5;
1261
1262       var key    = peg$currPos * 30 + 14,
1263           cached = peg$resultsCache[key];
1264
1265       if (cached) {
1266         peg$currPos = cached.nextPos;
1267
1268         return cached.result;
1269       }
1270
1271       s0 = peg$currPos;
1272       s1 = peg$parseattrName();
1273       if (s1 !== peg$FAILED) {
1274         s2 = peg$parse_();
1275         if (s2 !== peg$FAILED) {
1276           s3 = peg$parseattrEqOps();
1277           if (s3 !== peg$FAILED) {
1278             s4 = peg$parse_();
1279             if (s4 !== peg$FAILED) {
1280               s5 = peg$parsetype();
1281               if (s5 === peg$FAILED) {
1282                 s5 = peg$parseregex();
1283               }
1284               if (s5 !== peg$FAILED) {
1285                 peg$savedPos = s0;
1286                 s1 = peg$c44(s1, s3, s5);
1287                 s0 = s1;
1288               } else {
1289                 peg$currPos = s0;
1290                 s0 = peg$FAILED;
1291               }
1292             } else {
1293               peg$currPos = s0;
1294               s0 = peg$FAILED;
1295             }
1296           } else {
1297             peg$currPos = s0;
1298             s0 = peg$FAILED;
1299           }
1300         } else {
1301           peg$currPos = s0;
1302           s0 = peg$FAILED;
1303         }
1304       } else {
1305         peg$currPos = s0;
1306         s0 = peg$FAILED;
1307       }
1308       if (s0 === peg$FAILED) {
1309         s0 = peg$currPos;
1310         s1 = peg$parseattrName();
1311         if (s1 !== peg$FAILED) {
1312           s2 = peg$parse_();
1313           if (s2 !== peg$FAILED) {
1314             s3 = peg$parseattrOps();
1315             if (s3 !== peg$FAILED) {
1316               s4 = peg$parse_();
1317               if (s4 !== peg$FAILED) {
1318                 s5 = peg$parsestring();
1319                 if (s5 === peg$FAILED) {
1320                   s5 = peg$parsenumber();
1321                   if (s5 === peg$FAILED) {
1322                     s5 = peg$parsepath();
1323                   }
1324                 }
1325                 if (s5 !== peg$FAILED) {
1326                   peg$savedPos = s0;
1327                   s1 = peg$c44(s1, s3, s5);
1328                   s0 = s1;
1329                 } else {
1330                   peg$currPos = s0;
1331                   s0 = peg$FAILED;
1332                 }
1333               } else {
1334                 peg$currPos = s0;
1335                 s0 = peg$FAILED;
1336               }
1337             } else {
1338               peg$currPos = s0;
1339               s0 = peg$FAILED;
1340             }
1341           } else {
1342             peg$currPos = s0;
1343             s0 = peg$FAILED;
1344           }
1345         } else {
1346           peg$currPos = s0;
1347           s0 = peg$FAILED;
1348         }
1349         if (s0 === peg$FAILED) {
1350           s0 = peg$currPos;
1351           s1 = peg$parseattrName();
1352           if (s1 !== peg$FAILED) {
1353             peg$savedPos = s0;
1354             s1 = peg$c45(s1);
1355           }
1356           s0 = s1;
1357         }
1358       }
1359
1360       peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
1361
1362       return s0;
1363     }
1364
1365     function peg$parsestring() {
1366       var s0, s1, s2, s3, s4, s5;
1367
1368       var key    = peg$currPos * 30 + 15,
1369           cached = peg$resultsCache[key];
1370
1371       if (cached) {
1372         peg$currPos = cached.nextPos;
1373
1374         return cached.result;
1375       }
1376
1377       s0 = peg$currPos;
1378       if (input.charCodeAt(peg$currPos) === 34) {
1379         s1 = peg$c46;
1380         peg$currPos++;
1381       } else {
1382         s1 = peg$FAILED;
1383         if (peg$silentFails === 0) { peg$fail(peg$c47); }
1384       }
1385       if (s1 !== peg$FAILED) {
1386         s2 = [];
1387         if (peg$c48.test(input.charAt(peg$currPos))) {
1388           s3 = input.charAt(peg$currPos);
1389           peg$currPos++;
1390         } else {
1391           s3 = peg$FAILED;
1392           if (peg$silentFails === 0) { peg$fail(peg$c49); }
1393         }
1394         if (s3 === peg$FAILED) {
1395           s3 = peg$currPos;
1396           if (input.charCodeAt(peg$currPos) === 92) {
1397             s4 = peg$c50;
1398             peg$currPos++;
1399           } else {
1400             s4 = peg$FAILED;
1401             if (peg$silentFails === 0) { peg$fail(peg$c51); }
1402           }
1403           if (s4 !== peg$FAILED) {
1404             if (input.length > peg$currPos) {
1405               s5 = input.charAt(peg$currPos);
1406               peg$currPos++;
1407             } else {
1408               s5 = peg$FAILED;
1409               if (peg$silentFails === 0) { peg$fail(peg$c52); }
1410             }
1411             if (s5 !== peg$FAILED) {
1412               peg$savedPos = s3;
1413               s4 = peg$c53(s4, s5);
1414               s3 = s4;
1415             } else {
1416               peg$currPos = s3;
1417               s3 = peg$FAILED;
1418             }
1419           } else {
1420             peg$currPos = s3;
1421             s3 = peg$FAILED;
1422           }
1423         }
1424         while (s3 !== peg$FAILED) {
1425           s2.push(s3);
1426           if (peg$c48.test(input.charAt(peg$currPos))) {
1427             s3 = input.charAt(peg$currPos);
1428             peg$currPos++;
1429           } else {
1430             s3 = peg$FAILED;
1431             if (peg$silentFails === 0) { peg$fail(peg$c49); }
1432           }
1433           if (s3 === peg$FAILED) {
1434             s3 = peg$currPos;
1435             if (input.charCodeAt(peg$currPos) === 92) {
1436               s4 = peg$c50;
1437               peg$currPos++;
1438             } else {
1439               s4 = peg$FAILED;
1440               if (peg$silentFails === 0) { peg$fail(peg$c51); }
1441             }
1442             if (s4 !== peg$FAILED) {
1443               if (input.length > peg$currPos) {
1444                 s5 = input.charAt(peg$currPos);
1445                 peg$currPos++;
1446               } else {
1447                 s5 = peg$FAILED;
1448                 if (peg$silentFails === 0) { peg$fail(peg$c52); }
1449               }
1450               if (s5 !== peg$FAILED) {
1451                 peg$savedPos = s3;
1452                 s4 = peg$c53(s4, s5);
1453                 s3 = s4;
1454               } else {
1455                 peg$currPos = s3;
1456                 s3 = peg$FAILED;
1457               }
1458             } else {
1459               peg$currPos = s3;
1460               s3 = peg$FAILED;
1461             }
1462           }
1463         }
1464         if (s2 !== peg$FAILED) {
1465           if (input.charCodeAt(peg$currPos) === 34) {
1466             s3 = peg$c46;
1467             peg$currPos++;
1468           } else {
1469             s3 = peg$FAILED;
1470             if (peg$silentFails === 0) { peg$fail(peg$c47); }
1471           }
1472           if (s3 !== peg$FAILED) {
1473             peg$savedPos = s0;
1474             s1 = peg$c54(s2);
1475             s0 = s1;
1476           } else {
1477             peg$currPos = s0;
1478             s0 = peg$FAILED;
1479           }
1480         } else {
1481           peg$currPos = s0;
1482           s0 = peg$FAILED;
1483         }
1484       } else {
1485         peg$currPos = s0;
1486         s0 = peg$FAILED;
1487       }
1488       if (s0 === peg$FAILED) {
1489         s0 = peg$currPos;
1490         if (input.charCodeAt(peg$currPos) === 39) {
1491           s1 = peg$c55;
1492           peg$currPos++;
1493         } else {
1494           s1 = peg$FAILED;
1495           if (peg$silentFails === 0) { peg$fail(peg$c56); }
1496         }
1497         if (s1 !== peg$FAILED) {
1498           s2 = [];
1499           if (peg$c57.test(input.charAt(peg$currPos))) {
1500             s3 = input.charAt(peg$currPos);
1501             peg$currPos++;
1502           } else {
1503             s3 = peg$FAILED;
1504             if (peg$silentFails === 0) { peg$fail(peg$c58); }
1505           }
1506           if (s3 === peg$FAILED) {
1507             s3 = peg$currPos;
1508             if (input.charCodeAt(peg$currPos) === 92) {
1509               s4 = peg$c50;
1510               peg$currPos++;
1511             } else {
1512               s4 = peg$FAILED;
1513               if (peg$silentFails === 0) { peg$fail(peg$c51); }
1514             }
1515             if (s4 !== peg$FAILED) {
1516               if (input.length > peg$currPos) {
1517                 s5 = input.charAt(peg$currPos);
1518                 peg$currPos++;
1519               } else {
1520                 s5 = peg$FAILED;
1521                 if (peg$silentFails === 0) { peg$fail(peg$c52); }
1522               }
1523               if (s5 !== peg$FAILED) {
1524                 peg$savedPos = s3;
1525                 s4 = peg$c53(s4, s5);
1526                 s3 = s4;
1527               } else {
1528                 peg$currPos = s3;
1529                 s3 = peg$FAILED;
1530               }
1531             } else {
1532               peg$currPos = s3;
1533               s3 = peg$FAILED;
1534             }
1535           }
1536           while (s3 !== peg$FAILED) {
1537             s2.push(s3);
1538             if (peg$c57.test(input.charAt(peg$currPos))) {
1539               s3 = input.charAt(peg$currPos);
1540               peg$currPos++;
1541             } else {
1542               s3 = peg$FAILED;
1543               if (peg$silentFails === 0) { peg$fail(peg$c58); }
1544             }
1545             if (s3 === peg$FAILED) {
1546               s3 = peg$currPos;
1547               if (input.charCodeAt(peg$currPos) === 92) {
1548                 s4 = peg$c50;
1549                 peg$currPos++;
1550               } else {
1551                 s4 = peg$FAILED;
1552                 if (peg$silentFails === 0) { peg$fail(peg$c51); }
1553               }
1554               if (s4 !== peg$FAILED) {
1555                 if (input.length > peg$currPos) {
1556                   s5 = input.charAt(peg$currPos);
1557                   peg$currPos++;
1558                 } else {
1559                   s5 = peg$FAILED;
1560                   if (peg$silentFails === 0) { peg$fail(peg$c52); }
1561                 }
1562                 if (s5 !== peg$FAILED) {
1563                   peg$savedPos = s3;
1564                   s4 = peg$c53(s4, s5);
1565                   s3 = s4;
1566                 } else {
1567                   peg$currPos = s3;
1568                   s3 = peg$FAILED;
1569                 }
1570               } else {
1571                 peg$currPos = s3;
1572                 s3 = peg$FAILED;
1573               }
1574             }
1575           }
1576           if (s2 !== peg$FAILED) {
1577             if (input.charCodeAt(peg$currPos) === 39) {
1578               s3 = peg$c55;
1579               peg$currPos++;
1580             } else {
1581               s3 = peg$FAILED;
1582               if (peg$silentFails === 0) { peg$fail(peg$c56); }
1583             }
1584             if (s3 !== peg$FAILED) {
1585               peg$savedPos = s0;
1586               s1 = peg$c54(s2);
1587               s0 = s1;
1588             } else {
1589               peg$currPos = s0;
1590               s0 = peg$FAILED;
1591             }
1592           } else {
1593             peg$currPos = s0;
1594             s0 = peg$FAILED;
1595           }
1596         } else {
1597           peg$currPos = s0;
1598           s0 = peg$FAILED;
1599         }
1600       }
1601
1602       peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
1603
1604       return s0;
1605     }
1606
1607     function peg$parsenumber() {
1608       var s0, s1, s2, s3;
1609
1610       var key    = peg$currPos * 30 + 16,
1611           cached = peg$resultsCache[key];
1612
1613       if (cached) {
1614         peg$currPos = cached.nextPos;
1615
1616         return cached.result;
1617       }
1618
1619       s0 = peg$currPos;
1620       s1 = peg$currPos;
1621       s2 = [];
1622       if (peg$c59.test(input.charAt(peg$currPos))) {
1623         s3 = input.charAt(peg$currPos);
1624         peg$currPos++;
1625       } else {
1626         s3 = peg$FAILED;
1627         if (peg$silentFails === 0) { peg$fail(peg$c60); }
1628       }
1629       while (s3 !== peg$FAILED) {
1630         s2.push(s3);
1631         if (peg$c59.test(input.charAt(peg$currPos))) {
1632           s3 = input.charAt(peg$currPos);
1633           peg$currPos++;
1634         } else {
1635           s3 = peg$FAILED;
1636           if (peg$silentFails === 0) { peg$fail(peg$c60); }
1637         }
1638       }
1639       if (s2 !== peg$FAILED) {
1640         if (input.charCodeAt(peg$currPos) === 46) {
1641           s3 = peg$c42;
1642           peg$currPos++;
1643         } else {
1644           s3 = peg$FAILED;
1645           if (peg$silentFails === 0) { peg$fail(peg$c43); }
1646         }
1647         if (s3 !== peg$FAILED) {
1648           s2 = [s2, s3];
1649           s1 = s2;
1650         } else {
1651           peg$currPos = s1;
1652           s1 = peg$FAILED;
1653         }
1654       } else {
1655         peg$currPos = s1;
1656         s1 = peg$FAILED;
1657       }
1658       if (s1 === peg$FAILED) {
1659         s1 = null;
1660       }
1661       if (s1 !== peg$FAILED) {
1662         s2 = [];
1663         if (peg$c59.test(input.charAt(peg$currPos))) {
1664           s3 = input.charAt(peg$currPos);
1665           peg$currPos++;
1666         } else {
1667           s3 = peg$FAILED;
1668           if (peg$silentFails === 0) { peg$fail(peg$c60); }
1669         }
1670         if (s3 !== peg$FAILED) {
1671           while (s3 !== peg$FAILED) {
1672             s2.push(s3);
1673             if (peg$c59.test(input.charAt(peg$currPos))) {
1674               s3 = input.charAt(peg$currPos);
1675               peg$currPos++;
1676             } else {
1677               s3 = peg$FAILED;
1678               if (peg$silentFails === 0) { peg$fail(peg$c60); }
1679             }
1680           }
1681         } else {
1682           s2 = peg$FAILED;
1683         }
1684         if (s2 !== peg$FAILED) {
1685           peg$savedPos = s0;
1686           s1 = peg$c61(s1, s2);
1687           s0 = s1;
1688         } else {
1689           peg$currPos = s0;
1690           s0 = peg$FAILED;
1691         }
1692       } else {
1693         peg$currPos = s0;
1694         s0 = peg$FAILED;
1695       }
1696
1697       peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
1698
1699       return s0;
1700     }
1701
1702     function peg$parsepath() {
1703       var s0, s1;
1704
1705       var key    = peg$currPos * 30 + 17,
1706           cached = peg$resultsCache[key];
1707
1708       if (cached) {
1709         peg$currPos = cached.nextPos;
1710
1711         return cached.result;
1712       }
1713
1714       s0 = peg$currPos;
1715       s1 = peg$parseidentifierName();
1716       if (s1 !== peg$FAILED) {
1717         peg$savedPos = s0;
1718         s1 = peg$c62(s1);
1719       }
1720       s0 = s1;
1721
1722       peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
1723
1724       return s0;
1725     }
1726
1727     function peg$parsetype() {
1728       var s0, s1, s2, s3, s4, s5;
1729
1730       var key    = peg$currPos * 30 + 18,
1731           cached = peg$resultsCache[key];
1732
1733       if (cached) {
1734         peg$currPos = cached.nextPos;
1735
1736         return cached.result;
1737       }
1738
1739       s0 = peg$currPos;
1740       if (input.substr(peg$currPos, 5) === peg$c63) {
1741         s1 = peg$c63;
1742         peg$currPos += 5;
1743       } else {
1744         s1 = peg$FAILED;
1745         if (peg$silentFails === 0) { peg$fail(peg$c64); }
1746       }
1747       if (s1 !== peg$FAILED) {
1748         s2 = peg$parse_();
1749         if (s2 !== peg$FAILED) {
1750           s3 = [];
1751           if (peg$c65.test(input.charAt(peg$currPos))) {
1752             s4 = input.charAt(peg$currPos);
1753             peg$currPos++;
1754           } else {
1755             s4 = peg$FAILED;
1756             if (peg$silentFails === 0) { peg$fail(peg$c66); }
1757           }
1758           if (s4 !== peg$FAILED) {
1759             while (s4 !== peg$FAILED) {
1760               s3.push(s4);
1761               if (peg$c65.test(input.charAt(peg$currPos))) {
1762                 s4 = input.charAt(peg$currPos);
1763                 peg$currPos++;
1764               } else {
1765                 s4 = peg$FAILED;
1766                 if (peg$silentFails === 0) { peg$fail(peg$c66); }
1767               }
1768             }
1769           } else {
1770             s3 = peg$FAILED;
1771           }
1772           if (s3 !== peg$FAILED) {
1773             s4 = peg$parse_();
1774             if (s4 !== peg$FAILED) {
1775               if (input.charCodeAt(peg$currPos) === 41) {
1776                 s5 = peg$c67;
1777                 peg$currPos++;
1778               } else {
1779                 s5 = peg$FAILED;
1780                 if (peg$silentFails === 0) { peg$fail(peg$c68); }
1781               }
1782               if (s5 !== peg$FAILED) {
1783                 peg$savedPos = s0;
1784                 s1 = peg$c69(s3);
1785                 s0 = s1;
1786               } else {
1787                 peg$currPos = s0;
1788                 s0 = peg$FAILED;
1789               }
1790             } else {
1791               peg$currPos = s0;
1792               s0 = peg$FAILED;
1793             }
1794           } else {
1795             peg$currPos = s0;
1796             s0 = peg$FAILED;
1797           }
1798         } else {
1799           peg$currPos = s0;
1800           s0 = peg$FAILED;
1801         }
1802       } else {
1803         peg$currPos = s0;
1804         s0 = peg$FAILED;
1805       }
1806
1807       peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
1808
1809       return s0;
1810     }
1811
1812     function peg$parseflags() {
1813       var s0, s1;
1814
1815       var key    = peg$currPos * 30 + 19,
1816           cached = peg$resultsCache[key];
1817
1818       if (cached) {
1819         peg$currPos = cached.nextPos;
1820
1821         return cached.result;
1822       }
1823
1824       s0 = [];
1825       if (peg$c70.test(input.charAt(peg$currPos))) {
1826         s1 = input.charAt(peg$currPos);
1827         peg$currPos++;
1828       } else {
1829         s1 = peg$FAILED;
1830         if (peg$silentFails === 0) { peg$fail(peg$c71); }
1831       }
1832       if (s1 !== peg$FAILED) {
1833         while (s1 !== peg$FAILED) {
1834           s0.push(s1);
1835           if (peg$c70.test(input.charAt(peg$currPos))) {
1836             s1 = input.charAt(peg$currPos);
1837             peg$currPos++;
1838           } else {
1839             s1 = peg$FAILED;
1840             if (peg$silentFails === 0) { peg$fail(peg$c71); }
1841           }
1842         }
1843       } else {
1844         s0 = peg$FAILED;
1845       }
1846
1847       peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
1848
1849       return s0;
1850     }
1851
1852     function peg$parseregex() {
1853       var s0, s1, s2, s3, s4;
1854
1855       var key    = peg$currPos * 30 + 20,
1856           cached = peg$resultsCache[key];
1857
1858       if (cached) {
1859         peg$currPos = cached.nextPos;
1860
1861         return cached.result;
1862       }
1863
1864       s0 = peg$currPos;
1865       if (input.charCodeAt(peg$currPos) === 47) {
1866         s1 = peg$c72;
1867         peg$currPos++;
1868       } else {
1869         s1 = peg$FAILED;
1870         if (peg$silentFails === 0) { peg$fail(peg$c73); }
1871       }
1872       if (s1 !== peg$FAILED) {
1873         s2 = [];
1874         if (peg$c74.test(input.charAt(peg$currPos))) {
1875           s3 = input.charAt(peg$currPos);
1876           peg$currPos++;
1877         } else {
1878           s3 = peg$FAILED;
1879           if (peg$silentFails === 0) { peg$fail(peg$c75); }
1880         }
1881         if (s3 !== peg$FAILED) {
1882           while (s3 !== peg$FAILED) {
1883             s2.push(s3);
1884             if (peg$c74.test(input.charAt(peg$currPos))) {
1885               s3 = input.charAt(peg$currPos);
1886               peg$currPos++;
1887             } else {
1888               s3 = peg$FAILED;
1889               if (peg$silentFails === 0) { peg$fail(peg$c75); }
1890             }
1891           }
1892         } else {
1893           s2 = peg$FAILED;
1894         }
1895         if (s2 !== peg$FAILED) {
1896           if (input.charCodeAt(peg$currPos) === 47) {
1897             s3 = peg$c72;
1898             peg$currPos++;
1899           } else {
1900             s3 = peg$FAILED;
1901             if (peg$silentFails === 0) { peg$fail(peg$c73); }
1902           }
1903           if (s3 !== peg$FAILED) {
1904             s4 = peg$parseflags();
1905             if (s4 === peg$FAILED) {
1906               s4 = null;
1907             }
1908             if (s4 !== peg$FAILED) {
1909               peg$savedPos = s0;
1910               s1 = peg$c76(s2, s4);
1911               s0 = s1;
1912             } else {
1913               peg$currPos = s0;
1914               s0 = peg$FAILED;
1915             }
1916           } else {
1917             peg$currPos = s0;
1918             s0 = peg$FAILED;
1919           }
1920         } else {
1921           peg$currPos = s0;
1922           s0 = peg$FAILED;
1923         }
1924       } else {
1925         peg$currPos = s0;
1926         s0 = peg$FAILED;
1927       }
1928
1929       peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
1930
1931       return s0;
1932     }
1933
1934     function peg$parsefield() {
1935       var s0, s1, s2, s3, s4, s5, s6;
1936
1937       var key    = peg$currPos * 30 + 21,
1938           cached = peg$resultsCache[key];
1939
1940       if (cached) {
1941         peg$currPos = cached.nextPos;
1942
1943         return cached.result;
1944       }
1945
1946       s0 = peg$currPos;
1947       if (input.charCodeAt(peg$currPos) === 46) {
1948         s1 = peg$c42;
1949         peg$currPos++;
1950       } else {
1951         s1 = peg$FAILED;
1952         if (peg$silentFails === 0) { peg$fail(peg$c43); }
1953       }
1954       if (s1 !== peg$FAILED) {
1955         s2 = peg$parseidentifierName();
1956         if (s2 !== peg$FAILED) {
1957           s3 = [];
1958           s4 = peg$currPos;
1959           if (input.charCodeAt(peg$currPos) === 46) {
1960             s5 = peg$c42;
1961             peg$currPos++;
1962           } else {
1963             s5 = peg$FAILED;
1964             if (peg$silentFails === 0) { peg$fail(peg$c43); }
1965           }
1966           if (s5 !== peg$FAILED) {
1967             s6 = peg$parseidentifierName();
1968             if (s6 !== peg$FAILED) {
1969               s5 = [s5, s6];
1970               s4 = s5;
1971             } else {
1972               peg$currPos = s4;
1973               s4 = peg$FAILED;
1974             }
1975           } else {
1976             peg$currPos = s4;
1977             s4 = peg$FAILED;
1978           }
1979           while (s4 !== peg$FAILED) {
1980             s3.push(s4);
1981             s4 = peg$currPos;
1982             if (input.charCodeAt(peg$currPos) === 46) {
1983               s5 = peg$c42;
1984               peg$currPos++;
1985             } else {
1986               s5 = peg$FAILED;
1987               if (peg$silentFails === 0) { peg$fail(peg$c43); }
1988             }
1989             if (s5 !== peg$FAILED) {
1990               s6 = peg$parseidentifierName();
1991               if (s6 !== peg$FAILED) {
1992                 s5 = [s5, s6];
1993                 s4 = s5;
1994               } else {
1995                 peg$currPos = s4;
1996                 s4 = peg$FAILED;
1997               }
1998             } else {
1999               peg$currPos = s4;
2000               s4 = peg$FAILED;
2001             }
2002           }
2003           if (s3 !== peg$FAILED) {
2004             peg$savedPos = s0;
2005             s1 = peg$c77(s2, s3);
2006             s0 = s1;
2007           } else {
2008             peg$currPos = s0;
2009             s0 = peg$FAILED;
2010           }
2011         } else {
2012           peg$currPos = s0;
2013           s0 = peg$FAILED;
2014         }
2015       } else {
2016         peg$currPos = s0;
2017         s0 = peg$FAILED;
2018       }
2019
2020       peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
2021
2022       return s0;
2023     }
2024
2025     function peg$parsenegation() {
2026       var s0, s1, s2, s3, s4, s5;
2027
2028       var key    = peg$currPos * 30 + 22,
2029           cached = peg$resultsCache[key];
2030
2031       if (cached) {
2032         peg$currPos = cached.nextPos;
2033
2034         return cached.result;
2035       }
2036
2037       s0 = peg$currPos;
2038       if (input.substr(peg$currPos, 5) === peg$c78) {
2039         s1 = peg$c78;
2040         peg$currPos += 5;
2041       } else {
2042         s1 = peg$FAILED;
2043         if (peg$silentFails === 0) { peg$fail(peg$c79); }
2044       }
2045       if (s1 !== peg$FAILED) {
2046         s2 = peg$parse_();
2047         if (s2 !== peg$FAILED) {
2048           s3 = peg$parseselectors();
2049           if (s3 !== peg$FAILED) {
2050             s4 = peg$parse_();
2051             if (s4 !== peg$FAILED) {
2052               if (input.charCodeAt(peg$currPos) === 41) {
2053                 s5 = peg$c67;
2054                 peg$currPos++;
2055               } else {
2056                 s5 = peg$FAILED;
2057                 if (peg$silentFails === 0) { peg$fail(peg$c68); }
2058               }
2059               if (s5 !== peg$FAILED) {
2060                 peg$savedPos = s0;
2061                 s1 = peg$c80(s3);
2062                 s0 = s1;
2063               } else {
2064                 peg$currPos = s0;
2065                 s0 = peg$FAILED;
2066               }
2067             } else {
2068               peg$currPos = s0;
2069               s0 = peg$FAILED;
2070             }
2071           } else {
2072             peg$currPos = s0;
2073             s0 = peg$FAILED;
2074           }
2075         } else {
2076           peg$currPos = s0;
2077           s0 = peg$FAILED;
2078         }
2079       } else {
2080         peg$currPos = s0;
2081         s0 = peg$FAILED;
2082       }
2083
2084       peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
2085
2086       return s0;
2087     }
2088
2089     function peg$parsematches() {
2090       var s0, s1, s2, s3, s4, s5;
2091
2092       var key    = peg$currPos * 30 + 23,
2093           cached = peg$resultsCache[key];
2094
2095       if (cached) {
2096         peg$currPos = cached.nextPos;
2097
2098         return cached.result;
2099       }
2100
2101       s0 = peg$currPos;
2102       if (input.substr(peg$currPos, 9) === peg$c81) {
2103         s1 = peg$c81;
2104         peg$currPos += 9;
2105       } else {
2106         s1 = peg$FAILED;
2107         if (peg$silentFails === 0) { peg$fail(peg$c82); }
2108       }
2109       if (s1 !== peg$FAILED) {
2110         s2 = peg$parse_();
2111         if (s2 !== peg$FAILED) {
2112           s3 = peg$parseselectors();
2113           if (s3 !== peg$FAILED) {
2114             s4 = peg$parse_();
2115             if (s4 !== peg$FAILED) {
2116               if (input.charCodeAt(peg$currPos) === 41) {
2117                 s5 = peg$c67;
2118                 peg$currPos++;
2119               } else {
2120                 s5 = peg$FAILED;
2121                 if (peg$silentFails === 0) { peg$fail(peg$c68); }
2122               }
2123               if (s5 !== peg$FAILED) {
2124                 peg$savedPos = s0;
2125                 s1 = peg$c83(s3);
2126                 s0 = s1;
2127               } else {
2128                 peg$currPos = s0;
2129                 s0 = peg$FAILED;
2130               }
2131             } else {
2132               peg$currPos = s0;
2133               s0 = peg$FAILED;
2134             }
2135           } else {
2136             peg$currPos = s0;
2137             s0 = peg$FAILED;
2138           }
2139         } else {
2140           peg$currPos = s0;
2141           s0 = peg$FAILED;
2142         }
2143       } else {
2144         peg$currPos = s0;
2145         s0 = peg$FAILED;
2146       }
2147
2148       peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
2149
2150       return s0;
2151     }
2152
2153     function peg$parsehas() {
2154       var s0, s1, s2, s3, s4, s5;
2155
2156       var key    = peg$currPos * 30 + 24,
2157           cached = peg$resultsCache[key];
2158
2159       if (cached) {
2160         peg$currPos = cached.nextPos;
2161
2162         return cached.result;
2163       }
2164
2165       s0 = peg$currPos;
2166       if (input.substr(peg$currPos, 5) === peg$c84) {
2167         s1 = peg$c84;
2168         peg$currPos += 5;
2169       } else {
2170         s1 = peg$FAILED;
2171         if (peg$silentFails === 0) { peg$fail(peg$c85); }
2172       }
2173       if (s1 !== peg$FAILED) {
2174         s2 = peg$parse_();
2175         if (s2 !== peg$FAILED) {
2176           s3 = peg$parseselectors();
2177           if (s3 !== peg$FAILED) {
2178             s4 = peg$parse_();
2179             if (s4 !== peg$FAILED) {
2180               if (input.charCodeAt(peg$currPos) === 41) {
2181                 s5 = peg$c67;
2182                 peg$currPos++;
2183               } else {
2184                 s5 = peg$FAILED;
2185                 if (peg$silentFails === 0) { peg$fail(peg$c68); }
2186               }
2187               if (s5 !== peg$FAILED) {
2188                 peg$savedPos = s0;
2189                 s1 = peg$c86(s3);
2190                 s0 = s1;
2191               } else {
2192                 peg$currPos = s0;
2193                 s0 = peg$FAILED;
2194               }
2195             } else {
2196               peg$currPos = s0;
2197               s0 = peg$FAILED;
2198             }
2199           } else {
2200             peg$currPos = s0;
2201             s0 = peg$FAILED;
2202           }
2203         } else {
2204           peg$currPos = s0;
2205           s0 = peg$FAILED;
2206         }
2207       } else {
2208         peg$currPos = s0;
2209         s0 = peg$FAILED;
2210       }
2211
2212       peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
2213
2214       return s0;
2215     }
2216
2217     function peg$parsefirstChild() {
2218       var s0, s1;
2219
2220       var key    = peg$currPos * 30 + 25,
2221           cached = peg$resultsCache[key];
2222
2223       if (cached) {
2224         peg$currPos = cached.nextPos;
2225
2226         return cached.result;
2227       }
2228
2229       s0 = peg$currPos;
2230       if (input.substr(peg$currPos, 12) === peg$c87) {
2231         s1 = peg$c87;
2232         peg$currPos += 12;
2233       } else {
2234         s1 = peg$FAILED;
2235         if (peg$silentFails === 0) { peg$fail(peg$c88); }
2236       }
2237       if (s1 !== peg$FAILED) {
2238         peg$savedPos = s0;
2239         s1 = peg$c89();
2240       }
2241       s0 = s1;
2242
2243       peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
2244
2245       return s0;
2246     }
2247
2248     function peg$parselastChild() {
2249       var s0, s1;
2250
2251       var key    = peg$currPos * 30 + 26,
2252           cached = peg$resultsCache[key];
2253
2254       if (cached) {
2255         peg$currPos = cached.nextPos;
2256
2257         return cached.result;
2258       }
2259
2260       s0 = peg$currPos;
2261       if (input.substr(peg$currPos, 11) === peg$c90) {
2262         s1 = peg$c90;
2263         peg$currPos += 11;
2264       } else {
2265         s1 = peg$FAILED;
2266         if (peg$silentFails === 0) { peg$fail(peg$c91); }
2267       }
2268       if (s1 !== peg$FAILED) {
2269         peg$savedPos = s0;
2270         s1 = peg$c92();
2271       }
2272       s0 = s1;
2273
2274       peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
2275
2276       return s0;
2277     }
2278
2279     function peg$parsenthChild() {
2280       var s0, s1, s2, s3, s4, s5;
2281
2282       var key    = peg$currPos * 30 + 27,
2283           cached = peg$resultsCache[key];
2284
2285       if (cached) {
2286         peg$currPos = cached.nextPos;
2287
2288         return cached.result;
2289       }
2290
2291       s0 = peg$currPos;
2292       if (input.substr(peg$currPos, 11) === peg$c93) {
2293         s1 = peg$c93;
2294         peg$currPos += 11;
2295       } else {
2296         s1 = peg$FAILED;
2297         if (peg$silentFails === 0) { peg$fail(peg$c94); }
2298       }
2299       if (s1 !== peg$FAILED) {
2300         s2 = peg$parse_();
2301         if (s2 !== peg$FAILED) {
2302           s3 = [];
2303           if (peg$c59.test(input.charAt(peg$currPos))) {
2304             s4 = input.charAt(peg$currPos);
2305             peg$currPos++;
2306           } else {
2307             s4 = peg$FAILED;
2308             if (peg$silentFails === 0) { peg$fail(peg$c60); }
2309           }
2310           if (s4 !== peg$FAILED) {
2311             while (s4 !== peg$FAILED) {
2312               s3.push(s4);
2313               if (peg$c59.test(input.charAt(peg$currPos))) {
2314                 s4 = input.charAt(peg$currPos);
2315                 peg$currPos++;
2316               } else {
2317                 s4 = peg$FAILED;
2318                 if (peg$silentFails === 0) { peg$fail(peg$c60); }
2319               }
2320             }
2321           } else {
2322             s3 = peg$FAILED;
2323           }
2324           if (s3 !== peg$FAILED) {
2325             s4 = peg$parse_();
2326             if (s4 !== peg$FAILED) {
2327               if (input.charCodeAt(peg$currPos) === 41) {
2328                 s5 = peg$c67;
2329                 peg$currPos++;
2330               } else {
2331                 s5 = peg$FAILED;
2332                 if (peg$silentFails === 0) { peg$fail(peg$c68); }
2333               }
2334               if (s5 !== peg$FAILED) {
2335                 peg$savedPos = s0;
2336                 s1 = peg$c95(s3);
2337                 s0 = s1;
2338               } else {
2339                 peg$currPos = s0;
2340                 s0 = peg$FAILED;
2341               }
2342             } else {
2343               peg$currPos = s0;
2344               s0 = peg$FAILED;
2345             }
2346           } else {
2347             peg$currPos = s0;
2348             s0 = peg$FAILED;
2349           }
2350         } else {
2351           peg$currPos = s0;
2352           s0 = peg$FAILED;
2353         }
2354       } else {
2355         peg$currPos = s0;
2356         s0 = peg$FAILED;
2357       }
2358
2359       peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
2360
2361       return s0;
2362     }
2363
2364     function peg$parsenthLastChild() {
2365       var s0, s1, s2, s3, s4, s5;
2366
2367       var key    = peg$currPos * 30 + 28,
2368           cached = peg$resultsCache[key];
2369
2370       if (cached) {
2371         peg$currPos = cached.nextPos;
2372
2373         return cached.result;
2374       }
2375
2376       s0 = peg$currPos;
2377       if (input.substr(peg$currPos, 16) === peg$c96) {
2378         s1 = peg$c96;
2379         peg$currPos += 16;
2380       } else {
2381         s1 = peg$FAILED;
2382         if (peg$silentFails === 0) { peg$fail(peg$c97); }
2383       }
2384       if (s1 !== peg$FAILED) {
2385         s2 = peg$parse_();
2386         if (s2 !== peg$FAILED) {
2387           s3 = [];
2388           if (peg$c59.test(input.charAt(peg$currPos))) {
2389             s4 = input.charAt(peg$currPos);
2390             peg$currPos++;
2391           } else {
2392             s4 = peg$FAILED;
2393             if (peg$silentFails === 0) { peg$fail(peg$c60); }
2394           }
2395           if (s4 !== peg$FAILED) {
2396             while (s4 !== peg$FAILED) {
2397               s3.push(s4);
2398               if (peg$c59.test(input.charAt(peg$currPos))) {
2399                 s4 = input.charAt(peg$currPos);
2400                 peg$currPos++;
2401               } else {
2402                 s4 = peg$FAILED;
2403                 if (peg$silentFails === 0) { peg$fail(peg$c60); }
2404               }
2405             }
2406           } else {
2407             s3 = peg$FAILED;
2408           }
2409           if (s3 !== peg$FAILED) {
2410             s4 = peg$parse_();
2411             if (s4 !== peg$FAILED) {
2412               if (input.charCodeAt(peg$currPos) === 41) {
2413                 s5 = peg$c67;
2414                 peg$currPos++;
2415               } else {
2416                 s5 = peg$FAILED;
2417                 if (peg$silentFails === 0) { peg$fail(peg$c68); }
2418               }
2419               if (s5 !== peg$FAILED) {
2420                 peg$savedPos = s0;
2421                 s1 = peg$c98(s3);
2422                 s0 = s1;
2423               } else {
2424                 peg$currPos = s0;
2425                 s0 = peg$FAILED;
2426               }
2427             } else {
2428               peg$currPos = s0;
2429               s0 = peg$FAILED;
2430             }
2431           } else {
2432             peg$currPos = s0;
2433             s0 = peg$FAILED;
2434           }
2435         } else {
2436           peg$currPos = s0;
2437           s0 = peg$FAILED;
2438         }
2439       } else {
2440         peg$currPos = s0;
2441         s0 = peg$FAILED;
2442       }
2443
2444       peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
2445
2446       return s0;
2447     }
2448
2449     function peg$parseclass() {
2450       var s0, s1, s2;
2451
2452       var key    = peg$currPos * 30 + 29,
2453           cached = peg$resultsCache[key];
2454
2455       if (cached) {
2456         peg$currPos = cached.nextPos;
2457
2458         return cached.result;
2459       }
2460
2461       s0 = peg$currPos;
2462       if (input.charCodeAt(peg$currPos) === 58) {
2463         s1 = peg$c99;
2464         peg$currPos++;
2465       } else {
2466         s1 = peg$FAILED;
2467         if (peg$silentFails === 0) { peg$fail(peg$c100); }
2468       }
2469       if (s1 !== peg$FAILED) {
2470         if (input.substr(peg$currPos, 9).toLowerCase() === peg$c101) {
2471           s2 = input.substr(peg$currPos, 9);
2472           peg$currPos += 9;
2473         } else {
2474           s2 = peg$FAILED;
2475           if (peg$silentFails === 0) { peg$fail(peg$c102); }
2476         }
2477         if (s2 === peg$FAILED) {
2478           if (input.substr(peg$currPos, 10).toLowerCase() === peg$c103) {
2479             s2 = input.substr(peg$currPos, 10);
2480             peg$currPos += 10;
2481           } else {
2482             s2 = peg$FAILED;
2483             if (peg$silentFails === 0) { peg$fail(peg$c104); }
2484           }
2485           if (s2 === peg$FAILED) {
2486             if (input.substr(peg$currPos, 11).toLowerCase() === peg$c105) {
2487               s2 = input.substr(peg$currPos, 11);
2488               peg$currPos += 11;
2489             } else {
2490               s2 = peg$FAILED;
2491               if (peg$silentFails === 0) { peg$fail(peg$c106); }
2492             }
2493             if (s2 === peg$FAILED) {
2494               if (input.substr(peg$currPos, 8).toLowerCase() === peg$c107) {
2495                 s2 = input.substr(peg$currPos, 8);
2496                 peg$currPos += 8;
2497               } else {
2498                 s2 = peg$FAILED;
2499                 if (peg$silentFails === 0) { peg$fail(peg$c108); }
2500               }
2501               if (s2 === peg$FAILED) {
2502                 if (input.substr(peg$currPos, 7).toLowerCase() === peg$c109) {
2503                   s2 = input.substr(peg$currPos, 7);
2504                   peg$currPos += 7;
2505                 } else {
2506                   s2 = peg$FAILED;
2507                   if (peg$silentFails === 0) { peg$fail(peg$c110); }
2508                 }
2509               }
2510             }
2511           }
2512         }
2513         if (s2 !== peg$FAILED) {
2514           peg$savedPos = s0;
2515           s1 = peg$c111(s2);
2516           s0 = s1;
2517         } else {
2518           peg$currPos = s0;
2519           s0 = peg$FAILED;
2520         }
2521       } else {
2522         peg$currPos = s0;
2523         s0 = peg$FAILED;
2524       }
2525
2526       peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
2527
2528       return s0;
2529     }
2530
2531
2532       function nth(n) { return { type: 'nth-child', index: { type: 'literal', value: n } }; }
2533       function nthLast(n) { return { type: 'nth-last-child', index: { type: 'literal', value: n } }; }
2534       function strUnescape(s) {
2535         return s.replace(/\\(.)/g, function(match, ch) {
2536           switch(ch) {
2537             case 'b': return '\b';
2538             case 'f': return '\f';
2539             case 'n': return '\n';
2540             case 'r': return '\r';
2541             case 't': return '\t';
2542             case 'v': return '\v';
2543             default: return ch;
2544           }
2545         });
2546       }
2547
2548
2549     peg$result = peg$startRuleFunction();
2550
2551     if (peg$result !== peg$FAILED && peg$currPos === input.length) {
2552       return peg$result;
2553     } else {
2554       if (peg$result !== peg$FAILED && peg$currPos < input.length) {
2555         peg$fail(peg$endExpectation());
2556       }
2557
2558       throw peg$buildStructuredError(
2559         peg$maxFailExpected,
2560         peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,
2561         peg$maxFailPos < input.length
2562           ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)
2563           : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)
2564       );
2565     }
2566   }
2567
2568   return {
2569     SyntaxError: peg$SyntaxError,
2570     parse:       peg$parse
2571   };
2572 });