Make JetStream 2
[WebKit-https.git] / PerformanceTests / JetStream2 / web-tooling-benchmark / cli.js
1 /*
2 * This license applies to all parts of web-tooling-benchmark that are not
3 * externally maintained libraries. The externally maintained libraries
4 * used by web-tooling-benchmark are:
5
6 *   - The Backbone.js distribution, located in third_party/backbone-1.1.0.js.
7 *     This is copyrighted by Jeremy Ashkenas, DocumentCloud, and released
8 *     under the terms of the MIT license.
9
10 *   - The lexer from the CoffeeScript project, located in
11 *     third_party/coffeescript-lexer-2.0.1.coffee, which is copyrighted by
12 *     Jeremy Ashkenas, and relased under the terms of the MIT license.
13
14 *   - The jQuery distribution, located in third_party/jquery-3.2.1.js. This
15 *     is copyrighted by the JS Foundation and other contributors, and
16 *     released under the terms of the MIT license.
17
18 *   - The Lodash distribution, located in third_party/lodash.core-4.17.4.js
19 *     and third_party/lodash.min-4.17.4.js.map. This is copyrighted by
20 *     the JS Foundation and other contributors, and released under the
21 *     terms of the MIT license.
22
23 *   - The MooTools distribution, located in third_party/mootools-core-1.6.0.js.
24 *     This is copyrighted by Valerio Proietti, and released under the
25 *     terms of the MIT license.
26
27 *   - The Preact distribution, located in third_party/preact-8.2.5.js and
28 *     third_party/preact-8.2.5.js.map. This is copyrighted by Jason Miller,
29 *     and released under the terms of the MIT license.
30
31 *   - The Redux distribution, located in third_party/redux.min-3.7.2.js.
32 *     This is copyrighted by Dan Abramov, and released under the terms
33 *     of the MIT license.
34
35 *   - The source-map distribution, located in
36 *     third_party/source-map.min-0.5.7.map. This is copyrighted by the
37 *     Mozilla Foundation and contributors, and released under the terms
38 *     of a 3-clause BSD license.
39
40 *   - Several tests from the TodoMVC distribution, located in
41 *     third_party/speedometer-es2015-test-2.0.js and third_party/todomvc.
42 *     These are copyrighted by Addy Osmani, Sindre Sorhus, Pascal
43 *     Hartig, Stephen Sawchuk, and released under the terms of the
44 *     MIT license.
45
46 *   - The Underscore.js distribution, located in
47 *     third_party/underscore-1.8.3.js and
48 *     third_party/underscore.min-1.8.3.js.map. This is copyrighted by
49 *     Jeremy Ashkenas, and released under the terms of the MIT license.
50
51 *   - The VueJS distribution, located in
52 *     third_party/vue.runtime.esm-nobuble-2.4.4.js. This is copyrighted
53 *     Yuxi (Evan) You, and released under the terms of the MIT license.
54
55 * These libraries have their own licenses; we recommend you read them,
56 * as their terms may differ from the terms below.
57
58 * Copyright 2017, the V8 project authors. All rights reserved.
59 * Redistribution and use in source and binary forms, with or without
60 * modification, are permitted provided that the following conditions are
61 * met:
62
63 *     * Redistributions of source code must retain the above copyright
64 *       notice, this list of conditions and the following disclaimer.
65 *     * Redistributions in binary form must reproduce the above
66 *       copyright notice, this list of conditions and the following
67 *       disclaimer in the documentation and/or other materials provided
68 *       with the distribution.
69 *     * Neither the name of Google Inc. nor the names of its
70 *       contributors may be used to endorse or promote products derived
71 *       from this software without specific prior written permission.
72
73 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
74 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
75 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
76 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
77 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
78 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
79 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
80 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
81 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
82 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
83 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
84 */
85
86 // Required for JavaScript engine shells.
87 var global = this;
88 /******/ (function(modules) { // webpackBootstrap
89 /******/        // The module cache
90 /******/        var installedModules = {};
91 /******/
92 /******/        // The require function
93 /******/        function __webpack_require__(moduleId) {
94 /******/
95 /******/                // Check if module is in cache
96 /******/                if(installedModules[moduleId]) {
97 /******/                        return installedModules[moduleId].exports;
98 /******/                }
99 /******/                // Create a new module (and put it into the cache)
100 /******/                var module = installedModules[moduleId] = {
101 /******/                        i: moduleId,
102 /******/                        l: false,
103 /******/                        exports: {}
104 /******/                };
105 /******/
106 /******/                // Execute the module function
107 /******/                modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
108 /******/
109 /******/                // Flag the module as loaded
110 /******/                module.l = true;
111 /******/
112 /******/                // Return the exports of the module
113 /******/                return module.exports;
114 /******/        }
115 /******/
116 /******/
117 /******/        // expose the modules object (__webpack_modules__)
118 /******/        __webpack_require__.m = modules;
119 /******/
120 /******/        // expose the module cache
121 /******/        __webpack_require__.c = installedModules;
122 /******/
123 /******/        // define getter function for harmony exports
124 /******/        __webpack_require__.d = function(exports, name, getter) {
125 /******/                if(!__webpack_require__.o(exports, name)) {
126 /******/                        Object.defineProperty(exports, name, {
127 /******/                                configurable: false,
128 /******/                                enumerable: true,
129 /******/                                get: getter
130 /******/                        });
131 /******/                }
132 /******/        };
133 /******/
134 /******/        // getDefaultExport function for compatibility with non-harmony modules
135 /******/        __webpack_require__.n = function(module) {
136 /******/                var getter = module && module.__esModule ?
137 /******/                        function getDefault() { return module['default']; } :
138 /******/                        function getModuleExports() { return module; };
139 /******/                __webpack_require__.d(getter, 'a', getter);
140 /******/                return getter;
141 /******/        };
142 /******/
143 /******/        // Object.prototype.hasOwnProperty.call
144 /******/        __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
145 /******/
146 /******/        // __webpack_public_path__
147 /******/        __webpack_require__.p = "";
148 /******/
149 /******/        // Load entry module and return exports
150 /******/        return __webpack_require__(__webpack_require__.s = 387);
151 /******/ })
152 /************************************************************************/
153 /******/ ([
154 /* 0 */
155 /***/ (function(module, exports, __webpack_require__) {
156
157 "use strict";
158
159
160 Object.defineProperty(exports, "__esModule", {
161   value: true
162 });
163
164 var _Value = __webpack_require__(300);
165
166 Object.defineProperty(exports, "Value", {
167   enumerable: true,
168   get: function () {
169     return _interopRequireDefault(_Value).default;
170   }
171 });
172
173 var _ConcreteValue = __webpack_require__(660);
174
175 Object.defineProperty(exports, "ConcreteValue", {
176   enumerable: true,
177   get: function () {
178     return _interopRequireDefault(_ConcreteValue).default;
179   }
180 });
181
182 var _PrimitiveValue = __webpack_require__(301);
183
184 Object.defineProperty(exports, "PrimitiveValue", {
185   enumerable: true,
186   get: function () {
187     return _interopRequireDefault(_PrimitiveValue).default;
188   }
189 });
190
191 var _ObjectValue = __webpack_require__(661);
192
193 Object.defineProperty(exports, "ObjectValue", {
194   enumerable: true,
195   get: function () {
196     return _interopRequireDefault(_ObjectValue).default;
197   }
198 });
199
200 var _FunctionValue = __webpack_require__(926);
201
202 Object.defineProperty(exports, "FunctionValue", {
203   enumerable: true,
204   get: function () {
205     return _interopRequireDefault(_FunctionValue).default;
206   }
207 });
208
209 var _ECMAScriptFunctionValue = __webpack_require__(927);
210
211 Object.defineProperty(exports, "ECMAScriptFunctionValue", {
212   enumerable: true,
213   get: function () {
214     return _interopRequireDefault(_ECMAScriptFunctionValue).default;
215   }
216 });
217
218 var _ECMAScriptSourceFunctionValue = __webpack_require__(928);
219
220 Object.defineProperty(exports, "ECMAScriptSourceFunctionValue", {
221   enumerable: true,
222   get: function () {
223     return _interopRequireDefault(_ECMAScriptSourceFunctionValue).default;
224   }
225 });
226
227 var _BoundFunctionValue = __webpack_require__(929);
228
229 Object.defineProperty(exports, "BoundFunctionValue", {
230   enumerable: true,
231   get: function () {
232     return _interopRequireDefault(_BoundFunctionValue).default;
233   }
234 });
235
236 var _NativeFunctionValue = __webpack_require__(930);
237
238 Object.defineProperty(exports, "NativeFunctionValue", {
239   enumerable: true,
240   get: function () {
241     return _interopRequireDefault(_NativeFunctionValue).default;
242   }
243 });
244 Object.defineProperty(exports, "NativeFunctionCallback", {
245   enumerable: true,
246   get: function () {
247     return _NativeFunctionValue.NativeFunctionCallback;
248   }
249 });
250
251 var _ArrayValue = __webpack_require__(931);
252
253 Object.defineProperty(exports, "ArrayValue", {
254   enumerable: true,
255   get: function () {
256     return _interopRequireDefault(_ArrayValue).default;
257   }
258 });
259
260 var _UndefinedValue = __webpack_require__(932);
261
262 Object.defineProperty(exports, "UndefinedValue", {
263   enumerable: true,
264   get: function () {
265     return _interopRequireDefault(_UndefinedValue).default;
266   }
267 });
268
269 var _EmptyValue = __webpack_require__(933);
270
271 Object.defineProperty(exports, "EmptyValue", {
272   enumerable: true,
273   get: function () {
274     return _interopRequireDefault(_EmptyValue).default;
275   }
276 });
277
278 var _NullValue = __webpack_require__(934);
279
280 Object.defineProperty(exports, "NullValue", {
281   enumerable: true,
282   get: function () {
283     return _interopRequireDefault(_NullValue).default;
284   }
285 });
286
287 var _NumberValue = __webpack_require__(935);
288
289 Object.defineProperty(exports, "NumberValue", {
290   enumerable: true,
291   get: function () {
292     return _NumberValue.NumberValue;
293   }
294 });
295 Object.defineProperty(exports, "IntegralValue", {
296   enumerable: true,
297   get: function () {
298     return _NumberValue.IntegralValue;
299   }
300 });
301
302 var _ProxyValue = __webpack_require__(936);
303
304 Object.defineProperty(exports, "ProxyValue", {
305   enumerable: true,
306   get: function () {
307     return _interopRequireDefault(_ProxyValue).default;
308   }
309 });
310
311 var _StringExotic = __webpack_require__(937);
312
313 Object.defineProperty(exports, "StringExotic", {
314   enumerable: true,
315   get: function () {
316     return _interopRequireDefault(_StringExotic).default;
317   }
318 });
319
320 var _ArgumentsExotic = __webpack_require__(938);
321
322 Object.defineProperty(exports, "ArgumentsExotic", {
323   enumerable: true,
324   get: function () {
325     return _interopRequireDefault(_ArgumentsExotic).default;
326   }
327 });
328
329 var _IntegerIndexedExotic = __webpack_require__(939);
330
331 Object.defineProperty(exports, "IntegerIndexedExotic", {
332   enumerable: true,
333   get: function () {
334     return _interopRequireDefault(_IntegerIndexedExotic).default;
335   }
336 });
337
338 var _BooleanValue = __webpack_require__(940);
339
340 Object.defineProperty(exports, "BooleanValue", {
341   enumerable: true,
342   get: function () {
343     return _interopRequireDefault(_BooleanValue).default;
344   }
345 });
346
347 var _StringValue = __webpack_require__(941);
348
349 Object.defineProperty(exports, "StringValue", {
350   enumerable: true,
351   get: function () {
352     return _interopRequireDefault(_StringValue).default;
353   }
354 });
355
356 var _SymbolValue = __webpack_require__(942);
357
358 Object.defineProperty(exports, "SymbolValue", {
359   enumerable: true,
360   get: function () {
361     return _interopRequireDefault(_SymbolValue).default;
362   }
363 });
364
365 var _AbstractValue = __webpack_require__(368);
366
367 Object.defineProperty(exports, "AbstractValue", {
368   enumerable: true,
369   get: function () {
370     return _interopRequireDefault(_AbstractValue).default;
371   }
372 });
373 Object.defineProperty(exports, "AbstractValueBuildNodeFunction", {
374   enumerable: true,
375   get: function () {
376     return _AbstractValue.AbstractValueBuildNodeFunction;
377   }
378 });
379
380 var _AbstractObjectValue = __webpack_require__(370);
381
382 Object.defineProperty(exports, "AbstractObjectValue", {
383   enumerable: true,
384   get: function () {
385     return _interopRequireDefault(_AbstractObjectValue).default;
386   }
387 });
388
389 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
390
391
392 /***/ }),
393 /* 1 */
394 /***/ (function(module, exports, __webpack_require__) {
395
396 "use strict";
397
398
399 Object.defineProperty(exports, "__esModule", {
400   value: true
401 });
402 exports.default = invariant;
403 /**
404  * Copyright (c) 2017-present, Facebook, Inc.
405  * All rights reserved.
406  *
407  * This source code is licensed under the BSD-style license found in the
408  * LICENSE file in the root directory of this source tree. An additional grant
409  * of patent rights can be found in the PATENTS file in the same directory.
410  */
411
412 function invariant(condition, format) {
413   if (condition) return;
414   const message = `${format}
415 This is likely a bug in Prepack, not your code. Feel free to open an issue on GitHub.`;
416   let error = new Error(message);
417   error.name = "Invariant Violation";
418   throw error;
419 }
420
421
422 /***/ }),
423 /* 2 */
424 /***/ (function(module, exports, __webpack_require__) {
425
426 "use strict";
427
428
429 Object.defineProperty(exports, "__esModule", {
430   value: true
431 });
432 exports.setCreate = setCreate;
433 exports.setEnvironment = setEnvironment;
434 exports.setFunctions = setFunctions;
435 exports.setHavoc = setHavoc;
436 exports.setJoin = setJoin;
437 exports.setPath = setPath;
438 exports.setProperties = setProperties;
439 exports.setTo = setTo;
440 exports.setWiden = setWiden;
441 exports.setConcretize = setConcretize;
442 exports.setUtils = setUtils;
443 let Create = exports.Create = null; /**
444                                      * Copyright (c) 2017-present, Facebook, Inc.
445                                      * All rights reserved.
446                                      *
447                                      * This source code is licensed under the BSD-style license found in the
448                                      * LICENSE file in the root directory of this source tree. An additional grant
449                                      * of patent rights can be found in the PATENTS file in the same directory.
450                                      */
451
452 let Environment = exports.Environment = null;
453 let Functions = exports.Functions = null;
454 let Havoc = exports.Havoc = null;
455 let Join = exports.Join = null;
456 let Path = exports.Path = null;
457 let Properties = exports.Properties = null;
458 let To = exports.To = null;
459 let Widen = exports.Widen = null;
460 let concretize = exports.concretize = null;
461 let Utils = exports.Utils = null;
462
463 function setCreate(singleton) {
464   exports.Create = Create = singleton;
465 }
466
467 function setEnvironment(singleton) {
468   exports.Environment = Environment = singleton;
469 }
470
471 function setFunctions(singleton) {
472   exports.Functions = Functions = singleton;
473 }
474
475 function setHavoc(singleton) {
476   exports.Havoc = Havoc = singleton;
477 }
478
479 function setJoin(singleton) {
480   exports.Join = Join = singleton;
481 }
482
483 function setPath(singleton) {
484   exports.Path = Path = singleton;
485 }
486
487 function setProperties(singleton) {
488   exports.Properties = Properties = singleton;
489 }
490
491 function setTo(singleton) {
492   exports.To = To = singleton;
493 }
494
495 function setWiden(singleton) {
496   exports.Widen = Widen = singleton;
497 }
498
499 function setConcretize(singleton) {
500   exports.concretize = concretize = singleton;
501 }
502
503 function setUtils(singleton) {
504   exports.Utils = Utils = singleton;
505 }
506
507
508 /***/ }),
509 /* 3 */
510 /***/ (function(module, exports, __webpack_require__) {
511
512 "use strict";
513
514
515 Object.defineProperty(exports, "__esModule", {
516   value: true
517 });
518 exports.PossiblyNormalCompletion = exports.JoinedAbruptCompletions = exports.ReturnCompletion = exports.BreakCompletion = exports.ContinueCompletion = exports.ThrowCompletion = exports.AbruptCompletion = exports.NormalCompletion = exports.Completion = undefined;
519
520 var _invariant = __webpack_require__(1);
521
522 var _invariant2 = _interopRequireDefault(_invariant);
523
524 var _index = __webpack_require__(0);
525
526 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
527
528 class Completion {
529   constructor(value, location, target) {
530     this.value = value;
531     this.target = target;
532     this.location = location;
533   }
534
535 }
536
537 exports.Completion = Completion; // Normal completions are returned just like spec completions
538 /**
539  * Copyright (c) 2017-present, Facebook, Inc.
540  * All rights reserved.
541  *
542  * This source code is licensed under the BSD-style license found in the
543  * LICENSE file in the root directory of this source tree. An additional grant
544  * of patent rights can be found in the PATENTS file in the same directory.
545  */
546
547 class NormalCompletion extends Completion {}
548
549 exports.NormalCompletion = NormalCompletion; // Abrupt completions are thrown as exeptions, to make it a easier
550 // to quickly get to the matching high level construct.
551
552 class AbruptCompletion extends Completion {}
553
554 exports.AbruptCompletion = AbruptCompletion;
555 class ThrowCompletion extends AbruptCompletion {
556   constructor(value, location, nativeStack) {
557     super(value, location);
558     this.nativeStack = nativeStack || new Error().stack;
559   }
560
561 }
562 exports.ThrowCompletion = ThrowCompletion;
563 class ContinueCompletion extends AbruptCompletion {
564   constructor(value, location, target) {
565     super(value, location, target);
566   }
567 }
568
569 exports.ContinueCompletion = ContinueCompletion;
570 class BreakCompletion extends AbruptCompletion {
571   constructor(value, location, target) {
572     super(value, location, target);
573   }
574 }
575
576 exports.BreakCompletion = BreakCompletion;
577 class ReturnCompletion extends AbruptCompletion {
578   constructor(value, location) {
579     super(value, location);
580   }
581 }
582
583 exports.ReturnCompletion = ReturnCompletion;
584 class JoinedAbruptCompletions extends AbruptCompletion {
585   constructor(realm, joinCondition, consequent, consequentEffects, alternate, alternateEffects) {
586     super(realm.intrinsics.empty, consequent.location);
587     this.joinCondition = joinCondition;
588     this.consequent = consequent;
589     this.consequentEffects = consequentEffects;
590     this.alternate = alternate;
591     this.alternateEffects = alternateEffects;
592   }
593
594   containsBreakOrContinue() {
595     if (this.consequent instanceof BreakCompletion || this.consequent instanceof ContinueCompletion) return true;
596     if (this.alternate instanceof BreakCompletion || this.alternate instanceof ContinueCompletion) return true;
597     if (this.consequent instanceof JoinedAbruptCompletions) {
598       if (this.consequent.containsBreakOrContinue()) return true;
599     }
600     if (this.alternate instanceof JoinedAbruptCompletions) {
601       if (this.alternate.containsBreakOrContinue()) return true;
602     }
603     return false;
604   }
605 }
606
607 exports.JoinedAbruptCompletions = JoinedAbruptCompletions; // Possibly normal completions have to be treated like normal completions
608 // and are thus never thrown. At the end of a try block or loop body, however,
609 // action must be taken to deal with the possibly abrupt case of the completion.
610
611 class PossiblyNormalCompletion extends NormalCompletion {
612   constructor(value, joinCondition, consequent, consequentEffects, alternate, alternateEffects, pathConditions, savedPathConditions, savedEffects = undefined) {
613     (0, _invariant2.default)(consequent === consequentEffects[0]);
614     (0, _invariant2.default)(alternate === alternateEffects[0]);
615     (0, _invariant2.default)(consequent instanceof NormalCompletion || consequent instanceof _index.Value || alternate instanceof NormalCompletion || alternate instanceof _index.Value);
616     (0, _invariant2.default)(consequent instanceof AbruptCompletion || alternate instanceof AbruptCompletion);
617     (0, _invariant2.default)(value === consequent || consequent instanceof AbruptCompletion || consequent instanceof NormalCompletion && value === consequent.value);
618     (0, _invariant2.default)(value === alternate || alternate instanceof AbruptCompletion || alternate instanceof NormalCompletion && value === alternate.value);
619     let loc = consequent instanceof AbruptCompletion ? consequent.location : alternate instanceof Completion ? alternate.location : alternate.expressionLocation;
620     super(value, loc);
621     this.joinCondition = joinCondition;
622     this.consequent = consequent;
623     this.consequentEffects = consequentEffects;
624     this.alternate = alternate;
625     this.alternateEffects = alternateEffects;
626     this.savedEffects = savedEffects;
627     this.pathConditions = pathConditions;
628     this.savedPathConditions = savedPathConditions;
629   }
630
631   containsBreakOrContinue() {
632     if (this.consequent instanceof BreakCompletion || this.consequent instanceof ContinueCompletion) return true;
633     if (this.alternate instanceof BreakCompletion || this.alternate instanceof ContinueCompletion) return true;
634     if (this.consequent instanceof JoinedAbruptCompletions || this.consequent instanceof PossiblyNormalCompletion) {
635       if (this.consequent.containsBreakOrContinue()) return true;
636     }
637     if (this.alternate instanceof JoinedAbruptCompletions || this.alternate instanceof PossiblyNormalCompletion) {
638       if (this.alternate.containsBreakOrContinue()) return true;
639     }
640     return false;
641   }
642 }
643 exports.PossiblyNormalCompletion = PossiblyNormalCompletion;
644
645
646 /***/ }),
647 /* 4 */
648 /***/ (function(module, exports, __webpack_require__) {
649
650 "use strict";
651
652
653 exports.__esModule = true;
654 exports.createTypeAnnotationBasedOnTypeof = exports.removeTypeDuplicates = exports.createUnionTypeAnnotation = exports.valueToNode = exports.toBlock = exports.toExpression = exports.toStatement = exports.toBindingIdentifierName = exports.toIdentifier = exports.toKeyAlias = exports.toSequenceExpression = exports.toComputedKey = exports.isNodesEquivalent = exports.isImmutable = exports.isScope = exports.isSpecifierDefault = exports.isVar = exports.isBlockScoped = exports.isLet = exports.isValidIdentifier = exports.isReferenced = exports.isBinding = exports.getOuterBindingIdentifiers = exports.getBindingIdentifiers = exports.TYPES = exports.react = exports.DEPRECATED_KEYS = exports.BUILDER_KEYS = exports.NODE_FIELDS = exports.ALIAS_KEYS = exports.VISITOR_KEYS = exports.NOT_LOCAL_BINDING = exports.BLOCK_SCOPED_SYMBOL = exports.INHERIT_KEYS = exports.UNARY_OPERATORS = exports.STRING_UNARY_OPERATORS = exports.NUMBER_UNARY_OPERATORS = exports.BOOLEAN_UNARY_OPERATORS = exports.BINARY_OPERATORS = exports.NUMBER_BINARY_OPERATORS = exports.BOOLEAN_BINARY_OPERATORS = exports.COMPARISON_BINARY_OPERATORS = exports.EQUALITY_BINARY_OPERATORS = exports.BOOLEAN_NUMBER_BINARY_OPERATORS = exports.UPDATE_OPERATORS = exports.LOGICAL_OPERATORS = exports.COMMENT_KEYS = exports.FOR_INIT_KEYS = exports.FLATTENABLE_KEYS = exports.STATEMENT_OR_BLOCK_KEYS = undefined;
655
656 var _getOwnPropertySymbols = __webpack_require__(793);
657
658 var _getOwnPropertySymbols2 = _interopRequireDefault(_getOwnPropertySymbols);
659
660 var _getIterator2 = __webpack_require__(13);
661
662 var _getIterator3 = _interopRequireDefault(_getIterator2);
663
664 var _keys = __webpack_require__(91);
665
666 var _keys2 = _interopRequireDefault(_keys);
667
668 var _stringify = __webpack_require__(108);
669
670 var _stringify2 = _interopRequireDefault(_stringify);
671
672 var _constants = __webpack_require__(214);
673
674 Object.defineProperty(exports, "STATEMENT_OR_BLOCK_KEYS", {
675   enumerable: true,
676   get: function get() {
677     return _constants.STATEMENT_OR_BLOCK_KEYS;
678   }
679 });
680 Object.defineProperty(exports, "FLATTENABLE_KEYS", {
681   enumerable: true,
682   get: function get() {
683     return _constants.FLATTENABLE_KEYS;
684   }
685 });
686 Object.defineProperty(exports, "FOR_INIT_KEYS", {
687   enumerable: true,
688   get: function get() {
689     return _constants.FOR_INIT_KEYS;
690   }
691 });
692 Object.defineProperty(exports, "COMMENT_KEYS", {
693   enumerable: true,
694   get: function get() {
695     return _constants.COMMENT_KEYS;
696   }
697 });
698 Object.defineProperty(exports, "LOGICAL_OPERATORS", {
699   enumerable: true,
700   get: function get() {
701     return _constants.LOGICAL_OPERATORS;
702   }
703 });
704 Object.defineProperty(exports, "UPDATE_OPERATORS", {
705   enumerable: true,
706   get: function get() {
707     return _constants.UPDATE_OPERATORS;
708   }
709 });
710 Object.defineProperty(exports, "BOOLEAN_NUMBER_BINARY_OPERATORS", {
711   enumerable: true,
712   get: function get() {
713     return _constants.BOOLEAN_NUMBER_BINARY_OPERATORS;
714   }
715 });
716 Object.defineProperty(exports, "EQUALITY_BINARY_OPERATORS", {
717   enumerable: true,
718   get: function get() {
719     return _constants.EQUALITY_BINARY_OPERATORS;
720   }
721 });
722 Object.defineProperty(exports, "COMPARISON_BINARY_OPERATORS", {
723   enumerable: true,
724   get: function get() {
725     return _constants.COMPARISON_BINARY_OPERATORS;
726   }
727 });
728 Object.defineProperty(exports, "BOOLEAN_BINARY_OPERATORS", {
729   enumerable: true,
730   get: function get() {
731     return _constants.BOOLEAN_BINARY_OPERATORS;
732   }
733 });
734 Object.defineProperty(exports, "NUMBER_BINARY_OPERATORS", {
735   enumerable: true,
736   get: function get() {
737     return _constants.NUMBER_BINARY_OPERATORS;
738   }
739 });
740 Object.defineProperty(exports, "BINARY_OPERATORS", {
741   enumerable: true,
742   get: function get() {
743     return _constants.BINARY_OPERATORS;
744   }
745 });
746 Object.defineProperty(exports, "BOOLEAN_UNARY_OPERATORS", {
747   enumerable: true,
748   get: function get() {
749     return _constants.BOOLEAN_UNARY_OPERATORS;
750   }
751 });
752 Object.defineProperty(exports, "NUMBER_UNARY_OPERATORS", {
753   enumerable: true,
754   get: function get() {
755     return _constants.NUMBER_UNARY_OPERATORS;
756   }
757 });
758 Object.defineProperty(exports, "STRING_UNARY_OPERATORS", {
759   enumerable: true,
760   get: function get() {
761     return _constants.STRING_UNARY_OPERATORS;
762   }
763 });
764 Object.defineProperty(exports, "UNARY_OPERATORS", {
765   enumerable: true,
766   get: function get() {
767     return _constants.UNARY_OPERATORS;
768   }
769 });
770 Object.defineProperty(exports, "INHERIT_KEYS", {
771   enumerable: true,
772   get: function get() {
773     return _constants.INHERIT_KEYS;
774   }
775 });
776 Object.defineProperty(exports, "BLOCK_SCOPED_SYMBOL", {
777   enumerable: true,
778   get: function get() {
779     return _constants.BLOCK_SCOPED_SYMBOL;
780   }
781 });
782 Object.defineProperty(exports, "NOT_LOCAL_BINDING", {
783   enumerable: true,
784   get: function get() {
785     return _constants.NOT_LOCAL_BINDING;
786   }
787 });
788 exports.is = is;
789 exports.isType = isType;
790 exports.validate = validate;
791 exports.shallowEqual = shallowEqual;
792 exports.appendToMemberExpression = appendToMemberExpression;
793 exports.prependToMemberExpression = prependToMemberExpression;
794 exports.ensureBlock = ensureBlock;
795 exports.clone = clone;
796 exports.cloneWithoutLoc = cloneWithoutLoc;
797 exports.cloneDeep = cloneDeep;
798 exports.buildMatchMemberExpression = buildMatchMemberExpression;
799 exports.removeComments = removeComments;
800 exports.inheritsComments = inheritsComments;
801 exports.inheritTrailingComments = inheritTrailingComments;
802 exports.inheritLeadingComments = inheritLeadingComments;
803 exports.inheritInnerComments = inheritInnerComments;
804 exports.inherits = inherits;
805 exports.assertNode = assertNode;
806 exports.isNode = isNode;
807 exports.traverseFast = traverseFast;
808 exports.removeProperties = removeProperties;
809 exports.removePropertiesDeep = removePropertiesDeep;
810
811 var _retrievers = __webpack_require__(347);
812
813 Object.defineProperty(exports, "getBindingIdentifiers", {
814   enumerable: true,
815   get: function get() {
816     return _retrievers.getBindingIdentifiers;
817   }
818 });
819 Object.defineProperty(exports, "getOuterBindingIdentifiers", {
820   enumerable: true,
821   get: function get() {
822     return _retrievers.getOuterBindingIdentifiers;
823   }
824 });
825
826 var _validators = __webpack_require__(797);
827
828 Object.defineProperty(exports, "isBinding", {
829   enumerable: true,
830   get: function get() {
831     return _validators.isBinding;
832   }
833 });
834 Object.defineProperty(exports, "isReferenced", {
835   enumerable: true,
836   get: function get() {
837     return _validators.isReferenced;
838   }
839 });
840 Object.defineProperty(exports, "isValidIdentifier", {
841   enumerable: true,
842   get: function get() {
843     return _validators.isValidIdentifier;
844   }
845 });
846 Object.defineProperty(exports, "isLet", {
847   enumerable: true,
848   get: function get() {
849     return _validators.isLet;
850   }
851 });
852 Object.defineProperty(exports, "isBlockScoped", {
853   enumerable: true,
854   get: function get() {
855     return _validators.isBlockScoped;
856   }
857 });
858 Object.defineProperty(exports, "isVar", {
859   enumerable: true,
860   get: function get() {
861     return _validators.isVar;
862   }
863 });
864 Object.defineProperty(exports, "isSpecifierDefault", {
865   enumerable: true,
866   get: function get() {
867     return _validators.isSpecifierDefault;
868   }
869 });
870 Object.defineProperty(exports, "isScope", {
871   enumerable: true,
872   get: function get() {
873     return _validators.isScope;
874   }
875 });
876 Object.defineProperty(exports, "isImmutable", {
877   enumerable: true,
878   get: function get() {
879     return _validators.isImmutable;
880   }
881 });
882 Object.defineProperty(exports, "isNodesEquivalent", {
883   enumerable: true,
884   get: function get() {
885     return _validators.isNodesEquivalent;
886   }
887 });
888
889 var _converters = __webpack_require__(800);
890
891 Object.defineProperty(exports, "toComputedKey", {
892   enumerable: true,
893   get: function get() {
894     return _converters.toComputedKey;
895   }
896 });
897 Object.defineProperty(exports, "toSequenceExpression", {
898   enumerable: true,
899   get: function get() {
900     return _converters.toSequenceExpression;
901   }
902 });
903 Object.defineProperty(exports, "toKeyAlias", {
904   enumerable: true,
905   get: function get() {
906     return _converters.toKeyAlias;
907   }
908 });
909 Object.defineProperty(exports, "toIdentifier", {
910   enumerable: true,
911   get: function get() {
912     return _converters.toIdentifier;
913   }
914 });
915 Object.defineProperty(exports, "toBindingIdentifierName", {
916   enumerable: true,
917   get: function get() {
918     return _converters.toBindingIdentifierName;
919   }
920 });
921 Object.defineProperty(exports, "toStatement", {
922   enumerable: true,
923   get: function get() {
924     return _converters.toStatement;
925   }
926 });
927 Object.defineProperty(exports, "toExpression", {
928   enumerable: true,
929   get: function get() {
930     return _converters.toExpression;
931   }
932 });
933 Object.defineProperty(exports, "toBlock", {
934   enumerable: true,
935   get: function get() {
936     return _converters.toBlock;
937   }
938 });
939 Object.defineProperty(exports, "valueToNode", {
940   enumerable: true,
941   get: function get() {
942     return _converters.valueToNode;
943   }
944 });
945
946 var _flow = __webpack_require__(807);
947
948 Object.defineProperty(exports, "createUnionTypeAnnotation", {
949   enumerable: true,
950   get: function get() {
951     return _flow.createUnionTypeAnnotation;
952   }
953 });
954 Object.defineProperty(exports, "removeTypeDuplicates", {
955   enumerable: true,
956   get: function get() {
957     return _flow.removeTypeDuplicates;
958   }
959 });
960 Object.defineProperty(exports, "createTypeAnnotationBasedOnTypeof", {
961   enumerable: true,
962   get: function get() {
963     return _flow.createTypeAnnotationBasedOnTypeof;
964   }
965 });
966
967 var _toFastProperties = __webpack_require__(808);
968
969 var _toFastProperties2 = _interopRequireDefault(_toFastProperties);
970
971 var _clone = __webpack_require__(350);
972
973 var _clone2 = _interopRequireDefault(_clone);
974
975 var _uniq = __webpack_require__(831);
976
977 var _uniq2 = _interopRequireDefault(_uniq);
978
979 __webpack_require__(839);
980
981 var _definitions = __webpack_require__(68);
982
983 var _react2 = __webpack_require__(846);
984
985 var _react = _interopRequireWildcard(_react2);
986
987 function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
988
989 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
990
991 var t = exports;
992
993 function registerType(type) {
994   var is = t["is" + type];
995   if (!is) {
996     is = t["is" + type] = function (node, opts) {
997       return t.is(type, node, opts);
998     };
999   }
1000
1001   t["assert" + type] = function (node, opts) {
1002     opts = opts || {};
1003     if (!is(node, opts)) {
1004       throw new Error("Expected type " + (0, _stringify2.default)(type) + " with option " + (0, _stringify2.default)(opts));
1005     }
1006   };
1007 }
1008
1009 exports.VISITOR_KEYS = _definitions.VISITOR_KEYS;
1010 exports.ALIAS_KEYS = _definitions.ALIAS_KEYS;
1011 exports.NODE_FIELDS = _definitions.NODE_FIELDS;
1012 exports.BUILDER_KEYS = _definitions.BUILDER_KEYS;
1013 exports.DEPRECATED_KEYS = _definitions.DEPRECATED_KEYS;
1014 exports.react = _react;
1015
1016
1017 for (var type in t.VISITOR_KEYS) {
1018   registerType(type);
1019 }
1020
1021 t.FLIPPED_ALIAS_KEYS = {};
1022
1023 (0, _keys2.default)(t.ALIAS_KEYS).forEach(function (type) {
1024   t.ALIAS_KEYS[type].forEach(function (alias) {
1025     var types = t.FLIPPED_ALIAS_KEYS[alias] = t.FLIPPED_ALIAS_KEYS[alias] || [];
1026     types.push(type);
1027   });
1028 });
1029
1030 (0, _keys2.default)(t.FLIPPED_ALIAS_KEYS).forEach(function (type) {
1031   t[type.toUpperCase() + "_TYPES"] = t.FLIPPED_ALIAS_KEYS[type];
1032   registerType(type);
1033 });
1034
1035 var TYPES = exports.TYPES = (0, _keys2.default)(t.VISITOR_KEYS).concat((0, _keys2.default)(t.FLIPPED_ALIAS_KEYS)).concat((0, _keys2.default)(t.DEPRECATED_KEYS));
1036
1037 function is(type, node, opts) {
1038   if (!node) return false;
1039
1040   var matches = isType(node.type, type);
1041   if (!matches) return false;
1042
1043   if (typeof opts === "undefined") {
1044     return true;
1045   } else {
1046     return t.shallowEqual(node, opts);
1047   }
1048 }
1049
1050 function isType(nodeType, targetType) {
1051   if (nodeType === targetType) return true;
1052
1053   if (t.ALIAS_KEYS[targetType]) return false;
1054
1055   var aliases = t.FLIPPED_ALIAS_KEYS[targetType];
1056   if (aliases) {
1057     if (aliases[0] === nodeType) return true;
1058
1059     for (var _iterator = aliases, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : (0, _getIterator3.default)(_iterator);;) {
1060       var _ref;
1061
1062       if (_isArray) {
1063         if (_i >= _iterator.length) break;
1064         _ref = _iterator[_i++];
1065       } else {
1066         _i = _iterator.next();
1067         if (_i.done) break;
1068         _ref = _i.value;
1069       }
1070
1071       var alias = _ref;
1072
1073       if (nodeType === alias) return true;
1074     }
1075   }
1076
1077   return false;
1078 }
1079
1080 (0, _keys2.default)(t.BUILDER_KEYS).forEach(function (type) {
1081   var keys = t.BUILDER_KEYS[type];
1082
1083   function builder() {
1084     if (arguments.length > keys.length) {
1085       throw new Error("t." + type + ": Too many arguments passed. Received " + arguments.length + " but can receive " + ("no more than " + keys.length));
1086     }
1087
1088     var node = {};
1089     node.type = type;
1090
1091     var i = 0;
1092
1093     for (var _iterator2 = keys, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : (0, _getIterator3.default)(_iterator2);;) {
1094       var _ref2;
1095
1096       if (_isArray2) {
1097         if (_i2 >= _iterator2.length) break;
1098         _ref2 = _iterator2[_i2++];
1099       } else {
1100         _i2 = _iterator2.next();
1101         if (_i2.done) break;
1102         _ref2 = _i2.value;
1103       }
1104
1105       var _key = _ref2;
1106
1107       var field = t.NODE_FIELDS[type][_key];
1108
1109       var arg = arguments[i++];
1110       if (arg === undefined) arg = (0, _clone2.default)(field.default);
1111
1112       node[_key] = arg;
1113     }
1114
1115     for (var key in node) {
1116       validate(node, key, node[key]);
1117     }
1118
1119     return node;
1120   }
1121
1122   t[type] = builder;
1123   t[type[0].toLowerCase() + type.slice(1)] = builder;
1124 });
1125
1126 var _loop = function _loop(_type) {
1127   var newType = t.DEPRECATED_KEYS[_type];
1128
1129   function proxy(fn) {
1130     return function () {
1131       console.trace("The node type " + _type + " has been renamed to " + newType);
1132       return fn.apply(this, arguments);
1133     };
1134   }
1135
1136   t[_type] = t[_type[0].toLowerCase() + _type.slice(1)] = proxy(t[newType]);
1137   t["is" + _type] = proxy(t["is" + newType]);
1138   t["assert" + _type] = proxy(t["assert" + newType]);
1139 };
1140
1141 for (var _type in t.DEPRECATED_KEYS) {
1142   _loop(_type);
1143 }
1144
1145 function validate(node, key, val) {
1146   if (!node) return;
1147
1148   var fields = t.NODE_FIELDS[node.type];
1149   if (!fields) return;
1150
1151   var field = fields[key];
1152   if (!field || !field.validate) return;
1153   if (field.optional && val == null) return;
1154
1155   field.validate(node, key, val);
1156 }
1157
1158 function shallowEqual(actual, expected) {
1159   var keys = (0, _keys2.default)(expected);
1160
1161   for (var _iterator3 = keys, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : (0, _getIterator3.default)(_iterator3);;) {
1162     var _ref3;
1163
1164     if (_isArray3) {
1165       if (_i3 >= _iterator3.length) break;
1166       _ref3 = _iterator3[_i3++];
1167     } else {
1168       _i3 = _iterator3.next();
1169       if (_i3.done) break;
1170       _ref3 = _i3.value;
1171     }
1172
1173     var key = _ref3;
1174
1175     if (actual[key] !== expected[key]) {
1176       return false;
1177     }
1178   }
1179
1180   return true;
1181 }
1182
1183 function appendToMemberExpression(member, append, computed) {
1184   member.object = t.memberExpression(member.object, member.property, member.computed);
1185   member.property = append;
1186   member.computed = !!computed;
1187   return member;
1188 }
1189
1190 function prependToMemberExpression(member, prepend) {
1191   member.object = t.memberExpression(prepend, member.object);
1192   return member;
1193 }
1194
1195 function ensureBlock(node) {
1196   var key = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "body";
1197
1198   return node[key] = t.toBlock(node[key], node);
1199 }
1200
1201 function clone(node) {
1202   if (!node) return node;
1203   var newNode = {};
1204   for (var key in node) {
1205     if (key[0] === "_") continue;
1206     newNode[key] = node[key];
1207   }
1208   return newNode;
1209 }
1210
1211 function cloneWithoutLoc(node) {
1212   var newNode = clone(node);
1213   delete newNode.loc;
1214   return newNode;
1215 }
1216
1217 function cloneDeep(node) {
1218   if (!node) return node;
1219   var newNode = {};
1220
1221   for (var key in node) {
1222     if (key[0] === "_") continue;
1223
1224     var val = node[key];
1225
1226     if (val) {
1227       if (val.type) {
1228         val = t.cloneDeep(val);
1229       } else if (Array.isArray(val)) {
1230         val = val.map(t.cloneDeep);
1231       }
1232     }
1233
1234     newNode[key] = val;
1235   }
1236
1237   return newNode;
1238 }
1239
1240 function buildMatchMemberExpression(match, allowPartial) {
1241   var parts = match.split(".");
1242
1243   return function (member) {
1244     if (!t.isMemberExpression(member)) return false;
1245
1246     var search = [member];
1247     var i = 0;
1248
1249     while (search.length) {
1250       var node = search.shift();
1251
1252       if (allowPartial && i === parts.length) {
1253         return true;
1254       }
1255
1256       if (t.isIdentifier(node)) {
1257         if (parts[i] !== node.name) return false;
1258       } else if (t.isStringLiteral(node)) {
1259         if (parts[i] !== node.value) return false;
1260       } else if (t.isMemberExpression(node)) {
1261         if (node.computed && !t.isStringLiteral(node.property)) {
1262           return false;
1263         } else {
1264           search.push(node.object);
1265           search.push(node.property);
1266           continue;
1267         }
1268       } else {
1269         return false;
1270       }
1271
1272       if (++i > parts.length) {
1273         return false;
1274       }
1275     }
1276
1277     return true;
1278   };
1279 }
1280
1281 function removeComments(node) {
1282   for (var _iterator4 = t.COMMENT_KEYS, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : (0, _getIterator3.default)(_iterator4);;) {
1283     var _ref4;
1284
1285     if (_isArray4) {
1286       if (_i4 >= _iterator4.length) break;
1287       _ref4 = _iterator4[_i4++];
1288     } else {
1289       _i4 = _iterator4.next();
1290       if (_i4.done) break;
1291       _ref4 = _i4.value;
1292     }
1293
1294     var key = _ref4;
1295
1296     delete node[key];
1297   }
1298   return node;
1299 }
1300
1301 function inheritsComments(child, parent) {
1302   inheritTrailingComments(child, parent);
1303   inheritLeadingComments(child, parent);
1304   inheritInnerComments(child, parent);
1305   return child;
1306 }
1307
1308 function inheritTrailingComments(child, parent) {
1309   _inheritComments("trailingComments", child, parent);
1310 }
1311
1312 function inheritLeadingComments(child, parent) {
1313   _inheritComments("leadingComments", child, parent);
1314 }
1315
1316 function inheritInnerComments(child, parent) {
1317   _inheritComments("innerComments", child, parent);
1318 }
1319
1320 function _inheritComments(key, child, parent) {
1321   if (child && parent) {
1322     child[key] = (0, _uniq2.default)([].concat(child[key], parent[key]).filter(Boolean));
1323   }
1324 }
1325
1326 function inherits(child, parent) {
1327   if (!child || !parent) return child;
1328
1329   for (var _iterator5 = t.INHERIT_KEYS.optional, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : (0, _getIterator3.default)(_iterator5);;) {
1330     var _ref5;
1331
1332     if (_isArray5) {
1333       if (_i5 >= _iterator5.length) break;
1334       _ref5 = _iterator5[_i5++];
1335     } else {
1336       _i5 = _iterator5.next();
1337       if (_i5.done) break;
1338       _ref5 = _i5.value;
1339     }
1340
1341     var _key2 = _ref5;
1342
1343     if (child[_key2] == null) {
1344       child[_key2] = parent[_key2];
1345     }
1346   }
1347
1348   for (var key in parent) {
1349     if (key[0] === "_") child[key] = parent[key];
1350   }
1351
1352   for (var _iterator6 = t.INHERIT_KEYS.force, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : (0, _getIterator3.default)(_iterator6);;) {
1353     var _ref6;
1354
1355     if (_isArray6) {
1356       if (_i6 >= _iterator6.length) break;
1357       _ref6 = _iterator6[_i6++];
1358     } else {
1359       _i6 = _iterator6.next();
1360       if (_i6.done) break;
1361       _ref6 = _i6.value;
1362     }
1363
1364     var _key3 = _ref6;
1365
1366     child[_key3] = parent[_key3];
1367   }
1368
1369   t.inheritsComments(child, parent);
1370
1371   return child;
1372 }
1373
1374 function assertNode(node) {
1375   if (!isNode(node)) {
1376     throw new TypeError("Not a valid node " + (node && node.type));
1377   }
1378 }
1379
1380 function isNode(node) {
1381   return !!(node && _definitions.VISITOR_KEYS[node.type]);
1382 }
1383
1384 (0, _toFastProperties2.default)(t);
1385 (0, _toFastProperties2.default)(t.VISITOR_KEYS);
1386
1387 function traverseFast(node, enter, opts) {
1388   if (!node) return;
1389
1390   var keys = t.VISITOR_KEYS[node.type];
1391   if (!keys) return;
1392
1393   opts = opts || {};
1394   enter(node, opts);
1395
1396   for (var _iterator7 = keys, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : (0, _getIterator3.default)(_iterator7);;) {
1397     var _ref7;
1398
1399     if (_isArray7) {
1400       if (_i7 >= _iterator7.length) break;
1401       _ref7 = _iterator7[_i7++];
1402     } else {
1403       _i7 = _iterator7.next();
1404       if (_i7.done) break;
1405       _ref7 = _i7.value;
1406     }
1407
1408     var key = _ref7;
1409
1410     var subNode = node[key];
1411
1412     if (Array.isArray(subNode)) {
1413       for (var _iterator8 = subNode, _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : (0, _getIterator3.default)(_iterator8);;) {
1414         var _ref8;
1415
1416         if (_isArray8) {
1417           if (_i8 >= _iterator8.length) break;
1418           _ref8 = _iterator8[_i8++];
1419         } else {
1420           _i8 = _iterator8.next();
1421           if (_i8.done) break;
1422           _ref8 = _i8.value;
1423         }
1424
1425         var _node = _ref8;
1426
1427         traverseFast(_node, enter, opts);
1428       }
1429     } else {
1430       traverseFast(subNode, enter, opts);
1431     }
1432   }
1433 }
1434
1435 var CLEAR_KEYS = ["tokens", "start", "end", "loc", "raw", "rawValue"];
1436
1437 var CLEAR_KEYS_PLUS_COMMENTS = t.COMMENT_KEYS.concat(["comments"]).concat(CLEAR_KEYS);
1438
1439 function removeProperties(node, opts) {
1440   opts = opts || {};
1441   var map = opts.preserveComments ? CLEAR_KEYS : CLEAR_KEYS_PLUS_COMMENTS;
1442   for (var _iterator9 = map, _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : (0, _getIterator3.default)(_iterator9);;) {
1443     var _ref9;
1444
1445     if (_isArray9) {
1446       if (_i9 >= _iterator9.length) break;
1447       _ref9 = _iterator9[_i9++];
1448     } else {
1449       _i9 = _iterator9.next();
1450       if (_i9.done) break;
1451       _ref9 = _i9.value;
1452     }
1453
1454     var _key4 = _ref9;
1455
1456     if (node[_key4] != null) node[_key4] = undefined;
1457   }
1458
1459   for (var key in node) {
1460     if (key[0] === "_" && node[key] != null) node[key] = undefined;
1461   }
1462
1463   var syms = (0, _getOwnPropertySymbols2.default)(node);
1464   for (var _iterator10 = syms, _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : (0, _getIterator3.default)(_iterator10);;) {
1465     var _ref10;
1466
1467     if (_isArray10) {
1468       if (_i10 >= _iterator10.length) break;
1469       _ref10 = _iterator10[_i10++];
1470     } else {
1471       _i10 = _iterator10.next();
1472       if (_i10.done) break;
1473       _ref10 = _i10.value;
1474     }
1475
1476     var sym = _ref10;
1477
1478     node[sym] = null;
1479   }
1480 }
1481
1482 function removePropertiesDeep(tree, opts) {
1483   traverseFast(tree, removeProperties, opts);
1484   return tree;
1485 }
1486
1487 /***/ }),
1488 /* 5 */
1489 /***/ (function(module, exports, __webpack_require__) {
1490
1491 "use strict";
1492
1493
1494 Object.defineProperty(exports, "__esModule", {
1495   value: true
1496 });
1497
1498 var _abstract = __webpack_require__(19);
1499
1500 Object.keys(_abstract).forEach(function (key) {
1501   if (key === "default" || key === "__esModule") return;
1502   Object.defineProperty(exports, key, {
1503     enumerable: true,
1504     get: function () {
1505       return _abstract[key];
1506     }
1507   });
1508 });
1509
1510 var _call = __webpack_require__(20);
1511
1512 Object.keys(_call).forEach(function (key) {
1513   if (key === "default" || key === "__esModule") return;
1514   Object.defineProperty(exports, key, {
1515     enumerable: true,
1516     get: function () {
1517       return _call[key];
1518     }
1519   });
1520 });
1521
1522 var _construct = __webpack_require__(35);
1523
1524 Object.keys(_construct).forEach(function (key) {
1525   if (key === "default" || key === "__esModule") return;
1526   Object.defineProperty(exports, key, {
1527     enumerable: true,
1528     get: function () {
1529       return _construct[key];
1530     }
1531   });
1532 });
1533
1534 var _date = __webpack_require__(358);
1535
1536 Object.keys(_date).forEach(function (key) {
1537   if (key === "default" || key === "__esModule") return;
1538   Object.defineProperty(exports, key, {
1539     enumerable: true,
1540     get: function () {
1541       return _date[key];
1542     }
1543   });
1544 });
1545
1546 var _descriptor = __webpack_require__(859);
1547
1548 Object.keys(_descriptor).forEach(function (key) {
1549   if (key === "default" || key === "__esModule") return;
1550   Object.defineProperty(exports, key, {
1551     enumerable: true,
1552     get: function () {
1553       return _descriptor[key];
1554     }
1555   });
1556 });
1557
1558 var _get = __webpack_require__(11);
1559
1560 Object.keys(_get).forEach(function (key) {
1561   if (key === "default" || key === "__esModule") return;
1562   Object.defineProperty(exports, key, {
1563     enumerable: true,
1564     get: function () {
1565       return _get[key];
1566     }
1567   });
1568 });
1569
1570 var _has = __webpack_require__(27);
1571
1572 Object.keys(_has).forEach(function (key) {
1573   if (key === "default" || key === "__esModule") return;
1574   Object.defineProperty(exports, key, {
1575     enumerable: true,
1576     get: function () {
1577       return _has[key];
1578     }
1579   });
1580 });
1581
1582 var _hash = __webpack_require__(860);
1583
1584 Object.keys(_hash).forEach(function (key) {
1585   if (key === "default" || key === "__esModule") return;
1586   Object.defineProperty(exports, key, {
1587     enumerable: true,
1588     get: function () {
1589       return _hash[key];
1590     }
1591   });
1592 });
1593
1594 var _integrity = __webpack_require__(356);
1595
1596 Object.keys(_integrity).forEach(function (key) {
1597   if (key === "default" || key === "__esModule") return;
1598   Object.defineProperty(exports, key, {
1599     enumerable: true,
1600     get: function () {
1601       return _integrity[key];
1602     }
1603   });
1604 });
1605
1606 var _is = __webpack_require__(9);
1607
1608 Object.keys(_is).forEach(function (key) {
1609   if (key === "default" || key === "__esModule") return;
1610   Object.defineProperty(exports, key, {
1611     enumerable: true,
1612     get: function () {
1613       return _is[key];
1614     }
1615   });
1616 });
1617
1618 var _iterator = __webpack_require__(76);
1619
1620 Object.keys(_iterator).forEach(function (key) {
1621   if (key === "default" || key === "__esModule") return;
1622   Object.defineProperty(exports, key, {
1623     enumerable: true,
1624     get: function () {
1625       return _iterator[key];
1626     }
1627   });
1628 });
1629
1630 var _own = __webpack_require__(359);
1631
1632 Object.keys(_own).forEach(function (key) {
1633   if (key === "default" || key === "__esModule") return;
1634   Object.defineProperty(exports, key, {
1635     enumerable: true,
1636     get: function () {
1637       return _own[key];
1638     }
1639   });
1640 });
1641
1642 var _destructuring = __webpack_require__(861);
1643
1644 Object.keys(_destructuring).forEach(function (key) {
1645   if (key === "default" || key === "__esModule") return;
1646   Object.defineProperty(exports, key, {
1647     enumerable: true,
1648     get: function () {
1649       return _destructuring[key];
1650     }
1651   });
1652 });
1653
1654 var _regexp = __webpack_require__(159);
1655
1656 Object.keys(_regexp).forEach(function (key) {
1657   if (key === "default" || key === "__esModule") return;
1658   Object.defineProperty(exports, key, {
1659     enumerable: true,
1660     get: function () {
1661       return _regexp[key];
1662     }
1663   });
1664 });
1665
1666 var _promise = __webpack_require__(220);
1667
1668 Object.keys(_promise).forEach(function (key) {
1669   if (key === "default" || key === "__esModule") return;
1670   Object.defineProperty(exports, key, {
1671     enumerable: true,
1672     get: function () {
1673       return _promise[key];
1674     }
1675   });
1676 });
1677
1678 var _arraybuffer = __webpack_require__(92);
1679
1680 Object.keys(_arraybuffer).forEach(function (key) {
1681   if (key === "default" || key === "__esModule") return;
1682   Object.defineProperty(exports, key, {
1683     enumerable: true,
1684     get: function () {
1685       return _arraybuffer[key];
1686     }
1687   });
1688 });
1689
1690
1691 /***/ }),
1692 /* 6 */
1693 /***/ (function(module, exports, __webpack_require__) {
1694
1695 "use strict";
1696
1697
1698 Object.defineProperty(exports, "__esModule", {
1699   value: true
1700 });
1701
1702
1703 // This is the error format used to report errors to the caller-supplied
1704 // error-handler
1705 /**
1706  * Copyright (c) 2017-present, Facebook, Inc.
1707  * All rights reserved.
1708  *
1709  * This source code is licensed under the BSD-style license found in the
1710  * LICENSE file in the root directory of this source tree. An additional grant
1711  * of patent rights can be found in the PATENTS file in the same directory.
1712  */
1713
1714 class CompilerDiagnostic extends Error {
1715   constructor(message, location, errorCode, severity) {
1716     super(message);
1717
1718     this.location = location;
1719     this.severity = severity;
1720     this.errorCode = errorCode;
1721   }
1722
1723 }
1724
1725 exports.CompilerDiagnostic = CompilerDiagnostic; // This error is thrown to exit Prepack when an ErrorHandler returns 'FatalError'
1726 // This should just be a class but Babel classes doesn't work with
1727 // built-in super classes.
1728
1729 class FatalError extends Error {
1730   constructor(message) {
1731     super(message || "A fatal error occurred while prepacking.");
1732   }
1733 }
1734
1735 exports.FatalError = FatalError;
1736
1737
1738 /***/ }),
1739 /* 7 */
1740 /***/ (function(module, exports, __webpack_require__) {
1741
1742 "use strict";
1743
1744
1745 Object.defineProperty(exports, "__esModule", {
1746   value: true
1747 });
1748 exports.Realm = exports.ExecutionContext = exports.Tracer = undefined;
1749 exports.construct_empty_effects = construct_empty_effects;
1750
1751 var _errors = __webpack_require__(6);
1752
1753 var _index = __webpack_require__(0);
1754
1755 var _environment = __webpack_require__(8);
1756
1757 var _index2 = __webpack_require__(5);
1758
1759 var _completions = __webpack_require__(3);
1760
1761 var _invariant = __webpack_require__(1);
1762
1763 var _invariant2 = _interopRequireDefault(_invariant);
1764
1765 var _seedrandom = __webpack_require__(371);
1766
1767 var _seedrandom2 = _interopRequireDefault(_seedrandom);
1768
1769 var _generator = __webpack_require__(23);
1770
1771 var _internalizer = __webpack_require__(93);
1772
1773 var _singletons = __webpack_require__(2);
1774
1775 var _babelTypes = __webpack_require__(4);
1776
1777 var t = _interopRequireWildcard(_babelTypes);
1778
1779 function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
1780
1781 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
1782
1783 /**
1784  * Copyright (c) 2017-present, Facebook, Inc.
1785  * All rights reserved.
1786  *
1787  * This source code is licensed under the BSD-style license found in the
1788  * LICENSE file in the root directory of this source tree. An additional grant
1789  * of patent rights can be found in the PATENTS file in the same directory.
1790  */
1791
1792 class Tracer {
1793   beginEvaluateForEffects(state) {}
1794   endEvaluateForEffects(state, effects) {}
1795   detourCall(F, thisArgument, argumentsList, newTarget, performCall) {}
1796   beforeCall(F, thisArgument, argumentsList, newTarget) {}
1797   afterCall(F, thisArgument, argumentsList, newTarget, result) {}
1798 }
1799
1800 exports.Tracer = Tracer;
1801 class ExecutionContext {
1802
1803   setCaller(context) {
1804     this.caller = context;
1805   }
1806
1807   setFunction(F) {
1808     if (F instanceof _index.ECMAScriptSourceFunctionValue) this.isStrict = F.$Strict;
1809     this.function = F;
1810   }
1811
1812   setLocation(loc) {
1813     if (!loc) return;
1814     this.loc = loc;
1815   }
1816
1817   setRealm(realm) {
1818     this.realm = realm;
1819   }
1820
1821   /*
1822    Read-only envs disallow:
1823    - creating bindings in their scope
1824    - creating or modifying objects when they are current running context
1825   */
1826   setReadOnly(value) {
1827     let oldReadOnly = this.isReadOnly;
1828     if (this.variableEnvironment) this.variableEnvironment.environmentRecord.isReadOnly = value;
1829     if (this.lexicalEnvironment) this.lexicalEnvironment.environmentRecord.isReadOnly = value;
1830     this.isReadOnly = value;
1831     return oldReadOnly;
1832   }
1833
1834   suspend() {
1835     // TODO #712: suspend
1836   }
1837
1838   resume() {
1839     // TODO #712: resume
1840     return this.realm.intrinsics.undefined;
1841   }
1842 }
1843
1844 exports.ExecutionContext = ExecutionContext;
1845 function construct_empty_effects(realm) {
1846   return [realm.intrinsics.empty, new _generator.Generator(realm), new Map(), new Map(), new Set()];
1847 }
1848
1849 class Realm {
1850   constructor(opts) {
1851     this.contextStack = [];
1852     this.MOBILE_JSC_VERSION = "jsc-600-1-4-17";
1853     this.objectCount = 0;
1854     this.symbolCount = 867501803871088;
1855     this.functionBodyUniqueTagSeed = 1;
1856     this.nextGeneratorId = 0;
1857
1858     this.isReadOnly = false;
1859     this.useAbstractInterpretation = !!opts.serialize || !!opts.residual || !!opts.check;
1860     this.trackLeaks = !!opts.abstractEffectsInAdditionalFunctions;
1861     this.ignoreLeakLogic = false;
1862     this.isInPureTryStatement = false;
1863     if (opts.mathRandomSeed !== undefined) {
1864       this.mathRandomGenerator = (0, _seedrandom2.default)(opts.mathRandomSeed);
1865     }
1866     this.strictlyMonotonicDateNow = !!opts.strictlyMonotonicDateNow;
1867
1868     this.timeout = opts.timeout;
1869     if (this.timeout) {
1870       // We'll call Date.now for every this.timeoutCounterThreshold'th AST node.
1871       // The threshold is there to reduce the cost of the surprisingly expensive Date.now call.
1872       this.timeoutCounter = this.timeoutCounterThreshold = 1024;
1873     }
1874
1875     this.start = Date.now();
1876     this.compatibility = opts.compatibility || "browser";
1877     this.maxStackDepth = opts.maxStackDepth || 225;
1878     this.omitInvariants = !!opts.omitInvariants;
1879     this.emitConcreteModel = !!opts.emitConcreteModel;
1880
1881     this.$TemplateMap = [];
1882
1883     if (this.useAbstractInterpretation) {
1884       this.preludeGenerator = new _generator.PreludeGenerator(opts.debugNames, opts.uniqueSuffix);
1885       this.pathConditions = [];
1886       _index.ObjectValue.setupTrackedPropertyAccessors(_index.ObjectValue.trackedPropertyNames);
1887       _index.ObjectValue.setupTrackedPropertyAccessors(_index.NativeFunctionValue.trackedPropertyNames);
1888       _index.ObjectValue.setupTrackedPropertyAccessors(_index.ProxyValue.trackedPropertyNames);
1889     }
1890
1891     this.tracers = [];
1892
1893     // These get initialized in construct_realm to avoid the dependency
1894     this.intrinsics = {};
1895     this.$GlobalObject = {};
1896     this.evaluators = Object.create(null);
1897     this.partialEvaluators = Object.create(null);
1898     this.$GlobalEnv = undefined;
1899
1900     this.react = {
1901       abstractHints: new WeakMap(),
1902       classComponentMetadata: new Map(),
1903       currentOwner: undefined,
1904       enabled: opts.reactEnabled || false,
1905       output: opts.reactOutput || "create-element",
1906       hoistableFunctions: new WeakMap(),
1907       hoistableReactElements: new WeakMap(),
1908       reactElements: new WeakSet(),
1909       symbols: new Map()
1910     };
1911
1912     this.stripFlow = opts.stripFlow || false;
1913
1914     this.fbLibraries = {
1915       other: new Map(),
1916       react: undefined,
1917       reactRelay: undefined
1918     };
1919
1920     this.errorHandler = opts.errorHandler;
1921
1922     this.globalSymbolRegistry = [];
1923     this.activeLexicalEnvironments = new Set();
1924     this._abstractValuesDefined = new Set(); // A set of nameStrings to ensure abstract values have unique names
1925     this.debugNames = opts.debugNames;
1926   } // TODO(1264): Remove this once we implement proper exception handling in abstract calls.
1927
1928
1929   // A list of abstract conditions that are known to be true in the current execution path.
1930   // For example, the abstract condition of an if statement is known to be true inside its true branch.
1931
1932   // Unique tag for identifying function body ast node. It is neeeded
1933   // instead of ast node itself because we may perform ast tree deep clone
1934   // during serialization which changes the ast identity.
1935
1936
1937   // to force flow to type the annotations
1938   isCompatibleWith(compatibility) {
1939     return compatibility === this.compatibility;
1940   }
1941
1942   // Checks if there is a let binding at global scope with the given name
1943   // returning it if so
1944   getGlobalLetBinding(key) {
1945     let globrec = this.$GlobalEnv.environmentRecord;
1946     // GlobalEnv should have a GlobalEnvironmentRecord
1947     (0, _invariant2.default)(globrec instanceof _environment.GlobalEnvironmentRecord);
1948     let dclrec = globrec.$DeclarativeRecord;
1949
1950     try {
1951       return dclrec.HasBinding(key) ? dclrec.GetBindingValue(key, false) : undefined;
1952     } catch (e) {
1953       if (e instanceof _errors.FatalError) return undefined;
1954       throw e;
1955     }
1956   }
1957
1958   /*
1959    Read only realms disallow:
1960    - using console.log
1961    - creating bindings in any existing scopes
1962    - modifying object properties in any existing scopes
1963    Setting a realm read-only sets all contained environments to read-only, but
1964    all new environments (e.g. new ExecutionContexts) will be writeable.
1965    */
1966   setReadOnly(readOnlyValue) {
1967     this.isReadOnly = readOnlyValue;
1968     this.$GlobalEnv.environmentRecord.isReadOnly = readOnlyValue;
1969     this.contextStack.forEach(ctx => {
1970       ctx.setReadOnly(readOnlyValue);
1971     });
1972   }
1973
1974   testTimeout() {
1975     let timeout = this.timeout;
1976     if (timeout && ! --this.timeoutCounter) {
1977       this.timeoutCounter = this.timeoutCounterThreshold;
1978       let total = Date.now() - this.start;
1979       if (total > timeout) {
1980         throw new _errors.FatalError("Timed out");
1981       }
1982     }
1983   }
1984
1985   hasRunningContext() {
1986     return this.contextStack.length !== 0;
1987   }
1988
1989   getRunningContext() {
1990     let context = this.contextStack[this.contextStack.length - 1];
1991     (0, _invariant2.default)(context, "There's no running execution context");
1992     return context;
1993   }
1994
1995   clearBlockBindings(modifiedBindings, environmentRecord) {
1996     if (modifiedBindings === undefined) return;
1997     for (let b of modifiedBindings.keys()) if (environmentRecord.bindings[b.name] && environmentRecord.bindings[b.name] === b) modifiedBindings.delete(b);
1998   }
1999
2000   clearBlockBindingsFromCompletion(completion, environmentRecord) {
2001     if (completion instanceof _completions.PossiblyNormalCompletion) {
2002       this.clearBlockBindings(completion.alternateEffects[2], environmentRecord);
2003       this.clearBlockBindings(completion.consequentEffects[2], environmentRecord);
2004       if (completion.savedEffects !== undefined) this.clearBlockBindings(completion.savedEffects[2], environmentRecord);
2005       if (completion.alternate instanceof _completions.Completion) this.clearBlockBindingsFromCompletion(completion.alternate, environmentRecord);
2006       if (completion.consequent instanceof _completions.Completion) this.clearBlockBindingsFromCompletion(completion.consequent, environmentRecord);
2007     } else if (completion instanceof _completions.JoinedAbruptCompletions) {
2008       this.clearBlockBindings(completion.alternateEffects[2], environmentRecord);
2009       this.clearBlockBindings(completion.consequentEffects[2], environmentRecord);
2010       if (completion.alternate instanceof _completions.Completion) this.clearBlockBindingsFromCompletion(completion.alternate, environmentRecord);
2011       if (completion.consequent instanceof _completions.Completion) this.clearBlockBindingsFromCompletion(completion.consequent, environmentRecord);
2012     }
2013   }
2014
2015   // Call when a scope falls out of scope and should be destroyed.
2016   // Clears the Bindings corresponding to the disappearing Scope from ModifiedBindings
2017   onDestroyScope(lexicalEnvironment) {
2018     (0, _invariant2.default)(this.activeLexicalEnvironments.has(lexicalEnvironment));
2019     let modifiedBindings = this.modifiedBindings;
2020     if (modifiedBindings) {
2021       // Don't undo things to global scope because it's needed past its destruction point (for serialization)
2022       let environmentRecord = lexicalEnvironment.environmentRecord;
2023       if (environmentRecord instanceof _environment.DeclarativeEnvironmentRecord) {
2024         this.clearBlockBindings(modifiedBindings, environmentRecord);
2025         if (this.savedCompletion !== undefined) this.clearBlockBindingsFromCompletion(this.savedCompletion, environmentRecord);
2026       }
2027     }
2028
2029     // Ensures if we call onDestroyScope too early, there will be a failure.
2030     this.activeLexicalEnvironments.delete(lexicalEnvironment);
2031     lexicalEnvironment.destroy();
2032   }
2033
2034   pushContext(context) {
2035     if (this.contextStack.length >= this.maxStackDepth) {
2036       throw new _errors.FatalError("Maximum stack depth exceeded");
2037     }
2038     this.contextStack.push(context);
2039   }
2040
2041   clearFunctionBindings(modifiedBindings, funcVal) {
2042     if (modifiedBindings === undefined) return;
2043     for (let b of modifiedBindings.keys()) {
2044       if (b.environment.$FunctionObject === funcVal) modifiedBindings.delete(b);
2045     }
2046   }
2047
2048   clearFunctionBindingsFromCompletion(completion, funcVal) {
2049     if (completion instanceof _completions.PossiblyNormalCompletion) {
2050       this.clearFunctionBindings(completion.alternateEffects[2], funcVal);
2051       this.clearFunctionBindings(completion.consequentEffects[2], funcVal);
2052       if (completion.savedEffects !== undefined) this.clearFunctionBindings(completion.savedEffects[2], funcVal);
2053       if (completion.alternate instanceof _completions.Completion) this.clearFunctionBindingsFromCompletion(completion.alternate, funcVal);
2054       if (completion.consequent instanceof _completions.Completion) this.clearFunctionBindingsFromCompletion(completion.consequent, funcVal);
2055     } else if (completion instanceof _completions.JoinedAbruptCompletions) {
2056       this.clearFunctionBindings(completion.alternateEffects[2], funcVal);
2057       this.clearFunctionBindings(completion.consequentEffects[2], funcVal);
2058       if (completion.alternate instanceof _completions.Completion) this.clearFunctionBindingsFromCompletion(completion.alternate, funcVal);
2059       if (completion.consequent instanceof _completions.Completion) this.clearFunctionBindingsFromCompletion(completion.consequent, funcVal);
2060     }
2061   }
2062
2063   popContext(context) {
2064     let funcVal = context.function;
2065     if (funcVal) {
2066       this.clearFunctionBindings(this.modifiedBindings, funcVal);
2067       if (this.savedCompletion !== undefined) this.clearFunctionBindingsFromCompletion(this.savedCompletion, funcVal);
2068     }
2069     let c = this.contextStack.pop();
2070     (0, _invariant2.default)(c === context);
2071   }
2072
2073   wrapInGlobalEnv(callback) {
2074     let context = new ExecutionContext();
2075     context.isStrict = this.isStrict;
2076     context.lexicalEnvironment = this.$GlobalEnv;
2077     context.variableEnvironment = this.$GlobalEnv;
2078     context.realm = this;
2079
2080     this.pushContext(context);
2081     try {
2082       return callback();
2083     } finally {
2084       this.popContext(context);
2085     }
2086   }
2087
2088   assignToGlobal(name, value) {
2089     this.wrapInGlobalEnv(() => this.$GlobalEnv.assignToGlobal(name, value));
2090   }
2091
2092   deleteGlobalBinding(name) {
2093     this.$GlobalEnv.environmentRecord.DeleteBinding(name);
2094   }
2095
2096   // Evaluate a context as if it won't have any side-effects outside of any objects
2097   // that it created itself. This promises that any abstract functions inside of it
2098   // also won't have effects on any objects or bindings that weren't created in this
2099   // call.
2100   evaluatePure(f) {
2101     if (!this.trackLeaks) {
2102       return f();
2103     }
2104     let saved_createdObjectsTrackedForLeaks = this.createdObjectsTrackedForLeaks;
2105     // Track all objects (including function closures) created during
2106     // this call. This will be used to make the assumption that every
2107     // *other* object is unchanged (pure). These objects are marked
2108     // as leaked if they're passed to abstract functions.
2109     this.createdObjectsTrackedForLeaks = new Set();
2110     try {
2111       return f();
2112     } finally {
2113       this.createdObjectsTrackedForLeaks = saved_createdObjectsTrackedForLeaks;
2114     }
2115   }
2116
2117   isInPureScope() {
2118     return !!this.createdObjectsTrackedForLeaks;
2119   }
2120
2121   evaluateWithoutLeakLogic(f) {
2122     (0, _invariant2.default)(!this.ignoreLeakLogic, "Nesting evaluateWithoutLeakLogic() calls is not supported.");
2123     this.ignoreLeakLogic = true;
2124     try {
2125       return f();
2126     } finally {
2127       this.ignoreLeakLogic = false;
2128     }
2129   }
2130
2131   // Evaluate some code that might generate temporal values knowing that it might end in an abrupt
2132   // completion. We only need to support ThrowCompletion for now but this can be expanded to support other
2133   // abrupt completions.
2134   evaluateWithPossibleThrowCompletion(f, thrownTypes, thrownValues) {
2135     // The cases when we need this are only when we might invoke unknown code such as abstract
2136     // funtions, getters, custom coercion etc. It is possible we can use this in other cases
2137     // where something might throw a built-in error but can never issue arbitrary code such as
2138     // calling something that might not be a function. For now we only use it in pure functions.
2139     (0, _invariant2.default)(this.isInPureScope(), "only abstract abrupt completion in pure functions");
2140
2141     // TODO(1264): We should create a new generator for this scope and wrap it in a try/catch.
2142     // We could use the outcome of that as the join condition for a PossiblyNormalCompletion.
2143     // We should then compose that with the saved completion and move on to the normal route.
2144     // Currently we just issue a recoverable error instead if this might matter.
2145     let value = f();
2146     if (this.isInPureTryStatement) {
2147       let diag = new _errors.CompilerDiagnostic("Possible throw inside try/catch is not yet supported", this.currentLocation, "PP0021", "RecoverableError");
2148       if (this.handleError(diag) !== "Recover") throw new _errors.FatalError();
2149     }
2150     return value;
2151   }
2152
2153   // Evaluate the given ast in a sandbox and return the evaluation results
2154   // in the form of a completion, a code generator, a map of changed variable
2155   // bindings and a map of changed property bindings.
2156   evaluateNodeForEffects(ast, strictCode, env, state, generatorName) {
2157     return this.evaluateForEffects(() => env.evaluateCompletionDeref(ast, strictCode), state, generatorName);
2158   }
2159
2160   evaluateForEffectsInGlobalEnv(func, state, generatorName) {
2161     return this.wrapInGlobalEnv(() => this.evaluateForEffects(func, state, generatorName));
2162   }
2163
2164   // NB: does not apply generators because there's no way to cleanly revert them.
2165   // func should not return undefined
2166   withEffectsAppliedInGlobalEnv(func, effects) {
2167     let result;
2168     this.evaluateForEffectsInGlobalEnv(() => {
2169       try {
2170         this.applyEffects(effects);
2171         result = func(effects);
2172         return this.intrinsics.undefined;
2173       } finally {
2174         this.restoreBindings(effects[2]);
2175         this.restoreProperties(effects[3]);
2176       }
2177     });
2178     (0, _invariant2.default)(result !== undefined, "If we get here, func must have returned undefined.");
2179     return result;
2180   }
2181
2182   evaluateNodeForEffectsInGlobalEnv(node, state, generatorName) {
2183     return this.wrapInGlobalEnv(() => this.evaluateNodeForEffects(node, false, this.$GlobalEnv, state, generatorName));
2184   }
2185
2186   partiallyEvaluateNodeForEffects(ast, strictCode, env) {
2187     let nodeAst, nodeIO;
2188     function partialEval() {
2189       let result;
2190       [result, nodeAst, nodeIO] = env.partiallyEvaluateCompletionDeref(ast, strictCode);
2191       return result;
2192     }
2193     let effects = this.evaluateForEffects(partialEval);
2194     (0, _invariant2.default)(nodeAst !== undefined && nodeIO !== undefined);
2195     return [effects, nodeAst, nodeIO];
2196   }
2197
2198   evaluateForEffects(f, state, generatorName) {
2199     // Save old state and set up empty state for ast
2200     let [savedBindings, savedProperties] = this.getAndResetModifiedMaps();
2201     let saved_generator = this.generator;
2202     let saved_createdObjects = this.createdObjects;
2203     let saved_completion = this.savedCompletion;
2204     this.generator = new _generator.Generator(this, generatorName);
2205     this.createdObjects = new Set();
2206     this.savedCompletion = undefined; // while in this call, we only explore the normal path.
2207
2208     let result;
2209     try {
2210       for (let t1 of this.tracers) t1.beginEvaluateForEffects(state);
2211
2212       let c;
2213       try {
2214         try {
2215           c = f();
2216           if (c instanceof _environment.Reference) c = _singletons.Environment.GetValue(this, c);
2217         } catch (e) {
2218           if (e instanceof _completions.AbruptCompletion) c = e;else throw e;
2219         }
2220         // This is a join point for the normal branch of a PossiblyNormalCompletion.
2221         if (c instanceof _index.Value || c instanceof _completions.AbruptCompletion) c = _singletons.Functions.incorporateSavedCompletion(this, c);
2222         (0, _invariant2.default)(c !== undefined);
2223         if (c instanceof _completions.PossiblyNormalCompletion) {
2224           // The current state may have advanced since the time control forked into the various paths recorded in c.
2225           // Update the normal path and restore the global state to what it was at the time of the fork.
2226           let subsequentEffects = this.getCapturedEffects(c, c.value);
2227           (0, _invariant2.default)(subsequentEffects !== undefined);
2228           this.stopEffectCaptureAndUndoEffects(c);
2229           _singletons.Join.updatePossiblyNormalCompletionWithSubsequentEffects(this, c, subsequentEffects);
2230           this.savedCompletion = undefined;
2231         }
2232
2233         (0, _invariant2.default)(this.generator !== undefined);
2234         (0, _invariant2.default)(this.modifiedBindings !== undefined);
2235         (0, _invariant2.default)(this.modifiedProperties !== undefined);
2236         (0, _invariant2.default)(this.createdObjects !== undefined);
2237         let astGenerator = this.generator;
2238         let astBindings = this.modifiedBindings;
2239         let astProperties = this.modifiedProperties;
2240         let astCreatedObjects = this.createdObjects;
2241
2242         // Return the captured state changes and evaluation result
2243         result = [c, astGenerator, astBindings, astProperties, astCreatedObjects];
2244         return result;
2245       } finally {
2246         // Roll back the state changes
2247         if (this.savedCompletion !== undefined) this.stopEffectCaptureAndUndoEffects(this.savedCompletion);
2248         if (result !== undefined) {
2249           this.restoreBindings(result[2]);
2250           this.restoreProperties(result[3]);
2251         } else {
2252           this.restoreBindings(this.modifiedBindings);
2253           this.restoreProperties(this.modifiedProperties);
2254         }
2255         this.generator = saved_generator;
2256         this.modifiedBindings = savedBindings;
2257         this.modifiedProperties = savedProperties;
2258         this.createdObjects = saved_createdObjects;
2259         this.savedCompletion = saved_completion;
2260       }
2261     } finally {
2262       for (let t2 of this.tracers) t2.endEvaluateForEffects(state, result);
2263     }
2264   }
2265
2266   evaluateWithUndo(f, defaultValue = this.intrinsics.undefined) {
2267     if (!this.useAbstractInterpretation) return f();
2268     let oldErrorHandler = this.errorHandler;
2269     this.errorHandler = d => {
2270       if (d.severity === "Information" || d.severity === "Warning") return "Recover";
2271       return "Fail";
2272     };
2273     try {
2274       let effects = this.evaluateForEffects(() => {
2275         try {
2276           return f();
2277         } catch (e) {
2278           if (e instanceof _completions.Completion) {
2279             return defaultValue;
2280           } else if (e instanceof _errors.FatalError) {
2281             return defaultValue;
2282           } else {
2283             throw e;
2284           }
2285         }
2286       });
2287       return effects[0] instanceof _index.Value ? effects[0] : defaultValue;
2288     } finally {
2289       this.errorHandler = oldErrorHandler;
2290     }
2291   }
2292
2293   evaluateWithUndoForDiagnostic(f) {
2294     if (!this.useAbstractInterpretation) return f();
2295     let savedHandler = this.errorHandler;
2296     let diagnostic;
2297     try {
2298       this.errorHandler = d => {
2299         diagnostic = d;
2300         return "Fail";
2301       };
2302       let effects = this.evaluateForEffects(f);
2303       this.applyEffects(effects);
2304       let resultVal = effects[0];
2305       if (resultVal instanceof _completions.AbruptCompletion) throw resultVal;
2306       if (resultVal instanceof _completions.PossiblyNormalCompletion) {
2307         // in this case one of the branches may complete abruptly, which means that
2308         // not all control flow branches join into one flow at this point.
2309         // Consequently we have to continue tracking changes until the point where
2310         // all the branches come together into one.
2311         resultVal = this.composeWithSavedCompletion(resultVal);
2312       }
2313       (0, _invariant2.default)(resultVal instanceof _index.Value);
2314       return resultVal;
2315     } catch (e) {
2316       if (diagnostic !== undefined) return diagnostic;
2317       throw e;
2318     } finally {
2319       this.errorHandler = savedHandler;
2320     }
2321   }
2322
2323   evaluateForFixpointEffects(loopContinueTest, loopBody) {
2324     try {
2325       let effects1 = this.evaluateForEffects(loopBody);
2326       while (true) {
2327         this.restoreBindings(effects1[2]);
2328         this.restoreProperties(effects1[3]);
2329         let effects2 = this.evaluateForEffects(() => {
2330           let test = loopContinueTest();
2331           if (!(test instanceof _index.AbstractValue)) throw new _errors.FatalError("loop terminates before fixed point");
2332           return loopBody();
2333         });
2334         this.restoreBindings(effects1[2]);
2335         this.restoreProperties(effects1[3]);
2336         if (_singletons.Widen.containsEffects(effects1, effects2)) {
2337           // effects1 includes every value present in effects2, so doing another iteration using effects2 will not
2338           // result in any more values being added to abstract domains and hence a fixpoint has been reached.
2339           let [, gen, bindings2, pbindings2] = effects2;
2340           this._emitPropertAssignments(gen, pbindings2);
2341           this._emitLocalAssignments(gen, bindings2);
2342           return [effects1, effects2];
2343         }
2344         effects1 = _singletons.Widen.widenEffects(this, effects1, effects2);
2345       }
2346     } catch (e) {
2347       return undefined;
2348     }
2349   }
2350
2351   // populate the loop body generator with assignments that will update the phiNodes
2352   _emitLocalAssignments(gen, bindings) {
2353     let tvalFor = new Map();
2354     bindings.forEach((binding, key, map) => {
2355       let val = binding.value;
2356       if (val instanceof _index.AbstractValue) {
2357         (0, _invariant2.default)(val._buildNode !== undefined);
2358         let tval = gen.derive(val.types, val.values, [val], ([n]) => n, {
2359           skipInvariant: true
2360         });
2361         tvalFor.set(key, tval);
2362       }
2363     });
2364     bindings.forEach((binding, key, map) => {
2365       let val = binding.value;
2366       if (val instanceof _index.AbstractValue) {
2367         let phiNode = key.phiNode;
2368         let tval = tvalFor.get(key);
2369         (0, _invariant2.default)(tval !== undefined);
2370         gen.emitStatement([tval], ([v]) => {
2371           (0, _invariant2.default)(phiNode !== undefined);
2372           let id = phiNode.buildNode([]);
2373           return t.expressionStatement(t.assignmentExpression("=", id, v));
2374         });
2375       }
2376     });
2377   }
2378
2379   // populate the loop body generator with assignments that will update properties modified inside the loop
2380   _emitPropertAssignments(gen, pbindings) {
2381     function isSelfReferential(value, pathNode) {
2382       if (value === pathNode) return true;
2383       if (value instanceof _index.AbstractValue && pathNode !== undefined) {
2384         for (let v of value.args) {
2385           if (isSelfReferential(v, pathNode)) return true;
2386         }
2387       }
2388       return false;
2389     }
2390
2391     let tvalFor = new Map();
2392     pbindings.forEach((val, key, map) => {
2393       let value = val && val.value;
2394       if (value instanceof _index.AbstractValue) {
2395         (0, _invariant2.default)(value._buildNode !== undefined);
2396         let tval = gen.derive(value.types, value.values, [key.object, value], ([o, n]) => {
2397           (0, _invariant2.default)(value instanceof _index.Value);
2398           if (typeof key.key === "string" && value.mightHaveBeenDeleted() && isSelfReferential(value, key.pathNode)) {
2399             let inTest = t.binaryExpression("in", t.stringLiteral(key.key), o);
2400             let addEmpty = t.conditionalExpression(inTest, n, _internalizer.emptyExpression);
2401             n = t.logicalExpression("||", n, addEmpty);
2402           }
2403           return n;
2404         }, {
2405           skipInvariant: true
2406         });
2407         tvalFor.set(key, tval);
2408       }
2409     });
2410     pbindings.forEach((val, key, map) => {
2411       let path = key.pathNode;
2412       let tval = tvalFor.get(key);
2413       (0, _invariant2.default)(val !== undefined);
2414       let value = val.value;
2415       (0, _invariant2.default)(value instanceof _index.Value);
2416       let mightHaveBeenDeleted = value.mightHaveBeenDeleted();
2417       let mightBeUndefined = value.mightBeUndefined();
2418       if (typeof key.key === "string") {
2419         gen.emitStatement([key.object, tval || value, this.intrinsics.empty], ([o, v, e]) => {
2420           (0, _invariant2.default)(path !== undefined);
2421           let lh = path.buildNode([o, t.identifier(key.key)]);
2422           let r = t.expressionStatement(t.assignmentExpression("=", lh, v));
2423           if (mightHaveBeenDeleted) {
2424             // If v === __empty || (v === undefined  && !(key.key in o))  then delete it
2425             let emptyTest = t.binaryExpression("===", v, e);
2426             let undefinedTest = t.binaryExpression("===", v, _internalizer.voidExpression);
2427             let inTest = t.unaryExpression("!", t.binaryExpression("in", t.stringLiteral(key.key), o));
2428             let guard = t.logicalExpression("||", emptyTest, t.logicalExpression("&&", undefinedTest, inTest));
2429             let deleteIt = t.expressionStatement(t.unaryExpression("delete", lh));
2430             return t.ifStatement(mightBeUndefined ? emptyTest : guard, deleteIt, r);
2431           }
2432           return r;
2433         });
2434       } else {
2435         gen.emitStatement([key.object, key.key, tval || value, this.intrinsics.empty], ([o, p, v, e]) => {
2436           (0, _invariant2.default)(path !== undefined);
2437           let lh = path.buildNode([o, p]);
2438           return t.expressionStatement(t.assignmentExpression("=", lh, v));
2439         });
2440       }
2441     });
2442   }
2443
2444   composeEffects(priorEffects, subsequentEffects) {
2445     let [, pg, pb, pp, po] = priorEffects;
2446     let [sc, sg, sb, sp, so] = subsequentEffects;
2447     let result = construct_empty_effects(this);
2448     let [,, rb, rp, ro] = result;
2449
2450     result[0] = sc;
2451
2452     result[1] = _singletons.Join.composeGenerators(this, pg || result[1], sg);
2453
2454     if (pb) {
2455       pb.forEach((val, key, m) => rb.set(key, val));
2456     }
2457     sb.forEach((val, key, m) => rb.set(key, val));
2458
2459     if (pp) {
2460       pp.forEach((desc, propertyBinding, m) => rp.set(propertyBinding, desc));
2461     }
2462     sp.forEach((val, key, m) => rp.set(key, val));
2463
2464     if (po) {
2465       po.forEach((ob, a) => ro.add(ob));
2466     }
2467     so.forEach((ob, a) => ro.add(ob));
2468
2469     return result;
2470   }
2471
2472   updateAbruptCompletions(priorEffects, c) {
2473     if (c.consequent instanceof _completions.AbruptCompletion) {
2474       c.consequentEffects = this.composeEffects(priorEffects, c.consequentEffects);
2475       let alternate = c.alternate;
2476       if (alternate instanceof _completions.PossiblyNormalCompletion) this.updateAbruptCompletions(priorEffects, alternate);
2477     } else {
2478       (0, _invariant2.default)(c.alternate instanceof _completions.AbruptCompletion);
2479       c.alternateEffects = this.composeEffects(priorEffects, c.alternateEffects);
2480       let consequent = c.consequent;
2481       if (consequent instanceof _completions.PossiblyNormalCompletion) this.updateAbruptCompletions(priorEffects, consequent);
2482     }
2483   }
2484
2485   composeWithSavedCompletion(completion) {
2486     if (this.savedCompletion === undefined) {
2487       this.savedCompletion = completion;
2488       this.savedCompletion.savedPathConditions = this.pathConditions;
2489       this.captureEffects(completion);
2490     } else {
2491       this.savedCompletion = _singletons.Join.composePossiblyNormalCompletions(this, this.savedCompletion, completion);
2492     }
2493     if (completion.consequent instanceof _completions.AbruptCompletion) {
2494       _singletons.Path.pushInverseAndRefine(completion.joinCondition);
2495       if (completion.alternate instanceof _completions.PossiblyNormalCompletion) {
2496         completion.alternate.pathConditions.forEach(_singletons.Path.pushAndRefine);
2497       }
2498     } else if (completion.alternate instanceof _completions.AbruptCompletion) {
2499       _singletons.Path.pushAndRefine(completion.joinCondition);
2500       if (completion.consequent instanceof _completions.PossiblyNormalCompletion) {
2501         completion.consequent.pathConditions.forEach(_singletons.Path.pushAndRefine);
2502       }
2503     }
2504     return completion.value;
2505   }
2506
2507   incorporatePriorSavedCompletion(priorCompletion) {
2508     if (priorCompletion === undefined) return;
2509     if (this.savedCompletion === undefined) {
2510       this.savedCompletion = priorCompletion;
2511       this.captureEffects(priorCompletion);
2512     } else {
2513       (0, _invariant2.default)(priorCompletion.savedEffects !== undefined);
2514       let savedEffects = this.savedCompletion.savedEffects;
2515       (0, _invariant2.default)(savedEffects !== undefined);
2516       this.restoreBindings(savedEffects[2]);
2517       this.restoreProperties(savedEffects[3]);
2518       _singletons.Join.updatePossiblyNormalCompletionWithSubsequentEffects(this, priorCompletion, savedEffects);
2519       this.restoreBindings(savedEffects[2]);
2520       this.restoreProperties(savedEffects[3]);
2521       (0, _invariant2.default)(this.savedCompletion !== undefined);
2522       this.savedCompletion.savedEffects = undefined;
2523       this.savedCompletion = _singletons.Join.composePossiblyNormalCompletions(this, priorCompletion, this.savedCompletion);
2524     }
2525   }
2526
2527   captureEffects(completion) {
2528     if (completion.savedEffects !== undefined) {
2529       // Already called captureEffects, just carry on
2530       return;
2531     }
2532     completion.savedEffects = [this.intrinsics.undefined, this.generator, this.modifiedBindings, this.modifiedProperties, this.createdObjects];
2533     this.generator = new _generator.Generator(this);
2534     this.modifiedBindings = new Map();
2535     this.modifiedProperties = new Map();
2536     this.createdObjects = new Set();
2537   }
2538
2539   getCapturedEffects(completion, v) {
2540     if (completion.savedEffects === undefined) return undefined;
2541     if (v === undefined) v = this.intrinsics.undefined;
2542     (0, _invariant2.default)(this.generator !== undefined);
2543     (0, _invariant2.default)(this.modifiedBindings !== undefined);
2544     (0, _invariant2.default)(this.modifiedProperties !== undefined);
2545     (0, _invariant2.default)(this.createdObjects !== undefined);
2546     return [v, this.generator, this.modifiedBindings, this.modifiedProperties, this.createdObjects];
2547   }
2548
2549   stopEffectCapture(completion) {
2550     let e = this.getCapturedEffects(completion);
2551     if (e !== undefined) {
2552       this.stopEffectCaptureAndUndoEffects(completion);
2553       this.applyEffects(e);
2554     }
2555   }
2556
2557   stopEffectCaptureAndUndoEffects(completion) {
2558     // Roll back the state changes
2559     this.restoreBindings(this.modifiedBindings);
2560     this.restoreProperties(this.modifiedProperties);
2561
2562     // Restore saved state
2563     if (completion.savedEffects !== undefined) {
2564       let [c, g, b, p, o] = completion.savedEffects;
2565       c;
2566       completion.savedEffects = undefined;
2567       this.generator = g;
2568       this.modifiedBindings = b;
2569       this.modifiedProperties = p;
2570       this.createdObjects = o;
2571     } else {
2572       (0, _invariant2.default)(false);
2573     }
2574   }
2575
2576   // Apply the given effects to the global state
2577   applyEffects(effects, leadingComment = "") {
2578     let [, generator, bindings, properties, createdObjects] = effects;
2579
2580     // Add generated code for property modifications
2581     this.appendGenerator(generator, leadingComment);
2582
2583     // Restore bindings
2584     this.restoreBindings(bindings);
2585     this.restoreProperties(properties);
2586
2587     // track bindings
2588     let realmModifiedBindings = this.modifiedBindings;
2589     if (realmModifiedBindings !== undefined) {
2590       bindings.forEach((val, key, m) => {
2591         (0, _invariant2.default)(realmModifiedBindings !== undefined);
2592         if (!realmModifiedBindings.has(key)) {
2593           realmModifiedBindings.set(key, val);
2594         }
2595       });
2596     }
2597     let realmModifiedProperties = this.modifiedProperties;
2598     if (realmModifiedProperties !== undefined) {
2599       properties.forEach((desc, propertyBinding, m) => {
2600         (0, _invariant2.default)(realmModifiedProperties !== undefined);
2601         if (!realmModifiedProperties.has(propertyBinding)) {
2602           realmModifiedProperties.set(propertyBinding, desc);
2603         }
2604       });
2605     }
2606
2607     // add created objects
2608     if (createdObjects.size > 0) {
2609       let realmCreatedObjects = this.createdObjects;
2610       if (realmCreatedObjects === undefined) this.createdObjects = new Set(createdObjects);else {
2611         createdObjects.forEach((ob, a) => {
2612           (0, _invariant2.default)(realmCreatedObjects !== undefined);
2613           realmCreatedObjects.add(ob);
2614         });
2615       }
2616     }
2617   }
2618
2619   outputToConsole(method, args) {
2620     if (this.isReadOnly) {
2621       // This only happens during speculative execution and is reported elsewhere
2622       throw new _errors.FatalError("Trying to create console output in read-only realm");
2623     }
2624     if (this.useAbstractInterpretation) {
2625       (0, _invariant2.default)(this.generator !== undefined);
2626       this.generator.emitConsoleLog(method, args);
2627     } else {
2628       console[method](getString(this, args));
2629     }
2630
2631     function getString(realm, values) {
2632       let res = "";
2633       while (values.length) {
2634         let next = values.shift();
2635         let nextString = _singletons.To.ToString(realm, next);
2636         res += nextString;
2637       }
2638       return res;
2639     }
2640   }
2641
2642   // Record the current value of binding in this.modifiedBindings unless
2643   // there is already an entry for binding.
2644   recordModifiedBinding(binding) {
2645     if (binding.environment.isReadOnly) {
2646       // This only happens during speculative execution and is reported elsewhere
2647       throw new _errors.FatalError("Trying to modify a binding in read-only realm");
2648     }
2649     if (this.modifiedBindings !== undefined && !this.modifiedBindings.has(binding)) this.modifiedBindings.set(binding, {
2650       hasLeaked: binding.hasLeaked,
2651       value: binding.value
2652     });
2653     return binding;
2654   }
2655
2656   callReportObjectGetOwnProperties(ob) {
2657     if (this.reportObjectGetOwnProperties !== undefined) {
2658       this.reportObjectGetOwnProperties(ob);
2659     }
2660   }
2661
2662   callReportPropertyAccess(binding) {
2663     if (this.reportPropertyAccess !== undefined) {
2664       this.reportPropertyAccess(binding);
2665     }
2666   }
2667
2668   // Record the current value of binding in this.modifiedProperties unless
2669   // there is already an entry for binding.
2670   recordModifiedProperty(binding) {
2671     if (binding === undefined) return;
2672     if (this.isReadOnly && (this.getRunningContext().isReadOnly || !this.isNewObject(binding.object))) {
2673       // This only happens during speculative execution and is reported elsewhere
2674       throw new _errors.FatalError("Trying to modify a property in read-only realm");
2675     }
2676     this.callReportPropertyAccess(binding);
2677     if (this.modifiedProperties !== undefined && !this.modifiedProperties.has(binding)) {
2678       this.modifiedProperties.set(binding, (0, _index2.cloneDescriptor)(binding.descriptor));
2679     }
2680   }
2681
2682   isNewObject(object) {
2683     if (object instanceof _index.AbstractObjectValue) return false;
2684     return this.createdObjects === undefined || this.createdObjects.has(object);
2685   }
2686
2687   recordNewObject(object) {
2688     if (this.createdObjects !== undefined) {
2689       this.createdObjects.add(object);
2690     }
2691     if (this.createdObjectsTrackedForLeaks !== undefined) {
2692       this.createdObjectsTrackedForLeaks.add(object);
2693     }
2694   }
2695
2696   // Returns the current values of modifiedBindings and modifiedProperties
2697   // and then assigns new empty maps to them.
2698   getAndResetModifiedMaps() {
2699     let result = [this.modifiedBindings, this.modifiedProperties];
2700     this.modifiedBindings = new Map();
2701     this.modifiedProperties = new Map();
2702     return result;
2703   }
2704
2705   // Restores each Binding in the given map to the value it
2706   // had when it was entered into the map and updates the map to record
2707   // the value the Binding had just before the call to this method.
2708   restoreBindings(modifiedBindings) {
2709     if (modifiedBindings === undefined) return;
2710     modifiedBindings.forEach(({ hasLeaked, value }, binding, m) => {
2711       let l = binding.hasLeaked;
2712       let v = binding.value;
2713       binding.hasLeaked = hasLeaked;
2714       binding.value = value;
2715       m.set(binding, {
2716         hasLeaked: l,
2717         value: v
2718       });
2719     });
2720   }
2721
2722   // Restores each PropertyBinding in the given map to the value it
2723   // had when it was entered into the map and updates the map to record
2724   // the value the Binding had just before the call to this method.
2725   restoreProperties(modifiedProperties) {
2726     if (modifiedProperties === undefined) return;
2727     modifiedProperties.forEach((desc, propertyBinding, m) => {
2728       let d = propertyBinding.descriptor;
2729       propertyBinding.descriptor = desc;
2730       m.set(propertyBinding, d);
2731     });
2732   }
2733
2734   // Provide the realm with maps in which to track modifications.
2735   // A map can be set to undefined if no tracking is required.
2736   setModifiedMaps(modifiedBindings, modifiedProperties) {
2737     this.modifiedBindings = modifiedBindings;
2738     this.modifiedProperties = modifiedProperties;
2739   }
2740
2741   rebuildObjectProperty(object, key, propertyValue, path) {
2742     if (!(propertyValue instanceof _index.AbstractValue)) return;
2743     if (propertyValue.kind === "abstractConcreteUnion") {
2744       let absVal = propertyValue.args.find(e => e instanceof _index.AbstractValue);
2745       (0, _invariant2.default)(absVal instanceof _index.AbstractValue);
2746       propertyValue = absVal;
2747     }
2748     if (!propertyValue.isIntrinsic()) {
2749       propertyValue.intrinsicName = `${path}.${key}`;
2750       propertyValue.kind = "rebuiltProperty";
2751       propertyValue.args = [object];
2752       propertyValue._buildNode = ([node]) => t.memberExpression(node, t.identifier(key));
2753       this.rebuildNestedProperties(propertyValue, propertyValue.intrinsicName);
2754     }
2755   }
2756
2757   rebuildNestedProperties(abstractValue, path) {
2758     if (!(abstractValue instanceof _index.AbstractObjectValue)) return;
2759     if (abstractValue.values.isTop()) return;
2760     let template = abstractValue.getTemplate();
2761     (0, _invariant2.default)(!template.intrinsicName || template.intrinsicName === path);
2762     template.intrinsicName = path;
2763     template.intrinsicNameGenerated = true;
2764     for (let [key, binding] of template.properties) {
2765       if (binding === undefined || binding.descriptor === undefined) continue; // deleted
2766       (0, _invariant2.default)(binding.descriptor !== undefined);
2767       let value = binding.descriptor.value;
2768       _singletons.Properties.ThrowIfMightHaveBeenDeleted(value);
2769       if (value === undefined) {
2770         _index.AbstractValue.reportIntrospectionError(abstractValue, key);
2771         throw new _errors.FatalError();
2772       }
2773       (0, _invariant2.default)(value instanceof _index.Value);
2774       this.rebuildObjectProperty(abstractValue, key, value, path);
2775     }
2776   }
2777
2778   createExecutionContext() {
2779     let context = new ExecutionContext();
2780
2781     let loc = this.nextContextLocation;
2782     if (loc) {
2783       context.setLocation(loc);
2784       this.nextContextLocation = null;
2785     }
2786
2787     return context;
2788   }
2789
2790   setNextExecutionContextLocation(loc) {
2791     if (!loc) return;
2792
2793     //if (this.nextContextLocation) {
2794     //  throw new ThrowCompletion(
2795     //    Construct(this, this.intrinsics.TypeError, [new StringValue(this, "Already have a context location that we haven't used yet")])
2796     //  );
2797     //} else {
2798     this.nextContextLocation = loc;
2799     //}
2800   }
2801
2802   reportIntrospectionError(message) {
2803     if (message === undefined) message = "";
2804     if (typeof message === "string") message = new _index.StringValue(this, message);
2805     (0, _invariant2.default)(message instanceof _index.StringValue);
2806     this.nextContextLocation = this.currentLocation;
2807     let error = new _errors.CompilerDiagnostic(message.value, this.currentLocation, "PP0001", "FatalError");
2808     this.handleError(error);
2809   }
2810
2811   createErrorThrowCompletion(type, message) {
2812     (0, _invariant2.default)(type !== this.intrinsics.__IntrospectionError);
2813     if (message === undefined) message = "";
2814     if (typeof message === "string") message = new _index.StringValue(this, message);
2815     (0, _invariant2.default)(message instanceof _index.StringValue);
2816     this.nextContextLocation = this.currentLocation;
2817     return new _completions.ThrowCompletion((0, _index2.Construct)(this, type, [message]), this.currentLocation);
2818   }
2819
2820   appendGenerator(generator, leadingComment = "") {
2821     let realmGenerator = this.generator;
2822     if (realmGenerator === undefined) {
2823       (0, _invariant2.default)(generator.empty());
2824       return;
2825     }
2826     realmGenerator.appendGenerator(generator, leadingComment);
2827   }
2828
2829   // Pass the error to the realm's error-handler
2830   // Return value indicates whether the caller should try to recover from the error or not.
2831   handleError(diagnostic) {
2832     if (!diagnostic.callStack && this.contextStack.length > 0) {
2833       let error = (0, _index2.Construct)(this, this.intrinsics.Error);
2834       let stack = error.$Get("stack", error);
2835       if (stack instanceof _index.StringValue) diagnostic.callStack = stack.value;
2836     }
2837     // Default behaviour is to bail on the first error
2838     let errorHandler = this.errorHandler;
2839     if (!errorHandler) {
2840       let msg = `${diagnostic.errorCode}: ${diagnostic.message}`;
2841       if (diagnostic.location) {
2842         let loc_start = diagnostic.location.start;
2843         let loc_end = diagnostic.location.end;
2844         msg += ` at ${loc_start.line}:${loc_start.column} to ${loc_end.line}:${loc_end.column}`;
2845       }
2846       try {
2847         switch (diagnostic.severity) {
2848           case "Information":
2849             console.log(`Info: ${msg}`);
2850             return "Recover";
2851           case "Warning":
2852             console.warn(`Warn: ${msg}`);
2853             return "Recover";
2854           case "RecoverableError":
2855             console.error(`Error: ${msg}`);
2856             return "Fail";
2857           case "FatalError":
2858             console.error(`Fatal Error: ${msg}`);
2859             return "Fail";
2860           default:
2861             (0, _invariant2.default)(false, "Unexpected error type");
2862         }
2863       } finally {
2864         console.log(diagnostic.callStack);
2865       }
2866     }
2867     return errorHandler(diagnostic);
2868   }
2869
2870   saveNameString(nameString) {
2871     this._abstractValuesDefined.add(nameString);
2872   }
2873
2874   isNameStringUnique(nameString) {
2875     return !this._abstractValuesDefined.has(nameString);
2876   }
2877 }
2878 exports.Realm = Realm;
2879
2880
2881 /***/ }),
2882 /* 8 */
2883 /***/ (function(module, exports, __webpack_require__) {
2884
2885 "use strict";
2886
2887
2888 Object.defineProperty(exports, "__esModule", {
2889   value: true
2890 });
2891 exports.Reference = exports.LexicalEnvironment = exports.GlobalEnvironmentRecord = exports.FunctionEnvironmentRecord = exports.ObjectEnvironmentRecord = exports.DeclarativeEnvironmentRecord = exports.EnvironmentRecord = undefined;
2892 exports.havocBinding = havocBinding;
2893 exports.mightBecomeAnObject = mightBecomeAnObject;
2894
2895 var _completions = __webpack_require__(3);
2896
2897 var _errors = __webpack_require__(6);
2898
2899 var _options = __webpack_require__(302);
2900
2901 var _realm = __webpack_require__(7);
2902
2903 var _index = __webpack_require__(0);
2904
2905 var _babelGenerator = __webpack_require__(303);
2906
2907 var _babelGenerator2 = _interopRequireDefault(_babelGenerator);
2908
2909 var _parse = __webpack_require__(158);
2910
2911 var _parse2 = _interopRequireDefault(_parse);
2912
2913 var _invariant = __webpack_require__(1);
2914
2915 var _invariant2 = _interopRequireDefault(_invariant);
2916
2917 var _traverseFast = __webpack_require__(77);
2918
2919 var _traverseFast2 = _interopRequireDefault(_traverseFast);
2920
2921 var _index2 = __webpack_require__(5);
2922
2923 var _singletons = __webpack_require__(2);
2924
2925 var _babelTypes = __webpack_require__(4);
2926
2927 var t = _interopRequireWildcard(_babelTypes);
2928
2929 var _index3 = __webpack_require__(24);
2930
2931 var _PrimitiveValue = __webpack_require__(301);
2932
2933 var _PrimitiveValue2 = _interopRequireDefault(_PrimitiveValue);
2934
2935 function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
2936
2937 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2938
2939 const sourceMap = __webpack_require__(313); /**
2940                                           * Copyright (c) 2017-present, Facebook, Inc.
2941                                           * All rights reserved.
2942                                           *
2943                                           * This source code is licensed under the BSD-style license found in the
2944                                           * LICENSE file in the root directory of this source tree. An additional grant
2945                                           * of patent rights can be found in the PATENTS file in the same directory.
2946                                           */
2947
2948 function deriveGetBinding(realm, binding) {
2949   let types = _index3.TypesDomain.topVal;
2950   let values = _index3.ValuesDomain.topVal;
2951   (0, _invariant2.default)(realm.generator !== undefined);
2952   return realm.generator.derive(types, values, [], (_, context) => context.serializeBinding(binding));
2953 }
2954
2955 function havocBinding(binding) {
2956   let realm = binding.environment.realm;
2957   if (!binding.hasLeaked) {
2958     realm.recordModifiedBinding(binding).hasLeaked = true;
2959   }
2960 }
2961
2962 // ECMA262 8.1.1
2963 class EnvironmentRecord {
2964
2965   constructor(realm) {
2966     (0, _invariant2.default)(realm, "expected realm");
2967     this.realm = realm;
2968     this.isReadOnly = false;
2969   }
2970
2971 }
2972
2973 exports.EnvironmentRecord = EnvironmentRecord;
2974
2975
2976 // ECMA262 8.1.1.1
2977 class DeclarativeEnvironmentRecord extends EnvironmentRecord {
2978   constructor(realm) {
2979     super(realm);
2980     this.bindings = Object.create(null);
2981     this.frozen = false;
2982   }
2983   // Frozen Records cannot have bindings created or deleted but can have bindings updated
2984
2985
2986   // ECMA262 8.1.1.1.1
2987   HasBinding(N) {
2988     // 1. Let envRec be the declarative Environment Record for which the method was invoked.
2989     let envRec = this;
2990
2991     // 2. If envRec has a binding for the name that is the value of N, return true.
2992     if (envRec.bindings[N]) return true;
2993
2994     // 3. Return false.
2995     return false;
2996   }
2997
2998   // ECMA262 8.1.1.1.2
2999   CreateMutableBinding(N, D, isGlobal = false) {
3000     (0, _invariant2.default)(!this.frozen);
3001     let realm = this.realm;
3002
3003     // 1. Let envRec be the declarative Environment Record for which the method was invoked.
3004     let envRec = this;
3005
3006     // 2. Assert: envRec does not already have a binding for N.
3007     (0, _invariant2.default)(!envRec.bindings[N], `shouldn't have the binding ${N}`);
3008
3009     // 3. Create a mutable binding in envRec for N and record that it is uninitialized. If D is true, record that the newly created binding may be deleted by a subsequent DeleteBinding call.
3010     this.bindings[N] = realm.recordModifiedBinding({
3011       initialized: false,
3012       mutable: true,
3013       deletable: D,
3014       environment: envRec,
3015       name: N,
3016       isGlobal: isGlobal,
3017       hasLeaked: false
3018     });
3019
3020     // 4. Return NormalCompletion(empty).
3021     return realm.intrinsics.undefined;
3022   }
3023
3024   // ECMA262 8.1.1.1.3
3025   CreateImmutableBinding(N, S, isGlobal = false) {
3026     (0, _invariant2.default)(!this.frozen);
3027     let realm = this.realm;
3028
3029     // 1. Let envRec be the declarative Environment Record for which the method was invoked.
3030     let envRec = this;
3031
3032     // 2. Assert: envRec does not already have a binding for N.
3033     (0, _invariant2.default)(!envRec.bindings[N], `shouldn't have the binding ${N}`);
3034
3035     // 3. Create an immutable binding in envRec for N and record that it is uninitialized. If S is true, record that the newly created binding is a strict binding.
3036     this.bindings[N] = realm.recordModifiedBinding({
3037       initialized: false,
3038       strict: S,
3039       deletable: false,
3040       environment: envRec,
3041       name: N,
3042       isGlobal: isGlobal,
3043       hasLeaked: false
3044     });
3045
3046     // 4. Return NormalCompletion(empty).
3047     return realm.intrinsics.undefined;
3048   }
3049
3050   // ECMA262 8.1.1.1.4
3051   InitializeBinding(N, V) {
3052     // 1. Let envRec be the declarative Environment Record for which the method was invoked.
3053     let envRec = this;
3054
3055     let binding = envRec.bindings[N];
3056
3057     // 2. Assert: envRec must have an uninitialized binding for N.
3058     (0, _invariant2.default)(binding && !binding.initialized, `shouldn't have the binding ${N}`);
3059
3060     // 3. Set the bound value for N in envRec to V.
3061     this.realm.recordModifiedBinding(binding).value = V;
3062
3063     // 4. Record that the binding for N in envRec has been initialized.
3064     binding.initialized = true;
3065
3066     // 5. Return NormalCompletion(empty).
3067     return this.realm.intrinsics.empty;
3068   }
3069
3070   // ECMA262 8.1.1.1.5
3071   SetMutableBinding(N, V, S) {
3072     // We can mutate frozen bindings because of captured bindings.
3073     let realm = this.realm;
3074
3075     // 1. Let envRec be the declarative Environment Record for which the method was invoked.
3076     let envRec = this;
3077
3078     let binding = envRec.bindings[N];
3079
3080     // 2. If envRec does not have a binding for N, then
3081     if (!binding) {
3082       // a. If S is true, throw a ReferenceError exception.
3083       if (S) {
3084         throw realm.createErrorThrowCompletion(realm.intrinsics.ReferenceError, `${N} not found`);
3085       }
3086
3087       // b. Perform envRec.CreateMutableBinding(N, true).
3088       envRec.CreateMutableBinding(N, true);
3089
3090       // c. Perform envRec.InitializeBinding(N, V).
3091       envRec.InitializeBinding(N, V);
3092
3093       // d. Return NormalCompletion(empty).
3094       return this.realm.intrinsics.empty;
3095     }
3096
3097     // 3. If the binding for N in envRec is a strict binding, let S be true.
3098     if (binding.strict) S = true;
3099
3100     // 4. If the binding for N in envRec has not yet been initialized, throw a ReferenceError exception.
3101     if (!binding.initialized) {
3102       throw realm.createErrorThrowCompletion(realm.intrinsics.ReferenceError, `${N} has not yet been initialized`);
3103     } else if (binding.mutable) {
3104       // 5. Else if the binding for N in envRec is a mutable binding, change its bound value to V.
3105       if (binding.hasLeaked) {
3106         _singletons.Havoc.value(realm, V);
3107         (0, _invariant2.default)(realm.generator);
3108         realm.generator.emitBindingAssignment(binding, V);
3109       } else {
3110         realm.recordModifiedBinding(binding).value = V;
3111       }
3112     } else {
3113       // 6. Else,
3114       // a. Assert: This is an attempt to change the value of an immutable binding.
3115
3116       // b. If S is true, throw a TypeError exception.
3117       if (S) {
3118         throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "attempt to change immutable binding");
3119       }
3120     }
3121
3122     // 7. Return NormalCompletion(empty).
3123     return this.realm.intrinsics.empty;
3124   }
3125
3126   // ECMA262 8.1.1.1.6
3127   GetBindingValue(N, S) {
3128     let realm = this.realm;
3129
3130     // 1. Let envRec be the declarative Environment Record for which the method was invoked.
3131     let envRec = this;
3132
3133     let binding = envRec.bindings[N];
3134
3135     // 2. Assert: envRec has a binding for N.
3136     (0, _invariant2.default)(binding, "expected binding");
3137
3138     // 3. If the binding for N in envRec is an uninitialized binding, throw a ReferenceError exception.
3139     if (!binding.initialized) {
3140       throw realm.createErrorThrowCompletion(realm.intrinsics.ReferenceError);
3141     }
3142
3143     // 4. Return the value currently bound to N in envRec.
3144     if (binding.hasLeaked) {
3145       return deriveGetBinding(realm, binding);
3146     }
3147     (0, _invariant2.default)(binding.value);
3148     return binding.value;
3149   }
3150
3151   // ECMA262 8.1.1.1.7
3152   DeleteBinding(N) {
3153     (0, _invariant2.default)(!this.frozen);
3154     // 1. Let envRec be the declarative Environment Record for which the method was invoked.
3155     let envRec = this;
3156
3157     // 2. Assert: envRec has a binding for the name that is the value of N.
3158     (0, _invariant2.default)(envRec.bindings[N], "expected binding to exist");
3159
3160     // 3. If the binding for N in envRec cannot be deleted, return false.
3161     if (!envRec.bindings[N].deletable) return false;
3162
3163     // 4. Remove the binding for N from envRec.
3164     this.realm.recordModifiedBinding(envRec.bindings[N]).value = undefined;
3165     delete envRec.bindings[N];
3166
3167     // 5. Return true.
3168     return true;
3169   }
3170
3171   // ECMA262 8.1.1.1.8
3172   HasThisBinding() {
3173     // 1. Return false.
3174     return false;
3175   }
3176
3177   // ECMA262 8.1.1.1.9
3178   HasSuperBinding() {
3179     // 1. Return false.
3180     return false;
3181   }
3182
3183   // ECMA262 8.1.1.1.10
3184   WithBaseObject() {
3185     // 1. Return undefined.
3186     return this.realm.intrinsics.undefined;
3187   }
3188 }
3189
3190 exports.DeclarativeEnvironmentRecord = DeclarativeEnvironmentRecord; // ECMA262 8.1.1.2
3191
3192 class ObjectEnvironmentRecord extends EnvironmentRecord {
3193
3194   constructor(realm, obj) {
3195     super(realm);
3196     this.object = obj;
3197   }
3198
3199   // ECMA262 8.1.1.2.1
3200   HasBinding(N) {
3201     let realm = this.realm;
3202
3203     // 1. Let envRec be the object Environment Record for which the method was invoked.
3204     let envRec = this;
3205
3206     // 2. Let bindings be the binding object for envRec.
3207     let bindings = this.object;
3208
3209     // 3. Let foundBinding be ? HasProperty(bindings, N).
3210     let foundBinding = (0, _index2.HasProperty)(realm, bindings, N);
3211
3212     // 4. If foundBinding is false, return false.
3213     if (!foundBinding) return false;
3214
3215     // 5. If the withEnvironment flag of envRec is false, return true.
3216     if (!envRec.withEnvironment) return true;
3217
3218     // 6. Let unscopables be ? Get(bindings, @@unscopables).
3219     let unscopables = (0, _index2.Get)(realm, bindings, realm.intrinsics.SymbolUnscopables);
3220
3221     // 7. If Type(unscopables) is Object, then
3222     if (unscopables instanceof _index.ObjectValue || unscopables instanceof _index.AbstractObjectValue) {
3223       // a. Let blocked be ToBoolean(? Get(unscopables, N)).
3224       let blocked = _singletons.To.ToBooleanPartial(realm, (0, _index2.Get)(realm, unscopables, N));
3225
3226       // b. If blocked is true, return false.
3227       if (blocked) return false;
3228     }
3229     unscopables.throwIfNotConcrete();
3230
3231     // 8. Return true.
3232     return true;
3233   }
3234
3235   // ECMA262 8.1.1.2.2
3236   CreateMutableBinding(N, D) {
3237     let realm = this.realm;
3238
3239     // 1. Let envRec be the object Environment Record for which the method was invoked.
3240     let envRec = this;
3241
3242     // 2. Let bindings be the binding object for envRec.
3243     let bindings = envRec.object;
3244
3245     // 3. If D is true, let configValue be true; otherwise let configValue be false.
3246     let configValue = D ? true : false;
3247
3248     // 4. Return ? DefinePropertyOrThrow(bindings, N, PropertyDescriptor{[[Value]]: undefined, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: configValue}).
3249     return new _index.BooleanValue(realm, _singletons.Properties.DefinePropertyOrThrow(realm, bindings, N, {
3250       value: realm.intrinsics.undefined,
3251       writable: true,
3252       enumerable: true,
3253       configurable: configValue
3254     }));
3255   }
3256
3257   // ECMA262 8.1.1.2.3
3258   CreateImmutableBinding(N, S) {
3259     // The concrete Environment Record method CreateImmutableBinding is never used within this specification in association with object Environment Records.
3260     (0, _invariant2.default)(false);
3261   }
3262
3263   // ECMA262 8.1.1.2.4
3264   InitializeBinding(N, V) {
3265     // 1. Let envRec be the object Environment Record for which the method was invoked.
3266     let envRec = this;
3267
3268     // 2. Assert: envRec must have an uninitialized binding for N.
3269     // 3. Record that the binding for N in envRec has been initialized.
3270
3271     // 4. Return ? envRec.SetMutableBinding(N, V, false).
3272     return envRec.SetMutableBinding(N, V, false);
3273   }
3274
3275   // ECMA262 8.1.1.2.5
3276   SetMutableBinding(N, V, S) {
3277     let realm = this.realm;
3278
3279     // 1. Let envRec be the object Environment Record for which the method was invoked.
3280     let envRec = this;
3281
3282     // 2. Let bindings be the binding object for envRec.
3283     let bindings = envRec.object;
3284
3285     // 3. Return ? Set(bindings, N, V, S).
3286     return new _index.BooleanValue(realm, _singletons.Properties.Set(realm, bindings, N, V, S));
3287   }
3288
3289   // ECMA262 8.1.1.2.6
3290   GetBindingValue(N, S) {
3291     let realm = this.realm;
3292
3293     // 1. Let envRec be the object Environment Record for which the method was invoked.
3294     let envRec = this;
3295
3296     // 2. Let bindings be the binding object for envRec.
3297     let bindings = envRec.object;
3298
3299     // 3. Let value be ? HasProperty(bindings, N).
3300     let value = (0, _index2.HasProperty)(realm, bindings, N);
3301
3302     // 4. If value is false, then
3303     if (!value) {
3304       // a. If S is false, return the value undefined; otherwise throw a ReferenceError exception.
3305       if (!S) {
3306         return realm.intrinsics.undefined;
3307       } else {
3308         throw realm.createErrorThrowCompletion(realm.intrinsics.ReferenceError);
3309       }
3310     }
3311
3312     // 5. Return ? Get(bindings, N).
3313     return (0, _index2.Get)(realm, bindings, N);
3314   }
3315
3316   // ECMA262 8.1.1.2.7
3317   DeleteBinding(N) {
3318     // 1. Let envRec be the object Environment Record for which the method was invoked.
3319     let envRec = this;
3320
3321     // 2. Let bindings be the binding object for envRec.
3322     let bindings = envRec.object;
3323
3324     // 3. Return ? bindings.[[Delete]](N).
3325     return bindings.$Delete(N);
3326   }
3327
3328   // ECMA262 8.1.1.2.8
3329   HasThisBinding() {
3330     // 1. Return false.
3331     return false;
3332   }
3333
3334   // ECMA262 8.1.1.2.9
3335   HasSuperBinding() {
3336     // 1. Return false.
3337     return false;
3338   }
3339
3340   // ECMA262 8.1.1.2.10
3341   WithBaseObject() {
3342     // 1. Let envRec be the object Environment Record for which the method was invoked.
3343     let envRec = this;
3344
3345     // 2. If the withEnvironment flag of envRec is true, return the binding object for envRec.
3346     if (envRec.withEnvironment) return envRec.object;
3347
3348     // 3. Otherwise, return undefined.
3349     return this.realm.intrinsics.undefined;
3350   }
3351 }
3352
3353 exports.ObjectEnvironmentRecord = ObjectEnvironmentRecord; // ECMA262 8.1.1.3
3354
3355 class FunctionEnvironmentRecord extends DeclarativeEnvironmentRecord {
3356
3357   // ECMA262 8.1.1.3.1
3358   BindThisValue(V) {
3359     let realm = this.realm;
3360
3361     // 1. Let envRec be the function Environment Record for which the method was invoked.
3362     let envRec = this;
3363
3364     // 2. Assert: envRec.[[ThisBindingStatus]] is not "lexical".
3365     (0, _invariant2.default)(envRec.$ThisBindingStatus !== "lexical", "this binding status shouldn't be lexical");
3366
3367     // 3. If envRec.[[ThisBindingStatus]] is "initialized", throw a ReferenceError exception.
3368     if (envRec.$ThisBindingStatus === "initialized") {
3369       throw realm.createErrorThrowCompletion(realm.intrinsics.ReferenceError);
3370     }
3371
3372     // 4. Set envRec.[[ThisValue]] to V.
3373     envRec.$ThisValue = V;
3374
3375     // 5. Set envRec.[[ThisBindingStatus]] to "initialized".
3376     envRec.$ThisBindingStatus = "initialized";
3377
3378     // 6. Return V.
3379     return V;
3380   }
3381
3382   // ECMA262 8.1.1.3.2