Bug 1427187 - Update Debugger frontend (12-27). r=jdescottes
authorJason Laster <jason.laster.11@gmail.com>
Fri, 05 Jan 2018 09:44:09 +0100
changeset 449745 c2e9837df73214bd3cadce9a5bc82a4797ea1ebd
parent 449744 b647cd8f54368a02c67c14025d8e0a21ae01d18c
child 449746 b789397f403800b52e4b1ff88557438895c90df7
push id8527
push userCallek@gmail.com
push dateThu, 11 Jan 2018 21:05:50 +0000
treeherdermozilla-beta@95342d212a7a [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjdescottes
bugs1427187
milestone59.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1427187 - Update Debugger frontend (12-27). r=jdescottes MozReview-Commit-ID: 37viQIZZzGj
devtools/client/debugger/new/README.mozilla
devtools/client/debugger/new/debugger.js
devtools/client/debugger/new/test/mochitest/browser.ini
devtools/client/debugger/new/test/mochitest/browser_dbg-breaking.js
devtools/client/debugger/new/test/mochitest/browser_dbg-editor-highlight.js
devtools/client/debugger/new/test/mochitest/browser_dbg-pause-ux.js
devtools/client/debugger/new/test/mochitest/browser_dbg-preview-source-maps.js
devtools/client/debugger/new/test/mochitest/head.js
devtools/client/shared/vendor/WASMPARSER_UPGRADING
devtools/client/shared/vendor/WasmDis.js
devtools/client/shared/vendor/WasmParser.js
--- a/devtools/client/debugger/new/README.mozilla
+++ b/devtools/client/debugger/new/README.mozilla
@@ -1,11 +1,11 @@
 This is the debugger.html project output.
 See https://github.com/devtools-html/debugger.html
 
-Taken from upstream commit: f98e56ff661460044382df55bd33cea601e093f0
+Taken from upstream commit: 0bcf3e687305960077e1255510e424d0437a3b69
 
 Packages:
 - babel-plugin-transform-es2015-modules-commonjs @6.26.0
 - babel-preset-react @6.24.1
 - react @15.6.2
 - react-dom @15.6.2
 - webpack @3.8.1
--- a/devtools/client/debugger/new/debugger.js
+++ b/devtools/client/debugger/new/debugger.js
@@ -16420,21 +16420,21 @@ var _breakpointAtLocation2 = _interopReq
 var _visibleBreakpoints = __webpack_require__(1427);
 
 var _visibleBreakpoints2 = _interopRequireDefault(_visibleBreakpoints);
 
 var _isSelectedFrameVisible = __webpack_require__(1505);
 
 var _isSelectedFrameVisible2 = _interopRequireDefault(_isSelectedFrameVisible);
 
-var _getCallStackFrames = __webpack_require__(1780);
+var _getCallStackFrames = __webpack_require__(1779);
 
 var _getCallStackFrames2 = _interopRequireDefault(_getCallStackFrames);
 
-var _visibleSelectedFrame = __webpack_require__(1781);
+var _visibleSelectedFrame = __webpack_require__(1780);
 
 var _visibleSelectedFrame2 = _interopRequireDefault(_visibleSelectedFrame);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 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; } }
 
 /**
@@ -16936,17 +16936,17 @@ var loadSourceText = _interopRequireWild
 var _debuggee = __webpack_require__(1533);
 
 var debuggee = _interopRequireWildcard(_debuggee);
 
 var _toolbox = __webpack_require__(1534);
 
 var toolbox = _interopRequireWildcard(_toolbox);
 
-var _preview = __webpack_require__(1787);
+var _preview = __webpack_require__(1786);
 
 var preview = _interopRequireWildcard(_preview);
 
 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; } }
 
 exports.default = _extends({}, navigation, breakpoints, expressions, eventListeners, sources, pause, ui, fileSearch, ast, coverage, projectTextSearch, quickOpen, sourceTree, loadSourceText, debuggee, toolbox, preview);
 
 /***/ }),
@@ -16967,17 +16967,17 @@ module.exports = feature;
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.isLoading = exports.isLoaded = exports.getMode = exports.getSourceLineCount = exports.getSourcePath = exports.getFileURL = exports.getFilenameFromURL = exports.getFilename = exports.getRawSourceURL = exports.getPrettySourceURL = exports.shouldPrettyPrint = exports.isThirdParty = exports.isPretty = exports.isJavaScript = exports.isMinified = undefined;
 
-var _isMinified = __webpack_require__(1779);
+var _isMinified = __webpack_require__(1778);
 
 Object.defineProperty(exports, "isMinified", {
   enumerable: true,
   get: function () {
     return _isMinified.isMinified;
   }
 });
 
@@ -17239,16 +17239,17 @@ function getMode(source, sourceMetaData)
   }
 
   return { name: "text" };
 }
 
 function isLoaded(source) {
   return source.get("loadedState") === "loaded";
 }
+
 function isLoading(source) {
   return source.get("loadedState") === "loading";
 }
 
 exports.isJavaScript = isJavaScript;
 exports.isPretty = isPretty;
 exports.isThirdParty = isThirdParty;
 exports.shouldPrettyPrint = shouldPrettyPrint;
@@ -17296,17 +17297,17 @@ var _extends = Object.assign || function
 var _devtoolsConfig = __webpack_require__(1355);
 
 var _sourceDocuments = __webpack_require__(1436);
 
 var sourceDocumentUtils = _interopRequireWildcard(_sourceDocuments);
 
 var _source = __webpack_require__(1356);
 
-var _getTokenLocation = __webpack_require__(1784);
+var _getTokenLocation = __webpack_require__(1783);
 
 var _sourceSearch = __webpack_require__(1526);
 
 var sourceSearchUtils = _interopRequireWildcard(_sourceSearch);
 
 var _wasm = __webpack_require__(1401);
 
 var _ui = __webpack_require__(1439);
