Revision d0fe8c12 snf-cyclades-app/synnefo/ui/new_ui/ui/javascripts/handlebars-1.1.2.js

b/snf-cyclades-app/synnefo/ui/new_ui/ui/javascripts/handlebars-1.1.2.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: ...
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff