JAL-1759 merge from develop
[jalview.git] / examples / biojson-doc / lib / handlebars.js
1 /*!
2
3  handlebars v1.1.2
4
5 Copyright (C) 2011 by Yehuda Katz
6
7 Permission is hereby granted, free of charge, to any person obtaining a copy
8 of this software and associated documentation files (the "Software"), to deal
9 in the Software without restriction, including without limitation the rights
10 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 copies of the Software, and to permit persons to whom the Software is
12 furnished to do so, subject to the following conditions:
13
14 The above copyright notice and this permission notice shall be included in
15 all copies or substantial portions of the Software.
16
17 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23 THE SOFTWARE.
24
25 @license
26 */
27 var Handlebars = (function() {
28 // handlebars/safe-string.js
29 var __module4__ = (function() {
30   "use strict";
31   var __exports__;
32   // Build out our basic SafeString type
33   function SafeString(string) {
34     this.string = string;
35   }
36
37   SafeString.prototype.toString = function() {
38     return "" + this.string;
39   };
40
41   __exports__ = SafeString;
42   return __exports__;
43 })();
44
45 // handlebars/utils.js
46 var __module3__ = (function(__dependency1__) {
47   "use strict";
48   var __exports__ = {};
49   var SafeString = __dependency1__;
50
51   var escape = {
52     "&": "&",
53     "<": "&lt;",
54     ">": "&gt;",
55     '"': "&quot;",
56     "'": "&#x27;",
57     "`": "&#x60;"
58   };
59
60   var badChars = /[&<>"'`]/g;
61   var possible = /[&<>"'`]/;
62
63   function escapeChar(chr) {
64     return escape[chr] || "&amp;";
65   }
66
67   function extend(obj, value) {
68     for(var key in value) {
69       if(value.hasOwnProperty(key)) {
70         obj[key] = value[key];
71       }
72     }
73   }
74
75   __exports__.extend = extend;var toString = Object.prototype.toString;
76   __exports__.toString = toString;
77   // Sourced from lodash
78   // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt
79   var isFunction = function(value) {
80     return typeof value === 'function';
81   };
82   // fallback for older versions of Chrome and Safari
83   if (isFunction(/x/)) {
84     isFunction = function(value) {
85       return typeof value === 'function' && toString.call(value) === '[object Function]';
86     };
87   }
88   var isFunction;
89   __exports__.isFunction = isFunction;
90   var isArray = Array.isArray || function(value) {
91     return (value && typeof value === 'object') ? toString.call(value) === '[object Array]' : false;
92   };
93   __exports__.isArray = isArray;
94
95   function escapeExpression(string) {
96     // don't escape SafeStrings, since they're already safe
97     if (string instanceof SafeString) {
98       return string.toString();
99     } else if (!string && string !== 0) {
100       return "";
101     }
102
103     // Force a string conversion as this will be done by the append regardless and
104     // the regex test will do this transparently behind the scenes, causing issues if
105     // an object's to string has escaped characters in it.
106     string = "" + string;
107
108     if(!possible.test(string)) { return string; }
109     return string.replace(badChars, escapeChar);
110   }
111
112   __exports__.escapeExpression = escapeExpression;function isEmpty(value) {
113     if (!value && value !== 0) {
114       return true;
115     } else if (isArray(value) && value.length === 0) {
116       return true;
117     } else {
118       return false;
119     }
120   }
121
122   __exports__.isEmpty = isEmpty;
123   return __exports__;
124 })(__module4__);
125
126 // handlebars/exception.js
127 var __module5__ = (function() {
128   "use strict";
129   var __exports__;
130
131   var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];
132
133   function Exception(/* message */) {
134     var tmp = Error.prototype.constructor.apply(this, arguments);
135
136     // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.
137     for (var idx = 0; idx < errorProps.length; idx++) {
138       this[errorProps[idx]] = tmp[errorProps[idx]];
139     }
140   }
141
142   Exception.prototype = new Error();
143
144   __exports__ = Exception;
145   return __exports__;
146 })();
147
148 // handlebars/base.js
149 var __module2__ = (function(__dependency1__, __dependency2__) {
150   "use strict";
151   var __exports__ = {};
152   /*globals Exception, Utils */
153   var Utils = __dependency1__;
154   var Exception = __dependency2__;
155
156   var VERSION = "1.1.2";
157   __exports__.VERSION = VERSION;var COMPILER_REVISION = 4;
158   __exports__.COMPILER_REVISION = COMPILER_REVISION;
159   var REVISION_CHANGES = {
160     1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it
161     2: '== 1.0.0-rc.3',
162     3: '== 1.0.0-rc.4',
163     4: '>= 1.0.0'
164   };
165   __exports__.REVISION_CHANGES = REVISION_CHANGES;
166   var isArray = Utils.isArray,
167       isFunction = Utils.isFunction,
168       toString = Utils.toString,
169       objectType = '[object Object]';
170
171   function HandlebarsEnvironment(helpers, partials) {
172     this.helpers = helpers || {};
173     this.partials = partials || {};
174
175     registerDefaultHelpers(this);
176   }
177
178   __exports__.HandlebarsEnvironment = HandlebarsEnvironment;HandlebarsEnvironment.prototype = {
179     constructor: HandlebarsEnvironment,
180
181     logger: logger,
182     log: log,
183
184     registerHelper: function(name, fn, inverse) {
185       if (toString.call(name) === objectType) {
186         if (inverse || fn) { throw new Exception('Arg not supported with multiple helpers'); }
187         Utils.extend(this.helpers, name);
188       } else {
189         if (inverse) { fn.not = inverse; }
190         this.helpers[name] = fn;
191       }
192     },
193
194     registerPartial: function(name, str) {
195       if (toString.call(name) === objectType) {
196         Utils.extend(this.partials,  name);
197       } else {
198         this.partials[name] = str;
199       }
200     }
201   };
202
203   function registerDefaultHelpers(instance) {
204     instance.registerHelper('helperMissing', function(arg) {
205       if(arguments.length === 2) {
206         return undefined;
207       } else {
208         throw new Error("Missing helper: '" + arg + "'");
209       }
210     });
211
212     instance.registerHelper('blockHelperMissing', function(context, options) {
213       var inverse = options.inverse || function() {}, fn = options.fn;
214
215       if (isFunction(context)) { context = context.call(this); }
216
217       if(context === true) {
218         return fn(this);
219       } else if(context === false || context == null) {
220         return inverse(this);
221       } else if (isArray(context)) {
222         if(context.length > 0) {
223           return instance.helpers.each(context, options);
224         } else {
225           return inverse(this);
226         }
227       } else {
228         return fn(context);
229       }
230     });
231
232     instance.registerHelper('each', function(context, options) {
233       var fn = options.fn, inverse = options.inverse;
234       var i = 0, ret = "", data;
235
236       if (isFunction(context)) { context = context.call(this); }
237
238       if (options.data) {
239         data = createFrame(options.data);
240       }
241
242       if(context && typeof context === 'object') {
243         if (isArray(context)) {
244           for(var j = context.length; i<j; i++) {
245             if (data) {
246               data.index = i;
247               data.first = (i === 0)
248               data.last  = (i === (context.length-1));
249             }
250             ret = ret + fn(context[i], { data: data });
251           }
252         } else {
253           for(var key in context) {
254             if(context.hasOwnProperty(key)) {
255               if(data) { data.key = key; }
256               ret = ret + fn(context[key], {data: data});
257               i++;
258             }
259           }
260         }
261       }
262
263       if(i === 0){
264         ret = inverse(this);
265       }
266
267       return ret;
268     });
269
270     instance.registerHelper('if', function(conditional, options) {
271       if (isFunction(conditional)) { conditional = conditional.call(this); }
272
273       // Default behavior is to render the positive path if the value is truthy and not empty.
274       // The `includeZero` option may be set to treat the condtional as purely not empty based on the
275       // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative.
276       if ((!options.hash.includeZero && !conditional) || Utils.isEmpty(conditional)) {
277         return options.inverse(this);
278       } else {
279         return options.fn(this);
280       }
281     });
282
283     instance.registerHelper('unless', function(conditional, options) {
284       return instance.helpers['if'].call(this, conditional, {fn: options.inverse, inverse: options.fn, hash: options.hash});
285     });
286
287     instance.registerHelper('with', function(context, options) {
288       if (isFunction(context)) { context = context.call(this); }
289
290       if (!Utils.isEmpty(context)) return options.fn(context);
291     });
292
293     instance.registerHelper('log', function(context, options) {
294       var level = options.data && options.data.level != null ? parseInt(options.data.level, 10) : 1;
295       instance.log(level, context);
296     });
297   }
298
299   var logger = {
300     methodMap: { 0: 'debug', 1: 'info', 2: 'warn', 3: 'error' },
301
302     // State enum
303     DEBUG: 0,
304     INFO: 1,
305     WARN: 2,
306     ERROR: 3,
307     level: 3,
308
309     // can be overridden in the host environment
310     log: function(level, obj) {
311       if (logger.level <= level) {
312         var method = logger.methodMap[level];
313         if (typeof console !== 'undefined' && console[method]) {
314           console[method].call(console, obj);
315         }
316       }
317     }
318   };
319   __exports__.logger = logger;
320   function log(level, obj) { logger.log(level, obj); }
321
322   __exports__.log = log;var createFrame = function(object) {
323     var obj = {};
324     Utils.extend(obj, object);
325     return obj;
326   };
327   __exports__.createFrame = createFrame;
328   return __exports__;
329 })(__module3__, __module5__);
330
331 // handlebars/runtime.js
332 var __module6__ = (function(__dependency1__, __dependency2__, __dependency3__) {
333   "use strict";
334   var __exports__ = {};
335   /*global Utils */
336   var Utils = __dependency1__;
337   var Exception = __dependency2__;
338   var COMPILER_REVISION = __dependency3__.COMPILER_REVISION;
339   var REVISION_CHANGES = __dependency3__.REVISION_CHANGES;
340
341   function checkRevision(compilerInfo) {
342     var compilerRevision = compilerInfo && compilerInfo[0] || 1,
343         currentRevision = COMPILER_REVISION;
344
345     if (compilerRevision !== currentRevision) {
346       if (compilerRevision < currentRevision) {
347         var runtimeVersions = REVISION_CHANGES[currentRevision],
348             compilerVersions = REVISION_CHANGES[compilerRevision];
349         throw new Error("Template was precompiled with an older version of Handlebars than the current runtime. "+
350               "Please update your precompiler to a newer version ("+runtimeVersions+") or downgrade your runtime to an older version ("+compilerVersions+").");
351       } else {
352         // Use the embedded version info since the runtime doesn't know about this revision yet
353         throw new Error("Template was precompiled with a newer version of Handlebars than the current runtime. "+
354               "Please update your runtime to a newer version ("+compilerInfo[1]+").");
355       }
356     }
357   }
358
359   // TODO: Remove this line and break up compilePartial
360
361   function template(templateSpec, env) {
362     if (!env) {
363       throw new Error("No environment passed to template");
364     }
365
366     var invokePartialWrapper;
367     if (env.compile) {
368       invokePartialWrapper = function(partial, name, context, helpers, partials, data) {
369         // TODO : Check this for all inputs and the options handling (partial flag, etc). This feels
370         // like there should be a common exec path
371         var result = invokePartial.apply(this, arguments);
372         if (result) { return result; }
373
374         var options = { helpers: helpers, partials: partials, data: data };
375         partials[name] = env.compile(partial, { data: data !== undefined }, env);
376         return partials[name](context, options);
377       };
378     } else {
379       invokePartialWrapper = function(partial, name /* , context, helpers, partials, data */) {
380         var result = invokePartial.apply(this, arguments);
381         if (result) { return result; }
382         throw new Exception("The partial " + name + " could not be compiled when running in runtime-only mode");
383       };
384     }
385
386     // Just add water
387     var container = {
388       escapeExpression: Utils.escapeExpression,
389       invokePartial: invokePartialWrapper,
390       programs: [],
391       program: function(i, fn, data) {
392         var programWrapper = this.programs[i];
393         if(data) {
394           programWrapper = program(i, fn, data);
395         } else if (!programWrapper) {
396           programWrapper = this.programs[i] = program(i, fn);
397         }
398         return programWrapper;
399       },
400       merge: function(param, common) {
401         var ret = param || common;
402
403         if (param && common && (param !== common)) {
404           ret = {};
405           Utils.extend(ret, common);
406           Utils.extend(ret, param);
407         }
408         return ret;
409       },
410       programWithDepth: programWithDepth,
411       noop: noop,
412       compilerInfo: null
413     };
414
415     return function(context, options) {
416       options = options || {};
417       var namespace = options.partial ? options : env,
418           helpers,
419           partials;
420
421       if (!options.partial) {
422         helpers = options.helpers;
423         partials = options.partials;
424       }
425       var result = templateSpec.call(
426             container,
427             namespace, context,
428             helpers,
429             partials,
430             options.data);
431
432       if (!options.partial) {
433         checkRevision(container.compilerInfo);
434       }
435
436       return result;
437     };
438   }
439
440   __exports__.template = template;function programWithDepth(i, fn, data /*, $depth */) {
441     var args = Array.prototype.slice.call(arguments, 3);
442
443     var prog = function(context, options) {
444       options = options || {};
445
446       return fn.apply(this, [context, options.data || data].concat(args));
447     };
448     prog.program = i;
449     prog.depth = args.length;
450     return prog;
451   }
452
453   __exports__.programWithDepth = programWithDepth;function program(i, fn, data) {
454     var prog = function(context, options) {
455       options = options || {};
456
457       return fn(context, options.data || data);
458     };
459     prog.program = i;
460     prog.depth = 0;
461     return prog;
462   }
463
464   __exports__.program = program;function invokePartial(partial, name, context, helpers, partials, data) {
465     var options = { partial: true, helpers: helpers, partials: partials, data: data };
466
467     if(partial === undefined) {
468       throw new Exception("The partial " + name + " could not be found");
469     } else if(partial instanceof Function) {
470       return partial(context, options);
471     }
472   }
473
474   __exports__.invokePartial = invokePartial;function noop() { return ""; }
475
476   __exports__.noop = noop;
477   return __exports__;
478 })(__module3__, __module5__, __module2__);
479
480 // handlebars.runtime.js
481 var __module1__ = (function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__) {
482   "use strict";
483   var __exports__;
484   var base = __dependency1__;
485
486   // Each of these augment the Handlebars object. No need to setup here.
487   // (This is done to easily share code between commonjs and browse envs)
488   var SafeString = __dependency2__;
489   var Exception = __dependency3__;
490   var Utils = __dependency4__;
491   var runtime = __dependency5__;
492
493   // For compatibility and usage outside of module systems, make the Handlebars object a namespace
494   var create = function() {
495     var hb = new base.HandlebarsEnvironment();
496
497     Utils.extend(hb, base);
498     hb.SafeString = SafeString;
499     hb.Exception = Exception;
500     hb.Utils = Utils;
501
502     hb.VM = runtime;
503     hb.template = function(spec) {
504       return runtime.template(spec, hb);
505     };
506
507     return hb;
508   };
509
510   var Handlebars = create();
511   Handlebars.create = create;
512
513   __exports__ = Handlebars;
514   return __exports__;
515 })(__module2__, __module4__, __module5__, __module3__, __module6__);
516
517 // handlebars/compiler/ast.js
518 var __module7__ = (function(__dependency1__) {
519   "use strict";
520   var __exports__ = {};
521   var Exception = __dependency1__;
522
523   function ProgramNode(statements, inverseStrip, inverse) {
524     this.type = "program";
525     this.statements = statements;
526     this.strip = {};
527
528     if(inverse) {
529       this.inverse = new ProgramNode(inverse, inverseStrip);
530       this.strip.right = inverseStrip.left;
531     } else if (inverseStrip) {
532       this.strip.left = inverseStrip.right;
533     }
534   }
535
536   __exports__.ProgramNode = ProgramNode;function MustacheNode(rawParams, hash, open, strip) {
537     this.type = "mustache";
538     this.hash = hash;
539     this.strip = strip;
540
541     var escapeFlag = open[3] || open[2];
542     this.escaped = escapeFlag !== '{' && escapeFlag !== '&';
543
544     var id = this.id = rawParams[0];
545     var params = this.params = rawParams.slice(1);
546
547     // a mustache is an eligible helper if:
548     // * its id is simple (a single part, not `this` or `..`)
549     var eligibleHelper = this.eligibleHelper = id.isSimple;
550
551     // a mustache is definitely a helper if:
552     // * it is an eligible helper, and
553     // * it has at least one parameter or hash segment
554     this.isHelper = eligibleHelper && (params.length || hash);
555
556     // if a mustache is an eligible helper but not a definite
557     // helper, it is ambiguous, and will be resolved in a later
558     // pass or at runtime.
559   }
560
561   __exports__.MustacheNode = MustacheNode;function PartialNode(partialName, context, strip) {
562     this.type         = "partial";
563     this.partialName  = partialName;
564     this.context      = context;
565     this.strip = strip;
566   }
567
568   __exports__.PartialNode = PartialNode;function BlockNode(mustache, program, inverse, close) {
569     if(mustache.id.original !== close.path.original) {
570       throw new Exception(mustache.id.original + " doesn't match " + close.path.original);
571     }
572
573     this.type = "block";
574     this.mustache = mustache;
575     this.program  = program;
576     this.inverse  = inverse;
577
578     this.strip = {
579       left: mustache.strip.left,
580       right: close.strip.right
581     };
582
583     (program || inverse).strip.left = mustache.strip.right;
584     (inverse || program).strip.right = close.strip.left;
585
586     if (inverse && !program) {
587       this.isInverse = true;
588     }
589   }
590
591   __exports__.BlockNode = BlockNode;function ContentNode(string) {
592     this.type = "content";
593     this.string = string;
594   }
595
596   __exports__.ContentNode = ContentNode;function HashNode(pairs) {
597     this.type = "hash";
598     this.pairs = pairs;
599   }
600
601   __exports__.HashNode = HashNode;function IdNode(parts) {
602     this.type = "ID";
603
604     var original = "",
605         dig = [],
606         depth = 0;
607
608     for(var i=0,l=parts.length; i<l; i++) {
609       var part = parts[i].part;
610       original += (parts[i].separator || '') + part;
611
612       if (part === ".." || part === "." || part === "this") {
613         if (dig.length > 0) { throw new Exception("Invalid path: " + original); }
614         else if (part === "..") { depth++; }
615         else { this.isScoped = true; }
616       }
617       else { dig.push(part); }
618     }
619
620     this.original = original;
621     this.parts    = dig;
622     this.string   = dig.join('.');
623     this.depth    = depth;
624
625     // an ID is simple if it only has one part, and that part is not
626     // `..` or `this`.
627     this.isSimple = parts.length === 1 && !this.isScoped && depth === 0;
628
629     this.stringModeValue = this.string;
630   }
631
632   __exports__.IdNode = IdNode;function PartialNameNode(name) {
633     this.type = "PARTIAL_NAME";
634     this.name = name.original;
635   }
636
637   __exports__.PartialNameNode = PartialNameNode;function DataNode(id) {
638     this.type = "DATA";
639     this.id = id;
640   }
641
642   __exports__.DataNode = DataNode;function StringNode(string) {
643     this.type = "STRING";
644     this.original =
645       this.string =
646       this.stringModeValue = string;
647   }
648
649   __exports__.StringNode = StringNode;function IntegerNode(integer) {
650     this.type = "INTEGER";
651     this.original =
652       this.integer = integer;
653     this.stringModeValue = Number(integer);
654   }
655
656   __exports__.IntegerNode = IntegerNode;function BooleanNode(bool) {
657     this.type = "BOOLEAN";
658     this.bool = bool;
659     this.stringModeValue = bool === "true";
660   }
661
662   __exports__.BooleanNode = BooleanNode;function CommentNode(comment) {
663     this.type = "comment";
664     this.comment = comment;
665   }
666
667   __exports__.CommentNode = CommentNode;
668   return __exports__;
669 })(__module5__);
670
671 // handlebars/compiler/parser.js
672 var __module9__ = (function() {
673   "use strict";
674   var __exports__;
675   /* Jison generated parser */
676   var handlebars = (function(){
677   var parser = {trace: function trace() { },
678   yy: {},
679   symbols_: {"error":2,"root":3,"statements":4,"EOF":5,"program":6,"simpleInverse":7,"statement":8,"openInverse":9,"closeBlock":10,"openBlock":11,"mustache":12,"partial":13,"CONTENT":14,"COMMENT":15,"OPEN_BLOCK":16,"inMustache":17,"CLOSE":18,"OPEN_INVERSE":19,"OPEN_ENDBLOCK":20,"path":21,"OPEN":22,"OPEN_UNESCAPED":23,"CLOSE_UNESCAPED":24,"OPEN_PARTIAL":25,"partialName":26,"partial_option0":27,"inMustache_repetition0":28,"inMustache_option0":29,"dataName":30,"param":31,"STRING":32,"INTEGER":33,"BOOLEAN":34,"hash":35,"hash_repetition_plus0":36,"hashSegment":37,"ID":38,"EQUALS":39,"DATA":40,"pathSegments":41,"SEP":42,"$accept":0,"$end":1},
680   terminals_: {2:"error",5:"EOF",14:"CONTENT",15:"COMMENT",16:"OPEN_BLOCK",18:"CLOSE",19:"OPEN_INVERSE",20:"OPEN_ENDBLOCK",22:"OPEN",23:"OPEN_UNESCAPED",24:"CLOSE_UNESCAPED",25:"OPEN_PARTIAL",32:"STRING",33:"INTEGER",34:"BOOLEAN",38:"ID",39:"EQUALS",40:"DATA",42:"SEP"},
681   productions_: [0,[3,2],[3,1],[6,2],[6,3],[6,2],[6,1],[6,1],[6,0],[4,1],[4,2],[8,3],[8,3],[8,1],[8,1],[8,1],[8,1],[11,3],[9,3],[10,3],[12,3],[12,3],[13,4],[7,2],[17,3],[17,1],[31,1],[31,1],[31,1],[31,1],[31,1],[35,1],[37,3],[26,1],[26,1],[26,1],[30,2],[21,1],[41,3],[41,1],[27,0],[27,1],[28,0],[28,2],[29,0],[29,1],[36,1],[36,2]],
682   performAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) {
683
684   var $0 = $$.length - 1;
685   switch (yystate) {
686   case 1: return new yy.ProgramNode($$[$0-1]); 
687   break;
688   case 2: return new yy.ProgramNode([]); 
689   break;
690   case 3:this.$ = new yy.ProgramNode([], $$[$0-1], $$[$0]);
691   break;
692   case 4:this.$ = new yy.ProgramNode($$[$0-2], $$[$0-1], $$[$0]);
693   break;
694   case 5:this.$ = new yy.ProgramNode($$[$0-1], $$[$0], []);
695   break;
696   case 6:this.$ = new yy.ProgramNode($$[$0]);
697   break;
698   case 7:this.$ = new yy.ProgramNode([]);
699   break;
700   case 8:this.$ = new yy.ProgramNode([]);
701   break;
702   case 9:this.$ = [$$[$0]];
703   break;
704   case 10: $$[$0-1].push($$[$0]); this.$ = $$[$0-1]; 
705   break;
706   case 11:this.$ = new yy.BlockNode($$[$0-2], $$[$0-1].inverse, $$[$0-1], $$[$0]);
707   break;
708   case 12:this.$ = new yy.BlockNode($$[$0-2], $$[$0-1], $$[$0-1].inverse, $$[$0]);
709   break;
710   case 13:this.$ = $$[$0];
711   break;
712   case 14:this.$ = $$[$0];
713   break;
714   case 15:this.$ = new yy.ContentNode($$[$0]);
715   break;
716   case 16:this.$ = new yy.CommentNode($$[$0]);
717   break;
718   case 17:this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1], $$[$0-2], stripFlags($$[$0-2], $$[$0]));
719   break;
720   case 18:this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1], $$[$0-2], stripFlags($$[$0-2], $$[$0]));
721   break;
722   case 19:this.$ = {path: $$[$0-1], strip: stripFlags($$[$0-2], $$[$0])};
723   break;
724   case 20:this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1], $$[$0-2], stripFlags($$[$0-2], $$[$0]));
725   break;
726   case 21:this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1], $$[$0-2], stripFlags($$[$0-2], $$[$0]));
727   break;
728   case 22:this.$ = new yy.PartialNode($$[$0-2], $$[$0-1], stripFlags($$[$0-3], $$[$0]));
729   break;
730   case 23:this.$ = stripFlags($$[$0-1], $$[$0]);
731   break;
732   case 24:this.$ = [[$$[$0-2]].concat($$[$0-1]), $$[$0]];
733   break;
734   case 25:this.$ = [[$$[$0]], null];
735   break;
736   case 26:this.$ = $$[$0];
737   break;
738   case 27:this.$ = new yy.StringNode($$[$0]);
739   break;
740   case 28:this.$ = new yy.IntegerNode($$[$0]);
741   break;
742   case 29:this.$ = new yy.BooleanNode($$[$0]);
743   break;
744   case 30:this.$ = $$[$0];
745   break;
746   case 31:this.$ = new yy.HashNode($$[$0]);
747   break;
748   case 32:this.$ = [$$[$0-2], $$[$0]];
749   break;
750   case 33:this.$ = new yy.PartialNameNode($$[$0]);
751   break;
752   case 34:this.$ = new yy.PartialNameNode(new yy.StringNode($$[$0]));
753   break;
754   case 35:this.$ = new yy.PartialNameNode(new yy.IntegerNode($$[$0]));
755   break;
756   case 36:this.$ = new yy.DataNode($$[$0]);
757   break;
758   case 37:this.$ = new yy.IdNode($$[$0]);
759   break;
760   case 38: $$[$0-2].push({part: $$[$0], separator: $$[$0-1]}); this.$ = $$[$0-2]; 
761   break;
762   case 39:this.$ = [{part: $$[$0]}];
763   break;
764   case 42:this.$ = [];
765   break;
766   case 43:$$[$0-1].push($$[$0]);
767   break;
768   case 46:this.$ = [$$[$0]];
769   break;
770   case 47:$$[$0-1].push($$[$0]);
771   break;
772   }
773   },
774   table: [{3:1,4:2,5:[1,3],8:4,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],22:[1,13],23:[1,14],25:[1,15]},{1:[3]},{5:[1,16],8:17,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],22:[1,13],23:[1,14],25:[1,15]},{1:[2,2]},{5:[2,9],14:[2,9],15:[2,9],16:[2,9],19:[2,9],20:[2,9],22:[2,9],23:[2,9],25:[2,9]},{4:20,6:18,7:19,8:4,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,21],20:[2,8],22:[1,13],23:[1,14],25:[1,15]},{4:20,6:22,7:19,8:4,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,21],20:[2,8],22:[1,13],23:[1,14],25:[1,15]},{5:[2,13],14:[2,13],15:[2,13],16:[2,13],19:[2,13],20:[2,13],22:[2,13],23:[2,13],25:[2,13]},{5:[2,14],14:[2,14],15:[2,14],16:[2,14],19:[2,14],20:[2,14],22:[2,14],23:[2,14],25:[2,14]},{5:[2,15],14:[2,15],15:[2,15],16:[2,15],19:[2,15],20:[2,15],22:[2,15],23:[2,15],25:[2,15]},{5:[2,16],14:[2,16],15:[2,16],16:[2,16],19:[2,16],20:[2,16],22:[2,16],23:[2,16],25:[2,16]},{17:23,21:24,30:25,38:[1,28],40:[1,27],41:26},{17:29,21:24,30:25,38:[1,28],40:[1,27],41:26},{17:30,21:24,30:25,38:[1,28],40:[1,27],41:26},{17:31,21:24,30:25,38:[1,28],40:[1,27],41:26},{21:33,26:32,32:[1,34],33:[1,35],38:[1,28],41:26},{1:[2,1]},{5:[2,10],14:[2,10],15:[2,10],16:[2,10],19:[2,10],20:[2,10],22:[2,10],23:[2,10],25:[2,10]},{10:36,20:[1,37]},{4:38,8:4,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],20:[2,7],22:[1,13],23:[1,14],25:[1,15]},{7:39,8:17,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,21],20:[2,6],22:[1,13],23:[1,14],25:[1,15]},{17:23,18:[1,40],21:24,30:25,38:[1,28],40:[1,27],41:26},{10:41,20:[1,37]},{18:[1,42]},{18:[2,42],24:[2,42],28:43,32:[2,42],33:[2,42],34:[2,42],38:[2,42],40:[2,42]},{18:[2,25],24:[2,25]},{18:[2,37],24:[2,37],32:[2,37],33:[2,37],34:[2,37],38:[2,37],40:[2,37],42:[1,44]},{21:45,38:[1,28],41:26},{18:[2,39],24:[2,39],32:[2,39],33:[2,39],34:[2,39],38:[2,39],40:[2,39],42:[2,39]},{18:[1,46]},{18:[1,47]},{24:[1,48]},{18:[2,40],21:50,27:49,38:[1,28],41:26},{18:[2,33],38:[2,33]},{18:[2,34],38:[2,34]},{18:[2,35],38:[2,35]},{5:[2,11],14:[2,11],15:[2,11],16:[2,11],19:[2,11],20:[2,11],22:[2,11],23:[2,11],25:[2,11]},{21:51,38:[1,28],41:26},{8:17,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],20:[2,3],22:[1,13],23:[1,14],25:[1,15]},{4:52,8:4,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],20:[2,5],22:[1,13],23:[1,14],25:[1,15]},{14:[2,23],15:[2,23],16:[2,23],19:[2,23],20:[2,23],22:[2,23],23:[2,23],25:[2,23]},{5:[2,12],14:[2,12],15:[2,12],16:[2,12],19:[2,12],20:[2,12],22:[2,12],23:[2,12],25:[2,12]},{14:[2,18],15:[2,18],16:[2,18],19:[2,18],20:[2,18],22:[2,18],23:[2,18],25:[2,18]},{18:[2,44],21:56,24:[2,44],29:53,30:60,31:54,32:[1,57],33:[1,58],34:[1,59],35:55,36:61,37:62,38:[1,63],40:[1,27],41:26},{38:[1,64]},{18:[2,36],24:[2,36],32:[2,36],33:[2,36],34:[2,36],38:[2,36],40:[2,36]},{14:[2,17],15:[2,17],16:[2,17],19:[2,17],20:[2,17],22:[2,17],23:[2,17],25:[2,17]},{5:[2,20],14:[2,20],15:[2,20],16:[2,20],19:[2,20],20:[2,20],22:[2,20],23:[2,20],25:[2,20]},{5:[2,21],14:[2,21],15:[2,21],16:[2,21],19:[2,21],20:[2,21],22:[2,21],23:[2,21],25:[2,21]},{18:[1,65]},{18:[2,41]},{18:[1,66]},{8:17,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],20:[2,4],22:[1,13],23:[1,14],25:[1,15]},{18:[2,24],24:[2,24]},{18:[2,43],24:[2,43],32:[2,43],33:[2,43],34:[2,43],38:[2,43],40:[2,43]},{18:[2,45],24:[2,45]},{18:[2,26],24:[2,26],32:[2,26],33:[2,26],34:[2,26],38:[2,26],40:[2,26]},{18:[2,27],24:[2,27],32:[2,27],33:[2,27],34:[2,27],38:[2,27],40:[2,27]},{18:[2,28],24:[2,28],32:[2,28],33:[2,28],34:[2,28],38:[2,28],40:[2,28]},{18:[2,29],24:[2,29],32:[2,29],33:[2,29],34:[2,29],38:[2,29],40:[2,29]},{18:[2,30],24:[2,30],32:[2,30],33:[2,30],34:[2,30],38:[2,30],40:[2,30]},{18:[2,31],24:[2,31],37:67,38:[1,68]},{18:[2,46],24:[2,46],38:[2,46]},{18:[2,39],24:[2,39],32:[2,39],33:[2,39],34:[2,39],38:[2,39],39:[1,69],40:[2,39],42:[2,39]},{18:[2,38],24:[2,38],32:[2,38],33:[2,38],34:[2,38],38:[2,38],40:[2,38],42:[2,38]},{5:[2,22],14:[2,22],15:[2,22],16:[2,22],19:[2,22],20:[2,22],22:[2,22],23:[2,22],25:[2,22]},{5:[2,19],14:[2,19],15:[2,19],16:[2,19],19:[2,19],20:[2,19],22:[2,19],23:[2,19],25:[2,19]},{18:[2,47],24:[2,47],38:[2,47]},{39:[1,69]},{21:56,30:60,31:70,32:[1,57],33:[1,58],34:[1,59],38:[1,28],40:[1,27],41:26},{18:[2,32],24:[2,32],38:[2,32]}],
775   defaultActions: {3:[2,2],16:[2,1],50:[2,41]},
776   parseError: function parseError(str, hash) {
777       throw new Error(str);
778   },
779   parse: function parse(input) {
780       var self = this, stack = [0], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
781       this.lexer.setInput(input);
782       this.lexer.yy = this.yy;
783       this.yy.lexer = this.lexer;
784       this.yy.parser = this;
785       if (typeof this.lexer.yylloc == "undefined")
786           this.lexer.yylloc = {};
787       var yyloc = this.lexer.yylloc;
788       lstack.push(yyloc);
789       var ranges = this.lexer.options && this.lexer.options.ranges;
790       if (typeof this.yy.parseError === "function")
791           this.parseError = this.yy.parseError;
792       function popStack(n) {
793           stack.length = stack.length - 2 * n;
794           vstack.length = vstack.length - n;
795           lstack.length = lstack.length - n;
796       }
797       function lex() {
798           var token;
799           token = self.lexer.lex() || 1;
800           if (typeof token !== "number") {
801               token = self.symbols_[token] || token;
802           }
803           return token;
804       }
805       var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
806       while (true) {
807           state = stack[stack.length - 1];
808           if (this.defaultActions[state]) {
809               action = this.defaultActions[state];
810           } else {
811               if (symbol === null || typeof symbol == "undefined") {
812                   symbol = lex();
813               }
814               action = table[state] && table[state][symbol];
815           }
816           if (typeof action === "undefined" || !action.length || !action[0]) {
817               var errStr = "";
818               if (!recovering) {
819                   expected = [];
820                   for (p in table[state])
821                       if (this.terminals_[p] && p > 2) {
822                           expected.push("'" + this.terminals_[p] + "'");
823                       }
824                   if (this.lexer.showPosition) {
825                       errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'";
826                   } else {
827                       errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1?"end of input":"'" + (this.terminals_[symbol] || symbol) + "'");
828                   }
829                   this.parseError(errStr, {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected});
830               }
831           }
832           if (action[0] instanceof Array && action.length > 1) {
833               throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol);
834           }
835           switch (action[0]) {
836           case 1:
837               stack.push(symbol);
838               vstack.push(this.lexer.yytext);
839               lstack.push(this.lexer.yylloc);
840               stack.push(action[1]);
841               symbol = null;
842               if (!preErrorSymbol) {
843                   yyleng = this.lexer.yyleng;
844                   yytext = this.lexer.yytext;
845                   yylineno = this.lexer.yylineno;
846                   yyloc = this.lexer.yylloc;
847                   if (recovering > 0)
848                       recovering--;
849               } else {
850                   symbol = preErrorSymbol;
851                   preErrorSymbol = null;
852               }
853               break;
854           case 2:
855               len = this.productions_[action[1]][1];
856               yyval.$ = vstack[vstack.length - len];
857               yyval._$ = {first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column};
858               if (ranges) {
859                   yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]];
860               }
861               r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);
862               if (typeof r !== "undefined") {
863                   return r;
864               }
865               if (len) {
866                   stack = stack.slice(0, -1 * len * 2);
867                   vstack = vstack.slice(0, -1 * len);
868                   lstack = lstack.slice(0, -1 * len);
869               }
870               stack.push(this.productions_[action[1]][0]);
871               vstack.push(yyval.$);
872               lstack.push(yyval._$);
873               newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
874               stack.push(newState);
875               break;
876           case 3:
877               return true;
878           }
879       }
880       return true;
881   }
882   };
883
884
885   function stripFlags(open, close) {
886     return {
887       left: open[2] === '~',
888       right: close[0] === '~' || close[1] === '~'
889     };
890   }
891
892   /* Jison generated lexer */
893   var lexer = (function(){
894   var lexer = ({EOF:1,
895   parseError:function parseError(str, hash) {
896           if (this.yy.parser) {
897               this.yy.parser.parseError(str, hash);
898           } else {
899               throw new Error(str);
900           }
901       },
902   setInput:function (input) {
903           this._input = input;
904           this._more = this._less = this.done = false;
905           this.yylineno = this.yyleng = 0;
906           this.yytext = this.matched = this.match = '';
907           this.conditionStack = ['INITIAL'];
908           this.yylloc = {first_line:1,first_column:0,last_line:1,last_column:0};
909           if (this.options.ranges) this.yylloc.range = [0,0];
910           this.offset = 0;
911           return this;
912       },
913   input:function () {
914           var ch = this._input[0];
915           this.yytext += ch;
916           this.yyleng++;
917           this.offset++;
918           this.match += ch;
919           this.matched += ch;
920           var lines = ch.match(/(?:\r\n?|\n).*/g);
921           if (lines) {
922               this.yylineno++;
923               this.yylloc.last_line++;
924           } else {
925               this.yylloc.last_column++;
926           }
927           if (this.options.ranges) this.yylloc.range[1]++;
928
929           this._input = this._input.slice(1);
930           return ch;
931       },
932   unput:function (ch) {
933           var len = ch.length;
934           var lines = ch.split(/(?:\r\n?|\n)/g);
935
936           this._input = ch + this._input;
937           this.yytext = this.yytext.substr(0, this.yytext.length-len-1);
938           //this.yyleng -= len;
939           this.offset -= len;
940           var oldLines = this.match.split(/(?:\r\n?|\n)/g);
941           this.match = this.match.substr(0, this.match.length-1);
942           this.matched = this.matched.substr(0, this.matched.length-1);
943
944           if (lines.length-1) this.yylineno -= lines.length-1;
945           var r = this.yylloc.range;
946
947           this.yylloc = {first_line: this.yylloc.first_line,
948             last_line: this.yylineno+1,
949             first_column: this.yylloc.first_column,
950             last_column: lines ?
951                 (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length:
952                 this.yylloc.first_column - len
953             };
954
955           if (this.options.ranges) {
956               this.yylloc.range = [r[0], r[0] + this.yyleng - len];
957           }
958           return this;
959       },
960   more:function () {
961           this._more = true;
962           return this;
963       },
964   less:function (n) {
965           this.unput(this.match.slice(n));
966       },
967   pastInput:function () {
968           var past = this.matched.substr(0, this.matched.length - this.match.length);
969           return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
970       },
971   upcomingInput:function () {
972           var next = this.match;
973           if (next.length < 20) {
974               next += this._input.substr(0, 20-next.length);
975           }
976           return (next.substr(0,20)+(next.length > 20 ? '...':'')).replace(/\n/g, "");
977       },
978   showPosition:function () {
979           var pre = this.pastInput();
980           var c = new Array(pre.length + 1).join("-");
981           return pre + this.upcomingInput() + "\n" + c+"^";
982       },
983   next:function () {
984           if (this.done) {
985               return this.EOF;
986           }
987           if (!this._input) this.done = true;
988
989           var token,
990               match,
991               tempMatch,
992               index,
993               col,
994               lines;
995           if (!this._more) {
996               this.yytext = '';
997               this.match = '';
998           }
999           var rules = this._currentRules();
1000           for (var i=0;i < rules.length; i++) {
1001               tempMatch = this._input.match(this.rules[rules[i]]);
1002               if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
1003                   match = tempMatch;
1004                   index = i;
1005                   if (!this.options.flex) break;
1006               }
1007           }
1008           if (match) {
1009               lines = match[0].match(/(?:\r\n?|\n).*/g);
1010               if (lines) this.yylineno += lines.length;
1011               this.yylloc = {first_line: this.yylloc.last_line,
1012                              last_line: this.yylineno+1,
1013                              first_column: this.yylloc.last_column,
1014                              last_column: lines ? lines[lines.length-1].length-lines[lines.length-1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length};
1015               this.yytext += match[0];
1016               this.match += match[0];
1017               this.matches = match;
1018               this.yyleng = this.yytext.length;
1019               if (this.options.ranges) {
1020                   this.yylloc.range = [this.offset, this.offset += this.yyleng];
1021               }
1022               this._more = false;
1023               this._input = this._input.slice(match[0].length);
1024               this.matched += match[0];
1025               token = this.performAction.call(this, this.yy, this, rules[index],this.conditionStack[this.conditionStack.length-1]);
1026               if (this.done && this._input) this.done = false;
1027               if (token) return token;
1028               else return;
1029           }
1030           if (this._input === "") {
1031               return this.EOF;
1032           } else {
1033               return this.parseError('Lexical error on line '+(this.yylineno+1)+'. Unrecognized text.\n'+this.showPosition(),
1034                       {text: "", token: null, line: this.yylineno});
1035           }
1036       },
1037   lex:function lex() {
1038           var r = this.next();
1039           if (typeof r !== 'undefined') {
1040               return r;
1041           } else {
1042               return this.lex();
1043           }
1044       },
1045   begin:function begin(condition) {
1046           this.conditionStack.push(condition);
1047       },
1048   popState:function popState() {
1049           return this.conditionStack.pop();
1050       },
1051   _currentRules:function _currentRules() {
1052           return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules;
1053       },
1054   topState:function () {
1055           return this.conditionStack[this.conditionStack.length-2];
1056       },
1057   pushState:function begin(condition) {
1058           this.begin(condition);
1059       }});
1060   lexer.options = {};
1061   lexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
1062
1063
1064   function strip(start, end) {
1065     return yy_.yytext = yy_.yytext.substr(start, yy_.yyleng-end);
1066   }
1067
1068
1069   var YYSTATE=YY_START
1070   switch($avoiding_name_collisions) {
1071   case 0:
1072                                      if(yy_.yytext.slice(-2) === "\\\\") {
1073                                        strip(0,1);
1074                                        this.begin("mu");
1075                                      } else if(yy_.yytext.slice(-1) === "\\") {
1076                                        strip(0,1);
1077                                        this.begin("emu");
1078                                      } else {
1079                                        this.begin("mu");
1080                                      }
1081                                      if(yy_.yytext) return 14;
1082                                    
1083   break;
1084   case 1:return 14;
1085   break;
1086   case 2:
1087                                      if(yy_.yytext.slice(-1) !== "\\") this.popState();
1088                                      if(yy_.yytext.slice(-1) === "\\") strip(0,1);
1089                                      return 14;
1090                                    
1091   break;
1092   case 3:strip(0,4); this.popState(); return 15;
1093   break;
1094   case 4:return 25;
1095   break;
1096   case 5:return 16;
1097   break;
1098   case 6:return 20;
1099   break;
1100   case 7:return 19;
1101   break;
1102   case 8:return 19;
1103   break;
1104   case 9:return 23;
1105   break;
1106   case 10:return 22;
1107   break;
1108   case 11:this.popState(); this.begin('com');
1109   break;
1110   case 12:strip(3,5); this.popState(); return 15;
1111   break;
1112   case 13:return 22;
1113   break;
1114   case 14:return 39;
1115   break;
1116   case 15:return 38;
1117   break;
1118   case 16:return 38;
1119   break;
1120   case 17:return 42;
1121   break;
1122   case 18:/*ignore whitespace*/
1123   break;
1124   case 19:this.popState(); return 24;
1125   break;
1126   case 20:this.popState(); return 18;
1127   break;
1128   case 21:yy_.yytext = strip(1,2).replace(/\\"/g,'"'); return 32;
1129   break;
1130   case 22:yy_.yytext = strip(1,2).replace(/\\'/g,"'"); return 32;
1131   break;
1132   case 23:return 40;
1133   break;
1134   case 24:return 34;
1135   break;
1136   case 25:return 34;
1137   break;
1138   case 26:return 33;
1139   break;
1140   case 27:return 38;
1141   break;
1142   case 28:yy_.yytext = strip(1,2); return 38;
1143   break;
1144   case 29:return 'INVALID';
1145   break;
1146   case 30:return 5;
1147   break;
1148   }
1149   };
1150   lexer.rules = [/^(?:[^\x00]*?(?=(\{\{)))/,/^(?:[^\x00]+)/,/^(?:[^\x00]{2,}?(?=(\{\{|$)))/,/^(?:[\s\S]*?--\}\})/,/^(?:\{\{(~)?>)/,/^(?:\{\{(~)?#)/,/^(?:\{\{(~)?\/)/,/^(?:\{\{(~)?\^)/,/^(?:\{\{(~)?\s*else\b)/,/^(?:\{\{(~)?\{)/,/^(?:\{\{(~)?&)/,/^(?:\{\{!--)/,/^(?:\{\{![\s\S]*?\}\})/,/^(?:\{\{(~)?)/,/^(?:=)/,/^(?:\.\.)/,/^(?:\.(?=([=~}\s\/.])))/,/^(?:[\/.])/,/^(?:\s+)/,/^(?:\}(~)?\}\})/,/^(?:(~)?\}\})/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:@)/,/^(?:true(?=([~}\s])))/,/^(?:false(?=([~}\s])))/,/^(?:-?[0-9]+(?=([~}\s])))/,/^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.]))))/,/^(?:\[[^\]]*\])/,/^(?:.)/,/^(?:$)/];
1151   lexer.conditions = {"mu":{"rules":[4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30],"inclusive":false},"emu":{"rules":[2],"inclusive":false},"com":{"rules":[3],"inclusive":false},"INITIAL":{"rules":[0,1,30],"inclusive":true}};
1152   return lexer;})()
1153   parser.lexer = lexer;
1154   function Parser () { this.yy = {}; }Parser.prototype = parser;parser.Parser = Parser;
1155   return new Parser;
1156   })();__exports__ = handlebars;
1157   return __exports__;
1158 })();
1159
1160 // handlebars/compiler/base.js
1161 var __module8__ = (function(__dependency1__, __dependency2__) {
1162   "use strict";
1163   var __exports__ = {};
1164   var parser = __dependency1__;
1165   var AST = __dependency2__;
1166
1167   __exports__.parser = parser;
1168
1169   function parse(input) {
1170     // Just return if an already-compile AST was passed in.
1171     if(input.constructor === AST.ProgramNode) { return input; }
1172
1173     parser.yy = AST;
1174     return parser.parse(input);
1175   }
1176
1177   __exports__.parse = parse;
1178   return __exports__;
1179 })(__module9__, __module7__);
1180
1181 // handlebars/compiler/javascript-compiler.js
1182 var __module11__ = (function(__dependency1__) {
1183   "use strict";
1184   var __exports__;
1185   var COMPILER_REVISION = __dependency1__.COMPILER_REVISION;
1186   var REVISION_CHANGES = __dependency1__.REVISION_CHANGES;
1187   var log = __dependency1__.log;
1188
1189   function Literal(value) {
1190     this.value = value;
1191   }
1192
1193   function JavaScriptCompiler() {}
1194
1195   JavaScriptCompiler.prototype = {
1196     // PUBLIC API: You can override these methods in a subclass to provide
1197     // alternative compiled forms for name lookup and buffering semantics
1198     nameLookup: function(parent, name /* , type*/) {
1199       var wrap,
1200           ret;
1201       if (parent.indexOf('depth') === 0) {
1202         wrap = true;
1203       }
1204
1205       if (/^[0-9]+$/.test(name)) {
1206         ret = parent + "[" + name + "]";
1207       } else if (JavaScriptCompiler.isValidJavaScriptVariableName(name)) {
1208         ret = parent + "." + name;
1209       }
1210       else {
1211         ret = parent + "['" + name + "']";
1212       }
1213
1214       if (wrap) {
1215         return '(' + parent + ' && ' + ret + ')';
1216       } else {
1217         return ret;
1218       }
1219     },
1220
1221     appendToBuffer: function(string) {
1222       if (this.environment.isSimple) {
1223         return "return " + string + ";";
1224       } else {
1225         return {
1226           appendToBuffer: true,
1227           content: string,
1228           toString: function() { return "buffer += " + string + ";"; }
1229         };
1230       }
1231     },
1232
1233     initializeBuffer: function() {
1234       return this.quotedString("");
1235     },
1236
1237     namespace: "Handlebars",
1238     // END PUBLIC API
1239
1240     compile: function(environment, options, context, asObject) {
1241       this.environment = environment;
1242       this.options = options || {};
1243
1244       log('debug', this.environment.disassemble() + "\n\n");
1245
1246       this.name = this.environment.name;
1247       this.isChild = !!context;
1248       this.context = context || {
1249         programs: [],
1250         environments: [],
1251         aliases: { }
1252       };
1253
1254       this.preamble();
1255
1256       this.stackSlot = 0;
1257       this.stackVars = [];
1258       this.registers = { list: [] };
1259       this.compileStack = [];
1260       this.inlineStack = [];
1261
1262       this.compileChildren(environment, options);
1263
1264       var opcodes = environment.opcodes, opcode;
1265
1266       this.i = 0;
1267
1268       for(var l=opcodes.length; this.i<l; this.i++) {
1269         opcode = opcodes[this.i];
1270
1271         if(opcode.opcode === 'DECLARE') {
1272           this[opcode.name] = opcode.value;
1273         } else {
1274           this[opcode.opcode].apply(this, opcode.args);
1275         }
1276
1277         // Reset the stripNext flag if it was not set by this operation.
1278         if (opcode.opcode !== this.stripNext) {
1279           this.stripNext = false;
1280         }
1281       }
1282
1283       // Flush any trailing content that might be pending.
1284       this.pushSource('');
1285
1286       return this.createFunctionContext(asObject);
1287     },
1288
1289     preamble: function() {
1290       var out = [];
1291
1292       if (!this.isChild) {
1293         var namespace = this.namespace;
1294
1295         var copies = "helpers = this.merge(helpers, " + namespace + ".helpers);";
1296         if (this.environment.usePartial) { copies = copies + " partials = this.merge(partials, " + namespace + ".partials);"; }
1297         if (this.options.data) { copies = copies + " data = data || {};"; }
1298         out.push(copies);
1299       } else {
1300         out.push('');
1301       }
1302
1303       if (!this.environment.isSimple) {
1304         out.push(", buffer = " + this.initializeBuffer());
1305       } else {
1306         out.push("");
1307       }
1308
1309       // track the last context pushed into place to allow skipping the
1310       // getContext opcode when it would be a noop
1311       this.lastContext = 0;
1312       this.source = out;
1313     },
1314
1315     createFunctionContext: function(asObject) {
1316       var locals = this.stackVars.concat(this.registers.list);
1317
1318       if(locals.length > 0) {
1319         this.source[1] = this.source[1] + ", " + locals.join(", ");
1320       }
1321
1322       // Generate minimizer alias mappings
1323       if (!this.isChild) {
1324         for (var alias in this.context.aliases) {
1325           if (this.context.aliases.hasOwnProperty(alias)) {
1326             this.source[1] = this.source[1] + ', ' + alias + '=' + this.context.aliases[alias];
1327           }
1328         }
1329       }
1330
1331       if (this.source[1]) {
1332         this.source[1] = "var " + this.source[1].substring(2) + ";";
1333       }
1334
1335       // Merge children
1336       if (!this.isChild) {
1337         this.source[1] += '\n' + this.context.programs.join('\n') + '\n';
1338       }
1339
1340       if (!this.environment.isSimple) {
1341         this.pushSource("return buffer;");
1342       }
1343
1344       var params = this.isChild ? ["depth0", "data"] : ["Handlebars", "depth0", "helpers", "partials", "data"];
1345
1346       for(var i=0, l=this.environment.depths.list.length; i<l; i++) {
1347         params.push("depth" + this.environment.depths.list[i]);
1348       }
1349
1350       // Perform a second pass over the output to merge content when possible
1351       var source = this.mergeSource();
1352
1353       if (!this.isChild) {
1354         var revision = COMPILER_REVISION,
1355             versions = REVISION_CHANGES[revision];
1356         source = "this.compilerInfo = ["+revision+",'"+versions+"'];\n"+source;
1357       }
1358
1359       if (asObject) {
1360         params.push(source);
1361
1362         return Function.apply(this, params);
1363       } else {
1364         var functionSource = 'function ' + (this.name || '') + '(' + params.join(',') + ') {\n  ' + source + '}';
1365         log('debug', functionSource + "\n\n");
1366         return functionSource;
1367       }
1368     },
1369     mergeSource: function() {
1370       // WARN: We are not handling the case where buffer is still populated as the source should
1371       // not have buffer append operations as their final action.
1372       var source = '',
1373           buffer;
1374       for (var i = 0, len = this.source.length; i < len; i++) {
1375         var line = this.source[i];
1376         if (line.appendToBuffer) {
1377           if (buffer) {
1378             buffer = buffer + '\n    + ' + line.content;
1379           } else {
1380             buffer = line.content;
1381           }
1382         } else {
1383           if (buffer) {
1384             source += 'buffer += ' + buffer + ';\n  ';
1385             buffer = undefined;
1386           }
1387           source += line + '\n  ';
1388         }
1389       }
1390       return source;
1391     },
1392
1393     // [blockValue]
1394     //
1395     // On stack, before: hash, inverse, program, value
1396     // On stack, after: return value of blockHelperMissing
1397     //
1398     // The purpose of this opcode is to take a block of the form
1399     // `{{#foo}}...{{/foo}}`, resolve the value of `foo`, and
1400     // replace it on the stack with the result of properly
1401     // invoking blockHelperMissing.
1402     blockValue: function() {
1403       this.context.aliases.blockHelperMissing = 'helpers.blockHelperMissing';
1404
1405       var params = ["depth0"];
1406       this.setupParams(0, params);
1407
1408       this.replaceStack(function(current) {
1409         params.splice(1, 0, current);
1410         return "blockHelperMissing.call(" + params.join(", ") + ")";
1411       });
1412     },
1413
1414     // [ambiguousBlockValue]
1415     //
1416     // On stack, before: hash, inverse, program, value
1417     // Compiler value, before: lastHelper=value of last found helper, if any
1418     // On stack, after, if no lastHelper: same as [blockValue]
1419     // On stack, after, if lastHelper: value
1420     ambiguousBlockValue: function() {
1421       this.context.aliases.blockHelperMissing = 'helpers.blockHelperMissing';
1422
1423       var params = ["depth0"];
1424       this.setupParams(0, params);
1425
1426       var current = this.topStack();
1427       params.splice(1, 0, current);
1428
1429       // Use the options value generated from the invocation
1430       params[params.length-1] = 'options';
1431
1432       this.pushSource("if (!" + this.lastHelper + ") { " + current + " = blockHelperMissing.call(" + params.join(", ") + "); }");
1433     },
1434
1435     // [appendContent]
1436     //
1437     // On stack, before: ...
1438     // On stack, after: ...
1439     //
1440     // Appends the string value of `content` to the current buffer
1441     appendContent: function(content) {
1442       if (this.pendingContent) {
1443         content = this.pendingContent + content;
1444       }
1445       if (this.stripNext) {
1446         content = content.replace(/^\s+/, '');
1447       }
1448
1449       this.pendingContent = content;
1450     },
1451
1452     // [strip]
1453     //
1454     // On stack, before: ...
1455     // On stack, after: ...
1456     //
1457     // Removes any trailing whitespace from the prior content node and flags
1458     // the next operation for stripping if it is a content node.
1459     strip: function() {
1460       if (this.pendingContent) {
1461         this.pendingContent = this.pendingContent.replace(/\s+$/, '');
1462       }
1463       this.stripNext = 'strip';
1464     },
1465
1466     // [append]
1467     //
1468     // On stack, before: value, ...
1469     // On stack, after: ...
1470     //
1471     // Coerces `value` to a String and appends it to the current buffer.
1472     //
1473     // If `value` is truthy, or 0, it is coerced into a string and appended
1474     // Otherwise, the empty string is appended
1475     append: function() {
1476       // Force anything that is inlined onto the stack so we don't have duplication
1477       // when we examine local
1478       this.flushInline();
1479       var local = this.popStack();
1480       this.pushSource("if(" + local + " || " + local + " === 0) { " + this.appendToBuffer(local) + " }");
1481       if (this.environment.isSimple) {
1482         this.pushSource("else { " + this.appendToBuffer("''") + " }");
1483       }
1484     },
1485
1486     // [appendEscaped]
1487     //
1488     // On stack, before: value, ...
1489     // On stack, after: ...
1490     //
1491     // Escape `value` and append it to the buffer
1492     appendEscaped: function() {
1493       this.context.aliases.escapeExpression = 'this.escapeExpression';
1494
1495       this.pushSource(this.appendToBuffer("escapeExpression(" + this.popStack() + ")"));
1496     },
1497
1498     // [getContext]
1499     //
1500     // On stack, before: ...
1501     // On stack, after: ...
1502     // Compiler value, after: lastContext=depth
1503     //
1504     // Set the value of the `lastContext` compiler value to the depth
1505     getContext: function(depth) {
1506       if(this.lastContext !== depth) {
1507         this.lastContext = depth;
1508       }
1509     },
1510
1511     // [lookupOnContext]
1512     //
1513     // On stack, before: ...
1514     // On stack, after: currentContext[name], ...
1515     //
1516     // Looks up the value of `name` on the current context and pushes
1517     // it onto the stack.
1518     lookupOnContext: function(name) {
1519       this.push(this.nameLookup('depth' + this.lastContext, name, 'context'));
1520     },
1521
1522     // [pushContext]
1523     //
1524     // On stack, before: ...
1525     // On stack, after: currentContext, ...
1526     //
1527     // Pushes the value of the current context onto the stack.
1528     pushContext: function() {
1529       this.pushStackLiteral('depth' + this.lastContext);
1530     },
1531
1532     // [resolvePossibleLambda]
1533     //
1534     // On stack, before: value, ...
1535     // On stack, after: resolved value, ...
1536     //
1537     // If the `value` is a lambda, replace it on the stack by
1538     // the return value of the lambda
1539     resolvePossibleLambda: function() {
1540       this.context.aliases.functionType = '"function"';
1541
1542       this.replaceStack(function(current) {
1543         return "typeof " + current + " === functionType ? " + current + ".apply(depth0) : " + current;
1544       });
1545     },
1546
1547     // [lookup]
1548     //
1549     // On stack, before: value, ...
1550     // On stack, after: value[name], ...
1551     //
1552     // Replace the value on the stack with the result of looking
1553     // up `name` on `value`
1554     lookup: function(name) {
1555       this.replaceStack(function(current) {
1556         return current + " == null || " + current + " === false ? " + current + " : " + this.nameLookup(current, name, 'context');
1557       });
1558     },
1559
1560     // [lookupData]
1561     //
1562     // On stack, before: ...
1563     // On stack, after: data, ...
1564     //
1565     // Push the data lookup operator
1566     lookupData: function() {
1567       this.push('data');
1568     },
1569
1570     // [pushStringParam]
1571     //
1572     // On stack, before: ...
1573     // On stack, after: string, currentContext, ...
1574     //
1575     // This opcode is designed for use in string mode, which
1576     // provides the string value of a parameter along with its
1577     // depth rather than resolving it immediately.
1578     pushStringParam: function(string, type) {
1579       this.pushStackLiteral('depth' + this.lastContext);
1580
1581       this.pushString(type);
1582
1583       if (typeof string === 'string') {
1584         this.pushString(string);
1585       } else {
1586         this.pushStackLiteral(string);
1587       }
1588     },
1589
1590     emptyHash: function() {
1591       this.pushStackLiteral('{}');
1592
1593       if (this.options.stringParams) {
1594         this.register('hashTypes', '{}');
1595         this.register('hashContexts', '{}');
1596       }
1597     },
1598     pushHash: function() {
1599       this.hash = {values: [], types: [], contexts: []};
1600     },
1601     popHash: function() {
1602       var hash = this.hash;
1603       this.hash = undefined;
1604
1605       if (this.options.stringParams) {
1606         this.register('hashContexts', '{' + hash.contexts.join(',') + '}');
1607         this.register('hashTypes', '{' + hash.types.join(',') + '}');
1608       }
1609       this.push('{\n    ' + hash.values.join(',\n    ') + '\n  }');
1610     },
1611
1612     // [pushString]
1613     //
1614     // On stack, before: ...
1615     // On stack, after: quotedString(string), ...
1616     //
1617     // Push a quoted version of `string` onto the stack
1618     pushString: function(string) {
1619       this.pushStackLiteral(this.quotedString(string));
1620     },
1621
1622     // [push]
1623     //
1624     // On stack, before: ...
1625     // On stack, after: expr, ...
1626     //
1627     // Push an expression onto the stack
1628     push: function(expr) {
1629       this.inlineStack.push(expr);
1630       return expr;
1631     },
1632
1633     // [pushLiteral]
1634     //
1635     // On stack, before: ...
1636     // On stack, after: value, ...
1637     //
1638     // Pushes a value onto the stack. This operation prevents
1639     // the compiler from creating a temporary variable to hold
1640     // it.
1641     pushLiteral: function(value) {
1642       this.pushStackLiteral(value);
1643     },
1644
1645     // [pushProgram]
1646     //
1647     // On stack, before: ...
1648     // On stack, after: program(guid), ...
1649     //
1650     // Push a program expression onto the stack. This takes
1651     // a compile-time guid and converts it into a runtime-accessible
1652     // expression.
1653     pushProgram: function(guid) {
1654       if (guid != null) {
1655         this.pushStackLiteral(this.programExpression(guid));
1656       } else {
1657         this.pushStackLiteral(null);
1658       }
1659     },
1660
1661     // [invokeHelper]
1662     //
1663     // On stack, before: hash, inverse, program, params..., ...
1664     // On stack, after: result of helper invocation
1665     //
1666     // Pops off the helper's parameters, invokes the helper,
1667     // and pushes the helper's return value onto the stack.
1668     //
1669     // If the helper is not found, `helperMissing` is called.
1670     invokeHelper: function(paramSize, name) {
1671       this.context.aliases.helperMissing = 'helpers.helperMissing';
1672
1673       var helper = this.lastHelper = this.setupHelper(paramSize, name, true);
1674       var nonHelper = this.nameLookup('depth' + this.lastContext, name, 'context');
1675
1676       this.push(helper.name + ' || ' + nonHelper);
1677       this.replaceStack(function(name) {
1678         return name + ' ? ' + name + '.call(' +
1679             helper.callParams + ") " + ": helperMissing.call(" +
1680             helper.helperMissingParams + ")";
1681       });
1682     },
1683
1684     // [invokeKnownHelper]
1685     //
1686     // On stack, before: hash, inverse, program, params..., ...
1687     // On stack, after: result of helper invocation
1688     //
1689     // This operation is used when the helper is known to exist,
1690     // so a `helperMissing` fallback is not required.
1691     invokeKnownHelper: function(paramSize, name) {
1692       var helper = this.setupHelper(paramSize, name);
1693       this.push(helper.name + ".call(" + helper.callParams + ")");
1694     },
1695
1696     // [invokeAmbiguous]
1697     //
1698     // On stack, before: hash, inverse, program, params..., ...
1699     // On stack, after: result of disambiguation
1700     //
1701     // This operation is used when an expression like `{{foo}}`
1702     // is provided, but we don't know at compile-time whether it
1703     // is a helper or a path.
1704     //
1705     // This operation emits more code than the other options,
1706     // and can be avoided by passing the `knownHelpers` and
1707     // `knownHelpersOnly` flags at compile-time.
1708     invokeAmbiguous: function(name, helperCall) {
1709       this.context.aliases.functionType = '"function"';
1710
1711       this.pushStackLiteral('{}');    // Hash value
1712       var helper = this.setupHelper(0, name, helperCall);
1713
1714       var helperName = this.lastHelper = this.nameLookup('helpers', name, 'helper');
1715
1716       var nonHelper = this.nameLookup('depth' + this.lastContext, name, 'context');
1717       var nextStack = this.nextStack();
1718
1719       this.pushSource('if (' + nextStack + ' = ' + helperName + ') { ' + nextStack + ' = ' + nextStack + '.call(' + helper.callParams + '); }');
1720       this.pushSource('else { ' + nextStack + ' = ' + nonHelper + '; ' + nextStack + ' = typeof ' + nextStack + ' === functionType ? ' + nextStack + '.call(' + helper.callParams + ') : ' + nextStack + '; }');
1721     },
1722
1723     // [invokePartial]
1724     //
1725     // On stack, before: context, ...
1726     // On stack after: result of partial invocation
1727     //
1728     // This operation pops off a context, invokes a partial with that context,
1729     // and pushes the result of the invocation back.
1730     invokePartial: function(name) {
1731       var params = [this.nameLookup('partials', name, 'partial'), "'" + name + "'", this.popStack(), "helpers", "partials"];
1732
1733       if (this.options.data) {
1734         params.push("data");
1735       }
1736
1737       this.context.aliases.self = "this";
1738       this.push("self.invokePartial(" + params.join(", ") + ")");
1739     },
1740
1741     // [assignToHash]
1742     //
1743     // On stack, before: value, hash, ...
1744     // On stack, after: hash, ...
1745     //
1746     // Pops a value and hash off the stack, assigns `hash[key] = value`
1747     // and pushes the hash back onto the stack.
1748     assignToHash: function(key) {
1749       var value = this.popStack(),
1750           context,
1751           type;
1752
1753       if (this.options.stringParams) {
1754         type = this.popStack();
1755         context = this.popStack();
1756       }
1757
1758       var hash = this.hash;
1759       if (context) {
1760         hash.contexts.push("'" + key + "': " + context);
1761       }
1762       if (type) {
1763         hash.types.push("'" + key + "': " + type);
1764       }
1765       hash.values.push("'" + key + "': (" + value + ")");
1766     },
1767
1768     // HELPERS
1769
1770     compiler: JavaScriptCompiler,
1771
1772     compileChildren: function(environment, options) {
1773       var children = environment.children, child, compiler;
1774
1775       for(var i=0, l=children.length; i<l; i++) {
1776         child = children[i];
1777         compiler = new this.compiler();
1778
1779         var index = this.matchExistingProgram(child);
1780
1781         if (index == null) {
1782           this.context.programs.push('');     // Placeholder to prevent name conflicts for nested children
1783           index = this.context.programs.length;
1784           child.index = index;
1785           child.name = 'program' + index;
1786           this.context.programs[index] = compiler.compile(child, options, this.context);
1787           this.context.environments[index] = child;
1788         } else {
1789           child.index = index;
1790           child.name = 'program' + index;
1791         }
1792       }
1793     },
1794     matchExistingProgram: function(child) {
1795       for (var i = 0, len = this.context.environments.length; i < len; i++) {
1796         var environment = this.context.environments[i];
1797         if (environment && environment.equals(child)) {
1798           return i;
1799         }
1800       }
1801     },
1802
1803     programExpression: function(guid) {
1804       this.context.aliases.self = "this";
1805
1806       if(guid == null) {
1807         return "self.noop";
1808       }
1809
1810       var child = this.environment.children[guid],
1811           depths = child.depths.list, depth;
1812
1813       var programParams = [child.index, child.name, "data"];
1814
1815       for(var i=0, l = depths.length; i<l; i++) {
1816         depth = depths[i];
1817
1818         if(depth === 1) { programParams.push("depth0"); }
1819         else { programParams.push("depth" + (depth - 1)); }
1820       }
1821
1822       return (depths.length === 0 ? "self.program(" : "self.programWithDepth(") + programParams.join(", ") + ")";
1823     },
1824
1825     register: function(name, val) {
1826       this.useRegister(name);
1827       this.pushSource(name + " = " + val + ";");
1828     },
1829
1830     useRegister: function(name) {
1831       if(!this.registers[name]) {
1832         this.registers[name] = true;
1833         this.registers.list.push(name);
1834       }
1835     },
1836
1837     pushStackLiteral: function(item) {
1838       return this.push(new Literal(item));
1839     },
1840
1841     pushSource: function(source) {
1842       if (this.pendingContent) {
1843         this.source.push(this.appendToBuffer(this.quotedString(this.pendingContent)));
1844         this.pendingContent = undefined;
1845       }
1846
1847       if (source) {
1848         this.source.push(source);
1849       }
1850     },
1851
1852     pushStack: function(item) {
1853       this.flushInline();
1854
1855       var stack = this.incrStack();
1856       if (item) {
1857         this.pushSource(stack + " = " + item + ";");
1858       }
1859       this.compileStack.push(stack);
1860       return stack;
1861     },
1862
1863     replaceStack: function(callback) {
1864       var prefix = '',
1865           inline = this.isInline(),
1866           stack;
1867
1868       // If we are currently inline then we want to merge the inline statement into the
1869       // replacement statement via ','
1870       if (inline) {
1871         var top = this.popStack(true);
1872
1873         if (top instanceof Literal) {
1874           // Literals do not need to be inlined
1875           stack = top.value;
1876         } else {
1877           // Get or create the current stack name for use by the inline
1878           var name = this.stackSlot ? this.topStackName() : this.incrStack();
1879
1880           prefix = '(' + this.push(name) + ' = ' + top + '),';
1881           stack = this.topStack();
1882         }
1883       } else {
1884         stack = this.topStack();
1885       }
1886
1887       var item = callback.call(this, stack);
1888
1889       if (inline) {
1890         if (this.inlineStack.length || this.compileStack.length) {
1891           this.popStack();
1892         }
1893         this.push('(' + prefix + item + ')');
1894       } else {
1895         // Prevent modification of the context depth variable. Through replaceStack
1896         if (!/^stack/.test(stack)) {
1897           stack = this.nextStack();
1898         }
1899
1900         this.pushSource(stack + " = (" + prefix + item + ");");
1901       }
1902       return stack;
1903     },
1904
1905     nextStack: function() {
1906       return this.pushStack();
1907     },
1908
1909     incrStack: function() {
1910       this.stackSlot++;
1911       if(this.stackSlot > this.stackVars.length) { this.stackVars.push("stack" + this.stackSlot); }
1912       return this.topStackName();
1913     },
1914     topStackName: function() {
1915       return "stack" + this.stackSlot;
1916     },
1917     flushInline: function() {
1918       var inlineStack = this.inlineStack;
1919       if (inlineStack.length) {
1920         this.inlineStack = [];
1921         for (var i = 0, len = inlineStack.length; i < len; i++) {
1922           var entry = inlineStack[i];
1923           if (entry instanceof Literal) {
1924             this.compileStack.push(entry);
1925           } else {
1926             this.pushStack(entry);
1927           }
1928         }
1929       }
1930     },
1931     isInline: function() {
1932       return this.inlineStack.length;
1933     },
1934
1935     popStack: function(wrapped) {
1936       var inline = this.isInline(),
1937           item = (inline ? this.inlineStack : this.compileStack).pop();
1938
1939       if (!wrapped && (item instanceof Literal)) {
1940         return item.value;
1941       } else {
1942         if (!inline) {
1943           this.stackSlot--;
1944         }
1945         return item;
1946       }
1947     },
1948
1949     topStack: function(wrapped) {
1950       var stack = (this.isInline() ? this.inlineStack : this.compileStack),
1951           item = stack[stack.length - 1];
1952
1953       if (!wrapped && (item instanceof Literal)) {
1954         return item.value;
1955       } else {
1956         return item;
1957       }
1958     },
1959
1960     quotedString: function(str) {
1961       return '"' + str
1962         .replace(/\\/g, '\\\\')
1963         .replace(/"/g, '\\"')
1964         .replace(/\n/g, '\\n')
1965         .replace(/\r/g, '\\r')
1966         .replace(/\u2028/g, '\\u2028')   // Per Ecma-262 7.3 + 7.8.4
1967         .replace(/\u2029/g, '\\u2029') + '"';
1968     },
1969
1970     setupHelper: function(paramSize, name, missingParams) {
1971       var params = [];
1972       this.setupParams(paramSize, params, missingParams);
1973       var foundHelper = this.nameLookup('helpers', name, 'helper');
1974
1975       return {
1976         params: params,
1977         name: foundHelper,
1978         callParams: ["depth0"].concat(params).join(", "),
1979         helperMissingParams: missingParams && ["depth0", this.quotedString(name)].concat(params).join(", ")
1980       };
1981     },
1982
1983     // the params and contexts arguments are passed in arrays
1984     // to fill in
1985     setupParams: function(paramSize, params, useRegister) {
1986       var options = [], contexts = [], types = [], param, inverse, program;
1987
1988       options.push("hash:" + this.popStack());
1989
1990       inverse = this.popStack();
1991       program = this.popStack();
1992
1993       // Avoid setting fn and inverse if neither are set. This allows
1994       // helpers to do a check for `if (options.fn)`
1995       if (program || inverse) {
1996         if (!program) {
1997           this.context.aliases.self = "this";
1998           program = "self.noop";
1999         }
2000
2001         if (!inverse) {
2002          this.context.aliases.self = "this";
2003           inverse = "self.noop";
2004         }
2005
2006         options.push("inverse:" + inverse);
2007         options.push("fn:" + program);
2008       }
2009
2010       for(var i=0; i<paramSize; i++) {
2011         param = this.popStack();
2012         params.push(param);
2013
2014         if(this.options.stringParams) {
2015           types.push(this.popStack());
2016           contexts.push(this.popStack());
2017         }
2018       }
2019
2020       if (this.options.stringParams) {
2021         options.push("contexts:[" + contexts.join(",") + "]");
2022         options.push("types:[" + types.join(",") + "]");
2023         options.push("hashContexts:hashContexts");
2024         options.push("hashTypes:hashTypes");
2025       }
2026
2027       if(this.options.data) {
2028         options.push("data:data");
2029       }
2030
2031       options = "{" + options.join(",") + "}";
2032       if (useRegister) {
2033         this.register('options', options);
2034         params.push('options');
2035       } else {
2036         params.push(options);
2037       }
2038       return params.join(", ");
2039     }
2040   };
2041
2042   var reservedWords = (
2043     "break else new var" +
2044     " case finally return void" +
2045     " catch for switch while" +
2046     " continue function this with" +
2047     " default if throw" +
2048     " delete in try" +
2049     " do instanceof typeof" +
2050     " abstract enum int short" +
2051     " boolean export interface static" +
2052     " byte extends long super" +
2053     " char final native synchronized" +
2054     " class float package throws" +
2055     " const goto private transient" +
2056     " debugger implements protected volatile" +
2057     " double import public let yield"
2058   ).split(" ");
2059
2060   var compilerWords = JavaScriptCompiler.RESERVED_WORDS = {};
2061
2062   for(var i=0, l=reservedWords.length; i<l; i++) {
2063     compilerWords[reservedWords[i]] = true;
2064   }
2065
2066   JavaScriptCompiler.isValidJavaScriptVariableName = function(name) {
2067     if(!JavaScriptCompiler.RESERVED_WORDS[name] && /^[a-zA-Z_$][0-9a-zA-Z_$]+$/.test(name)) {
2068       return true;
2069     }
2070     return false;
2071   };
2072
2073   __exports__ = JavaScriptCompiler;
2074   return __exports__;
2075 })(__module2__);
2076
2077 // handlebars/compiler/compiler.js
2078 var __module10__ = (function(__dependency1__, __dependency2__, __dependency3__, __dependency4__) {
2079   "use strict";
2080   var __exports__ = {};
2081   var Exception = __dependency1__;
2082   var parse = __dependency2__.parse;
2083   var JavaScriptCompiler = __dependency3__;
2084   var AST = __dependency4__;
2085
2086   function Compiler() {}
2087
2088   __exports__.Compiler = Compiler;// the foundHelper register will disambiguate helper lookup from finding a
2089   // function in a context. This is necessary for mustache compatibility, which
2090   // requires that context functions in blocks are evaluated by blockHelperMissing,
2091   // and then proceed as if the resulting value was provided to blockHelperMissing.
2092
2093   Compiler.prototype = {
2094     compiler: Compiler,
2095
2096     disassemble: function() {
2097       var opcodes = this.opcodes, opcode, out = [], params, param;
2098
2099       for (var i=0, l=opcodes.length; i<l; i++) {
2100         opcode = opcodes[i];
2101
2102         if (opcode.opcode === 'DECLARE') {
2103           out.push("DECLARE " + opcode.name + "=" + opcode.value);
2104         } else {
2105           params = [];
2106           for (var j=0; j<opcode.args.length; j++) {
2107             param = opcode.args[j];
2108             if (typeof param === "string") {
2109               param = "\"" + param.replace("\n", "\\n") + "\"";
2110             }
2111             params.push(param);
2112           }
2113           out.push(opcode.opcode + " " + params.join(" "));
2114         }
2115       }
2116
2117       return out.join("\n");
2118     },
2119
2120     equals: function(other) {
2121       var len = this.opcodes.length;
2122       if (other.opcodes.length !== len) {
2123         return false;
2124       }
2125
2126       for (var i = 0; i < len; i++) {
2127         var opcode = this.opcodes[i],
2128             otherOpcode = other.opcodes[i];
2129         if (opcode.opcode !== otherOpcode.opcode || opcode.args.length !== otherOpcode.args.length) {
2130           return false;
2131         }
2132         for (var j = 0; j < opcode.args.length; j++) {
2133           if (opcode.args[j] !== otherOpcode.args[j]) {
2134             return false;
2135           }
2136         }
2137       }
2138
2139       len = this.children.length;
2140       if (other.children.length !== len) {
2141         return false;
2142       }
2143       for (i = 0; i < len; i++) {
2144         if (!this.children[i].equals(other.children[i])) {
2145           return false;
2146         }
2147       }
2148
2149       return true;
2150     },
2151
2152     guid: 0,
2153
2154     compile: function(program, options) {
2155       this.opcodes = [];
2156       this.children = [];
2157       this.depths = {list: []};
2158       this.options = options;
2159
2160       // These changes will propagate to the other compiler components
2161       var knownHelpers = this.options.knownHelpers;
2162       this.options.knownHelpers = {
2163         'helperMissing': true,
2164         'blockHelperMissing': true,
2165         'each': true,
2166         'if': true,
2167         'unless': true,
2168         'with': true,
2169         'log': true
2170       };
2171       if (knownHelpers) {
2172         for (var name in knownHelpers) {
2173           this.options.knownHelpers[name] = knownHelpers[name];
2174         }
2175       }
2176
2177       return this.accept(program);
2178     },
2179
2180     accept: function(node) {
2181       var strip = node.strip || {},
2182           ret;
2183       if (strip.left) {
2184         this.opcode('strip');
2185       }
2186
2187       ret = this[node.type](node);
2188
2189       if (strip.right) {
2190         this.opcode('strip');
2191       }
2192
2193       return ret;
2194     },
2195
2196     program: function(program) {
2197       var statements = program.statements;
2198
2199       for(var i=0, l=statements.length; i<l; i++) {
2200         this.accept(statements[i]);
2201       }
2202       this.isSimple = l === 1;
2203
2204       this.depths.list = this.depths.list.sort(function(a, b) {
2205         return a - b;
2206       });
2207
2208       return this;
2209     },
2210
2211     compileProgram: function(program) {
2212       var result = new this.compiler().compile(program, this.options);
2213       var guid = this.guid++, depth;
2214
2215       this.usePartial = this.usePartial || result.usePartial;
2216
2217       this.children[guid] = result;
2218
2219       for(var i=0, l=result.depths.list.length; i<l; i++) {
2220         depth = result.depths.list[i];
2221
2222         if(depth < 2) { continue; }
2223         else { this.addDepth(depth - 1); }
2224       }
2225
2226       return guid;
2227     },
2228
2229     block: function(block) {
2230       var mustache = block.mustache,
2231           program = block.program,
2232           inverse = block.inverse;
2233
2234       if (program) {
2235         program = this.compileProgram(program);
2236       }
2237
2238       if (inverse) {
2239         inverse = this.compileProgram(inverse);
2240       }
2241
2242       var type = this.classifyMustache(mustache);
2243
2244       if (type === "helper") {
2245         this.helperMustache(mustache, program, inverse);
2246       } else if (type === "simple") {
2247         this.simpleMustache(mustache);
2248
2249         // now that the simple mustache is resolved, we need to
2250         // evaluate it by executing `blockHelperMissing`
2251         this.opcode('pushProgram', program);
2252         this.opcode('pushProgram', inverse);
2253         this.opcode('emptyHash');
2254         this.opcode('blockValue');
2255       } else {
2256         this.ambiguousMustache(mustache, program, inverse);
2257
2258         // now that the simple mustache is resolved, we need to
2259         // evaluate it by executing `blockHelperMissing`
2260         this.opcode('pushProgram', program);
2261         this.opcode('pushProgram', inverse);
2262         this.opcode('emptyHash');
2263         this.opcode('ambiguousBlockValue');
2264       }
2265
2266       this.opcode('append');
2267     },
2268
2269     hash: function(hash) {
2270       var pairs = hash.pairs, pair, val;
2271
2272       this.opcode('pushHash');
2273
2274       for(var i=0, l=pairs.length; i<l; i++) {
2275         pair = pairs[i];
2276         val  = pair[1];
2277
2278         if (this.options.stringParams) {
2279           if(val.depth) {
2280             this.addDepth(val.depth);
2281           }
2282           this.opcode('getContext', val.depth || 0);
2283           this.opcode('pushStringParam', val.stringModeValue, val.type);
2284         } else {
2285           this.accept(val);
2286         }
2287
2288         this.opcode('assignToHash', pair[0]);
2289       }
2290       this.opcode('popHash');
2291     },
2292
2293     partial: function(partial) {
2294       var partialName = partial.partialName;
2295       this.usePartial = true;
2296
2297       if(partial.context) {
2298         this.ID(partial.context);
2299       } else {
2300         this.opcode('push', 'depth0');
2301       }
2302
2303       this.opcode('invokePartial', partialName.name);
2304       this.opcode('append');
2305     },
2306
2307     content: function(content) {
2308       this.opcode('appendContent', content.string);
2309     },
2310
2311     mustache: function(mustache) {
2312       var options = this.options;
2313       var type = this.classifyMustache(mustache);
2314
2315       if (type === "simple") {
2316         this.simpleMustache(mustache);
2317       } else if (type === "helper") {
2318         this.helperMustache(mustache);
2319       } else {
2320         this.ambiguousMustache(mustache);
2321       }
2322
2323       if(mustache.escaped && !options.noEscape) {
2324         this.opcode('appendEscaped');
2325       } else {
2326         this.opcode('append');
2327       }
2328     },
2329
2330     ambiguousMustache: function(mustache, program, inverse) {
2331       var id = mustache.id,
2332           name = id.parts[0],
2333           isBlock = program != null || inverse != null;
2334
2335       this.opcode('getContext', id.depth);
2336
2337       this.opcode('pushProgram', program);
2338       this.opcode('pushProgram', inverse);
2339
2340       this.opcode('invokeAmbiguous', name, isBlock);
2341     },
2342
2343     simpleMustache: function(mustache) {
2344       var id = mustache.id;
2345
2346       if (id.type === 'DATA') {
2347         this.DATA(id);
2348       } else if (id.parts.length) {
2349         this.ID(id);
2350       } else {
2351         // Simplified ID for `this`
2352         this.addDepth(id.depth);
2353         this.opcode('getContext', id.depth);
2354         this.opcode('pushContext');
2355       }
2356
2357       this.opcode('resolvePossibleLambda');
2358     },
2359
2360     helperMustache: function(mustache, program, inverse) {
2361       var params = this.setupFullMustacheParams(mustache, program, inverse),
2362           name = mustache.id.parts[0];
2363
2364       if (this.options.knownHelpers[name]) {
2365         this.opcode('invokeKnownHelper', params.length, name);
2366       } else if (this.options.knownHelpersOnly) {
2367         throw new Error("You specified knownHelpersOnly, but used the unknown helper " + name);
2368       } else {
2369         this.opcode('invokeHelper', params.length, name);
2370       }
2371     },
2372
2373     ID: function(id) {
2374       this.addDepth(id.depth);
2375       this.opcode('getContext', id.depth);
2376
2377       var name = id.parts[0];
2378       if (!name) {
2379         this.opcode('pushContext');
2380       } else {
2381         this.opcode('lookupOnContext', id.parts[0]);
2382       }
2383
2384       for(var i=1, l=id.parts.length; i<l; i++) {
2385         this.opcode('lookup', id.parts[i]);
2386       }
2387     },
2388
2389     DATA: function(data) {
2390       this.options.data = true;
2391       if (data.id.isScoped || data.id.depth) {
2392         throw new Exception('Scoped data references are not supported: ' + data.original);
2393       }
2394
2395       this.opcode('lookupData');
2396       var parts = data.id.parts;
2397       for(var i=0, l=parts.length; i<l; i++) {
2398         this.opcode('lookup', parts[i]);
2399       }
2400     },
2401
2402     STRING: function(string) {
2403       this.opcode('pushString', string.string);
2404     },
2405
2406     INTEGER: function(integer) {
2407       this.opcode('pushLiteral', integer.integer);
2408     },
2409
2410     BOOLEAN: function(bool) {
2411       this.opcode('pushLiteral', bool.bool);
2412     },
2413
2414     comment: function() {},
2415
2416     // HELPERS
2417     opcode: function(name) {
2418       this.opcodes.push({ opcode: name, args: [].slice.call(arguments, 1) });
2419     },
2420
2421     declare: function(name, value) {
2422       this.opcodes.push({ opcode: 'DECLARE', name: name, value: value });
2423     },
2424
2425     addDepth: function(depth) {
2426       if(isNaN(depth)) { throw new Error("EWOT"); }
2427       if(depth === 0) { return; }
2428
2429       if(!this.depths[depth]) {
2430         this.depths[depth] = true;
2431         this.depths.list.push(depth);
2432       }
2433     },
2434
2435     classifyMustache: function(mustache) {
2436       var isHelper   = mustache.isHelper;
2437       var isEligible = mustache.eligibleHelper;
2438       var options    = this.options;
2439
2440       // if ambiguous, we can possibly resolve the ambiguity now
2441       if (isEligible && !isHelper) {
2442         var name = mustache.id.parts[0];
2443
2444         if (options.knownHelpers[name]) {
2445           isHelper = true;
2446         } else if (options.knownHelpersOnly) {
2447           isEligible = false;
2448         }
2449       }
2450
2451       if (isHelper) { return "helper"; }
2452       else if (isEligible) { return "ambiguous"; }
2453       else { return "simple"; }
2454     },
2455
2456     pushParams: function(params) {
2457       var i = params.length, param;
2458
2459       while(i--) {
2460         param = params[i];
2461
2462         if(this.options.stringParams) {
2463           if(param.depth) {
2464             this.addDepth(param.depth);
2465           }
2466
2467           this.opcode('getContext', param.depth || 0);
2468           this.opcode('pushStringParam', param.stringModeValue, param.type);
2469         } else {
2470           this[param.type](param);
2471         }
2472       }
2473     },
2474
2475     setupMustacheParams: function(mustache) {
2476       var params = mustache.params;
2477       this.pushParams(params);
2478
2479       if(mustache.hash) {
2480         this.hash(mustache.hash);
2481       } else {
2482         this.opcode('emptyHash');
2483       }
2484
2485       return params;
2486     },
2487
2488     // this will replace setupMustacheParams when we're done
2489     setupFullMustacheParams: function(mustache, program, inverse) {
2490       var params = mustache.params;
2491       this.pushParams(params);
2492
2493       this.opcode('pushProgram', program);
2494       this.opcode('pushProgram', inverse);
2495
2496       if(mustache.hash) {
2497         this.hash(mustache.hash);
2498       } else {
2499         this.opcode('emptyHash');
2500       }
2501
2502       return params;
2503     }
2504   };
2505
2506   function precompile(input, options) {
2507     if (input == null || (typeof input !== 'string' && input.constructor !== AST.ProgramNode)) {
2508       throw new Exception("You must pass a string or Handlebars AST to Handlebars.precompile. You passed " + input);
2509     }
2510
2511     options = options || {};
2512     if (!('data' in options)) {
2513       options.data = true;
2514     }
2515
2516     var ast = parse(input);
2517     var environment = new Compiler().compile(ast, options);
2518     return new JavaScriptCompiler().compile(environment, options);
2519   }
2520
2521   __exports__.precompile = precompile;function compile(input, options, env) {
2522     if (input == null || (typeof input !== 'string' && input.constructor !== AST.ProgramNode)) {
2523       throw new Exception("You must pass a string or Handlebars AST to Handlebars.compile. You passed " + input);
2524     }
2525
2526     options = options || {};
2527
2528     if (!('data' in options)) {
2529       options.data = true;
2530     }
2531
2532     var compiled;
2533
2534     function compileInput() {
2535       var ast = parse(input);
2536       var environment = new Compiler().compile(ast, options);
2537       var templateSpec = new JavaScriptCompiler().compile(environment, options, undefined, true);
2538       return env.template(templateSpec);
2539     }
2540
2541     // Template is only compiled on first use and cached after that point.
2542     return function(context, options) {
2543       if (!compiled) {
2544         compiled = compileInput();
2545       }
2546       return compiled.call(this, context, options);
2547     };
2548   }
2549
2550   __exports__.compile = compile;
2551   return __exports__;
2552 })(__module5__, __module8__, __module11__, __module7__);
2553
2554 // handlebars.js
2555 var __module0__ = (function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__) {
2556   "use strict";
2557   var __exports__;
2558   var Handlebars = __dependency1__;
2559
2560   // Compiler imports
2561   var AST = __dependency2__;
2562   var Parser = __dependency3__.parser;
2563   var parse = __dependency3__.parse;
2564   var Compiler = __dependency4__.Compiler;
2565   var compile = __dependency4__.compile;
2566   var precompile = __dependency4__.precompile;
2567   var JavaScriptCompiler = __dependency5__;
2568
2569   var _create = Handlebars.create;
2570   var create = function() {
2571     var hb = _create();
2572
2573     hb.compile = function(input, options) {
2574       return compile(input, options, hb);
2575     };
2576     hb.precompile = precompile;
2577
2578     hb.AST = AST;
2579     hb.Compiler = Compiler;
2580     hb.JavaScriptCompiler = JavaScriptCompiler;
2581     hb.Parser = Parser;
2582     hb.parse = parse;
2583
2584     return hb;
2585   };
2586
2587   Handlebars = create();
2588   Handlebars.create = create;
2589
2590   __exports__ = Handlebars;
2591   return __exports__;
2592 })(__module1__, __module7__, __module8__, __module10__, __module11__);
2593
2594   return __module0__;
2595 })();