@@ -17373,31 +17374,35 @@ function createEditor() {
       Esc: false,
       "Cmd-F": false,
       "Cmd-G": false
     }
   });
 }
 
 function toEditorLine(sourceId, lineOrOffset) {
-  return (0, _wasm.isWasm)(sourceId) ? (0, _wasm.wasmOffsetToLine)(sourceId, lineOrOffset) : lineOrOffset - 1;
-}
-
-function toEditorPosition(sourceId, location) {
-  return {
-    line: toEditorLine(sourceId, location.line),
-    column: (0, _wasm.isWasm)(sourceId) ? 0 : location.column
+  if ((0, _wasm.isWasm)(sourceId)) {
+    return (0, _wasm.wasmOffsetToLine)(sourceId, lineOrOffset);
+  }
+
+  return lineOrOffset ? lineOrOffset - 1 : 1;
+}
+
+function toEditorPosition(location) {
+  return {
+    line: toEditorLine(location.sourceId, location.line),
+    column: (0, _wasm.isWasm)(location.sourceId) || !location.column ? 0 : location.column
   };
 }
 
 function toEditorRange(sourceId, location) {
   const { start, end } = location;
   return {
-    start: toEditorPosition(sourceId, start),
-    end: toEditorPosition(sourceId, end)
+    start: toEditorPosition(_extends({}, start, { sourceId })),
+    end: toEditorPosition(_extends({}, end, { sourceId }))
   };
 }
 
 function toSourceLine(sourceId, line) {
   return (0, _wasm.isWasm)(sourceId) ? (0, _wasm.lineToWasmOffset)(sourceId, line) : line + 1;
 }
 
 function scrollToColumn(codeMirror, line, column) {
@@ -18337,20 +18342,16 @@ function update(state = initialState(), 
       }
 
     case "ADD_SOURCES":
       {
         return action.sources.reduce((newState, source) => updateSource(newState, source), state);
       }
 
     case "SELECT_SOURCE":
-      if (action.status != "start") {
-        return state;
-      }
-
       location = _extends({}, action.location, {
         url: action.source.url
       });
 
       _prefs.prefs.pendingSelectedLocation = location;
       return state.set("selectedLocation", _extends({
         sourceId: action.source.id
       }, action.location)).set("pendingSelectedLocation", location);
@@ -18549,17 +18550,17 @@ function getSource(state, id) {
   return getSourceInSources(getSources(state), id);
 }
 
 function getSourceByURL(state, url) {
   return getSourceByUrlInSources(state.sources.sources, url);
 }
 
 function getGeneratedSource(state, source) {
-  if (!(0, _devtoolsSourceMap.isOriginalId)(source.id)) {
+  if (!source || !(0, _devtoolsSourceMap.isOriginalId)(source.id)) {
     return null;
   }
   return getSource(state, (0, _devtoolsSourceMap.originalToGeneratedId)(source.id));
 }
 
 function getPendingSelectedLocation(state) {
   return state.sources.pendingSelectedLocation;
 }
@@ -18905,17 +18906,17 @@ var _breakpoints = __webpack_require__(1
 var _ast = __webpack_require__(1399);
 
 var _projectTextSearch = __webpack_require__(1433);
 
 var _ui = __webpack_require__(1385);
 
 var _source2 = __webpack_require__(1356);
 
-var _location = __webpack_require__(1783);
+var _location = __webpack_require__(1782);
 
 var _createPrettySource = __webpack_require__(1523);
 
 var _loadSourceText = __webpack_require__(1435);
 
 var _prefs = __webpack_require__(226);
 
 var _editor = __webpack_require__(1358);
@@ -19083,17 +19084,17 @@ function selectSource(sourceId, tabIndex
   };
 }
 
 /**
  * @memberof actions/sources
  * @static
  */
 function selectLocation(location, tabIndex = "") {
-  return ({ dispatch, getState, client }) => {
+  return async ({ dispatch, getState, client }) => {
     if (!client) {
       // No connection, do nothing. This happens when the debugger is
       // shut down too fast and it tries to display a default source.
       return;
     }
 
     const source = (0, _selectors.getSource)(getState(), location.sourceId);
     if (!source) {
@@ -19103,31 +19104,30 @@ function selectLocation(location, tabInd
 
     const activeSearch = (0, _selectors.getActiveSearch)(getState());
     if (activeSearch !== "file") {
       dispatch((0, _ui.closeActiveSearch)());
     }
 
     dispatch(addTab(source.toJS(), 0));
 
-    return dispatch({
+    dispatch({
       type: "SELECT_SOURCE",
       source: source.toJS(),
       tabIndex,
-      location,
-      [_promise.PROMISE]: (async () => {
-        await dispatch((0, _loadSourceText.loadSourceText)(source));
-        dispatch((0, _ast.setOutOfScopeLocations)());
-        const src = (0, _selectors.getSource)(getState(), location.sourceId);
-        const { autoPrettyPrint } = _prefs.prefs;
-        if (autoPrettyPrint && (0, _source2.shouldPrettyPrint)(src) && (0, _source2.isMinified)(src)) {
-          await dispatch(togglePrettyPrint(src.get("id")));
-        }
-      })()
-    });
+      location
+    });
+
+    await dispatch((0, _loadSourceText.loadSourceText)(source));
+    dispatch((0, _ast.setOutOfScopeLocations)());
+    const src = (0, _selectors.getSource)(getState(), location.sourceId);
+    const { autoPrettyPrint } = _prefs.prefs;
+    if (autoPrettyPrint && (0, _source2.shouldPrettyPrint)(src) && (0, _source2.isMinified)(src)) {
+      await dispatch(togglePrettyPrint(src.get("id")));
+    }
   };
 }
 
 /**
  * @memberof actions/sources
  * @static
  */
 function jumpToMappedLocation(sourceLocation) {
@@ -20341,17 +20341,17 @@ function update(state = initialState(), 
           location,
           result,
           tokenPos,
           cursorPos,
           extra
         });
       }
 
-    case "RESUMED":
+    case "RESUME":
       {
         return state.set("outOfScopeLocations", null);
       }
 
     case "NAVIGATE":
       {
         return initialState();
       }
@@ -21878,17 +21878,17 @@ Object.defineProperty(exports, "__esModu
 });
 exports.setSourceMetaData = setSourceMetaData;
 exports.setSymbols = setSymbols;
 exports.setEmptyLines = setEmptyLines;
 exports.setOutOfScopeLocations = setOutOfScopeLocations;
 
 var _selectors = __webpack_require__(1352);
 
-var _setInScopeLines = __webpack_require__(1782);
+var _setInScopeLines = __webpack_require__(1781);
 
 var _parser = __webpack_require__(1365);
 
 function setSourceMetaData(sourceId) {
   return async ({ dispatch, getState }) => {
     const sourceRecord = (0, _selectors.getSource)(getState(), sourceId);
     if (!sourceRecord) {
       return;
@@ -22699,17 +22699,17 @@ var _react2 = _interopRequireDefault(_re
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _Svg = __webpack_require__(1359);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
-var _CommandBarButton = __webpack_require__(1765);
+var _CommandBarButton = __webpack_require__(1764);
 
 var _CommandBarButton2 = _interopRequireDefault(_CommandBarButton);
 
 __webpack_require__(1321);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class PaneToggleButton extends _react.Component {
@@ -23100,17 +23100,17 @@ module.exports = Grip;
 "use strict";
 
 
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 const React = __webpack_require__(0);
-const InlineSVG = __webpack_require__(1790);
+const InlineSVG = __webpack_require__(1789);
 
 const svg = {
   "arrow": __webpack_require__(1152),
   "open-inspector": __webpack_require__(1153)
 };
 
 Svg.propTypes = {
   className: React.PropTypes.string
@@ -23168,17 +23168,17 @@ module.exports = function defer() {
 
 "use strict";
 
 
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
-const { Menu, MenuItem } = __webpack_require__(1768);
+const { Menu, MenuItem } = __webpack_require__(1767);
 
 function inToolbox() {
   return window.parent.document.documentURI == "about:devtools-toolbox";
 }
 
 if (!inToolbox()) {
   __webpack_require__(1301);
 }
@@ -23696,17 +23696,16 @@ function update(state = initialState(), 
 
   return state;
 }
 
 function addBreakpoint(state, action) {
   if (action.status !== "done") {
     return state;
   }
-
   // when the action completes, we can commit the breakpoint
   const { value: { breakpoint } } = action;
   const locationId = (0, _breakpoint.makePendingLocationId)(breakpoint.location);
   const pendingBreakpoint = (0, _breakpoint.createPendingBreakpoint)(breakpoint);
 
   return state.setIn(["pendingBreakpoints", locationId], pendingBreakpoint);
 }
 
@@ -24216,17 +24215,18 @@ function InitialState() {
     results: I.List(),
     status: statusType.initial
   })();
 }
 
 function update(state = InitialState(), action) {
   switch (action.type) {
     case "ADD_QUERY":
-      return state.update("query", value => action.query);
+      const actionCopy = action;
+      return state.update("query", value => actionCopy.query);
 
     case "CLEAR_QUERY":
       return state.remove("query");
 
     case "ADD_SEARCH_RESULT":
       const results = state.get("results");
       return state.merge({ results: results.push(action.result) });
 
@@ -24909,32 +24909,36 @@ function loadSourceText(source) {
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.showLoading = exports.showSourceText = exports.updateDocument = exports.updateLineNumberFormat = exports.resetLineNumberFormat = exports.clearDocuments = exports.removeDocument = exports.setDocument = exports.getDocument = undefined;
+exports.showLoading = exports.showSourceText = exports.updateDocument = exports.updateLineNumberFormat = exports.resetLineNumberFormat = exports.clearDocuments = exports.removeDocument = exports.hasDocument = exports.setDocument = exports.getDocument = undefined;
 
 var _source = __webpack_require__(1356);
 
 var _wasm = __webpack_require__(1401);
 
 var _ui = __webpack_require__(1439);
 
 let sourceDocs = {}; /* This Source Code Form is subject to the terms of the Mozilla Public
                       * License, v. 2.0. If a copy of the MPL was not distributed with this
                       * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 
 function getDocument(key) {
   return sourceDocs[key];
 }
 
+function hasDocument(key) {
+  return !!getDocument(key);
+}
+
 function setDocument(key, doc) {
   sourceDocs[key] = doc;
 }
 
 function removeDocument(key) {
   delete sourceDocs[key];
 }
 
@@ -24955,29 +24959,30 @@ function updateLineNumberFormat(editor, 
   }
   const cm = editor.codeMirror;
   const lineNumberFormatter = (0, _wasm.getWasmLineNumberFormatter)(sourceId);
   cm.setOption("lineNumberFormatter", lineNumberFormatter);
   (0, _ui.resizeBreakpointGutter)(cm);
   (0, _ui.resizeToggleButton)(cm);
 }
 
-function updateDocument(editor, sourceId) {
-  if (!sourceId) {
+function updateDocument(editor, source) {
+  if (!source) {
     return;
   }
 
+  const sourceId = source.get("id");
   const doc = getDocument(sourceId) || editor.createDocument();
   editor.replaceDocument(doc);
 
   updateLineNumberFormat(editor, sourceId);
 }
 
 function showLoading(editor) {
-  if (getDocument("loading")) {
+  if (hasDocument("loading")) {
     return;
   }
 
   const doc = editor.createDocument();
   setDocument("loading", doc);
   editor.replaceDocument(doc);
   editor.setText(L10N.getStr("loadingText"));
   editor.setMode({ name: "text" });
@@ -24999,40 +25004,41 @@ function setEditorText(editor, source) {
  * Handle getting the source document or creating a new
  * document with the correct mode and text.
  */
 function showSourceText(editor, source, sourceMetaData) {
   if (!source) {
     return;
   }
 
-  let doc = getDocument(source.id);
-  if (editor.codeMirror.doc === doc) {
-    editor.setMode((0, _source.getMode)(source, sourceMetaData));
-    return;
-  }
-
-  if (doc) {
+  if (hasDocument(source.id)) {
+    const doc = getDocument(source.id);
+    if (editor.codeMirror.doc === doc) {
+      editor.setMode((0, _source.getMode)(source, sourceMetaData));
+      return;
+    }
+
     editor.replaceDocument(doc);
     updateLineNumberFormat(editor, source.id);
     editor.setMode((0, _source.getMode)(source, sourceMetaData));
     return doc;
   }
 
-  doc = editor.createDocument();
+  const doc = editor.createDocument();
   setDocument(source.id, doc);
   editor.replaceDocument(doc);
 
   setEditorText(editor, source);
   editor.setMode((0, _source.getMode)(source, sourceMetaData));
   updateLineNumberFormat(editor, source.id);
 }
 
 exports.getDocument = getDocument;
 exports.setDocument = setDocument;
+exports.hasDocument = hasDocument;
 exports.removeDocument = removeDocument;
 exports.clearDocuments = clearDocuments;
 exports.resetLineNumberFormat = resetLineNumberFormat;
 exports.updateLineNumberFormat = updateLineNumberFormat;
 exports.updateDocument = updateDocument;
 exports.showSourceText = showSourceText;
 exports.showLoading = showLoading;
 
@@ -27020,17 +27026,17 @@ var _reactDom2 = _interopRequireDefault(
 var _devtoolsLaunchpad = __webpack_require__(1362);
 
 var _devtoolsConfig = __webpack_require__(1355);
 
 var _client = __webpack_require__(1499);
 
 var _bootstrap = __webpack_require__(1430);
 
-var _sourceQueue = __webpack_require__(1762);
+var _sourceQueue = __webpack_require__(1795);
 
 var _sourceQueue2 = _interopRequireDefault(_sourceQueue);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 if (false) {
   window.Perf = require("react-addons-perf");
 } /* This Source Code Form is subject to the terms of the Mozilla Public
@@ -29296,17 +29302,17 @@ module.exports = connect(mapStateToProps
 
 "use strict";
 
 
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
-const { score } = __webpack_require__(1775);
+const { score } = __webpack_require__(1774);
 
 function getTabs(state) {
   let tabs = state.tabs.get("tabs");
   let filterString = getFilterString(state);
 
   if (filterString === "") {
     return tabs;
   }
@@ -29701,17 +29707,17 @@ module.exports = Sidebar;
 /***/ }),
 /* 1494 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 const React = __webpack_require__(0);
-const { default: InlineSVG } = __webpack_require__(1764);
+const { default: InlineSVG } = __webpack_require__(1763);
 const { isDevelopment } = __webpack_require__(1355);
 
 const svg = {
   rocket: __webpack_require__(1126)
 };
 
 function Svg({ name, className, onClick, "aria-label": ariaLabel }) {
   className = `${name} ${className || ""}`;
@@ -30687,33 +30693,34 @@ function isSelectedFrameVisible(state) {
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.clientEvents = exports.setupEvents = undefined;
 
 var _create = __webpack_require__(1428);
 
-var _sourceQueue = __webpack_require__(1762);
+var _sourceQueue = __webpack_require__(1795);
 
 var _sourceQueue2 = _interopRequireDefault(_sourceQueue);
 
 var _devtoolsConfig = __webpack_require__(1355);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 
 const CALL_STACK_PAGE_SIZE = 1000;
 
 let threadClient;
 let actions;
 let supportsWasm;
+let isInterrupted;
 
 function setupEvents(dependencies) {
   threadClient = dependencies.threadClient;
   actions = dependencies.actions;
   supportsWasm = dependencies.supportsWasm;
   _sourceQueue2.default.initialize({ actions, supportsWasm, createSource: _create.createSource });
 
   if (threadClient) {
@@ -30724,30 +30731,39 @@ function setupEvents(dependencies) {
 }
 
 async function paused(_, packet) {
   // If paused by an explicit interrupt, which are generated by the
   // slow script dialog and internal events such as setting
   // breakpoints, ignore the event.
   const { why } = packet;
   if (why.type === "interrupted" && !packet.why.onNext) {
+    isInterrupted = true;
     return;
   }
 
   // Eagerly fetch the frames
   const response = await threadClient.getFrames(0, CALL_STACK_PAGE_SIZE);
 
   if (why.type != "alreadyPaused") {
     const pause = (0, _create.createPause)(packet, response);
     _sourceQueue2.default.flush();
     actions.paused(pause);
   }
 }
 
 function resumed(_, packet) {
+  // NOTE: the client suppresses resumed events while interrupted
+  // to prevent unintentional behavior.
+  // see [client docs](../README.md#interrupted) for more information.
+  if (isInterrupted) {
+    isInterrupted = false;
+    return;
+  }
+
   actions.resumed(packet);
 }
 
 function newSource(_, { source }) {
   _sourceQueue2.default.queue(source);
 
   if ((0, _devtoolsConfig.isEnabled)("eventListeners")) {
     actions.fetchEventListeners();
@@ -32336,17 +32352,17 @@ Object.defineProperty(exports, "__esModu
 });
 exports.willNavigate = willNavigate;
 exports.navigate = navigate;
 exports.connect = connect;
 exports.navigated = navigated;
 
 var _editor = __webpack_require__(1358);
 
-var _sourceQueue = __webpack_require__(1762);
+var _sourceQueue = __webpack_require__(1795);
 
 var _sourceQueue2 = _interopRequireDefault(_sourceQueue);
 
 var _sources = __webpack_require__(1369);
 
 var _utils = __webpack_require__(1366);
 
 var _sources2 = __webpack_require__(1373);
@@ -32511,17 +32527,16 @@ function traverseResults(rev, editor) {
     if (query === "") {
       dispatch((0, _ui.setActiveSearch)("file"));
     }
 
     if (modifiers) {
       const matchedLocations = matches || [];
       const { ch, line } = rev ? (0, _editor.findPrev)(ctx, query, true, modifiers.toJS()) : (0, _editor.findNext)(ctx, query, true, modifiers.toJS());
 
-      console.log(line);
       dispatch(updateSearchResults(ch, line, matchedLocations));
     }
   };
 }
 
 function closeFileSearch(editor) {
   return ({ getState, dispatch }) => {
     const modifiers = (0, _selectors.getFileSearchModifiers)(getState());
@@ -33473,17 +33488,17 @@ TextSearch.contextTypes = {
 
 /***/ }),
 /* 1540 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
-var _svgInlineReact = __webpack_require__(1764);
+var _svgInlineReact = __webpack_require__(1763);
 
 var _svgInlineReact2 = _interopRequireDefault(_svgInlineReact);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 const React = __webpack_require__(0);
 
 const { isDevelopment } = __webpack_require__(1355);
@@ -33498,17 +33513,17 @@ const svg = {
   "column-breakpoint": __webpack_require__(998),
   "case-match": __webpack_require__(351),
   close: __webpack_require__(352),
   choo: __webpack_require__(1290),
   dojo: __webpack_require__(806),
   domain: __webpack_require__(353),
   file: __webpack_require__(354),
   folder: __webpack_require__(355),
-  function: __webpack_require__(1788),
+  function: __webpack_require__(1787),
   globe: __webpack_require__(356),
   jquery: __webpack_require__(999),
   underscore: __webpack_require__(1117),
   lodash: __webpack_require__(1118),
   ember: __webpack_require__(1119),
   vuejs: __webpack_require__(1174),
   "magnifying-glass": __webpack_require__(357),
   "arrow-up": __webpack_require__(919),
@@ -35227,16 +35242,20 @@ var _HitMarker2 = _interopRequireDefault
 var _CallSites = __webpack_require__(1591);
 
 var _CallSites2 = _interopRequireDefault(_CallSites);
 
 var _DebugLine = __webpack_require__(1593);
 
 var _DebugLine2 = _interopRequireDefault(_DebugLine);
 
+var _HighlightLine = __webpack_require__(1796);
+
+var _HighlightLine2 = _interopRequireDefault(_HighlightLine);
+
 var _EmptyLines = __webpack_require__(1594);
 
 var _EmptyLines2 = _interopRequireDefault(_EmptyLines);
 
 var _GutterMenu = __webpack_require__(1595);
 
 var _GutterMenu2 = _interopRequireDefault(_GutterMenu);
 
@@ -35253,24 +35272,28 @@ var _editor = __webpack_require__(1358);
 var _ui = __webpack_require__(1439);
 
 __webpack_require__(1332);
 
 __webpack_require__(1333);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-// Redux actions
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
 const cssVars = {
   searchbarHeight: "var(--editor-searchbar-height)",
   secondSearchbarHeight: "var(--editor-second-searchbar-height)",
   footerHeight: "var(--editor-footer-height)"
-}; /* This Source Code Form is subject to the terms of the Mozilla Public
-    * License, v. 2.0. If a copy of the MPL was not distributed with this
-    * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+};
+
+// Redux actions
+
 
 class Editor extends _react.PureComponent {
 
   constructor() {
     super();
 
     this.onToggleBreakpoint = (key, e) => {
       e.preventDefault();
@@ -35366,34 +35389,37 @@ class Editor extends _react.PureComponen
 
       return openConditionalPanel(line);
     };
 
     this.closeConditionalPanel = () => {
       return this.props.closeConditionalPanel();
     };
 
-    this.pendingJumpLocation = null;
-    this.lastJumpLine = null;
-
     this.state = {
       highlightedLineRange: null,
       editor: null
     };
   }
 
   componentWillReceiveProps(nextProps) {
     if (!this.state.editor) {
       return;
     }
 
     (0, _editor.resizeBreakpointGutter)(this.state.editor.codeMirror);
     (0, _ui.resizeToggleButton)(this.state.editor.codeMirror);
   }
 
+  componentWillUpdate(nextProps) {
+    this.setText(nextProps);
+    this.setSize(nextProps);
+    this.scrollToLocation(nextProps);
+  }
+
   setupEditor() {
     const editor = (0, _editor.createEditor)();
 
     // disables the default search shortcuts
 
     editor._initShortcuts = () => {};
 
     const node = _reactDom2.default.findDOMNode(this);
@@ -35437,80 +35463,45 @@ class Editor extends _react.PureComponen
 
     this.setState({ editor });
     return editor;
   }
 
   componentDidMount() {
     const editor = this.setupEditor();
 
-    const { selectedSource, selectedLocation } = this.props;
+    const { selectedSource } = this.props;
     const { shortcuts } = this.context;
 
     const searchAgainKey = L10N.getStr("sourceSearch.search.again.key2");
     const searchAgainPrevKey = L10N.getStr("sourceSearch.search.againPrev.key2");
 
     shortcuts.on(L10N.getStr("toggleBreakpoint.key"), this.onToggleBreakpoint);
     shortcuts.on(L10N.getStr("toggleCondPanel.key"), this.toggleConditionalPanel);
     shortcuts.on("Esc", this.onEscape);
     shortcuts.on(searchAgainPrevKey, this.onSearchAgain);
     shortcuts.on(searchAgainKey, this.onSearchAgain);
 
-    if (selectedLocation && !!selectedLocation.line) {
-      this.pendingJumpLocation = selectedLocation;
-    }
-
-    const sourceId = selectedSource ? selectedSource.get("id") : undefined;
-    (0, _editor.updateDocument)(editor, sourceId);
+    (0, _editor.updateDocument)(editor, selectedSource);
   }
 
   componentWillUnmount() {
     this.state.editor.destroy();
     this.setState({ editor: null });
 
     const searchAgainKey = L10N.getStr("sourceSearch.search.again.key2");
     const searchAgainPrevKey = L10N.getStr("sourceSearch.search.againPrev.key2");
     const shortcuts = this.context.shortcuts;
     shortcuts.off(L10N.getStr("toggleBreakpoint.key"));
     shortcuts.off(L10N.getStr("toggleCondPanel.key"));
     shortcuts.off(searchAgainPrevKey);
     shortcuts.off(searchAgainKey);
   }
 
-  componentWillUpdate(nextProps) {
-    this.setText(nextProps);
-    this.setSize(nextProps);
-  }
-
   componentDidUpdate(prevProps, prevState) {
-    // This is in `componentDidUpdate` so helper functions can expect
-    // `this.props` to be the current props. This lifecycle method is
-    // responsible for updating the editor annotations.
-    const { selectedLocation, selectedSource } = this.props;
-
-    // If the location is different and a new line is requested,
-    // update the pending jump line. Note that if jumping to a line in
-    // a source where the text hasn't been loaded yet, we will set the
-    // line here but not jump until rendering the actual source.
-
-    if (prevProps.selectedLocation !== selectedLocation) {
-      if (selectedLocation && selectedLocation.line != undefined) {
-        this.pendingJumpLocation = selectedLocation;
-      } else {
-        this.pendingJumpLocation = null;
-      }
-    }
-
-    // Only update and jump around in real source texts. This will
-    // keep the jump state around until the real source text is
-    // loaded.
-    if (selectedSource && (0, _source.isLoaded)(selectedSource)) {
-      this.highlightLine();
-    }
-
     // NOTE: when devtools are opened, the editor is not set when
     // the source loads so we need to wait until the editor is
     // set to update the text and size.
     if (!prevState.editor && this.state.editor) {
       this.setText(this.props);
       this.setSize(this.props);
     }
   }
@@ -35564,87 +35555,77 @@ class Editor extends _react.PureComponen
     const { selectedLocation, jumpToMappedLocation } = this.props;
 
     if (e.metaKey && e.altKey) {
       const sourceLocation = (0, _editor.getSourceLocationFromMouseEvent)(this.state.editor, selectedLocation, e);
       jumpToMappedLocation(sourceLocation);
     }
   }
 
-  // If the location has changed and a specific line is requested,
-  // move to that line and flash it.
-  highlightLine() {
-    const { selectedLocation, selectedFrame } = this.props;
-    if (!selectedLocation) {
-      return;
-    }
-
-    // Make sure to clean up after ourselves. Not only does this
-    // cancel any existing animation, but it avoids it from
-    // happening ever again (in case CodeMirror re-applies the
-    // class, etc).
-    if (this.lastJumpLine !== null) {
-      (0, _editor.clearLineClass)(this.state.editor.codeMirror, "highlight-line");
-    }
-
-    let line = null;
-    if (selectedLocation.line >= 0) {
-      line = this.scrollToPosition();
-    }
-
-    // We only want to do the flashing animation if it's not a debug
-    // line, which has it's own styling.
-    // Also, if it the first time the debugger is being loaded, we don't want
-    // to flash the previously saved selected line.
-    if (line !== null && this.lastJumpLine !== null && (!selectedFrame || selectedFrame.location.line !== line)) {
-      this.state.editor.codeMirror.addLineClass(line, "line", "highlight-line");
-    }
-
-    this.lastJumpLine = line;
-    this.pendingJumpLocation = null;
-  }
-
-  scrollToPosition() {
-    const { sourceId, line, column } = this.props.selectedLocation;
-    const editorLine = (0, _editor.toEditorLine)(sourceId, line);
-    (0, _editor.scrollToColumn)(this.state.editor.codeMirror, editorLine, column);
-    return editorLine;
+  shouldScrollToLocation(nextProps) {
+    const { selectedLocation, selectedSource } = this.props;
+    const { editor } = this.state;
+
+    if (!nextProps.selectedSource || !editor || !nextProps.selectedLocation) {
+      return false;
+    }
+
+    if (!(0, _source.isLoaded)(nextProps.selectedSource)) {
+      return false;
+    }
+
+    if (!nextProps.selectedLocation.line) {
+      return false;
+    }
+
+    const isFirstLoad = (!selectedSource || !(0, _source.isLoaded)(selectedSource)) && (0, _source.isLoaded)(nextProps.selectedSource);
+
+    const locationChanged = selectedLocation !== nextProps.selectedLocation;
+    return isFirstLoad || locationChanged;
+  }
+
+  scrollToLocation(nextProps) {
+    const { editor } = this.state;
+
+    if (this.shouldScrollToLocation(nextProps)) {
+      const { line, column } = (0, _editor.toEditorPosition)(nextProps.selectedLocation);
+      (0, _editor.scrollToColumn)(editor.codeMirror, line, column);
+    }
   }
 
   setSize(nextProps) {
     if (!this.state.editor) {
       return;
     }
 
     if (nextProps.startPanelSize !== this.props.startPanelSize || nextProps.endPanelSize !== this.props.endPanelSize) {
       this.state.editor.codeMirror.setSize();
     }
   }
 
   setText(props) {
     const { selectedSource, sourceMetaData } = props;
+
     if (!this.state.editor) {
       return;
     }
 
     if (!selectedSource) {
       return this.showMessage("");
     }
 
     if (!(0, _source.isLoaded)(selectedSource)) {
       return (0, _editor.showLoading)(this.state.editor);
     }
 
     if (selectedSource.get("error")) {
       return this.showMessage(selectedSource.get("error"));
     }
 
-    if (selectedSource) {
-      return (0, _editor.showSourceText)(this.state.editor, selectedSource.toJS(), sourceMetaData);
-    }
+    return (0, _editor.showSourceText)(this.state.editor, selectedSource.toJS(), sourceMetaData);
   }
 
   showMessage(msg) {
     const { editor } = this.state;
     if (!editor) {
       return;
     }
 
@@ -35680,27 +35661,28 @@ class Editor extends _react.PureComponen
     return hitCount.filter(marker => marker.get("count") > 0).map(marker => _react2.default.createElement(_HitMarker2.default, {
       key: marker.get("line"),
       hitData: marker.toJS(),
       editor: this.state.editor.codeMirror
     }));
   }
 
   renderItems() {
-    const { selectedSource, horizontal } = this.props;
+    const { horizontal, selectedSource } = this.props;
     const { editor } = this.state;
 
-    if (!editor || !selectedSource || !(0, _source.isLoaded)(selectedSource)) {
+    if (!editor || !selectedSource) {
       return null;
     }
 
     return _react2.default.createElement(
       "div",
       null,
-      _react2.default.createElement(_DebugLine2.default, { editor: editor }),
+      _react2.default.createElement(_DebugLine2.default, null),
+      _react2.default.createElement(_HighlightLine2.default, null),
       _react2.default.createElement(_EmptyLines2.default, { editor: editor }),
       _react2.default.createElement(_Breakpoints2.default, { editor: editor }),
       _react2.default.createElement(_Preview2.default, { editor: editor }),
       ";",
       _react2.default.createElement(_Footer2.default, { editor: editor, horizontal: horizontal }),
       _react2.default.createElement(_HighlightLines2.default, { editor: editor }),
       _react2.default.createElement(_EditorMenu2.default, { editor: editor }),
       _react2.default.createElement(_GutterMenu2.default, { editor: editor }),
@@ -35747,17 +35729,16 @@ Editor.contextTypes = {
 const mapStateToProps = state => {
   const selectedSource = (0, _selectors.getSelectedSource)(state);
   const sourceId = selectedSource ? selectedSource.get("id") : "";
   return {
     selectedLocation: (0, _selectors.getSelectedLocation)(state),
     selectedSource,
     searchOn: (0, _selectors.getActiveSearch)(state) === "file",
     hitCount: (0, _selectors.getHitCountForSource)(state, sourceId),
-    selectedFrame: (0, _selectors.getSelectedFrame)(state),
     coverageOn: (0, _selectors.getCoverageEnabled)(state),
     conditionalPanelLine: (0, _selectors.getConditionalPanelLine)(state),
     sourceMetaData: (0, _selectors.getSourceMetaData)(state, sourceId)
   };
 };
 
 exports.default = (0, _reactRedux.connect)(mapStateToProps, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(Editor);
 
@@ -35967,17 +35948,17 @@ class SourceFooter extends _react.PureCo
       this.renderSourceSummary(),
       this.renderToggleButton()
     );
   }
 }
 
 exports.default = (0, _reactRedux.connect)(state => {
   const selectedSource = (0, _selectors.getSelectedSource)(state);
-  const selectedId = selectedSource && selectedSource.get("id");
+  const selectedId = selectedSource.get("id");
   const source = selectedSource.toJS();
   return {
     selectedSource,
     mappedSource: (0, _sources.getGeneratedSource)(state, source),
     prettySource: (0, _selectors.getPrettySource)(state, selectedId),
     endPanelCollapsed: (0, _selectors.getPaneCollapse)(state, "end")
   };
 }, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(SourceFooter);
@@ -40021,112 +40002,103 @@ Object.defineProperty(exports, "__esModu
   value: true
 });
 exports.DebugLine = undefined;
 
 var _react = __webpack_require__(0);
 
 var _editor = __webpack_require__(1358);
 
-var _sourceDocuments = __webpack_require__(1436);
+var _source = __webpack_require__(1356);
 
 var _reactRedux = __webpack_require__(1189);
 
 var _selectors = __webpack_require__(1352);
 
+function isException(pauseInfo) {
+  return pauseInfo && pauseInfo.why.type === "exception";
+} /* This Source Code Form is subject to the terms of the Mozilla Public
+   * License, v. 2.0. If a copy of the MPL was not distributed with this
+   * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+function isDocumentReady(selectedSource, selectedFrame) {
+  return selectedFrame && (0, _source.isLoaded)(selectedSource) && (0, _editor.hasDocument)(selectedFrame.location.sourceId);
+}
+
 class DebugLine extends _react.Component {
-  constructor() {
-    super();
-    this.state = { debugExpression: { clear: () => {} } };
+
+  componentDidUpdate(prevProps) {
+    const { pauseInfo, selectedFrame, selectedSource } = this.props;
+    this.setDebugLine(pauseInfo, selectedFrame, selectedSource);
+  }
+
+  componentWillUpdate() {
+    const { pauseInfo, selectedFrame, selectedSource } = this.props;
+    this.clearDebugLine(selectedFrame, selectedSource, pauseInfo);
   }
 
   componentDidMount() {
-    this.setDebugLine(this.props.pauseInfo, this.props.selectedFrame, this.props.editor);
-  }
-
-  componentWillReceiveProps(nextProps) {
-    this.clearDebugLine(this.props.selectedFrame, this.props.editor);
-    this.setDebugLine(nextProps.pauseInfo, nextProps.selectedFrame, nextProps.editor);
-  }
-
-  componentWillUnmount() {
-    this.clearDebugLine(this.props.selectedFrame, this.props.editor);
-  }
-
-  setDebugLine(pauseInfo, selectedFrame, editor) {
-    if (!selectedFrame) {
-      return;
+    const { pauseInfo, selectedFrame, selectedSource } = this.props;
+    this.setDebugLine(pauseInfo, selectedFrame, selectedSource);
+  }
+
+  setDebugLine(pauseInfo, selectedFrame, selectedSource) {
+    if (!isDocumentReady(selectedSource, selectedFrame)) {
+      return;
+    }
+    const sourceId = selectedFrame.location.sourceId;
+    const doc = (0, _editor.getDocument)(sourceId);
+
+    const { line, column } = (0, _editor.toEditorPosition)(selectedFrame.location);
+    const { markTextClass, lineClass } = this.getTextClasses(pauseInfo);
+    doc.addLineClass(line, "line", lineClass);
+
+    this.debugExpression = doc.markText({ ch: column, line }, { ch: null, line }, { className: markTextClass });
+  }
+
+  clearDebugLine(selectedFrame, selectedSource, pause) {
+    if (!isDocumentReady(selectedSource, selectedFrame)) {
+      return;
+    }
+
+    if (this.debugExpression) {
+      this.debugExpression.clear();
     }
 
     const sourceId = selectedFrame.location.sourceId;
-    const doc = (0, _sourceDocuments.getDocument)(sourceId);
-    if (!doc) {
-      return;
-    }
-
-    const { line, column } = (0, _editor.toEditorPosition)(sourceId, selectedFrame.location);
-
-    // make sure the line is visible
-    if (editor && editor.alignLine) {
-      editor.alignLine(line);
-    }
-
-    const { markTextClass, lineClass } = this.getTextClasses(pauseInfo);
-    doc.addLineClass(line, "line", lineClass);
-
-    const debugExpression = (0, _editor.markText)(editor, markTextClass, {
-      start: { line, column },
-      end: { line, column: null }
-    });
-    this.setState({ debugExpression });
-  }
-
-  clearDebugLine(selectedFrame, editor) {
-    if (!selectedFrame) {
-      return;
-    }
-    const { line, sourceId } = selectedFrame.location;
-    const { debugExpression } = this.state;
-    if (debugExpression) {
-      debugExpression.clear();
-    }
-
-    const editorLine = line - 1;
-    const doc = (0, _sourceDocuments.getDocument)(sourceId);
-    if (!doc) {
-      return;
-    }
-
-    doc.removeLineClass(editorLine, "line", "new-debug-line");
-    doc.removeLineClass(editorLine, "line", "new-debug-line-error");
-  }
-
-  getTextClasses(pauseInfo) {
-    if (pauseInfo && pauseInfo.why.type === "exception") {
+    const { line } = (0, _editor.toEditorPosition)(selectedFrame.location);
+    const doc = (0, _editor.getDocument)(sourceId);
+    const { lineClass } = this.getTextClasses(pause);
+    doc.removeLineClass(line, "line", lineClass);
+  }
+
+  getTextClasses(pause) {
+    if (isException(pause)) {
       return {
         markTextClass: "debug-expression-error",
         lineClass: "new-debug-line-error"
       };
     }
+
     return { markTextClass: "debug-expression", lineClass: "new-debug-line" };
   }
 
   render() {
     return null;
   }
 }
 
-exports.DebugLine = DebugLine; /* This Source Code Form is subject to the terms of the Mozilla Public
-                                * License, v. 2.0. If a copy of the MPL was not distributed with this
-                                * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
-
-exports.default = (0, _reactRedux.connect)(state => ({
-  selectedFrame: (0, _selectors.getVisibleSelectedFrame)(state),
-  pauseInfo: (0, _selectors.getPause)(state)
-}))(DebugLine);
+exports.DebugLine = DebugLine;
+exports.default = (0, _reactRedux.connect)(state => {
+  return {
+    selectedFrame: (0, _selectors.getVisibleSelectedFrame)(state),
+    selectedSource: (0, _selectors.getSelectedSource)(state),
+    pauseInfo: (0, _selectors.getPause)(state)
+  };
+})(DebugLine);
 
 /***/ }),
 /* 1594 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
@@ -40898,17 +40870,17 @@ var _Accordion2 = _interopRequireDefault
 var _CommandBar = __webpack_require__(1608);
 
 var _CommandBar2 = _interopRequireDefault(_CommandBar);
 
 var _UtilsBar = __webpack_require__(1609);
 
 var _UtilsBar2 = _interopRequireDefault(_UtilsBar);
 
-var _BreakpointsDropdown = __webpack_require__(1791);
+var _BreakpointsDropdown = __webpack_require__(1790);
 
 var _BreakpointsDropdown2 = _interopRequireDefault(_BreakpointsDropdown);
 
 var _ChromeScopes = __webpack_require__(1610);
 
 var _ChromeScopes2 = _interopRequireDefault(_ChromeScopes);
 
 var _Scopes2 = __webpack_require__(1611);
@@ -40979,17 +40951,16 @@ class SecondaryPanes extends _react.Comp
     return [debugBtn(evt => {
       evt.stopPropagation();
       this.props.evaluateExpressions();
     }, "refresh", "refresh", L10N.getStr("watchExpressions.refreshButton"))];
   }
 
   getScopeItem() {
     const isPaused = () => !!this.props.pauseData;
-
     return {
       header: L10N.getStr("scopes.header"),
       className: "scopes-pane",
       component: Scopes,
       opened: _prefs.prefs.scopesVisible,
       onToggle: opened => {
         _prefs.prefs.scopesVisible = opened;
       },
@@ -42489,17 +42460,17 @@ var _prefs = __webpack_require__(226);
 var _selectors = __webpack_require__(1352);
 
 var _text = __webpack_require__(1387);
 
 var _actions = __webpack_require__(1354);
 
 var _actions2 = _interopRequireDefault(_actions);
 
-var _CommandBarButton = __webpack_require__(1765);
+var _CommandBarButton = __webpack_require__(1764);
 
 var _CommandBarButton2 = _interopRequireDefault(_CommandBarButton);
 
 __webpack_require__(1295);
 
 var _devtoolsModules = __webpack_require__(1376);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -43008,17 +42979,17 @@ var _redux = __webpack_require__(3);
 var _reactRedux = __webpack_require__(1189);
 
 var _actions = __webpack_require__(1354);
 
 var _actions2 = _interopRequireDefault(_actions);
 
 var _selectors = __webpack_require__(1352);
 
-var _scopes = __webpack_require__(1793);
+var _scopes = __webpack_require__(1792);
 
 var _devtoolsReps = __webpack_require__(1408);
 
 __webpack_require__(1296);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 /* This Source Code Form is subject to the terms of the Mozilla Public
@@ -45011,17 +44982,17 @@ var _selectors = __webpack_require__(135
 var _prefs = __webpack_require__(226);
 
 var _devtoolsSourceMap = __webpack_require__(1360);
 
 var _loadSourceText = __webpack_require__(1435);
 
 var _parser = __webpack_require__(1365);
 
-var _updateScopeBindings = __webpack_require__(1785);
+var _updateScopeBindings = __webpack_require__(1784);
 
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 
 function mapScopes(scopes, frame) {
   return async function ({ dispatch, getState, client, sourceMaps }) {
     const mappedScopes = await (0, _updateScopeBindings.updateScopeBindings)(scopes, frame.generatedLocation, frame.location, {
@@ -45838,17 +45809,17 @@ module.exports = "<!-- This Source Code 
 
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 var EventEmitter = function EventEmitter() {};
 module.exports = EventEmitter;
 
-const promise = __webpack_require__(1770);
+const promise = __webpack_require__(1769);
 
 /**
  * Decorate an object with event emitter functionality.
  *
  * @param Object aObjectToDecorate
  *        Bind all public methods of EventEmitter to
  *        the aObjectToDecorate object.
  */
@@ -46416,59 +46387,16 @@ EventEmitter.prototype = {
 
 /***/ }),
 /* 1762 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _lodash = __webpack_require__(2);
-
-let newSources;
-let createSource;
-let queuedSources;
-let supportsWasm = false;
-
-const queue = (0, _lodash.throttle)(() => {
-  if (!newSources || !createSource) {
-    return;
-  }
-  newSources(queuedSources.map(source => {
-    return createSource(source, { supportsWasm });
-  }));
-  queuedSources = [];
-}, 100);
-
-exports.default = {
-  initialize: options => {
-    newSources = options.actions.newSources;
-    createSource = options.createSource;
-    supportsWasm = options.supportsWasm;
-    queuedSources = [];
-  },
-  queue: source => {
-    queuedSources.push(source);
-    queue();
-  },
-  flush: () => queue.flush(),
-  clear: () => queue.cancel()
-};
-
-/***/ }),
-/* 1763 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
 (function () {
   var Query, coreChars, countDir, getCharCodes, getExtension, opt_char_re, truncatedUpperCase, _ref;
 
   _ref = __webpack_require__(1761), countDir = _ref.countDir, getExtension = _ref.getExtension;
 
   module.exports = Query = function () {
     function Query(query, _arg) {
       var optCharRegEx, pathSeparator, _ref1;
@@ -46516,17 +46444,17 @@ exports.default = {
     while (++i < len) {
       charCodes[str.charCodeAt(i)] = true;
     }
     return charCodes;
   };
 }).call(undefined);
 
 /***/ }),
-/* 1764 */
+/* 1763 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
     value: true
 });
@@ -46536,17 +46464,17 @@ var _extends = Object.assign || function
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
 
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _propTypes = __webpack_require__(20);
 
-var _util = __webpack_require__(1778);
+var _util = __webpack_require__(1777);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
 
 function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
 
 function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
@@ -46614,17 +46542,17 @@ InlineSVG.defaultProps = {
 
 InlineSVG.propTypes = {
     src: _propTypes.string.isRequired,
     element: _propTypes.string,
     raw: _propTypes.bool
 };
 
 /***/ }),
-/* 1765 */
+/* 1764 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
@@ -46634,17 +46562,17 @@ var _extends = Object.assign || function
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
-__webpack_require__(1789);
+__webpack_require__(1788);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
 
 const CommandBarButton = props => {
   const { children, className, pressed = false } = props,
         rest = _objectWithoutProperties(props, ["children", "className", "pressed"]);
@@ -46657,17 +46585,17 @@ const CommandBarButton = props => {
     }, rest),
     children
   );
 };
 
 exports.default = CommandBarButton;
 
 /***/ }),
