l0bsterssg

node.js static responsive blog post generator
Log | Files | Refs | README

esprima.js (283567B)


      1 (function webpackUniversalModuleDefinition(root, factory) {
      2 /* istanbul ignore next */
      3 	if(typeof exports === 'object' && typeof module === 'object')
      4 		module.exports = factory();
      5 	else if(typeof define === 'function' && define.amd)
      6 		define([], factory);
      7 /* istanbul ignore next */
      8 	else if(typeof exports === 'object')
      9 		exports["esprima"] = factory();
     10 	else
     11 		root["esprima"] = factory();
     12 })(this, function() {
     13 return /******/ (function(modules) { // webpackBootstrap
     14 /******/ 	// The module cache
     15 /******/ 	var installedModules = {};
     16 
     17 /******/ 	// The require function
     18 /******/ 	function __webpack_require__(moduleId) {
     19 
     20 /******/ 		// Check if module is in cache
     21 /* istanbul ignore if */
     22 /******/ 		if(installedModules[moduleId])
     23 /******/ 			return installedModules[moduleId].exports;
     24 
     25 /******/ 		// Create a new module (and put it into the cache)
     26 /******/ 		var module = installedModules[moduleId] = {
     27 /******/ 			exports: {},
     28 /******/ 			id: moduleId,
     29 /******/ 			loaded: false
     30 /******/ 		};
     31 
     32 /******/ 		// Execute the module function
     33 /******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
     34 
     35 /******/ 		// Flag the module as loaded
     36 /******/ 		module.loaded = true;
     37 
     38 /******/ 		// Return the exports of the module
     39 /******/ 		return module.exports;
     40 /******/ 	}
     41 
     42 
     43 /******/ 	// expose the modules object (__webpack_modules__)
     44 /******/ 	__webpack_require__.m = modules;
     45 
     46 /******/ 	// expose the module cache
     47 /******/ 	__webpack_require__.c = installedModules;
     48 
     49 /******/ 	// __webpack_public_path__
     50 /******/ 	__webpack_require__.p = "";
     51 
     52 /******/ 	// Load entry module and return exports
     53 /******/ 	return __webpack_require__(0);
     54 /******/ })
     55 /************************************************************************/
     56 /******/ ([
     57 /* 0 */
     58 /***/ function(module, exports, __webpack_require__) {
     59 
     60 	"use strict";
     61 	/*
     62 	  Copyright JS Foundation and other contributors, https://js.foundation/
     63 
     64 	  Redistribution and use in source and binary forms, with or without
     65 	  modification, are permitted provided that the following conditions are met:
     66 
     67 	    * Redistributions of source code must retain the above copyright
     68 	      notice, this list of conditions and the following disclaimer.
     69 	    * Redistributions in binary form must reproduce the above copyright
     70 	      notice, this list of conditions and the following disclaimer in the
     71 	      documentation and/or other materials provided with the distribution.
     72 
     73 	  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     74 	  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     75 	  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     76 	  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
     77 	  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     78 	  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     79 	  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
     80 	  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     81 	  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     82 	  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     83 	*/
     84 	Object.defineProperty(exports, "__esModule", { value: true });
     85 	var comment_handler_1 = __webpack_require__(1);
     86 	var jsx_parser_1 = __webpack_require__(3);
     87 	var parser_1 = __webpack_require__(8);
     88 	var tokenizer_1 = __webpack_require__(15);
     89 	function parse(code, options, delegate) {
     90 	    var commentHandler = null;
     91 	    var proxyDelegate = function (node, metadata) {
     92 	        if (delegate) {
     93 	            delegate(node, metadata);
     94 	        }
     95 	        if (commentHandler) {
     96 	            commentHandler.visit(node, metadata);
     97 	        }
     98 	    };
     99 	    var parserDelegate = (typeof delegate === 'function') ? proxyDelegate : null;
    100 	    var collectComment = false;
    101 	    if (options) {
    102 	        collectComment = (typeof options.comment === 'boolean' && options.comment);
    103 	        var attachComment = (typeof options.attachComment === 'boolean' && options.attachComment);
    104 	        if (collectComment || attachComment) {
    105 	            commentHandler = new comment_handler_1.CommentHandler();
    106 	            commentHandler.attach = attachComment;
    107 	            options.comment = true;
    108 	            parserDelegate = proxyDelegate;
    109 	        }
    110 	    }
    111 	    var isModule = false;
    112 	    if (options && typeof options.sourceType === 'string') {
    113 	        isModule = (options.sourceType === 'module');
    114 	    }
    115 	    var parser;
    116 	    if (options && typeof options.jsx === 'boolean' && options.jsx) {
    117 	        parser = new jsx_parser_1.JSXParser(code, options, parserDelegate);
    118 	    }
    119 	    else {
    120 	        parser = new parser_1.Parser(code, options, parserDelegate);
    121 	    }
    122 	    var program = isModule ? parser.parseModule() : parser.parseScript();
    123 	    var ast = program;
    124 	    if (collectComment && commentHandler) {
    125 	        ast.comments = commentHandler.comments;
    126 	    }
    127 	    if (parser.config.tokens) {
    128 	        ast.tokens = parser.tokens;
    129 	    }
    130 	    if (parser.config.tolerant) {
    131 	        ast.errors = parser.errorHandler.errors;
    132 	    }
    133 	    return ast;
    134 	}
    135 	exports.parse = parse;
    136 	function parseModule(code, options, delegate) {
    137 	    var parsingOptions = options || {};
    138 	    parsingOptions.sourceType = 'module';
    139 	    return parse(code, parsingOptions, delegate);
    140 	}
    141 	exports.parseModule = parseModule;
    142 	function parseScript(code, options, delegate) {
    143 	    var parsingOptions = options || {};
    144 	    parsingOptions.sourceType = 'script';
    145 	    return parse(code, parsingOptions, delegate);
    146 	}
    147 	exports.parseScript = parseScript;
    148 	function tokenize(code, options, delegate) {
    149 	    var tokenizer = new tokenizer_1.Tokenizer(code, options);
    150 	    var tokens;
    151 	    tokens = [];
    152 	    try {
    153 	        while (true) {
    154 	            var token = tokenizer.getNextToken();
    155 	            if (!token) {
    156 	                break;
    157 	            }
    158 	            if (delegate) {
    159 	                token = delegate(token);
    160 	            }
    161 	            tokens.push(token);
    162 	        }
    163 	    }
    164 	    catch (e) {
    165 	        tokenizer.errorHandler.tolerate(e);
    166 	    }
    167 	    if (tokenizer.errorHandler.tolerant) {
    168 	        tokens.errors = tokenizer.errors();
    169 	    }
    170 	    return tokens;
    171 	}
    172 	exports.tokenize = tokenize;
    173 	var syntax_1 = __webpack_require__(2);
    174 	exports.Syntax = syntax_1.Syntax;
    175 	// Sync with *.json manifests.
    176 	exports.version = '4.0.1';
    177 
    178 
    179 /***/ },
    180 /* 1 */
    181 /***/ function(module, exports, __webpack_require__) {
    182 
    183 	"use strict";
    184 	Object.defineProperty(exports, "__esModule", { value: true });
    185 	var syntax_1 = __webpack_require__(2);
    186 	var CommentHandler = (function () {
    187 	    function CommentHandler() {
    188 	        this.attach = false;
    189 	        this.comments = [];
    190 	        this.stack = [];
    191 	        this.leading = [];
    192 	        this.trailing = [];
    193 	    }
    194 	    CommentHandler.prototype.insertInnerComments = function (node, metadata) {
    195 	        //  innnerComments for properties empty block
    196 	        //  `function a() {/** comments **\/}`
    197 	        if (node.type === syntax_1.Syntax.BlockStatement && node.body.length === 0) {
    198 	            var innerComments = [];
    199 	            for (var i = this.leading.length - 1; i >= 0; --i) {
    200 	                var entry = this.leading[i];
    201 	                if (metadata.end.offset >= entry.start) {
    202 	                    innerComments.unshift(entry.comment);
    203 	                    this.leading.splice(i, 1);
    204 	                    this.trailing.splice(i, 1);
    205 	                }
    206 	            }
    207 	            if (innerComments.length) {
    208 	                node.innerComments = innerComments;
    209 	            }
    210 	        }
    211 	    };
    212 	    CommentHandler.prototype.findTrailingComments = function (metadata) {
    213 	        var trailingComments = [];
    214 	        if (this.trailing.length > 0) {
    215 	            for (var i = this.trailing.length - 1; i >= 0; --i) {
    216 	                var entry_1 = this.trailing[i];
    217 	                if (entry_1.start >= metadata.end.offset) {
    218 	                    trailingComments.unshift(entry_1.comment);
    219 	                }
    220 	            }
    221 	            this.trailing.length = 0;
    222 	            return trailingComments;
    223 	        }
    224 	        var entry = this.stack[this.stack.length - 1];
    225 	        if (entry && entry.node.trailingComments) {
    226 	            var firstComment = entry.node.trailingComments[0];
    227 	            if (firstComment && firstComment.range[0] >= metadata.end.offset) {
    228 	                trailingComments = entry.node.trailingComments;
    229 	                delete entry.node.trailingComments;
    230 	            }
    231 	        }
    232 	        return trailingComments;
    233 	    };
    234 	    CommentHandler.prototype.findLeadingComments = function (metadata) {
    235 	        var leadingComments = [];
    236 	        var target;
    237 	        while (this.stack.length > 0) {
    238 	            var entry = this.stack[this.stack.length - 1];
    239 	            if (entry && entry.start >= metadata.start.offset) {
    240 	                target = entry.node;
    241 	                this.stack.pop();
    242 	            }
    243 	            else {
    244 	                break;
    245 	            }
    246 	        }
    247 	        if (target) {
    248 	            var count = target.leadingComments ? target.leadingComments.length : 0;
    249 	            for (var i = count - 1; i >= 0; --i) {
    250 	                var comment = target.leadingComments[i];
    251 	                if (comment.range[1] <= metadata.start.offset) {
    252 	                    leadingComments.unshift(comment);
    253 	                    target.leadingComments.splice(i, 1);
    254 	                }
    255 	            }
    256 	            if (target.leadingComments && target.leadingComments.length === 0) {
    257 	                delete target.leadingComments;
    258 	            }
    259 	            return leadingComments;
    260 	        }
    261 	        for (var i = this.leading.length - 1; i >= 0; --i) {
    262 	            var entry = this.leading[i];
    263 	            if (entry.start <= metadata.start.offset) {
    264 	                leadingComments.unshift(entry.comment);
    265 	                this.leading.splice(i, 1);
    266 	            }
    267 	        }
    268 	        return leadingComments;
    269 	    };
    270 	    CommentHandler.prototype.visitNode = function (node, metadata) {
    271 	        if (node.type === syntax_1.Syntax.Program && node.body.length > 0) {
    272 	            return;
    273 	        }
    274 	        this.insertInnerComments(node, metadata);
    275 	        var trailingComments = this.findTrailingComments(metadata);
    276 	        var leadingComments = this.findLeadingComments(metadata);
    277 	        if (leadingComments.length > 0) {
    278 	            node.leadingComments = leadingComments;
    279 	        }
    280 	        if (trailingComments.length > 0) {
    281 	            node.trailingComments = trailingComments;
    282 	        }
    283 	        this.stack.push({
    284 	            node: node,
    285 	            start: metadata.start.offset
    286 	        });
    287 	    };
    288 	    CommentHandler.prototype.visitComment = function (node, metadata) {
    289 	        var type = (node.type[0] === 'L') ? 'Line' : 'Block';
    290 	        var comment = {
    291 	            type: type,
    292 	            value: node.value
    293 	        };
    294 	        if (node.range) {
    295 	            comment.range = node.range;
    296 	        }
    297 	        if (node.loc) {
    298 	            comment.loc = node.loc;
    299 	        }
    300 	        this.comments.push(comment);
    301 	        if (this.attach) {
    302 	            var entry = {
    303 	                comment: {
    304 	                    type: type,
    305 	                    value: node.value,
    306 	                    range: [metadata.start.offset, metadata.end.offset]
    307 	                },
    308 	                start: metadata.start.offset
    309 	            };
    310 	            if (node.loc) {
    311 	                entry.comment.loc = node.loc;
    312 	            }
    313 	            node.type = type;
    314 	            this.leading.push(entry);
    315 	            this.trailing.push(entry);
    316 	        }
    317 	    };
    318 	    CommentHandler.prototype.visit = function (node, metadata) {
    319 	        if (node.type === 'LineComment') {
    320 	            this.visitComment(node, metadata);
    321 	        }
    322 	        else if (node.type === 'BlockComment') {
    323 	            this.visitComment(node, metadata);
    324 	        }
    325 	        else if (this.attach) {
    326 	            this.visitNode(node, metadata);
    327 	        }
    328 	    };
    329 	    return CommentHandler;
    330 	}());
    331 	exports.CommentHandler = CommentHandler;
    332 
    333 
    334 /***/ },
    335 /* 2 */
    336 /***/ function(module, exports) {
    337 
    338 	"use strict";
    339 	Object.defineProperty(exports, "__esModule", { value: true });
    340 	exports.Syntax = {
    341 	    AssignmentExpression: 'AssignmentExpression',
    342 	    AssignmentPattern: 'AssignmentPattern',
    343 	    ArrayExpression: 'ArrayExpression',
    344 	    ArrayPattern: 'ArrayPattern',
    345 	    ArrowFunctionExpression: 'ArrowFunctionExpression',
    346 	    AwaitExpression: 'AwaitExpression',
    347 	    BlockStatement: 'BlockStatement',
    348 	    BinaryExpression: 'BinaryExpression',
    349 	    BreakStatement: 'BreakStatement',
    350 	    CallExpression: 'CallExpression',
    351 	    CatchClause: 'CatchClause',
    352 	    ClassBody: 'ClassBody',
    353 	    ClassDeclaration: 'ClassDeclaration',
    354 	    ClassExpression: 'ClassExpression',
    355 	    ConditionalExpression: 'ConditionalExpression',
    356 	    ContinueStatement: 'ContinueStatement',
    357 	    DoWhileStatement: 'DoWhileStatement',
    358 	    DebuggerStatement: 'DebuggerStatement',
    359 	    EmptyStatement: 'EmptyStatement',
    360 	    ExportAllDeclaration: 'ExportAllDeclaration',
    361 	    ExportDefaultDeclaration: 'ExportDefaultDeclaration',
    362 	    ExportNamedDeclaration: 'ExportNamedDeclaration',
    363 	    ExportSpecifier: 'ExportSpecifier',
    364 	    ExpressionStatement: 'ExpressionStatement',
    365 	    ForStatement: 'ForStatement',
    366 	    ForOfStatement: 'ForOfStatement',
    367 	    ForInStatement: 'ForInStatement',
    368 	    FunctionDeclaration: 'FunctionDeclaration',
    369 	    FunctionExpression: 'FunctionExpression',
    370 	    Identifier: 'Identifier',
    371 	    IfStatement: 'IfStatement',
    372 	    ImportDeclaration: 'ImportDeclaration',
    373 	    ImportDefaultSpecifier: 'ImportDefaultSpecifier',
    374 	    ImportNamespaceSpecifier: 'ImportNamespaceSpecifier',
    375 	    ImportSpecifier: 'ImportSpecifier',
    376 	    Literal: 'Literal',
    377 	    LabeledStatement: 'LabeledStatement',
    378 	    LogicalExpression: 'LogicalExpression',
    379 	    MemberExpression: 'MemberExpression',
    380 	    MetaProperty: 'MetaProperty',
    381 	    MethodDefinition: 'MethodDefinition',
    382 	    NewExpression: 'NewExpression',
    383 	    ObjectExpression: 'ObjectExpression',
    384 	    ObjectPattern: 'ObjectPattern',
    385 	    Program: 'Program',
    386 	    Property: 'Property',
    387 	    RestElement: 'RestElement',
    388 	    ReturnStatement: 'ReturnStatement',
    389 	    SequenceExpression: 'SequenceExpression',
    390 	    SpreadElement: 'SpreadElement',
    391 	    Super: 'Super',
    392 	    SwitchCase: 'SwitchCase',
    393 	    SwitchStatement: 'SwitchStatement',
    394 	    TaggedTemplateExpression: 'TaggedTemplateExpression',
    395 	    TemplateElement: 'TemplateElement',
    396 	    TemplateLiteral: 'TemplateLiteral',
    397 	    ThisExpression: 'ThisExpression',
    398 	    ThrowStatement: 'ThrowStatement',
    399 	    TryStatement: 'TryStatement',
    400 	    UnaryExpression: 'UnaryExpression',
    401 	    UpdateExpression: 'UpdateExpression',
    402 	    VariableDeclaration: 'VariableDeclaration',
    403 	    VariableDeclarator: 'VariableDeclarator',
    404 	    WhileStatement: 'WhileStatement',
    405 	    WithStatement: 'WithStatement',
    406 	    YieldExpression: 'YieldExpression'
    407 	};
    408 
    409 
    410 /***/ },
    411 /* 3 */
    412 /***/ function(module, exports, __webpack_require__) {
    413 
    414 	"use strict";
    415 /* istanbul ignore next */
    416 	var __extends = (this && this.__extends) || (function () {
    417 	    var extendStatics = Object.setPrototypeOf ||
    418 	        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
    419 	        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
    420 	    return function (d, b) {
    421 	        extendStatics(d, b);
    422 	        function __() { this.constructor = d; }
    423 	        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    424 	    };
    425 	})();
    426 	Object.defineProperty(exports, "__esModule", { value: true });
    427 	var character_1 = __webpack_require__(4);
    428 	var JSXNode = __webpack_require__(5);
    429 	var jsx_syntax_1 = __webpack_require__(6);
    430 	var Node = __webpack_require__(7);
    431 	var parser_1 = __webpack_require__(8);
    432 	var token_1 = __webpack_require__(13);
    433 	var xhtml_entities_1 = __webpack_require__(14);
    434 	token_1.TokenName[100 /* Identifier */] = 'JSXIdentifier';
    435 	token_1.TokenName[101 /* Text */] = 'JSXText';
    436 	// Fully qualified element name, e.g. <svg:path> returns "svg:path"
    437 	function getQualifiedElementName(elementName) {
    438 	    var qualifiedName;
    439 	    switch (elementName.type) {
    440 	        case jsx_syntax_1.JSXSyntax.JSXIdentifier:
    441 	            var id = elementName;
    442 	            qualifiedName = id.name;
    443 	            break;
    444 	        case jsx_syntax_1.JSXSyntax.JSXNamespacedName:
    445 	            var ns = elementName;
    446 	            qualifiedName = getQualifiedElementName(ns.namespace) + ':' +
    447 	                getQualifiedElementName(ns.name);
    448 	            break;
    449 	        case jsx_syntax_1.JSXSyntax.JSXMemberExpression:
    450 	            var expr = elementName;
    451 	            qualifiedName = getQualifiedElementName(expr.object) + '.' +
    452 	                getQualifiedElementName(expr.property);
    453 	            break;
    454 	        /* istanbul ignore next */
    455 	        default:
    456 	            break;
    457 	    }
    458 	    return qualifiedName;
    459 	}
    460 	var JSXParser = (function (_super) {
    461 	    __extends(JSXParser, _super);
    462 	    function JSXParser(code, options, delegate) {
    463 	        return _super.call(this, code, options, delegate) || this;
    464 	    }
    465 	    JSXParser.prototype.parsePrimaryExpression = function () {
    466 	        return this.match('<') ? this.parseJSXRoot() : _super.prototype.parsePrimaryExpression.call(this);
    467 	    };
    468 	    JSXParser.prototype.startJSX = function () {
    469 	        // Unwind the scanner before the lookahead token.
    470 	        this.scanner.index = this.startMarker.index;
    471 	        this.scanner.lineNumber = this.startMarker.line;
    472 	        this.scanner.lineStart = this.startMarker.index - this.startMarker.column;
    473 	    };
    474 	    JSXParser.prototype.finishJSX = function () {
    475 	        // Prime the next lookahead.
    476 	        this.nextToken();
    477 	    };
    478 	    JSXParser.prototype.reenterJSX = function () {
    479 	        this.startJSX();
    480 	        this.expectJSX('}');
    481 	        // Pop the closing '}' added from the lookahead.
    482 	        if (this.config.tokens) {
    483 	            this.tokens.pop();
    484 	        }
    485 	    };
    486 	    JSXParser.prototype.createJSXNode = function () {
    487 	        this.collectComments();
    488 	        return {
    489 	            index: this.scanner.index,
    490 	            line: this.scanner.lineNumber,
    491 	            column: this.scanner.index - this.scanner.lineStart
    492 	        };
    493 	    };
    494 	    JSXParser.prototype.createJSXChildNode = function () {
    495 	        return {
    496 	            index: this.scanner.index,
    497 	            line: this.scanner.lineNumber,
    498 	            column: this.scanner.index - this.scanner.lineStart
    499 	        };
    500 	    };
    501 	    JSXParser.prototype.scanXHTMLEntity = function (quote) {
    502 	        var result = '&';
    503 	        var valid = true;
    504 	        var terminated = false;
    505 	        var numeric = false;
    506 	        var hex = false;
    507 	        while (!this.scanner.eof() && valid && !terminated) {
    508 	            var ch = this.scanner.source[this.scanner.index];
    509 	            if (ch === quote) {
    510 	                break;
    511 	            }
    512 	            terminated = (ch === ';');
    513 	            result += ch;
    514 	            ++this.scanner.index;
    515 	            if (!terminated) {
    516 	                switch (result.length) {
    517 	                    case 2:
    518 	                        // e.g. '&#123;'
    519 	                        numeric = (ch === '#');
    520 	                        break;
    521 	                    case 3:
    522 	                        if (numeric) {
    523 	                            // e.g. '&#x41;'
    524 	                            hex = (ch === 'x');
    525 	                            valid = hex || character_1.Character.isDecimalDigit(ch.charCodeAt(0));
    526 	                            numeric = numeric && !hex;
    527 	                        }
    528 	                        break;
    529 	                    default:
    530 	                        valid = valid && !(numeric && !character_1.Character.isDecimalDigit(ch.charCodeAt(0)));
    531 	                        valid = valid && !(hex && !character_1.Character.isHexDigit(ch.charCodeAt(0)));
    532 	                        break;
    533 	                }
    534 	            }
    535 	        }
    536 	        if (valid && terminated && result.length > 2) {
    537 	            // e.g. '&#x41;' becomes just '#x41'
    538 	            var str = result.substr(1, result.length - 2);
    539 	            if (numeric && str.length > 1) {
    540 	                result = String.fromCharCode(parseInt(str.substr(1), 10));
    541 	            }
    542 	            else if (hex && str.length > 2) {
    543 	                result = String.fromCharCode(parseInt('0' + str.substr(1), 16));
    544 	            }
    545 	            else if (!numeric && !hex && xhtml_entities_1.XHTMLEntities[str]) {
    546 	                result = xhtml_entities_1.XHTMLEntities[str];
    547 	            }
    548 	        }
    549 	        return result;
    550 	    };
    551 	    // Scan the next JSX token. This replaces Scanner#lex when in JSX mode.
    552 	    JSXParser.prototype.lexJSX = function () {
    553 	        var cp = this.scanner.source.charCodeAt(this.scanner.index);
    554 	        // < > / : = { }
    555 	        if (cp === 60 || cp === 62 || cp === 47 || cp === 58 || cp === 61 || cp === 123 || cp === 125) {
    556 	            var value = this.scanner.source[this.scanner.index++];
    557 	            return {
    558 	                type: 7 /* Punctuator */,
    559 	                value: value,
    560 	                lineNumber: this.scanner.lineNumber,
    561 	                lineStart: this.scanner.lineStart,
    562 	                start: this.scanner.index - 1,
    563 	                end: this.scanner.index
    564 	            };
    565 	        }
    566 	        // " '
    567 	        if (cp === 34 || cp === 39) {
    568 	            var start = this.scanner.index;
    569 	            var quote = this.scanner.source[this.scanner.index++];
    570 	            var str = '';
    571 	            while (!this.scanner.eof()) {
    572 	                var ch = this.scanner.source[this.scanner.index++];
    573 	                if (ch === quote) {
    574 	                    break;
    575 	                }
    576 	                else if (ch === '&') {
    577 	                    str += this.scanXHTMLEntity(quote);
    578 	                }
    579 	                else {
    580 	                    str += ch;
    581 	                }
    582 	            }
    583 	            return {
    584 	                type: 8 /* StringLiteral */,
    585 	                value: str,
    586 	                lineNumber: this.scanner.lineNumber,
    587 	                lineStart: this.scanner.lineStart,
    588 	                start: start,
    589 	                end: this.scanner.index
    590 	            };
    591 	        }
    592 	        // ... or .
    593 	        if (cp === 46) {
    594 	            var n1 = this.scanner.source.charCodeAt(this.scanner.index + 1);
    595 	            var n2 = this.scanner.source.charCodeAt(this.scanner.index + 2);
    596 	            var value = (n1 === 46 && n2 === 46) ? '...' : '.';
    597 	            var start = this.scanner.index;
    598 	            this.scanner.index += value.length;
    599 	            return {
    600 	                type: 7 /* Punctuator */,
    601 	                value: value,
    602 	                lineNumber: this.scanner.lineNumber,
    603 	                lineStart: this.scanner.lineStart,
    604 	                start: start,
    605 	                end: this.scanner.index
    606 	            };
    607 	        }
    608 	        // `
    609 	        if (cp === 96) {
    610 	            // Only placeholder, since it will be rescanned as a real assignment expression.
    611 	            return {
    612 	                type: 10 /* Template */,
    613 	                value: '',
    614 	                lineNumber: this.scanner.lineNumber,
    615 	                lineStart: this.scanner.lineStart,
    616 	                start: this.scanner.index,
    617 	                end: this.scanner.index
    618 	            };
    619 	        }
    620 	        // Identifer can not contain backslash (char code 92).
    621 	        if (character_1.Character.isIdentifierStart(cp) && (cp !== 92)) {
    622 	            var start = this.scanner.index;
    623 	            ++this.scanner.index;
    624 	            while (!this.scanner.eof()) {
    625 	                var ch = this.scanner.source.charCodeAt(this.scanner.index);
    626 	                if (character_1.Character.isIdentifierPart(ch) && (ch !== 92)) {
    627 	                    ++this.scanner.index;
    628 	                }
    629 	                else if (ch === 45) {
    630 	                    // Hyphen (char code 45) can be part of an identifier.
    631 	                    ++this.scanner.index;
    632 	                }
    633 	                else {
    634 	                    break;
    635 	                }
    636 	            }
    637 	            var id = this.scanner.source.slice(start, this.scanner.index);
    638 	            return {
    639 	                type: 100 /* Identifier */,
    640 	                value: id,
    641 	                lineNumber: this.scanner.lineNumber,
    642 	                lineStart: this.scanner.lineStart,
    643 	                start: start,
    644 	                end: this.scanner.index
    645 	            };
    646 	        }
    647 	        return this.scanner.lex();
    648 	    };
    649 	    JSXParser.prototype.nextJSXToken = function () {
    650 	        this.collectComments();
    651 	        this.startMarker.index = this.scanner.index;
    652 	        this.startMarker.line = this.scanner.lineNumber;
    653 	        this.startMarker.column = this.scanner.index - this.scanner.lineStart;
    654 	        var token = this.lexJSX();
    655 	        this.lastMarker.index = this.scanner.index;
    656 	        this.lastMarker.line = this.scanner.lineNumber;
    657 	        this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
    658 	        if (this.config.tokens) {
    659 	            this.tokens.push(this.convertToken(token));
    660 	        }
    661 	        return token;
    662 	    };
    663 	    JSXParser.prototype.nextJSXText = function () {
    664 	        this.startMarker.index = this.scanner.index;
    665 	        this.startMarker.line = this.scanner.lineNumber;
    666 	        this.startMarker.column = this.scanner.index - this.scanner.lineStart;
    667 	        var start = this.scanner.index;
    668 	        var text = '';
    669 	        while (!this.scanner.eof()) {
    670 	            var ch = this.scanner.source[this.scanner.index];
    671 	            if (ch === '{' || ch === '<') {
    672 	                break;
    673 	            }
    674 	            ++this.scanner.index;
    675 	            text += ch;
    676 	            if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
    677 	                ++this.scanner.lineNumber;
    678 	                if (ch === '\r' && this.scanner.source[this.scanner.index] === '\n') {
    679 	                    ++this.scanner.index;
    680 	                }
    681 	                this.scanner.lineStart = this.scanner.index;
    682 	            }
    683 	        }
    684 	        this.lastMarker.index = this.scanner.index;
    685 	        this.lastMarker.line = this.scanner.lineNumber;
    686 	        this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
    687 	        var token = {
    688 	            type: 101 /* Text */,
    689 	            value: text,
    690 	            lineNumber: this.scanner.lineNumber,
    691 	            lineStart: this.scanner.lineStart,
    692 	            start: start,
    693 	            end: this.scanner.index
    694 	        };
    695 	        if ((text.length > 0) && this.config.tokens) {
    696 	            this.tokens.push(this.convertToken(token));
    697 	        }
    698 	        return token;
    699 	    };
    700 	    JSXParser.prototype.peekJSXToken = function () {
    701 	        var state = this.scanner.saveState();
    702 	        this.scanner.scanComments();
    703 	        var next = this.lexJSX();
    704 	        this.scanner.restoreState(state);
    705 	        return next;
    706 	    };
    707 	    // Expect the next JSX token to match the specified punctuator.
    708 	    // If not, an exception will be thrown.
    709 	    JSXParser.prototype.expectJSX = function (value) {
    710 	        var token = this.nextJSXToken();
    711 	        if (token.type !== 7 /* Punctuator */ || token.value !== value) {
    712 	            this.throwUnexpectedToken(token);
    713 	        }
    714 	    };
    715 	    // Return true if the next JSX token matches the specified punctuator.
    716 	    JSXParser.prototype.matchJSX = function (value) {
    717 	        var next = this.peekJSXToken();
    718 	        return next.type === 7 /* Punctuator */ && next.value === value;
    719 	    };
    720 	    JSXParser.prototype.parseJSXIdentifier = function () {
    721 	        var node = this.createJSXNode();
    722 	        var token = this.nextJSXToken();
    723 	        if (token.type !== 100 /* Identifier */) {
    724 	            this.throwUnexpectedToken(token);
    725 	        }
    726 	        return this.finalize(node, new JSXNode.JSXIdentifier(token.value));
    727 	    };
    728 	    JSXParser.prototype.parseJSXElementName = function () {
    729 	        var node = this.createJSXNode();
    730 	        var elementName = this.parseJSXIdentifier();
    731 	        if (this.matchJSX(':')) {
    732 	            var namespace = elementName;
    733 	            this.expectJSX(':');
    734 	            var name_1 = this.parseJSXIdentifier();
    735 	            elementName = this.finalize(node, new JSXNode.JSXNamespacedName(namespace, name_1));
    736 	        }
    737 	        else if (this.matchJSX('.')) {
    738 	            while (this.matchJSX('.')) {
    739 	                var object = elementName;
    740 	                this.expectJSX('.');
    741 	                var property = this.parseJSXIdentifier();
    742 	                elementName = this.finalize(node, new JSXNode.JSXMemberExpression(object, property));
    743 	            }
    744 	        }
    745 	        return elementName;
    746 	    };
    747 	    JSXParser.prototype.parseJSXAttributeName = function () {
    748 	        var node = this.createJSXNode();
    749 	        var attributeName;
    750 	        var identifier = this.parseJSXIdentifier();
    751 	        if (this.matchJSX(':')) {
    752 	            var namespace = identifier;
    753 	            this.expectJSX(':');
    754 	            var name_2 = this.parseJSXIdentifier();
    755 	            attributeName = this.finalize(node, new JSXNode.JSXNamespacedName(namespace, name_2));
    756 	        }
    757 	        else {
    758 	            attributeName = identifier;
    759 	        }
    760 	        return attributeName;
    761 	    };
    762 	    JSXParser.prototype.parseJSXStringLiteralAttribute = function () {
    763 	        var node = this.createJSXNode();
    764 	        var token = this.nextJSXToken();
    765 	        if (token.type !== 8 /* StringLiteral */) {
    766 	            this.throwUnexpectedToken(token);
    767 	        }
    768 	        var raw = this.getTokenRaw(token);
    769 	        return this.finalize(node, new Node.Literal(token.value, raw));
    770 	    };
    771 	    JSXParser.prototype.parseJSXExpressionAttribute = function () {
    772 	        var node = this.createJSXNode();
    773 	        this.expectJSX('{');
    774 	        this.finishJSX();
    775 	        if (this.match('}')) {
    776 	            this.tolerateError('JSX attributes must only be assigned a non-empty expression');
    777 	        }
    778 	        var expression = this.parseAssignmentExpression();
    779 	        this.reenterJSX();
    780 	        return this.finalize(node, new JSXNode.JSXExpressionContainer(expression));
    781 	    };
    782 	    JSXParser.prototype.parseJSXAttributeValue = function () {
    783 	        return this.matchJSX('{') ? this.parseJSXExpressionAttribute() :
    784 	            this.matchJSX('<') ? this.parseJSXElement() : this.parseJSXStringLiteralAttribute();
    785 	    };
    786 	    JSXParser.prototype.parseJSXNameValueAttribute = function () {
    787 	        var node = this.createJSXNode();
    788 	        var name = this.parseJSXAttributeName();
    789 	        var value = null;
    790 	        if (this.matchJSX('=')) {
    791 	            this.expectJSX('=');
    792 	            value = this.parseJSXAttributeValue();
    793 	        }
    794 	        return this.finalize(node, new JSXNode.JSXAttribute(name, value));
    795 	    };
    796 	    JSXParser.prototype.parseJSXSpreadAttribute = function () {
    797 	        var node = this.createJSXNode();
    798 	        this.expectJSX('{');
    799 	        this.expectJSX('...');
    800 	        this.finishJSX();
    801 	        var argument = this.parseAssignmentExpression();
    802 	        this.reenterJSX();
    803 	        return this.finalize(node, new JSXNode.JSXSpreadAttribute(argument));
    804 	    };
    805 	    JSXParser.prototype.parseJSXAttributes = function () {
    806 	        var attributes = [];
    807 	        while (!this.matchJSX('/') && !this.matchJSX('>')) {
    808 	            var attribute = this.matchJSX('{') ? this.parseJSXSpreadAttribute() :
    809 	                this.parseJSXNameValueAttribute();
    810 	            attributes.push(attribute);
    811 	        }
    812 	        return attributes;
    813 	    };
    814 	    JSXParser.prototype.parseJSXOpeningElement = function () {
    815 	        var node = this.createJSXNode();
    816 	        this.expectJSX('<');
    817 	        var name = this.parseJSXElementName();
    818 	        var attributes = this.parseJSXAttributes();
    819 	        var selfClosing = this.matchJSX('/');
    820 	        if (selfClosing) {
    821 	            this.expectJSX('/');
    822 	        }
    823 	        this.expectJSX('>');
    824 	        return this.finalize(node, new JSXNode.JSXOpeningElement(name, selfClosing, attributes));
    825 	    };
    826 	    JSXParser.prototype.parseJSXBoundaryElement = function () {
    827 	        var node = this.createJSXNode();
    828 	        this.expectJSX('<');
    829 	        if (this.matchJSX('/')) {
    830 	            this.expectJSX('/');
    831 	            var name_3 = this.parseJSXElementName();
    832 	            this.expectJSX('>');
    833 	            return this.finalize(node, new JSXNode.JSXClosingElement(name_3));
    834 	        }
    835 	        var name = this.parseJSXElementName();
    836 	        var attributes = this.parseJSXAttributes();
    837 	        var selfClosing = this.matchJSX('/');
    838 	        if (selfClosing) {
    839 	            this.expectJSX('/');
    840 	        }
    841 	        this.expectJSX('>');
    842 	        return this.finalize(node, new JSXNode.JSXOpeningElement(name, selfClosing, attributes));
    843 	    };
    844 	    JSXParser.prototype.parseJSXEmptyExpression = function () {
    845 	        var node = this.createJSXChildNode();
    846 	        this.collectComments();
    847 	        this.lastMarker.index = this.scanner.index;
    848 	        this.lastMarker.line = this.scanner.lineNumber;
    849 	        this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
    850 	        return this.finalize(node, new JSXNode.JSXEmptyExpression());
    851 	    };
    852 	    JSXParser.prototype.parseJSXExpressionContainer = function () {
    853 	        var node = this.createJSXNode();
    854 	        this.expectJSX('{');
    855 	        var expression;
    856 	        if (this.matchJSX('}')) {
    857 	            expression = this.parseJSXEmptyExpression();
    858 	            this.expectJSX('}');
    859 	        }
    860 	        else {
    861 	            this.finishJSX();
    862 	            expression = this.parseAssignmentExpression();
    863 	            this.reenterJSX();
    864 	        }
    865 	        return this.finalize(node, new JSXNode.JSXExpressionContainer(expression));
    866 	    };
    867 	    JSXParser.prototype.parseJSXChildren = function () {
    868 	        var children = [];
    869 	        while (!this.scanner.eof()) {
    870 	            var node = this.createJSXChildNode();
    871 	            var token = this.nextJSXText();
    872 	            if (token.start < token.end) {
    873 	                var raw = this.getTokenRaw(token);
    874 	                var child = this.finalize(node, new JSXNode.JSXText(token.value, raw));
    875 	                children.push(child);
    876 	            }
    877 	            if (this.scanner.source[this.scanner.index] === '{') {
    878 	                var container = this.parseJSXExpressionContainer();
    879 	                children.push(container);
    880 	            }
    881 	            else {
    882 	                break;
    883 	            }
    884 	        }
    885 	        return children;
    886 	    };
    887 	    JSXParser.prototype.parseComplexJSXElement = function (el) {
    888 	        var stack = [];
    889 	        while (!this.scanner.eof()) {
    890 	            el.children = el.children.concat(this.parseJSXChildren());
    891 	            var node = this.createJSXChildNode();
    892 	            var element = this.parseJSXBoundaryElement();
    893 	            if (element.type === jsx_syntax_1.JSXSyntax.JSXOpeningElement) {
    894 	                var opening = element;
    895 	                if (opening.selfClosing) {
    896 	                    var child = this.finalize(node, new JSXNode.JSXElement(opening, [], null));
    897 	                    el.children.push(child);
    898 	                }
    899 	                else {
    900 	                    stack.push(el);
    901 	                    el = { node: node, opening: opening, closing: null, children: [] };
    902 	                }
    903 	            }
    904 	            if (element.type === jsx_syntax_1.JSXSyntax.JSXClosingElement) {
    905 	                el.closing = element;
    906 	                var open_1 = getQualifiedElementName(el.opening.name);
    907 	                var close_1 = getQualifiedElementName(el.closing.name);
    908 	                if (open_1 !== close_1) {
    909 	                    this.tolerateError('Expected corresponding JSX closing tag for %0', open_1);
    910 	                }
    911 	                if (stack.length > 0) {
    912 	                    var child = this.finalize(el.node, new JSXNode.JSXElement(el.opening, el.children, el.closing));
    913 	                    el = stack[stack.length - 1];
    914 	                    el.children.push(child);
    915 	                    stack.pop();
    916 	                }
    917 	                else {
    918 	                    break;
    919 	                }
    920 	            }
    921 	        }
    922 	        return el;
    923 	    };
    924 	    JSXParser.prototype.parseJSXElement = function () {
    925 	        var node = this.createJSXNode();
    926 	        var opening = this.parseJSXOpeningElement();
    927 	        var children = [];
    928 	        var closing = null;
    929 	        if (!opening.selfClosing) {
    930 	            var el = this.parseComplexJSXElement({ node: node, opening: opening, closing: closing, children: children });
    931 	            children = el.children;
    932 	            closing = el.closing;
    933 	        }
    934 	        return this.finalize(node, new JSXNode.JSXElement(opening, children, closing));
    935 	    };
    936 	    JSXParser.prototype.parseJSXRoot = function () {
    937 	        // Pop the opening '<' added from the lookahead.
    938 	        if (this.config.tokens) {
    939 	            this.tokens.pop();
    940 	        }
    941 	        this.startJSX();
    942 	        var element = this.parseJSXElement();
    943 	        this.finishJSX();
    944 	        return element;
    945 	    };
    946 	    JSXParser.prototype.isStartOfExpression = function () {
    947 	        return _super.prototype.isStartOfExpression.call(this) || this.match('<');
    948 	    };
    949 	    return JSXParser;
    950 	}(parser_1.Parser));
    951 	exports.JSXParser = JSXParser;
    952 
    953 
    954 /***/ },
    955 /* 4 */
    956 /***/ function(module, exports) {
    957 
    958 	"use strict";
    959 	Object.defineProperty(exports, "__esModule", { value: true });
    960 	// See also tools/generate-unicode-regex.js.
    961 	var Regex = {
    962 	    // Unicode v8.0.0 NonAsciiIdentifierStart:
    963 	    NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]/,
    964 	    // Unicode v8.0.0 NonAsciiIdentifierPart:
    965 	    NonAsciiIdentifierPart: /[\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/
    966 	};
    967 	exports.Character = {
    968 	    /* tslint:disable:no-bitwise */
    969 	    fromCodePoint: function (cp) {
    970 	        return (cp < 0x10000) ? String.fromCharCode(cp) :
    971 	            String.fromCharCode(0xD800 + ((cp - 0x10000) >> 10)) +
    972 	                String.fromCharCode(0xDC00 + ((cp - 0x10000) & 1023));
    973 	    },
    974 	    // https://tc39.github.io/ecma262/#sec-white-space
    975 	    isWhiteSpace: function (cp) {
    976 	        return (cp === 0x20) || (cp === 0x09) || (cp === 0x0B) || (cp === 0x0C) || (cp === 0xA0) ||
    977 	            (cp >= 0x1680 && [0x1680, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202F, 0x205F, 0x3000, 0xFEFF].indexOf(cp) >= 0);
    978 	    },
    979 	    // https://tc39.github.io/ecma262/#sec-line-terminators
    980 	    isLineTerminator: function (cp) {
    981 	        return (cp === 0x0A) || (cp === 0x0D) || (cp === 0x2028) || (cp === 0x2029);
    982 	    },
    983 	    // https://tc39.github.io/ecma262/#sec-names-and-keywords
    984 	    isIdentifierStart: function (cp) {
    985 	        return (cp === 0x24) || (cp === 0x5F) ||
    986 	            (cp >= 0x41 && cp <= 0x5A) ||
    987 	            (cp >= 0x61 && cp <= 0x7A) ||
    988 	            (cp === 0x5C) ||
    989 	            ((cp >= 0x80) && Regex.NonAsciiIdentifierStart.test(exports.Character.fromCodePoint(cp)));
    990 	    },
    991 	    isIdentifierPart: function (cp) {
    992 	        return (cp === 0x24) || (cp === 0x5F) ||
    993 	            (cp >= 0x41 && cp <= 0x5A) ||
    994 	            (cp >= 0x61 && cp <= 0x7A) ||
    995 	            (cp >= 0x30 && cp <= 0x39) ||
    996 	            (cp === 0x5C) ||
    997 	            ((cp >= 0x80) && Regex.NonAsciiIdentifierPart.test(exports.Character.fromCodePoint(cp)));
    998 	    },
    999 	    // https://tc39.github.io/ecma262/#sec-literals-numeric-literals
   1000 	    isDecimalDigit: function (cp) {
   1001 	        return (cp >= 0x30 && cp <= 0x39); // 0..9
   1002 	    },
   1003 	    isHexDigit: function (cp) {
   1004 	        return (cp >= 0x30 && cp <= 0x39) ||
   1005 	            (cp >= 0x41 && cp <= 0x46) ||
   1006 	            (cp >= 0x61 && cp <= 0x66); // a..f
   1007 	    },
   1008 	    isOctalDigit: function (cp) {
   1009 	        return (cp >= 0x30 && cp <= 0x37); // 0..7
   1010 	    }
   1011 	};
   1012 
   1013 
   1014 /***/ },
   1015 /* 5 */
   1016 /***/ function(module, exports, __webpack_require__) {
   1017 
   1018 	"use strict";
   1019 	Object.defineProperty(exports, "__esModule", { value: true });
   1020 	var jsx_syntax_1 = __webpack_require__(6);
   1021 	/* tslint:disable:max-classes-per-file */
   1022 	var JSXClosingElement = (function () {
   1023 	    function JSXClosingElement(name) {
   1024 	        this.type = jsx_syntax_1.JSXSyntax.JSXClosingElement;
   1025 	        this.name = name;
   1026 	    }
   1027 	    return JSXClosingElement;
   1028 	}());
   1029 	exports.JSXClosingElement = JSXClosingElement;
   1030 	var JSXElement = (function () {
   1031 	    function JSXElement(openingElement, children, closingElement) {
   1032 	        this.type = jsx_syntax_1.JSXSyntax.JSXElement;
   1033 	        this.openingElement = openingElement;
   1034 	        this.children = children;
   1035 	        this.closingElement = closingElement;
   1036 	    }
   1037 	    return JSXElement;
   1038 	}());
   1039 	exports.JSXElement = JSXElement;
   1040 	var JSXEmptyExpression = (function () {
   1041 	    function JSXEmptyExpression() {
   1042 	        this.type = jsx_syntax_1.JSXSyntax.JSXEmptyExpression;
   1043 	    }
   1044 	    return JSXEmptyExpression;
   1045 	}());
   1046 	exports.JSXEmptyExpression = JSXEmptyExpression;
   1047 	var JSXExpressionContainer = (function () {
   1048 	    function JSXExpressionContainer(expression) {
   1049 	        this.type = jsx_syntax_1.JSXSyntax.JSXExpressionContainer;
   1050 	        this.expression = expression;
   1051 	    }
   1052 	    return JSXExpressionContainer;
   1053 	}());
   1054 	exports.JSXExpressionContainer = JSXExpressionContainer;
   1055 	var JSXIdentifier = (function () {
   1056 	    function JSXIdentifier(name) {
   1057 	        this.type = jsx_syntax_1.JSXSyntax.JSXIdentifier;
   1058 	        this.name = name;
   1059 	    }
   1060 	    return JSXIdentifier;
   1061 	}());
   1062 	exports.JSXIdentifier = JSXIdentifier;
   1063 	var JSXMemberExpression = (function () {
   1064 	    function JSXMemberExpression(object, property) {
   1065 	        this.type = jsx_syntax_1.JSXSyntax.JSXMemberExpression;
   1066 	        this.object = object;
   1067 	        this.property = property;
   1068 	    }
   1069 	    return JSXMemberExpression;
   1070 	}());
   1071 	exports.JSXMemberExpression = JSXMemberExpression;
   1072 	var JSXAttribute = (function () {
   1073 	    function JSXAttribute(name, value) {
   1074 	        this.type = jsx_syntax_1.JSXSyntax.JSXAttribute;
   1075 	        this.name = name;
   1076 	        this.value = value;
   1077 	    }
   1078 	    return JSXAttribute;
   1079 	}());
   1080 	exports.JSXAttribute = JSXAttribute;
   1081 	var JSXNamespacedName = (function () {
   1082 	    function JSXNamespacedName(namespace, name) {
   1083 	        this.type = jsx_syntax_1.JSXSyntax.JSXNamespacedName;
   1084 	        this.namespace = namespace;
   1085 	        this.name = name;
   1086 	    }
   1087 	    return JSXNamespacedName;
   1088 	}());
   1089 	exports.JSXNamespacedName = JSXNamespacedName;
   1090 	var JSXOpeningElement = (function () {
   1091 	    function JSXOpeningElement(name, selfClosing, attributes) {
   1092 	        this.type = jsx_syntax_1.JSXSyntax.JSXOpeningElement;
   1093 	        this.name = name;
   1094 	        this.selfClosing = selfClosing;
   1095 	        this.attributes = attributes;
   1096 	    }
   1097 	    return JSXOpeningElement;
   1098 	}());
   1099 	exports.JSXOpeningElement = JSXOpeningElement;
   1100 	var JSXSpreadAttribute = (function () {
   1101 	    function JSXSpreadAttribute(argument) {
   1102 	        this.type = jsx_syntax_1.JSXSyntax.JSXSpreadAttribute;
   1103 	        this.argument = argument;
   1104 	    }
   1105 	    return JSXSpreadAttribute;
   1106 	}());
   1107 	exports.JSXSpreadAttribute = JSXSpreadAttribute;
   1108 	var JSXText = (function () {
   1109 	    function JSXText(value, raw) {
   1110 	        this.type = jsx_syntax_1.JSXSyntax.JSXText;
   1111 	        this.value = value;
   1112 	        this.raw = raw;
   1113 	    }
   1114 	    return JSXText;
   1115 	}());
   1116 	exports.JSXText = JSXText;
   1117 
   1118 
   1119 /***/ },
   1120 /* 6 */
   1121 /***/ function(module, exports) {
   1122 
   1123 	"use strict";
   1124 	Object.defineProperty(exports, "__esModule", { value: true });
   1125 	exports.JSXSyntax = {
   1126 	    JSXAttribute: 'JSXAttribute',
   1127 	    JSXClosingElement: 'JSXClosingElement',
   1128 	    JSXElement: 'JSXElement',
   1129 	    JSXEmptyExpression: 'JSXEmptyExpression',
   1130 	    JSXExpressionContainer: 'JSXExpressionContainer',
   1131 	    JSXIdentifier: 'JSXIdentifier',
   1132 	    JSXMemberExpression: 'JSXMemberExpression',
   1133 	    JSXNamespacedName: 'JSXNamespacedName',
   1134 	    JSXOpeningElement: 'JSXOpeningElement',
   1135 	    JSXSpreadAttribute: 'JSXSpreadAttribute',
   1136 	    JSXText: 'JSXText'
   1137 	};
   1138 
   1139 
   1140 /***/ },
   1141 /* 7 */
   1142 /***/ function(module, exports, __webpack_require__) {
   1143 
   1144 	"use strict";
   1145 	Object.defineProperty(exports, "__esModule", { value: true });
   1146 	var syntax_1 = __webpack_require__(2);
   1147 	/* tslint:disable:max-classes-per-file */
   1148 	var ArrayExpression = (function () {
   1149 	    function ArrayExpression(elements) {
   1150 	        this.type = syntax_1.Syntax.ArrayExpression;
   1151 	        this.elements = elements;
   1152 	    }
   1153 	    return ArrayExpression;
   1154 	}());
   1155 	exports.ArrayExpression = ArrayExpression;
   1156 	var ArrayPattern = (function () {
   1157 	    function ArrayPattern(elements) {
   1158 	        this.type = syntax_1.Syntax.ArrayPattern;
   1159 	        this.elements = elements;
   1160 	    }
   1161 	    return ArrayPattern;
   1162 	}());
   1163 	exports.ArrayPattern = ArrayPattern;
   1164 	var ArrowFunctionExpression = (function () {
   1165 	    function ArrowFunctionExpression(params, body, expression) {
   1166 	        this.type = syntax_1.Syntax.ArrowFunctionExpression;
   1167 	        this.id = null;
   1168 	        this.params = params;
   1169 	        this.body = body;
   1170 	        this.generator = false;
   1171 	        this.expression = expression;
   1172 	        this.async = false;
   1173 	    }
   1174 	    return ArrowFunctionExpression;
   1175 	}());
   1176 	exports.ArrowFunctionExpression = ArrowFunctionExpression;
   1177 	var AssignmentExpression = (function () {
   1178 	    function AssignmentExpression(operator, left, right) {
   1179 	        this.type = syntax_1.Syntax.AssignmentExpression;
   1180 	        this.operator = operator;
   1181 	        this.left = left;
   1182 	        this.right = right;
   1183 	    }
   1184 	    return AssignmentExpression;
   1185 	}());
   1186 	exports.AssignmentExpression = AssignmentExpression;
   1187 	var AssignmentPattern = (function () {
   1188 	    function AssignmentPattern(left, right) {
   1189 	        this.type = syntax_1.Syntax.AssignmentPattern;
   1190 	        this.left = left;
   1191 	        this.right = right;
   1192 	    }
   1193 	    return AssignmentPattern;
   1194 	}());
   1195 	exports.AssignmentPattern = AssignmentPattern;
   1196 	var AsyncArrowFunctionExpression = (function () {
   1197 	    function AsyncArrowFunctionExpression(params, body, expression) {
   1198 	        this.type = syntax_1.Syntax.ArrowFunctionExpression;
   1199 	        this.id = null;
   1200 	        this.params = params;
   1201 	        this.body = body;
   1202 	        this.generator = false;
   1203 	        this.expression = expression;
   1204 	        this.async = true;
   1205 	    }
   1206 	    return AsyncArrowFunctionExpression;
   1207 	}());
   1208 	exports.AsyncArrowFunctionExpression = AsyncArrowFunctionExpression;
   1209 	var AsyncFunctionDeclaration = (function () {
   1210 	    function AsyncFunctionDeclaration(id, params, body) {
   1211 	        this.type = syntax_1.Syntax.FunctionDeclaration;
   1212 	        this.id = id;
   1213 	        this.params = params;
   1214 	        this.body = body;
   1215 	        this.generator = false;
   1216 	        this.expression = false;
   1217 	        this.async = true;
   1218 	    }
   1219 	    return AsyncFunctionDeclaration;
   1220 	}());
   1221 	exports.AsyncFunctionDeclaration = AsyncFunctionDeclaration;
   1222 	var AsyncFunctionExpression = (function () {
   1223 	    function AsyncFunctionExpression(id, params, body) {
   1224 	        this.type = syntax_1.Syntax.FunctionExpression;
   1225 	        this.id = id;
   1226 	        this.params = params;
   1227 	        this.body = body;
   1228 	        this.generator = false;
   1229 	        this.expression = false;
   1230 	        this.async = true;
   1231 	    }
   1232 	    return AsyncFunctionExpression;
   1233 	}());
   1234 	exports.AsyncFunctionExpression = AsyncFunctionExpression;
   1235 	var AwaitExpression = (function () {
   1236 	    function AwaitExpression(argument) {
   1237 	        this.type = syntax_1.Syntax.AwaitExpression;
   1238 	        this.argument = argument;
   1239 	    }
   1240 	    return AwaitExpression;
   1241 	}());
   1242 	exports.AwaitExpression = AwaitExpression;
   1243 	var BinaryExpression = (function () {
   1244 	    function BinaryExpression(operator, left, right) {
   1245 	        var logical = (operator === '||' || operator === '&&');
   1246 	        this.type = logical ? syntax_1.Syntax.LogicalExpression : syntax_1.Syntax.BinaryExpression;
   1247 	        this.operator = operator;
   1248 	        this.left = left;
   1249 	        this.right = right;
   1250 	    }
   1251 	    return BinaryExpression;
   1252 	}());
   1253 	exports.BinaryExpression = BinaryExpression;
   1254 	var BlockStatement = (function () {
   1255 	    function BlockStatement(body) {
   1256 	        this.type = syntax_1.Syntax.BlockStatement;
   1257 	        this.body = body;
   1258 	    }
   1259 	    return BlockStatement;
   1260 	}());
   1261 	exports.BlockStatement = BlockStatement;
   1262 	var BreakStatement = (function () {
   1263 	    function BreakStatement(label) {
   1264 	        this.type = syntax_1.Syntax.BreakStatement;
   1265 	        this.label = label;
   1266 	    }
   1267 	    return BreakStatement;
   1268 	}());
   1269 	exports.BreakStatement = BreakStatement;
   1270 	var CallExpression = (function () {
   1271 	    function CallExpression(callee, args) {
   1272 	        this.type = syntax_1.Syntax.CallExpression;
   1273 	        this.callee = callee;
   1274 	        this.arguments = args;
   1275 	    }
   1276 	    return CallExpression;
   1277 	}());
   1278 	exports.CallExpression = CallExpression;
   1279 	var CatchClause = (function () {
   1280 	    function CatchClause(param, body) {
   1281 	        this.type = syntax_1.Syntax.CatchClause;
   1282 	        this.param = param;
   1283 	        this.body = body;
   1284 	    }
   1285 	    return CatchClause;
   1286 	}());
   1287 	exports.CatchClause = CatchClause;
   1288 	var ClassBody = (function () {
   1289 	    function ClassBody(body) {
   1290 	        this.type = syntax_1.Syntax.ClassBody;
   1291 	        this.body = body;
   1292 	    }
   1293 	    return ClassBody;
   1294 	}());
   1295 	exports.ClassBody = ClassBody;
   1296 	var ClassDeclaration = (function () {
   1297 	    function ClassDeclaration(id, superClass, body) {
   1298 	        this.type = syntax_1.Syntax.ClassDeclaration;
   1299 	        this.id = id;
   1300 	        this.superClass = superClass;
   1301 	        this.body = body;
   1302 	    }
   1303 	    return ClassDeclaration;
   1304 	}());
   1305 	exports.ClassDeclaration = ClassDeclaration;
   1306 	var ClassExpression = (function () {
   1307 	    function ClassExpression(id, superClass, body) {
   1308 	        this.type = syntax_1.Syntax.ClassExpression;
   1309 	        this.id = id;
   1310 	        this.superClass = superClass;
   1311 	        this.body = body;
   1312 	    }
   1313 	    return ClassExpression;
   1314 	}());
   1315 	exports.ClassExpression = ClassExpression;
   1316 	var ComputedMemberExpression = (function () {
   1317 	    function ComputedMemberExpression(object, property) {
   1318 	        this.type = syntax_1.Syntax.MemberExpression;
   1319 	        this.computed = true;
   1320 	        this.object = object;
   1321 	        this.property = property;
   1322 	    }
   1323 	    return ComputedMemberExpression;
   1324 	}());
   1325 	exports.ComputedMemberExpression = ComputedMemberExpression;
   1326 	var ConditionalExpression = (function () {
   1327 	    function ConditionalExpression(test, consequent, alternate) {
   1328 	        this.type = syntax_1.Syntax.ConditionalExpression;
   1329 	        this.test = test;
   1330 	        this.consequent = consequent;
   1331 	        this.alternate = alternate;
   1332 	    }
   1333 	    return ConditionalExpression;
   1334 	}());
   1335 	exports.ConditionalExpression = ConditionalExpression;
   1336 	var ContinueStatement = (function () {
   1337 	    function ContinueStatement(label) {
   1338 	        this.type = syntax_1.Syntax.ContinueStatement;
   1339 	        this.label = label;
   1340 	    }
   1341 	    return ContinueStatement;
   1342 	}());
   1343 	exports.ContinueStatement = ContinueStatement;
   1344 	var DebuggerStatement = (function () {
   1345 	    function DebuggerStatement() {
   1346 	        this.type = syntax_1.Syntax.DebuggerStatement;
   1347 	    }
   1348 	    return DebuggerStatement;
   1349 	}());
   1350 	exports.DebuggerStatement = DebuggerStatement;
   1351 	var Directive = (function () {
   1352 	    function Directive(expression, directive) {
   1353 	        this.type = syntax_1.Syntax.ExpressionStatement;
   1354 	        this.expression = expression;
   1355 	        this.directive = directive;
   1356 	    }
   1357 	    return Directive;
   1358 	}());
   1359 	exports.Directive = Directive;
   1360 	var DoWhileStatement = (function () {
   1361 	    function DoWhileStatement(body, test) {
   1362 	        this.type = syntax_1.Syntax.DoWhileStatement;
   1363 	        this.body = body;
   1364 	        this.test = test;
   1365 	    }
   1366 	    return DoWhileStatement;
   1367 	}());
   1368 	exports.DoWhileStatement = DoWhileStatement;
   1369 	var EmptyStatement = (function () {
   1370 	    function EmptyStatement() {
   1371 	        this.type = syntax_1.Syntax.EmptyStatement;
   1372 	    }
   1373 	    return EmptyStatement;
   1374 	}());
   1375 	exports.EmptyStatement = EmptyStatement;
   1376 	var ExportAllDeclaration = (function () {
   1377 	    function ExportAllDeclaration(source) {
   1378 	        this.type = syntax_1.Syntax.ExportAllDeclaration;
   1379 	        this.source = source;
   1380 	    }
   1381 	    return ExportAllDeclaration;
   1382 	}());
   1383 	exports.ExportAllDeclaration = ExportAllDeclaration;
   1384 	var ExportDefaultDeclaration = (function () {
   1385 	    function ExportDefaultDeclaration(declaration) {
   1386 	        this.type = syntax_1.Syntax.ExportDefaultDeclaration;
   1387 	        this.declaration = declaration;
   1388 	    }
   1389 	    return ExportDefaultDeclaration;
   1390 	}());
   1391 	exports.ExportDefaultDeclaration = ExportDefaultDeclaration;
   1392 	var ExportNamedDeclaration = (function () {
   1393 	    function ExportNamedDeclaration(declaration, specifiers, source) {
   1394 	        this.type = syntax_1.Syntax.ExportNamedDeclaration;
   1395 	        this.declaration = declaration;
   1396 	        this.specifiers = specifiers;
   1397 	        this.source = source;
   1398 	    }
   1399 	    return ExportNamedDeclaration;
   1400 	}());
   1401 	exports.ExportNamedDeclaration = ExportNamedDeclaration;
   1402 	var ExportSpecifier = (function () {
   1403 	    function ExportSpecifier(local, exported) {
   1404 	        this.type = syntax_1.Syntax.ExportSpecifier;
   1405 	        this.exported = exported;
   1406 	        this.local = local;
   1407 	    }
   1408 	    return ExportSpecifier;
   1409 	}());
   1410 	exports.ExportSpecifier = ExportSpecifier;
   1411 	var ExpressionStatement = (function () {
   1412 	    function ExpressionStatement(expression) {
   1413 	        this.type = syntax_1.Syntax.ExpressionStatement;
   1414 	        this.expression = expression;
   1415 	    }
   1416 	    return ExpressionStatement;
   1417 	}());
   1418 	exports.ExpressionStatement = ExpressionStatement;
   1419 	var ForInStatement = (function () {
   1420 	    function ForInStatement(left, right, body) {
   1421 	        this.type = syntax_1.Syntax.ForInStatement;
   1422 	        this.left = left;
   1423 	        this.right = right;
   1424 	        this.body = body;
   1425 	        this.each = false;
   1426 	    }
   1427 	    return ForInStatement;
   1428 	}());
   1429 	exports.ForInStatement = ForInStatement;
   1430 	var ForOfStatement = (function () {
   1431 	    function ForOfStatement(left, right, body) {
   1432 	        this.type = syntax_1.Syntax.ForOfStatement;
   1433 	        this.left = left;
   1434 	        this.right = right;
   1435 	        this.body = body;
   1436 	    }
   1437 	    return ForOfStatement;
   1438 	}());
   1439 	exports.ForOfStatement = ForOfStatement;
   1440 	var ForStatement = (function () {
   1441 	    function ForStatement(init, test, update, body) {
   1442 	        this.type = syntax_1.Syntax.ForStatement;
   1443 	        this.init = init;
   1444 	        this.test = test;
   1445 	        this.update = update;
   1446 	        this.body = body;
   1447 	    }
   1448 	    return ForStatement;
   1449 	}());
   1450 	exports.ForStatement = ForStatement;
   1451 	var FunctionDeclaration = (function () {
   1452 	    function FunctionDeclaration(id, params, body, generator) {
   1453 	        this.type = syntax_1.Syntax.FunctionDeclaration;
   1454 	        this.id = id;
   1455 	        this.params = params;
   1456 	        this.body = body;
   1457 	        this.generator = generator;
   1458 	        this.expression = false;
   1459 	        this.async = false;
   1460 	    }
   1461 	    return FunctionDeclaration;
   1462 	}());
   1463 	exports.FunctionDeclaration = FunctionDeclaration;
   1464 	var FunctionExpression = (function () {
   1465 	    function FunctionExpression(id, params, body, generator) {
   1466 	        this.type = syntax_1.Syntax.FunctionExpression;
   1467 	        this.id = id;
   1468 	        this.params = params;
   1469 	        this.body = body;
   1470 	        this.generator = generator;
   1471 	        this.expression = false;
   1472 	        this.async = false;
   1473 	    }
   1474 	    return FunctionExpression;
   1475 	}());
   1476 	exports.FunctionExpression = FunctionExpression;
   1477 	var Identifier = (function () {
   1478 	    function Identifier(name) {
   1479 	        this.type = syntax_1.Syntax.Identifier;
   1480 	        this.name = name;
   1481 	    }
   1482 	    return Identifier;
   1483 	}());
   1484 	exports.Identifier = Identifier;
   1485 	var IfStatement = (function () {
   1486 	    function IfStatement(test, consequent, alternate) {
   1487 	        this.type = syntax_1.Syntax.IfStatement;
   1488 	        this.test = test;
   1489 	        this.consequent = consequent;
   1490 	        this.alternate = alternate;
   1491 	    }
   1492 	    return IfStatement;
   1493 	}());
   1494 	exports.IfStatement = IfStatement;
   1495 	var ImportDeclaration = (function () {
   1496 	    function ImportDeclaration(specifiers, source) {
   1497 	        this.type = syntax_1.Syntax.ImportDeclaration;
   1498 	        this.specifiers = specifiers;
   1499 	        this.source = source;
   1500 	    }
   1501 	    return ImportDeclaration;
   1502 	}());
   1503 	exports.ImportDeclaration = ImportDeclaration;
   1504 	var ImportDefaultSpecifier = (function () {
   1505 	    function ImportDefaultSpecifier(local) {
   1506 	        this.type = syntax_1.Syntax.ImportDefaultSpecifier;
   1507 	        this.local = local;
   1508 	    }
   1509 	    return ImportDefaultSpecifier;
   1510 	}());
   1511 	exports.ImportDefaultSpecifier = ImportDefaultSpecifier;
   1512 	var ImportNamespaceSpecifier = (function () {
   1513 	    function ImportNamespaceSpecifier(local) {
   1514 	        this.type = syntax_1.Syntax.ImportNamespaceSpecifier;
   1515 	        this.local = local;
   1516 	    }
   1517 	    return ImportNamespaceSpecifier;
   1518 	}());
   1519 	exports.ImportNamespaceSpecifier = ImportNamespaceSpecifier;
   1520 	var ImportSpecifier = (function () {
   1521 	    function ImportSpecifier(local, imported) {
   1522 	        this.type = syntax_1.Syntax.ImportSpecifier;
   1523 	        this.local = local;
   1524 	        this.imported = imported;
   1525 	    }
   1526 	    return ImportSpecifier;
   1527 	}());
   1528 	exports.ImportSpecifier = ImportSpecifier;
   1529 	var LabeledStatement = (function () {
   1530 	    function LabeledStatement(label, body) {
   1531 	        this.type = syntax_1.Syntax.LabeledStatement;
   1532 	        this.label = label;
   1533 	        this.body = body;
   1534 	    }
   1535 	    return LabeledStatement;
   1536 	}());
   1537 	exports.LabeledStatement = LabeledStatement;
   1538 	var Literal = (function () {
   1539 	    function Literal(value, raw) {
   1540 	        this.type = syntax_1.Syntax.Literal;
   1541 	        this.value = value;
   1542 	        this.raw = raw;
   1543 	    }
   1544 	    return Literal;
   1545 	}());
   1546 	exports.Literal = Literal;
   1547 	var MetaProperty = (function () {
   1548 	    function MetaProperty(meta, property) {
   1549 	        this.type = syntax_1.Syntax.MetaProperty;
   1550 	        this.meta = meta;
   1551 	        this.property = property;
   1552 	    }
   1553 	    return MetaProperty;
   1554 	}());
   1555 	exports.MetaProperty = MetaProperty;
   1556 	var MethodDefinition = (function () {
   1557 	    function MethodDefinition(key, computed, value, kind, isStatic) {
   1558 	        this.type = syntax_1.Syntax.MethodDefinition;
   1559 	        this.key = key;
   1560 	        this.computed = computed;
   1561 	        this.value = value;
   1562 	        this.kind = kind;
   1563 	        this.static = isStatic;
   1564 	    }
   1565 	    return MethodDefinition;
   1566 	}());
   1567 	exports.MethodDefinition = MethodDefinition;
   1568 	var Module = (function () {
   1569 	    function Module(body) {
   1570 	        this.type = syntax_1.Syntax.Program;
   1571 	        this.body = body;
   1572 	        this.sourceType = 'module';
   1573 	    }
   1574 	    return Module;
   1575 	}());
   1576 	exports.Module = Module;
   1577 	var NewExpression = (function () {
   1578 	    function NewExpression(callee, args) {
   1579 	        this.type = syntax_1.Syntax.NewExpression;
   1580 	        this.callee = callee;
   1581 	        this.arguments = args;
   1582 	    }
   1583 	    return NewExpression;
   1584 	}());
   1585 	exports.NewExpression = NewExpression;
   1586 	var ObjectExpression = (function () {
   1587 	    function ObjectExpression(properties) {
   1588 	        this.type = syntax_1.Syntax.ObjectExpression;
   1589 	        this.properties = properties;
   1590 	    }
   1591 	    return ObjectExpression;
   1592 	}());
   1593 	exports.ObjectExpression = ObjectExpression;
   1594 	var ObjectPattern = (function () {
   1595 	    function ObjectPattern(properties) {
   1596 	        this.type = syntax_1.Syntax.ObjectPattern;
   1597 	        this.properties = properties;
   1598 	    }
   1599 	    return ObjectPattern;
   1600 	}());
   1601 	exports.ObjectPattern = ObjectPattern;
   1602 	var Property = (function () {
   1603 	    function Property(kind, key, computed, value, method, shorthand) {
   1604 	        this.type = syntax_1.Syntax.Property;
   1605 	        this.key = key;
   1606 	        this.computed = computed;
   1607 	        this.value = value;
   1608 	        this.kind = kind;
   1609 	        this.method = method;
   1610 	        this.shorthand = shorthand;
   1611 	    }
   1612 	    return Property;
   1613 	}());
   1614 	exports.Property = Property;
   1615 	var RegexLiteral = (function () {
   1616 	    function RegexLiteral(value, raw, pattern, flags) {
   1617 	        this.type = syntax_1.Syntax.Literal;
   1618 	        this.value = value;
   1619 	        this.raw = raw;
   1620 	        this.regex = { pattern: pattern, flags: flags };
   1621 	    }
   1622 	    return RegexLiteral;
   1623 	}());
   1624 	exports.RegexLiteral = RegexLiteral;
   1625 	var RestElement = (function () {
   1626 	    function RestElement(argument) {
   1627 	        this.type = syntax_1.Syntax.RestElement;
   1628 	        this.argument = argument;
   1629 	    }
   1630 	    return RestElement;
   1631 	}());
   1632 	exports.RestElement = RestElement;
   1633 	var ReturnStatement = (function () {
   1634 	    function ReturnStatement(argument) {
   1635 	        this.type = syntax_1.Syntax.ReturnStatement;
   1636 	        this.argument = argument;
   1637 	    }
   1638 	    return ReturnStatement;
   1639 	}());
   1640 	exports.ReturnStatement = ReturnStatement;
   1641 	var Script = (function () {
   1642 	    function Script(body) {
   1643 	        this.type = syntax_1.Syntax.Program;
   1644 	        this.body = body;
   1645 	        this.sourceType = 'script';
   1646 	    }
   1647 	    return Script;
   1648 	}());
   1649 	exports.Script = Script;
   1650 	var SequenceExpression = (function () {
   1651 	    function SequenceExpression(expressions) {
   1652 	        this.type = syntax_1.Syntax.SequenceExpression;
   1653 	        this.expressions = expressions;
   1654 	    }
   1655 	    return SequenceExpression;
   1656 	}());
   1657 	exports.SequenceExpression = SequenceExpression;
   1658 	var SpreadElement = (function () {
   1659 	    function SpreadElement(argument) {
   1660 	        this.type = syntax_1.Syntax.SpreadElement;
   1661 	        this.argument = argument;
   1662 	    }
   1663 	    return SpreadElement;
   1664 	}());
   1665 	exports.SpreadElement = SpreadElement;
   1666 	var StaticMemberExpression = (function () {
   1667 	    function StaticMemberExpression(object, property) {
   1668 	        this.type = syntax_1.Syntax.MemberExpression;
   1669 	        this.computed = false;
   1670 	        this.object = object;
   1671 	        this.property = property;
   1672 	    }
   1673 	    return StaticMemberExpression;
   1674 	}());
   1675 	exports.StaticMemberExpression = StaticMemberExpression;
   1676 	var Super = (function () {
   1677 	    function Super() {
   1678 	        this.type = syntax_1.Syntax.Super;
   1679 	    }
   1680 	    return Super;
   1681 	}());
   1682 	exports.Super = Super;
   1683 	var SwitchCase = (function () {
   1684 	    function SwitchCase(test, consequent) {
   1685 	        this.type = syntax_1.Syntax.SwitchCase;
   1686 	        this.test = test;
   1687 	        this.consequent = consequent;
   1688 	    }
   1689 	    return SwitchCase;
   1690 	}());
   1691 	exports.SwitchCase = SwitchCase;
   1692 	var SwitchStatement = (function () {
   1693 	    function SwitchStatement(discriminant, cases) {
   1694 	        this.type = syntax_1.Syntax.SwitchStatement;
   1695 	        this.discriminant = discriminant;
   1696 	        this.cases = cases;
   1697 	    }
   1698 	    return SwitchStatement;
   1699 	}());
   1700 	exports.SwitchStatement = SwitchStatement;
   1701 	var TaggedTemplateExpression = (function () {
   1702 	    function TaggedTemplateExpression(tag, quasi) {
   1703 	        this.type = syntax_1.Syntax.TaggedTemplateExpression;
   1704 	        this.tag = tag;
   1705 	        this.quasi = quasi;
   1706 	    }
   1707 	    return TaggedTemplateExpression;
   1708 	}());
   1709 	exports.TaggedTemplateExpression = TaggedTemplateExpression;
   1710 	var TemplateElement = (function () {
   1711 	    function TemplateElement(value, tail) {
   1712 	        this.type = syntax_1.Syntax.TemplateElement;
   1713 	        this.value = value;
   1714 	        this.tail = tail;
   1715 	    }
   1716 	    return TemplateElement;
   1717 	}());
   1718 	exports.TemplateElement = TemplateElement;
   1719 	var TemplateLiteral = (function () {
   1720 	    function TemplateLiteral(quasis, expressions) {
   1721 	        this.type = syntax_1.Syntax.TemplateLiteral;
   1722 	        this.quasis = quasis;
   1723 	        this.expressions = expressions;
   1724 	    }
   1725 	    return TemplateLiteral;
   1726 	}());
   1727 	exports.TemplateLiteral = TemplateLiteral;
   1728 	var ThisExpression = (function () {
   1729 	    function ThisExpression() {
   1730 	        this.type = syntax_1.Syntax.ThisExpression;
   1731 	    }
   1732 	    return ThisExpression;
   1733 	}());
   1734 	exports.ThisExpression = ThisExpression;
   1735 	var ThrowStatement = (function () {
   1736 	    function ThrowStatement(argument) {
   1737 	        this.type = syntax_1.Syntax.ThrowStatement;
   1738 	        this.argument = argument;
   1739 	    }
   1740 	    return ThrowStatement;
   1741 	}());
   1742 	exports.ThrowStatement = ThrowStatement;
   1743 	var TryStatement = (function () {
   1744 	    function TryStatement(block, handler, finalizer) {
   1745 	        this.type = syntax_1.Syntax.TryStatement;
   1746 	        this.block = block;
   1747 	        this.handler = handler;
   1748 	        this.finalizer = finalizer;
   1749 	    }
   1750 	    return TryStatement;
   1751 	}());
   1752 	exports.TryStatement = TryStatement;
   1753 	var UnaryExpression = (function () {
   1754 	    function UnaryExpression(operator, argument) {
   1755 	        this.type = syntax_1.Syntax.UnaryExpression;
   1756 	        this.operator = operator;
   1757 	        this.argument = argument;
   1758 	        this.prefix = true;
   1759 	    }
   1760 	    return UnaryExpression;
   1761 	}());
   1762 	exports.UnaryExpression = UnaryExpression;
   1763 	var UpdateExpression = (function () {
   1764 	    function UpdateExpression(operator, argument, prefix) {
   1765 	        this.type = syntax_1.Syntax.UpdateExpression;
   1766 	        this.operator = operator;
   1767 	        this.argument = argument;
   1768 	        this.prefix = prefix;
   1769 	    }
   1770 	    return UpdateExpression;
   1771 	}());
   1772 	exports.UpdateExpression = UpdateExpression;
   1773 	var VariableDeclaration = (function () {
   1774 	    function VariableDeclaration(declarations, kind) {
   1775 	        this.type = syntax_1.Syntax.VariableDeclaration;
   1776 	        this.declarations = declarations;
   1777 	        this.kind = kind;
   1778 	    }
   1779 	    return VariableDeclaration;
   1780 	}());
   1781 	exports.VariableDeclaration = VariableDeclaration;
   1782 	var VariableDeclarator = (function () {
   1783 	    function VariableDeclarator(id, init) {
   1784 	        this.type = syntax_1.Syntax.VariableDeclarator;
   1785 	        this.id = id;
   1786 	        this.init = init;
   1787 	    }
   1788 	    return VariableDeclarator;
   1789 	}());
   1790 	exports.VariableDeclarator = VariableDeclarator;
   1791 	var WhileStatement = (function () {
   1792 	    function WhileStatement(test, body) {
   1793 	        this.type = syntax_1.Syntax.WhileStatement;
   1794 	        this.test = test;
   1795 	        this.body = body;
   1796 	    }
   1797 	    return WhileStatement;
   1798 	}());
   1799 	exports.WhileStatement = WhileStatement;
   1800 	var WithStatement = (function () {
   1801 	    function WithStatement(object, body) {
   1802 	        this.type = syntax_1.Syntax.WithStatement;
   1803 	        this.object = object;
   1804 	        this.body = body;
   1805 	    }
   1806 	    return WithStatement;
   1807 	}());
   1808 	exports.WithStatement = WithStatement;
   1809 	var YieldExpression = (function () {
   1810 	    function YieldExpression(argument, delegate) {
   1811 	        this.type = syntax_1.Syntax.YieldExpression;
   1812 	        this.argument = argument;
   1813 	        this.delegate = delegate;
   1814 	    }
   1815 	    return YieldExpression;
   1816 	}());
   1817 	exports.YieldExpression = YieldExpression;
   1818 
   1819 
   1820 /***/ },
   1821 /* 8 */
   1822 /***/ function(module, exports, __webpack_require__) {
   1823 
   1824 	"use strict";
   1825 	Object.defineProperty(exports, "__esModule", { value: true });
   1826 	var assert_1 = __webpack_require__(9);
   1827 	var error_handler_1 = __webpack_require__(10);
   1828 	var messages_1 = __webpack_require__(11);
   1829 	var Node = __webpack_require__(7);
   1830 	var scanner_1 = __webpack_require__(12);
   1831 	var syntax_1 = __webpack_require__(2);
   1832 	var token_1 = __webpack_require__(13);
   1833 	var ArrowParameterPlaceHolder = 'ArrowParameterPlaceHolder';
   1834 	var Parser = (function () {
   1835 	    function Parser(code, options, delegate) {
   1836 	        if (options === void 0) { options = {}; }
   1837 	        this.config = {
   1838 	            range: (typeof options.range === 'boolean') && options.range,
   1839 	            loc: (typeof options.loc === 'boolean') && options.loc,
   1840 	            source: null,
   1841 	            tokens: (typeof options.tokens === 'boolean') && options.tokens,
   1842 	            comment: (typeof options.comment === 'boolean') && options.comment,
   1843 	            tolerant: (typeof options.tolerant === 'boolean') && options.tolerant
   1844 	        };
   1845 	        if (this.config.loc && options.source && options.source !== null) {
   1846 	            this.config.source = String(options.source);
   1847 	        }
   1848 	        this.delegate = delegate;
   1849 	        this.errorHandler = new error_handler_1.ErrorHandler();
   1850 	        this.errorHandler.tolerant = this.config.tolerant;
   1851 	        this.scanner = new scanner_1.Scanner(code, this.errorHandler);
   1852 	        this.scanner.trackComment = this.config.comment;
   1853 	        this.operatorPrecedence = {
   1854 	            ')': 0,
   1855 	            ';': 0,
   1856 	            ',': 0,
   1857 	            '=': 0,
   1858 	            ']': 0,
   1859 	            '||': 1,
   1860 	            '&&': 2,
   1861 	            '|': 3,
   1862 	            '^': 4,
   1863 	            '&': 5,
   1864 	            '==': 6,
   1865 	            '!=': 6,
   1866 	            '===': 6,
   1867 	            '!==': 6,
   1868 	            '<': 7,
   1869 	            '>': 7,
   1870 	            '<=': 7,
   1871 	            '>=': 7,
   1872 	            '<<': 8,
   1873 	            '>>': 8,
   1874 	            '>>>': 8,
   1875 	            '+': 9,
   1876 	            '-': 9,
   1877 	            '*': 11,
   1878 	            '/': 11,
   1879 	            '%': 11
   1880 	        };
   1881 	        this.lookahead = {
   1882 	            type: 2 /* EOF */,
   1883 	            value: '',
   1884 	            lineNumber: this.scanner.lineNumber,
   1885 	            lineStart: 0,
   1886 	            start: 0,
   1887 	            end: 0
   1888 	        };
   1889 	        this.hasLineTerminator = false;
   1890 	        this.context = {
   1891 	            isModule: false,
   1892 	            await: false,
   1893 	            allowIn: true,
   1894 	            allowStrictDirective: true,
   1895 	            allowYield: true,
   1896 	            firstCoverInitializedNameError: null,
   1897 	            isAssignmentTarget: false,
   1898 	            isBindingElement: false,
   1899 	            inFunctionBody: false,
   1900 	            inIteration: false,
   1901 	            inSwitch: false,
   1902 	            labelSet: {},
   1903 	            strict: false
   1904 	        };
   1905 	        this.tokens = [];
   1906 	        this.startMarker = {
   1907 	            index: 0,
   1908 	            line: this.scanner.lineNumber,
   1909 	            column: 0
   1910 	        };
   1911 	        this.lastMarker = {
   1912 	            index: 0,
   1913 	            line: this.scanner.lineNumber,
   1914 	            column: 0
   1915 	        };
   1916 	        this.nextToken();
   1917 	        this.lastMarker = {
   1918 	            index: this.scanner.index,
   1919 	            line: this.scanner.lineNumber,
   1920 	            column: this.scanner.index - this.scanner.lineStart
   1921 	        };
   1922 	    }
   1923 	    Parser.prototype.throwError = function (messageFormat) {
   1924 	        var values = [];
   1925 	        for (var _i = 1; _i < arguments.length; _i++) {
   1926 	            values[_i - 1] = arguments[_i];
   1927 	        }
   1928 	        var args = Array.prototype.slice.call(arguments, 1);
   1929 	        var msg = messageFormat.replace(/%(\d)/g, function (whole, idx) {
   1930 	            assert_1.assert(idx < args.length, 'Message reference must be in range');
   1931 	            return args[idx];
   1932 	        });
   1933 	        var index = this.lastMarker.index;
   1934 	        var line = this.lastMarker.line;
   1935 	        var column = this.lastMarker.column + 1;
   1936 	        throw this.errorHandler.createError(index, line, column, msg);
   1937 	    };
   1938 	    Parser.prototype.tolerateError = function (messageFormat) {
   1939 	        var values = [];
   1940 	        for (var _i = 1; _i < arguments.length; _i++) {
   1941 	            values[_i - 1] = arguments[_i];
   1942 	        }
   1943 	        var args = Array.prototype.slice.call(arguments, 1);
   1944 	        var msg = messageFormat.replace(/%(\d)/g, function (whole, idx) {
   1945 	            assert_1.assert(idx < args.length, 'Message reference must be in range');
   1946 	            return args[idx];
   1947 	        });
   1948 	        var index = this.lastMarker.index;
   1949 	        var line = this.scanner.lineNumber;
   1950 	        var column = this.lastMarker.column + 1;
   1951 	        this.errorHandler.tolerateError(index, line, column, msg);
   1952 	    };
   1953 	    // Throw an exception because of the token.
   1954 	    Parser.prototype.unexpectedTokenError = function (token, message) {
   1955 	        var msg = message || messages_1.Messages.UnexpectedToken;
   1956 	        var value;
   1957 	        if (token) {
   1958 	            if (!message) {
   1959 	                msg = (token.type === 2 /* EOF */) ? messages_1.Messages.UnexpectedEOS :
   1960 	                    (token.type === 3 /* Identifier */) ? messages_1.Messages.UnexpectedIdentifier :
   1961 	                        (token.type === 6 /* NumericLiteral */) ? messages_1.Messages.UnexpectedNumber :
   1962 	                            (token.type === 8 /* StringLiteral */) ? messages_1.Messages.UnexpectedString :
   1963 	                                (token.type === 10 /* Template */) ? messages_1.Messages.UnexpectedTemplate :
   1964 	                                    messages_1.Messages.UnexpectedToken;
   1965 	                if (token.type === 4 /* Keyword */) {
   1966 	                    if (this.scanner.isFutureReservedWord(token.value)) {
   1967 	                        msg = messages_1.Messages.UnexpectedReserved;
   1968 	                    }
   1969 	                    else if (this.context.strict && this.scanner.isStrictModeReservedWord(token.value)) {
   1970 	                        msg = messages_1.Messages.StrictReservedWord;
   1971 	                    }
   1972 	                }
   1973 	            }
   1974 	            value = token.value;
   1975 	        }
   1976 	        else {
   1977 	            value = 'ILLEGAL';
   1978 	        }
   1979 	        msg = msg.replace('%0', value);
   1980 	        if (token && typeof token.lineNumber === 'number') {
   1981 	            var index = token.start;
   1982 	            var line = token.lineNumber;
   1983 	            var lastMarkerLineStart = this.lastMarker.index - this.lastMarker.column;
   1984 	            var column = token.start - lastMarkerLineStart + 1;
   1985 	            return this.errorHandler.createError(index, line, column, msg);
   1986 	        }
   1987 	        else {
   1988 	            var index = this.lastMarker.index;
   1989 	            var line = this.lastMarker.line;
   1990 	            var column = this.lastMarker.column + 1;
   1991 	            return this.errorHandler.createError(index, line, column, msg);
   1992 	        }
   1993 	    };
   1994 	    Parser.prototype.throwUnexpectedToken = function (token, message) {
   1995 	        throw this.unexpectedTokenError(token, message);
   1996 	    };
   1997 	    Parser.prototype.tolerateUnexpectedToken = function (token, message) {
   1998 	        this.errorHandler.tolerate(this.unexpectedTokenError(token, message));
   1999 	    };
   2000 	    Parser.prototype.collectComments = function () {
   2001 	        if (!this.config.comment) {
   2002 	            this.scanner.scanComments();
   2003 	        }
   2004 	        else {
   2005 	            var comments = this.scanner.scanComments();
   2006 	            if (comments.length > 0 && this.delegate) {
   2007 	                for (var i = 0; i < comments.length; ++i) {
   2008 	                    var e = comments[i];
   2009 	                    var node = void 0;
   2010 	                    node = {
   2011 	                        type: e.multiLine ? 'BlockComment' : 'LineComment',
   2012 	                        value: this.scanner.source.slice(e.slice[0], e.slice[1])
   2013 	                    };
   2014 	                    if (this.config.range) {
   2015 	                        node.range = e.range;
   2016 	                    }
   2017 	                    if (this.config.loc) {
   2018 	                        node.loc = e.loc;
   2019 	                    }
   2020 	                    var metadata = {
   2021 	                        start: {
   2022 	                            line: e.loc.start.line,
   2023 	                            column: e.loc.start.column,
   2024 	                            offset: e.range[0]
   2025 	                        },
   2026 	                        end: {
   2027 	                            line: e.loc.end.line,
   2028 	                            column: e.loc.end.column,
   2029 	                            offset: e.range[1]
   2030 	                        }
   2031 	                    };
   2032 	                    this.delegate(node, metadata);
   2033 	                }
   2034 	            }
   2035 	        }
   2036 	    };
   2037 	    // From internal representation to an external structure
   2038 	    Parser.prototype.getTokenRaw = function (token) {
   2039 	        return this.scanner.source.slice(token.start, token.end);
   2040 	    };
   2041 	    Parser.prototype.convertToken = function (token) {
   2042 	        var t = {
   2043 	            type: token_1.TokenName[token.type],
   2044 	            value: this.getTokenRaw(token)
   2045 	        };
   2046 	        if (this.config.range) {
   2047 	            t.range = [token.start, token.end];
   2048 	        }
   2049 	        if (this.config.loc) {
   2050 	            t.loc = {
   2051 	                start: {
   2052 	                    line: this.startMarker.line,
   2053 	                    column: this.startMarker.column
   2054 	                },
   2055 	                end: {
   2056 	                    line: this.scanner.lineNumber,
   2057 	                    column: this.scanner.index - this.scanner.lineStart
   2058 	                }
   2059 	            };
   2060 	        }
   2061 	        if (token.type === 9 /* RegularExpression */) {
   2062 	            var pattern = token.pattern;
   2063 	            var flags = token.flags;
   2064 	            t.regex = { pattern: pattern, flags: flags };
   2065 	        }
   2066 	        return t;
   2067 	    };
   2068 	    Parser.prototype.nextToken = function () {
   2069 	        var token = this.lookahead;
   2070 	        this.lastMarker.index = this.scanner.index;
   2071 	        this.lastMarker.line = this.scanner.lineNumber;
   2072 	        this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
   2073 	        this.collectComments();
   2074 	        if (this.scanner.index !== this.startMarker.index) {
   2075 	            this.startMarker.index = this.scanner.index;
   2076 	            this.startMarker.line = this.scanner.lineNumber;
   2077 	            this.startMarker.column = this.scanner.index - this.scanner.lineStart;
   2078 	        }
   2079 	        var next = this.scanner.lex();
   2080 	        this.hasLineTerminator = (token.lineNumber !== next.lineNumber);
   2081 	        if (next && this.context.strict && next.type === 3 /* Identifier */) {
   2082 	            if (this.scanner.isStrictModeReservedWord(next.value)) {
   2083 	                next.type = 4 /* Keyword */;
   2084 	            }
   2085 	        }
   2086 	        this.lookahead = next;
   2087 	        if (this.config.tokens && next.type !== 2 /* EOF */) {
   2088 	            this.tokens.push(this.convertToken(next));
   2089 	        }
   2090 	        return token;
   2091 	    };
   2092 	    Parser.prototype.nextRegexToken = function () {
   2093 	        this.collectComments();
   2094 	        var token = this.scanner.scanRegExp();
   2095 	        if (this.config.tokens) {
   2096 	            // Pop the previous token, '/' or '/='
   2097 	            // This is added from the lookahead token.
   2098 	            this.tokens.pop();
   2099 	            this.tokens.push(this.convertToken(token));
   2100 	        }
   2101 	        // Prime the next lookahead.
   2102 	        this.lookahead = token;
   2103 	        this.nextToken();
   2104 	        return token;
   2105 	    };
   2106 	    Parser.prototype.createNode = function () {
   2107 	        return {
   2108 	            index: this.startMarker.index,
   2109 	            line: this.startMarker.line,
   2110 	            column: this.startMarker.column
   2111 	        };
   2112 	    };
   2113 	    Parser.prototype.startNode = function (token, lastLineStart) {
   2114 	        if (lastLineStart === void 0) { lastLineStart = 0; }
   2115 	        var column = token.start - token.lineStart;
   2116 	        var line = token.lineNumber;
   2117 	        if (column < 0) {
   2118 	            column += lastLineStart;
   2119 	            line--;
   2120 	        }
   2121 	        return {
   2122 	            index: token.start,
   2123 	            line: line,
   2124 	            column: column
   2125 	        };
   2126 	    };
   2127 	    Parser.prototype.finalize = function (marker, node) {
   2128 	        if (this.config.range) {
   2129 	            node.range = [marker.index, this.lastMarker.index];
   2130 	        }
   2131 	        if (this.config.loc) {
   2132 	            node.loc = {
   2133 	                start: {
   2134 	                    line: marker.line,
   2135 	                    column: marker.column,
   2136 	                },
   2137 	                end: {
   2138 	                    line: this.lastMarker.line,
   2139 	                    column: this.lastMarker.column
   2140 	                }
   2141 	            };
   2142 	            if (this.config.source) {
   2143 	                node.loc.source = this.config.source;
   2144 	            }
   2145 	        }
   2146 	        if (this.delegate) {
   2147 	            var metadata = {
   2148 	                start: {
   2149 	                    line: marker.line,
   2150 	                    column: marker.column,
   2151 	                    offset: marker.index
   2152 	                },
   2153 	                end: {
   2154 	                    line: this.lastMarker.line,
   2155 	                    column: this.lastMarker.column,
   2156 	                    offset: this.lastMarker.index
   2157 	                }
   2158 	            };
   2159 	            this.delegate(node, metadata);
   2160 	        }
   2161 	        return node;
   2162 	    };
   2163 	    // Expect the next token to match the specified punctuator.
   2164 	    // If not, an exception will be thrown.
   2165 	    Parser.prototype.expect = function (value) {
   2166 	        var token = this.nextToken();
   2167 	        if (token.type !== 7 /* Punctuator */ || token.value !== value) {
   2168 	            this.throwUnexpectedToken(token);
   2169 	        }
   2170 	    };
   2171 	    // Quietly expect a comma when in tolerant mode, otherwise delegates to expect().
   2172 	    Parser.prototype.expectCommaSeparator = function () {
   2173 	        if (this.config.tolerant) {
   2174 	            var token = this.lookahead;
   2175 	            if (token.type === 7 /* Punctuator */ && token.value === ',') {
   2176 	                this.nextToken();
   2177 	            }
   2178 	            else if (token.type === 7 /* Punctuator */ && token.value === ';') {
   2179 	                this.nextToken();
   2180 	                this.tolerateUnexpectedToken(token);
   2181 	            }
   2182 	            else {
   2183 	                this.tolerateUnexpectedToken(token, messages_1.Messages.UnexpectedToken);
   2184 	            }
   2185 	        }
   2186 	        else {
   2187 	            this.expect(',');
   2188 	        }
   2189 	    };
   2190 	    // Expect the next token to match the specified keyword.
   2191 	    // If not, an exception will be thrown.
   2192 	    Parser.prototype.expectKeyword = function (keyword) {
   2193 	        var token = this.nextToken();
   2194 	        if (token.type !== 4 /* Keyword */ || token.value !== keyword) {
   2195 	            this.throwUnexpectedToken(token);
   2196 	        }
   2197 	    };
   2198 	    // Return true if the next token matches the specified punctuator.
   2199 	    Parser.prototype.match = function (value) {
   2200 	        return this.lookahead.type === 7 /* Punctuator */ && this.lookahead.value === value;
   2201 	    };
   2202 	    // Return true if the next token matches the specified keyword
   2203 	    Parser.prototype.matchKeyword = function (keyword) {
   2204 	        return this.lookahead.type === 4 /* Keyword */ && this.lookahead.value === keyword;
   2205 	    };
   2206 	    // Return true if the next token matches the specified contextual keyword
   2207 	    // (where an identifier is sometimes a keyword depending on the context)
   2208 	    Parser.prototype.matchContextualKeyword = function (keyword) {
   2209 	        return this.lookahead.type === 3 /* Identifier */ && this.lookahead.value === keyword;
   2210 	    };
   2211 	    // Return true if the next token is an assignment operator
   2212 	    Parser.prototype.matchAssign = function () {
   2213 	        if (this.lookahead.type !== 7 /* Punctuator */) {
   2214 	            return false;
   2215 	        }
   2216 	        var op = this.lookahead.value;
   2217 	        return op === '=' ||
   2218 	            op === '*=' ||
   2219 	            op === '**=' ||
   2220 	            op === '/=' ||
   2221 	            op === '%=' ||
   2222 	            op === '+=' ||
   2223 	            op === '-=' ||
   2224 	            op === '<<=' ||
   2225 	            op === '>>=' ||
   2226 	            op === '>>>=' ||
   2227 	            op === '&=' ||
   2228 	            op === '^=' ||
   2229 	            op === '|=';
   2230 	    };
   2231 	    // Cover grammar support.
   2232 	    //
   2233 	    // When an assignment expression position starts with an left parenthesis, the determination of the type
   2234 	    // of the syntax is to be deferred arbitrarily long until the end of the parentheses pair (plus a lookahead)
   2235 	    // or the first comma. This situation also defers the determination of all the expressions nested in the pair.
   2236 	    //
   2237 	    // There are three productions that can be parsed in a parentheses pair that needs to be determined
   2238 	    // after the outermost pair is closed. They are:
   2239 	    //
   2240 	    //   1. AssignmentExpression
   2241 	    //   2. BindingElements
   2242 	    //   3. AssignmentTargets
   2243 	    //
   2244 	    // In order to avoid exponential backtracking, we use two flags to denote if the production can be
   2245 	    // binding element or assignment target.
   2246 	    //
   2247 	    // The three productions have the relationship:
   2248 	    //
   2249 	    //   BindingElements ⊆ AssignmentTargets ⊆ AssignmentExpression
   2250 	    //
   2251 	    // with a single exception that CoverInitializedName when used directly in an Expression, generates
   2252 	    // an early error. Therefore, we need the third state, firstCoverInitializedNameError, to track the
   2253 	    // first usage of CoverInitializedName and report it when we reached the end of the parentheses pair.
   2254 	    //
   2255 	    // isolateCoverGrammar function runs the given parser function with a new cover grammar context, and it does not
   2256 	    // effect the current flags. This means the production the parser parses is only used as an expression. Therefore
   2257 	    // the CoverInitializedName check is conducted.
   2258 	    //
   2259 	    // inheritCoverGrammar function runs the given parse function with a new cover grammar context, and it propagates
   2260 	    // the flags outside of the parser. This means the production the parser parses is used as a part of a potential
   2261 	    // pattern. The CoverInitializedName check is deferred.
   2262 	    Parser.prototype.isolateCoverGrammar = function (parseFunction) {
   2263 	        var previousIsBindingElement = this.context.isBindingElement;
   2264 	        var previousIsAssignmentTarget = this.context.isAssignmentTarget;
   2265 	        var previousFirstCoverInitializedNameError = this.context.firstCoverInitializedNameError;
   2266 	        this.context.isBindingElement = true;
   2267 	        this.context.isAssignmentTarget = true;
   2268 	        this.context.firstCoverInitializedNameError = null;
   2269 	        var result = parseFunction.call(this);
   2270 	        if (this.context.firstCoverInitializedNameError !== null) {
   2271 	            this.throwUnexpectedToken(this.context.firstCoverInitializedNameError);
   2272 	        }
   2273 	        this.context.isBindingElement = previousIsBindingElement;
   2274 	        this.context.isAssignmentTarget = previousIsAssignmentTarget;
   2275 	        this.context.firstCoverInitializedNameError = previousFirstCoverInitializedNameError;
   2276 	        return result;
   2277 	    };
   2278 	    Parser.prototype.inheritCoverGrammar = function (parseFunction) {
   2279 	        var previousIsBindingElement = this.context.isBindingElement;
   2280 	        var previousIsAssignmentTarget = this.context.isAssignmentTarget;
   2281 	        var previousFirstCoverInitializedNameError = this.context.firstCoverInitializedNameError;
   2282 	        this.context.isBindingElement = true;
   2283 	        this.context.isAssignmentTarget = true;
   2284 	        this.context.firstCoverInitializedNameError = null;
   2285 	        var result = parseFunction.call(this);
   2286 	        this.context.isBindingElement = this.context.isBindingElement && previousIsBindingElement;
   2287 	        this.context.isAssignmentTarget = this.context.isAssignmentTarget && previousIsAssignmentTarget;
   2288 	        this.context.firstCoverInitializedNameError = previousFirstCoverInitializedNameError || this.context.firstCoverInitializedNameError;
   2289 	        return result;
   2290 	    };
   2291 	    Parser.prototype.consumeSemicolon = function () {
   2292 	        if (this.match(';')) {
   2293 	            this.nextToken();
   2294 	        }
   2295 	        else if (!this.hasLineTerminator) {
   2296 	            if (this.lookahead.type !== 2 /* EOF */ && !this.match('}')) {
   2297 	                this.throwUnexpectedToken(this.lookahead);
   2298 	            }
   2299 	            this.lastMarker.index = this.startMarker.index;
   2300 	            this.lastMarker.line = this.startMarker.line;
   2301 	            this.lastMarker.column = this.startMarker.column;
   2302 	        }
   2303 	    };
   2304 	    // https://tc39.github.io/ecma262/#sec-primary-expression
   2305 	    Parser.prototype.parsePrimaryExpression = function () {
   2306 	        var node = this.createNode();
   2307 	        var expr;
   2308 	        var token, raw;
   2309 	        switch (this.lookahead.type) {
   2310 	            case 3 /* Identifier */:
   2311 	                if ((this.context.isModule || this.context.await) && this.lookahead.value === 'await') {
   2312 	                    this.tolerateUnexpectedToken(this.lookahead);
   2313 	                }
   2314 	                expr = this.matchAsyncFunction() ? this.parseFunctionExpression() : this.finalize(node, new Node.Identifier(this.nextToken().value));
   2315 	                break;
   2316 	            case 6 /* NumericLiteral */:
   2317 	            case 8 /* StringLiteral */:
   2318 	                if (this.context.strict && this.lookahead.octal) {
   2319 	                    this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.StrictOctalLiteral);
   2320 	                }
   2321 	                this.context.isAssignmentTarget = false;
   2322 	                this.context.isBindingElement = false;
   2323 	                token = this.nextToken();
   2324 	                raw = this.getTokenRaw(token);
   2325 	                expr = this.finalize(node, new Node.Literal(token.value, raw));
   2326 	                break;
   2327 	            case 1 /* BooleanLiteral */:
   2328 	                this.context.isAssignmentTarget = false;
   2329 	                this.context.isBindingElement = false;
   2330 	                token = this.nextToken();
   2331 	                raw = this.getTokenRaw(token);
   2332 	                expr = this.finalize(node, new Node.Literal(token.value === 'true', raw));
   2333 	                break;
   2334 	            case 5 /* NullLiteral */:
   2335 	                this.context.isAssignmentTarget = false;
   2336 	                this.context.isBindingElement = false;
   2337 	                token = this.nextToken();
   2338 	                raw = this.getTokenRaw(token);
   2339 	                expr = this.finalize(node, new Node.Literal(null, raw));
   2340 	                break;
   2341 	            case 10 /* Template */:
   2342 	                expr = this.parseTemplateLiteral();
   2343 	                break;
   2344 	            case 7 /* Punctuator */:
   2345 	                switch (this.lookahead.value) {
   2346 	                    case '(':
   2347 	                        this.context.isBindingElement = false;
   2348 	                        expr = this.inheritCoverGrammar(this.parseGroupExpression);
   2349 	                        break;
   2350 	                    case '[':
   2351 	                        expr = this.inheritCoverGrammar(this.parseArrayInitializer);
   2352 	                        break;
   2353 	                    case '{':
   2354 	                        expr = this.inheritCoverGrammar(this.parseObjectInitializer);
   2355 	                        break;
   2356 	                    case '/':
   2357 	                    case '/=':
   2358 	                        this.context.isAssignmentTarget = false;
   2359 	                        this.context.isBindingElement = false;
   2360 	                        this.scanner.index = this.startMarker.index;
   2361 	                        token = this.nextRegexToken();
   2362 	                        raw = this.getTokenRaw(token);
   2363 	                        expr = this.finalize(node, new Node.RegexLiteral(token.regex, raw, token.pattern, token.flags));
   2364 	                        break;
   2365 	                    default:
   2366 	                        expr = this.throwUnexpectedToken(this.nextToken());
   2367 	                }
   2368 	                break;
   2369 	            case 4 /* Keyword */:
   2370 	                if (!this.context.strict && this.context.allowYield && this.matchKeyword('yield')) {
   2371 	                    expr = this.parseIdentifierName();
   2372 	                }
   2373 	                else if (!this.context.strict && this.matchKeyword('let')) {
   2374 	                    expr = this.finalize(node, new Node.Identifier(this.nextToken().value));
   2375 	                }
   2376 	                else {
   2377 	                    this.context.isAssignmentTarget = false;
   2378 	                    this.context.isBindingElement = false;
   2379 	                    if (this.matchKeyword('function')) {
   2380 	                        expr = this.parseFunctionExpression();
   2381 	                    }
   2382 	                    else if (this.matchKeyword('this')) {
   2383 	                        this.nextToken();
   2384 	                        expr = this.finalize(node, new Node.ThisExpression());
   2385 	                    }
   2386 	                    else if (this.matchKeyword('class')) {
   2387 	                        expr = this.parseClassExpression();
   2388 	                    }
   2389 	                    else {
   2390 	                        expr = this.throwUnexpectedToken(this.nextToken());
   2391 	                    }
   2392 	                }
   2393 	                break;
   2394 	            default:
   2395 	                expr = this.throwUnexpectedToken(this.nextToken());
   2396 	        }
   2397 	        return expr;
   2398 	    };
   2399 	    // https://tc39.github.io/ecma262/#sec-array-initializer
   2400 	    Parser.prototype.parseSpreadElement = function () {
   2401 	        var node = this.createNode();
   2402 	        this.expect('...');
   2403 	        var arg = this.inheritCoverGrammar(this.parseAssignmentExpression);
   2404 	        return this.finalize(node, new Node.SpreadElement(arg));
   2405 	    };
   2406 	    Parser.prototype.parseArrayInitializer = function () {
   2407 	        var node = this.createNode();
   2408 	        var elements = [];
   2409 	        this.expect('[');
   2410 	        while (!this.match(']')) {
   2411 	            if (this.match(',')) {
   2412 	                this.nextToken();
   2413 	                elements.push(null);
   2414 	            }
   2415 	            else if (this.match('...')) {
   2416 	                var element = this.parseSpreadElement();
   2417 	                if (!this.match(']')) {
   2418 	                    this.context.isAssignmentTarget = false;
   2419 	                    this.context.isBindingElement = false;
   2420 	                    this.expect(',');
   2421 	                }
   2422 	                elements.push(element);
   2423 	            }
   2424 	            else {
   2425 	                elements.push(this.inheritCoverGrammar(this.parseAssignmentExpression));
   2426 	                if (!this.match(']')) {
   2427 	                    this.expect(',');
   2428 	                }
   2429 	            }
   2430 	        }
   2431 	        this.expect(']');
   2432 	        return this.finalize(node, new Node.ArrayExpression(elements));
   2433 	    };
   2434 	    // https://tc39.github.io/ecma262/#sec-object-initializer
   2435 	    Parser.prototype.parsePropertyMethod = function (params) {
   2436 	        this.context.isAssignmentTarget = false;
   2437 	        this.context.isBindingElement = false;
   2438 	        var previousStrict = this.context.strict;
   2439 	        var previousAllowStrictDirective = this.context.allowStrictDirective;
   2440 	        this.context.allowStrictDirective = params.simple;
   2441 	        var body = this.isolateCoverGrammar(this.parseFunctionSourceElements);
   2442 	        if (this.context.strict && params.firstRestricted) {
   2443 	            this.tolerateUnexpectedToken(params.firstRestricted, params.message);
   2444 	        }
   2445 	        if (this.context.strict && params.stricted) {
   2446 	            this.tolerateUnexpectedToken(params.stricted, params.message);
   2447 	        }
   2448 	        this.context.strict = previousStrict;
   2449 	        this.context.allowStrictDirective = previousAllowStrictDirective;
   2450 	        return body;
   2451 	    };
   2452 	    Parser.prototype.parsePropertyMethodFunction = function () {
   2453 	        var isGenerator = false;
   2454 	        var node = this.createNode();
   2455 	        var previousAllowYield = this.context.allowYield;
   2456 	        this.context.allowYield = true;
   2457 	        var params = this.parseFormalParameters();
   2458 	        var method = this.parsePropertyMethod(params);
   2459 	        this.context.allowYield = previousAllowYield;
   2460 	        return this.finalize(node, new Node.FunctionExpression(null, params.params, method, isGenerator));
   2461 	    };
   2462 	    Parser.prototype.parsePropertyMethodAsyncFunction = function () {
   2463 	        var node = this.createNode();
   2464 	        var previousAllowYield = this.context.allowYield;
   2465 	        var previousAwait = this.context.await;
   2466 	        this.context.allowYield = false;
   2467 	        this.context.await = true;
   2468 	        var params = this.parseFormalParameters();
   2469 	        var method = this.parsePropertyMethod(params);
   2470 	        this.context.allowYield = previousAllowYield;
   2471 	        this.context.await = previousAwait;
   2472 	        return this.finalize(node, new Node.AsyncFunctionExpression(null, params.params, method));
   2473 	    };
   2474 	    Parser.prototype.parseObjectPropertyKey = function () {
   2475 	        var node = this.createNode();
   2476 	        var token = this.nextToken();
   2477 	        var key;
   2478 	        switch (token.type) {
   2479 	            case 8 /* StringLiteral */:
   2480 	            case 6 /* NumericLiteral */:
   2481 	                if (this.context.strict && token.octal) {
   2482 	                    this.tolerateUnexpectedToken(token, messages_1.Messages.StrictOctalLiteral);
   2483 	                }
   2484 	                var raw = this.getTokenRaw(token);
   2485 	                key = this.finalize(node, new Node.Literal(token.value, raw));
   2486 	                break;
   2487 	            case 3 /* Identifier */:
   2488 	            case 1 /* BooleanLiteral */:
   2489 	            case 5 /* NullLiteral */:
   2490 	            case 4 /* Keyword */:
   2491 	                key = this.finalize(node, new Node.Identifier(token.value));
   2492 	                break;
   2493 	            case 7 /* Punctuator */:
   2494 	                if (token.value === '[') {
   2495 	                    key = this.isolateCoverGrammar(this.parseAssignmentExpression);
   2496 	                    this.expect(']');
   2497 	                }
   2498 	                else {
   2499 	                    key = this.throwUnexpectedToken(token);
   2500 	                }
   2501 	                break;
   2502 	            default:
   2503 	                key = this.throwUnexpectedToken(token);
   2504 	        }
   2505 	        return key;
   2506 	    };
   2507 	    Parser.prototype.isPropertyKey = function (key, value) {
   2508 	        return (key.type === syntax_1.Syntax.Identifier && key.name === value) ||
   2509 	            (key.type === syntax_1.Syntax.Literal && key.value === value);
   2510 	    };
   2511 	    Parser.prototype.parseObjectProperty = function (hasProto) {
   2512 	        var node = this.createNode();
   2513 	        var token = this.lookahead;
   2514 	        var kind;
   2515 	        var key = null;
   2516 	        var value = null;
   2517 	        var computed = false;
   2518 	        var method = false;
   2519 	        var shorthand = false;
   2520 	        var isAsync = false;
   2521 	        if (token.type === 3 /* Identifier */) {
   2522 	            var id = token.value;
   2523 	            this.nextToken();
   2524 	            computed = this.match('[');
   2525 	            isAsync = !this.hasLineTerminator && (id === 'async') &&
   2526 	                !this.match(':') && !this.match('(') && !this.match('*') && !this.match(',');
   2527 	            key = isAsync ? this.parseObjectPropertyKey() : this.finalize(node, new Node.Identifier(id));
   2528 	        }
   2529 	        else if (this.match('*')) {
   2530 	            this.nextToken();
   2531 	        }
   2532 	        else {
   2533 	            computed = this.match('[');
   2534 	            key = this.parseObjectPropertyKey();
   2535 	        }
   2536 	        var lookaheadPropertyKey = this.qualifiedPropertyName(this.lookahead);
   2537 	        if (token.type === 3 /* Identifier */ && !isAsync && token.value === 'get' && lookaheadPropertyKey) {
   2538 	            kind = 'get';
   2539 	            computed = this.match('[');
   2540 	            key = this.parseObjectPropertyKey();
   2541 	            this.context.allowYield = false;
   2542 	            value = this.parseGetterMethod();
   2543 	        }
   2544 	        else if (token.type === 3 /* Identifier */ && !isAsync && token.value === 'set' && lookaheadPropertyKey) {
   2545 	            kind = 'set';
   2546 	            computed = this.match('[');
   2547 	            key = this.parseObjectPropertyKey();
   2548 	            value = this.parseSetterMethod();
   2549 	        }
   2550 	        else if (token.type === 7 /* Punctuator */ && token.value === '*' && lookaheadPropertyKey) {
   2551 	            kind = 'init';
   2552 	            computed = this.match('[');
   2553 	            key = this.parseObjectPropertyKey();
   2554 	            value = this.parseGeneratorMethod();
   2555 	            method = true;
   2556 	        }
   2557 	        else {
   2558 	            if (!key) {
   2559 	                this.throwUnexpectedToken(this.lookahead);
   2560 	            }
   2561 	            kind = 'init';
   2562 	            if (this.match(':') && !isAsync) {
   2563 	                if (!computed && this.isPropertyKey(key, '__proto__')) {
   2564 	                    if (hasProto.value) {
   2565 	                        this.tolerateError(messages_1.Messages.DuplicateProtoProperty);
   2566 	                    }
   2567 	                    hasProto.value = true;
   2568 	                }
   2569 	                this.nextToken();
   2570 	                value = this.inheritCoverGrammar(this.parseAssignmentExpression);
   2571 	            }
   2572 	            else if (this.match('(')) {
   2573 	                value = isAsync ? this.parsePropertyMethodAsyncFunction() : this.parsePropertyMethodFunction();
   2574 	                method = true;
   2575 	            }
   2576 	            else if (token.type === 3 /* Identifier */) {
   2577 	                var id = this.finalize(node, new Node.Identifier(token.value));
   2578 	                if (this.match('=')) {
   2579 	                    this.context.firstCoverInitializedNameError = this.lookahead;
   2580 	                    this.nextToken();
   2581 	                    shorthand = true;
   2582 	                    var init = this.isolateCoverGrammar(this.parseAssignmentExpression);
   2583 	                    value = this.finalize(node, new Node.AssignmentPattern(id, init));
   2584 	                }
   2585 	                else {
   2586 	                    shorthand = true;
   2587 	                    value = id;
   2588 	                }
   2589 	            }
   2590 	            else {
   2591 	                this.throwUnexpectedToken(this.nextToken());
   2592 	            }
   2593 	        }
   2594 	        return this.finalize(node, new Node.Property(kind, key, computed, value, method, shorthand));
   2595 	    };
   2596 	    Parser.prototype.parseObjectInitializer = function () {
   2597 	        var node = this.createNode();
   2598 	        this.expect('{');
   2599 	        var properties = [];
   2600 	        var hasProto = { value: false };
   2601 	        while (!this.match('}')) {
   2602 	            properties.push(this.parseObjectProperty(hasProto));
   2603 	            if (!this.match('}')) {
   2604 	                this.expectCommaSeparator();
   2605 	            }
   2606 	        }
   2607 	        this.expect('}');
   2608 	        return this.finalize(node, new Node.ObjectExpression(properties));
   2609 	    };
   2610 	    // https://tc39.github.io/ecma262/#sec-template-literals
   2611 	    Parser.prototype.parseTemplateHead = function () {
   2612 	        assert_1.assert(this.lookahead.head, 'Template literal must start with a template head');
   2613 	        var node = this.createNode();
   2614 	        var token = this.nextToken();
   2615 	        var raw = token.value;
   2616 	        var cooked = token.cooked;
   2617 	        return this.finalize(node, new Node.TemplateElement({ raw: raw, cooked: cooked }, token.tail));
   2618 	    };
   2619 	    Parser.prototype.parseTemplateElement = function () {
   2620 	        if (this.lookahead.type !== 10 /* Template */) {
   2621 	            this.throwUnexpectedToken();
   2622 	        }
   2623 	        var node = this.createNode();
   2624 	        var token = this.nextToken();
   2625 	        var raw = token.value;
   2626 	        var cooked = token.cooked;
   2627 	        return this.finalize(node, new Node.TemplateElement({ raw: raw, cooked: cooked }, token.tail));
   2628 	    };
   2629 	    Parser.prototype.parseTemplateLiteral = function () {
   2630 	        var node = this.createNode();
   2631 	        var expressions = [];
   2632 	        var quasis = [];
   2633 	        var quasi = this.parseTemplateHead();
   2634 	        quasis.push(quasi);
   2635 	        while (!quasi.tail) {
   2636 	            expressions.push(this.parseExpression());
   2637 	            quasi = this.parseTemplateElement();
   2638 	            quasis.push(quasi);
   2639 	        }
   2640 	        return this.finalize(node, new Node.TemplateLiteral(quasis, expressions));
   2641 	    };
   2642 	    // https://tc39.github.io/ecma262/#sec-grouping-operator
   2643 	    Parser.prototype.reinterpretExpressionAsPattern = function (expr) {
   2644 	        switch (expr.type) {
   2645 	            case syntax_1.Syntax.Identifier:
   2646 	            case syntax_1.Syntax.MemberExpression:
   2647 	            case syntax_1.Syntax.RestElement:
   2648 	            case syntax_1.Syntax.AssignmentPattern:
   2649 	                break;
   2650 	            case syntax_1.Syntax.SpreadElement:
   2651 	                expr.type = syntax_1.Syntax.RestElement;
   2652 	                this.reinterpretExpressionAsPattern(expr.argument);
   2653 	                break;
   2654 	            case syntax_1.Syntax.ArrayExpression:
   2655 	                expr.type = syntax_1.Syntax.ArrayPattern;
   2656 	                for (var i = 0; i < expr.elements.length; i++) {
   2657 	                    if (expr.elements[i] !== null) {
   2658 	                        this.reinterpretExpressionAsPattern(expr.elements[i]);
   2659 	                    }
   2660 	                }
   2661 	                break;
   2662 	            case syntax_1.Syntax.ObjectExpression:
   2663 	                expr.type = syntax_1.Syntax.ObjectPattern;
   2664 	                for (var i = 0; i < expr.properties.length; i++) {
   2665 	                    this.reinterpretExpressionAsPattern(expr.properties[i].value);
   2666 	                }
   2667 	                break;
   2668 	            case syntax_1.Syntax.AssignmentExpression:
   2669 	                expr.type = syntax_1.Syntax.AssignmentPattern;
   2670 	                delete expr.operator;
   2671 	                this.reinterpretExpressionAsPattern(expr.left);
   2672 	                break;
   2673 	            default:
   2674 	                // Allow other node type for tolerant parsing.
   2675 	                break;
   2676 	        }
   2677 	    };
   2678 	    Parser.prototype.parseGroupExpression = function () {
   2679 	        var expr;
   2680 	        this.expect('(');
   2681 	        if (this.match(')')) {
   2682 	            this.nextToken();
   2683 	            if (!this.match('=>')) {
   2684 	                this.expect('=>');
   2685 	            }
   2686 	            expr = {
   2687 	                type: ArrowParameterPlaceHolder,
   2688 	                params: [],
   2689 	                async: false
   2690 	            };
   2691 	        }
   2692 	        else {
   2693 	            var startToken = this.lookahead;
   2694 	            var params = [];
   2695 	            if (this.match('...')) {
   2696 	                expr = this.parseRestElement(params);
   2697 	                this.expect(')');
   2698 	                if (!this.match('=>')) {
   2699 	                    this.expect('=>');
   2700 	                }
   2701 	                expr = {
   2702 	                    type: ArrowParameterPlaceHolder,
   2703 	                    params: [expr],
   2704 	                    async: false
   2705 	                };
   2706 	            }
   2707 	            else {
   2708 	                var arrow = false;
   2709 	                this.context.isBindingElement = true;
   2710 	                expr = this.inheritCoverGrammar(this.parseAssignmentExpression);
   2711 	                if (this.match(',')) {
   2712 	                    var expressions = [];
   2713 	                    this.context.isAssignmentTarget = false;
   2714 	                    expressions.push(expr);
   2715 	                    while (this.lookahead.type !== 2 /* EOF */) {
   2716 	                        if (!this.match(',')) {
   2717 	                            break;
   2718 	                        }
   2719 	                        this.nextToken();
   2720 	                        if (this.match(')')) {
   2721 	                            this.nextToken();
   2722 	                            for (var i = 0; i < expressions.length; i++) {
   2723 	                                this.reinterpretExpressionAsPattern(expressions[i]);
   2724 	                            }
   2725 	                            arrow = true;
   2726 	                            expr = {
   2727 	                                type: ArrowParameterPlaceHolder,
   2728 	                                params: expressions,
   2729 	                                async: false
   2730 	                            };
   2731 	                        }
   2732 	                        else if (this.match('...')) {
   2733 	                            if (!this.context.isBindingElement) {
   2734 	                                this.throwUnexpectedToken(this.lookahead);
   2735 	                            }
   2736 	                            expressions.push(this.parseRestElement(params));
   2737 	                            this.expect(')');
   2738 	                            if (!this.match('=>')) {
   2739 	                                this.expect('=>');
   2740 	                            }
   2741 	                            this.context.isBindingElement = false;
   2742 	                            for (var i = 0; i < expressions.length; i++) {
   2743 	                                this.reinterpretExpressionAsPattern(expressions[i]);
   2744 	                            }
   2745 	                            arrow = true;
   2746 	                            expr = {
   2747 	                                type: ArrowParameterPlaceHolder,
   2748 	                                params: expressions,
   2749 	                                async: false
   2750 	                            };
   2751 	                        }
   2752 	                        else {
   2753 	                            expressions.push(this.inheritCoverGrammar(this.parseAssignmentExpression));
   2754 	                        }
   2755 	                        if (arrow) {
   2756 	                            break;
   2757 	                        }
   2758 	                    }
   2759 	                    if (!arrow) {
   2760 	                        expr = this.finalize(this.startNode(startToken), new Node.SequenceExpression(expressions));
   2761 	                    }
   2762 	                }
   2763 	                if (!arrow) {
   2764 	                    this.expect(')');
   2765 	                    if (this.match('=>')) {
   2766 	                        if (expr.type === syntax_1.Syntax.Identifier && expr.name === 'yield') {
   2767 	                            arrow = true;
   2768 	                            expr = {
   2769 	                                type: ArrowParameterPlaceHolder,
   2770 	                                params: [expr],
   2771 	                                async: false
   2772 	                            };
   2773 	                        }
   2774 	                        if (!arrow) {
   2775 	                            if (!this.context.isBindingElement) {
   2776 	                                this.throwUnexpectedToken(this.lookahead);
   2777 	                            }
   2778 	                            if (expr.type === syntax_1.Syntax.SequenceExpression) {
   2779 	                                for (var i = 0; i < expr.expressions.length; i++) {
   2780 	                                    this.reinterpretExpressionAsPattern(expr.expressions[i]);
   2781 	                                }
   2782 	                            }
   2783 	                            else {
   2784 	                                this.reinterpretExpressionAsPattern(expr);
   2785 	                            }
   2786 	                            var parameters = (expr.type === syntax_1.Syntax.SequenceExpression ? expr.expressions : [expr]);
   2787 	                            expr = {
   2788 	                                type: ArrowParameterPlaceHolder,
   2789 	                                params: parameters,
   2790 	                                async: false
   2791 	                            };
   2792 	                        }
   2793 	                    }
   2794 	                    this.context.isBindingElement = false;
   2795 	                }
   2796 	            }
   2797 	        }
   2798 	        return expr;
   2799 	    };
   2800 	    // https://tc39.github.io/ecma262/#sec-left-hand-side-expressions
   2801 	    Parser.prototype.parseArguments = function () {
   2802 	        this.expect('(');
   2803 	        var args = [];
   2804 	        if (!this.match(')')) {
   2805 	            while (true) {
   2806 	                var expr = this.match('...') ? this.parseSpreadElement() :
   2807 	                    this.isolateCoverGrammar(this.parseAssignmentExpression);
   2808 	                args.push(expr);
   2809 	                if (this.match(')')) {
   2810 	                    break;
   2811 	                }
   2812 	                this.expectCommaSeparator();
   2813 	                if (this.match(')')) {
   2814 	                    break;
   2815 	                }
   2816 	            }
   2817 	        }
   2818 	        this.expect(')');
   2819 	        return args;
   2820 	    };
   2821 	    Parser.prototype.isIdentifierName = function (token) {
   2822 	        return token.type === 3 /* Identifier */ ||
   2823 	            token.type === 4 /* Keyword */ ||
   2824 	            token.type === 1 /* BooleanLiteral */ ||
   2825 	            token.type === 5 /* NullLiteral */;
   2826 	    };
   2827 	    Parser.prototype.parseIdentifierName = function () {
   2828 	        var node = this.createNode();
   2829 	        var token = this.nextToken();
   2830 	        if (!this.isIdentifierName(token)) {
   2831 	            this.throwUnexpectedToken(token);
   2832 	        }
   2833 	        return this.finalize(node, new Node.Identifier(token.value));
   2834 	    };
   2835 	    Parser.prototype.parseNewExpression = function () {
   2836 	        var node = this.createNode();
   2837 	        var id = this.parseIdentifierName();
   2838 	        assert_1.assert(id.name === 'new', 'New expression must start with `new`');
   2839 	        var expr;
   2840 	        if (this.match('.')) {
   2841 	            this.nextToken();
   2842 	            if (this.lookahead.type === 3 /* Identifier */ && this.context.inFunctionBody && this.lookahead.value === 'target') {
   2843 	                var property = this.parseIdentifierName();
   2844 	                expr = new Node.MetaProperty(id, property);
   2845 	            }
   2846 	            else {
   2847 	                this.throwUnexpectedToken(this.lookahead);
   2848 	            }
   2849 	        }
   2850 	        else {
   2851 	            var callee = this.isolateCoverGrammar(this.parseLeftHandSideExpression);
   2852 	            var args = this.match('(') ? this.parseArguments() : [];
   2853 	            expr = new Node.NewExpression(callee, args);
   2854 	            this.context.isAssignmentTarget = false;
   2855 	            this.context.isBindingElement = false;
   2856 	        }
   2857 	        return this.finalize(node, expr);
   2858 	    };
   2859 	    Parser.prototype.parseAsyncArgument = function () {
   2860 	        var arg = this.parseAssignmentExpression();
   2861 	        this.context.firstCoverInitializedNameError = null;
   2862 	        return arg;
   2863 	    };
   2864 	    Parser.prototype.parseAsyncArguments = function () {
   2865 	        this.expect('(');
   2866 	        var args = [];
   2867 	        if (!this.match(')')) {
   2868 	            while (true) {
   2869 	                var expr = this.match('...') ? this.parseSpreadElement() :
   2870 	                    this.isolateCoverGrammar(this.parseAsyncArgument);
   2871 	                args.push(expr);
   2872 	                if (this.match(')')) {
   2873 	                    break;
   2874 	                }
   2875 	                this.expectCommaSeparator();
   2876 	                if (this.match(')')) {
   2877 	                    break;
   2878 	                }
   2879 	            }
   2880 	        }
   2881 	        this.expect(')');
   2882 	        return args;
   2883 	    };
   2884 	    Parser.prototype.parseLeftHandSideExpressionAllowCall = function () {
   2885 	        var startToken = this.lookahead;
   2886 	        var maybeAsync = this.matchContextualKeyword('async');
   2887 	        var previousAllowIn = this.context.allowIn;
   2888 	        this.context.allowIn = true;
   2889 	        var expr;
   2890 	        if (this.matchKeyword('super') && this.context.inFunctionBody) {
   2891 	            expr = this.createNode();
   2892 	            this.nextToken();
   2893 	            expr = this.finalize(expr, new Node.Super());
   2894 	            if (!this.match('(') && !this.match('.') && !this.match('[')) {
   2895 	                this.throwUnexpectedToken(this.lookahead);
   2896 	            }
   2897 	        }
   2898 	        else {
   2899 	            expr = this.inheritCoverGrammar(this.matchKeyword('new') ? this.parseNewExpression : this.parsePrimaryExpression);
   2900 	        }
   2901 	        while (true) {
   2902 	            if (this.match('.')) {
   2903 	                this.context.isBindingElement = false;
   2904 	                this.context.isAssignmentTarget = true;
   2905 	                this.expect('.');
   2906 	                var property = this.parseIdentifierName();
   2907 	                expr = this.finalize(this.startNode(startToken), new Node.StaticMemberExpression(expr, property));
   2908 	            }
   2909 	            else if (this.match('(')) {
   2910 	                var asyncArrow = maybeAsync && (startToken.lineNumber === this.lookahead.lineNumber);
   2911 	                this.context.isBindingElement = false;
   2912 	                this.context.isAssignmentTarget = false;
   2913 	                var args = asyncArrow ? this.parseAsyncArguments() : this.parseArguments();
   2914 	                expr = this.finalize(this.startNode(startToken), new Node.CallExpression(expr, args));
   2915 	                if (asyncArrow && this.match('=>')) {
   2916 	                    for (var i = 0; i < args.length; ++i) {
   2917 	                        this.reinterpretExpressionAsPattern(args[i]);
   2918 	                    }
   2919 	                    expr = {
   2920 	                        type: ArrowParameterPlaceHolder,
   2921 	                        params: args,
   2922 	                        async: true
   2923 	                    };
   2924 	                }
   2925 	            }
   2926 	            else if (this.match('[')) {
   2927 	                this.context.isBindingElement = false;
   2928 	                this.context.isAssignmentTarget = true;
   2929 	                this.expect('[');
   2930 	                var property = this.isolateCoverGrammar(this.parseExpression);
   2931 	                this.expect(']');
   2932 	                expr = this.finalize(this.startNode(startToken), new Node.ComputedMemberExpression(expr, property));
   2933 	            }
   2934 	            else if (this.lookahead.type === 10 /* Template */ && this.lookahead.head) {
   2935 	                var quasi = this.parseTemplateLiteral();
   2936 	                expr = this.finalize(this.startNode(startToken), new Node.TaggedTemplateExpression(expr, quasi));
   2937 	            }
   2938 	            else {
   2939 	                break;
   2940 	            }
   2941 	        }
   2942 	        this.context.allowIn = previousAllowIn;
   2943 	        return expr;
   2944 	    };
   2945 	    Parser.prototype.parseSuper = function () {
   2946 	        var node = this.createNode();
   2947 	        this.expectKeyword('super');
   2948 	        if (!this.match('[') && !this.match('.')) {
   2949 	            this.throwUnexpectedToken(this.lookahead);
   2950 	        }
   2951 	        return this.finalize(node, new Node.Super());
   2952 	    };
   2953 	    Parser.prototype.parseLeftHandSideExpression = function () {
   2954 	        assert_1.assert(this.context.allowIn, 'callee of new expression always allow in keyword.');
   2955 	        var node = this.startNode(this.lookahead);
   2956 	        var expr = (this.matchKeyword('super') && this.context.inFunctionBody) ? this.parseSuper() :
   2957 	            this.inheritCoverGrammar(this.matchKeyword('new') ? this.parseNewExpression : this.parsePrimaryExpression);
   2958 	        while (true) {
   2959 	            if (this.match('[')) {
   2960 	                this.context.isBindingElement = false;
   2961 	                this.context.isAssignmentTarget = true;
   2962 	                this.expect('[');
   2963 	                var property = this.isolateCoverGrammar(this.parseExpression);
   2964 	                this.expect(']');
   2965 	                expr = this.finalize(node, new Node.ComputedMemberExpression(expr, property));
   2966 	            }
   2967 	            else if (this.match('.')) {
   2968 	                this.context.isBindingElement = false;
   2969 	                this.context.isAssignmentTarget = true;
   2970 	                this.expect('.');
   2971 	                var property = this.parseIdentifierName();
   2972 	                expr = this.finalize(node, new Node.StaticMemberExpression(expr, property));
   2973 	            }
   2974 	            else if (this.lookahead.type === 10 /* Template */ && this.lookahead.head) {
   2975 	                var quasi = this.parseTemplateLiteral();
   2976 	                expr = this.finalize(node, new Node.TaggedTemplateExpression(expr, quasi));
   2977 	            }
   2978 	            else {
   2979 	                break;
   2980 	            }
   2981 	        }
   2982 	        return expr;
   2983 	    };
   2984 	    // https://tc39.github.io/ecma262/#sec-update-expressions
   2985 	    Parser.prototype.parseUpdateExpression = function () {
   2986 	        var expr;
   2987 	        var startToken = this.lookahead;
   2988 	        if (this.match('++') || this.match('--')) {
   2989 	            var node = this.startNode(startToken);
   2990 	            var token = this.nextToken();
   2991 	            expr = this.inheritCoverGrammar(this.parseUnaryExpression);
   2992 	            if (this.context.strict && expr.type === syntax_1.Syntax.Identifier && this.scanner.isRestrictedWord(expr.name)) {
   2993 	                this.tolerateError(messages_1.Messages.StrictLHSPrefix);
   2994 	            }
   2995 	            if (!this.context.isAssignmentTarget) {
   2996 	                this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);
   2997 	            }
   2998 	            var prefix = true;
   2999 	            expr = this.finalize(node, new Node.UpdateExpression(token.value, expr, prefix));
   3000 	            this.context.isAssignmentTarget = false;
   3001 	            this.context.isBindingElement = false;
   3002 	        }
   3003 	        else {
   3004 	            expr = this.inheritCoverGrammar(this.parseLeftHandSideExpressionAllowCall);
   3005 	            if (!this.hasLineTerminator && this.lookahead.type === 7 /* Punctuator */) {
   3006 	                if (this.match('++') || this.match('--')) {
   3007 	                    if (this.context.strict && expr.type === syntax_1.Syntax.Identifier && this.scanner.isRestrictedWord(expr.name)) {
   3008 	                        this.tolerateError(messages_1.Messages.StrictLHSPostfix);
   3009 	                    }
   3010 	                    if (!this.context.isAssignmentTarget) {
   3011 	                        this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);
   3012 	                    }
   3013 	                    this.context.isAssignmentTarget = false;
   3014 	                    this.context.isBindingElement = false;
   3015 	                    var operator = this.nextToken().value;
   3016 	                    var prefix = false;
   3017 	                    expr = this.finalize(this.startNode(startToken), new Node.UpdateExpression(operator, expr, prefix));
   3018 	                }
   3019 	            }
   3020 	        }
   3021 	        return expr;
   3022 	    };
   3023 	    // https://tc39.github.io/ecma262/#sec-unary-operators
   3024 	    Parser.prototype.parseAwaitExpression = function () {
   3025 	        var node = this.createNode();
   3026 	        this.nextToken();
   3027 	        var argument = this.parseUnaryExpression();
   3028 	        return this.finalize(node, new Node.AwaitExpression(argument));
   3029 	    };
   3030 	    Parser.prototype.parseUnaryExpression = function () {
   3031 	        var expr;
   3032 	        if (this.match('+') || this.match('-') || this.match('~') || this.match('!') ||
   3033 	            this.matchKeyword('delete') || this.matchKeyword('void') || this.matchKeyword('typeof')) {
   3034 	            var node = this.startNode(this.lookahead);
   3035 	            var token = this.nextToken();
   3036 	            expr = this.inheritCoverGrammar(this.parseUnaryExpression);
   3037 	            expr = this.finalize(node, new Node.UnaryExpression(token.value, expr));
   3038 	            if (this.context.strict && expr.operator === 'delete' && expr.argument.type === syntax_1.Syntax.Identifier) {
   3039 	                this.tolerateError(messages_1.Messages.StrictDelete);
   3040 	            }
   3041 	            this.context.isAssignmentTarget = false;
   3042 	            this.context.isBindingElement = false;
   3043 	        }
   3044 	        else if (this.context.await && this.matchContextualKeyword('await')) {
   3045 	            expr = this.parseAwaitExpression();
   3046 	        }
   3047 	        else {
   3048 	            expr = this.parseUpdateExpression();
   3049 	        }
   3050 	        return expr;
   3051 	    };
   3052 	    Parser.prototype.parseExponentiationExpression = function () {
   3053 	        var startToken = this.lookahead;
   3054 	        var expr = this.inheritCoverGrammar(this.parseUnaryExpression);
   3055 	        if (expr.type !== syntax_1.Syntax.UnaryExpression && this.match('**')) {
   3056 	            this.nextToken();
   3057 	            this.context.isAssignmentTarget = false;
   3058 	            this.context.isBindingElement = false;
   3059 	            var left = expr;
   3060 	            var right = this.isolateCoverGrammar(this.parseExponentiationExpression);
   3061 	            expr = this.finalize(this.startNode(startToken), new Node.BinaryExpression('**', left, right));
   3062 	        }
   3063 	        return expr;
   3064 	    };
   3065 	    // https://tc39.github.io/ecma262/#sec-exp-operator
   3066 	    // https://tc39.github.io/ecma262/#sec-multiplicative-operators
   3067 	    // https://tc39.github.io/ecma262/#sec-additive-operators
   3068 	    // https://tc39.github.io/ecma262/#sec-bitwise-shift-operators
   3069 	    // https://tc39.github.io/ecma262/#sec-relational-operators
   3070 	    // https://tc39.github.io/ecma262/#sec-equality-operators
   3071 	    // https://tc39.github.io/ecma262/#sec-binary-bitwise-operators
   3072 	    // https://tc39.github.io/ecma262/#sec-binary-logical-operators
   3073 	    Parser.prototype.binaryPrecedence = function (token) {
   3074 	        var op = token.value;
   3075 	        var precedence;
   3076 	        if (token.type === 7 /* Punctuator */) {
   3077 	            precedence = this.operatorPrecedence[op] || 0;
   3078 	        }
   3079 	        else if (token.type === 4 /* Keyword */) {
   3080 	            precedence = (op === 'instanceof' || (this.context.allowIn && op === 'in')) ? 7 : 0;
   3081 	        }
   3082 	        else {
   3083 	            precedence = 0;
   3084 	        }
   3085 	        return precedence;
   3086 	    };
   3087 	    Parser.prototype.parseBinaryExpression = function () {
   3088 	        var startToken = this.lookahead;
   3089 	        var expr = this.inheritCoverGrammar(this.parseExponentiationExpression);
   3090 	        var token = this.lookahead;
   3091 	        var prec = this.binaryPrecedence(token);
   3092 	        if (prec > 0) {
   3093 	            this.nextToken();
   3094 	            this.context.isAssignmentTarget = false;
   3095 	            this.context.isBindingElement = false;
   3096 	            var markers = [startToken, this.lookahead];
   3097 	            var left = expr;
   3098 	            var right = this.isolateCoverGrammar(this.parseExponentiationExpression);
   3099 	            var stack = [left, token.value, right];
   3100 	            var precedences = [prec];
   3101 	            while (true) {
   3102 	                prec = this.binaryPrecedence(this.lookahead);
   3103 	                if (prec <= 0) {
   3104 	                    break;
   3105 	                }
   3106 	                // Reduce: make a binary expression from the three topmost entries.
   3107 	                while ((stack.length > 2) && (prec <= precedences[precedences.length - 1])) {
   3108 	                    right = stack.pop();
   3109 	                    var operator = stack.pop();
   3110 	                    precedences.pop();
   3111 	                    left = stack.pop();
   3112 	                    markers.pop();
   3113 	                    var node = this.startNode(markers[markers.length - 1]);
   3114 	                    stack.push(this.finalize(node, new Node.BinaryExpression(operator, left, right)));
   3115 	                }
   3116 	                // Shift.
   3117 	                stack.push(this.nextToken().value);
   3118 	                precedences.push(prec);
   3119 	                markers.push(this.lookahead);
   3120 	                stack.push(this.isolateCoverGrammar(this.parseExponentiationExpression));
   3121 	            }
   3122 	            // Final reduce to clean-up the stack.
   3123 	            var i = stack.length - 1;
   3124 	            expr = stack[i];
   3125 	            var lastMarker = markers.pop();
   3126 	            while (i > 1) {
   3127 	                var marker = markers.pop();
   3128 	                var lastLineStart = lastMarker && lastMarker.lineStart;
   3129 	                var node = this.startNode(marker, lastLineStart);
   3130 	                var operator = stack[i - 1];
   3131 	                expr = this.finalize(node, new Node.BinaryExpression(operator, stack[i - 2], expr));
   3132 	                i -= 2;
   3133 	                lastMarker = marker;
   3134 	            }
   3135 	        }
   3136 	        return expr;
   3137 	    };
   3138 	    // https://tc39.github.io/ecma262/#sec-conditional-operator
   3139 	    Parser.prototype.parseConditionalExpression = function () {
   3140 	        var startToken = this.lookahead;
   3141 	        var expr = this.inheritCoverGrammar(this.parseBinaryExpression);
   3142 	        if (this.match('?')) {
   3143 	            this.nextToken();
   3144 	            var previousAllowIn = this.context.allowIn;
   3145 	            this.context.allowIn = true;
   3146 	            var consequent = this.isolateCoverGrammar(this.parseAssignmentExpression);
   3147 	            this.context.allowIn = previousAllowIn;
   3148 	            this.expect(':');
   3149 	            var alternate = this.isolateCoverGrammar(this.parseAssignmentExpression);
   3150 	            expr = this.finalize(this.startNode(startToken), new Node.ConditionalExpression(expr, consequent, alternate));
   3151 	            this.context.isAssignmentTarget = false;
   3152 	            this.context.isBindingElement = false;
   3153 	        }
   3154 	        return expr;
   3155 	    };
   3156 	    // https://tc39.github.io/ecma262/#sec-assignment-operators
   3157 	    Parser.prototype.checkPatternParam = function (options, param) {
   3158 	        switch (param.type) {
   3159 	            case syntax_1.Syntax.Identifier:
   3160 	                this.validateParam(options, param, param.name);
   3161 	                break;
   3162 	            case syntax_1.Syntax.RestElement:
   3163 	                this.checkPatternParam(options, param.argument);
   3164 	                break;
   3165 	            case syntax_1.Syntax.AssignmentPattern:
   3166 	                this.checkPatternParam(options, param.left);
   3167 	                break;
   3168 	            case syntax_1.Syntax.ArrayPattern:
   3169 	                for (var i = 0; i < param.elements.length; i++) {
   3170 	                    if (param.elements[i] !== null) {
   3171 	                        this.checkPatternParam(options, param.elements[i]);
   3172 	                    }
   3173 	                }
   3174 	                break;
   3175 	            case syntax_1.Syntax.ObjectPattern:
   3176 	                for (var i = 0; i < param.properties.length; i++) {
   3177 	                    this.checkPatternParam(options, param.properties[i].value);
   3178 	                }
   3179 	                break;
   3180 	            default:
   3181 	                break;
   3182 	        }
   3183 	        options.simple = options.simple && (param instanceof Node.Identifier);
   3184 	    };
   3185 	    Parser.prototype.reinterpretAsCoverFormalsList = function (expr) {
   3186 	        var params = [expr];
   3187 	        var options;
   3188 	        var asyncArrow = false;
   3189 	        switch (expr.type) {
   3190 	            case syntax_1.Syntax.Identifier:
   3191 	                break;
   3192 	            case ArrowParameterPlaceHolder:
   3193 	                params = expr.params;
   3194 	                asyncArrow = expr.async;
   3195 	                break;
   3196 	            default:
   3197 	                return null;
   3198 	        }
   3199 	        options = {
   3200 	            simple: true,
   3201 	            paramSet: {}
   3202 	        };
   3203 	        for (var i = 0; i < params.length; ++i) {
   3204 	            var param = params[i];
   3205 	            if (param.type === syntax_1.Syntax.AssignmentPattern) {
   3206 	                if (param.right.type === syntax_1.Syntax.YieldExpression) {
   3207 	                    if (param.right.argument) {
   3208 	                        this.throwUnexpectedToken(this.lookahead);
   3209 	                    }
   3210 	                    param.right.type = syntax_1.Syntax.Identifier;
   3211 	                    param.right.name = 'yield';
   3212 	                    delete param.right.argument;
   3213 	                    delete param.right.delegate;
   3214 	                }
   3215 	            }
   3216 	            else if (asyncArrow && param.type === syntax_1.Syntax.Identifier && param.name === 'await') {
   3217 	                this.throwUnexpectedToken(this.lookahead);
   3218 	            }
   3219 	            this.checkPatternParam(options, param);
   3220 	            params[i] = param;
   3221 	        }
   3222 	        if (this.context.strict || !this.context.allowYield) {
   3223 	            for (var i = 0; i < params.length; ++i) {
   3224 	                var param = params[i];
   3225 	                if (param.type === syntax_1.Syntax.YieldExpression) {
   3226 	                    this.throwUnexpectedToken(this.lookahead);
   3227 	                }
   3228 	            }
   3229 	        }
   3230 	        if (options.message === messages_1.Messages.StrictParamDupe) {
   3231 	            var token = this.context.strict ? options.stricted : options.firstRestricted;
   3232 	            this.throwUnexpectedToken(token, options.message);
   3233 	        }
   3234 	        return {
   3235 	            simple: options.simple,
   3236 	            params: params,
   3237 	            stricted: options.stricted,
   3238 	            firstRestricted: options.firstRestricted,
   3239 	            message: options.message
   3240 	        };
   3241 	    };
   3242 	    Parser.prototype.parseAssignmentExpression = function () {
   3243 	        var expr;
   3244 	        if (!this.context.allowYield && this.matchKeyword('yield')) {
   3245 	            expr = this.parseYieldExpression();
   3246 	        }
   3247 	        else {
   3248 	            var startToken = this.lookahead;
   3249 	            var token = startToken;
   3250 	            expr = this.parseConditionalExpression();
   3251 	            if (token.type === 3 /* Identifier */ && (token.lineNumber === this.lookahead.lineNumber) && token.value === 'async') {
   3252 	                if (this.lookahead.type === 3 /* Identifier */ || this.matchKeyword('yield')) {
   3253 	                    var arg = this.parsePrimaryExpression();
   3254 	                    this.reinterpretExpressionAsPattern(arg);
   3255 	                    expr = {
   3256 	                        type: ArrowParameterPlaceHolder,
   3257 	                        params: [arg],
   3258 	                        async: true
   3259 	                    };
   3260 	                }
   3261 	            }
   3262 	            if (expr.type === ArrowParameterPlaceHolder || this.match('=>')) {
   3263 	                // https://tc39.github.io/ecma262/#sec-arrow-function-definitions
   3264 	                this.context.isAssignmentTarget = false;
   3265 	                this.context.isBindingElement = false;
   3266 	                var isAsync = expr.async;
   3267 	                var list = this.reinterpretAsCoverFormalsList(expr);
   3268 	                if (list) {
   3269 	                    if (this.hasLineTerminator) {
   3270 	                        this.tolerateUnexpectedToken(this.lookahead);
   3271 	                    }
   3272 	                    this.context.firstCoverInitializedNameError = null;
   3273 	                    var previousStrict = this.context.strict;
   3274 	                    var previousAllowStrictDirective = this.context.allowStrictDirective;
   3275 	                    this.context.allowStrictDirective = list.simple;
   3276 	                    var previousAllowYield = this.context.allowYield;
   3277 	                    var previousAwait = this.context.await;
   3278 	                    this.context.allowYield = true;
   3279 	                    this.context.await = isAsync;
   3280 	                    var node = this.startNode(startToken);
   3281 	                    this.expect('=>');
   3282 	                    var body = void 0;
   3283 	                    if (this.match('{')) {
   3284 	                        var previousAllowIn = this.context.allowIn;
   3285 	                        this.context.allowIn = true;
   3286 	                        body = this.parseFunctionSourceElements();
   3287 	                        this.context.allowIn = previousAllowIn;
   3288 	                    }
   3289 	                    else {
   3290 	                        body = this.isolateCoverGrammar(this.parseAssignmentExpression);
   3291 	                    }
   3292 	                    var expression = body.type !== syntax_1.Syntax.BlockStatement;
   3293 	                    if (this.context.strict && list.firstRestricted) {
   3294 	                        this.throwUnexpectedToken(list.firstRestricted, list.message);
   3295 	                    }
   3296 	                    if (this.context.strict && list.stricted) {
   3297 	                        this.tolerateUnexpectedToken(list.stricted, list.message);
   3298 	                    }
   3299 	                    expr = isAsync ? this.finalize(node, new Node.AsyncArrowFunctionExpression(list.params, body, expression)) :
   3300 	                        this.finalize(node, new Node.ArrowFunctionExpression(list.params, body, expression));
   3301 	                    this.context.strict = previousStrict;
   3302 	                    this.context.allowStrictDirective = previousAllowStrictDirective;
   3303 	                    this.context.allowYield = previousAllowYield;
   3304 	                    this.context.await = previousAwait;
   3305 	                }
   3306 	            }
   3307 	            else {
   3308 	                if (this.matchAssign()) {
   3309 	                    if (!this.context.isAssignmentTarget) {
   3310 	                        this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);
   3311 	                    }
   3312 	                    if (this.context.strict && expr.type === syntax_1.Syntax.Identifier) {
   3313 	                        var id = expr;
   3314 	                        if (this.scanner.isRestrictedWord(id.name)) {
   3315 	                            this.tolerateUnexpectedToken(token, messages_1.Messages.StrictLHSAssignment);
   3316 	                        }
   3317 	                        if (this.scanner.isStrictModeReservedWord(id.name)) {
   3318 	                            this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);
   3319 	                        }
   3320 	                    }
   3321 	                    if (!this.match('=')) {
   3322 	                        this.context.isAssignmentTarget = false;
   3323 	                        this.context.isBindingElement = false;
   3324 	                    }
   3325 	                    else {
   3326 	                        this.reinterpretExpressionAsPattern(expr);
   3327 	                    }
   3328 	                    token = this.nextToken();
   3329 	                    var operator = token.value;
   3330 	                    var right = this.isolateCoverGrammar(this.parseAssignmentExpression);
   3331 	                    expr = this.finalize(this.startNode(startToken), new Node.AssignmentExpression(operator, expr, right));
   3332 	                    this.context.firstCoverInitializedNameError = null;
   3333 	                }
   3334 	            }
   3335 	        }
   3336 	        return expr;
   3337 	    };
   3338 	    // https://tc39.github.io/ecma262/#sec-comma-operator
   3339 	    Parser.prototype.parseExpression = function () {
   3340 	        var startToken = this.lookahead;
   3341 	        var expr = this.isolateCoverGrammar(this.parseAssignmentExpression);
   3342 	        if (this.match(',')) {
   3343 	            var expressions = [];
   3344 	            expressions.push(expr);
   3345 	            while (this.lookahead.type !== 2 /* EOF */) {
   3346 	                if (!this.match(',')) {
   3347 	                    break;
   3348 	                }
   3349 	                this.nextToken();
   3350 	                expressions.push(this.isolateCoverGrammar(this.parseAssignmentExpression));
   3351 	            }
   3352 	            expr = this.finalize(this.startNode(startToken), new Node.SequenceExpression(expressions));
   3353 	        }
   3354 	        return expr;
   3355 	    };
   3356 	    // https://tc39.github.io/ecma262/#sec-block
   3357 	    Parser.prototype.parseStatementListItem = function () {
   3358 	        var statement;
   3359 	        this.context.isAssignmentTarget = true;
   3360 	        this.context.isBindingElement = true;
   3361 	        if (this.lookahead.type === 4 /* Keyword */) {
   3362 	            switch (this.lookahead.value) {
   3363 	                case 'export':
   3364 	                    if (!this.context.isModule) {
   3365 	                        this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.IllegalExportDeclaration);
   3366 	                    }
   3367 	                    statement = this.parseExportDeclaration();
   3368 	                    break;
   3369 	                case 'import':
   3370 	                    if (!this.context.isModule) {
   3371 	                        this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.IllegalImportDeclaration);
   3372 	                    }
   3373 	                    statement = this.parseImportDeclaration();
   3374 	                    break;
   3375 	                case 'const':
   3376 	                    statement = this.parseLexicalDeclaration({ inFor: false });
   3377 	                    break;
   3378 	                case 'function':
   3379 	                    statement = this.parseFunctionDeclaration();
   3380 	                    break;
   3381 	                case 'class':
   3382 	                    statement = this.parseClassDeclaration();
   3383 	                    break;
   3384 	                case 'let':
   3385 	                    statement = this.isLexicalDeclaration() ? this.parseLexicalDeclaration({ inFor: false }) : this.parseStatement();
   3386 	                    break;
   3387 	                default:
   3388 	                    statement = this.parseStatement();
   3389 	                    break;
   3390 	            }
   3391 	        }
   3392 	        else {
   3393 	            statement = this.parseStatement();
   3394 	        }
   3395 	        return statement;
   3396 	    };
   3397 	    Parser.prototype.parseBlock = function () {
   3398 	        var node = this.createNode();
   3399 	        this.expect('{');
   3400 	        var block = [];
   3401 	        while (true) {
   3402 	            if (this.match('}')) {
   3403 	                break;
   3404 	            }
   3405 	            block.push(this.parseStatementListItem());
   3406 	        }
   3407 	        this.expect('}');
   3408 	        return this.finalize(node, new Node.BlockStatement(block));
   3409 	    };
   3410 	    // https://tc39.github.io/ecma262/#sec-let-and-const-declarations
   3411 	    Parser.prototype.parseLexicalBinding = function (kind, options) {
   3412 	        var node = this.createNode();
   3413 	        var params = [];
   3414 	        var id = this.parsePattern(params, kind);
   3415 	        if (this.context.strict && id.type === syntax_1.Syntax.Identifier) {
   3416 	            if (this.scanner.isRestrictedWord(id.name)) {
   3417 	                this.tolerateError(messages_1.Messages.StrictVarName);
   3418 	            }
   3419 	        }
   3420 	        var init = null;
   3421 	        if (kind === 'const') {
   3422 	            if (!this.matchKeyword('in') && !this.matchContextualKeyword('of')) {
   3423 	                if (this.match('=')) {
   3424 	                    this.nextToken();
   3425 	                    init = this.isolateCoverGrammar(this.parseAssignmentExpression);
   3426 	                }
   3427 	                else {
   3428 	                    this.throwError(messages_1.Messages.DeclarationMissingInitializer, 'const');
   3429 	                }
   3430 	            }
   3431 	        }
   3432 	        else if ((!options.inFor && id.type !== syntax_1.Syntax.Identifier) || this.match('=')) {
   3433 	            this.expect('=');
   3434 	            init = this.isolateCoverGrammar(this.parseAssignmentExpression);
   3435 	        }
   3436 	        return this.finalize(node, new Node.VariableDeclarator(id, init));
   3437 	    };
   3438 	    Parser.prototype.parseBindingList = function (kind, options) {
   3439 	        var list = [this.parseLexicalBinding(kind, options)];
   3440 	        while (this.match(',')) {
   3441 	            this.nextToken();
   3442 	            list.push(this.parseLexicalBinding(kind, options));
   3443 	        }
   3444 	        return list;
   3445 	    };
   3446 	    Parser.prototype.isLexicalDeclaration = function () {
   3447 	        var state = this.scanner.saveState();
   3448 	        this.scanner.scanComments();
   3449 	        var next = this.scanner.lex();
   3450 	        this.scanner.restoreState(state);
   3451 	        return (next.type === 3 /* Identifier */) ||
   3452 	            (next.type === 7 /* Punctuator */ && next.value === '[') ||
   3453 	            (next.type === 7 /* Punctuator */ && next.value === '{') ||
   3454 	            (next.type === 4 /* Keyword */ && next.value === 'let') ||
   3455 	            (next.type === 4 /* Keyword */ && next.value === 'yield');
   3456 	    };
   3457 	    Parser.prototype.parseLexicalDeclaration = function (options) {
   3458 	        var node = this.createNode();
   3459 	        var kind = this.nextToken().value;
   3460 	        assert_1.assert(kind === 'let' || kind === 'const', 'Lexical declaration must be either let or const');
   3461 	        var declarations = this.parseBindingList(kind, options);
   3462 	        this.consumeSemicolon();
   3463 	        return this.finalize(node, new Node.VariableDeclaration(declarations, kind));
   3464 	    };
   3465 	    // https://tc39.github.io/ecma262/#sec-destructuring-binding-patterns
   3466 	    Parser.prototype.parseBindingRestElement = function (params, kind) {
   3467 	        var node = this.createNode();
   3468 	        this.expect('...');
   3469 	        var arg = this.parsePattern(params, kind);
   3470 	        return this.finalize(node, new Node.RestElement(arg));
   3471 	    };
   3472 	    Parser.prototype.parseArrayPattern = function (params, kind) {
   3473 	        var node = this.createNode();
   3474 	        this.expect('[');
   3475 	        var elements = [];
   3476 	        while (!this.match(']')) {
   3477 	            if (this.match(',')) {
   3478 	                this.nextToken();
   3479 	                elements.push(null);
   3480 	            }
   3481 	            else {
   3482 	                if (this.match('...')) {
   3483 	                    elements.push(this.parseBindingRestElement(params, kind));
   3484 	                    break;
   3485 	                }
   3486 	                else {
   3487 	                    elements.push(this.parsePatternWithDefault(params, kind));
   3488 	                }
   3489 	                if (!this.match(']')) {
   3490 	                    this.expect(',');
   3491 	                }
   3492 	            }
   3493 	        }
   3494 	        this.expect(']');
   3495 	        return this.finalize(node, new Node.ArrayPattern(elements));
   3496 	    };
   3497 	    Parser.prototype.parsePropertyPattern = function (params, kind) {
   3498 	        var node = this.createNode();
   3499 	        var computed = false;
   3500 	        var shorthand = false;
   3501 	        var method = false;
   3502 	        var key;
   3503 	        var value;
   3504 	        if (this.lookahead.type === 3 /* Identifier */) {
   3505 	            var keyToken = this.lookahead;
   3506 	            key = this.parseVariableIdentifier();
   3507 	            var init = this.finalize(node, new Node.Identifier(keyToken.value));
   3508 	            if (this.match('=')) {
   3509 	                params.push(keyToken);
   3510 	                shorthand = true;
   3511 	                this.nextToken();
   3512 	                var expr = this.parseAssignmentExpression();
   3513 	                value = this.finalize(this.startNode(keyToken), new Node.AssignmentPattern(init, expr));
   3514 	            }
   3515 	            else if (!this.match(':')) {
   3516 	                params.push(keyToken);
   3517 	                shorthand = true;
   3518 	                value = init;
   3519 	            }
   3520 	            else {
   3521 	                this.expect(':');
   3522 	                value = this.parsePatternWithDefault(params, kind);
   3523 	            }
   3524 	        }
   3525 	        else {
   3526 	            computed = this.match('[');
   3527 	            key = this.parseObjectPropertyKey();
   3528 	            this.expect(':');
   3529 	            value = this.parsePatternWithDefault(params, kind);
   3530 	        }
   3531 	        return this.finalize(node, new Node.Property('init', key, computed, value, method, shorthand));
   3532 	    };
   3533 	    Parser.prototype.parseObjectPattern = function (params, kind) {
   3534 	        var node = this.createNode();
   3535 	        var properties = [];
   3536 	        this.expect('{');
   3537 	        while (!this.match('}')) {
   3538 	            properties.push(this.parsePropertyPattern(params, kind));
   3539 	            if (!this.match('}')) {
   3540 	                this.expect(',');
   3541 	            }
   3542 	        }
   3543 	        this.expect('}');
   3544 	        return this.finalize(node, new Node.ObjectPattern(properties));
   3545 	    };
   3546 	    Parser.prototype.parsePattern = function (params, kind) {
   3547 	        var pattern;
   3548 	        if (this.match('[')) {
   3549 	            pattern = this.parseArrayPattern(params, kind);
   3550 	        }
   3551 	        else if (this.match('{')) {
   3552 	            pattern = this.parseObjectPattern(params, kind);
   3553 	        }
   3554 	        else {
   3555 	            if (this.matchKeyword('let') && (kind === 'const' || kind === 'let')) {
   3556 	                this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.LetInLexicalBinding);
   3557 	            }
   3558 	            params.push(this.lookahead);
   3559 	            pattern = this.parseVariableIdentifier(kind);
   3560 	        }
   3561 	        return pattern;
   3562 	    };
   3563 	    Parser.prototype.parsePatternWithDefault = function (params, kind) {
   3564 	        var startToken = this.lookahead;
   3565 	        var pattern = this.parsePattern(params, kind);
   3566 	        if (this.match('=')) {
   3567 	            this.nextToken();
   3568 	            var previousAllowYield = this.context.allowYield;
   3569 	            this.context.allowYield = true;
   3570 	            var right = this.isolateCoverGrammar(this.parseAssignmentExpression);
   3571 	            this.context.allowYield = previousAllowYield;
   3572 	            pattern = this.finalize(this.startNode(startToken), new Node.AssignmentPattern(pattern, right));
   3573 	        }
   3574 	        return pattern;
   3575 	    };
   3576 	    // https://tc39.github.io/ecma262/#sec-variable-statement
   3577 	    Parser.prototype.parseVariableIdentifier = function (kind) {
   3578 	        var node = this.createNode();
   3579 	        var token = this.nextToken();
   3580 	        if (token.type === 4 /* Keyword */ && token.value === 'yield') {
   3581 	            if (this.context.strict) {
   3582 	                this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);
   3583 	            }
   3584 	            else if (!this.context.allowYield) {
   3585 	                this.throwUnexpectedToken(token);
   3586 	            }
   3587 	        }
   3588 	        else if (token.type !== 3 /* Identifier */) {
   3589 	            if (this.context.strict && token.type === 4 /* Keyword */ && this.scanner.isStrictModeReservedWord(token.value)) {
   3590 	                this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);
   3591 	            }
   3592 	            else {
   3593 	                if (this.context.strict || token.value !== 'let' || kind !== 'var') {
   3594 	                    this.throwUnexpectedToken(token);
   3595 	                }
   3596 	            }
   3597 	        }
   3598 	        else if ((this.context.isModule || this.context.await) && token.type === 3 /* Identifier */ && token.value === 'await') {
   3599 	            this.tolerateUnexpectedToken(token);
   3600 	        }
   3601 	        return this.finalize(node, new Node.Identifier(token.value));
   3602 	    };
   3603 	    Parser.prototype.parseVariableDeclaration = function (options) {
   3604 	        var node = this.createNode();
   3605 	        var params = [];
   3606 	        var id = this.parsePattern(params, 'var');
   3607 	        if (this.context.strict && id.type === syntax_1.Syntax.Identifier) {
   3608 	            if (this.scanner.isRestrictedWord(id.name)) {
   3609 	                this.tolerateError(messages_1.Messages.StrictVarName);
   3610 	            }
   3611 	        }
   3612 	        var init = null;
   3613 	        if (this.match('=')) {
   3614 	            this.nextToken();
   3615 	            init = this.isolateCoverGrammar(this.parseAssignmentExpression);
   3616 	        }
   3617 	        else if (id.type !== syntax_1.Syntax.Identifier && !options.inFor) {
   3618 	            this.expect('=');
   3619 	        }
   3620 	        return this.finalize(node, new Node.VariableDeclarator(id, init));
   3621 	    };
   3622 	    Parser.prototype.parseVariableDeclarationList = function (options) {
   3623 	        var opt = { inFor: options.inFor };
   3624 	        var list = [];
   3625 	        list.push(this.parseVariableDeclaration(opt));
   3626 	        while (this.match(',')) {
   3627 	            this.nextToken();
   3628 	            list.push(this.parseVariableDeclaration(opt));
   3629 	        }
   3630 	        return list;
   3631 	    };
   3632 	    Parser.prototype.parseVariableStatement = function () {
   3633 	        var node = this.createNode();
   3634 	        this.expectKeyword('var');
   3635 	        var declarations = this.parseVariableDeclarationList({ inFor: false });
   3636 	        this.consumeSemicolon();
   3637 	        return this.finalize(node, new Node.VariableDeclaration(declarations, 'var'));
   3638 	    };
   3639 	    // https://tc39.github.io/ecma262/#sec-empty-statement
   3640 	    Parser.prototype.parseEmptyStatement = function () {
   3641 	        var node = this.createNode();
   3642 	        this.expect(';');
   3643 	        return this.finalize(node, new Node.EmptyStatement());
   3644 	    };
   3645 	    // https://tc39.github.io/ecma262/#sec-expression-statement
   3646 	    Parser.prototype.parseExpressionStatement = function () {
   3647 	        var node = this.createNode();
   3648 	        var expr = this.parseExpression();
   3649 	        this.consumeSemicolon();
   3650 	        return this.finalize(node, new Node.ExpressionStatement(expr));
   3651 	    };
   3652 	    // https://tc39.github.io/ecma262/#sec-if-statement
   3653 	    Parser.prototype.parseIfClause = function () {
   3654 	        if (this.context.strict && this.matchKeyword('function')) {
   3655 	            this.tolerateError(messages_1.Messages.StrictFunction);
   3656 	        }
   3657 	        return this.parseStatement();
   3658 	    };
   3659 	    Parser.prototype.parseIfStatement = function () {
   3660 	        var node = this.createNode();
   3661 	        var consequent;
   3662 	        var alternate = null;
   3663 	        this.expectKeyword('if');
   3664 	        this.expect('(');
   3665 	        var test = this.parseExpression();
   3666 	        if (!this.match(')') && this.config.tolerant) {
   3667 	            this.tolerateUnexpectedToken(this.nextToken());
   3668 	            consequent = this.finalize(this.createNode(), new Node.EmptyStatement());
   3669 	        }
   3670 	        else {
   3671 	            this.expect(')');
   3672 	            consequent = this.parseIfClause();
   3673 	            if (this.matchKeyword('else')) {
   3674 	                this.nextToken();
   3675 	                alternate = this.parseIfClause();
   3676 	            }
   3677 	        }
   3678 	        return this.finalize(node, new Node.IfStatement(test, consequent, alternate));
   3679 	    };
   3680 	    // https://tc39.github.io/ecma262/#sec-do-while-statement
   3681 	    Parser.prototype.parseDoWhileStatement = function () {
   3682 	        var node = this.createNode();
   3683 	        this.expectKeyword('do');
   3684 	        var previousInIteration = this.context.inIteration;
   3685 	        this.context.inIteration = true;
   3686 	        var body = this.parseStatement();
   3687 	        this.context.inIteration = previousInIteration;
   3688 	        this.expectKeyword('while');
   3689 	        this.expect('(');
   3690 	        var test = this.parseExpression();
   3691 	        if (!this.match(')') && this.config.tolerant) {
   3692 	            this.tolerateUnexpectedToken(this.nextToken());
   3693 	        }
   3694 	        else {
   3695 	            this.expect(')');
   3696 	            if (this.match(';')) {
   3697 	                this.nextToken();
   3698 	            }
   3699 	        }
   3700 	        return this.finalize(node, new Node.DoWhileStatement(body, test));
   3701 	    };
   3702 	    // https://tc39.github.io/ecma262/#sec-while-statement
   3703 	    Parser.prototype.parseWhileStatement = function () {
   3704 	        var node = this.createNode();
   3705 	        var body;
   3706 	        this.expectKeyword('while');
   3707 	        this.expect('(');
   3708 	        var test = this.parseExpression();
   3709 	        if (!this.match(')') && this.config.tolerant) {
   3710 	            this.tolerateUnexpectedToken(this.nextToken());
   3711 	            body = this.finalize(this.createNode(), new Node.EmptyStatement());
   3712 	        }
   3713 	        else {
   3714 	            this.expect(')');
   3715 	            var previousInIteration = this.context.inIteration;
   3716 	            this.context.inIteration = true;
   3717 	            body = this.parseStatement();
   3718 	            this.context.inIteration = previousInIteration;
   3719 	        }
   3720 	        return this.finalize(node, new Node.WhileStatement(test, body));
   3721 	    };
   3722 	    // https://tc39.github.io/ecma262/#sec-for-statement
   3723 	    // https://tc39.github.io/ecma262/#sec-for-in-and-for-of-statements
   3724 	    Parser.prototype.parseForStatement = function () {
   3725 	        var init = null;
   3726 	        var test = null;
   3727 	        var update = null;
   3728 	        var forIn = true;
   3729 	        var left, right;
   3730 	        var node = this.createNode();
   3731 	        this.expectKeyword('for');
   3732 	        this.expect('(');
   3733 	        if (this.match(';')) {
   3734 	            this.nextToken();
   3735 	        }
   3736 	        else {
   3737 	            if (this.matchKeyword('var')) {
   3738 	                init = this.createNode();
   3739 	                this.nextToken();
   3740 	                var previousAllowIn = this.context.allowIn;
   3741 	                this.context.allowIn = false;
   3742 	                var declarations = this.parseVariableDeclarationList({ inFor: true });
   3743 	                this.context.allowIn = previousAllowIn;
   3744 	                if (declarations.length === 1 && this.matchKeyword('in')) {
   3745 	                    var decl = declarations[0];
   3746 	                    if (decl.init && (decl.id.type === syntax_1.Syntax.ArrayPattern || decl.id.type === syntax_1.Syntax.ObjectPattern || this.context.strict)) {
   3747 	                        this.tolerateError(messages_1.Messages.ForInOfLoopInitializer, 'for-in');
   3748 	                    }
   3749 	                    init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));
   3750 	                    this.nextToken();
   3751 	                    left = init;
   3752 	                    right = this.parseExpression();
   3753 	                    init = null;
   3754 	                }
   3755 	                else if (declarations.length === 1 && declarations[0].init === null && this.matchContextualKeyword('of')) {
   3756 	                    init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));
   3757 	                    this.nextToken();
   3758 	                    left = init;
   3759 	                    right = this.parseAssignmentExpression();
   3760 	                    init = null;
   3761 	                    forIn = false;
   3762 	                }
   3763 	                else {
   3764 	                    init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));
   3765 	                    this.expect(';');
   3766 	                }
   3767 	            }
   3768 	            else if (this.matchKeyword('const') || this.matchKeyword('let')) {
   3769 	                init = this.createNode();
   3770 	                var kind = this.nextToken().value;
   3771 	                if (!this.context.strict && this.lookahead.value === 'in') {
   3772 	                    init = this.finalize(init, new Node.Identifier(kind));
   3773 	                    this.nextToken();
   3774 	                    left = init;
   3775 	                    right = this.parseExpression();
   3776 	                    init = null;
   3777 	                }
   3778 	                else {
   3779 	                    var previousAllowIn = this.context.allowIn;
   3780 	                    this.context.allowIn = false;
   3781 	                    var declarations = this.parseBindingList(kind, { inFor: true });
   3782 	                    this.context.allowIn = previousAllowIn;
   3783 	                    if (declarations.length === 1 && declarations[0].init === null && this.matchKeyword('in')) {
   3784 	                        init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));
   3785 	                        this.nextToken();
   3786 	                        left = init;
   3787 	                        right = this.parseExpression();
   3788 	                        init = null;
   3789 	                    }
   3790 	                    else if (declarations.length === 1 && declarations[0].init === null && this.matchContextualKeyword('of')) {
   3791 	                        init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));
   3792 	                        this.nextToken();
   3793 	                        left = init;
   3794 	                        right = this.parseAssignmentExpression();
   3795 	                        init = null;
   3796 	                        forIn = false;
   3797 	                    }
   3798 	                    else {
   3799 	                        this.consumeSemicolon();
   3800 	                        init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));
   3801 	                    }
   3802 	                }
   3803 	            }
   3804 	            else {
   3805 	                var initStartToken = this.lookahead;
   3806 	                var previousAllowIn = this.context.allowIn;
   3807 	                this.context.allowIn = false;
   3808 	                init = this.inheritCoverGrammar(this.parseAssignmentExpression);
   3809 	                this.context.allowIn = previousAllowIn;
   3810 	                if (this.matchKeyword('in')) {
   3811 	                    if (!this.context.isAssignmentTarget || init.type === syntax_1.Syntax.AssignmentExpression) {
   3812 	                        this.tolerateError(messages_1.Messages.InvalidLHSInForIn);
   3813 	                    }
   3814 	                    this.nextToken();
   3815 	                    this.reinterpretExpressionAsPattern(init);
   3816 	                    left = init;
   3817 	                    right = this.parseExpression();
   3818 	                    init = null;
   3819 	                }
   3820 	                else if (this.matchContextualKeyword('of')) {
   3821 	                    if (!this.context.isAssignmentTarget || init.type === syntax_1.Syntax.AssignmentExpression) {
   3822 	                        this.tolerateError(messages_1.Messages.InvalidLHSInForLoop);
   3823 	                    }
   3824 	                    this.nextToken();
   3825 	                    this.reinterpretExpressionAsPattern(init);
   3826 	                    left = init;
   3827 	                    right = this.parseAssignmentExpression();
   3828 	                    init = null;
   3829 	                    forIn = false;
   3830 	                }
   3831 	                else {
   3832 	                    if (this.match(',')) {
   3833 	                        var initSeq = [init];
   3834 	                        while (this.match(',')) {
   3835 	                            this.nextToken();
   3836 	                            initSeq.push(this.isolateCoverGrammar(this.parseAssignmentExpression));
   3837 	                        }
   3838 	                        init = this.finalize(this.startNode(initStartToken), new Node.SequenceExpression(initSeq));
   3839 	                    }
   3840 	                    this.expect(';');
   3841 	                }
   3842 	            }
   3843 	        }
   3844 	        if (typeof left === 'undefined') {
   3845 	            if (!this.match(';')) {
   3846 	                test = this.parseExpression();
   3847 	            }
   3848 	            this.expect(';');
   3849 	            if (!this.match(')')) {
   3850 	                update = this.parseExpression();
   3851 	            }
   3852 	        }
   3853 	        var body;
   3854 	        if (!this.match(')') && this.config.tolerant) {
   3855 	            this.tolerateUnexpectedToken(this.nextToken());
   3856 	            body = this.finalize(this.createNode(), new Node.EmptyStatement());
   3857 	        }
   3858 	        else {
   3859 	            this.expect(')');
   3860 	            var previousInIteration = this.context.inIteration;
   3861 	            this.context.inIteration = true;
   3862 	            body = this.isolateCoverGrammar(this.parseStatement);
   3863 	            this.context.inIteration = previousInIteration;
   3864 	        }
   3865 	        return (typeof left === 'undefined') ?
   3866 	            this.finalize(node, new Node.ForStatement(init, test, update, body)) :
   3867 	            forIn ? this.finalize(node, new Node.ForInStatement(left, right, body)) :
   3868 	                this.finalize(node, new Node.ForOfStatement(left, right, body));
   3869 	    };
   3870 	    // https://tc39.github.io/ecma262/#sec-continue-statement
   3871 	    Parser.prototype.parseContinueStatement = function () {
   3872 	        var node = this.createNode();
   3873 	        this.expectKeyword('continue');
   3874 	        var label = null;
   3875 	        if (this.lookahead.type === 3 /* Identifier */ && !this.hasLineTerminator) {
   3876 	            var id = this.parseVariableIdentifier();
   3877 	            label = id;
   3878 	            var key = '$' + id.name;
   3879 	            if (!Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {
   3880 	                this.throwError(messages_1.Messages.UnknownLabel, id.name);
   3881 	            }
   3882 	        }
   3883 	        this.consumeSemicolon();
   3884 	        if (label === null && !this.context.inIteration) {
   3885 	            this.throwError(messages_1.Messages.IllegalContinue);
   3886 	        }
   3887 	        return this.finalize(node, new Node.ContinueStatement(label));
   3888 	    };
   3889 	    // https://tc39.github.io/ecma262/#sec-break-statement
   3890 	    Parser.prototype.parseBreakStatement = function () {
   3891 	        var node = this.createNode();
   3892 	        this.expectKeyword('break');
   3893 	        var label = null;
   3894 	        if (this.lookahead.type === 3 /* Identifier */ && !this.hasLineTerminator) {
   3895 	            var id = this.parseVariableIdentifier();
   3896 	            var key = '$' + id.name;
   3897 	            if (!Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {
   3898 	                this.throwError(messages_1.Messages.UnknownLabel, id.name);
   3899 	            }
   3900 	            label = id;
   3901 	        }
   3902 	        this.consumeSemicolon();
   3903 	        if (label === null && !this.context.inIteration && !this.context.inSwitch) {
   3904 	            this.throwError(messages_1.Messages.IllegalBreak);
   3905 	        }
   3906 	        return this.finalize(node, new Node.BreakStatement(label));
   3907 	    };
   3908 	    // https://tc39.github.io/ecma262/#sec-return-statement
   3909 	    Parser.prototype.parseReturnStatement = function () {
   3910 	        if (!this.context.inFunctionBody) {
   3911 	            this.tolerateError(messages_1.Messages.IllegalReturn);
   3912 	        }
   3913 	        var node = this.createNode();
   3914 	        this.expectKeyword('return');
   3915 	        var hasArgument = (!this.match(';') && !this.match('}') &&
   3916 	            !this.hasLineTerminator && this.lookahead.type !== 2 /* EOF */) ||
   3917 	            this.lookahead.type === 8 /* StringLiteral */ ||
   3918 	            this.lookahead.type === 10 /* Template */;
   3919 	        var argument = hasArgument ? this.parseExpression() : null;
   3920 	        this.consumeSemicolon();
   3921 	        return this.finalize(node, new Node.ReturnStatement(argument));
   3922 	    };
   3923 	    // https://tc39.github.io/ecma262/#sec-with-statement
   3924 	    Parser.prototype.parseWithStatement = function () {
   3925 	        if (this.context.strict) {
   3926 	            this.tolerateError(messages_1.Messages.StrictModeWith);
   3927 	        }
   3928 	        var node = this.createNode();
   3929 	        var body;
   3930 	        this.expectKeyword('with');
   3931 	        this.expect('(');
   3932 	        var object = this.parseExpression();
   3933 	        if (!this.match(')') && this.config.tolerant) {
   3934 	            this.tolerateUnexpectedToken(this.nextToken());
   3935 	            body = this.finalize(this.createNode(), new Node.EmptyStatement());
   3936 	        }
   3937 	        else {
   3938 	            this.expect(')');
   3939 	            body = this.parseStatement();
   3940 	        }
   3941 	        return this.finalize(node, new Node.WithStatement(object, body));
   3942 	    };
   3943 	    // https://tc39.github.io/ecma262/#sec-switch-statement
   3944 	    Parser.prototype.parseSwitchCase = function () {
   3945 	        var node = this.createNode();
   3946 	        var test;
   3947 	        if (this.matchKeyword('default')) {
   3948 	            this.nextToken();
   3949 	            test = null;
   3950 	        }
   3951 	        else {
   3952 	            this.expectKeyword('case');
   3953 	            test = this.parseExpression();
   3954 	        }
   3955 	        this.expect(':');
   3956 	        var consequent = [];
   3957 	        while (true) {
   3958 	            if (this.match('}') || this.matchKeyword('default') || this.matchKeyword('case')) {
   3959 	                break;
   3960 	            }
   3961 	            consequent.push(this.parseStatementListItem());
   3962 	        }
   3963 	        return this.finalize(node, new Node.SwitchCase(test, consequent));
   3964 	    };
   3965 	    Parser.prototype.parseSwitchStatement = function () {
   3966 	        var node = this.createNode();
   3967 	        this.expectKeyword('switch');
   3968 	        this.expect('(');
   3969 	        var discriminant = this.parseExpression();
   3970 	        this.expect(')');
   3971 	        var previousInSwitch = this.context.inSwitch;
   3972 	        this.context.inSwitch = true;
   3973 	        var cases = [];
   3974 	        var defaultFound = false;
   3975 	        this.expect('{');
   3976 	        while (true) {
   3977 	            if (this.match('}')) {
   3978 	                break;
   3979 	            }
   3980 	            var clause = this.parseSwitchCase();
   3981 	            if (clause.test === null) {
   3982 	                if (defaultFound) {
   3983 	                    this.throwError(messages_1.Messages.MultipleDefaultsInSwitch);
   3984 	                }
   3985 	                defaultFound = true;
   3986 	            }
   3987 	            cases.push(clause);
   3988 	        }
   3989 	        this.expect('}');
   3990 	        this.context.inSwitch = previousInSwitch;
   3991 	        return this.finalize(node, new Node.SwitchStatement(discriminant, cases));
   3992 	    };
   3993 	    // https://tc39.github.io/ecma262/#sec-labelled-statements
   3994 	    Parser.prototype.parseLabelledStatement = function () {
   3995 	        var node = this.createNode();
   3996 	        var expr = this.parseExpression();
   3997 	        var statement;
   3998 	        if ((expr.type === syntax_1.Syntax.Identifier) && this.match(':')) {
   3999 	            this.nextToken();
   4000 	            var id = expr;
   4001 	            var key = '$' + id.name;
   4002 	            if (Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {
   4003 	                this.throwError(messages_1.Messages.Redeclaration, 'Label', id.name);
   4004 	            }
   4005 	            this.context.labelSet[key] = true;
   4006 	            var body = void 0;
   4007 	            if (this.matchKeyword('class')) {
   4008 	                this.tolerateUnexpectedToken(this.lookahead);
   4009 	                body = this.parseClassDeclaration();
   4010 	            }
   4011 	            else if (this.matchKeyword('function')) {
   4012 	                var token = this.lookahead;
   4013 	                var declaration = this.parseFunctionDeclaration();
   4014 	                if (this.context.strict) {
   4015 	                    this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunction);
   4016 	                }
   4017 	                else if (declaration.generator) {
   4018 	                    this.tolerateUnexpectedToken(token, messages_1.Messages.GeneratorInLegacyContext);
   4019 	                }
   4020 	                body = declaration;
   4021 	            }
   4022 	            else {
   4023 	                body = this.parseStatement();
   4024 	            }
   4025 	            delete this.context.labelSet[key];
   4026 	            statement = new Node.LabeledStatement(id, body);
   4027 	        }
   4028 	        else {
   4029 	            this.consumeSemicolon();
   4030 	            statement = new Node.ExpressionStatement(expr);
   4031 	        }
   4032 	        return this.finalize(node, statement);
   4033 	    };
   4034 	    // https://tc39.github.io/ecma262/#sec-throw-statement
   4035 	    Parser.prototype.parseThrowStatement = function () {
   4036 	        var node = this.createNode();
   4037 	        this.expectKeyword('throw');
   4038 	        if (this.hasLineTerminator) {
   4039 	            this.throwError(messages_1.Messages.NewlineAfterThrow);
   4040 	        }
   4041 	        var argument = this.parseExpression();
   4042 	        this.consumeSemicolon();
   4043 	        return this.finalize(node, new Node.ThrowStatement(argument));
   4044 	    };
   4045 	    // https://tc39.github.io/ecma262/#sec-try-statement
   4046 	    Parser.prototype.parseCatchClause = function () {
   4047 	        var node = this.createNode();
   4048 	        this.expectKeyword('catch');
   4049 	        this.expect('(');
   4050 	        if (this.match(')')) {
   4051 	            this.throwUnexpectedToken(this.lookahead);
   4052 	        }
   4053 	        var params = [];
   4054 	        var param = this.parsePattern(params);
   4055 	        var paramMap = {};
   4056 	        for (var i = 0; i < params.length; i++) {
   4057 	            var key = '$' + params[i].value;
   4058 	            if (Object.prototype.hasOwnProperty.call(paramMap, key)) {
   4059 	                this.tolerateError(messages_1.Messages.DuplicateBinding, params[i].value);
   4060 	            }
   4061 	            paramMap[key] = true;
   4062 	        }
   4063 	        if (this.context.strict && param.type === syntax_1.Syntax.Identifier) {
   4064 	            if (this.scanner.isRestrictedWord(param.name)) {
   4065 	                this.tolerateError(messages_1.Messages.StrictCatchVariable);
   4066 	            }
   4067 	        }
   4068 	        this.expect(')');
   4069 	        var body = this.parseBlock();
   4070 	        return this.finalize(node, new Node.CatchClause(param, body));
   4071 	    };
   4072 	    Parser.prototype.parseFinallyClause = function () {
   4073 	        this.expectKeyword('finally');
   4074 	        return this.parseBlock();
   4075 	    };
   4076 	    Parser.prototype.parseTryStatement = function () {
   4077 	        var node = this.createNode();
   4078 	        this.expectKeyword('try');
   4079 	        var block = this.parseBlock();
   4080 	        var handler = this.matchKeyword('catch') ? this.parseCatchClause() : null;
   4081 	        var finalizer = this.matchKeyword('finally') ? this.parseFinallyClause() : null;
   4082 	        if (!handler && !finalizer) {
   4083 	            this.throwError(messages_1.Messages.NoCatchOrFinally);
   4084 	        }
   4085 	        return this.finalize(node, new Node.TryStatement(block, handler, finalizer));
   4086 	    };
   4087 	    // https://tc39.github.io/ecma262/#sec-debugger-statement
   4088 	    Parser.prototype.parseDebuggerStatement = function () {
   4089 	        var node = this.createNode();
   4090 	        this.expectKeyword('debugger');
   4091 	        this.consumeSemicolon();
   4092 	        return this.finalize(node, new Node.DebuggerStatement());
   4093 	    };
   4094 	    // https://tc39.github.io/ecma262/#sec-ecmascript-language-statements-and-declarations
   4095 	    Parser.prototype.parseStatement = function () {
   4096 	        var statement;
   4097 	        switch (this.lookahead.type) {
   4098 	            case 1 /* BooleanLiteral */:
   4099 	            case 5 /* NullLiteral */:
   4100 	            case 6 /* NumericLiteral */:
   4101 	            case 8 /* StringLiteral */:
   4102 	            case 10 /* Template */:
   4103 	            case 9 /* RegularExpression */:
   4104 	                statement = this.parseExpressionStatement();
   4105 	                break;
   4106 	            case 7 /* Punctuator */:
   4107 	                var value = this.lookahead.value;
   4108 	                if (value === '{') {
   4109 	                    statement = this.parseBlock();
   4110 	                }
   4111 	                else if (value === '(') {
   4112 	                    statement = this.parseExpressionStatement();
   4113 	                }
   4114 	                else if (value === ';') {
   4115 	                    statement = this.parseEmptyStatement();
   4116 	                }
   4117 	                else {
   4118 	                    statement = this.parseExpressionStatement();
   4119 	                }
   4120 	                break;
   4121 	            case 3 /* Identifier */:
   4122 	                statement = this.matchAsyncFunction() ? this.parseFunctionDeclaration() : this.parseLabelledStatement();
   4123 	                break;
   4124 	            case 4 /* Keyword */:
   4125 	                switch (this.lookahead.value) {
   4126 	                    case 'break':
   4127 	                        statement = this.parseBreakStatement();
   4128 	                        break;
   4129 	                    case 'continue':
   4130 	                        statement = this.parseContinueStatement();
   4131 	                        break;
   4132 	                    case 'debugger':
   4133 	                        statement = this.parseDebuggerStatement();
   4134 	                        break;
   4135 	                    case 'do':
   4136 	                        statement = this.parseDoWhileStatement();
   4137 	                        break;
   4138 	                    case 'for':
   4139 	                        statement = this.parseForStatement();
   4140 	                        break;
   4141 	                    case 'function':
   4142 	                        statement = this.parseFunctionDeclaration();
   4143 	                        break;
   4144 	                    case 'if':
   4145 	                        statement = this.parseIfStatement();
   4146 	                        break;
   4147 	                    case 'return':
   4148 	                        statement = this.parseReturnStatement();
   4149 	                        break;
   4150 	                    case 'switch':
   4151 	                        statement = this.parseSwitchStatement();
   4152 	                        break;
   4153 	                    case 'throw':
   4154 	                        statement = this.parseThrowStatement();
   4155 	                        break;
   4156 	                    case 'try':
   4157 	                        statement = this.parseTryStatement();
   4158 	                        break;
   4159 	                    case 'var':
   4160 	                        statement = this.parseVariableStatement();
   4161 	                        break;
   4162 	                    case 'while':
   4163 	                        statement = this.parseWhileStatement();
   4164 	                        break;
   4165 	                    case 'with':
   4166 	                        statement = this.parseWithStatement();
   4167 	                        break;
   4168 	                    default:
   4169 	                        statement = this.parseExpressionStatement();
   4170 	                        break;
   4171 	                }
   4172 	                break;
   4173 	            default:
   4174 	                statement = this.throwUnexpectedToken(this.lookahead);
   4175 	        }
   4176 	        return statement;
   4177 	    };
   4178 	    // https://tc39.github.io/ecma262/#sec-function-definitions
   4179 	    Parser.prototype.parseFunctionSourceElements = function () {
   4180 	        var node = this.createNode();
   4181 	        this.expect('{');
   4182 	        var body = this.parseDirectivePrologues();
   4183 	        var previousLabelSet = this.context.labelSet;
   4184 	        var previousInIteration = this.context.inIteration;
   4185 	        var previousInSwitch = this.context.inSwitch;
   4186 	        var previousInFunctionBody = this.context.inFunctionBody;
   4187 	        this.context.labelSet = {};
   4188 	        this.context.inIteration = false;
   4189 	        this.context.inSwitch = false;
   4190 	        this.context.inFunctionBody = true;
   4191 	        while (this.lookahead.type !== 2 /* EOF */) {
   4192 	            if (this.match('}')) {
   4193 	                break;
   4194 	            }
   4195 	            body.push(this.parseStatementListItem());
   4196 	        }
   4197 	        this.expect('}');
   4198 	        this.context.labelSet = previousLabelSet;
   4199 	        this.context.inIteration = previousInIteration;
   4200 	        this.context.inSwitch = previousInSwitch;
   4201 	        this.context.inFunctionBody = previousInFunctionBody;
   4202 	        return this.finalize(node, new Node.BlockStatement(body));
   4203 	    };
   4204 	    Parser.prototype.validateParam = function (options, param, name) {
   4205 	        var key = '$' + name;
   4206 	        if (this.context.strict) {
   4207 	            if (this.scanner.isRestrictedWord(name)) {
   4208 	                options.stricted = param;
   4209 	                options.message = messages_1.Messages.StrictParamName;
   4210 	            }
   4211 	            if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) {
   4212 	                options.stricted = param;
   4213 	                options.message = messages_1.Messages.StrictParamDupe;
   4214 	            }
   4215 	        }
   4216 	        else if (!options.firstRestricted) {
   4217 	            if (this.scanner.isRestrictedWord(name)) {
   4218 	                options.firstRestricted = param;
   4219 	                options.message = messages_1.Messages.StrictParamName;
   4220 	            }
   4221 	            else if (this.scanner.isStrictModeReservedWord(name)) {
   4222 	                options.firstRestricted = param;
   4223 	                options.message = messages_1.Messages.StrictReservedWord;
   4224 	            }
   4225 	            else if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) {
   4226 	                options.stricted = param;
   4227 	                options.message = messages_1.Messages.StrictParamDupe;
   4228 	            }
   4229 	        }
   4230 	        /* istanbul ignore next */
   4231 	        if (typeof Object.defineProperty === 'function') {
   4232 	            Object.defineProperty(options.paramSet, key, { value: true, enumerable: true, writable: true, configurable: true });
   4233 	        }
   4234 	        else {
   4235 	            options.paramSet[key] = true;
   4236 	        }
   4237 	    };
   4238 	    Parser.prototype.parseRestElement = function (params) {
   4239 	        var node = this.createNode();
   4240 	        this.expect('...');
   4241 	        var arg = this.parsePattern(params);
   4242 	        if (this.match('=')) {
   4243 	            this.throwError(messages_1.Messages.DefaultRestParameter);
   4244 	        }
   4245 	        if (!this.match(')')) {
   4246 	            this.throwError(messages_1.Messages.ParameterAfterRestParameter);
   4247 	        }
   4248 	        return this.finalize(node, new Node.RestElement(arg));
   4249 	    };
   4250 	    Parser.prototype.parseFormalParameter = function (options) {
   4251 	        var params = [];
   4252 	        var param = this.match('...') ? this.parseRestElement(params) : this.parsePatternWithDefault(params);
   4253 	        for (var i = 0; i < params.length; i++) {
   4254 	            this.validateParam(options, params[i], params[i].value);
   4255 	        }
   4256 	        options.simple = options.simple && (param instanceof Node.Identifier);
   4257 	        options.params.push(param);
   4258 	    };
   4259 	    Parser.prototype.parseFormalParameters = function (firstRestricted) {
   4260 	        var options;
   4261 	        options = {
   4262 	            simple: true,
   4263 	            params: [],
   4264 	            firstRestricted: firstRestricted
   4265 	        };
   4266 	        this.expect('(');
   4267 	        if (!this.match(')')) {
   4268 	            options.paramSet = {};
   4269 	            while (this.lookahead.type !== 2 /* EOF */) {
   4270 	                this.parseFormalParameter(options);
   4271 	                if (this.match(')')) {
   4272 	                    break;
   4273 	                }
   4274 	                this.expect(',');
   4275 	                if (this.match(')')) {
   4276 	                    break;
   4277 	                }
   4278 	            }
   4279 	        }
   4280 	        this.expect(')');
   4281 	        return {
   4282 	            simple: options.simple,
   4283 	            params: options.params,
   4284 	            stricted: options.stricted,
   4285 	            firstRestricted: options.firstRestricted,
   4286 	            message: options.message
   4287 	        };
   4288 	    };
   4289 	    Parser.prototype.matchAsyncFunction = function () {
   4290 	        var match = this.matchContextualKeyword('async');
   4291 	        if (match) {
   4292 	            var state = this.scanner.saveState();
   4293 	            this.scanner.scanComments();
   4294 	            var next = this.scanner.lex();
   4295 	            this.scanner.restoreState(state);
   4296 	            match = (state.lineNumber === next.lineNumber) && (next.type === 4 /* Keyword */) && (next.value === 'function');
   4297 	        }
   4298 	        return match;
   4299 	    };
   4300 	    Parser.prototype.parseFunctionDeclaration = function (identifierIsOptional) {
   4301 	        var node = this.createNode();
   4302 	        var isAsync = this.matchContextualKeyword('async');
   4303 	        if (isAsync) {
   4304 	            this.nextToken();
   4305 	        }
   4306 	        this.expectKeyword('function');
   4307 	        var isGenerator = isAsync ? false : this.match('*');
   4308 	        if (isGenerator) {
   4309 	            this.nextToken();
   4310 	        }
   4311 	        var message;
   4312 	        var id = null;
   4313 	        var firstRestricted = null;
   4314 	        if (!identifierIsOptional || !this.match('(')) {
   4315 	            var token = this.lookahead;
   4316 	            id = this.parseVariableIdentifier();
   4317 	            if (this.context.strict) {
   4318 	                if (this.scanner.isRestrictedWord(token.value)) {
   4319 	                    this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunctionName);
   4320 	                }
   4321 	            }
   4322 	            else {
   4323 	                if (this.scanner.isRestrictedWord(token.value)) {
   4324 	                    firstRestricted = token;
   4325 	                    message = messages_1.Messages.StrictFunctionName;
   4326 	                }
   4327 	                else if (this.scanner.isStrictModeReservedWord(token.value)) {
   4328 	                    firstRestricted = token;
   4329 	                    message = messages_1.Messages.StrictReservedWord;
   4330 	                }
   4331 	            }
   4332 	        }
   4333 	        var previousAllowAwait = this.context.await;
   4334 	        var previousAllowYield = this.context.allowYield;
   4335 	        this.context.await = isAsync;
   4336 	        this.context.allowYield = !isGenerator;
   4337 	        var formalParameters = this.parseFormalParameters(firstRestricted);
   4338 	        var params = formalParameters.params;
   4339 	        var stricted = formalParameters.stricted;
   4340 	        firstRestricted = formalParameters.firstRestricted;
   4341 	        if (formalParameters.message) {
   4342 	            message = formalParameters.message;
   4343 	        }
   4344 	        var previousStrict = this.context.strict;
   4345 	        var previousAllowStrictDirective = this.context.allowStrictDirective;
   4346 	        this.context.allowStrictDirective = formalParameters.simple;
   4347 	        var body = this.parseFunctionSourceElements();
   4348 	        if (this.context.strict && firstRestricted) {
   4349 	            this.throwUnexpectedToken(firstRestricted, message);
   4350 	        }
   4351 	        if (this.context.strict && stricted) {
   4352 	            this.tolerateUnexpectedToken(stricted, message);
   4353 	        }
   4354 	        this.context.strict = previousStrict;
   4355 	        this.context.allowStrictDirective = previousAllowStrictDirective;
   4356 	        this.context.await = previousAllowAwait;
   4357 	        this.context.allowYield = previousAllowYield;
   4358 	        return isAsync ? this.finalize(node, new Node.AsyncFunctionDeclaration(id, params, body)) :
   4359 	            this.finalize(node, new Node.FunctionDeclaration(id, params, body, isGenerator));
   4360 	    };
   4361 	    Parser.prototype.parseFunctionExpression = function () {
   4362 	        var node = this.createNode();
   4363 	        var isAsync = this.matchContextualKeyword('async');
   4364 	        if (isAsync) {
   4365 	            this.nextToken();
   4366 	        }
   4367 	        this.expectKeyword('function');
   4368 	        var isGenerator = isAsync ? false : this.match('*');
   4369 	        if (isGenerator) {
   4370 	            this.nextToken();
   4371 	        }
   4372 	        var message;
   4373 	        var id = null;
   4374 	        var firstRestricted;
   4375 	        var previousAllowAwait = this.context.await;
   4376 	        var previousAllowYield = this.context.allowYield;
   4377 	        this.context.await = isAsync;
   4378 	        this.context.allowYield = !isGenerator;
   4379 	        if (!this.match('(')) {
   4380 	            var token = this.lookahead;
   4381 	            id = (!this.context.strict && !isGenerator && this.matchKeyword('yield')) ? this.parseIdentifierName() : this.parseVariableIdentifier();
   4382 	            if (this.context.strict) {
   4383 	                if (this.scanner.isRestrictedWord(token.value)) {
   4384 	                    this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunctionName);
   4385 	                }
   4386 	            }
   4387 	            else {
   4388 	                if (this.scanner.isRestrictedWord(token.value)) {
   4389 	                    firstRestricted = token;
   4390 	                    message = messages_1.Messages.StrictFunctionName;
   4391 	                }
   4392 	                else if (this.scanner.isStrictModeReservedWord(token.value)) {
   4393 	                    firstRestricted = token;
   4394 	                    message = messages_1.Messages.StrictReservedWord;
   4395 	                }
   4396 	            }
   4397 	        }
   4398 	        var formalParameters = this.parseFormalParameters(firstRestricted);
   4399 	        var params = formalParameters.params;
   4400 	        var stricted = formalParameters.stricted;
   4401 	        firstRestricted = formalParameters.firstRestricted;
   4402 	        if (formalParameters.message) {
   4403 	            message = formalParameters.message;
   4404 	        }
   4405 	        var previousStrict = this.context.strict;
   4406 	        var previousAllowStrictDirective = this.context.allowStrictDirective;
   4407 	        this.context.allowStrictDirective = formalParameters.simple;
   4408 	        var body = this.parseFunctionSourceElements();
   4409 	        if (this.context.strict && firstRestricted) {
   4410 	            this.throwUnexpectedToken(firstRestricted, message);
   4411 	        }
   4412 	        if (this.context.strict && stricted) {
   4413 	            this.tolerateUnexpectedToken(stricted, message);
   4414 	        }
   4415 	        this.context.strict = previousStrict;
   4416 	        this.context.allowStrictDirective = previousAllowStrictDirective;
   4417 	        this.context.await = previousAllowAwait;
   4418 	        this.context.allowYield = previousAllowYield;
   4419 	        return isAsync ? this.finalize(node, new Node.AsyncFunctionExpression(id, params, body)) :
   4420 	            this.finalize(node, new Node.FunctionExpression(id, params, body, isGenerator));
   4421 	    };
   4422 	    // https://tc39.github.io/ecma262/#sec-directive-prologues-and-the-use-strict-directive
   4423 	    Parser.prototype.parseDirective = function () {
   4424 	        var token = this.lookahead;
   4425 	        var node = this.createNode();
   4426 	        var expr = this.parseExpression();
   4427 	        var directive = (expr.type === syntax_1.Syntax.Literal) ? this.getTokenRaw(token).slice(1, -1) : null;
   4428 	        this.consumeSemicolon();
   4429 	        return this.finalize(node, directive ? new Node.Directive(expr, directive) : new Node.ExpressionStatement(expr));
   4430 	    };
   4431 	    Parser.prototype.parseDirectivePrologues = function () {
   4432 	        var firstRestricted = null;
   4433 	        var body = [];
   4434 	        while (true) {
   4435 	            var token = this.lookahead;
   4436 	            if (token.type !== 8 /* StringLiteral */) {
   4437 	                break;
   4438 	            }
   4439 	            var statement = this.parseDirective();
   4440 	            body.push(statement);
   4441 	            var directive = statement.directive;
   4442 	            if (typeof directive !== 'string') {
   4443 	                break;
   4444 	            }
   4445 	            if (directive === 'use strict') {
   4446 	                this.context.strict = true;
   4447 	                if (firstRestricted) {
   4448 	                    this.tolerateUnexpectedToken(firstRestricted, messages_1.Messages.StrictOctalLiteral);
   4449 	                }
   4450 	                if (!this.context.allowStrictDirective) {
   4451 	                    this.tolerateUnexpectedToken(token, messages_1.Messages.IllegalLanguageModeDirective);
   4452 	                }
   4453 	            }
   4454 	            else {
   4455 	                if (!firstRestricted && token.octal) {
   4456 	                    firstRestricted = token;
   4457 	                }
   4458 	            }
   4459 	        }
   4460 	        return body;
   4461 	    };
   4462 	    // https://tc39.github.io/ecma262/#sec-method-definitions
   4463 	    Parser.prototype.qualifiedPropertyName = function (token) {
   4464 	        switch (token.type) {
   4465 	            case 3 /* Identifier */:
   4466 	            case 8 /* StringLiteral */:
   4467 	            case 1 /* BooleanLiteral */:
   4468 	            case 5 /* NullLiteral */:
   4469 	            case 6 /* NumericLiteral */:
   4470 	            case 4 /* Keyword */:
   4471 	                return true;
   4472 	            case 7 /* Punctuator */:
   4473 	                return token.value === '[';
   4474 	            default:
   4475 	                break;
   4476 	        }
   4477 	        return false;
   4478 	    };
   4479 	    Parser.prototype.parseGetterMethod = function () {
   4480 	        var node = this.createNode();
   4481 	        var isGenerator = false;
   4482 	        var previousAllowYield = this.context.allowYield;
   4483 	        this.context.allowYield = !isGenerator;
   4484 	        var formalParameters = this.parseFormalParameters();
   4485 	        if (formalParameters.params.length > 0) {
   4486 	            this.tolerateError(messages_1.Messages.BadGetterArity);
   4487 	        }
   4488 	        var method = this.parsePropertyMethod(formalParameters);
   4489 	        this.context.allowYield = previousAllowYield;
   4490 	        return this.finalize(node, new Node.FunctionExpression(null, formalParameters.params, method, isGenerator));
   4491 	    };
   4492 	    Parser.prototype.parseSetterMethod = function () {
   4493 	        var node = this.createNode();
   4494 	        var isGenerator = false;
   4495 	        var previousAllowYield = this.context.allowYield;
   4496 	        this.context.allowYield = !isGenerator;
   4497 	        var formalParameters = this.parseFormalParameters();
   4498 	        if (formalParameters.params.length !== 1) {
   4499 	            this.tolerateError(messages_1.Messages.BadSetterArity);
   4500 	        }
   4501 	        else if (formalParameters.params[0] instanceof Node.RestElement) {
   4502 	            this.tolerateError(messages_1.Messages.BadSetterRestParameter);
   4503 	        }
   4504 	        var method = this.parsePropertyMethod(formalParameters);
   4505 	        this.context.allowYield = previousAllowYield;
   4506 	        return this.finalize(node, new Node.FunctionExpression(null, formalParameters.params, method, isGenerator));
   4507 	    };
   4508 	    Parser.prototype.parseGeneratorMethod = function () {
   4509 	        var node = this.createNode();
   4510 	        var isGenerator = true;
   4511 	        var previousAllowYield = this.context.allowYield;
   4512 	        this.context.allowYield = true;
   4513 	        var params = this.parseFormalParameters();
   4514 	        this.context.allowYield = false;
   4515 	        var method = this.parsePropertyMethod(params);
   4516 	        this.context.allowYield = previousAllowYield;
   4517 	        return this.finalize(node, new Node.FunctionExpression(null, params.params, method, isGenerator));
   4518 	    };
   4519 	    // https://tc39.github.io/ecma262/#sec-generator-function-definitions
   4520 	    Parser.prototype.isStartOfExpression = function () {
   4521 	        var start = true;
   4522 	        var value = this.lookahead.value;
   4523 	        switch (this.lookahead.type) {
   4524 	            case 7 /* Punctuator */:
   4525 	                start = (value === '[') || (value === '(') || (value === '{') ||
   4526 	                    (value === '+') || (value === '-') ||
   4527 	                    (value === '!') || (value === '~') ||
   4528 	                    (value === '++') || (value === '--') ||
   4529 	                    (value === '/') || (value === '/='); // regular expression literal
   4530 	                break;
   4531 	            case 4 /* Keyword */:
   4532 	                start = (value === 'class') || (value === 'delete') ||
   4533 	                    (value === 'function') || (value === 'let') || (value === 'new') ||
   4534 	                    (value === 'super') || (value === 'this') || (value === 'typeof') ||
   4535 	                    (value === 'void') || (value === 'yield');
   4536 	                break;
   4537 	            default:
   4538 	                break;
   4539 	        }
   4540 	        return start;
   4541 	    };
   4542 	    Parser.prototype.parseYieldExpression = function () {
   4543 	        var node = this.createNode();
   4544 	        this.expectKeyword('yield');
   4545 	        var argument = null;
   4546 	        var delegate = false;
   4547 	        if (!this.hasLineTerminator) {
   4548 	            var previousAllowYield = this.context.allowYield;
   4549 	            this.context.allowYield = false;
   4550 	            delegate = this.match('*');
   4551 	            if (delegate) {
   4552 	                this.nextToken();
   4553 	                argument = this.parseAssignmentExpression();
   4554 	            }
   4555 	            else if (this.isStartOfExpression()) {
   4556 	                argument = this.parseAssignmentExpression();
   4557 	            }
   4558 	            this.context.allowYield = previousAllowYield;
   4559 	        }
   4560 	        return this.finalize(node, new Node.YieldExpression(argument, delegate));
   4561 	    };
   4562 	    // https://tc39.github.io/ecma262/#sec-class-definitions
   4563 	    Parser.prototype.parseClassElement = function (hasConstructor) {
   4564 	        var token = this.lookahead;
   4565 	        var node = this.createNode();
   4566 	        var kind = '';
   4567 	        var key = null;
   4568 	        var value = null;
   4569 	        var computed = false;
   4570 	        var method = false;
   4571 	        var isStatic = false;
   4572 	        var isAsync = false;
   4573 	        if (this.match('*')) {
   4574 	            this.nextToken();
   4575 	        }
   4576 	        else {
   4577 	            computed = this.match('[');
   4578 	            key = this.parseObjectPropertyKey();
   4579 	            var id = key;
   4580 	            if (id.name === 'static' && (this.qualifiedPropertyName(this.lookahead) || this.match('*'))) {
   4581 	                token = this.lookahead;
   4582 	                isStatic = true;
   4583 	                computed = this.match('[');
   4584 	                if (this.match('*')) {
   4585 	                    this.nextToken();
   4586 	                }
   4587 	                else {
   4588 	                    key = this.parseObjectPropertyKey();
   4589 	                }
   4590 	            }
   4591 	            if ((token.type === 3 /* Identifier */) && !this.hasLineTerminator && (token.value === 'async')) {
   4592 	                var punctuator = this.lookahead.value;
   4593 	                if (punctuator !== ':' && punctuator !== '(' && punctuator !== '*') {
   4594 	                    isAsync = true;
   4595 	                    token = this.lookahead;
   4596 	                    key = this.parseObjectPropertyKey();
   4597 	                    if (token.type === 3 /* Identifier */ && token.value === 'constructor') {
   4598 	                        this.tolerateUnexpectedToken(token, messages_1.Messages.ConstructorIsAsync);
   4599 	                    }
   4600 	                }
   4601 	            }
   4602 	        }
   4603 	        var lookaheadPropertyKey = this.qualifiedPropertyName(this.lookahead);
   4604 	        if (token.type === 3 /* Identifier */) {
   4605 	            if (token.value === 'get' && lookaheadPropertyKey) {
   4606 	                kind = 'get';
   4607 	                computed = this.match('[');
   4608 	                key = this.parseObjectPropertyKey();
   4609 	                this.context.allowYield = false;
   4610 	                value = this.parseGetterMethod();
   4611 	            }
   4612 	            else if (token.value === 'set' && lookaheadPropertyKey) {
   4613 	                kind = 'set';
   4614 	                computed = this.match('[');
   4615 	                key = this.parseObjectPropertyKey();
   4616 	                value = this.parseSetterMethod();
   4617 	            }
   4618 	        }
   4619 	        else if (token.type === 7 /* Punctuator */ && token.value === '*' && lookaheadPropertyKey) {
   4620 	            kind = 'init';
   4621 	            computed = this.match('[');
   4622 	            key = this.parseObjectPropertyKey();
   4623 	            value = this.parseGeneratorMethod();
   4624 	            method = true;
   4625 	        }
   4626 	        if (!kind && key && this.match('(')) {
   4627 	            kind = 'init';
   4628 	            value = isAsync ? this.parsePropertyMethodAsyncFunction() : this.parsePropertyMethodFunction();
   4629 	            method = true;
   4630 	        }
   4631 	        if (!kind) {
   4632 	            this.throwUnexpectedToken(this.lookahead);
   4633 	        }
   4634 	        if (kind === 'init') {
   4635 	            kind = 'method';
   4636 	        }
   4637 	        if (!computed) {
   4638 	            if (isStatic && this.isPropertyKey(key, 'prototype')) {
   4639 	                this.throwUnexpectedToken(token, messages_1.Messages.StaticPrototype);
   4640 	            }
   4641 	            if (!isStatic && this.isPropertyKey(key, 'constructor')) {
   4642 	                if (kind !== 'method' || !method || (value && value.generator)) {
   4643 	                    this.throwUnexpectedToken(token, messages_1.Messages.ConstructorSpecialMethod);
   4644 	                }
   4645 	                if (hasConstructor.value) {
   4646 	                    this.throwUnexpectedToken(token, messages_1.Messages.DuplicateConstructor);
   4647 	                }
   4648 	                else {
   4649 	                    hasConstructor.value = true;
   4650 	                }
   4651 	                kind = 'constructor';
   4652 	            }
   4653 	        }
   4654 	        return this.finalize(node, new Node.MethodDefinition(key, computed, value, kind, isStatic));
   4655 	    };
   4656 	    Parser.prototype.parseClassElementList = function () {
   4657 	        var body = [];
   4658 	        var hasConstructor = { value: false };
   4659 	        this.expect('{');
   4660 	        while (!this.match('}')) {
   4661 	            if (this.match(';')) {
   4662 	                this.nextToken();
   4663 	            }
   4664 	            else {
   4665 	                body.push(this.parseClassElement(hasConstructor));
   4666 	            }
   4667 	        }
   4668 	        this.expect('}');
   4669 	        return body;
   4670 	    };
   4671 	    Parser.prototype.parseClassBody = function () {
   4672 	        var node = this.createNode();
   4673 	        var elementList = this.parseClassElementList();
   4674 	        return this.finalize(node, new Node.ClassBody(elementList));
   4675 	    };
   4676 	    Parser.prototype.parseClassDeclaration = function (identifierIsOptional) {
   4677 	        var node = this.createNode();
   4678 	        var previousStrict = this.context.strict;
   4679 	        this.context.strict = true;
   4680 	        this.expectKeyword('class');
   4681 	        var id = (identifierIsOptional && (this.lookahead.type !== 3 /* Identifier */)) ? null : this.parseVariableIdentifier();
   4682 	        var superClass = null;
   4683 	        if (this.matchKeyword('extends')) {
   4684 	            this.nextToken();
   4685 	            superClass = this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall);
   4686 	        }
   4687 	        var classBody = this.parseClassBody();
   4688 	        this.context.strict = previousStrict;
   4689 	        return this.finalize(node, new Node.ClassDeclaration(id, superClass, classBody));
   4690 	    };
   4691 	    Parser.prototype.parseClassExpression = function () {
   4692 	        var node = this.createNode();
   4693 	        var previousStrict = this.context.strict;
   4694 	        this.context.strict = true;
   4695 	        this.expectKeyword('class');
   4696 	        var id = (this.lookahead.type === 3 /* Identifier */) ? this.parseVariableIdentifier() : null;
   4697 	        var superClass = null;
   4698 	        if (this.matchKeyword('extends')) {
   4699 	            this.nextToken();
   4700 	            superClass = this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall);
   4701 	        }
   4702 	        var classBody = this.parseClassBody();
   4703 	        this.context.strict = previousStrict;
   4704 	        return this.finalize(node, new Node.ClassExpression(id, superClass, classBody));
   4705 	    };
   4706 	    // https://tc39.github.io/ecma262/#sec-scripts
   4707 	    // https://tc39.github.io/ecma262/#sec-modules
   4708 	    Parser.prototype.parseModule = function () {
   4709 	        this.context.strict = true;
   4710 	        this.context.isModule = true;
   4711 	        this.scanner.isModule = true;
   4712 	        var node = this.createNode();
   4713 	        var body = this.parseDirectivePrologues();
   4714 	        while (this.lookahead.type !== 2 /* EOF */) {
   4715 	            body.push(this.parseStatementListItem());
   4716 	        }
   4717 	        return this.finalize(node, new Node.Module(body));
   4718 	    };
   4719 	    Parser.prototype.parseScript = function () {
   4720 	        var node = this.createNode();
   4721 	        var body = this.parseDirectivePrologues();
   4722 	        while (this.lookahead.type !== 2 /* EOF */) {
   4723 	            body.push(this.parseStatementListItem());
   4724 	        }
   4725 	        return this.finalize(node, new Node.Script(body));
   4726 	    };
   4727 	    // https://tc39.github.io/ecma262/#sec-imports
   4728 	    Parser.prototype.parseModuleSpecifier = function () {
   4729 	        var node = this.createNode();
   4730 	        if (this.lookahead.type !== 8 /* StringLiteral */) {
   4731 	            this.throwError(messages_1.Messages.InvalidModuleSpecifier);
   4732 	        }
   4733 	        var token = this.nextToken();
   4734 	        var raw = this.getTokenRaw(token);
   4735 	        return this.finalize(node, new Node.Literal(token.value, raw));
   4736 	    };
   4737 	    // import {<foo as bar>} ...;
   4738 	    Parser.prototype.parseImportSpecifier = function () {
   4739 	        var node = this.createNode();
   4740 	        var imported;
   4741 	        var local;
   4742 	        if (this.lookahead.type === 3 /* Identifier */) {
   4743 	            imported = this.parseVariableIdentifier();
   4744 	            local = imported;
   4745 	            if (this.matchContextualKeyword('as')) {
   4746 	                this.nextToken();
   4747 	                local = this.parseVariableIdentifier();
   4748 	            }
   4749 	        }
   4750 	        else {
   4751 	            imported = this.parseIdentifierName();
   4752 	            local = imported;
   4753 	            if (this.matchContextualKeyword('as')) {
   4754 	                this.nextToken();
   4755 	                local = this.parseVariableIdentifier();
   4756 	            }
   4757 	            else {
   4758 	                this.throwUnexpectedToken(this.nextToken());
   4759 	            }
   4760 	        }
   4761 	        return this.finalize(node, new Node.ImportSpecifier(local, imported));
   4762 	    };
   4763 	    // {foo, bar as bas}
   4764 	    Parser.prototype.parseNamedImports = function () {
   4765 	        this.expect('{');
   4766 	        var specifiers = [];
   4767 	        while (!this.match('}')) {
   4768 	            specifiers.push(this.parseImportSpecifier());
   4769 	            if (!this.match('}')) {
   4770 	                this.expect(',');
   4771 	            }
   4772 	        }
   4773 	        this.expect('}');
   4774 	        return specifiers;
   4775 	    };
   4776 	    // import <foo> ...;
   4777 	    Parser.prototype.parseImportDefaultSpecifier = function () {
   4778 	        var node = this.createNode();
   4779 	        var local = this.parseIdentifierName();
   4780 	        return this.finalize(node, new Node.ImportDefaultSpecifier(local));
   4781 	    };
   4782 	    // import <* as foo> ...;
   4783 	    Parser.prototype.parseImportNamespaceSpecifier = function () {
   4784 	        var node = this.createNode();
   4785 	        this.expect('*');
   4786 	        if (!this.matchContextualKeyword('as')) {
   4787 	            this.throwError(messages_1.Messages.NoAsAfterImportNamespace);
   4788 	        }
   4789 	        this.nextToken();
   4790 	        var local = this.parseIdentifierName();
   4791 	        return this.finalize(node, new Node.ImportNamespaceSpecifier(local));
   4792 	    };
   4793 	    Parser.prototype.parseImportDeclaration = function () {
   4794 	        if (this.context.inFunctionBody) {
   4795 	            this.throwError(messages_1.Messages.IllegalImportDeclaration);
   4796 	        }
   4797 	        var node = this.createNode();
   4798 	        this.expectKeyword('import');
   4799 	        var src;
   4800 	        var specifiers = [];
   4801 	        if (this.lookahead.type === 8 /* StringLiteral */) {
   4802 	            // import 'foo';
   4803 	            src = this.parseModuleSpecifier();
   4804 	        }
   4805 	        else {
   4806 	            if (this.match('{')) {
   4807 	                // import {bar}
   4808 	                specifiers = specifiers.concat(this.parseNamedImports());
   4809 	            }
   4810 	            else if (this.match('*')) {
   4811 	                // import * as foo
   4812 	                specifiers.push(this.parseImportNamespaceSpecifier());
   4813 	            }
   4814 	            else if (this.isIdentifierName(this.lookahead) && !this.matchKeyword('default')) {
   4815 	                // import foo
   4816 	                specifiers.push(this.parseImportDefaultSpecifier());
   4817 	                if (this.match(',')) {
   4818 	                    this.nextToken();
   4819 	                    if (this.match('*')) {
   4820 	                        // import foo, * as foo
   4821 	                        specifiers.push(this.parseImportNamespaceSpecifier());
   4822 	                    }
   4823 	                    else if (this.match('{')) {
   4824 	                        // import foo, {bar}
   4825 	                        specifiers = specifiers.concat(this.parseNamedImports());
   4826 	                    }
   4827 	                    else {
   4828 	                        this.throwUnexpectedToken(this.lookahead);
   4829 	                    }
   4830 	                }
   4831 	            }
   4832 	            else {
   4833 	                this.throwUnexpectedToken(this.nextToken());
   4834 	            }
   4835 	            if (!this.matchContextualKeyword('from')) {
   4836 	                var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;
   4837 	                this.throwError(message, this.lookahead.value);
   4838 	            }
   4839 	            this.nextToken();
   4840 	            src = this.parseModuleSpecifier();
   4841 	        }
   4842 	        this.consumeSemicolon();
   4843 	        return this.finalize(node, new Node.ImportDeclaration(specifiers, src));
   4844 	    };
   4845 	    // https://tc39.github.io/ecma262/#sec-exports
   4846 	    Parser.prototype.parseExportSpecifier = function () {
   4847 	        var node = this.createNode();
   4848 	        var local = this.parseIdentifierName();
   4849 	        var exported = local;
   4850 	        if (this.matchContextualKeyword('as')) {
   4851 	            this.nextToken();
   4852 	            exported = this.parseIdentifierName();
   4853 	        }
   4854 	        return this.finalize(node, new Node.ExportSpecifier(local, exported));
   4855 	    };
   4856 	    Parser.prototype.parseExportDeclaration = function () {
   4857 	        if (this.context.inFunctionBody) {
   4858 	            this.throwError(messages_1.Messages.IllegalExportDeclaration);
   4859 	        }
   4860 	        var node = this.createNode();
   4861 	        this.expectKeyword('export');
   4862 	        var exportDeclaration;
   4863 	        if (this.matchKeyword('default')) {
   4864 	            // export default ...
   4865 	            this.nextToken();
   4866 	            if (this.matchKeyword('function')) {
   4867 	                // export default function foo () {}
   4868 	                // export default function () {}
   4869 	                var declaration = this.parseFunctionDeclaration(true);
   4870 	                exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
   4871 	            }
   4872 	            else if (this.matchKeyword('class')) {
   4873 	                // export default class foo {}
   4874 	                var declaration = this.parseClassDeclaration(true);
   4875 	                exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
   4876 	            }
   4877 	            else if (this.matchContextualKeyword('async')) {
   4878 	                // export default async function f () {}
   4879 	                // export default async function () {}
   4880 	                // export default async x => x
   4881 	                var declaration = this.matchAsyncFunction() ? this.parseFunctionDeclaration(true) : this.parseAssignmentExpression();
   4882 	                exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
   4883 	            }
   4884 	            else {
   4885 	                if (this.matchContextualKeyword('from')) {
   4886 	                    this.throwError(messages_1.Messages.UnexpectedToken, this.lookahead.value);
   4887 	                }
   4888 	                // export default {};
   4889 	                // export default [];
   4890 	                // export default (1 + 2);
   4891 	                var declaration = this.match('{') ? this.parseObjectInitializer() :
   4892 	                    this.match('[') ? this.parseArrayInitializer() : this.parseAssignmentExpression();
   4893 	                this.consumeSemicolon();
   4894 	                exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
   4895 	            }
   4896 	        }
   4897 	        else if (this.match('*')) {
   4898 	            // export * from 'foo';
   4899 	            this.nextToken();
   4900 	            if (!this.matchContextualKeyword('from')) {
   4901 	                var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;
   4902 	                this.throwError(message, this.lookahead.value);
   4903 	            }
   4904 	            this.nextToken();
   4905 	            var src = this.parseModuleSpecifier();
   4906 	            this.consumeSemicolon();
   4907 	            exportDeclaration = this.finalize(node, new Node.ExportAllDeclaration(src));
   4908 	        }
   4909 	        else if (this.lookahead.type === 4 /* Keyword */) {
   4910 	            // export var f = 1;
   4911 	            var declaration = void 0;
   4912 	            switch (this.lookahead.value) {
   4913 	                case 'let':
   4914 	                case 'const':
   4915 	                    declaration = this.parseLexicalDeclaration({ inFor: false });
   4916 	                    break;
   4917 	                case 'var':
   4918 	                case 'class':
   4919 	                case 'function':
   4920 	                    declaration = this.parseStatementListItem();
   4921 	                    break;
   4922 	                default:
   4923 	                    this.throwUnexpectedToken(this.lookahead);
   4924 	            }
   4925 	            exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(declaration, [], null));
   4926 	        }
   4927 	        else if (this.matchAsyncFunction()) {
   4928 	            var declaration = this.parseFunctionDeclaration();
   4929 	            exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(declaration, [], null));
   4930 	        }
   4931 	        else {
   4932 	            var specifiers = [];
   4933 	            var source = null;
   4934 	            var isExportFromIdentifier = false;
   4935 	            this.expect('{');
   4936 	            while (!this.match('}')) {
   4937 	                isExportFromIdentifier = isExportFromIdentifier || this.matchKeyword('default');
   4938 	                specifiers.push(this.parseExportSpecifier());
   4939 	                if (!this.match('}')) {
   4940 	                    this.expect(',');
   4941 	                }
   4942 	            }
   4943 	            this.expect('}');
   4944 	            if (this.matchContextualKeyword('from')) {
   4945 	                // export {default} from 'foo';
   4946 	                // export {foo} from 'foo';
   4947 	                this.nextToken();
   4948 	                source = this.parseModuleSpecifier();
   4949 	                this.consumeSemicolon();
   4950 	            }
   4951 	            else if (isExportFromIdentifier) {
   4952 	                // export {default}; // missing fromClause
   4953 	                var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;
   4954 	                this.throwError(message, this.lookahead.value);
   4955 	            }
   4956 	            else {
   4957 	                // export {foo};
   4958 	                this.consumeSemicolon();
   4959 	            }
   4960 	            exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(null, specifiers, source));
   4961 	        }
   4962 	        return exportDeclaration;
   4963 	    };
   4964 	    return Parser;
   4965 	}());
   4966 	exports.Parser = Parser;
   4967 
   4968 
   4969 /***/ },
   4970 /* 9 */
   4971 /***/ function(module, exports) {
   4972 
   4973 	"use strict";
   4974 	// Ensure the condition is true, otherwise throw an error.
   4975 	// This is only to have a better contract semantic, i.e. another safety net
   4976 	// to catch a logic error. The condition shall be fulfilled in normal case.
   4977 	// Do NOT use this to enforce a certain condition on any user input.
   4978 	Object.defineProperty(exports, "__esModule", { value: true });
   4979 	function assert(condition, message) {
   4980 	    /* istanbul ignore if */
   4981 	    if (!condition) {
   4982 	        throw new Error('ASSERT: ' + message);
   4983 	    }
   4984 	}
   4985 	exports.assert = assert;
   4986 
   4987 
   4988 /***/ },
   4989 /* 10 */
   4990 /***/ function(module, exports) {
   4991 
   4992 	"use strict";
   4993 	/* tslint:disable:max-classes-per-file */
   4994 	Object.defineProperty(exports, "__esModule", { value: true });
   4995 	var ErrorHandler = (function () {
   4996 	    function ErrorHandler() {
   4997 	        this.errors = [];
   4998 	        this.tolerant = false;
   4999 	    }
   5000 	    ErrorHandler.prototype.recordError = function (error) {
   5001 	        this.errors.push(error);
   5002 	    };
   5003 	    ErrorHandler.prototype.tolerate = function (error) {
   5004 	        if (this.tolerant) {
   5005 	            this.recordError(error);
   5006 	        }
   5007 	        else {
   5008 	            throw error;
   5009 	        }
   5010 	    };
   5011 	    ErrorHandler.prototype.constructError = function (msg, column) {
   5012 	        var error = new Error(msg);
   5013 	        try {
   5014 	            throw error;
   5015 	        }
   5016 	        catch (base) {
   5017 	            /* istanbul ignore else */
   5018 	            if (Object.create && Object.defineProperty) {
   5019 	                error = Object.create(base);
   5020 	                Object.defineProperty(error, 'column', { value: column });
   5021 	            }
   5022 	        }
   5023 	        /* istanbul ignore next */
   5024 	        return error;
   5025 	    };
   5026 	    ErrorHandler.prototype.createError = function (index, line, col, description) {
   5027 	        var msg = 'Line ' + line + ': ' + description;
   5028 	        var error = this.constructError(msg, col);
   5029 	        error.index = index;
   5030 	        error.lineNumber = line;
   5031 	        error.description = description;
   5032 	        return error;
   5033 	    };
   5034 	    ErrorHandler.prototype.throwError = function (index, line, col, description) {
   5035 	        throw this.createError(index, line, col, description);
   5036 	    };
   5037 	    ErrorHandler.prototype.tolerateError = function (index, line, col, description) {
   5038 	        var error = this.createError(index, line, col, description);
   5039 	        if (this.tolerant) {
   5040 	            this.recordError(error);
   5041 	        }
   5042 	        else {
   5043 	            throw error;
   5044 	        }
   5045 	    };
   5046 	    return ErrorHandler;
   5047 	}());
   5048 	exports.ErrorHandler = ErrorHandler;
   5049 
   5050 
   5051 /***/ },
   5052 /* 11 */
   5053 /***/ function(module, exports) {
   5054 
   5055 	"use strict";
   5056 	Object.defineProperty(exports, "__esModule", { value: true });
   5057 	// Error messages should be identical to V8.
   5058 	exports.Messages = {
   5059 	    BadGetterArity: 'Getter must not have any formal parameters',
   5060 	    BadSetterArity: 'Setter must have exactly one formal parameter',
   5061 	    BadSetterRestParameter: 'Setter function argument must not be a rest parameter',
   5062 	    ConstructorIsAsync: 'Class constructor may not be an async method',
   5063 	    ConstructorSpecialMethod: 'Class constructor may not be an accessor',
   5064 	    DeclarationMissingInitializer: 'Missing initializer in %0 declaration',
   5065 	    DefaultRestParameter: 'Unexpected token =',
   5066 	    DuplicateBinding: 'Duplicate binding %0',
   5067 	    DuplicateConstructor: 'A class may only have one constructor',
   5068 	    DuplicateProtoProperty: 'Duplicate __proto__ fields are not allowed in object literals',
   5069 	    ForInOfLoopInitializer: '%0 loop variable declaration may not have an initializer',
   5070 	    GeneratorInLegacyContext: 'Generator declarations are not allowed in legacy contexts',
   5071 	    IllegalBreak: 'Illegal break statement',
   5072 	    IllegalContinue: 'Illegal continue statement',
   5073 	    IllegalExportDeclaration: 'Unexpected token',
   5074 	    IllegalImportDeclaration: 'Unexpected token',
   5075 	    IllegalLanguageModeDirective: 'Illegal \'use strict\' directive in function with non-simple parameter list',
   5076 	    IllegalReturn: 'Illegal return statement',
   5077 	    InvalidEscapedReservedWord: 'Keyword must not contain escaped characters',
   5078 	    InvalidHexEscapeSequence: 'Invalid hexadecimal escape sequence',
   5079 	    InvalidLHSInAssignment: 'Invalid left-hand side in assignment',
   5080 	    InvalidLHSInForIn: 'Invalid left-hand side in for-in',
   5081 	    InvalidLHSInForLoop: 'Invalid left-hand side in for-loop',
   5082 	    InvalidModuleSpecifier: 'Unexpected token',
   5083 	    InvalidRegExp: 'Invalid regular expression',
   5084 	    LetInLexicalBinding: 'let is disallowed as a lexically bound name',
   5085 	    MissingFromClause: 'Unexpected token',
   5086 	    MultipleDefaultsInSwitch: 'More than one default clause in switch statement',
   5087 	    NewlineAfterThrow: 'Illegal newline after throw',
   5088 	    NoAsAfterImportNamespace: 'Unexpected token',
   5089 	    NoCatchOrFinally: 'Missing catch or finally after try',
   5090 	    ParameterAfterRestParameter: 'Rest parameter must be last formal parameter',
   5091 	    Redeclaration: '%0 \'%1\' has already been declared',
   5092 	    StaticPrototype: 'Classes may not have static property named prototype',
   5093 	    StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode',
   5094 	    StrictDelete: 'Delete of an unqualified identifier in strict mode.',
   5095 	    StrictFunction: 'In strict mode code, functions can only be declared at top level or inside a block',
   5096 	    StrictFunctionName: 'Function name may not be eval or arguments in strict mode',
   5097 	    StrictLHSAssignment: 'Assignment to eval or arguments is not allowed in strict mode',
   5098 	    StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode',
   5099 	    StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode',
   5100 	    StrictModeWith: 'Strict mode code may not include a with statement',
   5101 	    StrictOctalLiteral: 'Octal literals are not allowed in strict mode.',
   5102 	    StrictParamDupe: 'Strict mode function may not have duplicate parameter names',
   5103 	    StrictParamName: 'Parameter name eval or arguments is not allowed in strict mode',
   5104 	    StrictReservedWord: 'Use of future reserved word in strict mode',
   5105 	    StrictVarName: 'Variable name may not be eval or arguments in strict mode',
   5106 	    TemplateOctalLiteral: 'Octal literals are not allowed in template strings.',
   5107 	    UnexpectedEOS: 'Unexpected end of input',
   5108 	    UnexpectedIdentifier: 'Unexpected identifier',
   5109 	    UnexpectedNumber: 'Unexpected number',
   5110 	    UnexpectedReserved: 'Unexpected reserved word',
   5111 	    UnexpectedString: 'Unexpected string',
   5112 	    UnexpectedTemplate: 'Unexpected quasi %0',
   5113 	    UnexpectedToken: 'Unexpected token %0',
   5114 	    UnexpectedTokenIllegal: 'Unexpected token ILLEGAL',
   5115 	    UnknownLabel: 'Undefined label \'%0\'',
   5116 	    UnterminatedRegExp: 'Invalid regular expression: missing /'
   5117 	};
   5118 
   5119 
   5120 /***/ },
   5121 /* 12 */
   5122 /***/ function(module, exports, __webpack_require__) {
   5123 
   5124 	"use strict";
   5125 	Object.defineProperty(exports, "__esModule", { value: true });
   5126 	var assert_1 = __webpack_require__(9);
   5127 	var character_1 = __webpack_require__(4);
   5128 	var messages_1 = __webpack_require__(11);
   5129 	function hexValue(ch) {
   5130 	    return '0123456789abcdef'.indexOf(ch.toLowerCase());
   5131 	}
   5132 	function octalValue(ch) {
   5133 	    return '01234567'.indexOf(ch);
   5134 	}
   5135 	var Scanner = (function () {
   5136 	    function Scanner(code, handler) {
   5137 	        this.source = code;
   5138 	        this.errorHandler = handler;
   5139 	        this.trackComment = false;
   5140 	        this.isModule = false;
   5141 	        this.length = code.length;
   5142 	        this.index = 0;
   5143 	        this.lineNumber = (code.length > 0) ? 1 : 0;
   5144 	        this.lineStart = 0;
   5145 	        this.curlyStack = [];
   5146 	    }
   5147 	    Scanner.prototype.saveState = function () {
   5148 	        return {
   5149 	            index: this.index,
   5150 	            lineNumber: this.lineNumber,
   5151 	            lineStart: this.lineStart
   5152 	        };
   5153 	    };
   5154 	    Scanner.prototype.restoreState = function (state) {
   5155 	        this.index = state.index;
   5156 	        this.lineNumber = state.lineNumber;
   5157 	        this.lineStart = state.lineStart;
   5158 	    };
   5159 	    Scanner.prototype.eof = function () {
   5160 	        return this.index >= this.length;
   5161 	    };
   5162 	    Scanner.prototype.throwUnexpectedToken = function (message) {
   5163 	        if (message === void 0) { message = messages_1.Messages.UnexpectedTokenIllegal; }
   5164 	        return this.errorHandler.throwError(this.index, this.lineNumber, this.index - this.lineStart + 1, message);
   5165 	    };
   5166 	    Scanner.prototype.tolerateUnexpectedToken = function (message) {
   5167 	        if (message === void 0) { message = messages_1.Messages.UnexpectedTokenIllegal; }
   5168 	        this.errorHandler.tolerateError(this.index, this.lineNumber, this.index - this.lineStart + 1, message);
   5169 	    };
   5170 	    // https://tc39.github.io/ecma262/#sec-comments
   5171 	    Scanner.prototype.skipSingleLineComment = function (offset) {
   5172 	        var comments = [];
   5173 	        var start, loc;
   5174 	        if (this.trackComment) {
   5175 	            comments = [];
   5176 	            start = this.index - offset;
   5177 	            loc = {
   5178 	                start: {
   5179 	                    line: this.lineNumber,
   5180 	                    column: this.index - this.lineStart - offset
   5181 	                },
   5182 	                end: {}
   5183 	            };
   5184 	        }
   5185 	        while (!this.eof()) {
   5186 	            var ch = this.source.charCodeAt(this.index);
   5187 	            ++this.index;
   5188 	            if (character_1.Character.isLineTerminator(ch)) {
   5189 	                if (this.trackComment) {
   5190 	                    loc.end = {
   5191 	                        line: this.lineNumber,
   5192 	                        column: this.index - this.lineStart - 1
   5193 	                    };
   5194 	                    var entry = {
   5195 	                        multiLine: false,
   5196 	                        slice: [start + offset, this.index - 1],
   5197 	                        range: [start, this.index - 1],
   5198 	                        loc: loc
   5199 	                    };
   5200 	                    comments.push(entry);
   5201 	                }
   5202 	                if (ch === 13 && this.source.charCodeAt(this.index) === 10) {
   5203 	                    ++this.index;
   5204 	                }
   5205 	                ++this.lineNumber;
   5206 	                this.lineStart = this.index;
   5207 	                return comments;
   5208 	            }
   5209 	        }
   5210 	        if (this.trackComment) {
   5211 	            loc.end = {
   5212 	                line: this.lineNumber,
   5213 	                column: this.index - this.lineStart
   5214 	            };
   5215 	            var entry = {
   5216 	                multiLine: false,
   5217 	                slice: [start + offset, this.index],
   5218 	                range: [start, this.index],
   5219 	                loc: loc
   5220 	            };
   5221 	            comments.push(entry);
   5222 	        }
   5223 	        return comments;
   5224 	    };
   5225 	    Scanner.prototype.skipMultiLineComment = function () {
   5226 	        var comments = [];
   5227 	        var start, loc;
   5228 	        if (this.trackComment) {
   5229 	            comments = [];
   5230 	            start = this.index - 2;
   5231 	            loc = {
   5232 	                start: {
   5233 	                    line: this.lineNumber,
   5234 	                    column: this.index - this.lineStart - 2
   5235 	                },
   5236 	                end: {}
   5237 	            };
   5238 	        }
   5239 	        while (!this.eof()) {
   5240 	            var ch = this.source.charCodeAt(this.index);
   5241 	            if (character_1.Character.isLineTerminator(ch)) {
   5242 	                if (ch === 0x0D && this.source.charCodeAt(this.index + 1) === 0x0A) {
   5243 	                    ++this.index;
   5244 	                }
   5245 	                ++this.lineNumber;
   5246 	                ++this.index;
   5247 	                this.lineStart = this.index;
   5248 	            }
   5249 	            else if (ch === 0x2A) {
   5250 	                // Block comment ends with '*/'.
   5251 	                if (this.source.charCodeAt(this.index + 1) === 0x2F) {
   5252 	                    this.index += 2;
   5253 	                    if (this.trackComment) {
   5254 	                        loc.end = {
   5255 	                            line: this.lineNumber,
   5256 	                            column: this.index - this.lineStart
   5257 	                        };
   5258 	                        var entry = {
   5259 	                            multiLine: true,
   5260 	                            slice: [start + 2, this.index - 2],
   5261 	                            range: [start, this.index],
   5262 	                            loc: loc
   5263 	                        };
   5264 	                        comments.push(entry);
   5265 	                    }
   5266 	                    return comments;
   5267 	                }
   5268 	                ++this.index;
   5269 	            }
   5270 	            else {
   5271 	                ++this.index;
   5272 	            }
   5273 	        }
   5274 	        // Ran off the end of the file - the whole thing is a comment
   5275 	        if (this.trackComment) {
   5276 	            loc.end = {
   5277 	                line: this.lineNumber,
   5278 	                column: this.index - this.lineStart
   5279 	            };
   5280 	            var entry = {
   5281 	                multiLine: true,
   5282 	                slice: [start + 2, this.index],
   5283 	                range: [start, this.index],
   5284 	                loc: loc
   5285 	            };
   5286 	            comments.push(entry);
   5287 	        }
   5288 	        this.tolerateUnexpectedToken();
   5289 	        return comments;
   5290 	    };
   5291 	    Scanner.prototype.scanComments = function () {
   5292 	        var comments;
   5293 	        if (this.trackComment) {
   5294 	            comments = [];
   5295 	        }
   5296 	        var start = (this.index === 0);
   5297 	        while (!this.eof()) {
   5298 	            var ch = this.source.charCodeAt(this.index);
   5299 	            if (character_1.Character.isWhiteSpace(ch)) {
   5300 	                ++this.index;
   5301 	            }
   5302 	            else if (character_1.Character.isLineTerminator(ch)) {
   5303 	                ++this.index;
   5304 	                if (ch === 0x0D && this.source.charCodeAt(this.index) === 0x0A) {
   5305 	                    ++this.index;
   5306 	                }
   5307 	                ++this.lineNumber;
   5308 	                this.lineStart = this.index;
   5309 	                start = true;
   5310 	            }
   5311 	            else if (ch === 0x2F) {
   5312 	                ch = this.source.charCodeAt(this.index + 1);
   5313 	                if (ch === 0x2F) {
   5314 	                    this.index += 2;
   5315 	                    var comment = this.skipSingleLineComment(2);
   5316 	                    if (this.trackComment) {
   5317 	                        comments = comments.concat(comment);
   5318 	                    }
   5319 	                    start = true;
   5320 	                }
   5321 	                else if (ch === 0x2A) {
   5322 	                    this.index += 2;
   5323 	                    var comment = this.skipMultiLineComment();
   5324 	                    if (this.trackComment) {
   5325 	                        comments = comments.concat(comment);
   5326 	                    }
   5327 	                }
   5328 	                else {
   5329 	                    break;
   5330 	                }
   5331 	            }
   5332 	            else if (start && ch === 0x2D) {
   5333 	                // U+003E is '>'
   5334 	                if ((this.source.charCodeAt(this.index + 1) === 0x2D) && (this.source.charCodeAt(this.index + 2) === 0x3E)) {
   5335 	                    // '-->' is a single-line comment
   5336 	                    this.index += 3;
   5337 	                    var comment = this.skipSingleLineComment(3);
   5338 	                    if (this.trackComment) {
   5339 	                        comments = comments.concat(comment);
   5340 	                    }
   5341 	                }
   5342 	                else {
   5343 	                    break;
   5344 	                }
   5345 	            }
   5346 	            else if (ch === 0x3C && !this.isModule) {
   5347 	                if (this.source.slice(this.index + 1, this.index + 4) === '!--') {
   5348 	                    this.index += 4; // `<!--`
   5349 	                    var comment = this.skipSingleLineComment(4);
   5350 	                    if (this.trackComment) {
   5351 	                        comments = comments.concat(comment);
   5352 	                    }
   5353 	                }
   5354 	                else {
   5355 	                    break;
   5356 	                }
   5357 	            }
   5358 	            else {
   5359 	                break;
   5360 	            }
   5361 	        }
   5362 	        return comments;
   5363 	    };
   5364 	    // https://tc39.github.io/ecma262/#sec-future-reserved-words
   5365 	    Scanner.prototype.isFutureReservedWord = function (id) {
   5366 	        switch (id) {
   5367 	            case 'enum':
   5368 	            case 'export':
   5369 	            case 'import':
   5370 	            case 'super':
   5371 	                return true;
   5372 	            default:
   5373 	                return false;
   5374 	        }
   5375 	    };
   5376 	    Scanner.prototype.isStrictModeReservedWord = function (id) {
   5377 	        switch (id) {
   5378 	            case 'implements':
   5379 	            case 'interface':
   5380 	            case 'package':
   5381 	            case 'private':
   5382 	            case 'protected':
   5383 	            case 'public':
   5384 	            case 'static':
   5385 	            case 'yield':
   5386 	            case 'let':
   5387 	                return true;
   5388 	            default:
   5389 	                return false;
   5390 	        }
   5391 	    };
   5392 	    Scanner.prototype.isRestrictedWord = function (id) {
   5393 	        return id === 'eval' || id === 'arguments';
   5394 	    };
   5395 	    // https://tc39.github.io/ecma262/#sec-keywords
   5396 	    Scanner.prototype.isKeyword = function (id) {
   5397 	        switch (id.length) {
   5398 	            case 2:
   5399 	                return (id === 'if') || (id === 'in') || (id === 'do');
   5400 	            case 3:
   5401 	                return (id === 'var') || (id === 'for') || (id === 'new') ||
   5402 	                    (id === 'try') || (id === 'let');
   5403 	            case 4:
   5404 	                return (id === 'this') || (id === 'else') || (id === 'case') ||
   5405 	                    (id === 'void') || (id === 'with') || (id === 'enum');
   5406 	            case 5:
   5407 	                return (id === 'while') || (id === 'break') || (id === 'catch') ||
   5408 	                    (id === 'throw') || (id === 'const') || (id === 'yield') ||
   5409 	                    (id === 'class') || (id === 'super');
   5410 	            case 6:
   5411 	                return (id === 'return') || (id === 'typeof') || (id === 'delete') ||
   5412 	                    (id === 'switch') || (id === 'export') || (id === 'import');
   5413 	            case 7:
   5414 	                return (id === 'default') || (id === 'finally') || (id === 'extends');
   5415 	            case 8:
   5416 	                return (id === 'function') || (id === 'continue') || (id === 'debugger');
   5417 	            case 10:
   5418 	                return (id === 'instanceof');
   5419 	            default:
   5420 	                return false;
   5421 	        }
   5422 	    };
   5423 	    Scanner.prototype.codePointAt = function (i) {
   5424 	        var cp = this.source.charCodeAt(i);
   5425 	        if (cp >= 0xD800 && cp <= 0xDBFF) {
   5426 	            var second = this.source.charCodeAt(i + 1);
   5427 	            if (second >= 0xDC00 && second <= 0xDFFF) {
   5428 	                var first = cp;
   5429 	                cp = (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;
   5430 	            }
   5431 	        }
   5432 	        return cp;
   5433 	    };
   5434 	    Scanner.prototype.scanHexEscape = function (prefix) {
   5435 	        var len = (prefix === 'u') ? 4 : 2;
   5436 	        var code = 0;
   5437 	        for (var i = 0; i < len; ++i) {
   5438 	            if (!this.eof() && character_1.Character.isHexDigit(this.source.charCodeAt(this.index))) {
   5439 	                code = code * 16 + hexValue(this.source[this.index++]);
   5440 	            }
   5441 	            else {
   5442 	                return null;
   5443 	            }
   5444 	        }
   5445 	        return String.fromCharCode(code);
   5446 	    };
   5447 	    Scanner.prototype.scanUnicodeCodePointEscape = function () {
   5448 	        var ch = this.source[this.index];
   5449 	        var code = 0;
   5450 	        // At least, one hex digit is required.
   5451 	        if (ch === '}') {
   5452 	            this.throwUnexpectedToken();
   5453 	        }
   5454 	        while (!this.eof()) {
   5455 	            ch = this.source[this.index++];
   5456 	            if (!character_1.Character.isHexDigit(ch.charCodeAt(0))) {
   5457 	                break;
   5458 	            }
   5459 	            code = code * 16 + hexValue(ch);
   5460 	        }
   5461 	        if (code > 0x10FFFF || ch !== '}') {
   5462 	            this.throwUnexpectedToken();
   5463 	        }
   5464 	        return character_1.Character.fromCodePoint(code);
   5465 	    };
   5466 	    Scanner.prototype.getIdentifier = function () {
   5467 	        var start = this.index++;
   5468 	        while (!this.eof()) {
   5469 	            var ch = this.source.charCodeAt(this.index);
   5470 	            if (ch === 0x5C) {
   5471 	                // Blackslash (U+005C) marks Unicode escape sequence.
   5472 	                this.index = start;
   5473 	                return this.getComplexIdentifier();
   5474 	            }
   5475 	            else if (ch >= 0xD800 && ch < 0xDFFF) {
   5476 	                // Need to handle surrogate pairs.
   5477 	                this.index = start;
   5478 	                return this.getComplexIdentifier();
   5479 	            }
   5480 	            if (character_1.Character.isIdentifierPart(ch)) {
   5481 	                ++this.index;
   5482 	            }
   5483 	            else {
   5484 	                break;
   5485 	            }
   5486 	        }
   5487 	        return this.source.slice(start, this.index);
   5488 	    };
   5489 	    Scanner.prototype.getComplexIdentifier = function () {
   5490 	        var cp = this.codePointAt(this.index);
   5491 	        var id = character_1.Character.fromCodePoint(cp);
   5492 	        this.index += id.length;
   5493 	        // '\u' (U+005C, U+0075) denotes an escaped character.
   5494 	        var ch;
   5495 	        if (cp === 0x5C) {
   5496 	            if (this.source.charCodeAt(this.index) !== 0x75) {
   5497 	                this.throwUnexpectedToken();
   5498 	            }
   5499 	            ++this.index;
   5500 	            if (this.source[this.index] === '{') {
   5501 	                ++this.index;
   5502 	                ch = this.scanUnicodeCodePointEscape();
   5503 	            }
   5504 	            else {
   5505 	                ch = this.scanHexEscape('u');
   5506 	                if (ch === null || ch === '\\' || !character_1.Character.isIdentifierStart(ch.charCodeAt(0))) {
   5507 	                    this.throwUnexpectedToken();
   5508 	                }
   5509 	            }
   5510 	            id = ch;
   5511 	        }
   5512 	        while (!this.eof()) {
   5513 	            cp = this.codePointAt(this.index);
   5514 	            if (!character_1.Character.isIdentifierPart(cp)) {
   5515 	                break;
   5516 	            }
   5517 	            ch = character_1.Character.fromCodePoint(cp);
   5518 	            id += ch;
   5519 	            this.index += ch.length;
   5520 	            // '\u' (U+005C, U+0075) denotes an escaped character.
   5521 	            if (cp === 0x5C) {
   5522 	                id = id.substr(0, id.length - 1);
   5523 	                if (this.source.charCodeAt(this.index) !== 0x75) {
   5524 	                    this.throwUnexpectedToken();
   5525 	                }
   5526 	                ++this.index;
   5527 	                if (this.source[this.index] === '{') {
   5528 	                    ++this.index;
   5529 	                    ch = this.scanUnicodeCodePointEscape();
   5530 	                }
   5531 	                else {
   5532 	                    ch = this.scanHexEscape('u');
   5533 	                    if (ch === null || ch === '\\' || !character_1.Character.isIdentifierPart(ch.charCodeAt(0))) {
   5534 	                        this.throwUnexpectedToken();
   5535 	                    }
   5536 	                }
   5537 	                id += ch;
   5538 	            }
   5539 	        }
   5540 	        return id;
   5541 	    };
   5542 	    Scanner.prototype.octalToDecimal = function (ch) {
   5543 	        // \0 is not octal escape sequence
   5544 	        var octal = (ch !== '0');
   5545 	        var code = octalValue(ch);
   5546 	        if (!this.eof() && character_1.Character.isOctalDigit(this.source.charCodeAt(this.index))) {
   5547 	            octal = true;
   5548 	            code = code * 8 + octalValue(this.source[this.index++]);
   5549 	            // 3 digits are only allowed when string starts
   5550 	            // with 0, 1, 2, 3
   5551 	            if ('0123'.indexOf(ch) >= 0 && !this.eof() && character_1.Character.isOctalDigit(this.source.charCodeAt(this.index))) {
   5552 	                code = code * 8 + octalValue(this.source[this.index++]);
   5553 	            }
   5554 	        }
   5555 	        return {
   5556 	            code: code,
   5557 	            octal: octal
   5558 	        };
   5559 	    };
   5560 	    // https://tc39.github.io/ecma262/#sec-names-and-keywords
   5561 	    Scanner.prototype.scanIdentifier = function () {
   5562 	        var type;
   5563 	        var start = this.index;
   5564 	        // Backslash (U+005C) starts an escaped character.
   5565 	        var id = (this.source.charCodeAt(start) === 0x5C) ? this.getComplexIdentifier() : this.getIdentifier();
   5566 	        // There is no keyword or literal with only one character.
   5567 	        // Thus, it must be an identifier.
   5568 	        if (id.length === 1) {
   5569 	            type = 3 /* Identifier */;
   5570 	        }
   5571 	        else if (this.isKeyword(id)) {
   5572 	            type = 4 /* Keyword */;
   5573 	        }
   5574 	        else if (id === 'null') {
   5575 	            type = 5 /* NullLiteral */;
   5576 	        }
   5577 	        else if (id === 'true' || id === 'false') {
   5578 	            type = 1 /* BooleanLiteral */;
   5579 	        }
   5580 	        else {
   5581 	            type = 3 /* Identifier */;
   5582 	        }
   5583 	        if (type !== 3 /* Identifier */ && (start + id.length !== this.index)) {
   5584 	            var restore = this.index;
   5585 	            this.index = start;
   5586 	            this.tolerateUnexpectedToken(messages_1.Messages.InvalidEscapedReservedWord);
   5587 	            this.index = restore;
   5588 	        }
   5589 	        return {
   5590 	            type: type,
   5591 	            value: id,
   5592 	            lineNumber: this.lineNumber,
   5593 	            lineStart: this.lineStart,
   5594 	            start: start,
   5595 	            end: this.index
   5596 	        };
   5597 	    };
   5598 	    // https://tc39.github.io/ecma262/#sec-punctuators
   5599 	    Scanner.prototype.scanPunctuator = function () {
   5600 	        var start = this.index;
   5601 	        // Check for most common single-character punctuators.
   5602 	        var str = this.source[this.index];
   5603 	        switch (str) {
   5604 	            case '(':
   5605 	            case '{':
   5606 	                if (str === '{') {
   5607 	                    this.curlyStack.push('{');
   5608 	                }
   5609 	                ++this.index;
   5610 	                break;
   5611 	            case '.':
   5612 	                ++this.index;
   5613 	                if (this.source[this.index] === '.' && this.source[this.index + 1] === '.') {
   5614 	                    // Spread operator: ...
   5615 	                    this.index += 2;
   5616 	                    str = '...';
   5617 	                }
   5618 	                break;
   5619 	            case '}':
   5620 	                ++this.index;
   5621 	                this.curlyStack.pop();
   5622 	                break;
   5623 	            case ')':
   5624 	            case ';':
   5625 	            case ',':
   5626 	            case '[':
   5627 	            case ']':
   5628 	            case ':':
   5629 	            case '?':
   5630 	            case '~':
   5631 	                ++this.index;
   5632 	                break;
   5633 	            default:
   5634 	                // 4-character punctuator.
   5635 	                str = this.source.substr(this.index, 4);
   5636 	                if (str === '>>>=') {
   5637 	                    this.index += 4;
   5638 	                }
   5639 	                else {
   5640 	                    // 3-character punctuators.
   5641 	                    str = str.substr(0, 3);
   5642 	                    if (str === '===' || str === '!==' || str === '>>>' ||
   5643 	                        str === '<<=' || str === '>>=' || str === '**=') {
   5644 	                        this.index += 3;
   5645 	                    }
   5646 	                    else {
   5647 	                        // 2-character punctuators.
   5648 	                        str = str.substr(0, 2);
   5649 	                        if (str === '&&' || str === '||' || str === '==' || str === '!=' ||
   5650 	                            str === '+=' || str === '-=' || str === '*=' || str === '/=' ||
   5651 	                            str === '++' || str === '--' || str === '<<' || str === '>>' ||
   5652 	                            str === '&=' || str === '|=' || str === '^=' || str === '%=' ||
   5653 	                            str === '<=' || str === '>=' || str === '=>' || str === '**') {
   5654 	                            this.index += 2;
   5655 	                        }
   5656 	                        else {
   5657 	                            // 1-character punctuators.
   5658 	                            str = this.source[this.index];
   5659 	                            if ('<>=!+-*%&|^/'.indexOf(str) >= 0) {
   5660 	                                ++this.index;
   5661 	                            }
   5662 	                        }
   5663 	                    }
   5664 	                }
   5665 	        }
   5666 	        if (this.index === start) {
   5667 	            this.throwUnexpectedToken();
   5668 	        }
   5669 	        return {
   5670 	            type: 7 /* Punctuator */,
   5671 	            value: str,
   5672 	            lineNumber: this.lineNumber,
   5673 	            lineStart: this.lineStart,
   5674 	            start: start,
   5675 	            end: this.index
   5676 	        };
   5677 	    };
   5678 	    // https://tc39.github.io/ecma262/#sec-literals-numeric-literals
   5679 	    Scanner.prototype.scanHexLiteral = function (start) {
   5680 	        var num = '';
   5681 	        while (!this.eof()) {
   5682 	            if (!character_1.Character.isHexDigit(this.source.charCodeAt(this.index))) {
   5683 	                break;
   5684 	            }
   5685 	            num += this.source[this.index++];
   5686 	        }
   5687 	        if (num.length === 0) {
   5688 	            this.throwUnexpectedToken();
   5689 	        }
   5690 	        if (character_1.Character.isIdentifierStart(this.source.charCodeAt(this.index))) {
   5691 	            this.throwUnexpectedToken();
   5692 	        }
   5693 	        return {
   5694 	            type: 6 /* NumericLiteral */,
   5695 	            value: parseInt('0x' + num, 16),
   5696 	            lineNumber: this.lineNumber,
   5697 	            lineStart: this.lineStart,
   5698 	            start: start,
   5699 	            end: this.index
   5700 	        };
   5701 	    };
   5702 	    Scanner.prototype.scanBinaryLiteral = function (start) {
   5703 	        var num = '';
   5704 	        var ch;
   5705 	        while (!this.eof()) {
   5706 	            ch = this.source[this.index];
   5707 	            if (ch !== '0' && ch !== '1') {
   5708 	                break;
   5709 	            }
   5710 	            num += this.source[this.index++];
   5711 	        }
   5712 	        if (num.length === 0) {
   5713 	            // only 0b or 0B
   5714 	            this.throwUnexpectedToken();
   5715 	        }
   5716 	        if (!this.eof()) {
   5717 	            ch = this.source.charCodeAt(this.index);
   5718 	            /* istanbul ignore else */
   5719 	            if (character_1.Character.isIdentifierStart(ch) || character_1.Character.isDecimalDigit(ch)) {
   5720 	                this.throwUnexpectedToken();
   5721 	            }
   5722 	        }
   5723 	        return {
   5724 	            type: 6 /* NumericLiteral */,
   5725 	            value: parseInt(num, 2),
   5726 	            lineNumber: this.lineNumber,
   5727 	            lineStart: this.lineStart,
   5728 	            start: start,
   5729 	            end: this.index
   5730 	        };
   5731 	    };
   5732 	    Scanner.prototype.scanOctalLiteral = function (prefix, start) {
   5733 	        var num = '';
   5734 	        var octal = false;
   5735 	        if (character_1.Character.isOctalDigit(prefix.charCodeAt(0))) {
   5736 	            octal = true;
   5737 	            num = '0' + this.source[this.index++];
   5738 	        }
   5739 	        else {
   5740 	            ++this.index;
   5741 	        }
   5742 	        while (!this.eof()) {
   5743 	            if (!character_1.Character.isOctalDigit(this.source.charCodeAt(this.index))) {
   5744 	                break;
   5745 	            }
   5746 	            num += this.source[this.index++];
   5747 	        }
   5748 	        if (!octal && num.length === 0) {
   5749 	            // only 0o or 0O
   5750 	            this.throwUnexpectedToken();
   5751 	        }
   5752 	        if (character_1.Character.isIdentifierStart(this.source.charCodeAt(this.index)) || character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {
   5753 	            this.throwUnexpectedToken();
   5754 	        }
   5755 	        return {
   5756 	            type: 6 /* NumericLiteral */,
   5757 	            value: parseInt(num, 8),
   5758 	            octal: octal,
   5759 	            lineNumber: this.lineNumber,
   5760 	            lineStart: this.lineStart,
   5761 	            start: start,
   5762 	            end: this.index
   5763 	        };
   5764 	    };
   5765 	    Scanner.prototype.isImplicitOctalLiteral = function () {
   5766 	        // Implicit octal, unless there is a non-octal digit.
   5767 	        // (Annex B.1.1 on Numeric Literals)
   5768 	        for (var i = this.index + 1; i < this.length; ++i) {
   5769 	            var ch = this.source[i];
   5770 	            if (ch === '8' || ch === '9') {
   5771 	                return false;
   5772 	            }
   5773 	            if (!character_1.Character.isOctalDigit(ch.charCodeAt(0))) {
   5774 	                return true;
   5775 	            }
   5776 	        }
   5777 	        return true;
   5778 	    };
   5779 	    Scanner.prototype.scanNumericLiteral = function () {
   5780 	        var start = this.index;
   5781 	        var ch = this.source[start];
   5782 	        assert_1.assert(character_1.Character.isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'), 'Numeric literal must start with a decimal digit or a decimal point');
   5783 	        var num = '';
   5784 	        if (ch !== '.') {
   5785 	            num = this.source[this.index++];
   5786 	            ch = this.source[this.index];
   5787 	            // Hex number starts with '0x'.
   5788 	            // Octal number starts with '0'.
   5789 	            // Octal number in ES6 starts with '0o'.
   5790 	            // Binary number in ES6 starts with '0b'.
   5791 	            if (num === '0') {
   5792 	                if (ch === 'x' || ch === 'X') {
   5793 	                    ++this.index;
   5794 	                    return this.scanHexLiteral(start);
   5795 	                }
   5796 	                if (ch === 'b' || ch === 'B') {
   5797 	                    ++this.index;
   5798 	                    return this.scanBinaryLiteral(start);
   5799 	                }
   5800 	                if (ch === 'o' || ch === 'O') {
   5801 	                    return this.scanOctalLiteral(ch, start);
   5802 	                }
   5803 	                if (ch && character_1.Character.isOctalDigit(ch.charCodeAt(0))) {
   5804 	                    if (this.isImplicitOctalLiteral()) {
   5805 	                        return this.scanOctalLiteral(ch, start);
   5806 	                    }
   5807 	                }
   5808 	            }
   5809 	            while (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {
   5810 	                num += this.source[this.index++];
   5811 	            }
   5812 	            ch = this.source[this.index];
   5813 	        }
   5814 	        if (ch === '.') {
   5815 	            num += this.source[this.index++];
   5816 	            while (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {
   5817 	                num += this.source[this.index++];
   5818 	            }
   5819 	            ch = this.source[this.index];
   5820 	        }
   5821 	        if (ch === 'e' || ch === 'E') {
   5822 	            num += this.source[this.index++];
   5823 	            ch = this.source[this.index];
   5824 	            if (ch === '+' || ch === '-') {
   5825 	                num += this.source[this.index++];
   5826 	            }
   5827 	            if (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {
   5828 	                while (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {
   5829 	                    num += this.source[this.index++];
   5830 	                }
   5831 	            }
   5832 	            else {
   5833 	                this.throwUnexpectedToken();
   5834 	            }
   5835 	        }
   5836 	        if (character_1.Character.isIdentifierStart(this.source.charCodeAt(this.index))) {
   5837 	            this.throwUnexpectedToken();
   5838 	        }
   5839 	        return {
   5840 	            type: 6 /* NumericLiteral */,
   5841 	            value: parseFloat(num),
   5842 	            lineNumber: this.lineNumber,
   5843 	            lineStart: this.lineStart,
   5844 	            start: start,
   5845 	            end: this.index
   5846 	        };
   5847 	    };
   5848 	    // https://tc39.github.io/ecma262/#sec-literals-string-literals
   5849 	    Scanner.prototype.scanStringLiteral = function () {
   5850 	        var start = this.index;
   5851 	        var quote = this.source[start];
   5852 	        assert_1.assert((quote === '\'' || quote === '"'), 'String literal must starts with a quote');
   5853 	        ++this.index;
   5854 	        var octal = false;
   5855 	        var str = '';
   5856 	        while (!this.eof()) {
   5857 	            var ch = this.source[this.index++];
   5858 	            if (ch === quote) {
   5859 	                quote = '';
   5860 	                break;
   5861 	            }
   5862 	            else if (ch === '\\') {
   5863 	                ch = this.source[this.index++];
   5864 	                if (!ch || !character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
   5865 	                    switch (ch) {
   5866 	                        case 'u':
   5867 	                            if (this.source[this.index] === '{') {
   5868 	                                ++this.index;
   5869 	                                str += this.scanUnicodeCodePointEscape();
   5870 	                            }
   5871 	                            else {
   5872 	                                var unescaped_1 = this.scanHexEscape(ch);
   5873 	                                if (unescaped_1 === null) {
   5874 	                                    this.throwUnexpectedToken();
   5875 	                                }
   5876 	                                str += unescaped_1;
   5877 	                            }
   5878 	                            break;
   5879 	                        case 'x':
   5880 	                            var unescaped = this.scanHexEscape(ch);
   5881 	                            if (unescaped === null) {
   5882 	                                this.throwUnexpectedToken(messages_1.Messages.InvalidHexEscapeSequence);
   5883 	                            }
   5884 	                            str += unescaped;
   5885 	                            break;
   5886 	                        case 'n':
   5887 	                            str += '\n';
   5888 	                            break;
   5889 	                        case 'r':
   5890 	                            str += '\r';
   5891 	                            break;
   5892 	                        case 't':
   5893 	                            str += '\t';
   5894 	                            break;
   5895 	                        case 'b':
   5896 	                            str += '\b';
   5897 	                            break;
   5898 	                        case 'f':
   5899 	                            str += '\f';
   5900 	                            break;
   5901 	                        case 'v':
   5902 	                            str += '\x0B';
   5903 	                            break;
   5904 	                        case '8':
   5905 	                        case '9':
   5906 	                            str += ch;
   5907 	                            this.tolerateUnexpectedToken();
   5908 	                            break;
   5909 	                        default:
   5910 	                            if (ch && character_1.Character.isOctalDigit(ch.charCodeAt(0))) {
   5911 	                                var octToDec = this.octalToDecimal(ch);
   5912 	                                octal = octToDec.octal || octal;
   5913 	                                str += String.fromCharCode(octToDec.code);
   5914 	                            }
   5915 	                            else {
   5916 	                                str += ch;
   5917 	                            }
   5918 	                            break;
   5919 	                    }
   5920 	                }
   5921 	                else {
   5922 	                    ++this.lineNumber;
   5923 	                    if (ch === '\r' && this.source[this.index] === '\n') {
   5924 	                        ++this.index;
   5925 	                    }
   5926 	                    this.lineStart = this.index;
   5927 	                }
   5928 	            }
   5929 	            else if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
   5930 	                break;
   5931 	            }
   5932 	            else {
   5933 	                str += ch;
   5934 	            }
   5935 	        }
   5936 	        if (quote !== '') {
   5937 	            this.index = start;
   5938 	            this.throwUnexpectedToken();
   5939 	        }
   5940 	        return {
   5941 	            type: 8 /* StringLiteral */,
   5942 	            value: str,
   5943 	            octal: octal,
   5944 	            lineNumber: this.lineNumber,
   5945 	            lineStart: this.lineStart,
   5946 	            start: start,
   5947 	            end: this.index
   5948 	        };
   5949 	    };
   5950 	    // https://tc39.github.io/ecma262/#sec-template-literal-lexical-components
   5951 	    Scanner.prototype.scanTemplate = function () {
   5952 	        var cooked = '';
   5953 	        var terminated = false;
   5954 	        var start = this.index;
   5955 	        var head = (this.source[start] === '`');
   5956 	        var tail = false;
   5957 	        var rawOffset = 2;
   5958 	        ++this.index;
   5959 	        while (!this.eof()) {
   5960 	            var ch = this.source[this.index++];
   5961 	            if (ch === '`') {
   5962 	                rawOffset = 1;
   5963 	                tail = true;
   5964 	                terminated = true;
   5965 	                break;
   5966 	            }
   5967 	            else if (ch === '$') {
   5968 	                if (this.source[this.index] === '{') {
   5969 	                    this.curlyStack.push('${');
   5970 	                    ++this.index;
   5971 	                    terminated = true;
   5972 	                    break;
   5973 	                }
   5974 	                cooked += ch;
   5975 	            }
   5976 	            else if (ch === '\\') {
   5977 	                ch = this.source[this.index++];
   5978 	                if (!character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
   5979 	                    switch (ch) {
   5980 	                        case 'n':
   5981 	                            cooked += '\n';
   5982 	                            break;
   5983 	                        case 'r':
   5984 	                            cooked += '\r';
   5985 	                            break;
   5986 	                        case 't':
   5987 	                            cooked += '\t';
   5988 	                            break;
   5989 	                        case 'u':
   5990 	                            if (this.source[this.index] === '{') {
   5991 	                                ++this.index;
   5992 	                                cooked += this.scanUnicodeCodePointEscape();
   5993 	                            }
   5994 	                            else {
   5995 	                                var restore = this.index;
   5996 	                                var unescaped_2 = this.scanHexEscape(ch);
   5997 	                                if (unescaped_2 !== null) {
   5998 	                                    cooked += unescaped_2;
   5999 	                                }
   6000 	                                else {
   6001 	                                    this.index = restore;
   6002 	                                    cooked += ch;
   6003 	                                }
   6004 	                            }
   6005 	                            break;
   6006 	                        case 'x':
   6007 	                            var unescaped = this.scanHexEscape(ch);
   6008 	                            if (unescaped === null) {
   6009 	                                this.throwUnexpectedToken(messages_1.Messages.InvalidHexEscapeSequence);
   6010 	                            }
   6011 	                            cooked += unescaped;
   6012 	                            break;
   6013 	                        case 'b':
   6014 	                            cooked += '\b';
   6015 	                            break;
   6016 	                        case 'f':
   6017 	                            cooked += '\f';
   6018 	                            break;
   6019 	                        case 'v':
   6020 	                            cooked += '\v';
   6021 	                            break;
   6022 	                        default:
   6023 	                            if (ch === '0') {
   6024 	                                if (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {
   6025 	                                    // Illegal: \01 \02 and so on
   6026 	                                    this.throwUnexpectedToken(messages_1.Messages.TemplateOctalLiteral);
   6027 	                                }
   6028 	                                cooked += '\0';
   6029 	                            }
   6030 	                            else if (character_1.Character.isOctalDigit(ch.charCodeAt(0))) {
   6031 	                                // Illegal: \1 \2
   6032 	                                this.throwUnexpectedToken(messages_1.Messages.TemplateOctalLiteral);
   6033 	                            }
   6034 	                            else {
   6035 	                                cooked += ch;
   6036 	                            }
   6037 	                            break;
   6038 	                    }
   6039 	                }
   6040 	                else {
   6041 	                    ++this.lineNumber;
   6042 	                    if (ch === '\r' && this.source[this.index] === '\n') {
   6043 	                        ++this.index;
   6044 	                    }
   6045 	                    this.lineStart = this.index;
   6046 	                }
   6047 	            }
   6048 	            else if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
   6049 	                ++this.lineNumber;
   6050 	                if (ch === '\r' && this.source[this.index] === '\n') {
   6051 	                    ++this.index;
   6052 	                }
   6053 	                this.lineStart = this.index;
   6054 	                cooked += '\n';
   6055 	            }
   6056 	            else {
   6057 	                cooked += ch;
   6058 	            }
   6059 	        }
   6060 	        if (!terminated) {
   6061 	            this.throwUnexpectedToken();
   6062 	        }
   6063 	        if (!head) {
   6064 	            this.curlyStack.pop();
   6065 	        }
   6066 	        return {
   6067 	            type: 10 /* Template */,
   6068 	            value: this.source.slice(start + 1, this.index - rawOffset),
   6069 	            cooked: cooked,
   6070 	            head: head,
   6071 	            tail: tail,
   6072 	            lineNumber: this.lineNumber,
   6073 	            lineStart: this.lineStart,
   6074 	            start: start,
   6075 	            end: this.index
   6076 	        };
   6077 	    };
   6078 	    // https://tc39.github.io/ecma262/#sec-literals-regular-expression-literals
   6079 	    Scanner.prototype.testRegExp = function (pattern, flags) {
   6080 	        // The BMP character to use as a replacement for astral symbols when
   6081 	        // translating an ES6 "u"-flagged pattern to an ES5-compatible
   6082 	        // approximation.
   6083 	        // Note: replacing with '\uFFFF' enables false positives in unlikely
   6084 	        // scenarios. For example, `[\u{1044f}-\u{10440}]` is an invalid
   6085 	        // pattern that would not be detected by this substitution.
   6086 	        var astralSubstitute = '\uFFFF';
   6087 	        var tmp = pattern;
   6088 	        var self = this;
   6089 	        if (flags.indexOf('u') >= 0) {
   6090 	            tmp = tmp
   6091 	                .replace(/\\u\{([0-9a-fA-F]+)\}|\\u([a-fA-F0-9]{4})/g, function ($0, $1, $2) {
   6092 	                var codePoint = parseInt($1 || $2, 16);
   6093 	                if (codePoint > 0x10FFFF) {
   6094 	                    self.throwUnexpectedToken(messages_1.Messages.InvalidRegExp);
   6095 	                }
   6096 	                if (codePoint <= 0xFFFF) {
   6097 	                    return String.fromCharCode(codePoint);
   6098 	                }
   6099 	                return astralSubstitute;
   6100 	            })
   6101 	                .replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, astralSubstitute);
   6102 	        }
   6103 	        // First, detect invalid regular expressions.
   6104 	        try {
   6105 	            RegExp(tmp);
   6106 	        }
   6107 	        catch (e) {
   6108 	            this.throwUnexpectedToken(messages_1.Messages.InvalidRegExp);
   6109 	        }
   6110 	        // Return a regular expression object for this pattern-flag pair, or
   6111 	        // `null` in case the current environment doesn't support the flags it
   6112 	        // uses.
   6113 	        try {
   6114 	            return new RegExp(pattern, flags);
   6115 	        }
   6116 	        catch (exception) {
   6117 	            /* istanbul ignore next */
   6118 	            return null;
   6119 	        }
   6120 	    };
   6121 	    Scanner.prototype.scanRegExpBody = function () {
   6122 	        var ch = this.source[this.index];
   6123 	        assert_1.assert(ch === '/', 'Regular expression literal must start with a slash');
   6124 	        var str = this.source[this.index++];
   6125 	        var classMarker = false;
   6126 	        var terminated = false;
   6127 	        while (!this.eof()) {
   6128 	            ch = this.source[this.index++];
   6129 	            str += ch;
   6130 	            if (ch === '\\') {
   6131 	                ch = this.source[this.index++];
   6132 	                // https://tc39.github.io/ecma262/#sec-literals-regular-expression-literals
   6133 	                if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
   6134 	                    this.throwUnexpectedToken(messages_1.Messages.UnterminatedRegExp);
   6135 	                }
   6136 	                str += ch;
   6137 	            }
   6138 	            else if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
   6139 	                this.throwUnexpectedToken(messages_1.Messages.UnterminatedRegExp);
   6140 	            }
   6141 	            else if (classMarker) {
   6142 	                if (ch === ']') {
   6143 	                    classMarker = false;
   6144 	                }
   6145 	            }
   6146 	            else {
   6147 	                if (ch === '/') {
   6148 	                    terminated = true;
   6149 	                    break;
   6150 	                }
   6151 	                else if (ch === '[') {
   6152 	                    classMarker = true;
   6153 	                }
   6154 	            }
   6155 	        }
   6156 	        if (!terminated) {
   6157 	            this.throwUnexpectedToken(messages_1.Messages.UnterminatedRegExp);
   6158 	        }
   6159 	        // Exclude leading and trailing slash.
   6160 	        return str.substr(1, str.length - 2);
   6161 	    };
   6162 	    Scanner.prototype.scanRegExpFlags = function () {
   6163 	        var str = '';
   6164 	        var flags = '';
   6165 	        while (!this.eof()) {
   6166 	            var ch = this.source[this.index];
   6167 	            if (!character_1.Character.isIdentifierPart(ch.charCodeAt(0))) {
   6168 	                break;
   6169 	            }
   6170 	            ++this.index;
   6171 	            if (ch === '\\' && !this.eof()) {
   6172 	                ch = this.source[this.index];
   6173 	                if (ch === 'u') {
   6174 	                    ++this.index;
   6175 	                    var restore = this.index;
   6176 	                    var char = this.scanHexEscape('u');
   6177 	                    if (char !== null) {
   6178 	                        flags += char;
   6179 	                        for (str += '\\u'; restore < this.index; ++restore) {
   6180 	                            str += this.source[restore];
   6181 	                        }
   6182 	                    }
   6183 	                    else {
   6184 	                        this.index = restore;
   6185 	                        flags += 'u';
   6186 	                        str += '\\u';
   6187 	                    }
   6188 	                    this.tolerateUnexpectedToken();
   6189 	                }
   6190 	                else {
   6191 	                    str += '\\';
   6192 	                    this.tolerateUnexpectedToken();
   6193 	                }
   6194 	            }
   6195 	            else {
   6196 	                flags += ch;
   6197 	                str += ch;
   6198 	            }
   6199 	        }
   6200 	        return flags;
   6201 	    };
   6202 	    Scanner.prototype.scanRegExp = function () {
   6203 	        var start = this.index;
   6204 	        var pattern = this.scanRegExpBody();
   6205 	        var flags = this.scanRegExpFlags();
   6206 	        var value = this.testRegExp(pattern, flags);
   6207 	        return {
   6208 	            type: 9 /* RegularExpression */,
   6209 	            value: '',
   6210 	            pattern: pattern,
   6211 	            flags: flags,
   6212 	            regex: value,
   6213 	            lineNumber: this.lineNumber,
   6214 	            lineStart: this.lineStart,
   6215 	            start: start,
   6216 	            end: this.index
   6217 	        };
   6218 	    };
   6219 	    Scanner.prototype.lex = function () {
   6220 	        if (this.eof()) {
   6221 	            return {
   6222 	                type: 2 /* EOF */,
   6223 	                value: '',
   6224 	                lineNumber: this.lineNumber,
   6225 	                lineStart: this.lineStart,
   6226 	                start: this.index,
   6227 	                end: this.index
   6228 	            };
   6229 	        }
   6230 	        var cp = this.source.charCodeAt(this.index);
   6231 	        if (character_1.Character.isIdentifierStart(cp)) {
   6232 	            return this.scanIdentifier();
   6233 	        }
   6234 	        // Very common: ( and ) and ;
   6235 	        if (cp === 0x28 || cp === 0x29 || cp === 0x3B) {
   6236 	            return this.scanPunctuator();
   6237 	        }
   6238 	        // String literal starts with single quote (U+0027) or double quote (U+0022).
   6239 	        if (cp === 0x27 || cp === 0x22) {
   6240 	            return this.scanStringLiteral();
   6241 	        }
   6242 	        // Dot (.) U+002E can also start a floating-point number, hence the need
   6243 	        // to check the next character.
   6244 	        if (cp === 0x2E) {
   6245 	            if (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index + 1))) {
   6246 	                return this.scanNumericLiteral();
   6247 	            }
   6248 	            return this.scanPunctuator();
   6249 	        }
   6250 	        if (character_1.Character.isDecimalDigit(cp)) {
   6251 	            return this.scanNumericLiteral();
   6252 	        }
   6253 	        // Template literals start with ` (U+0060) for template head
   6254 	        // or } (U+007D) for template middle or template tail.
   6255 	        if (cp === 0x60 || (cp === 0x7D && this.curlyStack[this.curlyStack.length - 1] === '${')) {
   6256 	            return this.scanTemplate();
   6257 	        }
   6258 	        // Possible identifier start in a surrogate pair.
   6259 	        if (cp >= 0xD800 && cp < 0xDFFF) {
   6260 	            if (character_1.Character.isIdentifierStart(this.codePointAt(this.index))) {
   6261 	                return this.scanIdentifier();
   6262 	            }
   6263 	        }
   6264 	        return this.scanPunctuator();
   6265 	    };
   6266 	    return Scanner;
   6267 	}());
   6268 	exports.Scanner = Scanner;
   6269 
   6270 
   6271 /***/ },
   6272 /* 13 */
   6273 /***/ function(module, exports) {
   6274 
   6275 	"use strict";
   6276 	Object.defineProperty(exports, "__esModule", { value: true });
   6277 	exports.TokenName = {};
   6278 	exports.TokenName[1 /* BooleanLiteral */] = 'Boolean';
   6279 	exports.TokenName[2 /* EOF */] = '<end>';
   6280 	exports.TokenName[3 /* Identifier */] = 'Identifier';
   6281 	exports.TokenName[4 /* Keyword */] = 'Keyword';
   6282 	exports.TokenName[5 /* NullLiteral */] = 'Null';
   6283 	exports.TokenName[6 /* NumericLiteral */] = 'Numeric';
   6284 	exports.TokenName[7 /* Punctuator */] = 'Punctuator';
   6285 	exports.TokenName[8 /* StringLiteral */] = 'String';
   6286 	exports.TokenName[9 /* RegularExpression */] = 'RegularExpression';
   6287 	exports.TokenName[10 /* Template */] = 'Template';
   6288 
   6289 
   6290 /***/ },
   6291 /* 14 */
   6292 /***/ function(module, exports) {
   6293 
   6294 	"use strict";
   6295 	// Generated by generate-xhtml-entities.js. DO NOT MODIFY!
   6296 	Object.defineProperty(exports, "__esModule", { value: true });
   6297 	exports.XHTMLEntities = {
   6298 	    quot: '\u0022',
   6299 	    amp: '\u0026',
   6300 	    apos: '\u0027',
   6301 	    gt: '\u003E',
   6302 	    nbsp: '\u00A0',
   6303 	    iexcl: '\u00A1',
   6304 	    cent: '\u00A2',
   6305 	    pound: '\u00A3',
   6306 	    curren: '\u00A4',
   6307 	    yen: '\u00A5',
   6308 	    brvbar: '\u00A6',
   6309 	    sect: '\u00A7',
   6310 	    uml: '\u00A8',
   6311 	    copy: '\u00A9',
   6312 	    ordf: '\u00AA',
   6313 	    laquo: '\u00AB',
   6314 	    not: '\u00AC',
   6315 	    shy: '\u00AD',
   6316 	    reg: '\u00AE',
   6317 	    macr: '\u00AF',
   6318 	    deg: '\u00B0',
   6319 	    plusmn: '\u00B1',
   6320 	    sup2: '\u00B2',
   6321 	    sup3: '\u00B3',
   6322 	    acute: '\u00B4',
   6323 	    micro: '\u00B5',
   6324 	    para: '\u00B6',
   6325 	    middot: '\u00B7',
   6326 	    cedil: '\u00B8',
   6327 	    sup1: '\u00B9',
   6328 	    ordm: '\u00BA',
   6329 	    raquo: '\u00BB',
   6330 	    frac14: '\u00BC',
   6331 	    frac12: '\u00BD',
   6332 	    frac34: '\u00BE',
   6333 	    iquest: '\u00BF',
   6334 	    Agrave: '\u00C0',
   6335 	    Aacute: '\u00C1',
   6336 	    Acirc: '\u00C2',
   6337 	    Atilde: '\u00C3',
   6338 	    Auml: '\u00C4',
   6339 	    Aring: '\u00C5',
   6340 	    AElig: '\u00C6',
   6341 	    Ccedil: '\u00C7',
   6342 	    Egrave: '\u00C8',
   6343 	    Eacute: '\u00C9',
   6344 	    Ecirc: '\u00CA',
   6345 	    Euml: '\u00CB',
   6346 	    Igrave: '\u00CC',
   6347 	    Iacute: '\u00CD',
   6348 	    Icirc: '\u00CE',
   6349 	    Iuml: '\u00CF',
   6350 	    ETH: '\u00D0',
   6351 	    Ntilde: '\u00D1',
   6352 	    Ograve: '\u00D2',
   6353 	    Oacute: '\u00D3',
   6354 	    Ocirc: '\u00D4',
   6355 	    Otilde: '\u00D5',
   6356 	    Ouml: '\u00D6',
   6357 	    times: '\u00D7',
   6358 	    Oslash: '\u00D8',
   6359 	    Ugrave: '\u00D9',
   6360 	    Uacute: '\u00DA',
   6361 	    Ucirc: '\u00DB',
   6362 	    Uuml: '\u00DC',
   6363 	    Yacute: '\u00DD',
   6364 	    THORN: '\u00DE',
   6365 	    szlig: '\u00DF',
   6366 	    agrave: '\u00E0',
   6367 	    aacute: '\u00E1',
   6368 	    acirc: '\u00E2',
   6369 	    atilde: '\u00E3',
   6370 	    auml: '\u00E4',
   6371 	    aring: '\u00E5',
   6372 	    aelig: '\u00E6',
   6373 	    ccedil: '\u00E7',
   6374 	    egrave: '\u00E8',
   6375 	    eacute: '\u00E9',
   6376 	    ecirc: '\u00EA',
   6377 	    euml: '\u00EB',
   6378 	    igrave: '\u00EC',
   6379 	    iacute: '\u00ED',
   6380 	    icirc: '\u00EE',
   6381 	    iuml: '\u00EF',
   6382 	    eth: '\u00F0',
   6383 	    ntilde: '\u00F1',
   6384 	    ograve: '\u00F2',
   6385 	    oacute: '\u00F3',
   6386 	    ocirc: '\u00F4',
   6387 	    otilde: '\u00F5',
   6388 	    ouml: '\u00F6',
   6389 	    divide: '\u00F7',
   6390 	    oslash: '\u00F8',
   6391 	    ugrave: '\u00F9',
   6392 	    uacute: '\u00FA',
   6393 	    ucirc: '\u00FB',
   6394 	    uuml: '\u00FC',
   6395 	    yacute: '\u00FD',
   6396 	    thorn: '\u00FE',
   6397 	    yuml: '\u00FF',
   6398 	    OElig: '\u0152',
   6399 	    oelig: '\u0153',
   6400 	    Scaron: '\u0160',
   6401 	    scaron: '\u0161',
   6402 	    Yuml: '\u0178',
   6403 	    fnof: '\u0192',
   6404 	    circ: '\u02C6',
   6405 	    tilde: '\u02DC',
   6406 	    Alpha: '\u0391',
   6407 	    Beta: '\u0392',
   6408 	    Gamma: '\u0393',
   6409 	    Delta: '\u0394',
   6410 	    Epsilon: '\u0395',
   6411 	    Zeta: '\u0396',
   6412 	    Eta: '\u0397',
   6413 	    Theta: '\u0398',
   6414 	    Iota: '\u0399',
   6415 	    Kappa: '\u039A',
   6416 	    Lambda: '\u039B',
   6417 	    Mu: '\u039C',
   6418 	    Nu: '\u039D',
   6419 	    Xi: '\u039E',
   6420 	    Omicron: '\u039F',
   6421 	    Pi: '\u03A0',
   6422 	    Rho: '\u03A1',
   6423 	    Sigma: '\u03A3',
   6424 	    Tau: '\u03A4',
   6425 	    Upsilon: '\u03A5',
   6426 	    Phi: '\u03A6',
   6427 	    Chi: '\u03A7',
   6428 	    Psi: '\u03A8',
   6429 	    Omega: '\u03A9',
   6430 	    alpha: '\u03B1',
   6431 	    beta: '\u03B2',
   6432 	    gamma: '\u03B3',
   6433 	    delta: '\u03B4',
   6434 	    epsilon: '\u03B5',
   6435 	    zeta: '\u03B6',
   6436 	    eta: '\u03B7',
   6437 	    theta: '\u03B8',
   6438 	    iota: '\u03B9',
   6439 	    kappa: '\u03BA',
   6440 	    lambda: '\u03BB',
   6441 	    mu: '\u03BC',
   6442 	    nu: '\u03BD',
   6443 	    xi: '\u03BE',
   6444 	    omicron: '\u03BF',
   6445 	    pi: '\u03C0',
   6446 	    rho: '\u03C1',
   6447 	    sigmaf: '\u03C2',
   6448 	    sigma: '\u03C3',
   6449 	    tau: '\u03C4',
   6450 	    upsilon: '\u03C5',
   6451 	    phi: '\u03C6',
   6452 	    chi: '\u03C7',
   6453 	    psi: '\u03C8',
   6454 	    omega: '\u03C9',
   6455 	    thetasym: '\u03D1',
   6456 	    upsih: '\u03D2',
   6457 	    piv: '\u03D6',
   6458 	    ensp: '\u2002',
   6459 	    emsp: '\u2003',
   6460 	    thinsp: '\u2009',
   6461 	    zwnj: '\u200C',
   6462 	    zwj: '\u200D',
   6463 	    lrm: '\u200E',
   6464 	    rlm: '\u200F',
   6465 	    ndash: '\u2013',
   6466 	    mdash: '\u2014',
   6467 	    lsquo: '\u2018',
   6468 	    rsquo: '\u2019',
   6469 	    sbquo: '\u201A',
   6470 	    ldquo: '\u201C',
   6471 	    rdquo: '\u201D',
   6472 	    bdquo: '\u201E',
   6473 	    dagger: '\u2020',
   6474 	    Dagger: '\u2021',
   6475 	    bull: '\u2022',
   6476 	    hellip: '\u2026',
   6477 	    permil: '\u2030',
   6478 	    prime: '\u2032',
   6479 	    Prime: '\u2033',
   6480 	    lsaquo: '\u2039',
   6481 	    rsaquo: '\u203A',
   6482 	    oline: '\u203E',
   6483 	    frasl: '\u2044',
   6484 	    euro: '\u20AC',
   6485 	    image: '\u2111',
   6486 	    weierp: '\u2118',
   6487 	    real: '\u211C',
   6488 	    trade: '\u2122',
   6489 	    alefsym: '\u2135',
   6490 	    larr: '\u2190',
   6491 	    uarr: '\u2191',
   6492 	    rarr: '\u2192',
   6493 	    darr: '\u2193',
   6494 	    harr: '\u2194',
   6495 	    crarr: '\u21B5',
   6496 	    lArr: '\u21D0',
   6497 	    uArr: '\u21D1',
   6498 	    rArr: '\u21D2',
   6499 	    dArr: '\u21D3',
   6500 	    hArr: '\u21D4',
   6501 	    forall: '\u2200',
   6502 	    part: '\u2202',
   6503 	    exist: '\u2203',
   6504 	    empty: '\u2205',
   6505 	    nabla: '\u2207',
   6506 	    isin: '\u2208',
   6507 	    notin: '\u2209',
   6508 	    ni: '\u220B',
   6509 	    prod: '\u220F',
   6510 	    sum: '\u2211',
   6511 	    minus: '\u2212',
   6512 	    lowast: '\u2217',
   6513 	    radic: '\u221A',
   6514 	    prop: '\u221D',
   6515 	    infin: '\u221E',
   6516 	    ang: '\u2220',
   6517 	    and: '\u2227',
   6518 	    or: '\u2228',
   6519 	    cap: '\u2229',
   6520 	    cup: '\u222A',
   6521 	    int: '\u222B',
   6522 	    there4: '\u2234',
   6523 	    sim: '\u223C',
   6524 	    cong: '\u2245',
   6525 	    asymp: '\u2248',
   6526 	    ne: '\u2260',
   6527 	    equiv: '\u2261',
   6528 	    le: '\u2264',
   6529 	    ge: '\u2265',
   6530 	    sub: '\u2282',
   6531 	    sup: '\u2283',
   6532 	    nsub: '\u2284',
   6533 	    sube: '\u2286',
   6534 	    supe: '\u2287',
   6535 	    oplus: '\u2295',
   6536 	    otimes: '\u2297',
   6537 	    perp: '\u22A5',
   6538 	    sdot: '\u22C5',
   6539 	    lceil: '\u2308',
   6540 	    rceil: '\u2309',
   6541 	    lfloor: '\u230A',
   6542 	    rfloor: '\u230B',
   6543 	    loz: '\u25CA',
   6544 	    spades: '\u2660',
   6545 	    clubs: '\u2663',
   6546 	    hearts: '\u2665',
   6547 	    diams: '\u2666',
   6548 	    lang: '\u27E8',
   6549 	    rang: '\u27E9'
   6550 	};
   6551 
   6552 
   6553 /***/ },
   6554 /* 15 */
   6555 /***/ function(module, exports, __webpack_require__) {
   6556 
   6557 	"use strict";
   6558 	Object.defineProperty(exports, "__esModule", { value: true });
   6559 	var error_handler_1 = __webpack_require__(10);
   6560 	var scanner_1 = __webpack_require__(12);
   6561 	var token_1 = __webpack_require__(13);
   6562 	var Reader = (function () {
   6563 	    function Reader() {
   6564 	        this.values = [];
   6565 	        this.curly = this.paren = -1;
   6566 	    }
   6567 	    // A function following one of those tokens is an expression.
   6568 	    Reader.prototype.beforeFunctionExpression = function (t) {
   6569 	        return ['(', '{', '[', 'in', 'typeof', 'instanceof', 'new',
   6570 	            'return', 'case', 'delete', 'throw', 'void',
   6571 	            // assignment operators
   6572 	            '=', '+=', '-=', '*=', '**=', '/=', '%=', '<<=', '>>=', '>>>=',
   6573 	            '&=', '|=', '^=', ',',
   6574 	            // binary/unary operators
   6575 	            '+', '-', '*', '**', '/', '%', '++', '--', '<<', '>>', '>>>', '&',
   6576 	            '|', '^', '!', '~', '&&', '||', '?', ':', '===', '==', '>=',
   6577 	            '<=', '<', '>', '!=', '!=='].indexOf(t) >= 0;
   6578 	    };
   6579 	    // Determine if forward slash (/) is an operator or part of a regular expression
   6580 	    // https://github.com/mozilla/sweet.js/wiki/design
   6581 	    Reader.prototype.isRegexStart = function () {
   6582 	        var previous = this.values[this.values.length - 1];
   6583 	        var regex = (previous !== null);
   6584 	        switch (previous) {
   6585 	            case 'this':
   6586 	            case ']':
   6587 	                regex = false;
   6588 	                break;
   6589 	            case ')':
   6590 	                var keyword = this.values[this.paren - 1];
   6591 	                regex = (keyword === 'if' || keyword === 'while' || keyword === 'for' || keyword === 'with');
   6592 	                break;
   6593 	            case '}':
   6594 	                // Dividing a function by anything makes little sense,
   6595 	                // but we have to check for that.
   6596 	                regex = false;
   6597 	                if (this.values[this.curly - 3] === 'function') {
   6598 	                    // Anonymous function, e.g. function(){} /42
   6599 	                    var check = this.values[this.curly - 4];
   6600 	                    regex = check ? !this.beforeFunctionExpression(check) : false;
   6601 	                }
   6602 	                else if (this.values[this.curly - 4] === 'function') {
   6603 	                    // Named function, e.g. function f(){} /42/
   6604 	                    var check = this.values[this.curly - 5];
   6605 	                    regex = check ? !this.beforeFunctionExpression(check) : true;
   6606 	                }
   6607 	                break;
   6608 	            default:
   6609 	                break;
   6610 	        }
   6611 	        return regex;
   6612 	    };
   6613 	    Reader.prototype.push = function (token) {
   6614 	        if (token.type === 7 /* Punctuator */ || token.type === 4 /* Keyword */) {
   6615 	            if (token.value === '{') {
   6616 	                this.curly = this.values.length;
   6617 	            }
   6618 	            else if (token.value === '(') {
   6619 	                this.paren = this.values.length;
   6620 	            }
   6621 	            this.values.push(token.value);
   6622 	        }
   6623 	        else {
   6624 	            this.values.push(null);
   6625 	        }
   6626 	    };
   6627 	    return Reader;
   6628 	}());
   6629 	var Tokenizer = (function () {
   6630 	    function Tokenizer(code, config) {
   6631 	        this.errorHandler = new error_handler_1.ErrorHandler();
   6632 	        this.errorHandler.tolerant = config ? (typeof config.tolerant === 'boolean' && config.tolerant) : false;
   6633 	        this.scanner = new scanner_1.Scanner(code, this.errorHandler);
   6634 	        this.scanner.trackComment = config ? (typeof config.comment === 'boolean' && config.comment) : false;
   6635 	        this.trackRange = config ? (typeof config.range === 'boolean' && config.range) : false;
   6636 	        this.trackLoc = config ? (typeof config.loc === 'boolean' && config.loc) : false;
   6637 	        this.buffer = [];
   6638 	        this.reader = new Reader();
   6639 	    }
   6640 	    Tokenizer.prototype.errors = function () {
   6641 	        return this.errorHandler.errors;
   6642 	    };
   6643 	    Tokenizer.prototype.getNextToken = function () {
   6644 	        if (this.buffer.length === 0) {
   6645 	            var comments = this.scanner.scanComments();
   6646 	            if (this.scanner.trackComment) {
   6647 	                for (var i = 0; i < comments.length; ++i) {
   6648 	                    var e = comments[i];
   6649 	                    var value = this.scanner.source.slice(e.slice[0], e.slice[1]);
   6650 	                    var comment = {
   6651 	                        type: e.multiLine ? 'BlockComment' : 'LineComment',
   6652 	                        value: value
   6653 	                    };
   6654 	                    if (this.trackRange) {
   6655 	                        comment.range = e.range;
   6656 	                    }
   6657 	                    if (this.trackLoc) {
   6658 	                        comment.loc = e.loc;
   6659 	                    }
   6660 	                    this.buffer.push(comment);
   6661 	                }
   6662 	            }
   6663 	            if (!this.scanner.eof()) {
   6664 	                var loc = void 0;
   6665 	                if (this.trackLoc) {
   6666 	                    loc = {
   6667 	                        start: {
   6668 	                            line: this.scanner.lineNumber,
   6669 	                            column: this.scanner.index - this.scanner.lineStart
   6670 	                        },
   6671 	                        end: {}
   6672 	                    };
   6673 	                }
   6674 	                var startRegex = (this.scanner.source[this.scanner.index] === '/') && this.reader.isRegexStart();
   6675 	                var token = startRegex ? this.scanner.scanRegExp() : this.scanner.lex();
   6676 	                this.reader.push(token);
   6677 	                var entry = {
   6678 	                    type: token_1.TokenName[token.type],
   6679 	                    value: this.scanner.source.slice(token.start, token.end)
   6680 	                };
   6681 	                if (this.trackRange) {
   6682 	                    entry.range = [token.start, token.end];
   6683 	                }
   6684 	                if (this.trackLoc) {
   6685 	                    loc.end = {
   6686 	                        line: this.scanner.lineNumber,
   6687 	                        column: this.scanner.index - this.scanner.lineStart
   6688 	                    };
   6689 	                    entry.loc = loc;
   6690 	                }
   6691 	                if (token.type === 9 /* RegularExpression */) {
   6692 	                    var pattern = token.pattern;
   6693 	                    var flags = token.flags;
   6694 	                    entry.regex = { pattern: pattern, flags: flags };
   6695 	                }
   6696 	                this.buffer.push(entry);
   6697 	            }
   6698 	        }
   6699 	        return this.buffer.shift();
   6700 	    };
   6701 	    return Tokenizer;
   6702 	}());
   6703 	exports.Tokenizer = Tokenizer;
   6704 
   6705 
   6706 /***/ }
   6707 /******/ ])
   6708 });
   6709 ;