-/* 1766 */
+/* 1765 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
@@ -46728,17 +46656,17 @@ function getBindingVariables(bindings, p
       name,
       path: `${parentName}/${name}`,
       contents
     };
   });
 }
 
 /***/ }),
-/* 1767 */
+/* 1766 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
@@ -46791,46 +46719,46 @@ function getThisVariable(frame, path) {
   return {
     name: "<this>",
     path: `${path}/<this>`,
     contents: { value: this_ }
   };
 }
 
 /***/ }),
-/* 1768 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-const Menu = __webpack_require__(1769);
-const MenuItem = __webpack_require__(1771);
-const { PrefsHelper } = __webpack_require__(1772);
+/* 1767 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+const Menu = __webpack_require__(1768);
+const MenuItem = __webpack_require__(1770);
+const { PrefsHelper } = __webpack_require__(1771);
 const Services = __webpack_require__(22);
-const KeyShortcuts = __webpack_require__(1773);
-const { ZoomKeys } = __webpack_require__(1774);
+const KeyShortcuts = __webpack_require__(1772);
+const { ZoomKeys } = __webpack_require__(1773);
 const EventEmitter = __webpack_require__(1759);
 
 module.exports = {
   KeyShortcuts,
   Menu,
   MenuItem,
   PrefsHelper,
   Services,
   ZoomKeys,
   EventEmitter
 };
 
 /***/ }),
-/* 1769 */
+/* 1768 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
@@ -47014,17 +46942,17 @@ Menu.sendActionToFirstResponder = () => 
 
 Menu.buildFromTemplate = () => {
   throw Error("Not implemented");
 };
 
 module.exports = Menu;
 
 /***/ }),
-/* 1770 */
+/* 1769 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
@@ -47051,17 +46979,17 @@ p.defer = function defer() {
     reject: reject,
     promise: promise
   };
 };
 
 module.exports = p;
 
 /***/ }),
-/* 1771 */
+/* 1770 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
@@ -47120,17 +47048,17 @@ function MenuItem({
   this.submenu = submenu;
   this.type = type;
   this.visible = visible;
 }
 
 module.exports = MenuItem;
 
 /***/ }),
-/* 1772 */
+/* 1771 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
@@ -47308,17 +47236,17 @@ function makeObserver(self, cache, prefs
       self.emit("pref-changed", accessorName, self[accessorName]);
     }
   };
 }
 
 exports.PrefsHelper = PrefsHelper;
 
 /***/ }),
-/* 1773 */
+/* 1772 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
@@ -47555,17 +47483,17 @@ KeyShortcuts.prototype = {
 
   off(key, listener) {
     this.eventEmitter.off(key, listener);
   }
 };
 module.exports = KeyShortcuts;
 
 /***/ }),
-/* 1774 */
+/* 1773 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 
@@ -47575,34 +47503,34 @@ module.exports = KeyShortcuts;
  *
  * Based on nsIMarkupDocumentViewer.fullZoom API
  * https://developer.mozilla.org/en-US/Firefox/Releases/3/Full_page_zoom
  */
 
 exports.register = function (window) {};
 
 /***/ }),
-/* 1775 */
+/* 1774 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 /* WEBPACK VAR INJECTION */(function(process) {
 
 (function () {
   var Query, defaultPathSeparator, filter, matcher, parseOptions, pathScorer, preparedQueryCache, scorer;
 
-  filter = __webpack_require__(1776);
-
-  matcher = __webpack_require__(1777);
+  filter = __webpack_require__(1775);
+
+  matcher = __webpack_require__(1776);
 
   scorer = __webpack_require__(1760);
 
   pathScorer = __webpack_require__(1761);
 
-  Query = __webpack_require__(1763);
+  Query = __webpack_require__(1762);
 
   preparedQueryCache = null;
 
   defaultPathSeparator = (typeof process !== "undefined" && process !== null ? process.platform : void 0) === "win32" ? '\\' : '/';
 
   module.exports = {
     filter: function (candidates, query, options) {
       if (options == null) {
@@ -47696,30 +47624,30 @@ exports.register = function (window) {};
       options.preparedQuery = preparedQueryCache && preparedQueryCache.query === query ? preparedQueryCache : preparedQueryCache = new Query(query, options);
     }
     return options;
   };
 }).call(undefined);
 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(120)))
 
 /***/ }),
-/* 1776 */
+/* 1775 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 (function () {
   var Query, pathScorer, pluckCandidates, scorer, sortCandidates;
 
   scorer = __webpack_require__(1760);
 
   pathScorer = __webpack_require__(1761);
 
-  Query = __webpack_require__(1763);
+  Query = __webpack_require__(1762);
 
   pluckCandidates = function (a) {
     return a.candidate;
   };
 
   sortCandidates = function (a, b) {
     return b.score - a.score;
   };
@@ -47753,17 +47681,17 @@ exports.register = function (window) {};
     if (maxResults != null) {
       candidates = candidates.slice(0, maxResults);
     }
     return candidates;
   };
 }).call(undefined);
 
 /***/ }),
-/* 1777 */
+/* 1776 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 (function () {
   var basenameMatch, computeMatch, isMatch, isWordStart, match, mergeMatches, scoreAcronyms, scoreCharacter, scoreConsecutives, _ref;
 
@@ -47975,17 +47903,17 @@ exports.register = function (window) {};
       }
     }
     matches.reverse();
     return matches;
   };
 }).call(undefined);
 
 /***/ }),
-/* 1778 */
+/* 1777 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
     value: true
 });
@@ -48030,17 +47958,17 @@ function getSVGFromSource(src) {
 
 // get <svg /> element props
 function extractSVGProps(src) {
     var map = getSVGFromSource(src).attributes;
     return map.length > 0 ? serializeAttrs(map) : null;
 }
 
 /***/ }),
-/* 1779 */
+/* 1778 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
@@ -48093,17 +48021,17 @@ function isMinified(source) {
 
   const minified = indentCount / lines * 100 < INDENT_COUNT_THRESHOLD || overCharLimit;
 
   _minifiedCache.set(source.id, minified);
   return minified;
 }
 
 /***/ }),
-/* 1780 */
+/* 1779 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
@@ -48154,55 +48082,59 @@ function getCallStackFrames(state) {
   const selectedSource = (0, _sources.getSelectedSource)(state);
   const sources = (0, _sources.getSources)(state);
   const frames = (0, _pause.getFrames)(state);
 
   return formatCallStackFrames(frames, sources, selectedSource);
 }
 
 /***/ }),
-/* 1781 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = getVisibleSelectedFrame;
+/* 1780 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
 
 var _sources = __webpack_require__(1369);
 
 var _pause = __webpack_require__(1394);
 
 var _devtoolsSourceMap = __webpack_require__(1360);
 
-function getLocation(frame, isGeneratedSource) {
-  return isGeneratedSource ? frame.generatedLocation || frame.location : frame.location;
-} /* This Source Code Form is subject to the terms of the Mozilla Public
-   * License, v. 2.0. If a copy of the MPL was not distributed with this
-   * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
-
-function getVisibleSelectedFrame(state) {
-  const selectedLocation = (0, _sources.getSelectedLocation)(state);
-  const isGeneratedSource = !(0, _devtoolsSourceMap.isOriginalId)(selectedLocation.sourceId);
-  const selectedFrame = (0, _pause.getSelectedFrame)(state);
-
-  if (!selectedFrame) {
-    return;
-  }
-
-  return {
-    location: getLocation(selectedFrame, isGeneratedSource)
-  };
-}
-
-/***/ }),
-/* 1782 */
+var _reselect = __webpack_require__(993);
+
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+function getLocation(frame, location) {
+  return !(0, _devtoolsSourceMap.isOriginalId)(location.sourceId) ? frame.generatedLocation || frame.location : frame.location;
+}
+
+const getVisibleSelectedFrame = (0, _reselect.createSelector)(_sources.getSelectedLocation, _pause.getSelectedFrame, (selectedLocation, selectedFrame) => {
+  if (!selectedFrame || !selectedLocation) {
+    return null;
+  }
+
+  const { id } = selectedFrame;
+
+  return {
+    id,
+    location: getLocation(selectedFrame, selectedLocation)
+  };
+});
+
+exports.default = getVisibleSelectedFrame;
+
+/***/ }),
+/* 1781 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
@@ -48245,17 +48177,17 @@ function setInScopeLines() {
     dispatch({
       type: "IN_SCOPE_LINES",
       lines: inScopeLines
     });
   };
 }
 
 /***/ }),
-/* 1783 */
+/* 1782 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
@@ -48270,17 +48202,17 @@ function createLocation({
     sourceId,
     line,
     column,
     sourceUrl: sourceUrl || null
   };
 }
 
 /***/ }),
-/* 1784 */
+/* 1783 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
@@ -48298,17 +48230,17 @@ function getTokenLocation(codeMirror, to
 
   return {
     line: line + 1,
     column: ch
   };
 }
 
 /***/ }),
-/* 1785 */
+/* 1784 */
 /***/ (function(module, exports, __webpack_require__) {
 
 let updateScopeBindings = (() => {
   var _ref = _asyncToGenerator(function* (scope, location, originalLocation, scopesDataSource) {
     const generatedScopes = yield scopesDataSource.getSourceMapsScopes(location);
     if (!generatedScopes) {
       return scope;
     }
@@ -48323,17 +48255,17 @@ let updateScopeBindings = (() => {
 })();
 
 function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
 
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
-const { remapScopes } = __webpack_require__(1786);
+const { remapScopes } = __webpack_require__(1785);
 
 function extendScope(scope, generatedScopes, index, remapedScopes, remapedScopesIndex) {
   if (!scope) {
     return undefined;
   }
   if (index >= generatedScopes.length) {
     return scope;
   }
@@ -48361,17 +48293,17 @@ function extendScope(scope, generatedSco
   });
 }
 
 module.exports = {
   updateScopeBindings
 };
 
 /***/ }),
-/* 1786 */
+/* 1785 */
 /***/ (function(module, exports) {
 
 
 
 // Chunk split source scopes on function/closure boundary
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
@@ -48444,17 +48376,17 @@ function remapScopes(scopes, generatedSc
   return assigned;
 }
 
 module.exports = {
   remapScopes
 };
 
 /***/ }),
-/* 1787 */
+/* 1786 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
@@ -48470,16 +48402,18 @@ var _ast = __webpack_require__(1638);
 var _editor = __webpack_require__(1358);
 
 var _devtoolsSourceMap = __webpack_require__(1360);
 
 var _promise = __webpack_require__(1653);
 
 var _selectors = __webpack_require__(1352);
 
+var _expressions = __webpack_require__(1398);
+
 var _lodash = __webpack_require__(2);
 
 const extraProps = {
   react: { displayName: "this._reactInternalInstance.getName()" },
   immutable: {
     isImmutable: exp => `Immutable.Iterable.isIterable(${exp})`,
     entries: exp => `${exp}.toJS()`,
     type: exp => `${exp}.constructor.name`
@@ -48501,17 +48435,19 @@ function updatePreview(target, editor) {
 
       // We are mousing over a new token that is not in the preview
       if (!target.classList.contains("debug-expression")) {
         dispatch(clearPreview());
       }
     }
 
     const source = (0, _selectors.getSelectedSource)(getState());
-    if ((0, _selectors.getSymbols)(getState(), source.toJS()).functions.length == 0) {
+
+    const symbols = (0, _selectors.getSymbols)(getState(), source.toJS());
+    if (symbols.functions.length == 0) {
       return;
     }
 
     const invalidToken = tokenText === "" || tokenText.match(/[(){}\|&%,.;=<>\+-/\*\s]/);
 
     const invalidTarget = target.parentElement && !target.parentElement.closest(".CodeMirror-line") || cursorPos.top == 0;
 
     const isUpdating = preview && preview.updating;
@@ -48555,17 +48491,17 @@ function setPreview(token, tokenPos, cur
         if (!expression) {
           return;
         }
 
         const sourceId = source.get("id");
         if (location && !(0, _devtoolsSourceMap.isGeneratedId)(sourceId)) {
           const generatedLocation = await sourceMaps.getGeneratedLocation(_extends({}, location.start, { sourceId }), source.toJS());
 
-          expression = await (0, _selectors.getMappedExpression)({ sourceMaps }, generatedLocation, expression);
+          expression = await (0, _expressions.getMappedExpression)({ sourceMaps }, generatedLocation, expression);
         }
 
         const selectedFrame = (0, _selectors.getSelectedFrame)(getState());
         const { result } = await client.evaluate(expression, {
           frameId: selectedFrame.id
         });
 
         const reactDisplayName = await client.evaluate(extraProps.react.displayName, {
@@ -48623,29 +48559,29 @@ function clearPreview() {
 
     return dispatch({
       type: "CLEAR_SELECTION"
     });
   };
 }
 
 /***/ }),
-/* 1788 */
+/* 1787 */
 /***/ (function(module, exports) {
 
 module.exports = "<!-- This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --><svg viewBox=\"0 0 9 15\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><title>Group 2</title><desc>Created with Sketch.</desc><g id=\"Symbols\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\"><g id=\"Group-2\" transform=\"translate(-3.000000, 0.000000)\" fill-rule=\"nonzero\" fill=\"#000000\"><g transform=\"translate(2.000000, 0.000000)\" id=\"path10\"><path d=\"M8.66478978,0.152329483 L6.24859226,7.23234215 L6.24859226,7.23234215 C6.22451137,7.30290469 6.14778771,7.34058551 6.07722517,7.31650462 C6.0437665,7.30508617 6.01612208,7.2809984 6.00023206,7.24941723 L2.49196511,0.276788279 L2.49196511,0.276788279 C2.4537519,0.200840088 2.3759926,0.152917255 2.29097274,0.152917255 L1.08420686,0.152917255 L1.08420686,0.152917255 C1.02897839,0.152917255 0.984206865,0.19768878 0.984206865,0.252917255 C0.984206865,0.268916365 0.988045664,0.284681937 0.99540091,0.2988901 L5.47310495,8.94849143 L5.47310495,8.94849143 C5.53346173,9.06508289 5.54553974,9.2007357 5.50673082,9.3261565 L4.0917648,13.8989752 L4.0917648,13.8989752 C4.06260539,13.9932111 3.97546399,14.0574648 3.87681975,14.0574648 L1.45804052,14.0574648 L1.45804052,14.0574648 C1.33377645,14.0574648 1.23304051,14.1582007 1.23304051,14.2824648 L1.23304051,14.775 L1.23304051,14.775 C1.23304051,14.8992641 1.33377645,15 1.45804052,15 L4.50020953,15 L4.50020953,15 C4.71271509,15 4.90200445,14.8656767 4.97216898,14.6650887 L10.0088745,0.266035474 L10.0088745,0.266035474 C10.0453448,0.161773071 9.99038856,0.0476866038 9.88612615,0.0112162185 C9.86490135,0.00379190571 9.84257651,2.78889645e-14 9.82009068,2.5895952e-14 L8.87773108,-4.83289971e-14 L8.87773108,-4.79061235e-14 C8.78147405,-5.47279145e-14 8.69587888,0.061231278 8.66478978,0.152329483 Z\" transform=\"translate(5.502176, 7.500000) scale(1, -1) translate(-5.502176, -7.500000) \"></path></g></g></g></svg>"
 
 /***/ }),
+/* 1788 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
 /* 1789 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1790 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, '__esModule', {
     value: true
 });
@@ -48836,17 +48772,17 @@ var InlineSVG = function (_React$Compone
 
     return InlineSVG;
 }(_react2['default'].Component);
 
 exports['default'] = InlineSVG;
 module.exports = exports['default'];
 
 /***/ }),
-/* 1791 */
+/* 1790 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
@@ -48863,17 +48799,17 @@ var _Svg2 = _interopRequireDefault(_Svg)
 var _Dropdown = __webpack_require__(1615);
 
 var _Dropdown2 = _interopRequireDefault(_Dropdown);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
-__webpack_require__(1792);
+__webpack_require__(1791);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 function renderPause(isWaitingOnBreak) {
   const active = isWaitingOnBreak;
   return _react2.default.createElement(
     "div",
     {
@@ -48997,36 +48933,36 @@ function renderBreakpointsDropdown(break
           inactive: !active
         })
       })
     })
   );
 }
 
 /***/ }),
+/* 1791 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
 /* 1792 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ }),
-/* 1793 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.getScopes = getScopes;
 
-var _synthesizeScopes = __webpack_require__(1794);
-
-var _getScope = __webpack_require__(1795);
+var _synthesizeScopes = __webpack_require__(1793);
+
+var _getScope = __webpack_require__(1794);
 
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 
 function getScopes(pauseInfo, selectedFrame, frameScopes) {
   if (!pauseInfo || !selectedFrame) {
     return null;
@@ -49067,32 +49003,32 @@ function getScopes(pauseInfo, selectedFr
     }
     scope = scope.parent;
   }
 
   return scopes;
 }
 
 /***/ }),
-/* 1794 */
+/* 1793 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.synthesizeScopes = synthesizeScopes;
 
-var _getVariables = __webpack_require__(1766);
+var _getVariables = __webpack_require__(1765);
 
 var _frame = __webpack_require__(1380);
 
-var _utils = __webpack_require__(1767);
+var _utils = __webpack_require__(1766);
 
 function getSynteticScopeTitle(type, generatedScopes) {
   if (type === "function") {
     // FIXME Use original function name here
     const lastGeneratedScope = generatedScopes[generatedScopes.length - 1];
     const isLastGeneratedScopeFn = lastGeneratedScope && lastGeneratedScope.type === "function";
     return isLastGeneratedScopeFn && lastGeneratedScope.function.displayName ? (0, _frame.simplifyDisplayName)(lastGeneratedScope.function.displayName) : L10N.getStr("anonymous");
   }
@@ -49212,35 +49148,35 @@ function synthesizeScopes(scope, selecte
         contents: bindings
       });
     }
     return result;
   }, []);
 }
 
 /***/ }),
-/* 1795 */
+/* 1794 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; /* This Source Code Form is subject to the terms of the Mozilla Public
                                                                                                                                                                                                                                                                    * License, v. 2.0. If a copy of the MPL was not distributed with this
                                                                                                                                                                                                                                                                    * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 
 exports.getScope = getScope;
 
-var _getVariables = __webpack_require__(1766);
-
-var _utils = __webpack_require__(1767);
+var _getVariables = __webpack_require__(1765);
+
+var _utils = __webpack_require__(1766);
 
 var _frame = __webpack_require__(1380);
 
 function getScopeTitle(type, scope) {
   if (type === "function") {
     return scope.function.displayName ? (0, _frame.simplifyDisplayName)(scope.function.displayName) : L10N.getStr("anonymous");
   }
   return L10N.getStr("scopes.block");
@@ -49290,11 +49226,142 @@ function getScope(scope, selectedFrame, 
       path: key,
       contents: { value }
     };
   }
 
   return null;
 }
 
+/***/ }),
+/* 1795 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _lodash = __webpack_require__(2);
+
+let newSources;
+let createSource;
+let queuedSources;
+let supportsWasm = false;
+
+const queue = (0, _lodash.throttle)(() => {
+  if (!newSources || !createSource) {
+    return;
+  }
+  newSources(queuedSources.map(source => {
+    return createSource(source, { supportsWasm });
+  }));
+  queuedSources = [];
+}, 100);
+
+exports.default = {
+  initialize: options => {
+    newSources = options.actions.newSources;
+    createSource = options.createSource;
+    supportsWasm = options.supportsWasm;
+    queuedSources = [];
+  },
+  queue: source => {
+    queuedSources.push(source);
+    queue();
+  },
+  flush: () => queue.flush(),
+  clear: () => queue.cancel()
+};
+
+/***/ }),
+/* 1796 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.HighlightLine = undefined;
+
+var _react = __webpack_require__(0);
+
+var _editor = __webpack_require__(1358);
+
+var _sourceDocuments = __webpack_require__(1436);
+
+var _source = __webpack_require__(1356);
+
+var _reactRedux = __webpack_require__(1189);
+
+var _selectors = __webpack_require__(1352);
+
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+function isDebugLine(selectedFrame, selectedLocation) {
+  if (!selectedFrame) {
+    return;
+  }
+
+  return selectedFrame.location.sourceId == selectedLocation.sourceId && selectedFrame.location.line == selectedLocation.line;
+}
+
+function isDocumentReady(selectedSource, selectedLocation) {
+  return selectedLocation && (0, _source.isLoaded)(selectedSource) && (0, _sourceDocuments.hasDocument)(selectedLocation.sourceId);
+}
+
+class HighlightLine extends _react.PureComponent {
+  componentDidUpdate(prevProps) {
+    const { selectedLocation, selectedFrame, selectedSource } = this.props;
+
+    this.clearHighlightLine(prevProps.selectedLocation, prevProps.selectedSource);
+
+    this.setHighlightLine(selectedLocation, selectedFrame, selectedSource);
+  }
+
+  setHighlightLine(selectedLocation, selectedFrame, selectedSource) {
+    if (!isDocumentReady(selectedSource, selectedLocation)) {
+      return;
+    }
+
+    const { sourceId, line } = selectedLocation;
+
+    if (!line || isDebugLine(selectedFrame, selectedLocation)) {
+      return;
+    }
+
+    const editorLine = (0, _editor.toEditorLine)(sourceId, line);
+    const doc = (0, _sourceDocuments.getDocument)(sourceId);
+    doc.addLineClass(editorLine, "line", "highlight-line");
+  }
+
+  clearHighlightLine(selectedLocation, selectedSource) {
+    if (!isDocumentReady(selectedSource, selectedLocation)) {
+      return;
+    }
+
+    const { line, sourceId } = selectedLocation;
+    const editorLine = (0, _editor.toEditorLine)(sourceId, line);
+    const doc = (0, _sourceDocuments.getDocument)(sourceId);
+    doc.removeLineClass(editorLine, "line", "highlight-line");
+  }
+
+  render() {
+    return null;
+  }
+}
+
+exports.HighlightLine = HighlightLine;
+exports.default = (0, _reactRedux.connect)(state => ({
+  selectedFrame: (0, _selectors.getVisibleSelectedFrame)(state),
+  selectedLocation: (0, _selectors.getSelectedLocation)(state),
+  selectedSource: (0, _selectors.getSelectedSource)(state)
+}))(HighlightLine);
+
 /***/ })
 /******/ ]);
 });
\ No newline at end of file
--- a/devtools/client/debugger/new/test/mochitest/browser.ini
+++ b/devtools/client/debugger/new/test/mochitest/browser.ini
@@ -91,23 +91,26 @@ skip-if = !e10s # This test is only vali
 [browser_dbg-iframes.js]
 [browser_dbg_keyboard_navigation.js]
 skip-if = true # regular failures during release in Bug 1415300
 [browser_dbg_keyboard-shortcuts.js]
 skip-if = os == "linux" # bug 1351952
 [browser_dbg-layout-changes.js]
 [browser_dbg-outline.js]
 [browser_dbg-pause-exceptions.js]
+[browser_dbg-pause-ux.js]
+skip-if = os == "win"
 [browser_dbg-navigation.js]
 [browser_dbg-minified.js]
 [browser_dbg-pretty-print.js]
 [browser_dbg-pretty-print-console.js]
 [browser_dbg-pretty-print-paused.js]
 [browser_dbg-preview.js]
 skip-if = true # regular failures during release in Bug 1415300
+[browser_dbg-preview-source-maps.js]
 [browser_dbg-returnvalues.js]
 [browser_dbg-scopes-mutations.js]
 [browser_dbg-search-file.js]
 skip-if = os == "win" # Bug 1393121
 [browser_dbg-quick-open.js]
 skip-if = true # regular failures during release in Bug 1415300
 [browser_dbg-search-project.js]
 [browser_dbg-sourcemaps.js]
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg-breaking.js
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-breaking.js
@@ -6,19 +6,21 @@
 add_task(async function() {
   const dbg = await initDebugger("doc-scripts.html");
   const { selectors: { getSelectedSource }, getState } = dbg;
 
   // Make sure we can set a top-level breakpoint and it will be hit on
   // reload.
   await addBreakpoint(dbg, "scripts.html", 18);
   reload(dbg);
+
+  await waitForDispatch(dbg, "NAVIGATE");
+  await waitForSelectedSource(dbg, "doc-scripts.html");
   await waitForPaused(dbg);
 
-  await waitForLoadedSource(dbg, "doc-scripts.html");
   assertPausedLocation(dbg);
   await resume(dbg);
 
   // Create an eval script that pauses itself.
   invokeInTab("doEval");
   await waitForPaused(dbg);
 
   await resume(dbg);
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg-editor-highlight.js
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-editor-highlight.js
@@ -12,37 +12,38 @@ add_task(async function() {
 
   // The source itself doesn't even exist yet, and using
   // `selectSourceURL` will set a pending request to load this source
   // and highlight a specific line.
   dbg.actions.selectSourceURL(sourceUrl, { location: { line: 66 } });
 
   // Wait for the source text to load and make sure we're in the right
   // place.
-  await waitForLoadedSource(dbg, sourceUrl);
+  await waitForSelectedSource(dbg, sourceUrl);
+  log(`loaded source`);
 
   // TODO: revisit highlighting lines when the debugger opens
   // assertHighlightLocation(dbg, "long.js", 66);
 
-  // Jump to line 16 and make sure the editor scrolled.
+  log(`Select line 16 and make sure the editor scrolled.`);
   await selectSource(dbg, "long.js", 16);
   await waitForElement(dbg, ".CodeMirror-code > .highlight-line");
   assertHighlightLocation(dbg, "long.js", 16);
 
-  // Make sure only one line is ever highlighted and the flash
-  // animation is cancelled on old lines.
+  log(`Select several locations and check that we have one highlight`);
   await selectSource(dbg, "long.js", 17);
   await selectSource(dbg, "long.js", 18);
   assertHighlightLocation(dbg, "long.js", 18);
 
   // Test jumping to a line in a source that exists but hasn't been
   // loaded yet.
+  log(`Select an unloaded source`);
   selectSource(dbg, "simple1.js", 6);
 
   // Make sure the source is in the loading state, wait for it to be
   // fully loaded, and check the highlighted line.
   const simple1 = findSource(dbg, "simple1.js");
   is(getSource(getState(), simple1.id).get("loadedState"), "loading");
 
-  await waitForLoadedSource(dbg, "simple1.js");
+  await waitForSelectedSource(dbg, "simple1.js");
   ok(getSource(getState(), simple1.id).get("text"));
   assertHighlightLocation(dbg, "simple1.js", 6);
 });
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-pause-ux.js
@@ -0,0 +1,42 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+function getScrollTop(dbg) {
+  return getCM(dbg).doc.scrollTop;
+}
+
+async function waitForMatch(dbg, { matchIndex, count }) {
+  await waitForState(
+    dbg,
+    state => {
+      const result = dbg.selectors.getFileSearchResults(state);
+      return result.matchIndex == matchIndex && result.count == count;
+    },
+    "wait for match"
+  );
+}
+
+add_task(async function() {
+  const dbg = await initDebugger("doc-scripts.html");
+
+  // Make sure that we can set a breakpoint on a line out of the
+  // viewport, and that pausing there scrolls the editor to it.
+  let longSrc = findSource(dbg, "long.js");
+  await addBreakpoint(dbg, longSrc, 66);
+  invokeInTab("testModel");
+  await waitForPaused(dbg);
+
+  const pauseScrollTop = getScrollTop(dbg);
+
+  log("1. adding a breakpoint should not scroll the editor");
+  getCM(dbg).scrollTo(0, 0);
+  await addBreakpoint(dbg, longSrc, 11);
+  is(getScrollTop(dbg), 0, "scroll position");
+
+  log("2. searching should jump to the match");
+  pressKey(dbg, "fileSearch");
+  type(dbg, "check");
+  await waitForMatch(dbg, { matchIndex: 0, count: 2 });
+  const matchScrollTop = getScrollTop(dbg);
+  ok(pauseScrollTop != matchScrollTop, "did not jump to debug line");
+});
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-preview-source-maps.js
@@ -0,0 +1,63 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+function getCoordsFromPosition(cm, { line, ch }) {
+  return cm.charCoords({ line: ~~line, ch: ~~ch });
+}
+
+function hoverAtPos(dbg, { line, ch }) {
+  const cm = getCM(dbg);
+  const coords = getCoordsFromPosition(cm, { line: line - 1, ch });
+  const tokenEl = dbg.win.document.elementFromPoint(coords.left, coords.top);
+  tokenEl.dispatchEvent(
+    new MouseEvent("mouseover", {
+      bubbles: true,
+      cancelable: true,
+      view: dbg.win
+    })
+  );
+}
+
+function assertTooltip(dbg, { result, expression }) {
+  const previewEl = findElement(dbg, "tooltip");
+  is(previewEl.innerText, result, "Preview text shown to user");
+
+  const preview = dbg.selectors.getPreview(dbg.getState());
+  is(`${preview.result}`, result, "Preview.result");
+  is(preview.updating, false, "Preview.updating");
+  is(preview.expression, expression, "Preview.expression");
+}
+
+function assertPopup(dbg, { field, value, expression }) {
+  const previewEl = findElement(dbg, "popup");
+  is(previewEl.innerText, "", "Preview text shown to user");
+
+  const preview = dbg.selectors.getPreview(dbg.getState());
+
+  is(
+    `${preview.result.preview.ownProperties[field].value}`,
+    value,
+    "Preview.result"
+  );
+  is(preview.updating, false, "Preview.updating");
+  is(preview.expression, expression, "Preview.expression");
+}
+
+add_task(async function() {
+  const dbg = await initDebugger("doc-sourcemaps.html");
+  const { selectors: { getSelectedSource }, getState } = dbg;
+
+  await waitForSources(dbg, "entry.js", "output.js", "times2.js", "opts.js");
+  await selectSource(dbg, "times2");
+  await addBreakpoint(dbg, "times2", 2);
+
+  invokeInTab("keepMeAlive");
+  await waitForPaused(dbg);
+  await waitForSelectedSource(dbg, "times2");
+
+  const tooltipPreviewed = waitForDispatch(dbg, "SET_PREVIEW");
+  hoverAtPos(dbg, { line: 2, ch: 9 });
+
+  await tooltipPreviewed;
+  assertTooltip(dbg, { result: 4, expression: "x" });
+});
--- a/devtools/client/debugger/new/test/mochitest/head.js
+++ b/devtools/client/debugger/new/test/mochitest/head.js
@@ -203,17 +203,17 @@ function waitForSources(dbg, ...sources)
     sources.map(url => {
       function sourceExists(state) {
         return getSources(state).some(s => {
           return (s.get("url") || "").includes(url);
         });
       }
 
       if (!sourceExists(store.getState())) {
-        return waitForState(dbg, sourceExists);
+        return waitForState(dbg, sourceExists, `source ${url}`);
       }
     })
   );
 }
 
 /**
  * Waits for a source to be loaded.
  *
@@ -308,18 +308,24 @@ function assertDebugLine(dbg, line) {
   }
 
   ok(
     lineInfo.wrapClass.includes("new-debug-line"),
     "Line is highlighted as paused"
   );
 
   const debugLine =
-    findElementWithSelector(dbg, ".new-debug-line") ||
-    findElementWithSelector(dbg, ".new-debug-line-error");
+    findElement(dbg, "debugLine") || findElement(dbg, "debugErrorLine");
+
+  is(
+    findAllElements(dbg, "debugLine").length +
+      findAllElements(dbg, "debugErrorLine").length,
+    1,
+    "There is only one line"
+  );
 
   ok(isVisibleInEditor(dbg, debugLine), "debug line is visible");
 
   const markedSpans = lineInfo.handle.markedSpans;
   if (markedSpans && markedSpans.length > 0) {
     const marker = markedSpans[0].marker;
     ok(
       marker.className.includes("debug-expression"),
@@ -930,16 +936,18 @@ const selectors = {
     `.scopes-list .tree-node:nth-child(${i}) .object-delimiter + *`,
   frame: i => `.frames ul li:nth-child(${i})`,
   frames: ".frames ul li",
   gutter: i => `.CodeMirror-code *:nth-child(${i}) .CodeMirror-linenumber`,
   menuitem: i => `menupopup menuitem:nth-child(${i})`,
   pauseOnExceptions: ".pause-exceptions",
   breakpoint: ".CodeMirror-code > .new-breakpoint",
   highlightLine: ".CodeMirror-code > .highlight-line",
+  debugLine: ".new-debug-line",
+  debugErrorLine: ".new-debug-line-error",
   codeMirror: ".CodeMirror",
   resume: ".resume.active",
   sourceTabs: ".source-tabs",
   stepOver: ".stepOver.active",
   stepOut: ".stepOut.active",
   stepIn: ".stepIn.active",
   toggleBreakpoints: ".breakpoints-toggle",
   prettyPrintButton: ".source-footer .prettyPrint",
--- a/devtools/client/shared/vendor/WASMPARSER_UPGRADING
+++ b/devtools/client/shared/vendor/WASMPARSER_UPGRADING
@@ -1,14 +1,14 @@
 # wasmparser version
 
-Current vesion is: 0.4.11
+Current vesion is: 0.5.2
 
 # Upgrade process
 
 1. Pull latest release from npm and extract WasmDis.js and WasmParser.js, e.g.
 
 ```
-curl https://registry.npmjs.org/wasmparser/-/wasmparser-0.4.11.tgz | tar -x --strip-components 2 package/dist/{WasmDis,WasmParser}.js
+curl https://registry.npmjs.org/wasmparser/-/wasmparser-0.5.2.tgz | tar -x --strip-components 2 package/dist/{WasmDis,WasmParser}.js
 ```
 
 2. Remove reference to source maps (last line)
 
--- a/devtools/client/shared/vendor/WasmDis.js
+++ b/devtools/client/shared/vendor/WasmDis.js
@@ -64,41 +64,107 @@ function formatFloat64(n) {
 }
 function memoryAddressToString(address, code) {
     var defaultAlignFlags;
     switch (code) {
         case 41 /* i64_load */:
         case 55 /* i64_store */:
         case 43 /* f64_load */:
         case 57 /* f64_store */:
+        case 65026 /* i64_atomic_wait */:
+        case 65041 /* i64_atomic_load */:
+        case 65048 /* i64_atomic_store */:
+        case 65055 /* i64_atomic_rmw_add */:
+        case 65062 /* i64_atomic_rmw_sub */:
+        case 65069 /* i64_atomic_rmw_and */:
+        case 65076 /* i64_atomic_rmw_or */:
+        case 65083 /* i64_atomic_rmw_xor */:
+        case 65090 /* i64_atomic_rmw_xchg */:
+        case 65097 /* i64_atomic_rmw_cmpxchg */:
             defaultAlignFlags = 3;
             break;
         case 40 /* i32_load */:
         case 52 /* i64_load32_s */:
         case 53 /* i64_load32_u */:
         case 54 /* i32_store */:
         case 62 /* i64_store32 */:
         case 42 /* f32_load */:
         case 56 /* f32_store */:
+        case 65024 /* atomic_wake */:
+        case 65025 /* i32_atomic_wait */:
+        case 65040 /* i32_atomic_load */:
+        case 65046 /* i64_atomic_load32_u */:
+        case 65047 /* i32_atomic_store */:
+        case 65053 /* i64_atomic_store32 */:
+        case 65054 /* i32_atomic_rmw_add */:
+        case 65060 /* i64_atomic_rmw32_u_add */:
+        case 65061 /* i32_atomic_rmw_sub */:
+        case 65067 /* i64_atomic_rmw32_u_sub */:
+        case 65068 /* i32_atomic_rmw_and */:
+        case 65074 /* i64_atomic_rmw32_u_and */:
+        case 65075 /* i32_atomic_rmw_or */:
+        case 65081 /* i64_atomic_rmw32_u_or */:
+        case 65082 /* i32_atomic_rmw_xor */:
+        case 65088 /* i64_atomic_rmw32_u_xor */:
+        case 65089 /* i32_atomic_rmw_xchg */:
+        case 65095 /* i64_atomic_rmw32_u_xchg */:
+        case 65096 /* i32_atomic_rmw_cmpxchg */:
+        case 65102 /* i64_atomic_rmw32_u_cmpxchg */:
             defaultAlignFlags = 2;
             break;
         case 46 /* i32_load16_s */:
         case 47 /* i32_load16_u */:
         case 50 /* i64_load16_s */:
         case 51 /* i64_load16_u */:
         case 59 /* i32_store16 */:
         case 61 /* i64_store16 */:
+        case 65043 /* i32_atomic_load16_u */:
+        case 65045 /* i64_atomic_load16_u */:
+        case 65050 /* i32_atomic_store16 */:
+        case 65052 /* i64_atomic_store16 */:
+        case 65057 /* i32_atomic_rmw16_u_add */:
+        case 65059 /* i64_atomic_rmw16_u_add */:
+        case 65064 /* i32_atomic_rmw16_u_sub */:
+        case 65066 /* i64_atomic_rmw16_u_sub */:
+        case 65071 /* i32_atomic_rmw16_u_and */:
+        case 65073 /* i64_atomic_rmw16_u_and */:
+        case 65078 /* i32_atomic_rmw16_u_or */:
+        case 65080 /* i64_atomic_rmw16_u_or */:
+        case 65085 /* i32_atomic_rmw16_u_xor */:
+        case 65087 /* i64_atomic_rmw16_u_xor */:
+        case 65092 /* i32_atomic_rmw16_u_xchg */:
+        case 65094 /* i64_atomic_rmw16_u_xchg */:
+        case 65099 /* i32_atomic_rmw16_u_cmpxchg */:
+        case 65101 /* i64_atomic_rmw16_u_cmpxchg */:
             defaultAlignFlags = 1;
             break;
         case 44 /* i32_load8_s */:
         case 45 /* i32_load8_u */:
         case 48 /* i64_load8_s */:
         case 49 /* i64_load8_u */:
         case 58 /* i32_store8 */:
         case 60 /* i64_store8 */:
+        case 65042 /* i32_atomic_load8_u */:
+        case 65044 /* i64_atomic_load8_u */:
+        case 65049 /* i32_atomic_store8 */:
+        case 65051 /* i64_atomic_store8 */:
+        case 65056 /* i32_atomic_rmw8_u_add */:
+        case 65058 /* i64_atomic_rmw8_u_add */:
+        case 65063 /* i32_atomic_rmw8_u_sub */:
+        case 65065 /* i64_atomic_rmw8_u_sub */:
+        case 65070 /* i32_atomic_rmw8_u_and */:
+        case 65072 /* i64_atomic_rmw8_u_and */:
+        case 65077 /* i32_atomic_rmw8_u_or */:
+        case 65079 /* i64_atomic_rmw8_u_or */:
+        case 65084 /* i32_atomic_rmw8_u_xor */:
+        case 65086 /* i64_atomic_rmw8_u_xor */:
+        case 65091 /* i32_atomic_rmw8_u_xchg */:
+        case 65093 /* i64_atomic_rmw8_u_xchg */:
+        case 65098 /* i32_atomic_rmw8_u_cmpxchg */:
+        case 65100 /* i64_atomic_rmw8_u_cmpxchg */:
             defaultAlignFlags = 0;
             break;
     }
     if (address.flags == defaultAlignFlags)
         return !address.offset ? null : "offset=" + address.offset;
     if (!address.offset)
         return "align=" + (1 << address.flags);
     return "offset=" + (address.offset | 0) + " align=" + (1 << address.flags);
@@ -379,17 +445,17 @@ var WasmDisassembler = (function () {
             var line = this._lines[backrefLabel.line];
             this._lines[backrefLabel.line] = line.substring(0, backrefLabel.position) +
                 ' ' + backrefLabel.label + line.substring(backrefLabel.position);
             this._labelIndex++;
         }
         return backrefLabel.label || '' + depth;
     };
     WasmDisassembler.prototype.printOperator = function (operator) {
-        var code = operator.code;
+        var code = operator.code | 0;
         this.appendBuffer(getOperatorName(code));
         switch (code) {
             case 2 /* block */:
             case 3 /* loop */:
             case 4 /* if */:
                 if (this._labelMode !== LabelMode.Depth) {
                     var backrefLabel_1 = {
                         line: this._lines.length,
@@ -471,16 +537,82 @@ var WasmDisassembler = (function () {
             case 55 /* i64_store */:
             case 56 /* f32_store */:
             case 57 /* f64_store */:
             case 58 /* i32_store8 */:
             case 59 /* i32_store16 */:
             case 60 /* i64_store8 */:
             case 61 /* i64_store16 */:
             case 62 /* i64_store32 */:
+            case 65024 /* atomic_wake */:
+            case 65025 /* i32_atomic_wait */:
+            case 65026 /* i64_atomic_wait */:
+            case 65040 /* i32_atomic_load */:
+            case 65041 /* i64_atomic_load */:
+            case 65042 /* i32_atomic_load8_u */:
+            case 65043 /* i32_atomic_load16_u */:
+            case 65044 /* i64_atomic_load8_u */:
+            case 65045 /* i64_atomic_load16_u */:
+            case 65046 /* i64_atomic_load32_u */:
+            case 65047 /* i32_atomic_store */:
+            case 65048 /* i64_atomic_store */:
+            case 65049 /* i32_atomic_store8 */:
+            case 65050 /* i32_atomic_store16 */:
+            case 65051 /* i64_atomic_store8 */:
+            case 65052 /* i64_atomic_store16 */:
+            case 65053 /* i64_atomic_store32 */:
+            case 65054 /* i32_atomic_rmw_add */:
+            case 65055 /* i64_atomic_rmw_add */:
+            case 65056 /* i32_atomic_rmw8_u_add */:
+            case 65057 /* i32_atomic_rmw16_u_add */:
+            case 65058 /* i64_atomic_rmw8_u_add */:
+            case 65059 /* i64_atomic_rmw16_u_add */:
+            case 65060 /* i64_atomic_rmw32_u_add */:
+            case 65061 /* i32_atomic_rmw_sub */:
+            case 65062 /* i64_atomic_rmw_sub */:
+            case 65063 /* i32_atomic_rmw8_u_sub */:
+            case 65064 /* i32_atomic_rmw16_u_sub */:
+            case 65065 /* i64_atomic_rmw8_u_sub */:
+            case 65066 /* i64_atomic_rmw16_u_sub */:
+            case 65067 /* i64_atomic_rmw32_u_sub */:
+            case 65068 /* i32_atomic_rmw_and */:
+            case 65069 /* i64_atomic_rmw_and */:
+            case 65070 /* i32_atomic_rmw8_u_and */:
+            case 65071 /* i32_atomic_rmw16_u_and */:
+            case 65072 /* i64_atomic_rmw8_u_and */:
+            case 65073 /* i64_atomic_rmw16_u_and */:
+            case 65074 /* i64_atomic_rmw32_u_and */:
+            case 65075 /* i32_atomic_rmw_or */:
+            case 65076 /* i64_atomic_rmw_or */:
+            case 65077 /* i32_atomic_rmw8_u_or */:
+            case 65078 /* i32_atomic_rmw16_u_or */:
+            case 65079 /* i64_atomic_rmw8_u_or */:
+            case 65080 /* i64_atomic_rmw16_u_or */:
+            case 65081 /* i64_atomic_rmw32_u_or */:
+            case 65082 /* i32_atomic_rmw_xor */:
+            case 65083 /* i64_atomic_rmw_xor */:
+            case 65084 /* i32_atomic_rmw8_u_xor */:
+            case 65085 /* i32_atomic_rmw16_u_xor */:
+            case 65086 /* i64_atomic_rmw8_u_xor */:
+            case 65087 /* i64_atomic_rmw16_u_xor */:
+            case 65088 /* i64_atomic_rmw32_u_xor */:
+            case 65089 /* i32_atomic_rmw_xchg */:
+            case 65090 /* i64_atomic_rmw_xchg */:
+            case 65091 /* i32_atomic_rmw8_u_xchg */:
+            case 65092 /* i32_atomic_rmw16_u_xchg */:
+            case 65093 /* i64_atomic_rmw8_u_xchg */:
+            case 65094 /* i64_atomic_rmw16_u_xchg */:
+            case 65095 /* i64_atomic_rmw32_u_xchg */:
+            case 65096 /* i32_atomic_rmw_cmpxchg */:
+            case 65097 /* i64_atomic_rmw_cmpxchg */:
+            case 65098 /* i32_atomic_rmw8_u_cmpxchg */:
+            case 65099 /* i32_atomic_rmw16_u_cmpxchg */:
+            case 65100 /* i64_atomic_rmw8_u_cmpxchg */:
+            case 65101 /* i64_atomic_rmw16_u_cmpxchg */:
+            case 65102 /* i64_atomic_rmw32_u_cmpxchg */:
                 var memoryAddress = memoryAddressToString(operator.memoryAddress, operator.code);
                 if (memoryAddress !== null) {
                     this.appendBuffer(' ');
                     this.appendBuffer(memoryAddress);
                 }
                 break;
             case 63 /* current_memory */:
             case 64 /* grow_memory */:
@@ -615,19 +747,22 @@ var WasmDisassembler = (function () {
                         default:
                             reader.skipSection();
                             break;
                     }
                     break;
                 case 15 /* MEMORY_SECTION_ENTRY */:
                     var memoryInfo = reader.result;
                     var memoryName = this._nameResolver.getMemoryName(this._memoryCount++, false);
-                    this.appendBuffer("  (memory " + memoryName + " " + memoryInfo.limits.initial);
-                    if (memoryInfo.limits.maximum !== undefined) {
-                        this.appendBuffer(" " + memoryInfo.limits.maximum);
+                    this.appendBuffer("  (memory " + memoryName + " ");
+                    if (memoryInfo.shared) {
+                        this.appendBuffer("(shared " + limitsToString(memoryInfo.limits) + ")");
+                    }
+                    else {
+                        this.appendBuffer(limitsToString(memoryInfo.limits));
                     }
                     this.appendBuffer(')');
                     this.newLine();
                     break;
                 case 14 /* TABLE_SECTION_ENTRY */:
                     var tableInfo = reader.result;
                     var tableName = this._nameResolver.getTableName(this._tableCount++, false);
                     this.appendBuffer("  (table " + tableName + " " + limitsToString(tableInfo.limits) + " " + typeToString(tableInfo.elementType) + ")");
@@ -676,17 +811,24 @@ var WasmDisassembler = (function () {
                         case 1 /* Table */:
                             var tableImportInfo = importInfo.type;
                             var tableName = this._nameResolver.getTableName(this._tableCount++, false);
                             this.appendBuffer(" (table " + tableName + " " + limitsToString(tableImportInfo.limits) + " " + typeToString(tableImportInfo.elementType) + ")");
                             break;
                         case 2 /* Memory */:
                             var memoryImportInfo = importInfo.type;
                             var memoryName = this._nameResolver.getMemoryName(this._memoryCount++, false);
-                            this.appendBuffer(" (memory " + memoryName + " " + limitsToString(memoryImportInfo.limits) + ")");
+                            this.appendBuffer(" (memory " + memoryName + " ");
+                            if (memoryImportInfo.shared) {
+                                this.appendBuffer("(shared " + limitsToString(memoryImportInfo.limits) + ")");
+                            }
+                            else {
+                                this.appendBuffer(limitsToString(memoryImportInfo.limits));
+                            }
+                            this.appendBuffer(')');
                             break;
                         case 3 /* Global */:
                             var globalImportInfo = importInfo.type;
                             var globalName = this._nameResolver.getGlobalName(this._globalCount++, false);
                             this.appendBuffer(" (global " + globalName + " " + globalTypeToString(globalImportInfo) + ")");
                             break;
                         default:
                             throw new Error("NYI other import types: " + importInfo.kind);
--- a/devtools/client/shared/vendor/WasmParser.js
+++ b/devtools/client/shared/vendor/WasmParser.js
@@ -203,21 +203,108 @@ var OperatorCode;
     OperatorCode[OperatorCode["f64_convert_u_i32"] = 184] = "f64_convert_u_i32";
     OperatorCode[OperatorCode["f64_convert_s_i64"] = 185] = "f64_convert_s_i64";
     OperatorCode[OperatorCode["f64_convert_u_i64"] = 186] = "f64_convert_u_i64";
     OperatorCode[OperatorCode["f64_promote_f32"] = 187] = "f64_promote_f32";
     OperatorCode[OperatorCode["i32_reinterpret_f32"] = 188] = "i32_reinterpret_f32";
     OperatorCode[OperatorCode["i64_reinterpret_f64"] = 189] = "i64_reinterpret_f64";
     OperatorCode[OperatorCode["f32_reinterpret_i32"] = 190] = "f32_reinterpret_i32";
     OperatorCode[OperatorCode["f64_reinterpret_i64"] = 191] = "f64_reinterpret_i64";
+    OperatorCode[OperatorCode["i32_extend8_s"] = 192] = "i32_extend8_s";
+    OperatorCode[OperatorCode["i32_extend16_s"] = 193] = "i32_extend16_s";
+    OperatorCode[OperatorCode["i64_extend8_s"] = 194] = "i64_extend8_s";
+    OperatorCode[OperatorCode["i64_extend16_s"] = 195] = "i64_extend16_s";
+    OperatorCode[OperatorCode["i64_extend32_s"] = 196] = "i64_extend32_s";
+    OperatorCode[OperatorCode["prefix_0xfc"] = 252] = "prefix_0xfc";
+    OperatorCode[OperatorCode["prefix_0xfe"] = 254] = "prefix_0xfe";
+    OperatorCode[OperatorCode["i32_trunc_s_sat_f32"] = 64512] = "i32_trunc_s_sat_f32";
+    OperatorCode[OperatorCode["i32_trunc_u_sat_f32"] = 64513] = "i32_trunc_u_sat_f32";
+    OperatorCode[OperatorCode["i32_trunc_s_sat_f64"] = 64514] = "i32_trunc_s_sat_f64";
+    OperatorCode[OperatorCode["i32_trunc_u_sat_f64"] = 64515] = "i32_trunc_u_sat_f64";
+    OperatorCode[OperatorCode["i64_trunc_s_sat_f32"] = 64516] = "i64_trunc_s_sat_f32";
+    OperatorCode[OperatorCode["i64_trunc_u_sat_f32"] = 64517] = "i64_trunc_u_sat_f32";
+    OperatorCode[OperatorCode["i64_trunc_s_sat_f64"] = 64518] = "i64_trunc_s_sat_f64";
+    OperatorCode[OperatorCode["i64_trunc_u_sat_f64"] = 64519] = "i64_trunc_u_sat_f64";
+    OperatorCode[OperatorCode["atomic_wake"] = 65024] = "atomic_wake";
+    OperatorCode[OperatorCode["i32_atomic_wait"] = 65025] = "i32_atomic_wait";
+    OperatorCode[OperatorCode["i64_atomic_wait"] = 65026] = "i64_atomic_wait";
+    OperatorCode[OperatorCode["i32_atomic_load"] = 65040] = "i32_atomic_load";
+    OperatorCode[OperatorCode["i64_atomic_load"] = 65041] = "i64_atomic_load";
+    OperatorCode[OperatorCode["i32_atomic_load8_u"] = 65042] = "i32_atomic_load8_u";
+    OperatorCode[OperatorCode["i32_atomic_load16_u"] = 65043] = "i32_atomic_load16_u";
+    OperatorCode[OperatorCode["i64_atomic_load8_u"] = 65044] = "i64_atomic_load8_u";
+    OperatorCode[OperatorCode["i64_atomic_load16_u"] = 65045] = "i64_atomic_load16_u";
+    OperatorCode[OperatorCode["i64_atomic_load32_u"] = 65046] = "i64_atomic_load32_u";
+    OperatorCode[OperatorCode["i32_atomic_store"] = 65047] = "i32_atomic_store";
+    OperatorCode[OperatorCode["i64_atomic_store"] = 65048] = "i64_atomic_store";
+    OperatorCode[OperatorCode["i32_atomic_store8"] = 65049] = "i32_atomic_store8";
+    OperatorCode[OperatorCode["i32_atomic_store16"] = 65050] = "i32_atomic_store16";
+    OperatorCode[OperatorCode["i64_atomic_store8"] = 65051] = "i64_atomic_store8";
+    OperatorCode[OperatorCode["i64_atomic_store16"] = 65052] = "i64_atomic_store16";
+    OperatorCode[OperatorCode["i64_atomic_store32"] = 65053] = "i64_atomic_store32";
+    OperatorCode[OperatorCode["i32_atomic_rmw_add"] = 65054] = "i32_atomic_rmw_add";
+    OperatorCode[OperatorCode["i64_atomic_rmw_add"] = 65055] = "i64_atomic_rmw_add";
+    OperatorCode[OperatorCode["i32_atomic_rmw8_u_add"] = 65056] = "i32_atomic_rmw8_u_add";
+    OperatorCode[OperatorCode["i32_atomic_rmw16_u_add"] = 65057] = "i32_atomic_rmw16_u_add";
+    OperatorCode[OperatorCode["i64_atomic_rmw8_u_add"] = 65058] = "i64_atomic_rmw8_u_add";
+    OperatorCode[OperatorCode["i64_atomic_rmw16_u_add"] = 65059] = "i64_atomic_rmw16_u_add";
+    OperatorCode[OperatorCode["i64_atomic_rmw32_u_add"] = 65060] = "i64_atomic_rmw32_u_add";
+    OperatorCode[OperatorCode["i32_atomic_rmw_sub"] = 65061] = "i32_atomic_rmw_sub";
+    OperatorCode[OperatorCode["i64_atomic_rmw_sub"] = 65062] = "i64_atomic_rmw_sub";
+    OperatorCode[OperatorCode["i32_atomic_rmw8_u_sub"] = 65063] = "i32_atomic_rmw8_u_sub";
+    OperatorCode[OperatorCode["i32_atomic_rmw16_u_sub"] = 65064] = "i32_atomic_rmw16_u_sub";
+    OperatorCode[OperatorCode["i64_atomic_rmw8_u_sub"] = 65065] = "i64_atomic_rmw8_u_sub";
+    OperatorCode[OperatorCode["i64_atomic_rmw16_u_sub"] = 65066] = "i64_atomic_rmw16_u_sub";
+    OperatorCode[OperatorCode["i64_atomic_rmw32_u_sub"] = 65067] = "i64_atomic_rmw32_u_sub";
+    OperatorCode[OperatorCode["i32_atomic_rmw_and"] = 65068] = "i32_atomic_rmw_and";
+    OperatorCode[OperatorCode["i64_atomic_rmw_and"] = 65069] = "i64_atomic_rmw_and";
+    OperatorCode[OperatorCode["i32_atomic_rmw8_u_and"] = 65070] = "i32_atomic_rmw8_u_and";
+    OperatorCode[OperatorCode["i32_atomic_rmw16_u_and"] = 65071] = "i32_atomic_rmw16_u_and";
+    OperatorCode[OperatorCode["i64_atomic_rmw8_u_and"] = 65072] = "i64_atomic_rmw8_u_and";
+    OperatorCode[OperatorCode["i64_atomic_rmw16_u_and"] = 65073] = "i64_atomic_rmw16_u_and";
+    OperatorCode[OperatorCode["i64_atomic_rmw32_u_and"] = 65074] = "i64_atomic_rmw32_u_and";
+    OperatorCode[OperatorCode["i32_atomic_rmw_or"] = 65075] = "i32_atomic_rmw_or";
+    OperatorCode[OperatorCode["i64_atomic_rmw_or"] = 65076] = "i64_atomic_rmw_or";
+    OperatorCode[OperatorCode["i32_atomic_rmw8_u_or"] = 65077] = "i32_atomic_rmw8_u_or";
+    OperatorCode[OperatorCode["i32_atomic_rmw16_u_or"] = 65078] = "i32_atomic_rmw16_u_or";
+    OperatorCode[OperatorCode["i64_atomic_rmw8_u_or"] = 65079] = "i64_atomic_rmw8_u_or";
+    OperatorCode[OperatorCode["i64_atomic_rmw16_u_or"] = 65080] = "i64_atomic_rmw16_u_or";
+    OperatorCode[OperatorCode["i64_atomic_rmw32_u_or"] = 65081] = "i64_atomic_rmw32_u_or";
+    OperatorCode[OperatorCode["i32_atomic_rmw_xor"] = 65082] = "i32_atomic_rmw_xor";
+    OperatorCode[OperatorCode["i64_atomic_rmw_xor"] = 65083] = "i64_atomic_rmw_xor";
+    OperatorCode[OperatorCode["i32_atomic_rmw8_u_xor"] = 65084] = "i32_atomic_rmw8_u_xor";
+    OperatorCode[OperatorCode["i32_atomic_rmw16_u_xor"] = 65085] = "i32_atomic_rmw16_u_xor";
+    OperatorCode[OperatorCode["i64_atomic_rmw8_u_xor"] = 65086] = "i64_atomic_rmw8_u_xor";
+    OperatorCode[OperatorCode["i64_atomic_rmw16_u_xor"] = 65087] = "i64_atomic_rmw16_u_xor";
+    OperatorCode[OperatorCode["i64_atomic_rmw32_u_xor"] = 65088] = "i64_atomic_rmw32_u_xor";
+    OperatorCode[OperatorCode["i32_atomic_rmw_xchg"] = 65089] = "i32_atomic_rmw_xchg";
+    OperatorCode[OperatorCode["i64_atomic_rmw_xchg"] = 65090] = "i64_atomic_rmw_xchg";
+    OperatorCode[OperatorCode["i32_atomic_rmw8_u_xchg"] = 65091] = "i32_atomic_rmw8_u_xchg";
+    OperatorCode[OperatorCode["i32_atomic_rmw16_u_xchg"] = 65092] = "i32_atomic_rmw16_u_xchg";
+    OperatorCode[OperatorCode["i64_atomic_rmw8_u_xchg"] = 65093] = "i64_atomic_rmw8_u_xchg";
+    OperatorCode[OperatorCode["i64_atomic_rmw16_u_xchg"] = 65094] = "i64_atomic_rmw16_u_xchg";
+    OperatorCode[OperatorCode["i64_atomic_rmw32_u_xchg"] = 65095] = "i64_atomic_rmw32_u_xchg";
+    OperatorCode[OperatorCode["i32_atomic_rmw_cmpxchg"] = 65096] = "i32_atomic_rmw_cmpxchg";
+    OperatorCode[OperatorCode["i64_atomic_rmw_cmpxchg"] = 65097] = "i64_atomic_rmw_cmpxchg";
+    OperatorCode[OperatorCode["i32_atomic_rmw8_u_cmpxchg"] = 65098] = "i32_atomic_rmw8_u_cmpxchg";
+    OperatorCode[OperatorCode["i32_atomic_rmw16_u_cmpxchg"] = 65099] = "i32_atomic_rmw16_u_cmpxchg";
+    OperatorCode[OperatorCode["i64_atomic_rmw8_u_cmpxchg"] = 65100] = "i64_atomic_rmw8_u_cmpxchg";
+    OperatorCode[OperatorCode["i64_atomic_rmw16_u_cmpxchg"] = 65101] = "i64_atomic_rmw16_u_cmpxchg";
+    OperatorCode[OperatorCode["i64_atomic_rmw32_u_cmpxchg"] = 65102] = "i64_atomic_rmw32_u_cmpxchg";
 })(OperatorCode = exports.OperatorCode || (exports.OperatorCode = {}));
 ;
 exports.OperatorCodeNames = [
-    "unreachable", "nop", "block", "loop", "if", "else", undefined, undefined, undefined, undefined, undefined, "end", "br", "br_if", "br_table", "return", "call", "call_indirect", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, "drop", "select", undefined, undefined, undefined, undefined, "get_local", "set_local", "tee_local", "get_global", "set_global", undefined, undefined, undefined, "i32.load", "i64.load", "f32.load", "f64.load", "i32.load8_s", "i32.load8_u", "i32.load16_s", "i32.load16_u", "i64.load8_s", "i64.load8_u", "i64.load16_s", "i64.load16_u", "i64.load32_s", "i64.load32_u", "i32.store", "i64.store", "f32.store", "f64.store", "i32.store8", "i32.store16", "i64.store8", "i64.store16", "i64.store32", "current_memory", "grow_memory", "i32.const", "i64.const", "f32.const", "f64.const", "i32.eqz", "i32.eq", "i32.ne", "i32.lt_s", "i32.lt_u", "i32.gt_s", "i32.gt_u", "i32.le_s", "i32.le_u", "i32.ge_s", "i32.ge_u", "i64.eqz", "i64.eq", "i64.ne", "i64.lt_s", "i64.lt_u", "i64.gt_s", "i64.gt_u", "i64.le_s", "i64.le_u", "i64.ge_s", "i64.ge_u", "f32.eq", "f32.ne", "f32.lt", "f32.gt", "f32.le", "f32.ge", "f64.eq", "f64.ne", "f64.lt", "f64.gt", "f64.le", "f64.ge", "i32.clz", "i32.ctz", "i32.popcnt", "i32.add", "i32.sub", "i32.mul", "i32.div_s", "i32.div_u", "i32.rem_s", "i32.rem_u", "i32.and", "i32.or", "i32.xor", "i32.shl", "i32.shr_s", "i32.shr_u", "i32.rotl", "i32.rotr", "i64.clz", "i64.ctz", "i64.popcnt", "i64.add", "i64.sub", "i64.mul", "i64.div_s", "i64.div_u", "i64.rem_s", "i64.rem_u", "i64.and", "i64.or", "i64.xor", "i64.shl", "i64.shr_s", "i64.shr_u", "i64.rotl", "i64.rotr", "f32.abs", "f32.neg", "f32.ceil", "f32.floor", "f32.trunc", "f32.nearest", "f32.sqrt", "f32.add", "f32.sub", "f32.mul", "f32.div", "f32.min", "f32.max", "f32.copysign", "f64.abs", "f64.neg", "f64.ceil", "f64.floor", "f64.trunc", "f64.nearest", "f64.sqrt", "f64.add", "f64.sub", "f64.mul", "f64.div", "f64.min", "f64.max", "f64.copysign", "i32.wrap/i64", "i32.trunc_s/f32", "i32.trunc_u/f32", "i32.trunc_s/f64", "i32.trunc_u/f64", "i64.extend_s/i32", "i64.extend_u/i32", "i64.trunc_s/f32", "i64.trunc_u/f32", "i64.trunc_s/f64", "i64.trunc_u/f64", "f32.convert_s/i32", "f32.convert_u/i32", "f32.convert_s/i64", "f32.convert_u/i64", "f32.demote/f64", "f64.convert_s/i32", "f64.convert_u/i32", "f64.convert_s/i64", "f64.convert_u/i64", "f64.promote/f32", "i32.reinterpret/f32", "i64.reinterpret/f64", "f32.reinterpret/i32", "f64.reinterpret/i64", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined
+    "unreachable", "nop", "block", "loop", "if", "else", undefined, undefined, undefined, undefined, undefined, "end", "br", "br_if", "br_table", "return", "call", "call_indirect", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, "drop", "select", undefined, undefined, undefined, undefined, "get_local", "set_local", "tee_local", "get_global", "set_global", undefined, undefined, undefined, "i32.load", "i64.load", "f32.load", "f64.load", "i32.load8_s", "i32.load8_u", "i32.load16_s", "i32.load16_u", "i64.load8_s", "i64.load8_u", "i64.load16_s", "i64.load16_u", "i64.load32_s", "i64.load32_u", "i32.store", "i64.store", "f32.store", "f64.store", "i32.store8", "i32.store16", "i64.store8", "i64.store16", "i64.store32", "current_memory", "grow_memory", "i32.const", "i64.const", "f32.const", "f64.const", "i32.eqz", "i32.eq", "i32.ne", "i32.lt_s", "i32.lt_u", "i32.gt_s", "i32.gt_u", "i32.le_s", "i32.le_u", "i32.ge_s", "i32.ge_u", "i64.eqz", "i64.eq", "i64.ne", "i64.lt_s", "i64.lt_u", "i64.gt_s", "i64.gt_u", "i64.le_s", "i64.le_u", "i64.ge_s", "i64.ge_u", "f32.eq", "f32.ne", "f32.lt", "f32.gt", "f32.le", "f32.ge", "f64.eq", "f64.ne", "f64.lt", "f64.gt", "f64.le", "f64.ge", "i32.clz", "i32.ctz", "i32.popcnt", "i32.add", "i32.sub", "i32.mul", "i32.div_s", "i32.div_u", "i32.rem_s", "i32.rem_u", "i32.and", "i32.or", "i32.xor", "i32.shl", "i32.shr_s", "i32.shr_u", "i32.rotl", "i32.rotr", "i64.clz", "i64.ctz", "i64.popcnt", "i64.add", "i64.sub", "i64.mul", "i64.div_s", "i64.div_u", "i64.rem_s", "i64.rem_u", "i64.and", "i64.or", "i64.xor", "i64.shl", "i64.shr_s", "i64.shr_u", "i64.rotl", "i64.rotr", "f32.abs", "f32.neg", "f32.ceil", "f32.floor", "f32.trunc", "f32.nearest", "f32.sqrt", "f32.add", "f32.sub", "f32.mul", "f32.div", "f32.min", "f32.max", "f32.copysign", "f64.abs", "f64.neg", "f64.ceil", "f64.floor", "f64.trunc", "f64.nearest", "f64.sqrt", "f64.add", "f64.sub", "f64.mul", "f64.div", "f64.min", "f64.max", "f64.copysign", "i32.wrap/i64", "i32.trunc_s/f32", "i32.trunc_u/f32", "i32.trunc_s/f64", "i32.trunc_u/f64", "i64.extend_s/i32", "i64.extend_u/i32", "i64.trunc_s/f32", "i64.trunc_u/f32", "i64.trunc_s/f64", "i64.trunc_u/f64", "f32.convert_s/i32", "f32.convert_u/i32", "f32.convert_s/i64", "f32.convert_u/i64", "f32.demote/f64", "f64.convert_s/i32", "f64.convert_u/i32", "f64.convert_s/i64", "f64.convert_u/i64", "f64.promote/f32", "i32.reinterpret/f32", "i64.reinterpret/f64", "f32.reinterpret/i32", "f64.reinterpret/i64", "i32.extend8_s", "i32.extend16_s", "i64.extend8_s", "i64.extend16_s", "i64.extend32_s", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined
 ];
+["i32.trunc_s:sat/f32", "i32.trunc_u:sat/f32", "i32.trunc_s:sat/f64", "i32.trunc_u:sat/f64", "i64.trunc_s:sat/f32", "i64.trunc_u:sat/f32", "i64.trunc_s:sat/f64", "i64.trunc_u:sat/f64"].forEach(function (s, i) {
+    exports.OperatorCodeNames[0xfc00 | i] = s;
+});
+["atomic.wake", "i32.atomic.wait", "i64.atomic.wait", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, "i32.atomic.load", "i64.atomic.load", "i32.atomic.load8_u", "i32.atomic.load16_u", "i64.atomic.load8_u", "i64.atomic.load16_u", "i64.atomic.load32_u", "i32.atomic.store", "i64.atomic.store", "i32.atomic.store8", "i32.atomic.store16", "i64.atomic.store8", "i64.atomic.store16", "i64.atomic.store32", "i32.atomic.rmw.add", "i64.atomic.rmw.add", "i32.atomic.rmw8_u.add", "i32.atomic.rmw16_u.add", "i64.atomic.rmw8_u.add", "i64.atomic.rmw16_u.add", "i64.atomic.rmw32_u.add", "i32.atomic.rmw.sub", "i64.atomic.rmw.sub", "i32.atomic.rmw8_u.sub", "i32.atomic.rmw16_u.sub", "i64.atomic.rmw8_u.sub", "i64.atomic.rmw16_u.sub", "i64.atomic.rmw32_u.sub", "i32.atomic.rmw.and", "i64.atomic.rmw.and", "i32.atomic.rmw8_u.and", "i32.atomic.rmw16_u.and", "i64.atomic.rmw8_u.and", "i64.atomic.rmw16_u.and", "i64.atomic.rmw32_u.and", "i32.atomic.rmw.or", "i64.atomic.rmw.or", "i32.atomic.rmw8_u.or", "i32.atomic.rmw16_u.or", "i64.atomic.rmw8_u.or", "i64.atomic.rmw16_u.or", "i64.atomic.rmw32_u.or", "i32.atomic.rmw.xor", "i64.atomic.rmw.xor", "i32.atomic.rmw8_u.xor", "i32.atomic.rmw16_u.xor", "i64.atomic.rmw8_u.xor", "i64.atomic.rmw16_u.xor", "i64.atomic.rmw32_u.xor", "i32.atomic.rmw.xchg", "i64.atomic.rmw.xchg", "i32.atomic.rmw8_u.xchg", "i32.atomic.rmw16_u.xchg", "i64.atomic.rmw8_u.xchg", "i64.atomic.rmw16_u.xchg", "i64.atomic.rmw32_u.xchg", "i32.atomic.rmw.cmpxchg", "i64.atomic.rmw.cmpxchg", "i32.atomic.rmw8_u.cmpxchg", "i32.atomic.rmw16_u.cmpxchg", "i64.atomic.rmw8_u.cmpxchg", "i64.atomic.rmw16_u.cmpxchg", "i64.atomic.rmw32_u.cmpxchg"].forEach(function (s, i) {
+    exports.OperatorCodeNames[0xfe00 | i] = s;
+});
 var ExternalKind;
 (function (ExternalKind) {
     ExternalKind[ExternalKind["Function"] = 0] = "Function";
     ExternalKind[ExternalKind["Table"] = 1] = "Table";
     ExternalKind[ExternalKind["Memory"] = 2] = "Memory";
     ExternalKind[ExternalKind["Global"] = 3] = "Global";
 })(ExternalKind = exports.ExternalKind || (exports.ExternalKind = {}));
 var Type;
@@ -532,32 +619,34 @@ var BinaryReader = (function () {
         for (var i = 0; i < returnCount; i++)
             returnTypes[i] = this.readVarInt7();
         return {
             form: form,
             params: paramTypes,
             returns: returnTypes
         };
     };
-    BinaryReader.prototype.readResizableLimits = function () {
-        var flags = this.readVarUint32() >>> 0;
+    BinaryReader.prototype.readResizableLimits = function (maxPresent) {
         var initial = this.readVarUint32() >>> 0;
         var maximum;
-        if (flags & 0x1) {
+        if (maxPresent) {
             maximum = this.readVarUint32() >>> 0;
         }
-        return { flags: flags, initial: initial, maximum: maximum };
+        return { initial: initial, maximum: maximum };
     };
     BinaryReader.prototype.readTableType = function () {
         var elementType = this.readVarInt7();
-        var limits = this.readResizableLimits();
+        var flags = this.readVarUint32() >>> 0;
+        var limits = this.readResizableLimits(!!(flags & 0x01));
         return { elementType: elementType, limits: limits };
     };
     BinaryReader.prototype.readMemoryType = function () {
-        return { limits: this.readResizableLimits() };
+        var flags = this.readVarUint32() >>> 0;
+        var shared = !!(flags & 0x02);
+        return { limits: this.readResizableLimits(!!(flags & 0x01)), shared: shared };
     };
     BinaryReader.prototype.readGlobalType = function () {
         if (!this.hasVarIntBytes()) {
             return null;
         }
         var pos = this._pos;
         var contentType = this.readVarInt7();
         if (!this.hasVarIntBytes()) {
@@ -915,16 +1004,127 @@ var BinaryReader = (function () {
             type: type,
             offset: offset,
             index: index,
             addend: addend
         };
         this._sectionEntriesLeft--;
         return true;
     };
+    BinaryReader.prototype.readCodeOperator_0xfc = function () {
+        var code = this._data[this._pos++] | 0xfc00;
+        switch (code) {
+            case 64512 /* i32_trunc_s_sat_f32 */:
+            case 64513 /* i32_trunc_u_sat_f32 */:
+            case 64514 /* i32_trunc_s_sat_f64 */:
+            case 64515 /* i32_trunc_u_sat_f64 */:
+            case 64516 /* i64_trunc_s_sat_f32 */:
+            case 64517 /* i64_trunc_u_sat_f32 */:
+            case 64518 /* i64_trunc_s_sat_f64 */:
+            case 64519 /* i64_trunc_u_sat_f64 */:
+                break;
+            default:
+                this.error = new Error("Unknown operator: " + code);
+                this.state = -1 /* ERROR */;
+                return true;
+        }
+        this.result = { code: code,
+            blockType: undefined, brDepth: undefined, brTable: undefined,
+            funcIndex: undefined, typeIndex: undefined, localIndex: undefined,
+            globalIndex: undefined, memoryAddress: undefined, literal: undefined };
+        return true;
+    };
+    BinaryReader.prototype.readCodeOperator_0xfe = function () {
+        var MAX_CODE_OPERATOR_0XFE_SIZE = 11;
+        var pos = this._pos;
+        if (!this._eof && pos + MAX_CODE_OPERATOR_0XFE_SIZE > this._length) {
+            return false;
+        }
+        var code = this._data[this._pos++] | 0xfe00;
+        var memoryAddress;
+        switch (code) {
+            case 65024 /* atomic_wake */:
+            case 65025 /* i32_atomic_wait */:
+            case 65026 /* i64_atomic_wait */:
+            case 65040 /* i32_atomic_load */:
+            case 65041 /* i64_atomic_load */:
+            case 65042 /* i32_atomic_load8_u */:
+            case 65043 /* i32_atomic_load16_u */:
+            case 65044 /* i64_atomic_load8_u */:
+            case 65045 /* i64_atomic_load16_u */:
+            case 65046 /* i64_atomic_load32_u */:
+            case 65047 /* i32_atomic_store */:
+            case 65048 /* i64_atomic_store */:
+            case 65049 /* i32_atomic_store8 */:
+            case 65050 /* i32_atomic_store16 */:
+            case 65051 /* i64_atomic_store8 */:
+            case 65052 /* i64_atomic_store16 */:
+            case 65053 /* i64_atomic_store32 */:
+            case 65054 /* i32_atomic_rmw_add */:
+            case 65055 /* i64_atomic_rmw_add */:
+            case 65056 /* i32_atomic_rmw8_u_add */:
+            case 65057 /* i32_atomic_rmw16_u_add */:
+            case 65058 /* i64_atomic_rmw8_u_add */:
+            case 65059 /* i64_atomic_rmw16_u_add */:
+            case 65060 /* i64_atomic_rmw32_u_add */:
+            case 65061 /* i32_atomic_rmw_sub */:
+            case 65062 /* i64_atomic_rmw_sub */:
+            case 65063 /* i32_atomic_rmw8_u_sub */:
+            case 65064 /* i32_atomic_rmw16_u_sub */:
+            case 65065 /* i64_atomic_rmw8_u_sub */:
+            case 65066 /* i64_atomic_rmw16_u_sub */:
+            case 65067 /* i64_atomic_rmw32_u_sub */:
+            case 65068 /* i32_atomic_rmw_and */:
+            case 65069 /* i64_atomic_rmw_and */:
+            case 65070 /* i32_atomic_rmw8_u_and */:
+            case 65071 /* i32_atomic_rmw16_u_and */:
+            case 65072 /* i64_atomic_rmw8_u_and */:
+            case 65073 /* i64_atomic_rmw16_u_and */:
+            case 65074 /* i64_atomic_rmw32_u_and */:
+            case 65075 /* i32_atomic_rmw_or */:
+            case 65076 /* i64_atomic_rmw_or */:
+            case 65077 /* i32_atomic_rmw8_u_or */:
+            case 65078 /* i32_atomic_rmw16_u_or */:
+            case 65079 /* i64_atomic_rmw8_u_or */:
+            case 65080 /* i64_atomic_rmw16_u_or */:
+            case 65081 /* i64_atomic_rmw32_u_or */:
+            case 65082 /* i32_atomic_rmw_xor */:
+            case 65083 /* i64_atomic_rmw_xor */:
+            case 65084 /* i32_atomic_rmw8_u_xor */:
+            case 65085 /* i32_atomic_rmw16_u_xor */:
+            case 65086 /* i64_atomic_rmw8_u_xor */:
+            case 65087 /* i64_atomic_rmw16_u_xor */:
+            case 65088 /* i64_atomic_rmw32_u_xor */:
+            case 65089 /* i32_atomic_rmw_xchg */:
+            case 65090 /* i64_atomic_rmw_xchg */:
+            case 65091 /* i32_atomic_rmw8_u_xchg */:
+            case 65092 /* i32_atomic_rmw16_u_xchg */:
+            case 65093 /* i64_atomic_rmw8_u_xchg */:
+            case 65094 /* i64_atomic_rmw16_u_xchg */:
+            case 65095 /* i64_atomic_rmw32_u_xchg */:
+            case 65096 /* i32_atomic_rmw_cmpxchg */:
+            case 65097 /* i64_atomic_rmw_cmpxchg */:
+            case 65098 /* i32_atomic_rmw8_u_cmpxchg */:
+            case 65099 /* i32_atomic_rmw16_u_cmpxchg */:
+            case 65100 /* i64_atomic_rmw8_u_cmpxchg */:
+            case 65101 /* i64_atomic_rmw16_u_cmpxchg */:
+            case 65102 /* i64_atomic_rmw32_u_cmpxchg */:
+                memoryAddress = this.readMemoryImmediate();
+                break;
+            default:
+                this.error = new Error("Unknown operator: " + code);
+                this.state = -1 /* ERROR */;
+                return true;
+        }
+        this.result = { code: code,
+            blockType: undefined, brDepth: undefined, brTable: undefined,
+            funcIndex: undefined, typeIndex: undefined, localIndex: undefined,
+            globalIndex: undefined, memoryAddress: memoryAddress, literal: undefined };
+        return true;
+    };
     BinaryReader.prototype.readCodeOperator = function () {
         if (this.state === 30 /* CODE_OPERATOR */ &&
             this._pos >= this._functionRange.end) {
             this.skipFunctionBody();
             return this.read();
         }
         else if (this.state === 26 /* INIT_EXPRESSION_OPERATOR */ &&
             this.result &&
@@ -933,17 +1133,17 @@ var BinaryReader = (function () {
             this.result = null;
             return true;
         }
         var MAX_CODE_OPERATOR_SIZE = 11; // i64.const or load/store
         var pos = this._pos;
         if (!this._eof && pos + MAX_CODE_OPERATOR_SIZE > this._length) {
             return false;
         }
-        var code = this._data[this._pos++];
+        var code = this._data[this._pos++] | 0;
         var blockType, brDepth, brTable, funcIndex, typeIndex, localIndex, globalIndex, memoryAddress, literal, reserved;
         switch (code) {
             case 2 /* block */:
             case 3 /* loop */:
             case 4 /* if */:
                 blockType = this.readVarInt7();
                 break;
             case 12 /* br */:
@@ -1020,16 +1220,168 @@ var BinaryReader = (function () {
             case 67 /* f32_const */:
                 literal = new DataView(this._data.buffer, this._data.byteOffset).getFloat32(this._pos, true);
                 this._pos += 4;
                 break;
             case 68 /* f64_const */:
                 literal = new DataView(this._data.buffer, this._data.byteOffset).getFloat64(this._pos, true);
                 this._pos += 8;
                 break;
+            case 252 /* prefix_0xfc */:
+                if (this.readCodeOperator_0xfc()) {
+                    return true;
+                }
+                this._pos = pos;
+                return false;
+            case 254 /* prefix_0xfe */:
+                if (this.readCodeOperator_0xfe()) {
+                    return true;
+                }
+                this._pos = pos;
+                return false;
+            case 0 /* unreachable */:
+            case 1 /* nop */:
+            case 5 /* else */:
+            case 11 /* end */:
+            case 15 /* return */:
+            case 26 /* drop */:
+            case 27 /* select */:
+            case 69 /* i32_eqz */:
+            case 70 /* i32_eq */:
+            case 71 /* i32_ne */:
+            case 72 /* i32_lt_s */:
+            case 73 /* i32_lt_u */:
+            case 74 /* i32_gt_s */:
+            case 75 /* i32_gt_u */:
+            case 76 /* i32_le_s */:
+            case 77 /* i32_le_u */:
+            case 78 /* i32_ge_s */:
+            case 79 /* i32_ge_u */:
+            case 80 /* i64_eqz */:
+            case 81 /* i64_eq */:
+            case 82 /* i64_ne */:
+            case 83 /* i64_lt_s */:
+            case 84 /* i64_lt_u */:
+            case 85 /* i64_gt_s */:
+            case 86 /* i64_gt_u */:
+            case 87 /* i64_le_s */:
+            case 88 /* i64_le_u */:
+            case 89 /* i64_ge_s */:
+            case 90 /* i64_ge_u */:
+            case 91 /* f32_eq */:
+            case 92 /* f32_ne */:
+            case 93 /* f32_lt */:
+            case 94 /* f32_gt */:
+            case 95 /* f32_le */:
+            case 96 /* f32_ge */:
+            case 97 /* f64_eq */:
+            case 98 /* f64_ne */:
+            case 99 /* f64_lt */:
+            case 100 /* f64_gt */:
+            case 101 /* f64_le */:
+            case 102 /* f64_ge */:
+            case 103 /* i32_clz */:
+            case 104 /* i32_ctz */:
+            case 105 /* i32_popcnt */:
+            case 106 /* i32_add */:
+            case 107 /* i32_sub */:
+            case 108 /* i32_mul */:
+            case 109 /* i32_div_s */:
+            case 110 /* i32_div_u */:
+            case 111 /* i32_rem_s */:
+            case 112 /* i32_rem_u */:
+            case 113 /* i32_and */:
+            case 114 /* i32_or */:
+            case 115 /* i32_xor */:
+            case 116 /* i32_shl */:
+            case 117 /* i32_shr_s */:
+            case 118 /* i32_shr_u */:
+            case 119 /* i32_rotl */:
+            case 120 /* i32_rotr */:
+            case 121 /* i64_clz */:
+            case 122 /* i64_ctz */:
+            case 123 /* i64_popcnt */:
+            case 124 /* i64_add */:
+            case 125 /* i64_sub */:
+            case 126 /* i64_mul */:
+            case 127 /* i64_div_s */:
+            case 128 /* i64_div_u */:
+            case 129 /* i64_rem_s */:
+            case 130 /* i64_rem_u */:
+            case 131 /* i64_and */:
+            case 132 /* i64_or */:
+            case 133 /* i64_xor */:
+            case 134 /* i64_shl */:
+            case 135 /* i64_shr_s */:
+            case 136 /* i64_shr_u */:
+            case 137 /* i64_rotl */:
+            case 138 /* i64_rotr */:
+            case 139 /* f32_abs */:
+            case 140 /* f32_neg */:
+            case 141 /* f32_ceil */:
+            case 142 /* f32_floor */:
+            case 143 /* f32_trunc */:
+            case 144 /* f32_nearest */:
+            case 145 /* f32_sqrt */:
+            case 146 /* f32_add */:
+            case 147 /* f32_sub */:
+            case 148 /* f32_mul */:
+            case 149 /* f32_div */:
+            case 150 /* f32_min */:
+            case 151 /* f32_max */:
+            case 152 /* f32_copysign */:
+            case 153 /* f64_abs */:
+            case 154 /* f64_neg */:
+            case 155 /* f64_ceil */:
+            case 156 /* f64_floor */:
+            case 157 /* f64_trunc */:
+            case 158 /* f64_nearest */:
+            case 159 /* f64_sqrt */:
+            case 160 /* f64_add */:
+            case 161 /* f64_sub */:
+            case 162 /* f64_mul */:
+            case 163 /* f64_div */:
+            case 164 /* f64_min */:
+            case 165 /* f64_max */:
+            case 166 /* f64_copysign */:
+            case 167 /* i32_wrap_i64 */:
+            case 168 /* i32_trunc_s_f32 */:
+            case 169 /* i32_trunc_u_f32 */:
+            case 170 /* i32_trunc_s_f64 */:
+            case 171 /* i32_trunc_u_f64 */:
+            case 172 /* i64_extend_s_i32 */:
+            case 173 /* i64_extend_u_i32 */:
+            case 174 /* i64_trunc_s_f32 */:
+            case 175 /* i64_trunc_u_f32 */:
+            case 176 /* i64_trunc_s_f64 */:
+            case 177 /* i64_trunc_u_f64 */:
+            case 178 /* f32_convert_s_i32 */:
+            case 179 /* f32_convert_u_i32 */:
+            case 180 /* f32_convert_s_i64 */:
+            case 181 /* f32_convert_u_i64 */:
+            case 182 /* f32_demote_f64 */:
+            case 183 /* f64_convert_s_i32 */:
+            case 184 /* f64_convert_u_i32 */:
+            case 185 /* f64_convert_s_i64 */:
+            case 186 /* f64_convert_u_i64 */:
+            case 187 /* f64_promote_f32 */:
+            case 188 /* i32_reinterpret_f32 */:
+            case 189 /* i64_reinterpret_f64 */:
+            case 190 /* f32_reinterpret_i32 */:
+            case 191 /* f64_reinterpret_i64 */:
+            case 192 /* i32_extend8_s */:
+            case 193 /* i32_extend16_s */:
+            case 194 /* i64_extend8_s */:
+            case 195 /* i64_extend16_s */:
+            case 196 /* i64_extend32_s */:
+                break;
+            default:
+                this.error = new Error("Unknown operator: " + code);
+                this.state = -1 /* ERROR */;
+                return true;
         }
         this.result = { code: code,
             blockType: blockType, brDepth: brDepth, brTable: brTable,
             funcIndex: funcIndex, typeIndex: typeIndex, localIndex: localIndex,
             globalIndex: globalIndex, memoryAddress: memoryAddress, literal: literal };
         return true;
     };
     BinaryReader.prototype.readFunctionBody = function () {