Merge inbound to central, a=merge
authorWes Kocher <wkocher@mozilla.com>
Fri, 29 Sep 2017 14:47:25 -0700
changeset 383856 57f68296c350469d73d788eb3695a898947b4acb
parent 383855 64c8107a2a13895e9e4295806bf65b99639cb651 (current diff)
parent 383851 3e2e2396769027d52fba619101b82a561e90c356 (diff)
child 383857 a0700821d8ae125744c375507d37e4149a5dc74a
child 383875 f1251736514da97cf8065f631f0c93ce5c8695c7
push id52402
push userkwierso@gmail.com
push dateFri, 29 Sep 2017 21:49:11 +0000
treeherderautoland@a0700821d8ae [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone58.0a1
first release with
nightly linux32
57f68296c350 / 58.0a1 / 20170929220356 / files
nightly linux64
57f68296c350 / 58.0a1 / 20170929220356 / files
nightly mac
57f68296c350 / 58.0a1 / 20170929220356 / files
nightly win32
57f68296c350 / 58.0a1 / 20170929220356 / files
nightly win64
57f68296c350 / 58.0a1 / 20170929220356 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge inbound to central, a=merge MozReview-Commit-ID: IqwKWn7ceHC
browser/themes/osx/browser.css
dom/media/MediaManager.cpp
js/src/jit/VMFunctions.cpp
js/src/jit/VMFunctions.h
modules/libpref/init/all.js
--- a/browser/extensions/pdfjs/README.mozilla
+++ b/browser/extensions/pdfjs/README.mozilla
@@ -1,5 +1,5 @@
 This is the PDF.js project output, https://github.com/mozilla/pdf.js
 
-Current extension version is: 1.9.597
+Current extension version is: 1.9.607
 
-Taken from upstream commit: f3987bba
+Taken from upstream commit: b3f84112
--- a/browser/extensions/pdfjs/content/build/pdf.js
+++ b/browser/extensions/pdfjs/content/build/pdf.js
@@ -1506,16 +1506,19 @@ class DOMCanvasFactory {
   }
 }
 class DOMCMapReaderFactory {
   constructor({ baseUrl = null, isCompressed = false }) {
     this.baseUrl = baseUrl;
     this.isCompressed = isCompressed;
   }
   fetch({ name }) {
+    if (!this.baseUrl) {
+      return Promise.reject(new Error('CMap baseUrl must be specified, ' + 'see "PDFJS.cMapUrl" (and also "PDFJS.cMapPacked").'));
+    }
     if (!name) {
       return Promise.reject(new Error('CMap name must be specified.'));
     }
     return new Promise((resolve, reject) => {
       let url = this.baseUrl + name + (this.isCompressed ? '.bcmap' : '');
       let request = new XMLHttpRequest();
       request.open('GET', url, true);
       if (this.isCompressed) {
@@ -1985,25 +1988,27 @@ function getDocument(src, pdfDataRangeTr
     });
   }).catch(task._capability.reject);
   return task;
 }
 function _fetchDocument(worker, source, pdfDataRangeTransport, docId) {
   if (worker.destroyed) {
     return Promise.reject(new Error('Worker was destroyed'));
   }
+  let apiVersion = '1.9.607';
   source.disableAutoFetch = (0, _dom_utils.getDefaultSetting)('disableAutoFetch');
   source.disableStream = (0, _dom_utils.getDefaultSetting)('disableStream');
   source.chunkedViewerLoading = !!pdfDataRangeTransport;
   if (pdfDataRangeTransport) {
     source.length = pdfDataRangeTransport.length;
     source.initialData = pdfDataRangeTransport.initialData;
   }
   return worker.messageHandler.sendWithPromise('GetDocRequest', {
     docId,
+    apiVersion,
     source: {
       data: source.data,
       url: source.url,
       password: source.password,
       disableAutoFetch: source.disableAutoFetch,
       rangeChunkSize: source.rangeChunkSize,
       length: source.length
     },
@@ -3304,18 +3309,18 @@ var _UnsupportedManager = function Unsup
       for (var i = 0, ii = listeners.length; i < ii; i++) {
         listeners[i](featureId);
       }
     }
   };
 }();
 var version, build;
 {
-  exports.version = version = '1.9.597';
-  exports.build = build = 'f3987bba';
+  exports.version = version = '1.9.607';
+  exports.build = build = 'b3f84112';
 }
 exports.getDocument = getDocument;
 exports.LoopbackPort = LoopbackPort;
 exports.PDFDataRangeTransport = PDFDataRangeTransport;
 exports.PDFWorker = PDFWorker;
 exports.PDFDocumentProxy = PDFDocumentProxy;
 exports.PDFPageProxy = PDFPageProxy;
 exports.setPDFNetworkStreamClass = setPDFNetworkStreamClass;
@@ -5044,18 +5049,18 @@ exports.SVGGraphics = SVGGraphics;
 
 /***/ }),
 /* 9 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
-var pdfjsVersion = '1.9.597';
-var pdfjsBuild = 'f3987bba';
+var pdfjsVersion = '1.9.607';
+var pdfjsBuild = 'b3f84112';
 var pdfjsSharedUtil = __w_pdfjs_require__(0);
 var pdfjsDisplayGlobal = __w_pdfjs_require__(13);
 var pdfjsDisplayAPI = __w_pdfjs_require__(3);
 var pdfjsDisplayTextLayer = __w_pdfjs_require__(7);
 var pdfjsDisplayAnnotationLayer = __w_pdfjs_require__(6);
 var pdfjsDisplayDOMUtils = __w_pdfjs_require__(1);
 var pdfjsDisplaySVG = __w_pdfjs_require__(8);
 ;
@@ -8171,18 +8176,18 @@ var _svg = __w_pdfjs_require__(8);
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 var isWorker = typeof window === 'undefined';
 if (!_global_scope2.default.PDFJS) {
   _global_scope2.default.PDFJS = {};
 }
 var PDFJS = _global_scope2.default.PDFJS;
 {
-  PDFJS.version = '1.9.597';
-  PDFJS.build = 'f3987bba';
+  PDFJS.version = '1.9.607';
+  PDFJS.build = 'b3f84112';
 }
 PDFJS.pdfBug = false;
 if (PDFJS.verbosity !== undefined) {
   (0, _util.setVerbosityLevel)(PDFJS.verbosity);
 }
 delete PDFJS.verbosity;
 Object.defineProperty(PDFJS, 'verbosity', {
   get() {
--- a/browser/extensions/pdfjs/content/build/pdf.worker.js
+++ b/browser/extensions/pdfjs/content/build/pdf.worker.js
@@ -1699,17 +1699,17 @@ exports.LZWStream = exports.StringStream
 var _util = __w_pdfjs_require__(0);
 
 var _primitives = __w_pdfjs_require__(1);
 
 var _jbig = __w_pdfjs_require__(24);
 
 var _jpg = __w_pdfjs_require__(25);
 
-var _jpx = __w_pdfjs_require__(11);
+var _jpx = __w_pdfjs_require__(10);
 
 var Stream = function StreamClosure() {
   function Stream(arrayBuffer, start, length, dict) {
     this.bytes = arrayBuffer instanceof Uint8Array ? arrayBuffer : new Uint8Array(arrayBuffer);
     this.start = start || 0;
     this.pos = this.start;
     this.end = start + length || this.bytes.length;
     this.dict = dict;
@@ -3403,18 +3403,16 @@ Object.defineProperty(exports, "__esModu
   value: true
 });
 exports.ColorSpace = undefined;
 
 var _util = __w_pdfjs_require__(0);
 
 var _primitives = __w_pdfjs_require__(1);
 
-var _function = __w_pdfjs_require__(6);
-
 var ColorSpace = function ColorSpaceClosure() {
   function resizeRgbImage(src, bpc, w1, h1, w2, h2, alpha01, dest) {
     var COMPONENTS = 3;
     alpha01 = alpha01 !== 1 ? 0 : alpha01;
     var xRatio = w1 / w2;
     var yRatio = h1 / h2;
     var i,
         j,
@@ -3514,21 +3512,21 @@ var ColorSpace = function ColorSpaceClos
             dest[destPos++] = rgbBuf[rgbPos++];
             destPos += alpha01;
           }
         }
       }
     },
     usesZeroToOneRange: true
   };
-  ColorSpace.parse = function ColorSpace_parse(cs, xref, res) {
-    let IR = ColorSpace.parseToIR(cs, xref, res);
-    return ColorSpace.fromIR(IR);
-  };
-  ColorSpace.fromIR = function ColorSpace_fromIR(IR) {
+  ColorSpace.parse = function (cs, xref, res, pdfFunctionFactory) {
+    let IR = ColorSpace.parseToIR(cs, xref, res, pdfFunctionFactory);
+    return ColorSpace.fromIR(IR, pdfFunctionFactory);
+  };
+  ColorSpace.fromIR = function (IR, pdfFunctionFactory) {
     var name = Array.isArray(IR) ? IR[0] : IR;
     var whitePoint, blackPoint, gamma;
     switch (name) {
       case 'DeviceGrayCS':
         return this.singletons.gray;
       case 'DeviceRgbCS':
         return this.singletons.rgb;
       case 'DeviceCmykCS':
@@ -3542,39 +3540,39 @@ var ColorSpace = function ColorSpaceClos
         whitePoint = IR[1];
         blackPoint = IR[2];
         gamma = IR[3];
         var matrix = IR[4];
         return new CalRGBCS(whitePoint, blackPoint, gamma, matrix);
       case 'PatternCS':
         var basePatternCS = IR[1];
         if (basePatternCS) {
-          basePatternCS = ColorSpace.fromIR(basePatternCS);
+          basePatternCS = ColorSpace.fromIR(basePatternCS, pdfFunctionFactory);
         }
         return new PatternCS(basePatternCS);
       case 'IndexedCS':
         var baseIndexedCS = IR[1];
         var hiVal = IR[2];
         var lookup = IR[3];
-        return new IndexedCS(ColorSpace.fromIR(baseIndexedCS), hiVal, lookup);
+        return new IndexedCS(ColorSpace.fromIR(baseIndexedCS, pdfFunctionFactory), hiVal, lookup);
       case 'AlternateCS':
         var numComps = IR[1];
         var alt = IR[2];
         var tintFnIR = IR[3];
-        return new AlternateCS(numComps, ColorSpace.fromIR(alt), _function.PDFFunction.fromIR(tintFnIR));
+        return new AlternateCS(numComps, ColorSpace.fromIR(alt, pdfFunctionFactory), pdfFunctionFactory.createFromIR(tintFnIR));
       case 'LabCS':
         whitePoint = IR[1];
         blackPoint = IR[2];
         var range = IR[3];
         return new LabCS(whitePoint, blackPoint, range);
       default:
         throw new _util.FormatError(`Unknown colorspace name: ${name}`);
     }
   };
-  ColorSpace.parseToIR = function ColorSpace_parseToIR(cs, xref, res) {
+  ColorSpace.parseToIR = function (cs, xref, res, pdfFunctionFactory) {
     if ((0, _primitives.isName)(cs)) {
       var colorSpaces = res.get('ColorSpace');
       if ((0, _primitives.isDict)(colorSpaces)) {
         var refcs = colorSpaces.get(cs.name);
         if (refcs) {
           cs = refcs;
         }
       }
@@ -3624,52 +3622,52 @@ var ColorSpace = function ColorSpaceClos
           var matrix = params.getArray('Matrix');
           return ['CalRGBCS', whitePoint, blackPoint, gamma, matrix];
         case 'ICCBased':
           var stream = xref.fetchIfRef(cs[1]);
           var dict = stream.dict;
           numComps = dict.get('N');
           alt = dict.get('Alternate');
           if (alt) {
-            var altIR = ColorSpace.parseToIR(alt, xref, res);
-            var altCS = ColorSpace.fromIR(altIR);
+            var altIR = ColorSpace.parseToIR(alt, xref, res, pdfFunctionFactory);
+            var altCS = ColorSpace.fromIR(altIR, pdfFunctionFactory);
             if (altCS.numComps === numComps) {
               return altIR;
             }
             (0, _util.warn)('ICCBased color space: Ignoring incorrect /Alternate entry.');
           }
           if (numComps === 1) {
             return 'DeviceGrayCS';
           } else if (numComps === 3) {
             return 'DeviceRgbCS';
           } else if (numComps === 4) {
             return 'DeviceCmykCS';
           }
           break;
         case 'Pattern':
           var basePatternCS = cs[1] || null;
           if (basePatternCS) {
-            basePatternCS = ColorSpace.parseToIR(basePatternCS, xref, res);
+            basePatternCS = ColorSpace.parseToIR(basePatternCS, xref, res, pdfFunctionFactory);
           }
           return ['PatternCS', basePatternCS];
         case 'Indexed':
         case 'I':
-          var baseIndexedCS = ColorSpace.parseToIR(cs[1], xref, res);
+          var baseIndexedCS = ColorSpace.parseToIR(cs[1], xref, res, pdfFunctionFactory);
           var hiVal = xref.fetchIfRef(cs[2]) + 1;
           var lookup = xref.fetchIfRef(cs[3]);
           if ((0, _primitives.isStream)(lookup)) {
             lookup = lookup.getBytes();
           }
           return ['IndexedCS', baseIndexedCS, hiVal, lookup];
         case 'Separation':
         case 'DeviceN':
           var name = xref.fetchIfRef(cs[1]);
           numComps = Array.isArray(name) ? name.length : 1;
-          alt = ColorSpace.parseToIR(cs[2], xref, res);
-          var tintFnIR = _function.PDFFunction.getIR(xref, xref.fetchIfRef(cs[3]));
+          alt = ColorSpace.parseToIR(cs[2], xref, res, pdfFunctionFactory);
+          let tintFnIR = pdfFunctionFactory.createIR(xref.fetchIfRef(cs[3]));
           return ['AlternateCS', numComps, alt, tintFnIR];
         case 'Lab':
           params = xref.fetchIfRef(cs[1]);
           whitePoint = params.getArray('WhitePoint');
           blackPoint = params.getArray('BlackPoint');
           var range = params.getArray('Range');
           return ['LabCS', whitePoint, blackPoint, range];
         default:
@@ -5327,998 +5325,16 @@ var Linearization = {
 exports.Lexer = Lexer;
 exports.Linearization = Linearization;
 exports.Parser = Parser;
 
 /***/ }),
 /* 6 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.PostScriptCompiler = exports.PostScriptEvaluator = exports.PDFFunction = exports.isPDFFunction = undefined;
-
-var _util = __w_pdfjs_require__(0);
-
-var _primitives = __w_pdfjs_require__(1);
-
-var _ps_parser = __w_pdfjs_require__(26);
-
-let IsEvalSupportedCached = {
-  get value() {
-    return (0, _util.shadow)(this, 'value', (0, _util.isEvalSupported)());
-  }
-};
-var PDFFunction = function PDFFunctionClosure() {
-  var CONSTRUCT_SAMPLED = 0;
-  var CONSTRUCT_INTERPOLATED = 2;
-  var CONSTRUCT_STICHED = 3;
-  var CONSTRUCT_POSTSCRIPT = 4;
-  let isEvalSupported = true;
-  return {
-    setIsEvalSupported(support = true) {
-      isEvalSupported = support !== false;
-    },
-    getSampleArray: function PDFFunction_getSampleArray(size, outputSize, bps, str) {
-      var i, ii;
-      var length = 1;
-      for (i = 0, ii = size.length; i < ii; i++) {
-        length *= size[i];
-      }
-      length *= outputSize;
-      var array = new Array(length);
-      var codeSize = 0;
-      var codeBuf = 0;
-      var sampleMul = 1.0 / (Math.pow(2.0, bps) - 1);
-      var strBytes = str.getBytes((length * bps + 7) / 8);
-      var strIdx = 0;
-      for (i = 0; i < length; i++) {
-        while (codeSize < bps) {
-          codeBuf <<= 8;
-          codeBuf |= strBytes[strIdx++];
-          codeSize += 8;
-        }
-        codeSize -= bps;
-        array[i] = (codeBuf >> codeSize) * sampleMul;
-        codeBuf &= (1 << codeSize) - 1;
-      }
-      return array;
-    },
-    getIR: function PDFFunction_getIR(xref, fn) {
-      var dict = fn.dict;
-      if (!dict) {
-        dict = fn;
-      }
-      var types = [this.constructSampled, null, this.constructInterpolated, this.constructStiched, this.constructPostScript];
-      var typeNum = dict.get('FunctionType');
-      var typeFn = types[typeNum];
-      if (!typeFn) {
-        throw new _util.FormatError('Unknown type of function');
-      }
-      return typeFn.call(this, fn, dict, xref);
-    },
-    fromIR: function PDFFunction_fromIR(IR) {
-      var type = IR[0];
-      switch (type) {
-        case CONSTRUCT_SAMPLED:
-          return this.constructSampledFromIR(IR);
-        case CONSTRUCT_INTERPOLATED:
-          return this.constructInterpolatedFromIR(IR);
-        case CONSTRUCT_STICHED:
-          return this.constructStichedFromIR(IR);
-        default:
-          return this.constructPostScriptFromIR(IR);
-      }
-    },
-    parse: function PDFFunction_parse(xref, fn) {
-      var IR = this.getIR(xref, fn);
-      return this.fromIR(IR);
-    },
-    parseArray: function PDFFunction_parseArray(xref, fnObj) {
-      if (!Array.isArray(fnObj)) {
-        return this.parse(xref, fnObj);
-      }
-      var fnArray = [];
-      for (var j = 0, jj = fnObj.length; j < jj; j++) {
-        var obj = xref.fetchIfRef(fnObj[j]);
-        fnArray.push(PDFFunction.parse(xref, obj));
-      }
-      return function (src, srcOffset, dest, destOffset) {
-        for (var i = 0, ii = fnArray.length; i < ii; i++) {
-          fnArray[i](src, srcOffset, dest, destOffset + i);
-        }
-      };
-    },
-    constructSampled: function PDFFunction_constructSampled(str, dict) {
-      function toMultiArray(arr) {
-        var inputLength = arr.length;
-        var out = [];
-        var index = 0;
-        for (var i = 0; i < inputLength; i += 2) {
-          out[index] = [arr[i], arr[i + 1]];
-          ++index;
-        }
-        return out;
-      }
-      var domain = dict.getArray('Domain');
-      var range = dict.getArray('Range');
-      if (!domain || !range) {
-        throw new _util.FormatError('No domain or range');
-      }
-      var inputSize = domain.length / 2;
-      var outputSize = range.length / 2;
-      domain = toMultiArray(domain);
-      range = toMultiArray(range);
-      var size = dict.get('Size');
-      var bps = dict.get('BitsPerSample');
-      var order = dict.get('Order') || 1;
-      if (order !== 1) {
-        (0, _util.info)('No support for cubic spline interpolation: ' + order);
-      }
-      var encode = dict.getArray('Encode');
-      if (!encode) {
-        encode = [];
-        for (var i = 0; i < inputSize; ++i) {
-          encode.push(0);
-          encode.push(size[i] - 1);
-        }
-      }
-      encode = toMultiArray(encode);
-      var decode = dict.getArray('Decode');
-      if (!decode) {
-        decode = range;
-      } else {
-        decode = toMultiArray(decode);
-      }
-      var samples = this.getSampleArray(size, outputSize, bps, str);
-      return [CONSTRUCT_SAMPLED, inputSize, domain, encode, decode, samples, size, outputSize, Math.pow(2, bps) - 1, range];
-    },
-    constructSampledFromIR: function PDFFunction_constructSampledFromIR(IR) {
-      function interpolate(x, xmin, xmax, ymin, ymax) {
-        return ymin + (x - xmin) * ((ymax - ymin) / (xmax - xmin));
-      }
-      return function constructSampledFromIRResult(src, srcOffset, dest, destOffset) {
-        var m = IR[1];
-        var domain = IR[2];
-        var encode = IR[3];
-        var decode = IR[4];
-        var samples = IR[5];
-        var size = IR[6];
-        var n = IR[7];
-        var range = IR[9];
-        var cubeVertices = 1 << m;
-        var cubeN = new Float64Array(cubeVertices);
-        var cubeVertex = new Uint32Array(cubeVertices);
-        var i, j;
-        for (j = 0; j < cubeVertices; j++) {
-          cubeN[j] = 1;
-        }
-        var k = n,
-            pos = 1;
-        for (i = 0; i < m; ++i) {
-          var domain_2i = domain[i][0];
-          var domain_2i_1 = domain[i][1];
-          var xi = Math.min(Math.max(src[srcOffset + i], domain_2i), domain_2i_1);
-          var e = interpolate(xi, domain_2i, domain_2i_1, encode[i][0], encode[i][1]);
-          var size_i = size[i];
-          e = Math.min(Math.max(e, 0), size_i - 1);
-          var e0 = e < size_i - 1 ? Math.floor(e) : e - 1;
-          var n0 = e0 + 1 - e;
-          var n1 = e - e0;
-          var offset0 = e0 * k;
-          var offset1 = offset0 + k;
-          for (j = 0; j < cubeVertices; j++) {
-            if (j & pos) {
-              cubeN[j] *= n1;
-              cubeVertex[j] += offset1;
-            } else {
-              cubeN[j] *= n0;
-              cubeVertex[j] += offset0;
-            }
-          }
-          k *= size_i;
-          pos <<= 1;
-        }
-        for (j = 0; j < n; ++j) {
-          var rj = 0;
-          for (i = 0; i < cubeVertices; i++) {
-            rj += samples[cubeVertex[i] + j] * cubeN[i];
-          }
-          rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]);
-          dest[destOffset + j] = Math.min(Math.max(rj, range[j][0]), range[j][1]);
-        }
-      };
-    },
-    constructInterpolated: function PDFFunction_constructInterpolated(str, dict) {
-      var c0 = dict.getArray('C0') || [0];
-      var c1 = dict.getArray('C1') || [1];
-      var n = dict.get('N');
-      if (!Array.isArray(c0) || !Array.isArray(c1)) {
-        throw new _util.FormatError('Illegal dictionary for interpolated function');
-      }
-      var length = c0.length;
-      var diff = [];
-      for (var i = 0; i < length; ++i) {
-        diff.push(c1[i] - c0[i]);
-      }
-      return [CONSTRUCT_INTERPOLATED, c0, diff, n];
-    },
-    constructInterpolatedFromIR: function PDFFunction_constructInterpolatedFromIR(IR) {
-      var c0 = IR[1];
-      var diff = IR[2];
-      var n = IR[3];
-      var length = diff.length;
-      return function constructInterpolatedFromIRResult(src, srcOffset, dest, destOffset) {
-        var x = n === 1 ? src[srcOffset] : Math.pow(src[srcOffset], n);
-        for (var j = 0; j < length; ++j) {
-          dest[destOffset + j] = c0[j] + x * diff[j];
-        }
-      };
-    },
-    constructStiched: function PDFFunction_constructStiched(fn, dict, xref) {
-      var domain = dict.getArray('Domain');
-      if (!domain) {
-        throw new _util.FormatError('No domain');
-      }
-      var inputSize = domain.length / 2;
-      if (inputSize !== 1) {
-        throw new _util.FormatError('Bad domain for stiched function');
-      }
-      var fnRefs = dict.get('Functions');
-      var fns = [];
-      for (var i = 0, ii = fnRefs.length; i < ii; ++i) {
-        fns.push(PDFFunction.getIR(xref, xref.fetchIfRef(fnRefs[i])));
-      }
-      var bounds = dict.getArray('Bounds');
-      var encode = dict.getArray('Encode');
-      return [CONSTRUCT_STICHED, domain, bounds, encode, fns];
-    },
-    constructStichedFromIR: function PDFFunction_constructStichedFromIR(IR) {
-      var domain = IR[1];
-      var bounds = IR[2];
-      var encode = IR[3];
-      var fnsIR = IR[4];
-      var fns = [];
-      var tmpBuf = new Float32Array(1);
-      for (var i = 0, ii = fnsIR.length; i < ii; i++) {
-        fns.push(PDFFunction.fromIR(fnsIR[i]));
-      }
-      return function constructStichedFromIRResult(src, srcOffset, dest, destOffset) {
-        var clip = function constructStichedFromIRClip(v, min, max) {
-          if (v > max) {
-            v = max;
-          } else if (v < min) {
-            v = min;
-          }
-          return v;
-        };
-        var v = clip(src[srcOffset], domain[0], domain[1]);
-        for (var i = 0, ii = bounds.length; i < ii; ++i) {
-          if (v < bounds[i]) {
-            break;
-          }
-        }
-        var dmin = domain[0];
-        if (i > 0) {
-          dmin = bounds[i - 1];
-        }
-        var dmax = domain[1];
-        if (i < bounds.length) {
-          dmax = bounds[i];
-        }
-        var rmin = encode[2 * i];
-        var rmax = encode[2 * i + 1];
-        tmpBuf[0] = dmin === dmax ? rmin : rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin);
-        fns[i](tmpBuf, 0, dest, destOffset);
-      };
-    },
-    constructPostScript: function PDFFunction_constructPostScript(fn, dict, xref) {
-      var domain = dict.getArray('Domain');
-      var range = dict.getArray('Range');
-      if (!domain) {
-        throw new _util.FormatError('No domain.');
-      }
-      if (!range) {
-        throw new _util.FormatError('No range.');
-      }
-      var lexer = new _ps_parser.PostScriptLexer(fn);
-      var parser = new _ps_parser.PostScriptParser(lexer);
-      var code = parser.parse();
-      return [CONSTRUCT_POSTSCRIPT, domain, range, code];
-    },
-    constructPostScriptFromIR: function PDFFunction_constructPostScriptFromIR(IR) {
-      var domain = IR[1];
-      var range = IR[2];
-      var code = IR[3];
-      if (isEvalSupported && IsEvalSupportedCached.value) {
-        let compiled = new PostScriptCompiler().compile(code, domain, range);
-        if (compiled) {
-          return new Function('src', 'srcOffset', 'dest', 'destOffset', compiled);
-        }
-      }
-      (0, _util.info)('Unable to compile PS function');
-      var numOutputs = range.length >> 1;
-      var numInputs = domain.length >> 1;
-      var evaluator = new PostScriptEvaluator(code);
-      var cache = Object.create(null);
-      var MAX_CACHE_SIZE = 2048 * 4;
-      var cache_available = MAX_CACHE_SIZE;
-      var tmpBuf = new Float32Array(numInputs);
-      return function constructPostScriptFromIRResult(src, srcOffset, dest, destOffset) {
-        var i, value;
-        var key = '';
-        var input = tmpBuf;
-        for (i = 0; i < numInputs; i++) {
-          value = src[srcOffset + i];
-          input[i] = value;
-          key += value + '_';
-        }
-        var cachedValue = cache[key];
-        if (cachedValue !== undefined) {
-          dest.set(cachedValue, destOffset);
-          return;
-        }
-        var output = new Float32Array(numOutputs);
-        var stack = evaluator.execute(input);
-        var stackIndex = stack.length - numOutputs;
-        for (i = 0; i < numOutputs; i++) {
-          value = stack[stackIndex + i];
-          var bound = range[i * 2];
-          if (value < bound) {
-            value = bound;
-          } else {
-            bound = range[i * 2 + 1];
-            if (value > bound) {
-              value = bound;
-            }
-          }
-          output[i] = value;
-        }
-        if (cache_available > 0) {
-          cache_available--;
-          cache[key] = output;
-        }
-        dest.set(output, destOffset);
-      };
-    }
-  };
-}();
-function isPDFFunction(v) {
-  var fnDict;
-  if (typeof v !== 'object') {
-    return false;
-  } else if ((0, _primitives.isDict)(v)) {
-    fnDict = v;
-  } else if ((0, _primitives.isStream)(v)) {
-    fnDict = v.dict;
-  } else {
-    return false;
-  }
-  return fnDict.has('FunctionType');
-}
-var PostScriptStack = function PostScriptStackClosure() {
-  var MAX_STACK_SIZE = 100;
-  function PostScriptStack(initialStack) {
-    this.stack = !initialStack ? [] : Array.prototype.slice.call(initialStack, 0);
-  }
-  PostScriptStack.prototype = {
-    push: function PostScriptStack_push(value) {
-      if (this.stack.length >= MAX_STACK_SIZE) {
-        throw new Error('PostScript function stack overflow.');
-      }
-      this.stack.push(value);
-    },
-    pop: function PostScriptStack_pop() {
-      if (this.stack.length <= 0) {
-        throw new Error('PostScript function stack underflow.');
-      }
-      return this.stack.pop();
-    },
-    copy: function PostScriptStack_copy(n) {
-      if (this.stack.length + n >= MAX_STACK_SIZE) {
-        throw new Error('PostScript function stack overflow.');
-      }
-      var stack = this.stack;
-      for (var i = stack.length - n, j = n - 1; j >= 0; j--, i++) {
-        stack.push(stack[i]);
-      }
-    },
-    index: function PostScriptStack_index(n) {
-      this.push(this.stack[this.stack.length - n - 1]);
-    },
-    roll: function PostScriptStack_roll(n, p) {
-      var stack = this.stack;
-      var l = stack.length - n;
-      var r = stack.length - 1,
-          c = l + (p - Math.floor(p / n) * n),
-          i,
-          j,
-          t;
-      for (i = l, j = r; i < j; i++, j--) {
-        t = stack[i];
-        stack[i] = stack[j];
-        stack[j] = t;
-      }
-      for (i = l, j = c - 1; i < j; i++, j--) {
-        t = stack[i];
-        stack[i] = stack[j];
-        stack[j] = t;
-      }
-      for (i = c, j = r; i < j; i++, j--) {
-        t = stack[i];
-        stack[i] = stack[j];
-        stack[j] = t;
-      }
-    }
-  };
-  return PostScriptStack;
-}();
-var PostScriptEvaluator = function PostScriptEvaluatorClosure() {
-  function PostScriptEvaluator(operators) {
-    this.operators = operators;
-  }
-  PostScriptEvaluator.prototype = {
-    execute: function PostScriptEvaluator_execute(initialStack) {
-      var stack = new PostScriptStack(initialStack);
-      var counter = 0;
-      var operators = this.operators;
-      var length = operators.length;
-      var operator, a, b;
-      while (counter < length) {
-        operator = operators[counter++];
-        if (typeof operator === 'number') {
-          stack.push(operator);
-          continue;
-        }
-        switch (operator) {
-          case 'jz':
-            b = stack.pop();
-            a = stack.pop();
-            if (!a) {
-              counter = b;
-            }
-            break;
-          case 'j':
-            a = stack.pop();
-            counter = a;
-            break;
-          case 'abs':
-            a = stack.pop();
-            stack.push(Math.abs(a));
-            break;
-          case 'add':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a + b);
-            break;
-          case 'and':
-            b = stack.pop();
-            a = stack.pop();
-            if ((0, _util.isBool)(a) && (0, _util.isBool)(b)) {
-              stack.push(a && b);
-            } else {
-              stack.push(a & b);
-            }
-            break;
-          case 'atan':
-            a = stack.pop();
-            stack.push(Math.atan(a));
-            break;
-          case 'bitshift':
-            b = stack.pop();
-            a = stack.pop();
-            if (a > 0) {
-              stack.push(a << b);
-            } else {
-              stack.push(a >> b);
-            }
-            break;
-          case 'ceiling':
-            a = stack.pop();
-            stack.push(Math.ceil(a));
-            break;
-          case 'copy':
-            a = stack.pop();
-            stack.copy(a);
-            break;
-          case 'cos':
-            a = stack.pop();
-            stack.push(Math.cos(a));
-            break;
-          case 'cvi':
-            a = stack.pop() | 0;
-            stack.push(a);
-            break;
-          case 'cvr':
-            break;
-          case 'div':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a / b);
-            break;
-          case 'dup':
-            stack.copy(1);
-            break;
-          case 'eq':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a === b);
-            break;
-          case 'exch':
-            stack.roll(2, 1);
-            break;
-          case 'exp':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(Math.pow(a, b));
-            break;
-          case 'false':
-            stack.push(false);
-            break;
-          case 'floor':
-            a = stack.pop();
-            stack.push(Math.floor(a));
-            break;
-          case 'ge':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a >= b);
-            break;
-          case 'gt':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a > b);
-            break;
-          case 'idiv':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a / b | 0);
-            break;
-          case 'index':
-            a = stack.pop();
-            stack.index(a);
-            break;
-          case 'le':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a <= b);
-            break;
-          case 'ln':
-            a = stack.pop();
-            stack.push(Math.log(a));
-            break;
-          case 'log':
-            a = stack.pop();
-            stack.push(Math.log(a) / Math.LN10);
-            break;
-          case 'lt':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a < b);
-            break;
-          case 'mod':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a % b);
-            break;
-          case 'mul':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a * b);
-            break;
-          case 'ne':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a !== b);
-            break;
-          case 'neg':
-            a = stack.pop();
-            stack.push(-a);
-            break;
-          case 'not':
-            a = stack.pop();
-            if ((0, _util.isBool)(a)) {
-              stack.push(!a);
-            } else {
-              stack.push(~a);
-            }
-            break;
-          case 'or':
-            b = stack.pop();
-            a = stack.pop();
-            if ((0, _util.isBool)(a) && (0, _util.isBool)(b)) {
-              stack.push(a || b);
-            } else {
-              stack.push(a | b);
-            }
-            break;
-          case 'pop':
-            stack.pop();
-            break;
-          case 'roll':
-            b = stack.pop();
-            a = stack.pop();
-            stack.roll(a, b);
-            break;
-          case 'round':
-            a = stack.pop();
-            stack.push(Math.round(a));
-            break;
-          case 'sin':
-            a = stack.pop();
-            stack.push(Math.sin(a));
-            break;
-          case 'sqrt':
-            a = stack.pop();
-            stack.push(Math.sqrt(a));
-            break;
-          case 'sub':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a - b);
-            break;
-          case 'true':
-            stack.push(true);
-            break;
-          case 'truncate':
-            a = stack.pop();
-            a = a < 0 ? Math.ceil(a) : Math.floor(a);
-            stack.push(a);
-            break;
-          case 'xor':
-            b = stack.pop();
-            a = stack.pop();
-            if ((0, _util.isBool)(a) && (0, _util.isBool)(b)) {
-              stack.push(a !== b);
-            } else {
-              stack.push(a ^ b);
-            }
-            break;
-          default:
-            throw new _util.FormatError(`Unknown operator ${operator}`);
-        }
-      }
-      return stack.stack;
-    }
-  };
-  return PostScriptEvaluator;
-}();
-var PostScriptCompiler = function PostScriptCompilerClosure() {
-  function AstNode(type) {
-    this.type = type;
-  }
-  AstNode.prototype.visit = function (visitor) {
-    throw new Error('abstract method');
-  };
-  function AstArgument(index, min, max) {
-    AstNode.call(this, 'args');
-    this.index = index;
-    this.min = min;
-    this.max = max;
-  }
-  AstArgument.prototype = Object.create(AstNode.prototype);
-  AstArgument.prototype.visit = function (visitor) {
-    visitor.visitArgument(this);
-  };
-  function AstLiteral(number) {
-    AstNode.call(this, 'literal');
-    this.number = number;
-    this.min = number;
-    this.max = number;
-  }
-  AstLiteral.prototype = Object.create(AstNode.prototype);
-  AstLiteral.prototype.visit = function (visitor) {
-    visitor.visitLiteral(this);
-  };
-  function AstBinaryOperation(op, arg1, arg2, min, max) {
-    AstNode.call(this, 'binary');
-    this.op = op;
-    this.arg1 = arg1;
-    this.arg2 = arg2;
-    this.min = min;
-    this.max = max;
-  }
-  AstBinaryOperation.prototype = Object.create(AstNode.prototype);
-  AstBinaryOperation.prototype.visit = function (visitor) {
-    visitor.visitBinaryOperation(this);
-  };
-  function AstMin(arg, max) {
-    AstNode.call(this, 'max');
-    this.arg = arg;
-    this.min = arg.min;
-    this.max = max;
-  }
-  AstMin.prototype = Object.create(AstNode.prototype);
-  AstMin.prototype.visit = function (visitor) {
-    visitor.visitMin(this);
-  };
-  function AstVariable(index, min, max) {
-    AstNode.call(this, 'var');
-    this.index = index;
-    this.min = min;
-    this.max = max;
-  }
-  AstVariable.prototype = Object.create(AstNode.prototype);
-  AstVariable.prototype.visit = function (visitor) {
-    visitor.visitVariable(this);
-  };
-  function AstVariableDefinition(variable, arg) {
-    AstNode.call(this, 'definition');
-    this.variable = variable;
-    this.arg = arg;
-  }
-  AstVariableDefinition.prototype = Object.create(AstNode.prototype);
-  AstVariableDefinition.prototype.visit = function (visitor) {
-    visitor.visitVariableDefinition(this);
-  };
-  function ExpressionBuilderVisitor() {
-    this.parts = [];
-  }
-  ExpressionBuilderVisitor.prototype = {
-    visitArgument(arg) {
-      this.parts.push('Math.max(', arg.min, ', Math.min(', arg.max, ', src[srcOffset + ', arg.index, ']))');
-    },
-    visitVariable(variable) {
-      this.parts.push('v', variable.index);
-    },
-    visitLiteral(literal) {
-      this.parts.push(literal.number);
-    },
-    visitBinaryOperation(operation) {
-      this.parts.push('(');
-      operation.arg1.visit(this);
-      this.parts.push(' ', operation.op, ' ');
-      operation.arg2.visit(this);
-      this.parts.push(')');
-    },
-    visitVariableDefinition(definition) {
-      this.parts.push('var ');
-      definition.variable.visit(this);
-      this.parts.push(' = ');
-      definition.arg.visit(this);
-      this.parts.push(';');
-    },
-    visitMin(max) {
-      this.parts.push('Math.min(');
-      max.arg.visit(this);
-      this.parts.push(', ', max.max, ')');
-    },
-    toString() {
-      return this.parts.join('');
-    }
-  };
-  function buildAddOperation(num1, num2) {
-    if (num2.type === 'literal' && num2.number === 0) {
-      return num1;
-    }
-    if (num1.type === 'literal' && num1.number === 0) {
-      return num2;
-    }
-    if (num2.type === 'literal' && num1.type === 'literal') {
-      return new AstLiteral(num1.number + num2.number);
-    }
-    return new AstBinaryOperation('+', num1, num2, num1.min + num2.min, num1.max + num2.max);
-  }
-  function buildMulOperation(num1, num2) {
-    if (num2.type === 'literal') {
-      if (num2.number === 0) {
-        return new AstLiteral(0);
-      } else if (num2.number === 1) {
-        return num1;
-      } else if (num1.type === 'literal') {
-        return new AstLiteral(num1.number * num2.number);
-      }
-    }
-    if (num1.type === 'literal') {
-      if (num1.number === 0) {
-        return new AstLiteral(0);
-      } else if (num1.number === 1) {
-        return num2;
-      }
-    }
-    var min = Math.min(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max);
-    var max = Math.max(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max);
-    return new AstBinaryOperation('*', num1, num2, min, max);
-  }
-  function buildSubOperation(num1, num2) {
-    if (num2.type === 'literal') {
-      if (num2.number === 0) {
-        return num1;
-      } else if (num1.type === 'literal') {
-        return new AstLiteral(num1.number - num2.number);
-      }
-    }
-    if (num2.type === 'binary' && num2.op === '-' && num1.type === 'literal' && num1.number === 1 && num2.arg1.type === 'literal' && num2.arg1.number === 1) {
-      return num2.arg2;
-    }
-    return new AstBinaryOperation('-', num1, num2, num1.min - num2.max, num1.max - num2.min);
-  }
-  function buildMinOperation(num1, max) {
-    if (num1.min >= max) {
-      return new AstLiteral(max);
-    } else if (num1.max <= max) {
-      return num1;
-    }
-    return new AstMin(num1, max);
-  }
-  function PostScriptCompiler() {}
-  PostScriptCompiler.prototype = {
-    compile: function PostScriptCompiler_compile(code, domain, range) {
-      var stack = [];
-      var i, ii;
-      var instructions = [];
-      var inputSize = domain.length >> 1,
-          outputSize = range.length >> 1;
-      var lastRegister = 0;
-      var n, j;
-      var num1, num2, ast1, ast2, tmpVar, item;
-      for (i = 0; i < inputSize; i++) {
-        stack.push(new AstArgument(i, domain[i * 2], domain[i * 2 + 1]));
-      }
-      for (i = 0, ii = code.length; i < ii; i++) {
-        item = code[i];
-        if (typeof item === 'number') {
-          stack.push(new AstLiteral(item));
-          continue;
-        }
-        switch (item) {
-          case 'add':
-            if (stack.length < 2) {
-              return null;
-            }
-            num2 = stack.pop();
-            num1 = stack.pop();
-            stack.push(buildAddOperation(num1, num2));
-            break;
-          case 'cvr':
-            if (stack.length < 1) {
-              return null;
-            }
-            break;
-          case 'mul':
-            if (stack.length < 2) {
-              return null;
-            }
-            num2 = stack.pop();
-            num1 = stack.pop();
-            stack.push(buildMulOperation(num1, num2));
-            break;
-          case 'sub':
-            if (stack.length < 2) {
-              return null;
-            }
-            num2 = stack.pop();
-            num1 = stack.pop();
-            stack.push(buildSubOperation(num1, num2));
-            break;
-          case 'exch':
-            if (stack.length < 2) {
-              return null;
-            }
-            ast1 = stack.pop();
-            ast2 = stack.pop();
-            stack.push(ast1, ast2);
-            break;
-          case 'pop':
-            if (stack.length < 1) {
-              return null;
-            }
-            stack.pop();
-            break;
-          case 'index':
-            if (stack.length < 1) {
-              return null;
-            }
-            num1 = stack.pop();
-            if (num1.type !== 'literal') {
-              return null;
-            }
-            n = num1.number;
-            if (n < 0 || !Number.isInteger(n) || stack.length < n) {
-              return null;
-            }
-            ast1 = stack[stack.length - n - 1];
-            if (ast1.type === 'literal' || ast1.type === 'var') {
-              stack.push(ast1);
-              break;
-            }
-            tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max);
-            stack[stack.length - n - 1] = tmpVar;
-            stack.push(tmpVar);
-            instructions.push(new AstVariableDefinition(tmpVar, ast1));
-            break;
-          case 'dup':
-            if (stack.length < 1) {
-              return null;
-            }
-            if (typeof code[i + 1] === 'number' && code[i + 2] === 'gt' && code[i + 3] === i + 7 && code[i + 4] === 'jz' && code[i + 5] === 'pop' && code[i + 6] === code[i + 1]) {
-              num1 = stack.pop();
-              stack.push(buildMinOperation(num1, code[i + 1]));
-              i += 6;
-              break;
-            }
-            ast1 = stack[stack.length - 1];
-            if (ast1.type === 'literal' || ast1.type === 'var') {
-              stack.push(ast1);
-              break;
-            }
-            tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max);
-            stack[stack.length - 1] = tmpVar;
-            stack.push(tmpVar);
-            instructions.push(new AstVariableDefinition(tmpVar, ast1));
-            break;
-          case 'roll':
-            if (stack.length < 2) {
-              return null;
-            }
-            num2 = stack.pop();
-            num1 = stack.pop();
-            if (num2.type !== 'literal' || num1.type !== 'literal') {
-              return null;
-            }
-            j = num2.number;
-            n = num1.number;
-            if (n <= 0 || !Number.isInteger(n) || !Number.isInteger(j) || stack.length < n) {
-              return null;
-            }
-            j = (j % n + n) % n;
-            if (j === 0) {
-              break;
-            }
-            Array.prototype.push.apply(stack, stack.splice(stack.length - n, n - j));
-            break;
-          default:
-            return null;
-        }
-      }
-      if (stack.length !== outputSize) {
-        return null;
-      }
-      var result = [];
-      instructions.forEach(function (instruction) {
-        var statementBuilder = new ExpressionBuilderVisitor();
-        instruction.visit(statementBuilder);
-        result.push(statementBuilder.toString());
-      });
-      stack.forEach(function (expr, i) {
-        var statementBuilder = new ExpressionBuilderVisitor();
-        expr.visit(statementBuilder);
-        var min = range[i * 2],
-            max = range[i * 2 + 1];
-        var out = [statementBuilder.toString()];
-        if (min > expr.min) {
-          out.unshift('Math.max(', min, ', ');
-          out.push(')');
-        }
-        if (max < expr.max) {
-          out.unshift('Math.min(', max, ', ');
-          out.push(')');
-        }
-        out.unshift('dest[destOffset + ', i, '] = ');
-        out.push(';');
-        result.push(out.join(''));
-      });
-      return result.join('\n');
-    }
-  };
-  return PostScriptCompiler;
-}();
-exports.isPDFFunction = isPDFFunction;
-exports.PDFFunction = PDFFunction;
-exports.PostScriptEvaluator = PostScriptEvaluator;
-exports.PostScriptCompiler = PostScriptCompiler;
-
-/***/ }),
-/* 7 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
-
 var getLookupTableFactory = __w_pdfjs_require__(0).getLookupTableFactory;
 var getGlyphsUnicode = getLookupTableFactory(function (t) {
  t['A'] = 0x0041;
  t['AE'] = 0x00C6;
  t['AEacute'] = 0x01FC;
  t['AEmacron'] = 0x01E2;
  t['AEsmall'] = 0xF7E6;
  t['Aacute'] = 0x00C1;
@@ -10842,17 +9858,17 @@ var getDingbatsGlyphsUnicode = getLookup
  t['a95'] = 0x2774;
  t['a96'] = 0x2775;
  t['.notdef'] = 0x0000;
 });
 exports.getGlyphsUnicode = getGlyphsUnicode;
 exports.getDingbatsGlyphsUnicode = getDingbatsGlyphsUnicode;
 
 /***/ }),
-/* 8 */
+/* 7 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
@@ -11310,36 +10326,36 @@ var ChunkedStreamManager = function Chun
     }
   };
   return ChunkedStreamManager;
 }();
 exports.ChunkedStream = ChunkedStream;
 exports.ChunkedStreamManager = ChunkedStreamManager;
 
 /***/ }),
-/* 9 */
+/* 8 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.FileSpec = exports.XRef = exports.ObjectLoader = exports.Catalog = undefined;
 
 var _util = __w_pdfjs_require__(0);
 
 var _primitives = __w_pdfjs_require__(1);
 
 var _parser = __w_pdfjs_require__(5);
 
-var _chunked_stream = __w_pdfjs_require__(8);
-
-var _crypto = __w_pdfjs_require__(12);
+var _chunked_stream = __w_pdfjs_require__(7);
+
+var _crypto = __w_pdfjs_require__(11);
 
 var _colorspace = __w_pdfjs_require__(3);
 
 var Catalog = function CatalogClosure() {
   function Catalog(pdfManager, xref, pageFactory) {
     this.pdfManager = pdfManager;
     this.xref = xref;
     this.catDict = xref.getCatalogObj();
@@ -12813,17 +11829,17 @@ let ObjectLoader = function () {
   return ObjectLoader;
 }();
 exports.Catalog = Catalog;
 exports.ObjectLoader = ObjectLoader;
 exports.XRef = XRef;
 exports.FileSpec = FileSpec;
 
 /***/ }),
-/* 10 */
+/* 9 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
@@ -13153,30 +12169,30 @@ var ArithmeticDecoder = function Arithme
       return d;
     }
   };
   return ArithmeticDecoder;
 }();
 exports.ArithmeticDecoder = ArithmeticDecoder;
 
 /***/ }),
-/* 11 */
+/* 10 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.JpxImage = undefined;
 
 var _util = __w_pdfjs_require__(0);
 
-var _arithmetic_decoder = __w_pdfjs_require__(10);
+var _arithmetic_decoder = __w_pdfjs_require__(9);
 
 let JpxError = function JpxErrorClosure() {
   function JpxError(msg) {
     this.message = 'JPX error: ' + msg;
   }
   JpxError.prototype = new Error();
   JpxError.prototype.name = 'JpxError';
   JpxError.constructor = JpxError;
@@ -15080,17 +14096,17 @@ var JpxImage = function JpxImageClosure(
     };
     return ReversibleTransform;
   }();
   return JpxImage;
 }();
 exports.JpxImage = JpxImage;
 
 /***/ }),
-/* 12 */
+/* 11 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
@@ -16673,117 +15689,119 @@ exports.CipherTransformFactory = CipherT
 exports.PDF17 = PDF17;
 exports.PDF20 = PDF20;
 exports.calculateMD5 = calculateMD5;
 exports.calculateSHA256 = calculateSHA256;
 exports.calculateSHA384 = calculateSHA384;
 exports.calculateSHA512 = calculateSHA512;
 
 /***/ }),
-/* 13 */
+/* 12 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.PartialEvaluator = exports.OperatorList = undefined;
 
 var _util = __w_pdfjs_require__(0);
 
-var _cmap = __w_pdfjs_require__(27);
+var _cmap = __w_pdfjs_require__(26);
 
 var _stream = __w_pdfjs_require__(2);
 
 var _primitives = __w_pdfjs_require__(1);
 
-var _fonts = __w_pdfjs_require__(28);
+var _fonts = __w_pdfjs_require__(27);
 
 var _encodings = __w_pdfjs_require__(4);
 
-var _unicode = __w_pdfjs_require__(16);
-
-var _standard_fonts = __w_pdfjs_require__(15);
-
-var _pattern = __w_pdfjs_require__(32);
-
-var _function = __w_pdfjs_require__(6);
+var _unicode = __w_pdfjs_require__(15);
+
+var _standard_fonts = __w_pdfjs_require__(14);
+
+var _pattern = __w_pdfjs_require__(31);
 
 var _parser = __w_pdfjs_require__(5);
 
-var _bidi = __w_pdfjs_require__(33);
+var _bidi = __w_pdfjs_require__(32);
 
 var _colorspace = __w_pdfjs_require__(3);
 
-var _glyphlist = __w_pdfjs_require__(7);
-
-var _metrics = __w_pdfjs_require__(34);
+var _glyphlist = __w_pdfjs_require__(6);
+
+var _metrics = __w_pdfjs_require__(33);
+
+var _function = __w_pdfjs_require__(16);
 
 var _murmurhash = __w_pdfjs_require__(35);
 
 var _image = __w_pdfjs_require__(36);
 
 var PartialEvaluator = function PartialEvaluatorClosure() {
   const DefaultPartialEvaluatorOptions = {
     forceDataSchema: false,
     maxImageSize: -1,
     disableFontFace: false,
     nativeImageDecoderSupport: _util.NativeImageDecoding.DECODE,
     ignoreErrors: false,
     isEvalSupported: true
   };
-  function NativeImageDecoder(xref, resources, handler, forceDataSchema) {
+  function NativeImageDecoder({ xref, resources, handler, forceDataSchema = false, pdfFunctionFactory }) {
     this.xref = xref;
     this.resources = resources;
     this.handler = handler;
     this.forceDataSchema = forceDataSchema;
+    this.pdfFunctionFactory = pdfFunctionFactory;
   }
   NativeImageDecoder.prototype = {
     canDecode(image) {
-      return image instanceof _stream.JpegStream && NativeImageDecoder.isDecodable(image, this.xref, this.resources);
+      return image instanceof _stream.JpegStream && NativeImageDecoder.isDecodable(image, this.xref, this.resources, this.pdfFunctionFactory);
     },
     decode(image) {
       var dict = image.dict;
       var colorSpace = dict.get('ColorSpace', 'CS');
-      colorSpace = _colorspace.ColorSpace.parse(colorSpace, this.xref, this.resources);
+      colorSpace = _colorspace.ColorSpace.parse(colorSpace, this.xref, this.resources, this.pdfFunctionFactory);
       var numComps = colorSpace.numComps;
       var decodePromise = this.handler.sendWithPromise('JpegDecode', [image.getIR(this.forceDataSchema), numComps]);
       return decodePromise.then(function (message) {
         var data = message.data;
         return new _stream.Stream(data, 0, data.length, image.dict);
       });
     }
   };
-  NativeImageDecoder.isSupported = function NativeImageDecoder_isSupported(image, xref, res) {
+  NativeImageDecoder.isSupported = function (image, xref, res, pdfFunctionFactory) {
     var dict = image.dict;
     if (dict.has('DecodeParms') || dict.has('DP')) {
       return false;
     }
-    var cs = _colorspace.ColorSpace.parse(dict.get('ColorSpace', 'CS'), xref, res);
+    var cs = _colorspace.ColorSpace.parse(dict.get('ColorSpace', 'CS'), xref, res, pdfFunctionFactory);
     return (cs.name === 'DeviceGray' || cs.name === 'DeviceRGB') && cs.isDefaultDecode(dict.getArray('Decode', 'D'));
   };
-  NativeImageDecoder.isDecodable = function NativeImageDecoder_isDecodable(image, xref, res) {
+  NativeImageDecoder.isDecodable = function (image, xref, res, pdfFunctionFactory) {
     var dict = image.dict;
     if (dict.has('DecodeParms') || dict.has('DP')) {
       return false;
     }
-    var cs = _colorspace.ColorSpace.parse(dict.get('ColorSpace', 'CS'), xref, res);
+    var cs = _colorspace.ColorSpace.parse(dict.get('ColorSpace', 'CS'), xref, res, pdfFunctionFactory);
     return (cs.numComps === 1 || cs.numComps === 3) && cs.isDefaultDecode(dict.getArray('Decode', 'D'));
   };
-  function PartialEvaluator({ pdfManager, xref, handler, pageIndex, idFactory, fontCache, builtInCMapCache, options = null }) {
+  function PartialEvaluator({ pdfManager, xref, handler, pageIndex, idFactory, fontCache, builtInCMapCache, options = null, pdfFunctionFactory }) {
     this.pdfManager = pdfManager;
     this.xref = xref;
     this.handler = handler;
     this.pageIndex = pageIndex;
     this.idFactory = idFactory;
     this.fontCache = fontCache;
     this.builtInCMapCache = builtInCMapCache;
     this.options = options || DefaultPartialEvaluatorOptions;
+    this.pdfFunctionFactory = pdfFunctionFactory;
     this.fetchBuiltInCMap = name => {
       var cachedCMap = this.builtInCMapCache[name];
       if (cachedCMap) {
         return Promise.resolve(cachedCMap);
       }
       return this.handler.sendWithPromise('FetchBuiltInCMap', { name }).then(data => {
         if (data.compressionType !== _util.CMapCompressionType.NONE) {
           this.builtInCMapCache[name] = data;
@@ -16929,21 +15947,23 @@ var PartialEvaluator = function PartialE
         var groupOptions = {
           matrix,
           bbox,
           smask,
           isolated: false,
           knockout: false
         };
         var groupSubtype = group.get('S');
-        var colorSpace;
+        var colorSpace = null;
         if ((0, _primitives.isName)(groupSubtype, 'Transparency')) {
           groupOptions.isolated = group.get('I') || false;
           groupOptions.knockout = group.get('K') || false;
-          colorSpace = group.has('CS') ? _colorspace.ColorSpace.parse(group.get('CS'), this.xref, resources) : null;
+          if (group.has('CS')) {
+            colorSpace = _colorspace.ColorSpace.parse(group.get('CS'), this.xref, resources, this.pdfFunctionFactory);
+          }
         }
         if (smask && smask.backdrop) {
           colorSpace = colorSpace || _colorspace.ColorSpace.singletons.rgb;
           smask.backdrop = colorSpace.getRgb(smask.backdrop, 0);
         }
         operatorList.addOp(_util.OPS.beginGroup, [groupOptions]);
       }
       operatorList.addOp(_util.OPS.paintFormXObjectBegin, [matrix, bbox]);
@@ -16976,58 +15996,81 @@ var PartialEvaluator = function PartialE
       var imageMask = dict.get('ImageMask', 'IM') || false;
       var imgData, args;
       if (imageMask) {
         var width = dict.get('Width', 'W');
         var height = dict.get('Height', 'H');
         var bitStrideLength = width + 7 >> 3;
         var imgArray = image.getBytes(bitStrideLength * height);
         var decode = dict.getArray('Decode', 'D');
-        var inverseDecode = !!decode && decode[0] > 0;
-        imgData = _image.PDFImage.createMask(imgArray, width, height, image instanceof _stream.DecodeStream, inverseDecode);
+        imgData = _image.PDFImage.createMask({
+          imgArray,
+          width,
+          height,
+          imageIsFromDecodeStream: image instanceof _stream.DecodeStream,
+          inverseDecode: !!decode && decode[0] > 0
+        });
         imgData.cached = true;
         args = [imgData];
         operatorList.addOp(_util.OPS.paintImageMaskXObject, args);
         if (cacheKey) {
           imageCache[cacheKey] = {
             fn: _util.OPS.paintImageMaskXObject,
             args
           };
         }
         return;
       }
       var softMask = dict.get('SMask', 'SM') || false;
       var mask = dict.get('Mask') || false;
       var SMALL_IMAGE_DIMENSIONS = 200;
       if (inline && !softMask && !mask && !(image instanceof _stream.JpegStream) && w + h < SMALL_IMAGE_DIMENSIONS) {
-        var imageObj = new _image.PDFImage(this.xref, resources, image, inline, null, null);
+        let imageObj = new _image.PDFImage({
+          xref: this.xref,
+          res: resources,
+          image,
+          pdfFunctionFactory: this.pdfFunctionFactory
+        });
         imgData = imageObj.createImageData(true);
         operatorList.addOp(_util.OPS.paintInlineImageXObject, [imgData]);
         return;
       }
       var nativeImageDecoderSupport = this.options.nativeImageDecoderSupport;
       var objId = 'img_' + this.idFactory.createObjId();
       operatorList.addDependency(objId);
       args = [objId, w, h];
-      if (nativeImageDecoderSupport !== _util.NativeImageDecoding.NONE && !softMask && !mask && image instanceof _stream.JpegStream && NativeImageDecoder.isSupported(image, this.xref, resources)) {
+      if (nativeImageDecoderSupport !== _util.NativeImageDecoding.NONE && !softMask && !mask && image instanceof _stream.JpegStream && NativeImageDecoder.isSupported(image, this.xref, resources, this.pdfFunctionFactory)) {
         operatorList.addOp(_util.OPS.paintJpegXObject, args);
         this.handler.send('obj', [objId, this.pageIndex, 'JpegStream', image.getIR(this.options.forceDataSchema)]);
         if (cacheKey) {
           imageCache[cacheKey] = {
             fn: _util.OPS.paintJpegXObject,
             args
           };
         }
         return;
       }
       var nativeImageDecoder = null;
       if (nativeImageDecoderSupport === _util.NativeImageDecoding.DECODE && (image instanceof _stream.JpegStream || mask instanceof _stream.JpegStream || softMask instanceof _stream.JpegStream)) {
-        nativeImageDecoder = new NativeImageDecoder(this.xref, resources, this.handler, this.options.forceDataSchema);
-      }
-      _image.PDFImage.buildImage(this.handler, this.xref, resources, image, inline, nativeImageDecoder).then(imageObj => {
+        nativeImageDecoder = new NativeImageDecoder({
+          xref: this.xref,
+          resources,
+          handler: this.handler,
+          forceDataSchema: this.options.forceDataSchema,
+          pdfFunctionFactory: this.pdfFunctionFactory
+        });
+      }
+      _image.PDFImage.buildImage({
+        handler: this.handler,
+        xref: this.xref,
+        res: resources,
+        image,
+        nativeDecoder: nativeImageDecoder,
+        pdfFunctionFactory: this.pdfFunctionFactory
+      }).then(imageObj => {
         var imgData = imageObj.createImageData(false);
         this.handler.send('obj', [objId, this.pageIndex, 'Image', imgData], [imgData.data.buffer]);
       }).catch(reason => {
         (0, _util.warn)('Unable to decode image: ' + reason);
         this.handler.send('obj', [objId, this.pageIndex, 'Image', null]);
       });
       operatorList.addOp(_util.OPS.paintImageXObject, args);
       if (cacheKey) {
@@ -17040,17 +16083,17 @@ var PartialEvaluator = function PartialE
     handleSMask: function PartialEvaluator_handleSmask(smask, resources, operatorList, task, stateManager) {
       var smaskContent = smask.get('G');
       var smaskOptions = {
         subtype: smask.get('S').name,
         backdrop: smask.get('BC')
       };
       var transferObj = smask.get('TR');
       if ((0, _function.isPDFFunction)(transferObj)) {
-        var transferFn = _function.PDFFunction.parse(this.xref, transferObj);
+        let transferFn = this.pdfFunctionFactory.create(transferObj);
         var transferMap = new Uint8Array(256);
         var tmp = new Float32Array(1);
         for (var i = 0; i < 256; i++) {
           tmp[0] = i / 255;
           transferFn(tmp, 0, tmp, 0);
           transferMap[i] = tmp[0] * 255 | 0;
         }
         smaskOptions.transferMap = transferMap;
@@ -17319,17 +16362,17 @@ var PartialEvaluator = function PartialE
         var dict = (0, _primitives.isStream)(pattern) ? pattern.dict : pattern;
         var typeNum = dict.get('PatternType');
         if (typeNum === TILING_PATTERN) {
           var color = cs.base ? cs.base.getRgb(args, 0) : null;
           return this.handleTilingType(fn, color, resources, pattern, dict, operatorList, task);
         } else if (typeNum === SHADING_PATTERN) {
           var shading = dict.get('Shading');
           var matrix = dict.getArray('Matrix');
-          pattern = _pattern.Pattern.parseShading(shading, matrix, this.xref, resources, this.handler);
+          pattern = _pattern.Pattern.parseShading(shading, matrix, this.xref, resources, this.handler, this.pdfFunctionFactory);
           operatorList.addOp(fn, pattern.getIR());
           return Promise.resolve();
         }
         return Promise.reject(new Error('Unknown PatternType: ' + typeNum));
       }
       operatorList.addOp(fn, args);
       return Promise.resolve();
     },
@@ -17465,20 +16508,20 @@ var PartialEvaluator = function PartialE
               operatorList.addOp(_util.OPS.setCharSpacing, [args.shift()]);
               args[0] = self.handleText(args[0], stateManager.state);
               fn = _util.OPS.showText;
               break;
             case _util.OPS.setTextRenderingMode:
               stateManager.state.textRenderingMode = args[0];
               break;
             case _util.OPS.setFillColorSpace:
-              stateManager.state.fillColorSpace = _colorspace.ColorSpace.parse(args[0], xref, resources);
+              stateManager.state.fillColorSpace = _colorspace.ColorSpace.parse(args[0], xref, resources, self.pdfFunctionFactory);
               continue;
             case _util.OPS.setStrokeColorSpace:
-              stateManager.state.strokeColorSpace = _colorspace.ColorSpace.parse(args[0], xref, resources);
+              stateManager.state.strokeColorSpace = _colorspace.ColorSpace.parse(args[0], xref, resources, self.pdfFunctionFactory);
               continue;
             case _util.OPS.setFillColor:
               cs = stateManager.state.fillColorSpace;
               args = cs.getRgb(args, 0);
               fn = _util.OPS.setFillRGBColor;
               break;
             case _util.OPS.setStrokeColor:
               cs = stateManager.state.strokeColorSpace;
@@ -17535,17 +16578,17 @@ var PartialEvaluator = function PartialE
               var shadingRes = resources.get('Shading');
               if (!shadingRes) {
                 throw new _util.FormatError('No shading resource found');
               }
               var shading = shadingRes.get(args[0].name);
               if (!shading) {
                 throw new _util.FormatError('No shading object found');
               }
-              var shadingFill = _pattern.Pattern.parseShading(shading, null, xref, resources, self.handler);
+              var shadingFill = _pattern.Pattern.parseShading(shading, null, xref, resources, self.handler, self.pdfFunctionFactory);
               var patternIR = shadingFill.getIR();
               args = [patternIR];
               fn = _util.OPS.shadingFill;
               break;
             case _util.OPS.setGState:
               var dictName = args[0];
               var extGState = resources.get('ExtGState');
               if (!(0, _primitives.isDict)(extGState) || !extGState.has(dictName.name)) {
@@ -19670,30 +18713,30 @@ var QueueOptimizer = function QueueOptim
     }
   };
   return QueueOptimizer;
 }();
 exports.OperatorList = OperatorList;
 exports.PartialEvaluator = PartialEvaluator;
 
 /***/ }),
-/* 14 */
+/* 13 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.CFFCompiler = exports.CFFPrivateDict = exports.CFFTopDict = exports.CFFCharset = exports.CFFIndex = exports.CFFStrings = exports.CFFHeader = exports.CFF = exports.CFFParser = exports.CFFStandardStrings = undefined;
 
 var _util = __w_pdfjs_require__(0);
 
-var _charsets = __w_pdfjs_require__(29);
+var _charsets = __w_pdfjs_require__(28);
 
 var _encodings = __w_pdfjs_require__(4);
 
 var MAX_SUBR_NESTING = 10;
 var CFFStandardStrings = ['.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl', 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 'tsuperior', 'ff', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall', '001.000', '001.001', '001.002', '001.003', 'Black', 'Bold', 'Book', 'Light', 'Medium', 'Regular', 'Roman', 'Semibold'];
 var CFFParser = function CFFParserClosure() {
   var CharstringValidationData = [null, {
     id: 'hstem',
@@ -21090,17 +20133,17 @@ exports.CFFHeader = CFFHeader;
 exports.CFFStrings = CFFStrings;
 exports.CFFIndex = CFFIndex;
 exports.CFFCharset = CFFCharset;
 exports.CFFTopDict = CFFTopDict;
 exports.CFFPrivateDict = CFFPrivateDict;
 exports.CFFCompiler = CFFCompiler;
 
 /***/ }),
-/* 15 */
+/* 14 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
@@ -21741,17 +20784,17 @@ var getSupplementalGlyphMapForArialBlack
 exports.getStdFontMap = getStdFontMap;
 exports.getNonStdFontMap = getNonStdFontMap;
 exports.getSerifFonts = getSerifFonts;
 exports.getSymbolsFonts = getSymbolsFonts;
 exports.getGlyphMapForStandardFonts = getGlyphMapForStandardFonts;
 exports.getSupplementalGlyphMapForArialBlack = getSupplementalGlyphMapForArialBlack;
 
 /***/ }),
-/* 16 */
+/* 15 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 var getLookupTableFactory = __w_pdfjs_require__(0).getLookupTableFactory;
 var getSpecialPUASymbols = getLookupTableFactory(function (t) {
  t[63721] = 0x00A9;
  t[63193] = 0x00A9;
  t[63720] = 0x00AE;
  t[63194] = 0x00AE;
@@ -23716,24 +22759,1080 @@ function reverseIfRtl(chars) {
 }
 exports.mapSpecialUnicodeValues = mapSpecialUnicodeValues;
 exports.reverseIfRtl = reverseIfRtl;
 exports.getUnicodeRangeFor = getUnicodeRangeFor;
 exports.getNormalizedUnicodes = getNormalizedUnicodes;
 exports.getUnicodeForGlyph = getUnicodeForGlyph;
 
 /***/ }),
+/* 16 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.PostScriptCompiler = exports.PostScriptEvaluator = exports.PDFFunctionFactory = exports.isPDFFunction = undefined;
+
+var _util = __w_pdfjs_require__(0);
+
+var _primitives = __w_pdfjs_require__(1);
+
+var _ps_parser = __w_pdfjs_require__(34);
+
+let IsEvalSupportedCached = {
+  get value() {
+    return (0, _util.shadow)(this, 'value', (0, _util.isEvalSupported)());
+  }
+};
+class PDFFunctionFactory {
+  constructor({ xref, isEvalSupported = true }) {
+    this.xref = xref;
+    this.isEvalSupported = isEvalSupported !== false;
+  }
+  create(fn) {
+    return PDFFunction.parse({
+      xref: this.xref,
+      isEvalSupported: this.isEvalSupported,
+      fn
+    });
+  }
+  createFromArray(fnObj) {
+    return PDFFunction.parseArray({
+      xref: this.xref,
+      isEvalSupported: this.isEvalSupported,
+      fnObj
+    });
+  }
+  createFromIR(IR) {
+    return PDFFunction.fromIR({
+      xref: this.xref,
+      isEvalSupported: this.isEvalSupported,
+      IR
+    });
+  }
+  createIR(fn) {
+    return PDFFunction.getIR({
+      xref: this.xref,
+      isEvalSupported: this.isEvalSupported,
+      fn
+    });
+  }
+}
+var PDFFunction = function PDFFunctionClosure() {
+  const CONSTRUCT_SAMPLED = 0;
+  const CONSTRUCT_INTERPOLATED = 2;
+  const CONSTRUCT_STICHED = 3;
+  const CONSTRUCT_POSTSCRIPT = 4;
+  return {
+    getSampleArray(size, outputSize, bps, stream) {
+      var i, ii;
+      var length = 1;
+      for (i = 0, ii = size.length; i < ii; i++) {
+        length *= size[i];
+      }
+      length *= outputSize;
+      var array = new Array(length);
+      var codeSize = 0;
+      var codeBuf = 0;
+      var sampleMul = 1.0 / (Math.pow(2.0, bps) - 1);
+      var strBytes = stream.getBytes((length * bps + 7) / 8);
+      var strIdx = 0;
+      for (i = 0; i < length; i++) {
+        while (codeSize < bps) {
+          codeBuf <<= 8;
+          codeBuf |= strBytes[strIdx++];
+          codeSize += 8;
+        }
+        codeSize -= bps;
+        array[i] = (codeBuf >> codeSize) * sampleMul;
+        codeBuf &= (1 << codeSize) - 1;
+      }
+      return array;
+    },
+    getIR({ xref, isEvalSupported, fn }) {
+      var dict = fn.dict;
+      if (!dict) {
+        dict = fn;
+      }
+      var types = [this.constructSampled, null, this.constructInterpolated, this.constructStiched, this.constructPostScript];
+      var typeNum = dict.get('FunctionType');
+      var typeFn = types[typeNum];
+      if (!typeFn) {
+        throw new _util.FormatError('Unknown type of function');
+      }
+      return typeFn.call(this, {
+        xref,
+        isEvalSupported,
+        fn,
+        dict
+      });
+    },
+    fromIR({ xref, isEvalSupported, IR }) {
+      var type = IR[0];
+      switch (type) {
+        case CONSTRUCT_SAMPLED:
+          return this.constructSampledFromIR({
+            xref,
+            isEvalSupported,
+            IR
+          });
+        case CONSTRUCT_INTERPOLATED:
+          return this.constructInterpolatedFromIR({
+            xref,
+            isEvalSupported,
+            IR
+          });
+        case CONSTRUCT_STICHED:
+          return this.constructStichedFromIR({
+            xref,
+            isEvalSupported,
+            IR
+          });
+        default:
+          return this.constructPostScriptFromIR({
+            xref,
+            isEvalSupported,
+            IR
+          });
+      }
+    },
+    parse({ xref, isEvalSupported, fn }) {
+      let IR = this.getIR({
+        xref,
+        isEvalSupported,
+        fn
+      });
+      return this.fromIR({
+        xref,
+        isEvalSupported,
+        IR
+      });
+    },
+    parseArray({ xref, isEvalSupported, fnObj }) {
+      if (!Array.isArray(fnObj)) {
+        return this.parse({
+          xref,
+          isEvalSupported,
+          fn: fnObj
+        });
+      }
+      var fnArray = [];
+      for (var j = 0, jj = fnObj.length; j < jj; j++) {
+        fnArray.push(this.parse({
+          xref,
+          isEvalSupported,
+          fn: xref.fetchIfRef(fnObj[j])
+        }));
+      }
+      return function (src, srcOffset, dest, destOffset) {
+        for (var i = 0, ii = fnArray.length; i < ii; i++) {
+          fnArray[i](src, srcOffset, dest, destOffset + i);
+        }
+      };
+    },
+    constructSampled({ xref, isEvalSupported, fn, dict }) {
+      function toMultiArray(arr) {
+        var inputLength = arr.length;
+        var out = [];
+        var index = 0;
+        for (var i = 0; i < inputLength; i += 2) {
+          out[index] = [arr[i], arr[i + 1]];
+          ++index;
+        }
+        return out;
+      }
+      var domain = dict.getArray('Domain');
+      var range = dict.getArray('Range');
+      if (!domain || !range) {
+        throw new _util.FormatError('No domain or range');
+      }
+      var inputSize = domain.length / 2;
+      var outputSize = range.length / 2;
+      domain = toMultiArray(domain);
+      range = toMultiArray(range);
+      var size = dict.get('Size');
+      var bps = dict.get('BitsPerSample');
+      var order = dict.get('Order') || 1;
+      if (order !== 1) {
+        (0, _util.info)('No support for cubic spline interpolation: ' + order);
+      }
+      var encode = dict.getArray('Encode');
+      if (!encode) {
+        encode = [];
+        for (var i = 0; i < inputSize; ++i) {
+          encode.push(0);
+          encode.push(size[i] - 1);
+        }
+      }
+      encode = toMultiArray(encode);
+      var decode = dict.getArray('Decode');
+      if (!decode) {
+        decode = range;
+      } else {
+        decode = toMultiArray(decode);
+      }
+      var samples = this.getSampleArray(size, outputSize, bps, fn);
+      return [CONSTRUCT_SAMPLED, inputSize, domain, encode, decode, samples, size, outputSize, Math.pow(2, bps) - 1, range];
+    },
+    constructSampledFromIR({ xref, isEvalSupported, IR }) {
+      function interpolate(x, xmin, xmax, ymin, ymax) {
+        return ymin + (x - xmin) * ((ymax - ymin) / (xmax - xmin));
+      }
+      return function constructSampledFromIRResult(src, srcOffset, dest, destOffset) {
+        var m = IR[1];
+        var domain = IR[2];
+        var encode = IR[3];
+        var decode = IR[4];
+        var samples = IR[5];
+        var size = IR[6];
+        var n = IR[7];
+        var range = IR[9];
+        var cubeVertices = 1 << m;
+        var cubeN = new Float64Array(cubeVertices);
+        var cubeVertex = new Uint32Array(cubeVertices);
+        var i, j;
+        for (j = 0; j < cubeVertices; j++) {
+          cubeN[j] = 1;
+        }
+        var k = n,
+            pos = 1;
+        for (i = 0; i < m; ++i) {
+          var domain_2i = domain[i][0];
+          var domain_2i_1 = domain[i][1];
+          var xi = Math.min(Math.max(src[srcOffset + i], domain_2i), domain_2i_1);
+          var e = interpolate(xi, domain_2i, domain_2i_1, encode[i][0], encode[i][1]);
+          var size_i = size[i];
+          e = Math.min(Math.max(e, 0), size_i - 1);
+          var e0 = e < size_i - 1 ? Math.floor(e) : e - 1;
+          var n0 = e0 + 1 - e;
+          var n1 = e - e0;
+          var offset0 = e0 * k;
+          var offset1 = offset0 + k;
+          for (j = 0; j < cubeVertices; j++) {
+            if (j & pos) {
+              cubeN[j] *= n1;
+              cubeVertex[j] += offset1;
+            } else {
+              cubeN[j] *= n0;
+              cubeVertex[j] += offset0;
+            }
+          }
+          k *= size_i;
+          pos <<= 1;
+        }
+        for (j = 0; j < n; ++j) {
+          var rj = 0;
+          for (i = 0; i < cubeVertices; i++) {
+            rj += samples[cubeVertex[i] + j] * cubeN[i];
+          }
+          rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]);
+          dest[destOffset + j] = Math.min(Math.max(rj, range[j][0]), range[j][1]);
+        }
+      };
+    },
+    constructInterpolated({ xref, isEvalSupported, fn, dict }) {
+      var c0 = dict.getArray('C0') || [0];
+      var c1 = dict.getArray('C1') || [1];
+      var n = dict.get('N');
+      if (!Array.isArray(c0) || !Array.isArray(c1)) {
+        throw new _util.FormatError('Illegal dictionary for interpolated function');
+      }
+      var length = c0.length;
+      var diff = [];
+      for (var i = 0; i < length; ++i) {
+        diff.push(c1[i] - c0[i]);
+      }
+      return [CONSTRUCT_INTERPOLATED, c0, diff, n];
+    },
+    constructInterpolatedFromIR({ xref, isEvalSupported, IR }) {
+      var c0 = IR[1];
+      var diff = IR[2];
+      var n = IR[3];
+      var length = diff.length;
+      return function constructInterpolatedFromIRResult(src, srcOffset, dest, destOffset) {
+        var x = n === 1 ? src[srcOffset] : Math.pow(src[srcOffset], n);
+        for (var j = 0; j < length; ++j) {
+          dest[destOffset + j] = c0[j] + x * diff[j];
+        }
+      };
+    },
+    constructStiched({ xref, isEvalSupported, fn, dict }) {
+      var domain = dict.getArray('Domain');
+      if (!domain) {
+        throw new _util.FormatError('No domain');
+      }
+      var inputSize = domain.length / 2;
+      if (inputSize !== 1) {
+        throw new _util.FormatError('Bad domain for stiched function');
+      }
+      var fnRefs = dict.get('Functions');
+      var fns = [];
+      for (var i = 0, ii = fnRefs.length; i < ii; ++i) {
+        fns.push(this.getIR({
+          xref,
+          isEvalSupported,
+          fn: xref.fetchIfRef(fnRefs[i])
+        }));
+      }
+      var bounds = dict.getArray('Bounds');
+      var encode = dict.getArray('Encode');
+      return [CONSTRUCT_STICHED, domain, bounds, encode, fns];
+    },
+    constructStichedFromIR({ xref, isEvalSupported, IR }) {
+      var domain = IR[1];
+      var bounds = IR[2];
+      var encode = IR[3];
+      var fnsIR = IR[4];
+      var fns = [];
+      var tmpBuf = new Float32Array(1);
+      for (var i = 0, ii = fnsIR.length; i < ii; i++) {
+        fns.push(this.fromIR({
+          xref,
+          isEvalSupported,
+          IR: fnsIR[i]
+        }));
+      }
+      return function constructStichedFromIRResult(src, srcOffset, dest, destOffset) {
+        var clip = function constructStichedFromIRClip(v, min, max) {
+          if (v > max) {
+            v = max;
+          } else if (v < min) {
+            v = min;
+          }
+          return v;
+        };
+        var v = clip(src[srcOffset], domain[0], domain[1]);
+        for (var i = 0, ii = bounds.length; i < ii; ++i) {
+          if (v < bounds[i]) {
+            break;
+          }
+        }
+        var dmin = domain[0];
+        if (i > 0) {
+          dmin = bounds[i - 1];
+        }
+        var dmax = domain[1];
+        if (i < bounds.length) {
+          dmax = bounds[i];
+        }
+        var rmin = encode[2 * i];
+        var rmax = encode[2 * i + 1];
+        tmpBuf[0] = dmin === dmax ? rmin : rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin);
+        fns[i](tmpBuf, 0, dest, destOffset);
+      };
+    },
+    constructPostScript({ xref, isEvalSupported, fn, dict }) {
+      var domain = dict.getArray('Domain');
+      var range = dict.getArray('Range');
+      if (!domain) {
+        throw new _util.FormatError('No domain.');
+      }
+      if (!range) {
+        throw new _util.FormatError('No range.');
+      }
+      var lexer = new _ps_parser.PostScriptLexer(fn);
+      var parser = new _ps_parser.PostScriptParser(lexer);
+      var code = parser.parse();
+      return [CONSTRUCT_POSTSCRIPT, domain, range, code];
+    },
+    constructPostScriptFromIR({ xref, isEvalSupported, IR }) {
+      var domain = IR[1];
+      var range = IR[2];
+      var code = IR[3];
+      if (isEvalSupported && IsEvalSupportedCached.value) {
+        let compiled = new PostScriptCompiler().compile(code, domain, range);
+        if (compiled) {
+          return new Function('src', 'srcOffset', 'dest', 'destOffset', compiled);
+        }
+      }
+      (0, _util.info)('Unable to compile PS function');
+      var numOutputs = range.length >> 1;
+      var numInputs = domain.length >> 1;
+      var evaluator = new PostScriptEvaluator(code);
+      var cache = Object.create(null);
+      var MAX_CACHE_SIZE = 2048 * 4;
+      var cache_available = MAX_CACHE_SIZE;
+      var tmpBuf = new Float32Array(numInputs);
+      return function constructPostScriptFromIRResult(src, srcOffset, dest, destOffset) {
+        var i, value;
+        var key = '';
+        var input = tmpBuf;
+        for (i = 0; i < numInputs; i++) {
+          value = src[srcOffset + i];
+          input[i] = value;
+          key += value + '_';
+        }
+        var cachedValue = cache[key];
+        if (cachedValue !== undefined) {
+          dest.set(cachedValue, destOffset);
+          return;
+        }
+        var output = new Float32Array(numOutputs);
+        var stack = evaluator.execute(input);
+        var stackIndex = stack.length - numOutputs;
+        for (i = 0; i < numOutputs; i++) {
+          value = stack[stackIndex + i];
+          var bound = range[i * 2];
+          if (value < bound) {
+            value = bound;
+          } else {
+            bound = range[i * 2 + 1];
+            if (value > bound) {
+              value = bound;
+            }
+          }
+          output[i] = value;
+        }
+        if (cache_available > 0) {
+          cache_available--;
+          cache[key] = output;
+        }
+        dest.set(output, destOffset);
+      };
+    }
+  };
+}();
+function isPDFFunction(v) {
+  var fnDict;
+  if (typeof v !== 'object') {
+    return false;
+  } else if ((0, _primitives.isDict)(v)) {
+    fnDict = v;
+  } else if ((0, _primitives.isStream)(v)) {
+    fnDict = v.dict;
+  } else {
+    return false;
+  }
+  return fnDict.has('FunctionType');
+}
+var PostScriptStack = function PostScriptStackClosure() {
+  var MAX_STACK_SIZE = 100;
+  function PostScriptStack(initialStack) {
+    this.stack = !initialStack ? [] : Array.prototype.slice.call(initialStack, 0);
+  }
+  PostScriptStack.prototype = {
+    push: function PostScriptStack_push(value) {
+      if (this.stack.length >= MAX_STACK_SIZE) {
+        throw new Error('PostScript function stack overflow.');
+      }
+      this.stack.push(value);
+    },
+    pop: function PostScriptStack_pop() {
+      if (this.stack.length <= 0) {
+        throw new Error('PostScript function stack underflow.');
+      }
+      return this.stack.pop();
+    },
+    copy: function PostScriptStack_copy(n) {
+      if (this.stack.length + n >= MAX_STACK_SIZE) {
+        throw new Error('PostScript function stack overflow.');
+      }
+      var stack = this.stack;
+      for (var i = stack.length - n, j = n - 1; j >= 0; j--, i++) {
+        stack.push(stack[i]);
+      }
+    },
+    index: function PostScriptStack_index(n) {
+      this.push(this.stack[this.stack.length - n - 1]);
+    },
+    roll: function PostScriptStack_roll(n, p) {
+      var stack = this.stack;
+      var l = stack.length - n;
+      var r = stack.length - 1,
+          c = l + (p - Math.floor(p / n) * n),
+          i,
+          j,
+          t;
+      for (i = l, j = r; i < j; i++, j--) {
+        t = stack[i];
+        stack[i] = stack[j];
+        stack[j] = t;
+      }
+      for (i = l, j = c - 1; i < j; i++, j--) {
+        t = stack[i];
+        stack[i] = stack[j];
+        stack[j] = t;
+      }
+      for (i = c, j = r; i < j; i++, j--) {
+        t = stack[i];
+        stack[i] = stack[j];
+        stack[j] = t;
+      }
+    }
+  };
+  return PostScriptStack;
+}();
+var PostScriptEvaluator = function PostScriptEvaluatorClosure() {
+  function PostScriptEvaluator(operators) {
+    this.operators = operators;
+  }
+  PostScriptEvaluator.prototype = {
+    execute: function PostScriptEvaluator_execute(initialStack) {
+      var stack = new PostScriptStack(initialStack);
+      var counter = 0;
+      var operators = this.operators;
+      var length = operators.length;
+      var operator, a, b;
+      while (counter < length) {
+        operator = operators[counter++];
+        if (typeof operator === 'number') {
+          stack.push(operator);
+          continue;
+        }
+        switch (operator) {
+          case 'jz':
+            b = stack.pop();
+            a = stack.pop();
+            if (!a) {
+              counter = b;
+            }
+            break;
+          case 'j':
+            a = stack.pop();
+            counter = a;
+            break;
+          case 'abs':
+            a = stack.pop();
+            stack.push(Math.abs(a));
+            break;
+          case 'add':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a + b);
+            break;
+          case 'and':
+            b = stack.pop();
+            a = stack.pop();
+            if ((0, _util.isBool)(a) && (0, _util.isBool)(b)) {
+              stack.push(a && b);
+            } else {
+              stack.push(a & b);
+            }
+            break;
+          case 'atan':
+            a = stack.pop();
+            stack.push(Math.atan(a));
+            break;
+          case 'bitshift':
+            b = stack.pop();
+            a = stack.pop();
+            if (a > 0) {
+              stack.push(a << b);
+            } else {
+              stack.push(a >> b);
+            }
+            break;
+          case 'ceiling':
+            a = stack.pop();
+            stack.push(Math.ceil(a));
+            break;
+          case 'copy':
+            a = stack.pop();
+            stack.copy(a);
+            break;
+          case 'cos':
+            a = stack.pop();
+            stack.push(Math.cos(a));
+            break;
+          case 'cvi':
+            a = stack.pop() | 0;
+            stack.push(a);
+            break;
+          case 'cvr':
+            break;
+          case 'div':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a / b);
+            break;
+          case 'dup':
+            stack.copy(1);
+            break;
+          case 'eq':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a === b);
+            break;
+          case 'exch':
+            stack.roll(2, 1);
+            break;
+          case 'exp':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(Math.pow(a, b));
+            break;
+          case 'false':
+            stack.push(false);
+            break;
+          case 'floor':
+            a = stack.pop();
+            stack.push(Math.floor(a));
+            break;
+          case 'ge':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a >= b);
+            break;
+          case 'gt':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a > b);
+            break;
+          case 'idiv':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a / b | 0);
+            break;
+          case 'index':
+            a = stack.pop();
+            stack.index(a);
+            break;
+          case 'le':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a <= b);
+            break;
+          case 'ln':
+            a = stack.pop();
+            stack.push(Math.log(a));
+            break;
+          case 'log':
+            a = stack.pop();
+            stack.push(Math.log(a) / Math.LN10);
+            break;
+          case 'lt':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a < b);
+            break;
+          case 'mod':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a % b);
+            break;
+          case 'mul':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a * b);
+            break;
+          case 'ne':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a !== b);
+            break;
+          case 'neg':
+            a = stack.pop();
+            stack.push(-a);
+            break;
+          case 'not':
+            a = stack.pop();
+            if ((0, _util.isBool)(a)) {
+              stack.push(!a);
+            } else {
+              stack.push(~a);
+            }
+            break;
+          case 'or':
+            b = stack.pop();
+            a = stack.pop();
+            if ((0, _util.isBool)(a) && (0, _util.isBool)(b)) {
+              stack.push(a || b);
+            } else {
+              stack.push(a | b);
+            }
+            break;
+          case 'pop':
+            stack.pop();
+            break;
+          case 'roll':
+            b = stack.pop();
+            a = stack.pop();
+            stack.roll(a, b);
+            break;
+          case 'round':
+            a = stack.pop();
+            stack.push(Math.round(a));
+            break;
+          case 'sin':
+            a = stack.pop();
+            stack.push(Math.sin(a));
+            break;
+          case 'sqrt':
+            a = stack.pop();
+            stack.push(Math.sqrt(a));
+            break;
+          case 'sub':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a - b);
+            break;
+          case 'true':
+            stack.push(true);
+            break;
+          case 'truncate':
+            a = stack.pop();
+            a = a < 0 ? Math.ceil(a) : Math.floor(a);
+            stack.push(a);
+            break;
+          case 'xor':
+            b = stack.pop();
+            a = stack.pop();
+            if ((0, _util.isBool)(a) && (0, _util.isBool)(b)) {
+              stack.push(a !== b);
+            } else {
+              stack.push(a ^ b);
+            }
+            break;
+          default:
+            throw new _util.FormatError(`Unknown operator ${operator}`);
+        }
+      }
+      return stack.stack;
+    }
+  };
+  return PostScriptEvaluator;
+}();
+var PostScriptCompiler = function PostScriptCompilerClosure() {
+  function AstNode(type) {
+    this.type = type;
+  }
+  AstNode.prototype.visit = function (visitor) {
+    throw new Error('abstract method');
+  };
+  function AstArgument(index, min, max) {
+    AstNode.call(this, 'args');
+    this.index = index;
+    this.min = min;
+    this.max = max;
+  }
+  AstArgument.prototype = Object.create(AstNode.prototype);
+  AstArgument.prototype.visit = function (visitor) {
+    visitor.visitArgument(this);
+  };
+  function AstLiteral(number) {
+    AstNode.call(this, 'literal');
+    this.number = number;
+    this.min = number;
+    this.max = number;
+  }
+  AstLiteral.prototype = Object.create(AstNode.prototype);
+  AstLiteral.prototype.visit = function (visitor) {
+    visitor.visitLiteral(this);
+  };
+  function AstBinaryOperation(op, arg1, arg2, min, max) {
+    AstNode.call(this, 'binary');
+    this.op = op;
+    this.arg1 = arg1;
+    this.arg2 = arg2;
+    this.min = min;
+    this.max = max;
+  }
+  AstBinaryOperation.prototype = Object.create(AstNode.prototype);
+  AstBinaryOperation.prototype.visit = function (visitor) {
+    visitor.visitBinaryOperation(this);
+  };
+  function AstMin(arg, max) {
+    AstNode.call(this, 'max');
+    this.arg = arg;
+    this.min = arg.min;
+    this.max = max;
+  }
+  AstMin.prototype = Object.create(AstNode.prototype);
+  AstMin.prototype.visit = function (visitor) {
+    visitor.visitMin(this);
+  };
+  function AstVariable(index, min, max) {
+    AstNode.call(this, 'var');
+    this.index = index;
+    this.min = min;
+    this.max = max;
+  }
+  AstVariable.prototype = Object.create(AstNode.prototype);
+  AstVariable.prototype.visit = function (visitor) {
+    visitor.visitVariable(this);
+  };
+  function AstVariableDefinition(variable, arg) {
+    AstNode.call(this, 'definition');
+    this.variable = variable;
+    this.arg = arg;
+  }
+  AstVariableDefinition.prototype = Object.create(AstNode.prototype);
+  AstVariableDefinition.prototype.visit = function (visitor) {
+    visitor.visitVariableDefinition(this);
+  };
+  function ExpressionBuilderVisitor() {
+    this.parts = [];
+  }
+  ExpressionBuilderVisitor.prototype = {
+    visitArgument(arg) {
+      this.parts.push('Math.max(', arg.min, ', Math.min(', arg.max, ', src[srcOffset + ', arg.index, ']))');
+    },
+    visitVariable(variable) {
+      this.parts.push('v', variable.index);
+    },
+    visitLiteral(literal) {
+      this.parts.push(literal.number);
+    },
+    visitBinaryOperation(operation) {
+      this.parts.push('(');
+      operation.arg1.visit(this);
+      this.parts.push(' ', operation.op, ' ');
+      operation.arg2.visit(this);
+      this.parts.push(')');
+    },
+    visitVariableDefinition(definition) {
+      this.parts.push('var ');
+      definition.variable.visit(this);
+      this.parts.push(' = ');
+      definition.arg.visit(this);
+      this.parts.push(';');
+    },
+    visitMin(max) {
+      this.parts.push('Math.min(');
+      max.arg.visit(this);
+      this.parts.push(', ', max.max, ')');
+    },
+    toString() {
+      return this.parts.join('');
+    }
+  };
+  function buildAddOperation(num1, num2) {
+    if (num2.type === 'literal' && num2.number === 0) {
+      return num1;
+    }
+    if (num1.type === 'literal' && num1.number === 0) {
+      return num2;
+    }
+    if (num2.type === 'literal' && num1.type === 'literal') {
+      return new AstLiteral(num1.number + num2.number);
+    }
+    return new AstBinaryOperation('+', num1, num2, num1.min + num2.min, num1.max + num2.max);
+  }
+  function buildMulOperation(num1, num2) {
+    if (num2.type === 'literal') {
+      if (num2.number === 0) {
+        return new AstLiteral(0);
+      } else if (num2.number === 1) {
+        return num1;
+      } else if (num1.type === 'literal') {
+        return new AstLiteral(num1.number * num2.number);
+      }
+    }
+    if (num1.type === 'literal') {
+      if (num1.number === 0) {
+        return new AstLiteral(0);
+      } else if (num1.number === 1) {
+        return num2;
+      }
+    }
+    var min = Math.min(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max);
+    var max = Math.max(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max);
+    return new AstBinaryOperation('*', num1, num2, min, max);
+  }
+  function buildSubOperation(num1, num2) {
+    if (num2.type === 'literal') {
+      if (num2.number === 0) {
+        return num1;
+      } else if (num1.type === 'literal') {
+        return new AstLiteral(num1.number - num2.number);
+      }
+    }
+    if (num2.type === 'binary' && num2.op === '-' && num1.type === 'literal' && num1.number === 1 && num2.arg1.type === 'literal' && num2.arg1.number === 1) {
+      return num2.arg2;
+    }
+    return new AstBinaryOperation('-', num1, num2, num1.min - num2.max, num1.max - num2.min);
+  }
+  function buildMinOperation(num1, max) {
+    if (num1.min >= max) {
+      return new AstLiteral(max);
+    } else if (num1.max <= max) {
+      return num1;
+    }
+    return new AstMin(num1, max);
+  }
+  function PostScriptCompiler() {}
+  PostScriptCompiler.prototype = {
+    compile: function PostScriptCompiler_compile(code, domain, range) {
+      var stack = [];
+      var i, ii;
+      var instructions = [];
+      var inputSize = domain.length >> 1,
+          outputSize = range.length >> 1;
+      var lastRegister = 0;
+      var n, j;
+      var num1, num2, ast1, ast2, tmpVar, item;
+      for (i = 0; i < inputSize; i++) {
+        stack.push(new AstArgument(i, domain[i * 2], domain[i * 2 + 1]));
+      }
+      for (i = 0, ii = code.length; i < ii; i++) {
+        item = code[i];
+        if (typeof item === 'number') {
+          stack.push(new AstLiteral(item));
+          continue;
+        }
+        switch (item) {
+          case 'add':
+            if (stack.length < 2) {
+              return null;
+            }
+            num2 = stack.pop();
+            num1 = stack.pop();
+            stack.push(buildAddOperation(num1, num2));
+            break;
+          case 'cvr':
+            if (stack.length < 1) {
+              return null;
+            }
+            break;
+          case 'mul':
+            if (stack.length < 2) {
+              return null;
+            }
+            num2 = stack.pop();
+            num1 = stack.pop();
+            stack.push(buildMulOperation(num1, num2));
+            break;
+          case 'sub':
+            if (stack.length < 2) {
+              return null;
+            }
+            num2 = stack.pop();
+            num1 = stack.pop();
+            stack.push(buildSubOperation(num1, num2));
+            break;
+          case 'exch':
+            if (stack.length < 2) {
+              return null;
+            }
+            ast1 = stack.pop();
+            ast2 = stack.pop();
+            stack.push(ast1, ast2);
+            break;
+          case 'pop':
+            if (stack.length < 1) {
+              return null;
+            }
+            stack.pop();
+            break;
+          case 'index':
+            if (stack.length < 1) {
+              return null;
+            }
+            num1 = stack.pop();
+            if (num1.type !== 'literal') {
+              return null;
+            }
+            n = num1.number;
+            if (n < 0 || !Number.isInteger(n) || stack.length < n) {
+              return null;
+            }
+            ast1 = stack[stack.length - n - 1];
+            if (ast1.type === 'literal' || ast1.type === 'var') {
+              stack.push(ast1);
+              break;
+            }
+            tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max);
+            stack[stack.length - n - 1] = tmpVar;
+            stack.push(tmpVar);
+            instructions.push(new AstVariableDefinition(tmpVar, ast1));
+            break;
+          case 'dup':
+            if (stack.length < 1) {
+              return null;
+            }
+            if (typeof code[i + 1] === 'number' && code[i + 2] === 'gt' && code[i + 3] === i + 7 && code[i + 4] === 'jz' && code[i + 5] === 'pop' && code[i + 6] === code[i + 1]) {
+              num1 = stack.pop();
+              stack.push(buildMinOperation(num1, code[i + 1]));
+              i += 6;
+              break;
+            }
+            ast1 = stack[stack.length - 1];
+            if (ast1.type === 'literal' || ast1.type === 'var') {
+              stack.push(ast1);
+              break;
+            }
+            tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max);
+            stack[stack.length - 1] = tmpVar;
+            stack.push(tmpVar);
+            instructions.push(new AstVariableDefinition(tmpVar, ast1));
+            break;
+          case 'roll':
+            if (stack.length < 2) {
+              return null;
+            }
+            num2 = stack.pop();
+            num1 = stack.pop();
+            if (num2.type !== 'literal' || num1.type !== 'literal') {
+              return null;
+            }
+            j = num2.number;
+            n = num1.number;
+            if (n <= 0 || !Number.isInteger(n) || !Number.isInteger(j) || stack.length < n) {
+              return null;
+            }
+            j = (j % n + n) % n;
+            if (j === 0) {
+              break;
+            }
+            Array.prototype.push.apply(stack, stack.splice(stack.length - n, n - j));
+            break;
+          default:
+            return null;
+        }
+      }
+      if (stack.length !== outputSize) {
+        return null;
+      }
+      var result = [];
+      instructions.forEach(function (instruction) {
+        var statementBuilder = new ExpressionBuilderVisitor();
+        instruction.visit(statementBuilder);
+        result.push(statementBuilder.toString());
+      });
+      stack.forEach(function (expr, i) {
+        var statementBuilder = new ExpressionBuilderVisitor();
+        expr.visit(statementBuilder);
+        var min = range[i * 2],
+            max = range[i * 2 + 1];
+        var out = [statementBuilder.toString()];
+        if (min > expr.min) {
+          out.unshift('Math.max(', min, ', ');
+          out.push(')');
+        }
+        if (max < expr.max) {
+          out.unshift('Math.min(', max, ', ');
+          out.push(')');
+        }
+        out.unshift('dest[destOffset + ', i, '] = ');
+        out.push(';');
+        result.push(out.join(''));
+      });
+      return result.join('\n');
+    }
+  };
+  return PostScriptCompiler;
+}();
+exports.isPDFFunction = isPDFFunction;
+exports.PDFFunctionFactory = PDFFunctionFactory;
+exports.PostScriptEvaluator = PostScriptEvaluator;
+exports.PostScriptCompiler = PostScriptCompiler;
+
+/***/ }),
 /* 17 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
-var pdfjsVersion = '1.9.597';
-var pdfjsBuild = 'f3987bba';
+var pdfjsVersion = '1.9.607';
+var pdfjsBuild = 'b3f84112';
 var pdfjsCoreWorker = __w_pdfjs_require__(18);
 exports.WorkerMessageHandler = pdfjsCoreWorker.WorkerMessageHandler;
 
 /***/ }),
 /* 18 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
@@ -23917,16 +24016,21 @@ var WorkerMessageHandler = {
       return WorkerMessageHandler.createDocumentHandler(data, port);
     });
   },
   createDocumentHandler(docParams, port) {
     var pdfManager;
     var terminated = false;
     var cancelXHRs = null;
     var WorkerTasks = [];
+    let apiVersion = docParams.apiVersion;
+    let workerVersion = '1.9.607';
+    if (apiVersion !== null && apiVersion !== workerVersion) {
+      throw new Error(`The API version "${apiVersion}" does not match ` + `the Worker version "${workerVersion}".`);
+    }
     var docId = docParams.docId;
     var docBaseUrl = docParams.docBaseUrl;
     var workerHandlerName = docParams.docId + '_worker';
     var handler = new _util.MessageHandler(workerHandlerName, docId, port);
     handler.postMessageTransfers = docParams.postMessageTransfers;
     function ensureNotTerminated() {
       if (terminated) {
         throw new Error('Worker was terminated');
@@ -27364,17 +27468,17 @@ if (isReadableStreamSupported) {
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.NetworkPdfManager = exports.LocalPdfManager = undefined;
 
 var _util = __w_pdfjs_require__(0);
 
-var _chunked_stream = __w_pdfjs_require__(8);
+var _chunked_stream = __w_pdfjs_require__(7);
 
 var _document = __w_pdfjs_require__(23);
 
 var _stream = __w_pdfjs_require__(2);
 
 var BasePdfManager = function BasePdfManagerClosure() {
   function BasePdfManager() {
     throw new Error('Cannot initialize BaseManagerManager');
@@ -27546,48 +27650,49 @@ exports.NetworkPdfManager = NetworkPdfMa
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.PDFDocument = exports.Page = undefined;
 
-var _obj = __w_pdfjs_require__(9);
+var _obj = __w_pdfjs_require__(8);
 
 var _primitives = __w_pdfjs_require__(1);
 
 var _util = __w_pdfjs_require__(0);
 
 var _stream = __w_pdfjs_require__(2);
 
-var _evaluator = __w_pdfjs_require__(13);
+var _evaluator = __w_pdfjs_require__(12);
 
 var _annotation = __w_pdfjs_require__(37);
 
-var _crypto = __w_pdfjs_require__(12);
+var _crypto = __w_pdfjs_require__(11);
 
 var _parser = __w_pdfjs_require__(5);
 
-var _function = __w_pdfjs_require__(6);
+var _function = __w_pdfjs_require__(16);
 
 var Page = function PageClosure() {
   var DEFAULT_USER_UNIT = 1.0;
   var LETTER_SIZE_MEDIABOX = [0, 0, 612, 792];
   function isAnnotationRenderable(annotation, intent) {
     return intent === 'display' && annotation.viewable || intent === 'print' && annotation.printable;
   }
-  function Page(pdfManager, xref, pageIndex, pageDict, ref, fontCache, builtInCMapCache) {
+  function Page({ pdfManager, xref, pageIndex, pageDict, ref, fontCache, builtInCMapCache, pdfFunctionFactory }) {
     this.pdfManager = pdfManager;
     this.pageIndex = pageIndex;
     this.pageDict = pageDict;
     this.xref = xref;
     this.ref = ref;
     this.fontCache = fontCache;
     this.builtInCMapCache = builtInCMapCache;
+    this.pdfFunctionFactory = pdfFunctionFactory;
     this.evaluatorOptions = pdfManager.evaluatorOptions;
     this.resourcesPromise = null;
     var uniquePrefix = 'p' + this.pageIndex + '_';
     var idCounters = { obj: 0 };
     this.idFactory = {
       createObjId() {
         return uniquePrefix + ++idCounters.obj;
       }
@@ -27706,17 +27811,18 @@ var Page = function PageClosure() {
       var partialEvaluator = new _evaluator.PartialEvaluator({
         pdfManager: this.pdfManager,
         xref: this.xref,
         handler,
         pageIndex: this.pageIndex,
         idFactory: this.idFactory,
         fontCache: this.fontCache,
         builtInCMapCache: this.builtInCMapCache,
-        options: this.evaluatorOptions
+        options: this.evaluatorOptions,
+        pdfFunctionFactory: this.pdfFunctionFactory
       });
       var dataPromises = Promise.all([contentStreamPromise, resourcesPromise]);
       var pageListPromise = dataPromises.then(([contentStream]) => {
         var opList = new _evaluator.OperatorList(intent, handler, this.pageIndex);
         handler.send('StartRenderPage', {
           transparency: partialEvaluator.hasBlendModes(this.resources),
           pageIndex: this.pageIndex,
           intent
@@ -27763,17 +27869,18 @@ var Page = function PageClosure() {
         var partialEvaluator = new _evaluator.PartialEvaluator({
           pdfManager: this.pdfManager,
           xref: this.xref,
           handler,
           pageIndex: this.pageIndex,
           idFactory: this.idFactory,
           fontCache: this.fontCache,
           builtInCMapCache: this.builtInCMapCache,
-          options: this.evaluatorOptions
+          options: this.evaluatorOptions,
+          pdfFunctionFactory: this.pdfFunctionFactory
         });
         return partialEvaluator.getTextContent({
           stream: contentStream,
           task,
           resources: this.resources,
           normalizeWhitespace,
           combineTextItems,
           sink
@@ -27818,16 +27925,21 @@ var PDFDocument = function PDFDocumentCl
       throw new Error('PDFDocument: Unknown argument type');
     }
     if (stream.length <= 0) {
       throw new Error('PDFDocument: stream must have data');
     }
     this.pdfManager = pdfManager;
     this.stream = stream;
     this.xref = new _obj.XRef(stream, pdfManager);
+    let evaluatorOptions = pdfManager.evaluatorOptions;
+    this.pdfFunctionFactory = new _function.PDFFunctionFactory({
+      xref: this.xref,
+      isEvalSupported: evaluatorOptions.isEvalSupported
+    });
   }
   function find(stream, needle, limit, backwards) {
     var pos = stream.pos;
     var end = stream.end;
     var strBuf = [];
     if (pos + limit > end) {
       limit = end - pos;
     }
@@ -27967,22 +28079,29 @@ var PDFDocument = function PDFDocumentCl
     parseStartXRef: function PDFDocument_parseStartXRef() {
       var startXRef = this.startXRef;
       this.xref.setStartXRef(startXRef);
     },
     setup: function PDFDocument_setup(recoveryMode) {
       this.xref.parse(recoveryMode);
       var pageFactory = {
         createPage: (pageIndex, dict, ref, fontCache, builtInCMapCache) => {
-          return new Page(this.pdfManager, this.xref, pageIndex, dict, ref, fontCache, builtInCMapCache);
+          return new Page({
+            pdfManager: this.pdfManager,
+            xref: this.xref,
+            pageIndex,
+            pageDict: dict,
+            ref,
+            fontCache,
+            builtInCMapCache,
+            pdfFunctionFactory: this.pdfFunctionFactory
+          });
         }
       };
       this.catalog = new _obj.Catalog(this.pdfManager, this.xref, pageFactory);
-      let evaluatorOptions = this.pdfManager.evaluatorOptions;
-      _function.PDFFunction.setIsEvalSupported(evaluatorOptions.isEvalSupported);
     },
     get numPages() {
       var linearization = this.linearization;
       var num = linearization ? linearization.numPages : this.catalog.numPages;
       return (0, _util.shadow)(this, 'numPages', num);
     },
     get documentInfo() {
       var docInfo = {
@@ -28054,17 +28173,17 @@ exports.PDFDocument = PDFDocument;
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.Jbig2Image = undefined;
 
 var _util = __w_pdfjs_require__(0);
 
-var _arithmetic_decoder = __w_pdfjs_require__(10);
+var _arithmetic_decoder = __w_pdfjs_require__(9);
 
 let Jbig2Error = function Jbig2ErrorClosure() {
   function Jbig2Error(msg) {
     this.message = 'JBIG2 error: ' + msg;
   }
   Jbig2Error.prototype = new Error();
   Jbig2Error.prototype.name = 'Jbig2Error';
   Jbig2Error.constructor = Jbig2Error;
@@ -30207,220 +30326,16 @@ exports.JpegImage = JpegImage;
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.PostScriptParser = exports.PostScriptLexer = undefined;
-
-var _util = __w_pdfjs_require__(0);
-
-var _primitives = __w_pdfjs_require__(1);
-
-var PostScriptParser = function PostScriptParserClosure() {
-  function PostScriptParser(lexer) {
-    this.lexer = lexer;
-    this.operators = [];
-    this.token = null;
-    this.prev = null;
-  }
-  PostScriptParser.prototype = {
-    nextToken: function PostScriptParser_nextToken() {
-      this.prev = this.token;
-      this.token = this.lexer.getToken();
-    },
-    accept: function PostScriptParser_accept(type) {
-      if (this.token.type === type) {
-        this.nextToken();
-        return true;
-      }
-      return false;
-    },
-    expect: function PostScriptParser_expect(type) {
-      if (this.accept(type)) {
-        return true;
-      }
-      throw new _util.FormatError(`Unexpected symbol: found ${this.token.type} expected ${type}.`);
-    },
-    parse: function PostScriptParser_parse() {
-      this.nextToken();
-      this.expect(PostScriptTokenTypes.LBRACE);
-      this.parseBlock();
-      this.expect(PostScriptTokenTypes.RBRACE);
-      return this.operators;
-    },
-    parseBlock: function PostScriptParser_parseBlock() {
-      while (true) {
-        if (this.accept(PostScriptTokenTypes.NUMBER)) {
-          this.operators.push(this.prev.value);
-        } else if (this.accept(PostScriptTokenTypes.OPERATOR)) {
-          this.operators.push(this.prev.value);
-        } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
-          this.parseCondition();
-        } else {
-          return;
-        }
-      }
-    },
-    parseCondition: function PostScriptParser_parseCondition() {
-      var conditionLocation = this.operators.length;
-      this.operators.push(null, null);
-      this.parseBlock();
-      this.expect(PostScriptTokenTypes.RBRACE);
-      if (this.accept(PostScriptTokenTypes.IF)) {
-        this.operators[conditionLocation] = this.operators.length;
-        this.operators[conditionLocation + 1] = 'jz';
-      } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
-        var jumpLocation = this.operators.length;
-        this.operators.push(null, null);
-        var endOfTrue = this.operators.length;
-        this.parseBlock();
-        this.expect(PostScriptTokenTypes.RBRACE);
-        this.expect(PostScriptTokenTypes.IFELSE);
-        this.operators[jumpLocation] = this.operators.length;
-        this.operators[jumpLocation + 1] = 'j';
-        this.operators[conditionLocation] = endOfTrue;
-        this.operators[conditionLocation + 1] = 'jz';
-      } else {
-        throw new _util.FormatError('PS Function: error parsing conditional.');
-      }
-    }
-  };
-  return PostScriptParser;
-}();
-var PostScriptTokenTypes = {
-  LBRACE: 0,
-  RBRACE: 1,
-  NUMBER: 2,
-  OPERATOR: 3,
-  IF: 4,
-  IFELSE: 5
-};
-var PostScriptToken = function PostScriptTokenClosure() {
-  function PostScriptToken(type, value) {
-    this.type = type;
-    this.value = value;
-  }
-  var opCache = Object.create(null);
-  PostScriptToken.getOperator = function PostScriptToken_getOperator(op) {
-    var opValue = opCache[op];
-    if (opValue) {
-      return opValue;
-    }
-    return opCache[op] = new PostScriptToken(PostScriptTokenTypes.OPERATOR, op);
-  };
-  PostScriptToken.LBRACE = new PostScriptToken(PostScriptTokenTypes.LBRACE, '{');
-  PostScriptToken.RBRACE = new PostScriptToken(PostScriptTokenTypes.RBRACE, '}');
-  PostScriptToken.IF = new PostScriptToken(PostScriptTokenTypes.IF, 'IF');
-  PostScriptToken.IFELSE = new PostScriptToken(PostScriptTokenTypes.IFELSE, 'IFELSE');
-  return PostScriptToken;
-}();
-var PostScriptLexer = function PostScriptLexerClosure() {
-  function PostScriptLexer(stream) {
-    this.stream = stream;
-    this.nextChar();
-    this.strBuf = [];
-  }
-  PostScriptLexer.prototype = {
-    nextChar: function PostScriptLexer_nextChar() {
-      return this.currentChar = this.stream.getByte();
-    },
-    getToken: function PostScriptLexer_getToken() {
-      var comment = false;
-      var ch = this.currentChar;
-      while (true) {
-        if (ch < 0) {
-          return _primitives.EOF;
-        }
-        if (comment) {
-          if (ch === 0x0A || ch === 0x0D) {
-            comment = false;
-          }
-        } else if (ch === 0x25) {
-          comment = true;
-        } else if (!(0, _util.isSpace)(ch)) {
-          break;
-        }
-        ch = this.nextChar();
-      }
-      switch (ch | 0) {
-        case 0x30:
-        case 0x31:
-        case 0x32:
-        case 0x33:
-        case 0x34:
-        case 0x35:
-        case 0x36:
-        case 0x37:
-        case 0x38:
-        case 0x39:
-        case 0x2B:
-        case 0x2D:
-        case 0x2E:
-          return new PostScriptToken(PostScriptTokenTypes.NUMBER, this.getNumber());
-        case 0x7B:
-          this.nextChar();
-          return PostScriptToken.LBRACE;
-        case 0x7D:
-          this.nextChar();
-          return PostScriptToken.RBRACE;
-      }
-      var strBuf = this.strBuf;
-      strBuf.length = 0;
-      strBuf[0] = String.fromCharCode(ch);
-      while ((ch = this.nextChar()) >= 0 && (ch >= 0x41 && ch <= 0x5A || ch >= 0x61 && ch <= 0x7A)) {
-        strBuf.push(String.fromCharCode(ch));
-      }
-      var str = strBuf.join('');
-      switch (str.toLowerCase()) {
-        case 'if':
-          return PostScriptToken.IF;
-        case 'ifelse':
-          return PostScriptToken.IFELSE;
-        default:
-          return PostScriptToken.getOperator(str);
-      }
-    },
-    getNumber: function PostScriptLexer_getNumber() {
-      var ch = this.currentChar;
-      var strBuf = this.strBuf;
-      strBuf.length = 0;
-      strBuf[0] = String.fromCharCode(ch);
-      while ((ch = this.nextChar()) >= 0) {
-        if (ch >= 0x30 && ch <= 0x39 || ch === 0x2D || ch === 0x2E) {
-          strBuf.push(String.fromCharCode(ch));
-        } else {
-          break;
-        }
-      }
-      var value = parseFloat(strBuf.join(''));
-      if (isNaN(value)) {
-        throw new _util.FormatError(`Invalid floating point number: ${value}`);
-      }
-      return value;
-    }
-  };
-  return PostScriptLexer;
-}();
-exports.PostScriptLexer = PostScriptLexer;
-exports.PostScriptParser = PostScriptParser;
-
-/***/ }),
-/* 27 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
 exports.CMapFactory = exports.IdentityCMap = exports.CMap = undefined;
 
 var _util = __w_pdfjs_require__(0);
 
 var _primitives = __w_pdfjs_require__(1);
 
 var _parser = __w_pdfjs_require__(5);
 
@@ -31117,44 +31032,44 @@ var CMapFactory = function CMapFactoryCl
     }
   };
 }();
 exports.CMap = CMap;
 exports.IdentityCMap = IdentityCMap;
 exports.CMapFactory = CMapFactory;
 
 /***/ }),
-/* 28 */
+/* 27 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.getFontType = exports.ProblematicCharRanges = exports.IdentityToUnicodeMap = exports.ToUnicodeMap = exports.FontFlags = exports.Font = exports.ErrorFont = exports.PRIVATE_USE_OFFSET_END = exports.PRIVATE_USE_OFFSET_START = exports.SEAC_ANALYSIS_ENABLED = undefined;
 
 var _util = __w_pdfjs_require__(0);
 
-var _cff_parser = __w_pdfjs_require__(14);
-
-var _glyphlist = __w_pdfjs_require__(7);
+var _cff_parser = __w_pdfjs_require__(13);
+
+var _glyphlist = __w_pdfjs_require__(6);
 
 var _encodings = __w_pdfjs_require__(4);
 
-var _standard_fonts = __w_pdfjs_require__(15);
-
-var _unicode = __w_pdfjs_require__(16);
-
-var _font_renderer = __w_pdfjs_require__(30);
+var _standard_fonts = __w_pdfjs_require__(14);
+
+var _unicode = __w_pdfjs_require__(15);
+
+var _font_renderer = __w_pdfjs_require__(29);
 
 var _stream = __w_pdfjs_require__(2);
 
-var _type1_parser = __w_pdfjs_require__(31);
+var _type1_parser = __w_pdfjs_require__(30);
 
 var PRIVATE_USE_OFFSET_START = 0xE000;
 var PRIVATE_USE_OFFSET_END = 0xF8FF;
 var SKIP_PRIVATE_USE_RANGE_F000_TO_F01F = false;
 var PDF_GLYPH_SPACE_UNITS = 1000;
 var SEAC_ANALYSIS_ENABLED = false;
 var FontFlags = {
   FixedPitch: 1,
@@ -32199,35 +32114,41 @@ var Font = function FontClosure() {
         var numMissing = numOfSidebearings - (metrics.length - numOfMetrics * 4 >> 1);
         if (numMissing > 0) {
           var entries = new Uint8Array(metrics.length + numMissing * 2);
           entries.set(metrics.data);
           metrics.data = entries;
         }
       }
       function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart, hintsValid) {
+        var glyphProfile = {
+          length: 0,
+          sizeOfInstructions: 0
+        };
         if (sourceEnd - sourceStart <= 12) {
-          return 0;
+          return glyphProfile;
         }
         var glyf = source.subarray(sourceStart, sourceEnd);
         var contoursCount = glyf[0] << 8 | glyf[1];
         if (contoursCount & 0x8000) {
           dest.set(glyf, destStart);
-          return glyf.length;
+          glyphProfile.length = glyf.length;
+          return glyphProfile;
         }
         var i,
             j = 10,
             flagsCount = 0;
         for (i = 0; i < contoursCount; i++) {
           var endPoint = glyf[j] << 8 | glyf[j + 1];
           flagsCount = endPoint + 1;
           j += 2;
         }
         var instructionsStart = j;
         var instructionsLength = glyf[j] << 8 | glyf[j + 1];
+        glyphProfile.sizeOfInstructions = instructionsLength;
         j += 2 + instructionsLength;
         var instructionsEnd = j;
         var coordinatesLength = 0;
         for (i = 0; i < flagsCount; i++) {
           var flag = glyf[j++];
           if (flag & 0xC0) {
             glyf[j - 1] = flag & 0x3F;
           }
@@ -32235,39 +32156,42 @@ var Font = function FontClosure() {
           coordinatesLength += xyLength;
           if (flag & 8) {
             var repeat = glyf[j++];
             i += repeat;
             coordinatesLength += repeat * xyLength;
           }
         }
         if (coordinatesLength === 0) {
-          return 0;
+          return glyphProfile;
         }
         var glyphDataLength = j + coordinatesLength;
         if (glyphDataLength > glyf.length) {
-          return 0;
+          return glyphProfile;
         }
         if (!hintsValid && instructionsLength > 0) {
           dest.set(glyf.subarray(0, instructionsStart), destStart);
           dest.set([0, 0], destStart + instructionsStart);
           dest.set(glyf.subarray(instructionsEnd, glyphDataLength), destStart + instructionsStart + 2);
           glyphDataLength -= instructionsLength;
           if (glyf.length - glyphDataLength > 3) {
             glyphDataLength = glyphDataLength + 3 & ~3;
           }
-          return glyphDataLength;
+          glyphProfile.length = glyphDataLength;
+          return glyphProfile;
         }
         if (glyf.length - glyphDataLength > 3) {
           glyphDataLength = glyphDataLength + 3 & ~3;
           dest.set(glyf.subarray(0, glyphDataLength), destStart);
-          return glyphDataLength;
+          glyphProfile.length = glyphDataLength;
+          return glyphProfile;
         }
         dest.set(glyf, destStart);
-        return glyf.length;
+        glyphProfile.length = glyf.length;
+        return glyphProfile;
       }
       function sanitizeHead(head, numGlyphs, locaLength) {
         var data = head.data;
         var version = int32(data[0], data[1], data[2], data[3]);
         if (version >> 16 !== 1) {
           (0, _util.info)('Attempting to fix invalid version in head table: ' + version);
           data[0] = 0;
           data[1] = 1;
@@ -32284,17 +32208,17 @@ var Font = function FontClosure() {
           } else if (locaLength === numGlyphsPlusOne << 2) {
             data[50] = 0;
             data[51] = 1;
           } else {
             throw new _util.FormatError('Could not fix indexToLocFormat: ' + indexToLocFormat);
           }
         }
       }
-      function sanitizeGlyphLocations(loca, glyf, numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry) {
+      function sanitizeGlyphLocations(loca, glyf, numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry, maxSizeOfInstructions) {
         var itemSize, itemDecode, itemEncode;
         if (isGlyphLocationsLong) {
           itemSize = 4;
           itemDecode = function fontItemDecodeLong(data, offset) {
             return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3];
           };
           itemEncode = function fontItemEncodeLong(data, offset, value) {
             data[offset] = value >>> 24 & 0xFF;
@@ -32319,58 +32243,63 @@ var Font = function FontClosure() {
           locaData.set(loca.data.subarray(0, locaDataSize));
           loca.data = locaData;
         }
         var oldGlyfData = glyf.data;
         var oldGlyfDataLength = oldGlyfData.length;
         var newGlyfData = new Uint8Array(oldGlyfDataLength);
         var startOffset = itemDecode(locaData, 0);
         var writeOffset = 0;
-        var missingGlyphData = Object.create(null);
+        var missingGlyphs = Object.create(null);
         itemEncode(locaData, 0, writeOffset);
         var i, j;
         var locaCount = dupFirstEntry ? numGlyphs - 1 : numGlyphs;
         for (i = 0, j = itemSize; i < locaCount; i++, j += itemSize) {
           var endOffset = itemDecode(locaData, j);
           if (endOffset > oldGlyfDataLength && (oldGlyfDataLength + 3 & ~3) === endOffset) {
             endOffset = oldGlyfDataLength;
           }
           if (endOffset > oldGlyfDataLength) {
             startOffset = endOffset;
           }
-          var newLength = sanitizeGlyph(oldGlyfData, startOffset, endOffset, newGlyfData, writeOffset, hintsValid);
+          var glyphProfile = sanitizeGlyph(oldGlyfData, startOffset, endOffset, newGlyfData, writeOffset, hintsValid);
+          var newLength = glyphProfile.length;
           if (newLength === 0) {
-            missingGlyphData[i] = true;
+            missingGlyphs[i] = true;
+          }
+          if (glyphProfile.sizeOfInstructions > maxSizeOfInstructions) {
+            maxSizeOfInstructions = glyphProfile.sizeOfInstructions;
           }
           writeOffset += newLength;
           itemEncode(locaData, j, writeOffset);
           startOffset = endOffset;
         }
         if (writeOffset === 0) {
           var simpleGlyph = new Uint8Array([0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]);
           for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) {
             itemEncode(locaData, j, simpleGlyph.length);
           }
           glyf.data = simpleGlyph;
-          return missingGlyphData;
-        }
-        if (dupFirstEntry) {
+        } else if (dupFirstEntry) {
           var firstEntryLength = itemDecode(locaData, itemSize);
           if (newGlyfData.length > firstEntryLength + writeOffset) {
             glyf.data = newGlyfData.subarray(0, firstEntryLength + writeOffset);
           } else {
             glyf.data = new Uint8Array(firstEntryLength + writeOffset);
             glyf.data.set(newGlyfData.subarray(0, writeOffset));
           }
           glyf.data.set(newGlyfData.subarray(0, firstEntryLength), writeOffset);
           itemEncode(loca.data, locaData.length - itemSize, writeOffset + firstEntryLength);
         } else {
           glyf.data = newGlyfData.subarray(0, writeOffset);
         }
-        return missingGlyphData;
+        return {
+          missingGlyphs,
+          maxSizeOfInstructions
+        };
       }
       function readPostScriptTable(post, properties, maxpNumGlyphs) {
         var start = (font.start ? font.start : 0) + post.offset;
         font.pos = start;
         var length = post.length,
             end = start + length;
         var version = font.getInt32();
         font.getBytes(28);
@@ -32764,25 +32693,28 @@ var Font = function FontClosure() {
       }
       if (!tables['maxp']) {
         throw new _util.FormatError('Required "maxp" table is not found');
       }
       font.pos = (font.start || 0) + tables['maxp'].offset;
       var version = font.getInt32();
       var numGlyphs = font.getUint16();
       var maxFunctionDefs = 0;
+      var maxSizeOfInstructions = 0;
       if (version >= 0x00010000 && tables['maxp'].length >= 22) {
         font.pos += 8;
         var maxZones = font.getUint16();
         if (maxZones > 2) {
           tables['maxp'].data[14] = 0;
           tables['maxp'].data[15] = 2;
         }
         font.pos += 4;
         maxFunctionDefs = font.getUint16();
+        font.pos += 6;
+        maxSizeOfInstructions = font.getUint16();
       }
       var dupFirstEntry = false;
       if (properties.type === 'CIDFontType2' && properties.toUnicode && properties.toUnicode.get(0) > '\u0000') {
         dupFirstEntry = true;
         numGlyphs++;
         tables['maxp'].data[4] = numGlyphs >> 8;
         tables['maxp'].data[5] = numGlyphs & 255;
       }
@@ -32795,17 +32727,22 @@ var Font = function FontClosure() {
       sanitizeMetrics(font, tables['hhea'], tables['hmtx'], numGlyphs);
       if (!tables['head']) {
         throw new _util.FormatError('Required "head" table is not found');
       }
       sanitizeHead(tables['head'], numGlyphs, isTrueType ? tables['loca'].length : 0);
       var missingGlyphs = Object.create(null);
       if (isTrueType) {
         var isGlyphLocationsLong = int16(tables['head'].data[50], tables['head'].data[51]);
-        missingGlyphs = sanitizeGlyphLocations(tables['loca'], tables['glyf'], numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry);
+        var glyphsInfo = sanitizeGlyphLocations(tables['loca'], tables['glyf'], numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry, maxSizeOfInstructions);
+        missingGlyphs = glyphsInfo.missingGlyphs;
+        if (version >= 0x00010000 && tables['maxp'].length >= 22) {
+          tables['maxp'].data[26] = glyphsInfo.maxSizeOfInstructions >> 8;
+          tables['maxp'].data[27] = glyphsInfo.maxSizeOfInstructions & 255;
+        }
       }
       if (!tables['hhea']) {
         throw new _util.FormatError('Required "hhea" table is not found');
       }
       if (tables['hhea'].data[10] === 0 && tables['hhea'].data[11] === 0) {
         tables['hhea'].data[10] = 0xFF;
         tables['hhea'].data[11] = 0xFF;
       }
@@ -33565,49 +33502,49 @@ exports.ErrorFont = ErrorFont;
 exports.Font = Font;
 exports.FontFlags = FontFlags;
 exports.ToUnicodeMap = ToUnicodeMap;
 exports.IdentityToUnicodeMap = IdentityToUnicodeMap;
 exports.ProblematicCharRanges = ProblematicCharRanges;
 exports.getFontType = getFontType;
 
 /***/ }),
-/* 29 */
+/* 28 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 var ISOAdobeCharset = ['.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl', 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron'];
 var ExpertCharset = ['.notdef', 'space', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'onequarter', 'onehalf', 'threequarters', 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall'];
 var ExpertSubsetCharset = ['.notdef', 'space', 'dollaroldstyle', 'dollarsuperior', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior', 'hyphensuperior', 'colonmonetary', 'onefitted', 'rupiah', 'centoldstyle', 'figuredash', 'hypheninferior', 'onequarter', 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior'];
 exports.ISOAdobeCharset = ISOAdobeCharset;
 exports.ExpertCharset = ExpertCharset;
 exports.ExpertSubsetCharset = ExpertSubsetCharset;
 
 /***/ }),
-/* 30 */
+/* 29 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.FontRendererFactory = undefined;
 
 var _util = __w_pdfjs_require__(0);
 
-var _cff_parser = __w_pdfjs_require__(14);
-
-var _glyphlist = __w_pdfjs_require__(7);
+var _cff_parser = __w_pdfjs_require__(13);
+
+var _glyphlist = __w_pdfjs_require__(6);
 
 var _encodings = __w_pdfjs_require__(4);
 
 var _stream = __w_pdfjs_require__(2);
 
 var FontRendererFactory = function FontRendererFactoryClosure() {
   function getLong(data, offset) {
     return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3];
@@ -34322,17 +34259,17 @@ var FontRendererFactory = function FontR
       }
       return new Type2Compiled(cff, cmap, font.fontMatrix, font.glyphNameMap);
     }
   };
 }();
 exports.FontRendererFactory = FontRendererFactory;
 
 /***/ }),
-/* 31 */
+/* 30 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
@@ -34875,35 +34812,33 @@ var Type1Parser = function Type1ParserCl
       }
     }
   };
   return Type1Parser;
 }();
 exports.Type1Parser = Type1Parser;
 
 /***/ }),
-/* 32 */
+/* 31 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.getTilingPatternIR = exports.Pattern = undefined;
 
 var _util = __w_pdfjs_require__(0);
 
 var _colorspace = __w_pdfjs_require__(3);
 
 var _primitives = __w_pdfjs_require__(1);
 
-var _function = __w_pdfjs_require__(6);
-
 var ShadingType = {
   FUNCTION_BASED: 1,
   AXIAL: 2,
   RADIAL: 3,
   FREE_FORM_MESH: 4,
   LATTICE_FORM_MESH: 5,
   COONS_PATCH_MESH: 6,
   TENSOR_PATCH_MESH: 7
@@ -34912,29 +34847,29 @@ var Pattern = function PatternClosure() 
   function Pattern() {
     throw new Error('should not call Pattern constructor');
   }
   Pattern.prototype = {
     getPattern: function Pattern_getPattern(ctx) {
       throw new Error(`Should not call Pattern.getStyle: ${ctx}`);
     }
   };
-  Pattern.parseShading = function Pattern_parseShading(shading, matrix, xref, res, handler) {
+  Pattern.parseShading = function (shading, matrix, xref, res, handler, pdfFunctionFactory) {
     var dict = (0, _primitives.isStream)(shading) ? shading.dict : shading;
     var type = dict.get('ShadingType');
     try {
       switch (type) {
         case ShadingType.AXIAL:
         case ShadingType.RADIAL:
-          return new Shadings.RadialAxial(dict, matrix, xref, res);
+          return new Shadings.RadialAxial(dict, matrix, xref, res, pdfFunctionFactory);
         case ShadingType.FREE_FORM_MESH:
         case ShadingType.LATTICE_FORM_MESH:
         case ShadingType.COONS_PATCH_MESH:
         case ShadingType.TENSOR_PATCH_MESH:
-          return new Shadings.Mesh(shading, matrix, xref, res);
+          return new Shadings.Mesh(shading, matrix, xref, res, pdfFunctionFactory);
         default:
           throw new _util.FormatError('Unsupported ShadingType: ' + type);
       }
     } catch (ex) {
       if (ex instanceof _util.MissingDataException) {
         throw ex;
       }
       handler.send('UnsupportedFeature', { featureId: _util.UNSUPPORTED_FEATURES.shadingPattern });
@@ -34942,23 +34877,23 @@ var Pattern = function PatternClosure() 
       return new Shadings.Dummy();
     }
   };
   return Pattern;
 }();
 var Shadings = {};
 Shadings.SMALL_NUMBER = 1e-6;
 Shadings.RadialAxial = function RadialAxialClosure() {
-  function RadialAxial(dict, matrix, xref, res) {
+  function RadialAxial(dict, matrix, xref, res, pdfFunctionFactory) {
     this.matrix = matrix;
     this.coordsArr = dict.getArray('Coords');
     this.shadingType = dict.get('ShadingType');
     this.type = 'Pattern';
     var cs = dict.get('ColorSpace', 'CS');
-    cs = _colorspace.ColorSpace.parse(cs, xref, res);
+    cs = _colorspace.ColorSpace.parse(cs, xref, res, pdfFunctionFactory);
     this.cs = cs;
     var t0 = 0.0,
         t1 = 1.0;
     if (dict.has('Domain')) {
       var domainArr = dict.getArray('Domain');
       t0 = domainArr[0];
       t1 = domainArr[1];
     }
@@ -34979,17 +34914,17 @@ Shadings.RadialAxial = function RadialAx
       var distance = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
       if (r1 <= r2 + distance && r2 <= r1 + distance) {
         (0, _util.warn)('Unsupported radial gradient.');
       }
     }
     this.extendStart = extendStart;
     this.extendEnd = extendEnd;
     var fnObj = dict.get('Function');
-    var fn = _function.PDFFunction.parseArray(xref, fnObj);
+    var fn = pdfFunctionFactory.createFromArray(fnObj);
     var diff = t1 - t0;
     var step = diff / 10;
     var colorStops = this.colorStops = [];
     if (t0 >= t1 || step <= 0) {
       (0, _util.info)('Bad shading domain.');
       return;
     }
     var color = new Float32Array(cs.numComps),
@@ -35572,31 +35507,31 @@ Shadings.Mesh = function MeshClosure() {
           ps = figure.coords,
           cs = figure.colors;
       for (j = 0, jj = ps.length; j < jj; j++) {
         ps[j] *= 2;
         cs[j] *= 3;
       }
     }
   }
-  function Mesh(stream, matrix, xref, res) {
+  function Mesh(stream, matrix, xref, res, pdfFunctionFactory) {
     if (!(0, _primitives.isStream)(stream)) {
       throw new _util.FormatError('Mesh data is not a stream');
     }
     var dict = stream.dict;
     this.matrix = matrix;
     this.shadingType = dict.get('ShadingType');
     this.type = 'Pattern';
     this.bbox = dict.getArray('BBox');
     var cs = dict.get('ColorSpace', 'CS');
-    cs = _colorspace.ColorSpace.parse(cs, xref, res);
+    cs = _colorspace.ColorSpace.parse(cs, xref, res, pdfFunctionFactory);
     this.cs = cs;
     this.background = dict.has('Background') ? cs.getRgb(dict.get('Background'), 0) : null;
     var fnObj = dict.get('Function');
-    var fn = fnObj ? _function.PDFFunction.parseArray(xref, fnObj) : null;
+    var fn = fnObj ? pdfFunctionFactory.createFromArray(fnObj) : null;
     this.coords = [];
     this.colors = [];
     this.figures = [];
     var decodeContext = {
       bitsPerCoordinate: dict.get('BitsPerCoordinate'),
       bitsPerComponent: dict.get('BitsPerComponent'),
       bitsPerFlag: dict.get('BitsPerFlag'),
       decode: dict.getArray('Decode'),
@@ -35667,17 +35602,17 @@ function getTilingPatternIR(operatorList
     throw new _util.FormatError(`Invalid getTilingPatternIR /BBox array: [${bbox}].`);
   }
   return ['TilingPattern', args, operatorList, matrix, bbox, xstep, ystep, paintType, tilingType];
 }
 exports.Pattern = Pattern;
 exports.getTilingPatternIR = getTilingPatternIR;
 
 /***/ }),
-/* 33 */
+/* 32 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
@@ -35912,17 +35847,17 @@ function bidi(str, startLevel, vertical)
       chars[i] = '';
     }
   }
   return createBidiText(chars.join(''), isLTR);
 }
 exports.bidi = bidi;
 
 /***/ }),
-/* 34 */
+/* 33 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
@@ -38866,16 +38801,220 @@ var getMetrics = (0, _util.getLookupTabl
     t['a189'] = 927;
     t['a190'] = 970;
     t['a191'] = 918;
   });
 });
 exports.getMetrics = getMetrics;
 
 /***/ }),
+/* 34 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.PostScriptParser = exports.PostScriptLexer = undefined;
+
+var _util = __w_pdfjs_require__(0);
+
+var _primitives = __w_pdfjs_require__(1);
+
+var PostScriptParser = function PostScriptParserClosure() {
+  function PostScriptParser(lexer) {
+    this.lexer = lexer;
+    this.operators = [];
+    this.token = null;
+    this.prev = null;
+  }
+  PostScriptParser.prototype = {
+    nextToken: function PostScriptParser_nextToken() {
+      this.prev = this.token;
+      this.token = this.lexer.getToken();
+    },
+    accept: function PostScriptParser_accept(type) {
+      if (this.token.type === type) {
+        this.nextToken();
+        return true;
+      }
+      return false;
+    },
+    expect: function PostScriptParser_expect(type) {
+      if (this.accept(type)) {
+        return true;
+      }
+      throw new _util.FormatError(`Unexpected symbol: found ${this.token.type} expected ${type}.`);
+    },
+    parse: function PostScriptParser_parse() {
+      this.nextToken();
+      this.expect(PostScriptTokenTypes.LBRACE);
+      this.parseBlock();
+      this.expect(PostScriptTokenTypes.RBRACE);
+      return this.operators;
+    },
+    parseBlock: function PostScriptParser_parseBlock() {
+      while (true) {
+        if (this.accept(PostScriptTokenTypes.NUMBER)) {
+          this.operators.push(this.prev.value);
+        } else if (this.accept(PostScriptTokenTypes.OPERATOR)) {
+          this.operators.push(this.prev.value);
+        } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
+          this.parseCondition();
+        } else {
+          return;
+        }
+      }
+    },
+    parseCondition: function PostScriptParser_parseCondition() {
+      var conditionLocation = this.operators.length;
+      this.operators.push(null, null);
+      this.parseBlock();
+      this.expect(PostScriptTokenTypes.RBRACE);
+      if (this.accept(PostScriptTokenTypes.IF)) {
+        this.operators[conditionLocation] = this.operators.length;
+        this.operators[conditionLocation + 1] = 'jz';
+      } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
+        var jumpLocation = this.operators.length;
+        this.operators.push(null, null);
+        var endOfTrue = this.operators.length;
+        this.parseBlock();
+        this.expect(PostScriptTokenTypes.RBRACE);
+        this.expect(PostScriptTokenTypes.IFELSE);
+        this.operators[jumpLocation] = this.operators.length;
+        this.operators[jumpLocation + 1] = 'j';
+        this.operators[conditionLocation] = endOfTrue;
+        this.operators[conditionLocation + 1] = 'jz';
+      } else {
+        throw new _util.FormatError('PS Function: error parsing conditional.');
+      }
+    }
+  };
+  return PostScriptParser;
+}();
+var PostScriptTokenTypes = {
+  LBRACE: 0,
+  RBRACE: 1,
+  NUMBER: 2,
+  OPERATOR: 3,
+  IF: 4,
+  IFELSE: 5
+};
+var PostScriptToken = function PostScriptTokenClosure() {
+  function PostScriptToken(type, value) {
+    this.type = type;
+    this.value = value;
+  }
+  var opCache = Object.create(null);
+  PostScriptToken.getOperator = function PostScriptToken_getOperator(op) {
+    var opValue = opCache[op];
+    if (opValue) {
+      return opValue;
+    }
+    return opCache[op] = new PostScriptToken(PostScriptTokenTypes.OPERATOR, op);
+  };
+  PostScriptToken.LBRACE = new PostScriptToken(PostScriptTokenTypes.LBRACE, '{');
+  PostScriptToken.RBRACE = new PostScriptToken(PostScriptTokenTypes.RBRACE, '}');
+  PostScriptToken.IF = new PostScriptToken(PostScriptTokenTypes.IF, 'IF');
+  PostScriptToken.IFELSE = new PostScriptToken(PostScriptTokenTypes.IFELSE, 'IFELSE');
+  return PostScriptToken;
+}();
+var PostScriptLexer = function PostScriptLexerClosure() {
+  function PostScriptLexer(stream) {
+    this.stream = stream;
+    this.nextChar();
+    this.strBuf = [];
+  }
+  PostScriptLexer.prototype = {
+    nextChar: function PostScriptLexer_nextChar() {
+      return this.currentChar = this.stream.getByte();
+    },
+    getToken: function PostScriptLexer_getToken() {
+      var comment = false;
+      var ch = this.currentChar;
+      while (true) {
+        if (ch < 0) {
+          return _primitives.EOF;
+        }
+        if (comment) {
+          if (ch === 0x0A || ch === 0x0D) {
+            comment = false;
+          }
+        } else if (ch === 0x25) {
+          comment = true;
+        } else if (!(0, _util.isSpace)(ch)) {
+          break;
+        }
+        ch = this.nextChar();
+      }
+      switch (ch | 0) {
+        case 0x30:
+        case 0x31:
+        case 0x32:
+        case 0x33:
+        case 0x34:
+        case 0x35:
+        case 0x36:
+        case 0x37:
+        case 0x38:
+        case 0x39:
+        case 0x2B:
+        case 0x2D:
+        case 0x2E:
+          return new PostScriptToken(PostScriptTokenTypes.NUMBER, this.getNumber());
+        case 0x7B:
+          this.nextChar();
+          return PostScriptToken.LBRACE;
+        case 0x7D:
+          this.nextChar();
+          return PostScriptToken.RBRACE;
+      }
+      var strBuf = this.strBuf;
+      strBuf.length = 0;
+      strBuf[0] = String.fromCharCode(ch);
+      while ((ch = this.nextChar()) >= 0 && (ch >= 0x41 && ch <= 0x5A || ch >= 0x61 && ch <= 0x7A)) {
+        strBuf.push(String.fromCharCode(ch));
+      }
+      var str = strBuf.join('');
+      switch (str.toLowerCase()) {
+        case 'if':
+          return PostScriptToken.IF;
+        case 'ifelse':
+          return PostScriptToken.IFELSE;
+        default:
+          return PostScriptToken.getOperator(str);
+      }
+    },
+    getNumber: function PostScriptLexer_getNumber() {
+      var ch = this.currentChar;
+      var strBuf = this.strBuf;
+      strBuf.length = 0;
+      strBuf[0] = String.fromCharCode(ch);
+      while ((ch = this.nextChar()) >= 0) {
+        if (ch >= 0x30 && ch <= 0x39 || ch === 0x2D || ch === 0x2E) {
+          strBuf.push(String.fromCharCode(ch));
+        } else {
+          break;
+        }
+      }
+      var value = parseFloat(strBuf.join(''));
+      if (isNaN(value)) {
+        throw new _util.FormatError(`Invalid floating point number: ${value}`);
+      }
+      return value;
+    }
+  };
+  return PostScriptLexer;
+}();
+exports.PostScriptLexer = PostScriptLexer;
+exports.PostScriptParser = PostScriptParser;
+
+/***/ }),
 /* 35 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
@@ -38999,17 +39138,17 @@ exports.PDFImage = undefined;
 var _util = __w_pdfjs_require__(0);
 
 var _stream = __w_pdfjs_require__(2);
 
 var _primitives = __w_pdfjs_require__(1);
 
 var _colorspace = __w_pdfjs_require__(3);
 
-var _jpx = __w_pdfjs_require__(11);
+var _jpx = __w_pdfjs_require__(10);
 
 var PDFImage = function PDFImageClosure() {
   function handleImageData(image, nativeDecoder) {
     if (nativeDecoder && nativeDecoder.canDecode(image)) {
       return nativeDecoder.decode(image);
     }
     return Promise.resolve(image);
   }
@@ -39036,17 +39175,17 @@ var PDFImage = function PDFImageClosure(
       py = Math.floor(i * yRatio) * w1Scanline;
       for (j = 0; j < w2; j++) {
         oldIndex = py + xScaled[j];
         dest[newIndex++] = src[oldIndex];
       }
     }
     return dest;
   }
-  function PDFImage(xref, res, image, inline, smask, mask, isMask) {
+  function PDFImage({ xref, res, image, smask = null, mask = null, isMask = false, pdfFunctionFactory }) {
     this.image = image;
     var dict = image.dict;
     if (dict.has('Filter')) {
       var filter = dict.get('Filter').name;
       if (filter === 'JPXDecode') {
         var jpxImage = new _jpx.JpxImage();
         jpxImage.parseImageProperties(image.stream);
         image.stream.reset();
@@ -39090,17 +39229,17 @@ var PDFImage = function PDFImageClosure(
             break;
           case 4:
             colorSpace = _primitives.Name.get('DeviceCMYK');
             break;
           default:
             throw new Error(`JPX images with ${this.numComps} ` + 'color components not supported.');
         }
       }
-      this.colorSpace = _colorspace.ColorSpace.parse(colorSpace, xref, res);
+      this.colorSpace = _colorspace.ColorSpace.parse(colorSpace, xref, res, pdfFunctionFactory);
       this.numComps = this.colorSpace.numComps;
     }
     this.decode = dict.getArray('Decode', 'D');
     this.needsDecode = false;
     if (this.decode && (this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode) || isMask && !_colorspace.ColorSpace.isDefaultDecode(this.decode, 1))) {
       this.needsDecode = true;
       var max = (1 << bitsPerComponent) - 1;
       this.decodeCoefficients = [];
@@ -39108,32 +39247,43 @@ var PDFImage = function PDFImageClosure(
       for (var i = 0, j = 0; i < this.decode.length; i += 2, ++j) {
         var dmin = this.decode[i];
         var dmax = this.decode[i + 1];
         this.decodeCoefficients[j] = dmax - dmin;
         this.decodeAddends[j] = max * dmin;
       }
     }
     if (smask) {
-      this.smask = new PDFImage(xref, res, smask, false);
+      this.smask = new PDFImage({
+        xref,
+        res,
+        image: smask,
+        pdfFunctionFactory
+      });
     } else if (mask) {
       if ((0, _primitives.isStream)(mask)) {
         var maskDict = mask.dict,
             imageMask = maskDict.get('ImageMask', 'IM');
         if (!imageMask) {
           (0, _util.warn)('Ignoring /Mask in image without /ImageMask.');
         } else {
-          this.mask = new PDFImage(xref, res, mask, false, null, null, true);
+          this.mask = new PDFImage({
+            xref,
+            res,
+            image: mask,
+            isMask: true,
+            pdfFunctionFactory
+          });
         }
       } else {
         this.mask = mask;
       }
     }
   }
-  PDFImage.buildImage = function PDFImage_buildImage(handler, xref, res, image, inline, nativeDecoder) {
+  PDFImage.buildImage = function ({ handler, xref, res, image, nativeDecoder = null, pdfFunctionFactory }) {
     var imagePromise = handleImageData(image, nativeDecoder);
     var smaskPromise;
     var maskPromise;
     var smask = image.dict.get('SMask');
     var mask = image.dict.get('Mask');
     if (smask) {
       smaskPromise = handleImageData(smask, nativeDecoder);
       maskPromise = Promise.resolve(null);
@@ -39147,24 +39297,28 @@ var PDFImage = function PDFImageClosure(
         } else {
           (0, _util.warn)('Unsupported mask format.');
           maskPromise = Promise.resolve(null);
         }
       } else {
         maskPromise = Promise.resolve(null);
       }
     }
-    return Promise.all([imagePromise, smaskPromise, maskPromise]).then(function (results) {
-      var imageData = results[0];
-      var smaskData = results[1];
-      var maskData = results[2];
-      return new PDFImage(xref, res, imageData, inline, smaskData, maskData);
-    });
-  };
-  PDFImage.createMask = function PDFImage_createMask(imgArray, width, height, imageIsFromDecodeStream, inverseDecode) {
+    return Promise.all([imagePromise, smaskPromise, maskPromise]).then(function ([imageData, smaskData, maskData]) {
+      return new PDFImage({
+        xref,
+        res,
+        image: imageData,
+        smask: smaskData,
+        mask: maskData,
+        pdfFunctionFactory
+      });
+    });
+  };
+  PDFImage.createMask = function ({ imgArray, width, height, imageIsFromDecodeStream, inverseDecode }) {
     var computedLength = (width + 7 >> 3) * height;
     var actualLength = imgArray.byteLength;
     var haveFullData = computedLength === actualLength;
     var data, i;
     if (imageIsFromDecodeStream && (!inverseDecode || haveFullData)) {
       data = imgArray;
     } else if (!inverseDecode) {
       data = new Uint8Array(actualLength);
@@ -39189,17 +39343,17 @@ var PDFImage = function PDFImageClosure(
   };
   PDFImage.prototype = {
     get drawWidth() {
       return Math.max(this.width, this.smask && this.smask.width || 0, this.mask && this.mask.width || 0);
     },
     get drawHeight() {
       return Math.max(this.height, this.smask && this.smask.height || 0, this.mask && this.mask.height || 0);
     },
-    decodeBuffer: function PDFImage_decodeBuffer(buffer) {
+    decodeBuffer(buffer) {
       var bpc = this.bpc;
       var numComps = this.numComps;
       var decodeAddends = this.decodeAddends;
       var decodeCoefficients = this.decodeCoefficients;
       var max = (1 << bpc) - 1;
       var i, ii;
       if (bpc === 1) {
         for (i = 0, ii = buffer.length; i < ii; i++) {
@@ -39210,17 +39364,17 @@ var PDFImage = function PDFImageClosure(
       var index = 0;
       for (i = 0, ii = this.width * this.height; i < ii; i++) {
         for (var j = 0; j < numComps; j++) {
           buffer[index] = decodeAndClamp(buffer[index], decodeAddends[j], decodeCoefficients[j], max);
           index++;
         }
       }
     },
-    getComponents: function PDFImage_getComponents(buffer) {
+    getComponents(buffer) {
       var bpc = this.bpc;
       if (bpc === 8) {
         return buffer;
       }
       var width = this.width;
       var height = this.height;
       var numComps = this.numComps;
       var length = width * height * numComps;
@@ -39273,17 +39427,17 @@ var PDFImage = function PDFImageClosure(
           var value = buf >> remainingBits;
           output[i] = value < 0 ? 0 : value > max ? max : value;
           buf = buf & (1 << remainingBits) - 1;
           bits = remainingBits;
         }
       }
       return output;
     },
-    fillOpacity: function PDFImage_fillOpacity(rgbaBuf, width, height, actualHeight, image) {
+    fillOpacity(rgbaBuf, width, height, actualHeight, image) {
       var smask = this.smask;
       var mask = this.mask;
       var alphaBuf, sw, sh, i, ii, j;
       if (smask) {
         sw = smask.width;
         sh = smask.height;
         alphaBuf = new Uint8Array(sw * sh);
         smask.fillGrayBuffer(alphaBuf);
@@ -39328,17 +39482,17 @@ var PDFImage = function PDFImageClosure(
           rgbaBuf[j] = alphaBuf[i];
         }
       } else {
         for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {
           rgbaBuf[j] = 255;
         }
       }
     },
-    undoPreblend: function PDFImage_undoPreblend(buffer, width, height) {
+    undoPreblend(buffer, width, height) {
       var matte = this.smask && this.smask.matte;
       if (!matte) {
         return;
       }
       var matteRgb = this.colorSpace.getRgb(matte, 0);
       var matteR = matteRgb[0];
       var matteG = matteRgb[1];
       var matteB = matteRgb[2];
@@ -39356,17 +39510,17 @@ var PDFImage = function PDFImageClosure(
         r = (buffer[i] - matteR) * k + matteR;
         g = (buffer[i + 1] - matteG) * k + matteG;
         b = (buffer[i + 2] - matteB) * k + matteB;
         buffer[i] = r <= 0 ? 0 : r >= 255 ? 255 : r | 0;
         buffer[i + 1] = g <= 0 ? 0 : g >= 255 ? 255 : g | 0;
         buffer[i + 2] = b <= 0 ? 0 : b >= 255 ? 255 : b | 0;
       }
     },
-    createImageData: function PDFImage_createImageData(forceRGBA) {
+    createImageData(forceRGBA = false) {
       var drawWidth = this.drawWidth;
       var drawHeight = this.drawHeight;
       var imgData = {
         width: drawWidth,
         height: drawHeight
       };
       var numComps = this.numComps;
       var originalWidth = this.width;
@@ -39426,17 +39580,17 @@ var PDFImage = function PDFImageClosure(
         this.decodeBuffer(comps);
       }
       this.colorSpace.fillRgb(imgData.data, originalWidth, originalHeight, drawWidth, drawHeight, actualHeight, bpc, comps, alpha01);
       if (maybeUndoPreblend) {
         this.undoPreblend(imgData.data, drawWidth, actualHeight);
       }
       return imgData;
     },
-    fillGrayBuffer: function PDFImage_fillGrayBuffer(buffer) {
+    fillGrayBuffer(buffer) {
       var numComps = this.numComps;
       if (numComps !== 1) {
         throw new _util.FormatError(`Reading gray scale from a color image: ${numComps}`);
       }
       var width = this.width;
       var height = this.height;
       var bpc = this.bpc;
       var rowBytes = width * numComps * bpc + 7 >> 3;
@@ -39460,17 +39614,17 @@ var PDFImage = function PDFImageClosure(
         this.decodeBuffer(comps);
       }
       length = width * height;
       var scale = 255 / ((1 << bpc) - 1);
       for (i = 0; i < length; ++i) {
         buffer[i] = scale * comps[i] | 0;
       }
     },
-    getImageBytes: function PDFImage_getImageBytes(length, drawWidth, drawHeight, forceRGB) {
+    getImageBytes(length, drawWidth, drawHeight, forceRGB = false) {
       this.image.reset();
       this.image.drawWidth = drawWidth || this.width;
       this.image.drawHeight = drawHeight || this.height;
       this.image.forceRGB = !!forceRGB;
       return this.image.getBytes(length);
     }
   };
   return PDFImage;
@@ -39486,23 +39640,23 @@ exports.PDFImage = PDFImage;
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.AnnotationFactory = exports.AnnotationBorderStyle = exports.Annotation = undefined;
 
 var _util = __w_pdfjs_require__(0);
 
-var _obj = __w_pdfjs_require__(9);
+var _obj = __w_pdfjs_require__(8);
 
 var _primitives = __w_pdfjs_require__(1);
 
 var _colorspace = __w_pdfjs_require__(3);
 
-var _evaluator = __w_pdfjs_require__(13);
+var _evaluator = __w_pdfjs_require__(12);
 
 var _stream = __w_pdfjs_require__(2);
 
 class AnnotationFactory {
   static create(xref, ref, pdfManager, idFactory) {
     let dict = xref.fetchIfRef(ref);
     if (!(0, _primitives.isDict)(dict)) {
       return;
--- a/browser/themes/osx/browser.css
+++ b/browser/themes/osx/browser.css
@@ -50,30 +50,37 @@
 
 #main-window {
   -moz-appearance: none;
   background-color: #eeeeee;
 }
 
 /** Begin titlebar **/
 
+#titlebar {
+  /* Centrally align content items vertically */
+  -moz-box-pack: center;
+}
+
 #titlebar-content {
   /* Ensure the the content part of the titlebar does not shrink. */
   min-height: inherit;
 }
 
 #titlebar-buttonbox > .titlebar-button {
   display: none;
 }
 
 /* Making the toolbox position:relative (browser.inc.css) occludes titlebar indicators
  * if the toolbox has a background. Fix this by positioning the relevant elements, too: */
 #titlebar-secondary-buttonbox {
   position: relative;
   z-index: 1;
+  /* Centrally align indicators and full screen button vertically */
+  -moz-box-align: center;
 }
 
 #titlebar-buttonbox-container {
   -moz-box-align: center;
 }
 
 /* These would be margin-inline-start/end if it wasn't for the fact that OS X
  * doesn't reverse the order of the items in the titlebar in RTL mode. */
@@ -98,38 +105,16 @@
 /**
  * For tabs in titlebar on OS X, we stretch the titlebar down so that the
  * tabstrip can overlap it.
  */
 #main-window[tabsintitlebar] > #titlebar {
   min-height: calc(var(--tab-min-height) + var(--space-above-tabbar) - var(--tab-toolbar-navbar-overlap));
 }
 
-/**
- * We also vertically center the window buttons.
- */
-#titlebar-buttonbox-container {
-  -moz-box-align: start;
-}
-
-#main-window[tabsintitlebar] > #titlebar > #titlebar-content > #titlebar-buttonbox-container,
-#main-window[tabsintitlebar] > #titlebar > #titlebar-content > #titlebar-secondary-buttonbox > #titlebar-fullscreen-button {
-  /*
-   * To vertically center the window controls, we place them at half the
-   * height of the tabstrip ((tab height + drag space) / 2) - half the height
-   * of the window controls (16px / 2).
-   * */
-  margin-top: calc((var(--tab-min-height) + var(--space-above-tabbar)) / 2 - 8px);
-}
-
-#main-window:not([tabsintitlebar]) > #titlebar > #titlebar-content > #titlebar-buttonbox-container,
-#main-window:not([tabsintitlebar]) > #titlebar > #titlebar-content > #titlebar-secondary-buttonbox > #titlebar-fullscreen-button {
-  margin-top: 3px;
-}
-
 /** End titlebar **/
 
 #main-window[chromehidden~="toolbar"][chromehidden~="location"][chromehidden~="directories"] {
   border-top: 1px solid rgba(0,0,0,0.65);
 }
 
 #navigator-toolbox > toolbar:not(#TabsToolbar) {
   -moz-appearance: none;
--- a/build/build-clang/clang-4-linux64.json
+++ b/build/build-clang/clang-4-linux64.json
@@ -10,11 +10,12 @@
     "libcxx_repo": "https://llvm.org/svn/llvm-project/libcxx/tags/RELEASE_401/final",
     "libcxxabi_repo": "https://llvm.org/svn/llvm-project/libcxxabi/tags/RELEASE_401/final",
     "python_path": "/usr/bin/python2.7",
     "gcc_dir": "/builds/worker/workspace/build/src/gcc",
     "cc": "/builds/worker/workspace/build/src/gcc/bin/gcc",
     "cxx": "/builds/worker/workspace/build/src/gcc/bin/g++",
     "as": "/builds/worker/workspace/build/src/gcc/bin/gcc",
     "patches": [
-      "llvm-debug-frame.patch"
+      "llvm-debug-frame.patch",
+      "hide-gcda-profiling-symbols.patch"
     ]
 }
new file mode 100644
--- /dev/null
+++ b/build/build-clang/hide-gcda-profiling-symbols.patch
@@ -0,0 +1,108 @@
+diff --git a/compiler-rt/lib/profile/GCDAProfiling.c b/compiler-rt/lib/profile/GCDAProfiling.c
+index 138af6ec4..f0c05075a 100644
+--- a/compiler-rt/lib/profile/GCDAProfiling.c
++++ b/compiler-rt/lib/profile/GCDAProfiling.c
+@@ -231,6 +231,7 @@ static void unmap_file() {
+  * profiling enabled will emit to a different file. Only one file may be
+  * started at a time.
+  */
++COMPILER_RT_VISIBILITY
+ void llvm_gcda_start_file(const char *orig_filename, const char version[4],
+                           uint32_t checksum) {
+   const char *mode = "r+b";
+@@ -298,6 +299,7 @@ void llvm_gcda_start_file(const char *orig_filename, const char version[4],
+ /* Given an array of pointers to counters (counters), increment the n-th one,
+  * where we're also given a pointer to n (predecessor).
+  */
++COMPILER_RT_VISIBILITY
+ void llvm_gcda_increment_indirect_counter(uint32_t *predecessor,
+                                           uint64_t **counters) {
+   uint64_t *counter;
+@@ -320,6 +322,7 @@ void llvm_gcda_increment_indirect_counter(uint32_t *predecessor,
+ #endif
+ }
+ 
++COMPILER_RT_VISIBILITY
+ void llvm_gcda_emit_function(uint32_t ident, const char *function_name,
+                              uint32_t func_checksum, uint8_t use_extra_checksum,
+                              uint32_t cfg_checksum) {
+@@ -346,6 +349,7 @@ void llvm_gcda_emit_function(uint32_t ident, const char *function_name,
+     write_string(function_name);
+ }
+ 
++COMPILER_RT_VISIBILITY
+ void llvm_gcda_emit_arcs(uint32_t num_counters, uint64_t *counters) {
+   uint32_t i;
+   uint64_t *old_ctrs = NULL;
+@@ -397,6 +401,7 @@ void llvm_gcda_emit_arcs(uint32_t num_counters, uint64_t *counters) {
+ #endif
+ }
+ 
++COMPILER_RT_VISIBILITY
+ void llvm_gcda_summary_info() {
+   const uint32_t obj_summary_len = 9; /* Length for gcov compatibility. */
+   uint32_t i;
+@@ -450,6 +455,7 @@ void llvm_gcda_summary_info() {
+ #endif
+ }
+ 
++COMPILER_RT_VISIBILITY
+ void llvm_gcda_end_file() {
+   /* Write out EOF record. */
+   if (output_file) {
+@@ -474,6 +480,7 @@ void llvm_gcda_end_file() {
+ #endif
+ }
+ 
++COMPILER_RT_VISIBILITY
+ void llvm_register_writeout_function(writeout_fn fn) {
+   struct writeout_fn_node *new_node = malloc(sizeof(struct writeout_fn_node));
+   new_node->fn = fn;
+@@ -487,6 +494,7 @@ void llvm_register_writeout_function(writeout_fn fn) {
+   }
+ }
+ 
++COMPILER_RT_VISIBILITY
+ void llvm_writeout_files(void) {
+   struct writeout_fn_node *curr = writeout_fn_head;
+ 
+@@ -496,6 +504,7 @@ void llvm_writeout_files(void) {
+   }
+ }
+ 
++COMPILER_RT_VISIBILITY
+ void llvm_delete_writeout_function_list(void) {
+   while (writeout_fn_head) {
+     struct writeout_fn_node *node = writeout_fn_head;
+@@ -506,6 +515,7 @@ void llvm_delete_writeout_function_list(void) {
+   writeout_fn_head = writeout_fn_tail = NULL;
+ }
+ 
++COMPILER_RT_VISIBILITY
+ void llvm_register_flush_function(flush_fn fn) {
+   struct flush_fn_node *new_node = malloc(sizeof(struct flush_fn_node));
+   new_node->fn = fn;
+@@ -519,6 +529,7 @@ void llvm_register_flush_function(flush_fn fn) {
+   }
+ }
+ 
++COMPILER_RT_VISIBILITY
+ void __gcov_flush() {
+   struct flush_fn_node *curr = flush_fn_head;
+ 
+@@ -528,6 +539,7 @@ void __gcov_flush() {
+   }
+ }
+ 
++COMPILER_RT_VISIBILITY
+ void llvm_delete_flush_function_list(void) {
+   while (flush_fn_head) {
+     struct flush_fn_node *node = flush_fn_head;
+@@ -538,6 +550,7 @@ void llvm_delete_flush_function_list(void) {
+   flush_fn_head = flush_fn_tail = NULL;
+ }
+ 
++COMPILER_RT_VISIBILITY
+ void llvm_gcov_init(writeout_fn wfn, flush_fn ffn) {
+   static int atexit_ran = 0;
+ 
--- a/devtools/client/debugger/new/debugger.css
+++ b/devtools/client/debugger/new/debugger.css
@@ -404,31 +404,114 @@ body {
 ::-webkit-scrollbar-thumb {
   border-radius: 8px;
   background: rgba(113, 113, 113, 0.5);
 }
 
 :root.theme-dark .CodeMirror-scrollbar-filler {
   background: transparent;
 }
+.modal-wrapper {
+  position: fixed;
+  display: flex;
+  justify-content: center;
+  width: 100%;
+  height: 100%;
+  top: 0;
+  left: 0;
+  transition: z-index 200ms;
+  z-index: 100;
+}
+
+.modal {
+  top: 0;
+  height: 230px;
+  width: 500px;
+  background-color: var(--theme-codemirror-gutter-background);
+  transform: translateY(-250px);
+  transition: transform 150ms cubic-bezier(0.07, 0.95, 0, 1);
+  box-shadow: 2px 4px 6px var(--popup-shadow-color);
+}
+
+.modal.entering,
+.modal.exited {
+  transform: translateY(-250px);
+}
+
+.modal.entered,
+.modal.exiting {
+  transform: translateY(30px);
+}
+
+@media (max-width: 520px) {
+  .modal {
+    width: 80%;
+    left: 10%;
+  }
+}
+.shortcuts-content {
+  padding: 15px;
+}
+
+.shortcuts-content h2 {
+  margin-top: 2px;
+  margin-bottom: 2px;
+  color: var(--theme-graphs-bluegrey);
+}
+
+.shortcuts-section {
+  margin-bottom: 20px;
+}
+
+.shortcuts-list {
+  list-style: none;
+  margin: 0px;
+  padding: 0px;
+  overflow: auto;
+  width: calc(100% - 1px); /* 1px fixes the hidden right border */
+}
+
+.shortcuts-modal {
+  height: fit-content;
+}
+
+.shortcuts-list li {
+  width: 40%;
+  color: var(--theme-body-color);
+  padding-top: 5px;
+  display: flex;
+  justify-content: space-between;
+  border: 1px solid transparent;
+}
 :root.theme-light,
 :root .theme-light {
   --search-overlays-semitransparent: rgba(221, 225, 228, 0.66);
   --popup-shadow-color: #d0d0d0;
 }
 
 :root.theme-dark,
 :root .theme-dark {
   --search-overlays-semitransparent: rgba(42, 46, 56, 0.66);
   --popup-shadow-color: #5c667b;
 }
 * {
   box-sizing: border-box;
 }
 
+button {
+  background: transparent;
+  outline: none;
+  border: none;
+}
+
+button:hover,
+button:focus {
+  background-color: var(--theme-toolbar-background-hover);
+}
+
 .debugger {
   display: flex;
   flex: 1;
   height: 100%;
 }
 
 .editor-pane {
   display: flex;
@@ -788,16 +871,17 @@ menuseparator {
   pointer-events: none;
 }
 .arrow,
 .folder,
 .domain,
 .file,
 .worker,
 .refresh,
+.shortcut,
 .add-button {
   fill: var(--theme-splitter-color);
 }
 
 .worker,
 .folder {
   position: relative;
   top: 2px;
@@ -811,28 +895,30 @@ menuseparator {
   position: relative;
   top: 1px;
 }
 
 .domain svg,
 .folder svg,
 .worker svg,
 .refresh svg,
+.shortcut svg,
 .add-button svg {
   width: 15px;
 }
 
 .file svg {
   width: 13px;
 }
 
 .file svg,
 .domain svg,
 .folder svg,
 .refresh svg,
+.shortcut svg,
 .worker svg {
   margin-inline-end: 5px;
 }
 
 .arrow svg {
   fill: var(--theme-splitter-color);
   margin-top: 3px;
   transition: transform 0.25s ease;
@@ -852,16 +938,27 @@ html[dir="rtl"] .arrow svg {
 /* TODO (Amit): html is just for specificity. keep it like this? */
 html .arrow.expanded svg {
   transform: rotate(0deg);
 }
 
 .arrow.hidden {
   visibility: hidden;
 }
+
+.webpack svg {
+  width: 15px;
+  height: 15px;
+  margin-right: 5px;
+  vertical-align: bottom;
+}
+
+.theme-dark .webpack {
+  opacity: 0.5;
+}
 .managed-tree .tree {
   -webkit-user-select: none;
   -moz-user-select: none;
   -ms-user-select: none;
   -o-user-select: none;
   user-select: none;
 
   white-space: nowrap;
@@ -1296,131 +1393,118 @@ html[dir="rtl"] .managed-tree .tree .nod
   position: relative;
 }
 
 .sources-panel * {
   -moz-user-select: none;
   user-select: none;
 }
 
-.sources-header {
-  height: 29px;
-  background-color: var(--theme-toolbar-background);
-  border-bottom: 1px solid var(--theme-splitter-color);
-  padding-top: 0px;
-  padding-bottom: 0px;
-  line-height: 30px;
-  font-size: 1.2em;
-  display: flex;
-  align-items: baseline;
-  -moz-user-select: none;
-  user-select: none;
-  justify-content: flex-end;
-}
-
-.theme-dark .sources-header {
-  background-color: var(--theme-tab-toolbar-background);
-}
-
-.sources-header {
-  padding-inline-start: 10px;
-}
-
-.sources-header-info {
-  font-size: 12px;
-  color: var(--theme-comment-alt);
-  font-weight: lighter;
-  white-space: nowrap;
-  padding-inline-end: 10px;
-  cursor: default;
-}
-
 .sources-list {
   flex: 1;
   display: flex;
   overflow-x: hidden;
   overflow-y: auto;
 }
 
 .sources-list .managed-tree {
   flex: 1;
   display: flex;
   overflow-x: hidden;
   overflow-y: auto;
 }
 
+.sources-list .managed-tree .tree .node {
+  padding: 0px 0px 0px 3px;
+}
+
+.sources-list .tree .arrow svg {
+  margin-top: 0px;
+}
+
 .theme-dark .sources-list .tree .node:not(.focused) svg {
   fill: var(--theme-content-color3);
 }
 
 .theme-dark .source-list .tree .node.focused {
   background-color: var(--theme-tab-toolbar-background);
 }
 
+.sources-list .tree .focused .label {
+  background-color: var(--theme-selection-background);
+}
+
+.sources-list .tree .label {
+  padding: 3px 0px 3px 0px;
+  display: inline-block;
+}
+
 .no-sources-message {
   font-size: 12px;
   color: var(--theme-comment-alt);
   font-weight: lighter;
   padding-top: 5px;
   flex-grow: 1;
   display: flex;
   justify-content: center;
   align-items: center;
 }
 
-.sources-panel .source-footer {
-  position: relative;
-}
-
 .sources-panel .outline {
   display: flex;
   flex: 1;
 }
 
-.sources-panel .outline.hidden {
-  display: none;
-}
-
-.hidden {
-  display: none;
-}
-
-.source-footer {
+.source-outline-tabs {
   width: 100%;
-}
-
-.source-footer .tab {
+  background: var(--theme-body-background);
+  border-top: 1px solid var(--theme-splitter-color);
+  display: flex;
+  -moz-user-select: none;
+  user-select: none;
+  box-sizing: border-box;
+}
+
+.source-outline-tabs .tab {
   flex: 1;
   justify-content: center;
-  border: 1px solid transparent;
-  border-bottom-left-radius: 2px;
-  border-bottom-right-radius: 2px;
+  border-bottom: 1px solid transparent;
+  border-left: 1px solid transparent;
   display: inline-flex;
   position: relative;
   transition: all 0.25s ease;
   overflow: hidden;
-  padding: 5px;
+  padding: 6.5px;
   margin-bottom: 0px;
   margin-top: -1px;
   cursor: default;
 }
 
-.source-footer .tab:hover {
+.source-outline-tabs .tab:first-child {
+  border-left: 0;
+}
+
+.source-outline-tabs .tab:hover {
   background-color: var(--theme-toolbar-background-alt);
   border-color: var(--theme-splitter-color);
 }
 
-.source-footer .tab.active {
+.source-outline-tabs .tab {
   color: var(--theme-body-color);
   background-color: var(--theme-toolbar-background);
   border-color: var(--theme-splitter-color);
 }
 
-.source-footer .tab.active path,
-.source-footer .tab:hover path {
+.source-outline-tabs .tab.active {
+  background-color: var(--theme-body-background);
+  border-bottom-color: transparent;
+}
+
+.source-outline-tabs .tab.active path,
+.source-outline-tabs .tab:hover path {
   fill: var(--theme-body-color);
 }
 .outline {
   overflow-y: auto;
 }
 
 .outline .outline-pane-info {
   width: 100%;
@@ -1499,44 +1583,44 @@ html[dir="rtl"] .managed-tree .tree .nod
   line-height: 30px;
 }
 
 .conditional-breakpoint-panel input:focus {
   outline-width: 0;
 }
 .toggle-button-start,
 .toggle-button-end {
-  transform: translate(0, 2px);
+  transform: translate(0, 0px);
   transition: transform 0.25s ease-in-out;
-  padding: 5px 2px;
+  padding: 5px 5px;
 }
 
 .toggle-button-start.vertical,
 .toggle-button-end.vertical {
-  padding: 4px 2px;
+  padding: 2.5px 2.5px;
 }
 
 .toggle-button-start svg,
 .toggle-button-end svg {
   width: 16px;
   fill: var(--theme-comment);
 }
 
 .theme-dark .toggle-button-start svg,
 .theme-dark .toggle-button-end svg {
   fill: var(--theme-comment-alt);
 }
 
 .toggle-button-end {
-  margin-inline-end: 5px;
+  margin-inline-end: 0px;
   margin-inline-start: auto;
 }
 
 .toggle-button-start {
-  margin-inline-start: 5px;
+  margin-inline-start: 0px;
 }
 
 html:not([dir="rtl"]) .toggle-button-end svg,
 html[dir="rtl"] .toggle-button-start svg {
   transform: rotate(180deg);
 }
 
 html .toggle-button-end.vertical svg {
@@ -2239,35 +2323,30 @@ html[dir="rtl"] .arrow svg,
 .theme-dark {
   --theme-conditional-breakpoint-color: #9fa4a9;
 }
 
 .theme-light {
   --theme-conditional-breakpoint-color: var(--theme-body-color);
 }
 
-.paused .in-scope .CodeMirror-line,
-.paused .in-scope .CodeMirror-linenumber {
-  opacity: 1;
-}
-
 .paused .CodeMirror-line,
 .paused .CodeMirror-linenumber {
   opacity: 0.7;
 }
 
 /**
  * There's a known codemirror flex issue with chrome that this addresses.
  * BUG https://github.com/devtools-html/debugger.html/issues/63
  */
 .editor-wrapper {
   position: absolute;
   height: calc(100% - 31px);
   width: calc(100% - 1.5px);
-  top: 30px;
+  top: 29px;
   left: 0px;
   --editor-footer-height: 24px;
 }
 
 html[dir="rtl"] .editor-mount {
   direction: ltr;
 }
 
@@ -2452,17 +2531,16 @@ html[dir="rtl"] .editor-mount {
   border-radius: 2px;
   margin: 0 -1px -1px -1px;
 }
 .breakpoints-toggle {
   margin: 2px 3px;
 }
 
 .breakpoints-list * {
-  -moz-user-select: none;
   user-select: none;
 }
 
 .breakpoints-list .breakpoint {
   font-size: 12px;
   color: var(--theme-content-color1);
   padding: 0.5em 1em 0.5em 0.5em;
   line-height: 1em;
@@ -2616,18 +2694,18 @@ html .breakpoints-list .breakpoint.pause
   offset-inline-end: 0px;
   top: 4px;
 }
 
 .expression-content {
   position: relative;
 }
 
-.expression-container .close-btn {
-  display: none;
+.expression-content .tree-node {
+  overflow-x: hidden;
 }
 
 .expression-container:hover .close-btn {
   display: block;
 }
 
 .expression-input {
   max-width: 50%;
@@ -2674,18 +2752,19 @@ html .breakpoints-list .breakpoint.pause
 }
 
 .why-paused .message {
   font-size: 10px;
 }
 
 .why-paused .message.warning {
   font-size: 10px;
-  color: var(--theme-graphs-full-red);
+  color: var(--theme-graphs-red);
   font-weight: bold;
+  font-style: normal;
 }
 .frames ul {
   list-style: none;
   margin: 0;
   padding: 0;
 }
 
 .frames ul li {
@@ -2814,17 +2893,28 @@ html .breakpoints-list .breakpoint.pause
 
 .event-listeners .listener .close {
   display: none;
 }
 
 .event-listeners .listener:hover .close {
   display: block;
 }
-
+.workers-list * {
+  user-select: none;
+}
+
+.workers-list .worker {
+  font-size: 12px;
+  color: var(--theme-content-color1);
+  padding: 0.5em 1em 0.5em 0.5em;
+  line-height: 1em;
+  position: relative;
+  transition: all 0.25s ease;
+}
 :root {
   --accordion-header-background: var(--theme-toolbar-background);
 }
 
 :root.theme-dark {
   --accordion-header-background: #141416;
 }
 
@@ -2895,20 +2985,18 @@ html .breakpoints-list .breakpoint.pause
 
 .accordion .header-buttons button::-moz-focus-inner {
   border: none;
 }
 .command-bar {
   flex: 0 0 29px;
   border-bottom: 1px solid var(--theme-splitter-color);
   display: flex;
-  height: 29px;
   overflow: hidden;
   position: sticky;
-  top: 0;
   z-index: 1;
   background-color: var(--theme-toolbar-background);
 }
 
 .command-bar.vertical {
   width: 100vw;
 }
 
@@ -2975,16 +3063,27 @@ html .command-bar > button:disabled {
 
 .command-bar button.pause-exceptions.uncaught {
   color: var(--theme-highlight-purple);
 }
 
 .command-bar button.pause-exceptions.all {
   color: var(--theme-highlight-blue);
 }
+
+.bottom {
+  border-bottom: none;
+  background-color: var(--theme-body-background);
+  border-top: 1px solid var(--theme-splitter-color);
+  flex: 0 0 27px;
+}
+
+.command-bar > button {
+  padding: 6px 5px;
+}
 .object-node.default-property {
   opacity: 0.6;
 }
 
 .object-label {
   color: var(--theme-highlight-blue);
 }
 
@@ -3057,17 +3156,17 @@ html .command-bar > button:disabled {
   top: 30px;
   left: 0;
   padding: 50px 0 0 0;
   text-align: center;
   font-size: 1.25em;
   color: var(--theme-comment-alt);
   background-color: var(--theme-toolbar-background);
   font-weight: lighter;
-  z-index: 100;
+  z-index: 10;
   user-select: none;
 }
 
 .theme-dark .welcomebox {
   background-color: var(--theme-body-background);
 }
 
 .alignlabel {
@@ -3276,55 +3375,16 @@ html[dir="rtl"] .dropdown {
   position: fixed;
   width: 100%;
   height: 100%;
   background: transparent;
   z-index: 999;
   left: 0;
   top: 0;
 }
-.modal-wrapper {
-  position: fixed;
-  display: flex;
-  justify-content: center;
-  width: 100%;
-  height: 100%;
-  top: 0;
-  left: 0;
-  transition: z-index 200ms;
-  z-index: 9;
-}
-
-.modal {
-  top: 0;
-  z-index: 10;
-  width: 500px;
-  height: 230px;
-  background-color: var(--theme-codemirror-gutter-background);
-  transform: translateY(-250px);
-  transition: transform 150ms cubic-bezier(0.07, 0.95, 0, 1);
-  box-shadow: 2px 4px 6px var(--popup-shadow-color);
-}
-
-.modal.entering,
-.modal.exited {
-  transform: translateY(-250px);
-}
-
-.modal.entered,
-.modal.exiting {
-  transform: translateY(30px);
-}
-
-@media (max-width: 520px) {
-  .modal {
-    width: 80%;
-    left: 10%;
-  }
-}
 .symbol-modal-wrapper {
   position: fixed;
   width: 100%;
   height: 100%;
   z-index: 9;
 }
 
 .symbol-modal {
--- a/devtools/client/debugger/new/debugger.js
+++ b/devtools/client/debugger/new/debugger.js
@@ -138,17 +138,18 @@ if ((0, _devtoolsConfig.isFirefoxPanel)(
   };
 } else {
   window.L10N = _devtoolsLaunchpad.L10N;
   // $FlowIgnore:
   window.L10N.setBundle(__webpack_require__(960));
 
   (0, _devtoolsLaunchpad.bootstrap)(_react2.default, _reactDom2.default).then(connection => {
     (0, _client.onConnect)(connection, {
-      sourceMaps: __webpack_require__(898)
+      services: { sourceMaps: __webpack_require__(898) },
+      toolboxActions: {}
     });
   });
 }
 
 /***/ }),
 /* 2 */
 /***/ (function(module, exports) {
 
@@ -501,16 +502,17 @@ module.exports = __webpack_require__(168
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.nodeHasChildren = nodeHasChildren;
 exports.isExactUrlMatch = isExactUrlMatch;
 exports.isDirectory = isDirectory;
+exports.isNotJavaScript = isNotJavaScript;
 exports.isInvalidUrl = isInvalidUrl;
 exports.partIsFile = partIsFile;
 exports.createNode = createNode;
 exports.createParentMap = createParentMap;
 exports.getRelativePath = getRelativePath;
 
 var _url = __webpack_require__(334);
 
@@ -536,18 +538,28 @@ function isExactUrlMatch(pathPart, debug
 function isDirectory(url) {
   var parts = url.path.split("/").filter(p => p !== "");
 
   // Assume that all urls point to files except when they end with '/'
   // Or directory node has children
   return parts.length === 0 || url.path.slice(-1) === "/" || nodeHasChildren(url);
 }
 
+function isNotJavaScript(source) {
+  var parsedUrl = (0, _url.parse)(source.url).pathname;
+  if (!parsedUrl) {
+    return false;
+  }
+  var parsedExtension = parsedUrl.split(".").pop();
+
+  return ["css", "svg", "png"].includes(parsedExtension);
+}
+
 function isInvalidUrl(url, source) {
-  return IGNORED_URLS.indexOf(url) != -1 || !source.get("url") || source.get("loadedState") === "loading" || !url.group || (0, _source.isPretty)(source.toJS());
+  return IGNORED_URLS.indexOf(url) != -1 || !source.get("url") || source.get("loadedState") === "loading" || !url.group || (0, _source.isPretty)(source.toJS()) || isNotJavaScript(source.toJS());
 }
 
 function partIsFile(index, parts, url) {
   var isLastPart = index === parts.length - 1;
   return !isDirectory(url) && isLastPart;
 }
 
 function createNode(name, path, contents) {
@@ -642,22 +654,20 @@ exports.bindActionCreators = _bindAction
 exports.applyMiddleware = _applyMiddleware2["default"];
 exports.compose = _compose2["default"];
 
 /***/ }),
 /* 20 */
 /***/ (function(module, exports, __webpack_require__) {
 
 /**
- * Copyright 2013-present, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
+ * Copyright (c) 2013-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
  */
 
 if (false) {
   var REACT_ELEMENT_TYPE = (typeof Symbol === 'function' &&
     Symbol.for &&
     Symbol.for('react.element')) ||
     0xeac7;
 
@@ -853,35 +863,46 @@ function getFilenameFromPath(pathname) {
     if (filename == "" || !filename.includes(".")) {
       filename = "(index)";
     }
   }
   return filename;
 }
 
 function getURL(sourceUrl) {
+  var debuggeeUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
+
   var url = sourceUrl;
   var def = { path: "", group: "", filename: "" };
   if (!url) {
     return def;
   }
 
   var _parse = (0, _url.parse)(url),
       pathname = _parse.pathname,
       protocol = _parse.protocol,
       host = _parse.host,
       path = _parse.path;
 
+  var defaultDomain = (0, _url.parse)(debuggeeUrl).host;
   var filename = getFilenameFromPath(pathname);
 
   switch (protocol) {
     case "javascript:":
       // Ignore `javascript:` URLs for now
       return def;
 
+    case "webpack:":
+      // A Webpack source is a special case
+      return (0, _lodash.merge)(def, {
+        path: path,
+        group: "Webpack",
+        filename: filename
+      });
+
     case "about:":
       // An about page is a special case
       return (0, _lodash.merge)(def, {
         path: "/",
         group: url,
         filename: filename
       });
 
@@ -894,17 +915,17 @@ function getURL(sourceUrl) {
           group: "file://",
           filename: filename
         });
       } else if (host === null) {
         // We don't know what group to put this under, and it's a script
         // with a weird URL. Just group them all under an anonymous group.
         return (0, _lodash.merge)(def, {
           path: url,
-          group: "(no domain)",
+          group: defaultDomain,
           filename: filename
         });
       }
       break;
 
     case "http:":
     case "https:":
       return (0, _lodash.merge)(def, {
@@ -2060,16 +2081,22 @@ Object.defineProperty(exports, "createPa
   }
 });
 Object.defineProperty(exports, "getRelativePath", {
   enumerable: true,
   get: function () {
     return _utils.getRelativePath;
   }
 });
+Object.defineProperty(exports, "isNotJavaScript", {
+  enumerable: true,
+  get: function () {
+    return _utils.isNotJavaScript;
+  }
+});
 
 /***/ }),
 /* 40 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
@@ -2163,17 +2190,17 @@ function addSourceToNode(node, url, sour
   return [].concat(_toConsumableArray(node.contents), [newNode]);
 }
 
 /**
  * @memberof utils/sources-tree
  * @static
  */
 function addToTree(tree, source, debuggeeUrl) {
-  var url = (0, _getURL.getURL)(source.get("url"));
+  var url = (0, _getURL.getURL)(source.get("url"), debuggeeUrl);
 
   if ((0, _utils.isInvalidUrl)(url, source)) {
     return;
   }
 
   var finalNode = traverseTree(url, tree);
   finalNode.contents = addSourceToNode(finalNode, url, source);
 }
@@ -7213,17 +7240,17 @@ module.exports = {
       }
       return ii;
     };
 
     ArraySeq.prototype.__iterator = function(type, reverse) {
       var array = this._array;
       var maxIndex = array.length - 1;
       var ii = 0;
-      return new Iterator(function()
+      return new Iterator(function() 
         {return ii > maxIndex ?
           iteratorDone() :
           iteratorValue(type, ii, array[reverse ? maxIndex - ii++ : ii++])}
       );
     };
 
 
 
@@ -7684,17 +7711,17 @@ module.exports = {
           return ii + 1;
         }
       }
       return ii;
     };
 
     Repeat.prototype.__iterator = function(type, reverse) {var this$0 = this;
       var ii = 0;
-      return new Iterator(function()
+      return new Iterator(function() 
         {return ii < this$0.size ? iteratorValue(type, ii++, this$0._value) : iteratorDone()}
       );
     };
 
     Repeat.prototype.equals = function(other) {
       return other instanceof Repeat ?
         is(this._value, other._value) :
         deepEqual(other);
@@ -9882,17 +9909,17 @@ module.exports = {
     reversedSequence.reverse = function()  {return iterable};
     if (iterable.flip) {
       reversedSequence.flip = function () {
         var flipSequence = flipFactory(iterable);
         flipSequence.reverse = function()  {return iterable.flip()};
         return flipSequence;
       };
     }
-    reversedSequence.get = function(key, notSetValue)
+    reversedSequence.get = function(key, notSetValue) 
       {return iterable.get(useKeys ? key : -1 - key, notSetValue)};
     reversedSequence.has = function(key )
       {return iterable.has(useKeys ? key : -1 - key)};
     reversedSequence.includes = function(value ) {return iterable.includes(value)};
     reversedSequence.cacheResult = cacheResultThrough;
     reversedSequence.__iterate = function (fn, reverse) {var this$0 = this;
       return iterable.__iterate(function(v, k)  {return fn(v, k, this$0)}, !reverse);
     };
@@ -10081,17 +10108,17 @@ module.exports = {
 
   function takeWhileFactory(iterable, predicate, context) {
     var takeSequence = makeSequence(iterable);
     takeSequence.__iterateUncached = function(fn, reverse) {var this$0 = this;
       if (reverse) {
         return this.cacheResult().__iterate(fn, reverse);
       }
       var iterations = 0;
-      iterable.__iterate(function(v, k, c)
+      iterable.__iterate(function(v, k, c) 
         {return predicate.call(context, v, k, c) && ++iterations && fn(v, k, this$0)}
       );
       return iterations;
     };
     takeSequence.__iteratorUncached = function(type, reverse) {var this$0 = this;
       if (reverse) {
         return this.cacheResult().__iterator(type, reverse);
       }
@@ -10272,17 +10299,17 @@ module.exports = {
   }
 
 
   function interposeFactory(iterable, separator) {
     var interposedSequence = makeSequence(iterable);
     interposedSequence.size = iterable.size && iterable.size * 2 -1;
     interposedSequence.__iterateUncached = function(fn, reverse) {var this$0 = this;
       var iterations = 0;
-      iterable.__iterate(function(v, k)
+      iterable.__iterate(function(v, k) 
         {return (!iterations || fn(separator, iterations++, this$0) !== false) &&
         fn(v, iterations++, this$0) !== false},
         reverse
       );
       return iterations;
     };
     interposedSequence.__iteratorUncached = function(type, reverse) {
       var iterator = iterable.__iterator(ITERATE_VALUES, reverse);
@@ -14663,22 +14690,20 @@ var Sidebar = React.createClass({
 module.exports = Sidebar;
 
 /***/ }),
 /* 177 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 /**
- * Copyright 2013-present, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
+ * Copyright (c) 2013-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
  */
 
 
 
 var emptyFunction = __webpack_require__(178);
 var invariant = __webpack_require__(180);
 var ReactPropTypesSecret = __webpack_require__(187);
 
@@ -14713,17 +14738,18 @@ module.exports = function() {
     any: shim,
     arrayOf: getShim,
     element: shim,
     instanceOf: getShim,
     node: shim,
     objectOf: getShim,
     oneOf: getShim,
     oneOfType: getShim,
-    shape: getShim
+    shape: getShim,
+    exact: getShim
   };
 
   ReactPropTypes.checkPropTypes = emptyFunction;
   ReactPropTypes.PropTypes = ReactPropTypes;
 
   return ReactPropTypes;
 };
 
@@ -14732,23 +14758,21 @@ module.exports = function() {
 /* 178 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /**
  * Copyright (c) 2013-present, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
- *
- *
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * 
  */
 
 function makeEmptyFunction(arg) {
   return function () {
     return arg;
   };
 }
 
@@ -14899,21 +14923,19 @@ module.exports = Settings;
 
 /***/ }),
 /* 180 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 /**
  * Copyright (c) 2013-present, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
  *
  */
 
 
 
 /**
  * Use invariant() to assert state which your program assumes to be true.
  *
@@ -15277,22 +15299,20 @@ module.exports = function (className) {
 };
 
 /***/ }),
 /* 187 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 /**
- * Copyright 2013-present, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
+ * Copyright (c) 2013-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
  */
 
 
 
 var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';
 
 module.exports = ReactPropTypesSecret;
 
@@ -15543,22 +15563,22 @@ var _devtoolsConfig = __webpack_require_
  * action information, which will cause memory bloat.
  */
 var history = exports.history = function () {
   var log = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
   return (_ref) => {
     var dispatch = _ref.dispatch,
         getState = _ref.getState;
 
-    if ((0, _devtoolsConfig.isDevelopment)()) {
-      console.warn("Using history middleware stores all actions in state for " + "testing and devtools is not currently running in test " + "mode. Be sure this is intentional.");
-    }
     return next => action => {
-      log.push(action);
-      next(action);
+      if ((0, _devtoolsConfig.isDevelopment)()) {
+        log.push(action);
+      }
+
+      return next(action);
     };
   };
 };
 
 /***/ }),
 /* 193 */
 /***/ (function(module, exports, __webpack_require__) {
 
@@ -15933,39 +15953,40 @@ Object.defineProperty(__webpack_exports_
 const { isDevelopment } = __webpack_require__(828);
 const { Services, PrefsHelper } = __webpack_require__(830);
 
 const prefsSchemaVersion = "1.0.3";
 
 const pref = Services.pref;
 
 if (isDevelopment()) {
-  pref("devtools.debugger.client-source-maps-enabled", true);
+  pref("devtools.source-map.client-service.enabled", true);
   pref("devtools.debugger.pause-on-exceptions", false);
   pref("devtools.debugger.ignore-caught-exceptions", false);
   pref("devtools.debugger.call-stack-visible", false);
   pref("devtools.debugger.scopes-visible", false);
   pref("devtools.debugger.start-panel-collapsed", false);
   pref("devtools.debugger.end-panel-collapsed", false);
   pref("devtools.debugger.tabs", "[]");
   pref("devtools.debugger.ui.framework-grouping-on", true);
   pref("devtools.debugger.pending-selected-location", "{}");
   pref("devtools.debugger.pending-breakpoints", "{}");
   pref("devtools.debugger.expressions", "[]");
   pref("devtools.debugger.file-search-case-sensitive", false);
   pref("devtools.debugger.file-search-whole-word", false);
   pref("devtools.debugger.file-search-regex-match", false);
   pref("devtools.debugger.prefs-schema-version", "1.0.1");
-  pref("devtools.debugger.project-text-search-enabled", true);
+  pref("devtools.debugger.features.project-text-search", true);
   pref("devtools.debugger.features.async-stepping", true);
   pref("devtools.debugger.features.wasm", true);
+  pref("devtools.debugger.features.shortcuts", true);
 }
 
 const prefs = new PrefsHelper("devtools", {
-  clientSourceMapsEnabled: ["Bool", "debugger.client-source-maps-enabled"],
+  clientSourceMapsEnabled: ["Bool", "source-map.client-service.enabled"],
   pauseOnExceptions: ["Bool", "debugger.pause-on-exceptions"],
   ignoreCaughtExceptions: ["Bool", "debugger.ignore-caught-exceptions"],
   callStackVisible: ["Bool", "debugger.call-stack-visible"],
   scopesVisible: ["Bool", "debugger.scopes-visible"],
   startPanelCollapsed: ["Bool", "debugger.start-panel-collapsed"],
   endPanelCollapsed: ["Bool", "debugger.end-panel-collapsed"],
   frameworkGroupingOn: ["Bool", "debugger.ui.framework-grouping-on"],
   tabs: ["Json", "debugger.tabs", []],
@@ -15977,18 +15998,19 @@ const prefs = new PrefsHelper("devtools"
   fileSearchRegexMatch: ["Bool", "debugger.file-search-regex-match"],
   debuggerPrefsSchemaVersion: ["Char", "debugger.prefs-schema-version"]
 });
 /* harmony export (immutable) */ __webpack_exports__["prefs"] = prefs;
 
 
 const features = new PrefsHelper("devtools.debugger.features", {
   asyncStepping: ["Bool", "async-stepping", false],
-  projectTextSearch: ["Bool", "project-text-search-enabled", true],
-  wasm: ["Bool", "wasm", true]
+  projectTextSearch: ["Bool", "project-text-search", true],
+  wasm: ["Bool", "wasm", true],
+  shortcuts: ["Bool", "shortcuts", false]
 });
 /* harmony export (immutable) */ __webpack_exports__["features"] = features;
 
 
 if (prefs.debuggerPrefsSchemaVersion !== prefsSchemaVersion) {
   // clear pending Breakpoints
   prefs.pendingBreakpoints = {};
   prefs.debuggerPrefsSchemaVersion = prefsSchemaVersion;
@@ -16049,16 +16071,24 @@ var _coverage2 = _interopRequireDefault(
 var _projectTextSearch = __webpack_require__(31);
 
 var _projectTextSearch2 = _interopRequireDefault(_projectTextSearch);
 
 var _sourceSearch = __webpack_require__(1132);
 
 var _sourceSearch2 = _interopRequireDefault(_sourceSearch);
 
+var _sourceTree = __webpack_require__(1176);
+
+var _sourceTree2 = _interopRequireDefault(_sourceTree);
+
+var _debuggee = __webpack_require__(1175);
+
+var _debuggee2 = _interopRequireDefault(_debuggee);
+
 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/. */
 
 exports.default = {
   expressions: _expressions2.default,
@@ -16067,17 +16097,19 @@ exports.default = {
   breakpoints: _breakpoints2.default,
   pendingBreakpoints: _pendingBreakpoints2.default,
   asyncRequests: _asyncRequests2.default,
   pause: _pause2.default,
   ui: _ui2.default,
   ast: _ast2.default,
   coverage: _coverage2.default,
   projectTextSearch: _projectTextSearch2.default,
-  sourceSearch: _sourceSearch2.default
+  sourceSearch: _sourceSearch2.default,
+  sourceTree: _sourceTree2.default,
+  debuggee: _debuggee2.default
 };
 
 /***/ }),
 /* 228 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
@@ -16683,17 +16715,17 @@ function trimUrlQuery(url) {
 }
 
 function shouldPrettyPrint(source) {
   if (!source) {
     return false;
   }
 
   var _isPretty = isPretty(source);
-  var _isJavaScript = isJavaScript(source.url);
+  var _isJavaScript = isJavaScript(source);
   var isOriginal = (0, _devtoolsSourceMap.isOriginalId)(source.id);
   var hasSourceMap = source.sourceMapURL;
 
   if (_isPretty || isOriginal || hasSourceMap || !_isJavaScript) {
     return false;
   }
 
   return true;
@@ -16704,20 +16736,18 @@ function shouldPrettyPrint(source) {
  * javascript files.
  *
  * @return boolean
  *         True if the source is likely javascript.
  *
  * @memberof utils/source
  * @static
  */
-function isJavaScript(url) {
-  var contentType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
-
-  return url && /\.(jsm|js)?$/.test(trimUrlQuery(url)) || contentType.includes("javascript");
+function isJavaScript(source) {
+  return source.url && /\.(jsm|js)?$/.test(trimUrlQuery(source.url)) || !!(source.contentType && source.contentType.includes("javascript"));
 }
 
 /**
  * @memberof utils/source
  * @static
  */
 function isPretty(source) {
   return source.url ? /formatted$/.test(source.url) : false;
@@ -17385,24 +17415,27 @@ exports.default = update;
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.getSelectedFrame = exports.getLoadedObjects = exports.getPause = exports.State = undefined;
+exports.getSelectedFrame = exports.getSelectedFrameId = exports.getLoadedObjects = exports.getPause = exports.State = undefined;
 
 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.isStepping = isStepping;
+exports.isPaused = isPaused;
+exports.isEvaluatingExpression = isEvaluatingExpression;
+exports.hasWatchExpressionErrored = hasWatchExpressionErrored;
 exports.getLoadedObject = getLoadedObject;
 exports.getObjectProperties = getObjectProperties;
 exports.getIsWaitingOnBreak = getIsWaitingOnBreak;
 exports.getShouldPauseOnExceptions = getShouldPauseOnExceptions;
 exports.getShouldIgnoreCaughtExceptions = getShouldIgnoreCaughtExceptions;
 exports.getFrames = getFrames;
 exports.getFrameScopes = getFrameScopes;
 exports.getDebuggeeUrl = getDebuggeeUrl;
@@ -17534,16 +17567,21 @@ function update() {
       });
 
     case "COMMAND":
       return _extends({}, state, { command: action.value.type });
 
     case "CLEAR_COMMAND":
       return _extends({}, state, { command: "" });
 
+    case "EVALUATE_EXPRESSION":
+      return _extends({}, state, {
+        command: action.status === "start" ? "expression" : ""
+      });
+
     case "NAVIGATE":
       return _extends({}, state, { debuggeeUrl: action.url });
   }
 
   return state;
 }
 
 // Selectors
@@ -17562,16 +17600,29 @@ var getPauseState = state => state.pause
 var getPause = exports.getPause = (0, _reselect.createSelector)(getPauseState, pauseWrapper => pauseWrapper.pause);
 
 var getLoadedObjects = exports.getLoadedObjects = (0, _reselect.createSelector)(getPauseState, pauseWrapper => pauseWrapper.loadedObjects);
 
 function isStepping(state) {
   return ["stepIn", "stepOver", "stepOut"].includes(state.pause.command);
 }
 
+function isPaused(state) {
+  return !!getPause(state);
+}
+
+function isEvaluatingExpression(state) {
+  return state.pause.command === "expression";
+}
+
+function hasWatchExpressionErrored(state) {
+  var pause = getPause(state);
+  return isEvaluatingExpression(state) && pause && pause.why.type === "exception";
+}
+
 function getLoadedObject(state, objectId) {
   return getLoadedObjects(state)[objectId];
 }
 
 function getObjectProperties(state, parentId) {
   return getLoadedObjects(state).filter(obj => obj.parentId == parentId);
 }
 
@@ -17590,17 +17641,17 @@ function getShouldIgnoreCaughtExceptions
 function getFrames(state) {
   return state.pause.frames;
 }
 
 function getFrameScopes(state, frameId) {
   return state.pause.frameScopes[frameId];
 }
 
-var getSelectedFrameId = (0, _reselect.createSelector)(getPauseState, pauseWrapper => {
+var getSelectedFrameId = exports.getSelectedFrameId = (0, _reselect.createSelector)(getPauseState, pauseWrapper => {
   return pauseWrapper.selectedFrameId;
 });
 
 var getSelectedFrame = exports.getSelectedFrame = (0, _reselect.createSelector)(getSelectedFrameId, getFrames, (selectedFrameId, frames) => {
   if (!frames) {
     return null;
   }
   return frames.find(frame => frame.id == selectedFrameId);
@@ -17899,16 +17950,20 @@ var expressions = _interopRequireWildcar
 var _sources = __webpack_require__(232);
 
 var sources = _interopRequireWildcard(_sources);
 
 var _pause = __webpack_require__(239);
 
 var pause = _interopRequireWildcard(_pause);
 
+var _debuggee = __webpack_require__(1175);
+
+var debuggee = _interopRequireWildcard(_debuggee);
+
 var _breakpoints = __webpack_require__(236);
 
 var breakpoints = _interopRequireWildcard(_breakpoints);
 
 var _pendingBreakpoints = __webpack_require__(1133);
 
 var pendingBreakpoints = _interopRequireWildcard(_pendingBreakpoints);
 
@@ -17931,16 +17986,20 @@ var coverage = _interopRequireWildcard(_
 var _projectTextSearch = __webpack_require__(31);
 
 var projectTextSearch = _interopRequireWildcard(_projectTextSearch);
 
 var _sourceSearch = __webpack_require__(1132);
 
 var sourceSearch = _interopRequireWildcard(_sourceSearch);
 
+var _sourceTree = __webpack_require__(1176);
+
+var sourceTree = _interopRequireWildcard(_sourceTree);
+
 var _breakpointAtLocation = __webpack_require__(1134);
 
 var _breakpointAtLocation2 = _interopRequireDefault(_breakpointAtLocation);
 
 var _linesInScope = __webpack_require__(1124);
 
 var _linesInScope2 = _interopRequireDefault(_linesInScope);
 
@@ -17955,17 +18014,17 @@ var _isSelectedFrameVisible2 = _interopR
 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; } }
 
 /**
  * @param object - location
  */
 
-module.exports = Object.assign({}, expressions, sources, pause, breakpoints, pendingBreakpoints, eventListeners, ui, ast, coverage, projectTextSearch, sourceSearch, {
+module.exports = Object.assign({}, expressions, sources, pause, debuggee, breakpoints, pendingBreakpoints, eventListeners, ui, ast, coverage, projectTextSearch, sourceSearch, sourceTree, {
   getBreakpointAtLocation: _breakpointAtLocation2.default,
   getInScopeLines: _linesInScope2.default,
   getVisibleBreakpoints: _visibleBreakpoints2.default,
   isSelectedFrameVisible: _isSelectedFrameVisible2.default
 });
 
 /***/ }),
 /* 243 */
@@ -17981,20 +18040,24 @@ Object.defineProperty(exports, "__esModu
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _reactRedux = __webpack_require__(151);
 
 var _redux = __webpack_require__(3);
 
+var _prefs = __webpack_require__(226);
+
 var _actions = __webpack_require__(244);
 
 var _actions2 = _interopRequireDefault(_actions);
 
+var _ShortcutsModal = __webpack_require__(1181);
+
 var _selectors = __webpack_require__(242);
 
 var _ui = __webpack_require__(1128);
 
 var _devtoolsModules = __webpack_require__(830);
 
 __webpack_require__(857);
 
@@ -18042,16 +18105,17 @@ var shortcuts = new _devtoolsModules.Key
 
 var verticalLayoutBreakpoint = window.matchMedia("(min-width: 800px)");
 
 class App extends _react.Component {
 
   constructor(props) {
     super(props);
     this.state = {
+      shortcutsModalEnabled: false,
       horizontal: verticalLayoutBreakpoint.matches,
       startPanelSize: 0,
       endPanelSize: 0
     };
 
     this.getChildContext = this.getChildContext.bind(this);
     this.onLayoutChange = this.onLayoutChange.bind(this);
     this.toggleSymbolModal = this.toggleSymbolModal.bind(this);
@@ -18145,16 +18209,22 @@ class App extends _react.Component {
           endPanelSize: endPanelSize
         }),
         !this.props.selectedSource ? _react2.default.createElement(_WelcomeBox2.default, { horizontal: horizontal }) : null,
         _react2.default.createElement(_ProjectSearch2.default, null)
       )
     );
   }
 
+  toggleShortcutsModal() {
+    this.setState({
+      shortcutsModalEnabled: !this.state.shortcutsModalEnabled
+    });
+  }
+
   renderHorizontalLayout() {
     var _props4 = this.props,
         startPanelCollapsed = _props4.startPanelCollapsed,
         endPanelCollapsed = _props4.endPanelCollapsed;
     var horizontal = this.state.horizontal;
 
 
     var overflowX = endPanelCollapsed ? "hidden" : "auto";
@@ -18172,17 +18242,20 @@ class App extends _react.Component {
         style: { overflowX },
         initialSize: "300px",
         minSize: 10,
         maxSize: "80%",
         splitterSize: 1,
         onResizeEnd: size => this.setState({ endPanelSize: size }),
         endPanelControl: true,
         startPanel: this.renderEditorPane(),
-        endPanel: _react2.default.createElement(_SecondaryPanes2.default, { horizontal: horizontal }),
+        endPanel: _react2.default.createElement(_SecondaryPanes2.default, {
+          horizontal: horizontal,
+          toggleShortcutsModal: () => this.toggleShortcutsModal()
+        }),
         endPanelCollapsed: endPanelCollapsed,
         vert: horizontal
       })
     });
   }
 
   renderVerticalLayout() {
     var _props5 = this.props,
@@ -18225,27 +18298,37 @@ class App extends _react.Component {
     }
 
     return _react2.default.createElement(_SymbolModal2.default, {
       selectSource: selectSource,
       selectedSource: selectedSource
     });
   }
 
+  renderShortcutsModal() {
+    if (!_prefs.features.shortcuts) {
+      return;
+    }
+
+    return _react2.default.createElement(_ShortcutsModal.ShortcutsModal, {
+      enabled: this.state.shortcutsModalEnabled,
+      handleClose: () => this.toggleShortcutsModal()
+    });
+  }
+
   render() {
     return _react2.default.createElement(
       "div",
       { className: "debugger" },
       this.state.horizontal ? this.renderHorizontalLayout() : this.renderVerticalLayout(),
-      this.renderSymbolModal()
-    );
-  }
-}
-
-App.displayName = "App";
+      this.renderSymbolModal(),
+      this.renderShortcutsModal()
+    );
+  }
+}
 
 App.childContextTypes = { shortcuts: _react.PropTypes.object };
 
 exports.default = (0, _reactRedux.connect)(state => ({
   selectedSource: (0, _selectors.getSelectedSource)(state),
   startPanelCollapsed: (0, _selectors.getPaneCollapse)(state, "start"),
   endPanelCollapsed: (0, _selectors.getPaneCollapse)(state, "end"),
   activeSearch: (0, _selectors.getActiveSearch)(state)
@@ -18301,23 +18384,35 @@ var coverage = _interopRequireWildcard(_
 var _projectTextSearch = __webpack_require__(37);
 
 var projectTextSearch = _interopRequireWildcard(_projectTextSearch);
 
 var _sourceSearch = __webpack_require__(1144);
 
 var sourceSearch = _interopRequireWildcard(_sourceSearch);
 
+var _sourceTree = __webpack_require__(1178);
+
+var sourceTree = _interopRequireWildcard(_sourceTree);
+
 var _loadSourceText = __webpack_require__(1143);
 
 var loadSourceText = _interopRequireWildcard(_loadSourceText);
 
+var _debuggee = __webpack_require__(1179);
+
+var debuggee = _interopRequireWildcard(_debuggee);
+
+var _toolbox = __webpack_require__(1180);
+
+var toolbox = _interopRequireWildcard(_toolbox);
+
 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 = Object.assign({}, navigation, breakpoints, expressions, eventListeners, sources, pause, ui, ast, coverage, projectTextSearch, sourceSearch, loadSourceText);
+exports.default = Object.assign({}, navigation, breakpoints, expressions, eventListeners, sources, pause, ui, ast, coverage, projectTextSearch, sourceSearch, sourceTree, loadSourceText, debuggee, toolbox);
 
 /***/ }),
 /* 245 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
@@ -18414,56 +18509,60 @@ function syncBreakpoint(sourceId, pendin
  * Add a new breakpoint
  *
  * @memberof actions/breakpoints
  * @static
  * @param {String} $1.condition Conditional breakpoint condition value
  * @param {Boolean} $1.disabled Disable value for breakpoint value
  */
 
-function addBreakpoint(location, condition, hidden) {
+function addBreakpoint(location) {
+  var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
+      condition = _ref4.condition,
+      hidden = _ref4.hidden;
+
   var breakpoint = (0, _breakpoint.createBreakpoint)(location, { condition, hidden });
-  return (_ref4) => {
-    var dispatch = _ref4.dispatch,
-        getState = _ref4.getState,
-        sourceMaps = _ref4.sourceMaps,
-        client = _ref4.client;
+  return (_ref5) => {
+    var dispatch = _ref5.dispatch,
+        getState = _ref5.getState,
+        sourceMaps = _ref5.sourceMaps,
+        client = _ref5.client;
 
     var action = { type: "ADD_BREAKPOINT", breakpoint };
     var promise = (0, _addBreakpoint2.default)(getState, client, sourceMaps, action);
     return dispatch(_extends({}, action, { [_promise.PROMISE]: promise }));
   };
 }
 
 /**
  * Add a new hidden breakpoint
  *
  * @memberOf actions/breakpoints
  * @param location
  * @return {function(ThunkArgs)}
  */
 function addHiddenBreakpoint(location) {
-  return (_ref5) => {
-    var dispatch = _ref5.dispatch;
-
-    return dispatch(addBreakpoint(location, "", true));
+  return (_ref6) => {
+    var dispatch = _ref6.dispatch;
+
+    return dispatch(addBreakpoint(location, { hidden: true }));
   };
 }
 
 /**
  * Remove a single breakpoint
  *
  * @memberof actions/breakpoints
  * @static
  */
 function removeBreakpoint(location) {
-  return (_ref6) => {
-    var dispatch = _ref6.dispatch,
-        getState = _ref6.getState,
-        client = _ref6.client;
+  return (_ref7) => {
+    var dispatch = _ref7.dispatch,
+        getState = _ref7.getState,
+        client = _ref7.client;
 
     var bp = (0, _selectors.getBreakpoint)(getState(), location);
     if (!bp || bp.loading) {
       return;
     }
 
     // If the breakpoint is already disabled, we don't need to communicate
     // with the server. We just need to dispatch an action
@@ -18489,210 +18588,210 @@ function removeBreakpoint(location) {
  * will reuse the existing breakpoint information that is stored.
  *
  * @memberof actions/breakpoints
  * @static
  * @param {Location} $1.location Location  value
  */
 function enableBreakpoint(location) {
   return (() => {
-    var _ref7 = _asyncToGenerator(function* (_ref8) {
-      var dispatch = _ref8.dispatch,
-          getState = _ref8.getState,
-          client = _ref8.client,
-          sourceMaps = _ref8.sourceMaps;
+    var _ref8 = _asyncToGenerator(function* (_ref9) {
+      var dispatch = _ref9.dispatch,
+          getState = _ref9.getState,
+          client = _ref9.client,
+          sourceMaps = _ref9.sourceMaps;
 
       var breakpoint = (0, _selectors.getBreakpoint)(getState(), location);
       if (!breakpoint || breakpoint.loading) {
         return;
       }
 
       var action = { type: "ENABLE_BREAKPOINT", breakpoint };
       var promise = (0, _addBreakpoint2.default)(getState, client, sourceMaps, action);
       return dispatch({
         type: "ENABLE_BREAKPOINT",
         breakpoint,
         [_promise.PROMISE]: promise
       });
     });
 
-    return function (_x2) {
-      return _ref7.apply(this, arguments);
+    return function (_x3) {
+      return _ref8.apply(this, arguments);
     };
   })();
 }
 
 /**
  * Disable a single breakpoint
  *
  * @memberof actions/breakpoints
  * @static
  */
 function disableBreakpoint(location) {
   return (() => {
-    var _ref9 = _asyncToGenerator(function* (_ref10) {
-      var dispatch = _ref10.dispatch,
-          getState = _ref10.getState,
-          client = _ref10.client;
+    var _ref10 = _asyncToGenerator(function* (_ref11) {
+      var dispatch = _ref11.dispatch,
+          getState = _ref11.getState,
+          client = _ref11.client;
 
       var bp = (0, _selectors.getBreakpoint)(getState(), location);
 
       if (!bp || bp.loading) {
         return;
       }
 
       yield client.removeBreakpoint(bp.generatedLocation);
       var newBreakpoint = _extends({}, bp, { disabled: true });
 
       return dispatch({
         type: "DISABLE_BREAKPOINT",
         breakpoint: newBreakpoint
       });
     });
 
-    return function (_x3) {
-      return _ref9.apply(this, arguments);
+    return function (_x4) {
+      return _ref10.apply(this, arguments);
     };
   })();
 }
 
 /**
  * Toggle All Breakpoints
  *
  * @memberof actions/breakpoints
  * @static
  */
 function toggleAllBreakpoints(shouldDisableBreakpoints) {
   return (() => {
-    var _ref11 = _asyncToGenerator(function* (_ref12) {
-      var dispatch = _ref12.dispatch,
-          getState = _ref12.getState;
+    var _ref12 = _asyncToGenerator(function* (_ref13) {
+      var dispatch = _ref13.dispatch,
+          getState = _ref13.getState;
 
       var breakpoints = (0, _selectors.getBreakpoints)(getState());
-      for (var _ref13 of breakpoints) {
-        var _ref14 = _slicedToArray(_ref13, 2);
-
-        var breakpoint = _ref14[1];
+      for (var _ref14 of breakpoints) {
+        var _ref15 = _slicedToArray(_ref14, 2);
+
+        var breakpoint = _ref15[1];
 
         if (shouldDisableBreakpoints) {
           yield dispatch(disableBreakpoint(breakpoint.location));
         } else {
           yield dispatch(enableBreakpoint(breakpoint.location));
         }
       }
     });
 
-    return function (_x4) {
-      return _ref11.apply(this, arguments);
+    return function (_x5) {
+      return _ref12.apply(this, arguments);
     };
   })();
 }
 
 /**
  * Toggle Breakpoints
  *
  * @memberof actions/breakpoints
  * @static
  */
 function toggleBreakpoints(shouldDisableBreakpoints, breakpoints) {
   return (() => {
-    var _ref15 = _asyncToGenerator(function* (_ref16) {
-      var dispatch = _ref16.dispatch;
-
-      for (var _ref17 of breakpoints) {
-        var _ref18 = _slicedToArray(_ref17, 2);
-
-        var breakpoint = _ref18[1];
+    var _ref16 = _asyncToGenerator(function* (_ref17) {
+      var dispatch = _ref17.dispatch;
+
+      for (var _ref18 of breakpoints) {
+        var _ref19 = _slicedToArray(_ref18, 2);
+
+        var breakpoint = _ref19[1];
 
         if (shouldDisableBreakpoints) {
           yield dispatch(disableBreakpoint(breakpoint.location));
         } else {
           yield dispatch(enableBreakpoint(breakpoint.location));
         }
       }
     });
 
-    return function (_x5) {
-      return _ref15.apply(this, arguments);
+    return function (_x6) {
+      return _ref16.apply(this, arguments);
     };
   })();
 }
 
 /**
  * Removes all breakpoints
  *
  * @memberof actions/breakpoints
  * @static
  */
 function removeAllBreakpoints() {
   return (() => {
-    var _ref19 = _asyncToGenerator(function* (_ref20) {
-      var dispatch = _ref20.dispatch,
-          getState = _ref20.getState;
+    var _ref20 = _asyncToGenerator(function* (_ref21) {
+      var dispatch = _ref21.dispatch,
+          getState = _ref21.getState;
 
       var breakpoints = (0, _selectors.getBreakpoints)(getState());
-      for (var _ref21 of breakpoints) {
-        var _ref22 = _slicedToArray(_ref21, 2);
-
-        var breakpoint = _ref22[1];
+      for (var _ref22 of breakpoints) {
+        var _ref23 = _slicedToArray(_ref22, 2);
+
+        var breakpoint = _ref23[1];
 
         yield dispatch(removeBreakpoint(breakpoint.location));
       }
     });
 
-    return function (_x6) {
-      return _ref19.apply(this, arguments);
+    return function (_x7) {
+      return _ref20.apply(this, arguments);
     };
   })();
 }
 
 /**
  * Removes breakpoints
  *
  * @memberof actions/breakpoints
  * @static
  */
 function removeBreakpoints(breakpoints) {
   return (() => {
-    var _ref23 = _asyncToGenerator(function* (_ref24) {
-      var dispatch = _ref24.dispatch;
-
-      for (var _ref25 of breakpoints) {
-        var _ref26 = _slicedToArray(_ref25, 2);
-
-        var breakpoint = _ref26[1];
+    var _ref24 = _asyncToGenerator(function* (_ref25) {
+      var dispatch = _ref25.dispatch;
+
+      for (var _ref26 of breakpoints) {
+        var _ref27 = _slicedToArray(_ref26, 2);
+
+        var breakpoint = _ref27[1];
 
         yield dispatch(removeBreakpoint(breakpoint.location));
       }
     });
 
-    return function (_x7) {
-      return _ref23.apply(this, arguments);
+    return function (_x8) {
+      return _ref24.apply(this, arguments);
     };
   })();
 }
 
 function remapBreakpoints(sourceId) {
   return (() => {
-    var _ref27 = _asyncToGenerator(function* (_ref28) {
-      var dispatch = _ref28.dispatch,
-          getState = _ref28.getState,
-          sourceMaps = _ref28.sourceMaps;
+    var _ref28 = _asyncToGenerator(function* (_ref29) {
+      var dispatch = _ref29.dispatch,
+          getState = _ref29.getState,
+          sourceMaps = _ref29.sourceMaps;
 
       var breakpoints = (0, _selectors.getBreakpoints)(getState());
       var newBreakpoints = yield (0, _remapLocations2.default)(breakpoints, sourceId, sourceMaps);
 
       return dispatch({
         type: "REMAP_BREAKPOINTS",
         breakpoints: newBreakpoints
       });
     });
 
-    return function (_x8) {
-      return _ref27.apply(this, arguments);
+    return function (_x9) {
+      return _ref28.apply(this, arguments);
     };
   })();
 }
 
 /**
  * Update the condition of a breakpoint.
  *
  * @throws {Error} "not implemented"
@@ -18700,29 +18799,29 @@ function remapBreakpoints(sourceId) {
  * @static
  * @param {Location} location
  *        @see DebuggerController.Breakpoints.addBreakpoint
  * @param {string} condition
  *        The condition to set on the breakpoint
  * @param {Boolean} $1.disabled Disable value for breakpoint value
  */
 function setBreakpointCondition(location) {
-  var _ref29 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
-      condition = _ref29.condition;
+  var _ref30 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
+      condition = _ref30.condition;
 
   return (() => {
-    var _ref30 = _asyncToGenerator(function* (_ref31) {
-      var dispatch = _ref31.dispatch,
-          getState = _ref31.getState,
-          client = _ref31.client,
-          sourceMaps = _ref31.sourceMaps;
+    var _ref31 = _asyncToGenerator(function* (_ref32) {
+      var dispatch = _ref32.dispatch,
+          getState = _ref32.getState,
+          client = _ref32.client,
+          sourceMaps = _ref32.sourceMaps;
 
       var bp = (0, _selectors.getBreakpoint)(getState(), location);
       if (!bp) {
-        return dispatch(addBreakpoint(location, condition));
+        return dispatch(addBreakpoint(location, { condition }));
       }
 
       if (bp.loading) {
         return;
       }
 
       if (bp.disabled) {
         yield dispatch(enableBreakpoint(location));
@@ -18736,28 +18835,28 @@ function setBreakpointCondition(location
       (0, _breakpoint.assertBreakpoint)(newBreakpoint);
 
       return dispatch({
         type: "SET_BREAKPOINT_CONDITION",
         breakpoint: newBreakpoint
       });
     });
 
-    return function (_x10) {
-      return _ref30.apply(this, arguments);
+    return function (_x11) {
+      return _ref31.apply(this, arguments);
     };
   })();
 }
 
 function toggleBreakpoint(line, column) {
-  return (_ref32) => {
-    var dispatch = _ref32.dispatch,
-        getState = _ref32.getState,
-        client = _ref32.client,
-        sourceMaps = _ref32.sourceMaps;
+  return (_ref33) => {
+    var dispatch = _ref33.dispatch,
+        getState = _ref33.getState,
+        client = _ref33.client,
+        sourceMaps = _ref33.sourceMaps;
 
     var selectedSource = (0, _selectors.getSelectedSource)(getState());
     var bp = (0, _selectors.getBreakpointAtLocation)(getState(), { line, column });
 
     if (bp && bp.loading) {
       return;
     }
 
@@ -18776,21 +18875,21 @@ function toggleBreakpoint(line, column) 
       sourceUrl: selectedSource.get("url"),
       line: line,
       column: column
     }));
   };
 }
 
 function addOrToggleDisabledBreakpoint(line, column) {
-  return (_ref33) => {
-    var dispatch = _ref33.dispatch,
-        getState = _ref33.getState,
-        client = _ref33.client,
-        sourceMaps = _ref33.sourceMaps;
+  return (_ref34) => {
+    var dispatch = _ref34.dispatch,
+        getState = _ref34.getState,
+        client = _ref34.client,
+        sourceMaps = _ref34.sourceMaps;
 
     var selectedSource = (0, _selectors.getSelectedSource)(getState());
     var bp = (0, _selectors.getBreakpointAtLocation)(getState(), { line, column });
 
     if (bp && bp.loading) {
       return;
     }
 
@@ -18804,21 +18903,21 @@ function addOrToggleDisabledBreakpoint(l
       sourceUrl: selectedSource.get("url"),
       line: line,
       column: column
     }));
   };
 }
 
 function toggleDisabledBreakpoint(line, column) {
-  return (_ref34) => {
-    var dispatch = _ref34.dispatch,
-        getState = _ref34.getState,
-        client = _ref34.client,
-        sourceMaps = _ref34.sourceMaps;
+  return (_ref35) => {
+    var dispatch = _ref35.dispatch,
+        getState = _ref35.getState,
+        client = _ref35.client,
+        sourceMaps = _ref35.sourceMaps;
 
     var bp = (0, _selectors.getBreakpointAtLocation)(getState(), { line, column });
     if (!bp || bp.loading) {
       return;
     }
 
     if (!bp.disabled) {
       return dispatch(disableBreakpoint(bp.location));
@@ -19182,16 +19281,18 @@ exports.addExpression = addExpression;
 exports.updateExpression = updateExpression;
 exports.deleteExpression = deleteExpression;
 exports.evaluateExpressions = evaluateExpressions;
 
 var _promise = __webpack_require__(193);
 
 var _selectors = __webpack_require__(242);
 
+var _expressions = __webpack_require__(1177);
+
 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"); }); }; }
 
 /**
  * Add expression for debugger to watch
  *
  * @param {object} expression
  * @param {number} expression.id
  * @memberof actions/pause
@@ -19204,31 +19305,26 @@ function addExpression(input) {
           getState = _ref2.getState;
 
       if (!input) {
         return;
       }
 
       var expression = (0, _selectors.getExpression)(getState(), input);
       if (expression) {
-        return dispatch({
-          type: "UPDATE_EXPRESSION",
-          expression,
-          input
-        });
+        return dispatch(evaluateExpression(expression));
       }
 
       dispatch({
         type: "ADD_EXPRESSION",
         input
       });
 
-      var selectedFrame = (0, _selectors.getSelectedFrame)(getState());
-      var selectedFrameId = selectedFrame ? selectedFrame.id : null;
-      dispatch(evaluateExpression({ input }, selectedFrameId));
+      var newExpression = (0, _selectors.getExpression)(getState(), input);
+      dispatch(evaluateExpression(newExpression));
     });
 
     return function (_x) {
       return _ref.apply(this, arguments);
     };
   })();
 }
 
@@ -19242,19 +19338,17 @@ function updateExpression(input, express
     }
 
     dispatch({
       type: "UPDATE_EXPRESSION",
       expression,
       input: input
     });
 
-    var selectedFrame = (0, _selectors.getSelectedFrame)(getState());
-    var selectedFrameId = selectedFrame ? selectedFrame.id : null;
-    dispatch(evaluateExpressions(selectedFrameId));
+    dispatch(evaluateExpressions());
   };
 }
 
 /**
  *
  * @param {object} expression
  * @param {number} expression.id
  * @memberof actions/pause
@@ -19272,75 +19366,56 @@ function deleteExpression(expression) {
 }
 
 /**
  *
  * @memberof actions/pause
  * @param {number} selectedFrameId
  * @static
  */
-function evaluateExpressions(frameId) {
+function evaluateExpressions() {
   return (() => {
     var _ref5 = _asyncToGenerator(function* (_ref6) {
       var dispatch = _ref6.dispatch,
           getState = _ref6.getState,
           client = _ref6.client;
 
       var expressions = (0, _selectors.getExpressions)(getState()).toJS();
-      if (!frameId) {
-        var selectedFrame = (0, _selectors.getSelectedFrame)(getState());
-        frameId = selectedFrame ? selectedFrame.id : null;
-      }
       for (var expression of expressions) {
-        yield dispatch(evaluateExpression(expression, frameId));
+        yield dispatch(evaluateExpression(expression));
       }
     });
 
     return function (_x2) {
       return _ref5.apply(this, arguments);
     };
   })();
 }
 
-function evaluateExpression(expression, frameId) {
+function evaluateExpression(expression) {
   return function (_ref7) {
     var dispatch = _ref7.dispatch,
         getState = _ref7.getState,
         client = _ref7.client;
 
     if (!expression.input) {
       console.warn("Expressions should not be empty");
       return;
     }
 
-	const input = wrapExpression(expression.input);
+    var frameId = (0, _selectors.getSelectedFrameId)(getState());
+    var input = (0, _expressions.wrapExpression)(expression.input);
     return dispatch({
       type: "EVALUATE_EXPRESSION",
       input: expression.input,
       [_promise.PROMISE]: client.evaluate(input, { frameId })
     });
   };
 }
 
-function sanitizeInput(input) {
-  return input.replace(/\\/g, "\\\\").replace(/"/g, "\\$&");
-}
-
-function wrapExpression(input) {
-  return `eval(\`
-    try {
-      ${sanitizeInput(input)}
-    } catch (e) {
-      e.name + ": " + e.message
-    }
-  \`)`.trim();
-}
-
-
-
 /***/ }),
 /* 253 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
@@ -19522,17 +19597,17 @@ function formatListeners(state, listener
       line: l.function.location.line
     };
   });
 }
 
 function updateEventBreakpoints(eventNames) {
   return dispatch => {
     setNamedTimeout("event-breakpoints-update", 0, () => {
-      gThreadClient.pauseOnDOMEvents(eventNames, function () {
+      gThreadClient.pauseOnDOMEvents(eventNames, () => {
         // Notify that event breakpoints were added/removed on the server.
         window.emit(EVENTS.EVENT_BREAKPOINTS_UPDATED);
 
         dispatch({
           type: "UPDATE_EVENT_BREAKPOINTS",
           eventNames: eventNames
         });
       });
@@ -19610,26 +19685,26 @@ var checkPendingBreakpoints = (() => {
  * @memberof actions/sources
  * @static
  */
 
 
 exports.newSource = newSource;
 exports.newSources = newSources;
 exports.selectSourceURL = selectSourceURL;
-exports.openLink = openLink;
 exports.selectSource = selectSource;
 exports.jumpToMappedLocation = jumpToMappedLocation;
 exports.addTab = addTab;
 exports.moveTab = moveTab;
 exports.closeTab = closeTab;
 exports.closeTabs = closeTabs;
 exports.togglePrettyPrint = togglePrettyPrint;
 exports.toggleBlackBox = toggleBlackBox;
 exports.loadAllSources = loadAllSources;
+exports.ensureParserHasSourceText = ensureParserHasSourceText;
 
 var _promise = __webpack_require__(193);
 
 var _assert = __webpack_require__(223);
 
 var _assert2 = _interopRequireDefault(_assert);
 
 var _breakpoints = __webpack_require__(245);
@@ -19647,18 +19722,24 @@ var _createPrettySource = __webpack_requ
 var _loadSourceText = __webpack_require__(1143);
 
 var _prefs = __webpack_require__(226);
 
 var _editor = __webpack_require__(257);
 
 var _sourceMaps = __webpack_require__(797);
 
+var _parser = __webpack_require__(827);
+
+var parser = _interopRequireWildcard(_parser);
+
 var _selectors = __webpack_require__(242);
 
+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; } }
+
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 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/. */
 
@@ -19753,22 +19834,16 @@ function loadSourceMap(generatedSource) 
     });
 
     return function (_x13) {
       return _ref8.apply(this, arguments);
     };
   })();
 }
 
-function openLink(url) {
-  return async function({ openLink }) {
-    openLink(url);
-  };
-}
-
 /**
  * Deterministically select a source that has a given URL. This will
  * work regardless of the connection status or if the source exists
  * yet. This exists mostly for external things to interact with the
  * debugger.
  *
  * @memberof actions/sources
  * @static
@@ -19954,17 +20029,17 @@ function togglePrettyPrint(sourceId) {
     var _ref18 = _asyncToGenerator(function* (_ref19) {
       var dispatch = _ref19.dispatch,
           getState = _ref19.getState,
           client = _ref19.client,
           sourceMaps = _ref19.sourceMaps;
 
       var source = (0, _selectors.getSource)(getState(), sourceId).toJS();
 
-      if (source && !(0, _source2.isLoaded)(source)) {
+      if (!source || !(0, _source2.isLoaded)(source)) {
         return {};
       }
 
       (0, _assert2.default)(sourceMaps.isGeneratedId(sourceId), "Pretty-printing only allowed on generated sources");
 
       var selectedLocation = (0, _selectors.getSelectedLocation)(getState());
       var selectedOriginalLocation = selectedLocation ? yield sourceMaps.getOriginalLocation(selectedLocation) : {};
 
@@ -20014,17 +20089,17 @@ function toggleBlackBox(source) {
 
     return function (_x19) {
       return _ref21.apply(this, arguments);
     };
   })();
 }
 
 /**
-  Load the text for all the avaliable sources
+  Load the text for all the available sources
  * @memberof actions/sources
  * @static
  */
 function loadAllSources() {
   return (() => {
     var _ref23 = _asyncToGenerator(function* (_ref24) {
       var dispatch = _ref24.dispatch,
           getState = _ref24.getState;
@@ -20051,16 +20126,40 @@ function loadAllSources() {
     });
 
     return function (_x20) {
       return _ref23.apply(this, arguments);
     };
   })();
 }
 
+/**
+ * Ensures parser has source text
+ *
+ * @memberof actions/sources
+ * @static
+ */
+function ensureParserHasSourceText(sourceId) {
+  return (() => {
+    var _ref27 = _asyncToGenerator(function* (_ref28) {
+      var dispatch = _ref28.dispatch,
+          getState = _ref28.getState;
+
+      if (!(yield parser.hasSource(sourceId))) {
+        yield dispatch((0, _loadSourceText.loadSourceText)((0, _selectors.getSource)(getState(), sourceId).toJS()));
+        yield parser.setSource((0, _selectors.getSource)(getState(), sourceId).toJS());
+      }
+    });
+
+    return function (_x21) {
+      return _ref27.apply(this, arguments);
+    };
+  })();
+}
+
 /***/ }),
 /* 255 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
@@ -20275,29 +20374,45 @@ function markText(editor, className, loc
   return editor.codeMirror.markText({ ch: start.column, line: start.line }, { ch: end.column, line: end.line }, { className });
 }
 
 function lineAtHeight(editor, sourceId, event) {
   var editorLine = editor.codeMirror.lineAtHeight(event.clientY);
   return toSourceLine(sourceId, editorLine);
 }
 
+function getSourceLocationFromMouseEvent(editor, selectedLocation, e) {
+  var _editor$codeMirror$co = editor.codeMirror.coordsChar({
+    left: e.clientX,
+    top: e.clientY
+  }),
+      line = _editor$codeMirror$co.line,
+      ch = _editor$codeMirror$co.ch;
+
+  return {
+    sourceId: selectedLocation.sourceId,
+    line: line + 1,
+    column: ch + 1
+  };
+}
+
 module.exports = Object.assign({}, expressionUtils, sourceDocumentUtils, sourceSearchUtils, _devtoolsSourceEditor.SourceEditorUtils, {
   createEditor,
   isWasm: _wasm.isWasm,
   toEditorLine,
   toEditorPosition,
   toEditorRange,
   toSourceLine,
   toSourceLocation,
   shouldShowPrettyPrint,
   shouldShowFooter,
   traverseResults,
   markText,
-  lineAtHeight
+  lineAtHeight,
+  getSourceLocationFromMouseEvent
 });
 
 /***/ }),
 /* 258 */
 /***/ (function(module, exports) {
 
 module.exports = "<svg version=\"1.0\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 200.000000 200.000000\" preserveAspectRatio=\"xMidYMid meet\"><g transform=\"translate(0.000000,200.000000) scale(0.100000,-0.100000)\" fill=\"#000000\" stroke=\"none\"><path d=\"M247 1663 c-4 -3 -7 -235 -7 -515 l0 -508 175 0 175 0 0 515 0 515 -168 0 c-93 0 -172 -3 -175 -7z m183 -508 c0 -336 -2 -385 -15 -385 -13 0 -15 49 -15 385 0 336 2 385 15 385 13 0 15 -49 15 -385z\"></path><path d=\"M697 1664 c-4 -4 -7 -236 -7 -516 l0 -508 165 0 165 0 2 181 3 181 99 -146 c54 -80 102 -146 106 -146 3 0 51 66 106 148 l99 147 3 -182 2 -183 160 0 160 0 0 515 0 515 -132 0 -133 -1 -130 -194 c-71 -107 -132 -194 -135 -194 -3 -1 -64 86 -135 192 l-131 192 -130 3 c-71 1 -133 -1 -137 -4z m356 -374 c92 -138 172 -250 176 -250 4 0 84 112 177 250 112 166 175 250 187 250 16 0 17 -25 17 -385 0 -336 -2 -385 -15 -385 -13 0 -15 46 -15 350 0 193 -4 350 -8 350 -4 0 -82 -108 -172 -240 -90 -132 -167 -240 -171 -240 -4 0 -81 108 -171 240 -90 131 -166 239 -170 240 -5 0 -8 -157 -8 -350 0 -304 -2 -350 -15 -350 -13 0 -15 49 -15 385 0 360 1 385 18 385 11 -1 74 -86 185 -250z\"></path></g></svg>"
 
@@ -20944,18 +21059,16 @@ class ToggleSearch extends _react.Compon
 }
 
 exports.default = ToggleSearch;
 ToggleSearch.propTypes = {
   kind: _react.PropTypes.string.isRequired,
   toggle: _react.PropTypes.func.isRequired
 };
 
-ToggleSearch.displayName = "ToggleSearch";
-
 /***/ }),
 /* 285 */,
 /* 286 */,
 /* 287 */,
 /* 288 */,
 /* 289 */,
 /* 290 */,
 /* 291 */,
@@ -21308,19 +21421,17 @@ class DebugLine extends _react.Component
 
     doc.removeLineClass(editorLine, "line", "new-debug-line");
   }
 
   render() {
     return null;
   }
 }
-
 exports.default = DebugLine;
-DebugLine.displayName = "DebugLine";
 
 /***/ }),
 /* 314 */,
 /* 315 */,
 /* 316 */,
 /* 317 */,
 /* 318 */,
 /* 319 */
@@ -21382,23 +21493,27 @@ function _asyncToGenerator(fn) { return 
  * @static
  */
 function resumed() {
   return (_ref) => {
     var dispatch = _ref.dispatch,
         client = _ref.client,
         getState = _ref.getState;
 
+    if (!(0, _selectors.isPaused)(getState())) {
+      return;
+    }
+
     dispatch({
       type: "RESUME",
       value: undefined
     });
 
     if (!(0, _selectors.isStepping)(getState())) {
-      dispatch((0, _expressions.evaluateExpressions)(null));
+      dispatch((0, _expressions.evaluateExpressions)());
     }
   };
 }
 
 function continueToHere(line) {
   return (() => {
     var _ref2 = _asyncToGenerator(function* (_ref3) {
       var dispatch = _ref3.dispatch,
@@ -21408,16 +21523,17 @@ function continueToHere(line) {
 
       var source = (0, _selectors.getSelectedSource)(getState()).toJS();
 
       yield dispatch((0, _breakpoints.addHiddenBreakpoint)({
         line,
         column: undefined,
         sourceId: source.id
       }));
+
       dispatch(command("resume"));
     });
 
     return function (_x) {
       return _ref2.apply(this, arguments);
     };
   })();
 }
@@ -21455,17 +21571,21 @@ function paused(pauseInfo) {
         loadedObjects: loadedObjects || []
       });
 
       var hiddenBreakpointLocation = (0, _breakpoints2.getHiddenBreakpointLocation)(getState());
       if (hiddenBreakpointLocation) {
         dispatch((0, _breakpoints.removeBreakpoint)(hiddenBreakpointLocation));
       }
 
-      dispatch((0, _expressions.evaluateExpressions)(frame.id));
+      // NOTE: We don't want to re-evaluate watch expressions
+      // if we're paused due to an excpression exception #3597
+      if (!(0, _selectors.hasWatchExpressionErrored)(getState())) {
+        dispatch((0, _expressions.evaluateExpressions)());
+      }
 
       dispatch((0, _sources.selectSource)(frame.location.sourceId, { line: frame.location.line }));
     });
 
     return function (_x2) {
       return _ref4.apply(this, arguments);
     };
   })();
@@ -21612,26 +21732,23 @@ function breakOnNext() {
  * @static
  */
 function selectFrame(frame) {
   return (() => {
     var _ref14 = _asyncToGenerator(function* (_ref15) {
       var dispatch = _ref15.dispatch,
           client = _ref15.client;
 
-      dispatch((0, _expressions.evaluateExpressions)(frame.id));
+      var scopes = yield client.getFrameScopes(frame);
+
+      dispatch({ type: "SELECT_FRAME", frame, scopes });
+
       dispatch((0, _sources.selectSource)(frame.location.sourceId, { line: frame.location.line }));
 
-      var scopes = yield client.getFrameScopes(frame);
-
-      dispatch({
-        type: "SELECT_FRAME",
-        frame,
-        scopes
-      });
+      dispatch((0, _expressions.evaluateExpressions)());
     });
 
     return function (_x4) {
       return _ref14.apply(this, arguments);
     };
   })();
 }
 
@@ -21744,16 +21861,17 @@ function willNavigate(_, event) {
           client = _ref2.client,
           sourceMaps = _ref2.sourceMaps;
 
       yield sourceMaps.clearSourceMaps();
       (0, _wasm.clearWasmStates)();
       (0, _editor.clearDocuments)();
       (0, _parser.clearSymbols)();
       (0, _parser.clearASTs)();
+      (0, _parser.clearScopes)();
       (0, _parser.clearSources)();
 
       dispatch(navigate(event.url));
     });
 
     return function (_x) {
       return _ref.apply(this, arguments);
     };
@@ -21948,17 +22066,17 @@ function clearHighlightLineRange() {
   return {
     type: "CLEAR_HIGHLIGHT_LINES"
   };
 }
 
 function toggleConditionalBreakpointPanel(line) {
   return {
     type: "TOGGLE_CONDITIONAL_BREAKPOINT_PANEL",
-    line
+    line: line
   };
 }
 
 /***/ }),
 /* 322 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -22047,47 +22165,52 @@ class Modal extends _react.Component {
     var status = this.props.status;
 
 
     return _react2.default.createElement(
       "div",
       { className: "modal-wrapper", onClick: this.props.handleClose },
       _react2.default.createElement(
         "div",
-        { className: (0, _classnames2.default)("modal", status), onClick: this.onClick },
+        {
+          className: (0, _classnames2.default)("modal", this.props.additionalClass, status),
+          onClick: this.onClick
+        },
         this.props.children
       )
     );
   }
 }
 
 exports.Modal = Modal;
-Modal.displayName = "Modal";
 Modal.contextTypes = {
   shortcuts: _react.PropTypes.object
 };
 
 function Slide(_ref) {
   var inProp = _ref.in,
       children = _ref.children,
+      additionalClass = _ref.additionalClass,
       handleClose = _ref.handleClose;
 
   return _react2.default.createElement(
     _Transition2.default,
     { "in": inProp, timeout: 175, appear: true },
     status => _react2.default.createElement(
       Modal,
-      { status: status, handleClose: handleClose },
+      {
+        status: status,
+        additionalClass: additionalClass,
+        handleClose: handleClose
+      },
       children
     )
   );
 }
 
-Slide.displayName = "Slide";
-
 /***/ }),
 /* 333 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 exports.__esModule = true;
@@ -23612,17 +23735,16 @@ class Autocomplete extends _react.Compon
     );
   }
 }
 
 exports.default = Autocomplete;
 Autocomplete.defaultProps = {
   size: ""
 };
-Autocomplete.displayName = "Autocomplete";
 
 /***/ }),
 /* 343 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
@@ -23779,17 +23901,18 @@ var svg = {
   "sad-face": __webpack_require__(373),
   refresh: __webpack_require__(374),
   webpack: __webpack_require__(1001),
   node: __webpack_require__(1002),
   express: __webpack_require__(1003),
   pug: __webpack_require__(1004),
   extjs: __webpack_require__(1043),
   showSources: __webpack_require__(1044),
-  showOutline: __webpack_require__(1045)
+  showOutline: __webpack_require__(1045),
+  shortcut: __webpack_require__(1183)
 };
 
 function Svg(_ref) {
   var name = _ref.name,
       className = _ref.className,
       onClick = _ref.onClick,
       ariaLabel = _ref["aria-label"];
 
@@ -23802,22 +23925,24 @@ function Svg(_ref) {
     console.warn(error);
     return;
   }
 
   className = `${name} ${className || ""}`;
   if (name === "subSettings") {
     className = "";
   }
+
   var props = {
     className,
     onClick,
     ["aria-label"]: ariaLabel,
     src: svg[name]
   };
+
   return React.createElement(InlineSVG, props);
 }
 
 Svg.displayName = "Svg";
 
 module.exports = Svg;
 
 /***/ }),
@@ -24187,18 +24312,16 @@ var arrowBtn = (onClick, type, className
 
   return _react2.default.createElement(
     "button",
     props,
     _react2.default.createElement(_Svg2.default, { name: type })
   );
 };
 
-arrowBtn.displayName = "ArrowButton";
-
 class SearchInput extends _react.Component {
 
   componentDidMount() {
     this.$input.focus();
   }
 
   shouldShowErrorEmoji() {
     var _props = this.props,
@@ -24332,23 +24455,16 @@ function CloseButton(_ref) {
     {
       className: buttonClass ? `close-btn ${buttonClass}` : "close-btn",
       onClick: handleClick,
       title: tooltip
     },
     _react2.default.createElement(_Svg2.default, { name: "close" })
   );
 }
-
-
-CloseButton.displayName = "CloseButton";
-CloseButton.propTypes = {
-  handleClick: _react.PropTypes.func.isRequired
-};
-
 exports.default = CloseButton;
 
 /***/ }),
 /* 379 */,
 /* 380 */,
 /* 381 */,
 /* 382 */,
 /* 383 */
@@ -24531,21 +24647,21 @@ var _react2 = _interopRequireDefault(_re
 var _devtoolsComponents = __webpack_require__(1007);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 var Tree = (0, _react.createFactory)(_devtoolsComponents.Tree);
 
 class ManagedTree extends _react.Component {
 
-  constructor() {
+  constructor(props) {
     super();
 
     this.state = {
-      expanded: new Set(),
+      expanded: props.expanded || new Set(),
       focusedItem: null
     };
 
     var self = this;
     self.setExpanded = this.setExpanded.bind(this);
     self.focusItem = this.focusItem.bind(this);
   }
 
@@ -24571,19 +24687,19 @@ class ManagedTree extends _react.Compone
     if (isExpanded) {
       expanded.add(itemPath);
     } else {
       expanded.delete(itemPath);
     }
     this.setState({ expanded });
 
     if (isExpanded && this.props.onExpand) {
-      this.props.onExpand(item);
-    } else if (!expanded && this.props.onCollapse) {
-      this.props.onCollapse(item);
+      this.props.onExpand(item, expanded);
+    } else if (!isExpanded && this.props.onCollapse) {
+      this.props.onCollapse(item, expanded);
     }
   }
 
   expandListItems(listItems) {
     var expanded = this.state.expanded;
     listItems.forEach(item => expanded.add(this.props.getPath(item)));
     this.focusItem(listItems[0]);
     this.setState({ expanded });
@@ -24645,18 +24761,16 @@ class ManagedTree extends _react.Compone
     return _react2.default.createElement(
       "div",
       { className: "managed-tree" },
       _react2.default.createElement(Tree, props)
     );
   }
 }
 
-ManagedTree.displayName = "ManagedTree";
-
 ManagedTree.propTypes = Object.assign({}, Tree.propTypes);
 
 exports.default = ManagedTree;
 
 /***/ }),
 /* 420 */,
 /* 421 */,
 /* 422 */,
@@ -24817,50 +24931,30 @@ class Editor extends _react.PureComponen
     self.onGutterClick = this.onGutterClick.bind(this);
     self.onGutterContextMenu = this.onGutterContextMenu.bind(this);
     self.onSearchAgain = this.onSearchAgain.bind(this);
     self.onToggleBreakpoint = this.onToggleBreakpoint.bind(this);
     self.toggleConditionalPanel = this.toggleConditionalPanel.bind(this);
   }
 
   componentWillReceiveProps(nextProps) {
-    // This lifecycle method is responsible for updating the editor
-    // text.
-    var selectedSource = nextProps.selectedSource;
-
-
-    if (nextProps.startPanelSize !== this.props.startPanelSize || nextProps.endPanelSize !== this.props.endPanelSize) {
-      this.state.editor.codeMirror.setSize();
-    }
-
-    if (!selectedSource) {
-      if (this.props.selectedSource) {
-        this.showMessage("");
-      }
-    } else if (!(0, _source.isLoaded)(selectedSource.toJS())) {
-      this.showMessage(L10N.getStr("loadingText"));
-    } else if (selectedSource.get("error")) {
-      this.showMessage(selectedSource.get("error"));
-    } else if (this.props.selectedSource !== selectedSource) {
-      (0, _editor.showSourceText)(this.state.editor, selectedSource.toJS());
-    }
-
-    if (this.state.editor && this.props.linesInScope !== nextProps.linesInScope) {
-      this.state.editor.codeMirror.operation(() => {
-        (0, _editor.clearLineClass)(this.state.editor.codeMirror, "in-scope");
-      });
-
-      (0, _editor.resizeBreakpointGutter)(this.state.editor.codeMirror);
-    }
+    if (!this.state.editor) {
+      return;
+    }
+
+    this.setSize(nextProps);
+    this.setText(nextProps);
+    (0, _editor.resizeBreakpointGutter)(this.state.editor.codeMirror);
   }
 
   setupEditor() {
     var editor = (0, _editor.createEditor)();
 
     // disables the default search shortcuts
+
     editor._initShortcuts = () => {};
 
     var node = _reactDom2.default.findDOMNode(this);
     if (node instanceof HTMLElement) {
       editor.appendToLocalElement(node.querySelector(".editor-mount"));
     }
 
     var codeMirror = editor.codeMirror;
@@ -24870,35 +24964,36 @@ class Editor extends _react.PureComponen
     (0, _editor.resizeBreakpointGutter)(codeMirror);
     (0, _devtoolsLaunchpad.debugGlobal)("cm", codeMirror);
 
     codeMirror.on("gutterClick", this.onGutterClick);
 
     // Set code editor wrapper to be focusable
     codeMirrorWrapper.tabIndex = 0;
     codeMirrorWrapper.addEventListener("keydown", e => this.onKeyDown(e));
+    codeMirrorWrapper.addEventListener("click", e => this.onClick(e));
 
     var toggleFoldMarkerVisibility = e => {
       if (node instanceof HTMLElement) {
         node.querySelectorAll(".CodeMirror-guttermarker-subtle").forEach(elem => {
           elem.classList.toggle("visible");
         });
       }
     };
 
     var codeMirrorGutter = codeMirror.getGutterElement();
     codeMirrorGutter.addEventListener("mouseleave", toggleFoldMarkerVisibility);
     codeMirrorGutter.addEventListener("mouseenter", toggleFoldMarkerVisibility);
 
     if (!(0, _devtoolsConfig.isFirefox)()) {
       codeMirror.on("gutterContextMenu", (cm, line, eventName, event) => this.onGutterContextMenu(event));
 
-      codeMirror.on("contextmenu", (cm, event) => this.openMenu(event, cm));
-    } else {
-      codeMirrorWrapper.addEventListener("contextmenu", event => this.openMenu(event, codeMirror));
+      codeMirror.on("contextmenu", (cm, event) => this.openMenu(event, editor));
+    } else {
+      codeMirrorWrapper.addEventListener("contextmenu", event => this.openMenu(event, editor));
     }
 
     this.setState({ editor });
     return editor;
   }
 
   componentDidMount() {
     this.cbPanel = null;
@@ -24908,18 +25003,18 @@ class Editor extends _react.PureComponen
         selectedSource = _props.selectedSource,
         selectedLocation = _props.selectedLocation;
     var shortcuts = this.context.shortcuts;
 
 
     var searchAgainKey = L10N.getStr("sourceSearch.search.again.key2");
     var searchAgainPrevKey = L10N.getStr("sourceSearch.search.againPrev.key2");
 
-    shortcuts.on("CmdOrCtrl+B", this.onToggleBreakpoint);
-    shortcuts.on("CmdOrCtrl+Shift+B", this.onToggleBreakpoint);
+    shortcuts.on(L10N.getStr("toggleBreakpoint.key"), this.onToggleBreakpoint);
+    shortcuts.on(L10N.getStr("toggleCondPanel.key"), this.onToggleBreakpoint);
     shortcuts.on("Esc", this.onEscape);
     shortcuts.on(searchAgainPrevKey, this.onSearchAgain);
     shortcuts.on(searchAgainKey, this.onSearchAgain);
 
     if (selectedLocation && !!selectedLocation.line) {
       this.pendingJumpLocation = selectedLocation;
     }
 
@@ -24929,18 +25024,18 @@ class Editor extends _react.PureComponen
 
   componentWillUnmount() {
     this.state.editor.destroy();
     this.setState({ editor: null });
 
     var searchAgainKey = L10N.getStr("sourceSearch.search.again.key2");
     var searchAgainPrevKey = L10N.getStr("sourceSearch.search.againPrev.key2");
     var shortcuts = this.context.shortcuts;
-    shortcuts.off("CmdOrCtrl+B");
-    shortcuts.off("CmdOrCtrl+Shift+B");
+    shortcuts.off(L10N.getStr("toggleBreakpoint.key"));
+    shortcuts.off(L10N.getStr("toggleCondPanel.key"));
     shortcuts.off(searchAgainPrevKey);
     shortcuts.off(searchAgainKey);
   }
 
   componentDidUpdate(prevProps) {
     // 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.
@@ -25046,29 +25141,29 @@ class Editor extends _react.PureComponen
   inSelectedFrameSource() {
     var _props4 = this.props,
         selectedLocation = _props4.selectedLocation,
         selectedFrame = _props4.selectedFrame;
 
     return selectedFrame && selectedLocation && selectedFrame.location.sourceId == selectedLocation.sourceId;
   }
 
-  openMenu(event, codeMirror) {
+  openMenu(event, editor) {
     var _props5 = this.props,
         selectedSource = _props5.selectedSource,
         selectedLocation = _props5.selectedLocation,
         showSource = _props5.showSource,
         jumpToMappedLocation = _props5.jumpToMappedLocation,
         addExpression = _props5.addExpression,
         toggleBlackBox = _props5.toggleBlackBox,
         getFunctionText = _props5.getFunctionText;
 
 
     return (0, _EditorMenu2.default)({
-      codeMirror,
+      editor,
       event,
       selectedLocation,
       selectedSource,
       showSource,
       jumpToMappedLocation,
       addExpression,
       toggleBlackBox,
       getFunctionText,
@@ -25076,17 +25171,18 @@ class Editor extends _react.PureComponen
     });
   }
 
   onGutterClick(cm, line, gutter, ev) {
     var _props6 = this.props,
         selectedSource = _props6.selectedSource,
         toggleBreakpoint = _props6.toggleBreakpoint,
         addOrToggleDisabledBreakpoint = _props6.addOrToggleDisabledBreakpoint,
-        isEmptyLine = _props6.isEmptyLine;
+        isEmptyLine = _props6.isEmptyLine,
+        continueToHere = _props6.continueToHere;
 
     // ignore right clicks in the gutter
 
     if (ev.ctrlKey && ev.button === 0 || ev.which === 3 || selectedSource && selectedSource.get("isBlackBoxed")) {
       return;
     }
 
     if (isEmptyLine(line)) {
@@ -25097,17 +25193,19 @@ class Editor extends _react.PureComponen
       return this.closeConditionalPanel();
     }
 
     if (!selectedSource) {
       return;
     }
 
     if (gutter !== "CodeMirror-foldgutter") {
-      if (ev.shiftKey) {
+      if (ev.altKey) {
+        continueToHere((0, _editor.toSourceLine)(selectedSource.get("id"), line));
+      } else if (ev.shiftKey) {
         addOrToggleDisabledBreakpoint((0, _editor.toSourceLine)(selectedSource.get("id"), line));
       } else {
         toggleBreakpoint((0, _editor.toSourceLine)(selectedSource.get("id"), line));
       }
     }
   }
 
   onGutterContextMenu(event) {
@@ -25144,25 +25242,37 @@ class Editor extends _react.PureComponen
       continueToHere,
 
       showConditionalPanel: this.toggleConditionalPanel,
       isCbPanelOpen: this.isCbPanelOpen(),
       closeConditionalPanel: this.closeConditionalPanel
     });
   }
 
+  onClick(e) {
+    var _props8 = this.props,
+        selectedLocation = _props8.selectedLocation,
+        jumpToMappedLocation = _props8.jumpToMappedLocation;
+
+
+    if (e.metaKey && e.altKey) {
+      var sourceLocation = (0, _editor.getSourceLocationFromMouseEvent)(this.state.editor, selectedLocation, e);
+      jumpToMappedLocation(sourceLocation);
+    }
+  }
+
   toggleConditionalPanel(line) {
     if (this.isCbPanelOpen()) {
       return this.closeConditionalPanel();
     }
 
-    var _props8 = this.props,
-        selectedLocation = _props8.selectedLocation,
-        setBreakpointCondition = _props8.setBreakpointCondition,
-        breakpoints = _props8.breakpoints;
+    var _props9 = this.props,
+        selectedLocation = _props9.selectedLocation,
+        setBreakpointCondition = _props9.setBreakpointCondition,
+        breakpoints = _props9.breakpoints;
 
     var sourceId = selectedLocation ? selectedLocation.sourceId : "";
 
     var breakpoint = breakpoints.find(bp => bp.location.line === line);
     var location = { sourceId, line };
     var condition = breakpoint ? breakpoint.condition : "";
 
     var panel = (0, _ConditionalPanel.renderConditionalPanel)({
@@ -25218,28 +25328,68 @@ class Editor extends _react.PureComponen
     if (this.lastJumpLine && (!this.props.selectedFrame || this.props.selectedFrame.location.line !== line)) {
       this.state.editor.codeMirror.addLineClass(line, "line", "highlight-line");
     }
 
     this.lastJumpLine = line;
     this.pendingJumpLocation = null;
   }
 
+  setSize(nextProps) {
+    if (!this.state.editor) {
+      return;
+    }
+
+    if (nextProps.startPanelSize !== this.props.startPanelSize || nextProps.endPanelSize !== this.props.endPanelSize) {
+      this.state.editor.codeMirror.setSize();
+    }
+  }
+
+  setText(nextProps) {
+    if (!this.state.editor) {
+      return;
+    }
+
+    if (!nextProps.selectedSource) {
+      if (this.props.selectedSource) {
+        return this.showMessage("");
+      }
+
+      return;
+    }
+
+    if (!(0, _source.isLoaded)(nextProps.selectedSource.toJS())) {
+      return this.showMessage(L10N.getStr("loadingText"));
+    }
+
+    if (nextProps.selectedSource.get("error")) {
+      return this.showMessage(nextProps.selectedSource.get("error"));
+    }
+
+    if (nextProps.selectedSource !== this.props.selectedSource) {
+      return (0, _editor.showSourceText)(this.state.editor, nextProps.selectedSource.toJS());
+    }
+  }
+
   showMessage(msg) {
+    if (!this.state.editor) {
+      return;
+    }
+
     this.state.editor.replaceDocument(this.state.editor.createDocument());
     this.state.editor.setText(msg);
     this.state.editor.setMode({ name: "text" });
     (0, _editor.resetLineNumberFormat)(this.state.editor);
   }
 
   getInlineEditorStyles() {
-    var _props9 = this.props,
-        selectedSource = _props9.selectedSource,
-        horizontal = _props9.horizontal,
-        searchOn = _props9.searchOn;
+    var _props10 = this.props,
+        selectedSource = _props10.selectedSource,
+        horizontal = _props10.horizontal,
+        searchOn = _props10.searchOn;
 
 
     var subtractions = [];
 
     if ((0, _editor.shouldShowFooter)(selectedSource, horizontal)) {
       subtractions.push(cssVars.footerHeight);
     }
 
@@ -25263,19 +25413,19 @@ class Editor extends _react.PureComponen
 
     return _react2.default.createElement(_HighlightLines2.default, {
       editor: this.state.editor,
       highlightedLineRange: highlightedLineRange
     });
   }
 
   renderHitCounts() {
-    var _props10 = this.props,
-        hitCount = _props10.hitCount,
-        selectedSource = _props10.selectedSource;
+    var _props11 = this.props,
+        hitCount = _props11.hitCount,
+        selectedSource = _props11.selectedSource;
 
 
     if (!selectedSource || !(0, _source.isLoaded)(selectedSource.toJS()) || !hitCount || !this.state.editor) {
       return;
     }
 
     return hitCount.filter(marker => marker.get("count") > 0).map(marker => _react2.default.createElement(_HitMarker2.default, {
       key: marker.get("line"),
@@ -25289,45 +25439,31 @@ class Editor extends _react.PureComponen
 
     if (!this.state.editor || !selectedSource) {
       return null;
     }
 
     return _react2.default.createElement(_Preview2.default, { editor: this.state.editor });
   }
 
-  renderInScopeLines() {
-    var linesInScope = this.props.linesInScope;
-
-    if (!this.state.editor || !(0, _devtoolsConfig.isEnabled)("highlightScopeLines") || !linesInScope || !this.inSelectedFrameSource()) {
-      return;
-    }
-
-    this.state.editor.codeMirror.operation(() => {
-      linesInScope.forEach(line => {
-        this.state.editor.codeMirror.addLineClass(line - 1, "line", "in-scope");
-      });
-    });
-  }
-
   renderCallSites() {
     var editor = this.state.editor;
 
     if (!editor || !(0, _devtoolsConfig.isEnabled)("columnBreakpoints")) {
       return null;
     }
     return _react2.default.createElement(_CallSites2.default, { editor: editor });
   }
 
   renderSearchBar() {
-    var _props11 = this.props,
-        selectSource = _props11.selectSource,
-        selectedSource = _props11.selectedSource,
-        highlightLineRange = _props11.highlightLineRange,
-        clearHighlightLineRange = _props11.clearHighlightLineRange;
+    var _props12 = this.props,
+        selectSource = _props12.selectSource,
+        selectedSource = _props12.selectedSource,
+        highlightLineRange = _props12.highlightLineRange,
+        clearHighlightLineRange = _props12.clearHighlightLineRange;
 
 
     if (!this.state.editor) {
       return null;
     }
 
     return _react2.default.createElement(_SearchBar2.default, {
       editor: this.state.editor,
@@ -25361,65 +25497,62 @@ class Editor extends _react.PureComponen
       return null;
     }
 
     return _react2.default.createElement(_EmptyLines2.default, { editor: this.state.editor });
   }
 
   renderDebugLine() {
     var editor = this.state.editor;
-    var _props12 = this.props,
-        selectedLocation = _props12.selectedLocation,
-        selectedFrame = _props12.selectedFrame;
+    var _props13 = this.props,
+        selectedLocation = _props13.selectedLocation,
+        selectedFrame = _props13.selectedFrame;
 
     if (!editor || !selectedLocation || !selectedFrame || !selectedLocation.line || selectedFrame.location.sourceId !== selectedLocation.sourceId) {
       return null;
     }
 
     return _react2.default.createElement(_DebugLine2.default, {
       editor: editor,
       selectedFrame: selectedFrame,
       selectedLocation: selectedLocation
     });
   }
 
   render() {
-    var _props13 = this.props,
-        coverageOn = _props13.coverageOn,
-        pauseData = _props13.pauseData;
+    var _props14 = this.props,
+        coverageOn = _props14.coverageOn,
+        pauseData = _props14.pauseData;
 
 
     return _react2.default.createElement(
       "div",
       {
         className: (0, _classnames2.default)("editor-wrapper", {
           "coverage-on": coverageOn,
           paused: !!pauseData && (0, _devtoolsConfig.isEnabled)("highlightScopeLines")
         })
       },
       this.renderSearchBar(),
       _react2.default.createElement("div", {
         className: "editor-mount devtools-monospace",
         style: this.getInlineEditorStyles()
       }),
       this.renderHighlightLines(),
-      this.renderInScopeLines(),
       this.renderHitCounts(),
       this.renderFooter(),
       this.renderPreview(),
       this.renderCallSites(),
       this.renderDebugLine(),
       this.renderBreakpoints(),
       this.renderEmptyLines()
     );
   }
 }
 
-Editor.displayName = "Editor";
-
 Editor.propTypes = {
   breakpoints: _reactImmutableProptypes2.default.map,
   hitCount: _react.PropTypes.object,
   selectedLocation: _react.PropTypes.object,
   selectedSource: _reactImmutableProptypes2.default.map,
   highlightLineRange: _react.PropTypes.func,
   clearHighlightLineRange: _react.PropTypes.func,
   highlightedLineRange: _react.PropTypes.object,
@@ -25567,22 +25700,22 @@ class SourceFooter extends _react.PureCo
 
   blackBoxButton() {
     var _props2 = this.props,
         selectedSource = _props2.selectedSource,
         toggleBlackBox = _props2.toggleBlackBox;
 
     var sourceLoaded = selectedSource && (0, _source.isLoaded)(selectedSource.toJS());
 
+    if (!(0, _devtoolsConfig.isEnabled)("blackbox") || !sourceLoaded) {
+      return;
+    }
+
     var blackboxed = selectedSource.get("isBlackBoxed");
 
-    if (!(0, _devtoolsConfig.isEnabled)("blackbox")) {
-      return;
-    }
-
     var tooltip = L10N.getStr("sourceFooter.blackbox");
     var type = "black-box";
 
     return _react2.default.createElement(
       "button",
       {
         onClick: () => toggleBlackBox(selectedSource.toJS()),
         className: (0, _classnames2.default)("action", type, {
@@ -25595,19 +25728,18 @@ class SourceFooter extends _react.PureCo
       },
       _react2.default.createElement(_Svg2.default, { name: "blackBox" })
     );
   }
 
   blackBoxSummary() {
     var selectedSource = this.props.selectedSource;
 
-    var blackboxed = selectedSource.get("isBlackBoxed");
-
-    if (!blackboxed) {
+
+    if (!selectedSource || !selectedSource.get("isBlackBoxed")) {
       return;
     }
 
     return _react2.default.createElement(
       "span",
       { className: "blackbox-summary" },
       L10N.getStr("sourceFooter.blackboxed")
     );
@@ -25642,22 +25774,16 @@ class SourceFooter extends _react.PureCo
       position: "end",
       collapsed: !this.props.endPanelCollapsed,
       horizontal: this.props.horizontal,
       handleClick: this.props.togglePaneCollapse
     });
   }
 
   renderCommands() {
-    var selectedSource = this.props.selectedSource;
-
-    if (!(0, _editor.shouldShowPrettyPrint)(selectedSource)) {
-      return null;
-    }
-
     return _react2.default.createElement(
       "div",
       { className: "commands" },
       this.prettyPrintButton(),
       this.blackBoxButton(),
       this.blackBoxSummary(),
       this.coverageButton()
     );
@@ -25677,18 +25803,16 @@ class SourceFooter extends _react.PureCo
       "div",
       { className: "source-footer" },
       this.renderCommands(),
       this.renderToggleButton()
     );
   }
 }
 
-SourceFooter.displayName = "SourceFooter";
-
 exports.default = (0, _reactRedux.connect)(state => {
   var selectedSource = (0, _selectors.getSelectedSource)(state);
   var selectedId = selectedSource && selectedSource.get("id");
   return {
     selectedSource,
     prettySource: (0, _selectors.getPrettySource)(state, selectedId),
     endPanelCollapsed: (0, _selectors.getPaneCollapse)(state, "end")
   };
@@ -25737,32 +25861,30 @@ class PaneToggleButton extends _react.Co
         position = _props2.position,
         collapsed = _props2.collapsed,
         horizontal = _props2.horizontal,
         handleClick = _props2.handleClick;
 
     var title = !collapsed ? L10N.getStr("expandPanes") : L10N.getStr("collapsePanes");
 
     return _react2.default.createElement(
-      "div",
+      "button",
       {
         className: (0, _classnames2.default)(`toggle-button-${position}`, {
           collapsed,
           vertical: horizontal != null ? !horizontal : false
         }),
         onClick: () => handleClick(position, collapsed),
         title: title
       },
       _react2.default.createElement(_Svg2.default, { name: "togglePanes" })
     );
   }
 }
 
-PaneToggleButton.displayName = "PaneToggleButton";
-
 exports.default = PaneToggleButton;
 
 /***/ }),
 /* 429 */,
 /* 430 */,
 /* 431 */,
 /* 432 */,
 /* 433 */
@@ -26208,17 +26330,16 @@ class SearchBar extends _react.Component
         { className: "search-bottom-bar" },
         this.renderSearchType(),
         this.renderSearchModifiers()
       )
     );
   }
 }
 
-SearchBar.displayName = "SearchBar";
 SearchBar.contextTypes = {
   shortcuts: _react.PropTypes.object
 };
 
 exports.default = (0, _reactRedux.connect)(state => {
   return {
     searchOn: (0, _selectors.getActiveSearch)(state) === "file",
     query: (0, _selectors.getFileSearchQueryState)(state),
@@ -26805,20 +26926,22 @@ var EditorMenu = (() => {
 })();
 
 var _devtoolsLaunchpad = __webpack_require__(131);
 
 var _devtoolsSourceMap = __webpack_require__(898);
 
 var _clipboard = __webpack_require__(423);
 
+var _editor = __webpack_require__(257);
+
 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"); }); }; }
 
 function getMenuItems(event, _ref) {
-  var codeMirror = _ref.codeMirror,
+  var editor = _ref.editor,
       selectedLocation = _ref.selectedLocation,
       selectedSource = _ref.selectedSource,
       showSource = _ref.showSource,
       onGutterContextMenu = _ref.onGutterContextMenu,
       jumpToMappedLocation = _ref.jumpToMappedLocation,
       toggleBlackBox = _ref.toggleBlackBox,
       addExpression = _ref.addExpression,
       getFunctionText = _ref.getFunctionText;
@@ -26839,63 +26962,57 @@ function getMenuItems(event, _ref) {
   var copySourceUrl = {
     id: "node-menu-copy-source-url",
     label: copySourceUrlLabel,
     accesskey: copySourceUrlKey,
     disabled: false,
     click: () => (0, _clipboard.copyToTheClipboard)(selectedSource.get("url"))
   };
 
-  var selectionText = codeMirror.getSelection().trim();
+  var selectionText = editor.codeMirror.getSelection().trim();
   var copySource = {
     id: "node-menu-copy-source",
     label: copySourceLabel,
     accesskey: copySourceKey,
     disabled: selectionText.length === 0,
     click: () => (0, _clipboard.copyToTheClipboard)(selectionText)
   };
 
-  var _codeMirror$coordsCha = codeMirror.coordsChar({
-    left: event.clientX,
-    top: event.clientY
+  var _editor$codeMirror$co = editor.codeMirror.coordsChar({
+    left: event.clientX
   }),
-      line = _codeMirror$coordsCha.line,
-      ch = _codeMirror$coordsCha.ch;
-
-  var sourceLocation = {
-    sourceId: selectedLocation.sourceId,
-    line: line + 1,
-    column: ch + 1
-  };
+      line = _editor$codeMirror$co.line;
+
+  var sourceLocation = (0, _editor.getSourceLocationFromMouseEvent)(editor, selectedLocation, event);
 
   var pairedType = (0, _devtoolsSourceMap.isOriginalId)(selectedLocation.sourceId) ? L10N.getStr("generated") : L10N.getStr("original");
 
   var jumpLabel = {
     accesskey: "C",
     disabled: false,
     label: L10N.getFormatStr("editor.jumpToMappedLocation1", pairedType),
     click: () => jumpToMappedLocation(sourceLocation)
   };
 
   var watchExpressionLabel = {
     accesskey: "E",
     label: L10N.getStr("expressions.placeholder"),
-    click: () => addExpression(codeMirror.getSelection())
+    click: () => addExpression(editor.codeMirror.getSelection())
   };
 
   var blackBoxMenuItem = {
     id: "node-menu-blackbox",
     label: toggleBlackBoxLabel,
     accesskey: blackboxKey,
     disabled: false,
     click: () => toggleBlackBox(selectedSource.toJS())
   };
 
   // TODO: Find a new way to only add this for mapped sources?
-  var textSelected = codeMirror.somethingSelected();
+  var textSelected = editor.codeMirror.somethingSelected();
 
   var showSourceMenuItem = {
     id: "node-menu-show-source",
     label: revealInTreeLabel,
     accesskey: revealInTreeKey,
     disabled: false,
     click: () => showSource(selectedSource.get("id"))
   };
@@ -26904,17 +27021,17 @@ function getMenuItems(event, _ref) {
   var copyFunction = {
     id: "node-menu-copy-function",
     label: copyFunctionLabel,
     accesskey: copyFunctionKey,
     disabled: !functionText,
     click: () => (0, _clipboard.copyToTheClipboard)(functionText)
   };
 
-  var menuItems = [copySourceUrl, jumpLabel, showSourceMenuItem, blackBoxMenuItem, copySource, copyFunction];
+  var menuItems = [copySource, copySourceUrl, copyFunction, { type: "separator" }, jumpLabel, showSourceMenuItem, blackBoxMenuItem];
 
   if (textSelected) {
     menuItems.push(watchExpressionLabel);
   }
 
   return menuItems;
 }
 
@@ -27171,18 +27288,16 @@ Popover.propTypes = {
   type: _react.PropTypes.string
 };
 
 Popover.defaultProps = {
   onMouseLeave: () => {},
   type: "popover"
 };
 
-Popover.displayName = "Popover";
-
 exports.default = Popover;
 
 /***/ }),
 /* 699 */,
 /* 700 */,
 /* 701 */,
 /* 702 */,
 /* 703 */,
@@ -27413,18 +27528,16 @@ class Breakpoint extends _react.Componen
     doc.removeLineClass(line, "line", "has-condition");
   }
 
   render() {
     return null;
   }
 }
 
-Breakpoint.displayName = "Breakpoint";
-
 exports.default = Breakpoint;
 
 /***/ }),
 /* 715 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
@@ -27475,18 +27588,16 @@ class HitMarker extends _react.Component
     this.props.editor.removeLineClass(line, "line", "hit-marker");
   }
 
   render() {
     return null;
   }
 }
 
-HitMarker.displayName = "HitMarker";
-
 exports.default = HitMarker;
 
 /***/ }),
 /* 716 */,
 /* 717 */,
 /* 718 */
 /***/ (function(module, exports, __webpack_require__) {
 
@@ -27500,34 +27611,34 @@ Object.defineProperty(exports, "__esModu
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _reactRedux = __webpack_require__(151);
 
 var _redux = __webpack_require__(3);
 
+var _prefs = __webpack_require__(226);
+
 var _reactImmutableProptypes = __webpack_require__(150);
 
 var _reactImmutableProptypes2 = _interopRequireDefault(_reactImmutableProptypes);
 
 var _actions = __webpack_require__(244);
 
 var _actions2 = _interopRequireDefault(_actions);
 
 var _selectors = __webpack_require__(242);
 
 var _devtoolsConfig = __webpack_require__(828);
 
 var _Svg = __webpack_require__(344);
 
 var _Svg2 = _interopRequireDefault(_Svg);
 
-var _prefs = __webpack_require__(226);
-
 var _Breakpoints = __webpack_require__(725);
 
 var _Breakpoints2 = _interopRequireDefault(_Breakpoints);
 
 var _Expressions = __webpack_require__(719);
 
 var _Expressions2 = _interopRequireDefault(_Expressions);
 
@@ -27550,16 +27661,20 @@ var _Workers2 = _interopRequireDefault(_
 var _Accordion = __webpack_require__(739);
 
 var _Accordion2 = _interopRequireDefault(_Accordion);
 
 var _CommandBar = __webpack_require__(742);
 
 var _CommandBar2 = _interopRequireDefault(_CommandBar);
 
+var _UtilsBar = __webpack_require__(1185);
+
+var _UtilsBar2 = _interopRequireDefault(_UtilsBar);
+
 var _ChromeScopes = __webpack_require__(728);
 
 var _ChromeScopes2 = _interopRequireDefault(_ChromeScopes);
 
 var _Scopes2 = __webpack_require__(731);
 
 var _Scopes3 = _interopRequireDefault(_Scopes2);
 
@@ -27578,17 +27693,16 @@ function debugBtn(onClick, type, classNa
       onClick: onClick,
       className: `${type} ${className}`,
       key: type,
       title: tooltip
     },
     _react2.default.createElement(_Svg2.default, { name: type, title: tooltip, "aria-label": tooltip })
   );
 }
-debugBtn.displayName = "DebugButton";
 
 class SecondaryPanes extends _react.Component {
   renderBreakpointsToggle() {
     var _props = this.props,
         toggleAllBreakpoints = _props.toggleAllBreakpoints,
         breakpoints = _props.breakpoints,
         breakpointsDisabled = _props.breakpointsDisabled,
         breakpointsLoading = _props.breakpointsLoading;
@@ -27721,42 +27835,53 @@ class SecondaryPanes extends _react.Comp
       minSize: 10,
       maxSize: "50%",
       splitterSize: 1,
       startPanel: _react2.default.createElement(_Accordion2.default, { items: this.getStartItems() }),
       endPanel: _react2.default.createElement(_Accordion2.default, { items: this.getEndItems() })
     });
   }
 
+  renderUtilsBar() {
+    if (!_prefs.features.shortcuts) {
+      return;
+    }
+
+    return _react2.default.createElement(_UtilsBar2.default, {
+      horizontal: this.props.horizontal,
+      toggleShortcutsModal: this.props.toggleShortcutsModal
+    });
+  }
+
   render() {
     return _react2.default.createElement(
       "div",
       { className: "secondary-panes secondary-panes--sticky-commandbar" },
       _react2.default.createElement(_CommandBar2.default, { horizontal: this.props.horizontal }),
-      this.props.horizontal ? this.renderHorizontalLayout() : this.renderVerticalLayout()
+      this.props.horizontal ? this.renderHorizontalLayout() : this.renderVerticalLayout(),
+      this.renderUtilsBar()
     );
   }
 }
 
 SecondaryPanes.propTypes = {
   evaluateExpressions: _react.PropTypes.func.isRequired,
   pauseData: _react.PropTypes.object,
   horizontal: _react.PropTypes.bool,
   breakpoints: _reactImmutableProptypes2.default.map.isRequired,
   breakpointsDisabled: _react.PropTypes.bool,
   breakpointsLoading: _react.PropTypes.bool,
-  toggleAllBreakpoints: _react.PropTypes.func.isRequired
+  toggleAllBreakpoints: _react.PropTypes.func.isRequired,
+  toggleShortcutsModal: _react.PropTypes.func
 };
 
 SecondaryPanes.contextTypes = {
   shortcuts: _react.PropTypes.object
 };
 
-SecondaryPanes.displayName = "SecondaryPanes";
-
 exports.default = (0, _reactRedux.connect)(state => ({
   pauseData: (0, _selectors.getPause)(state),
   breakpoints: (0, _selectors.getBreakpoints)(state),
   breakpointsDisabled: (0, _selectors.getBreakpointsDisabled)(state),
   breakpointsLoading: (0, _selectors.getBreakpointsLoading)(state)
 }), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(SecondaryPanes);
 
 /***/ }),
@@ -27779,62 +27904,28 @@ var _reactRedux = __webpack_require__(15
 var _redux = __webpack_require__(3);
 
 var _actions = __webpack_require__(244);
 
 var _actions2 = _interopRequireDefault(_actions);
 
 var _selectors = __webpack_require__(242);
 
+var _expressions = __webpack_require__(1177);
+
 var _Close = __webpack_require__(378);
 
 var _Close2 = _interopRequireDefault(_Close);
 
 var _devtoolsReps = __webpack_require__(924);
 
 __webpack_require__(908);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-function getValue(expression) {
-  var value = expression.value;
-  if (!value) {
-    return {
-      path: expression.from,
-      value: "<not available>"
-    };
-  }
-
-  if (value.exception) {
-    return {
-      path: value.from,
-      value: value.exception
-    };
-  }
-
-  if (value.error) {
-    return {
-      path: value.from,
-      value: value.error
-    };
-  }
-
-  if (typeof value.result == "object") {
-    return {
-      path: value.result.actor,
-      value: value.result
-    };
-  }
-
-  return {
-    path: value.input,
-    value: value.result
-  };
-}
-
 class Expressions extends _react.PureComponent {
 
   constructor() {
     super(...arguments);
 
     this.state = {
       editing: null
     };
@@ -27921,48 +28012,43 @@ class Expressions extends _react.PureCom
     if (editing == input) {
       return this.renderExpressionEditInput(expression);
     }
 
     if (updating) {
       return;
     }
 
-    var _getValue = getValue(expression),
-        value = _getValue.value,
-        path = _getValue.path;
-
-    if (value.class == "Error") {
-      value = { unavailable: true };
-    }
+    var _getValue = (0, _expressions.getValue)(expression),
+        value = _getValue.value;
 
     var root = {
       name: expression.input,
-      path,
+      path: input,
       contents: { value }
     };
 
     return _react2.default.createElement(
       "li",
-      { className: "expression-container", key: `${path}/${input}` },
+      { className: "expression-container", key: input },
       _react2.default.createElement(
         "div",
         { className: "expression-content" },
         _react2.default.createElement(_devtoolsReps.ObjectInspector, {
           roots: [root],
           autoExpandDepth: 0,
           disableWrap: true,
           disabledFocus: true,
           onDoubleClick: (items, options) => this.editExpression(expression, options),
+          openLink: openLink,
           getObjectProperties: id => loadedObjects[id],
           loadObjectProperties: loadObjectProperties
           // TODO: See https://github.com/devtools-html/debugger.html/issues/3555.
           , getObjectEntries: actor => {},
-          loadObjectEntries: grip => {},
-          openLink: openLink
+          loadObjectEntries: grip => {}
         }),
         _react2.default.createElement(
           "div",
           { className: "expression-container__close-btn" },
           _react2.default.createElement(_Close2.default, {
             handleClick: e => this.deleteExpression(e, expression)
           })
         )
@@ -28011,19 +28097,16 @@ class Expressions extends _react.PureCom
     return _react2.default.createElement(
       "ul",
       { className: "pane expressions-list" },
       expressions.map(this.renderExpression),
       this.renderNewExpressionInput()
     );
   }
 }
-
-Expressions.displayName = "Expressions";
-
 exports.default = (0, _reactRedux.connect)(state => ({
   pauseInfo: (0, _selectors.getPause)(state),
   expressions: (0, _selectors.getExpressions)(state),
   loadedObjects: (0, _selectors.getLoadedObjects)(state)
 }), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(Expressions);
 
 /***/ }),
 /* 720 */,
@@ -28108,17 +28191,16 @@ function renderSourceLocation(source, li
   }
 
   return _react2.default.createElement(
     "div",
     { className: "location" },
     `${(0, _utils.endTruncateStr)(filename, 30)}: ${bpLocation}`
   );
 }
-renderSourceLocation.displayName = "SourceLocation";
 
 class Breakpoints extends _react.PureComponent {
 
   shouldComponentUpdate(nextProps, nextState) {
     var breakpoints = this.props.breakpoints;
 
     return breakpoints !== nextProps.breakpoints;
   }
@@ -28145,39 +28227,41 @@ class Breakpoints extends _react.PureCom
         toggleDisabledBreakpoint = _props.toggleDisabledBreakpoint,
         setBreakpointCondition = _props.setBreakpointCondition,
         toggleConditionalBreakpointPanel = _props.toggleConditionalBreakpointPanel,
         breakpoints = _props.breakpoints;
 
 
     e.preventDefault();
 
-    var deleteSelfLabel = L10N.getStr("breakpointMenuItem.deleteSelf");
-    var deleteAllLabel = L10N.getStr("breakpointMenuItem.deleteAll");
-    var deleteOthersLabel = L10N.getStr("breakpointMenuItem.deleteOthers");
-    var enableSelfLabel = L10N.getStr("breakpointMenuItem.enableSelf");
-    var enableAllLabel = L10N.getStr("breakpointMenuItem.enableAll");
-    var enableOthersLabel = L10N.getStr("breakpointMenuItem.enableOthers");
-    var disableSelfLabel = L10N.getStr("breakpointMenuItem.disableSelf");
-    var disableAllLabel = L10N.getStr("breakpointMenuItem.disableAll");
-    var disableOthersLabel = L10N.getStr("breakpointMenuItem.disableOthers");
-    var removeConditionLabel = L10N.getStr("breakpointMenuItem.removeCondition.label");
-    var editConditionLabel = L10N.getStr("breakpointMenuItem.editCondition.label");
-
-    var deleteSelfKey = L10N.getStr("breakpointMenuItem.deleteSelf.accesskey");
-    var deleteAllKey = L10N.getStr("breakpointMenuItem.deleteAll.accesskey");
-    var deleteOthersKey = L10N.getStr("breakpointMenuItem.deleteOthers.accesskey");
-    var enableSelfKey = L10N.getStr("breakpointMenuItem.enableSelf.accesskey");
-    var enableAllKey = L10N.getStr("breakpointMenuItem.enableAll.accesskey");
-    var enableOthersKey = L10N.getStr("breakpointMenuItem.enableOthers.accesskey");
-    var disableSelfKey = L10N.getStr("breakpointMenuItem.disableSelf.accesskey");
-    var disableAllKey = L10N.getStr("breakpointMenuItem.disableAll.accesskey");
-    var disableOthersKey = L10N.getStr("breakpointMenuItem.disableOthers.accesskey");
-    var removeConditionKey = L10N.getStr("breakpointMenuItem.removeCondition.accesskey");
-    var editConditionKey = L10N.getStr("breakpointMenuItem.editCondition.accesskey");
+    var deleteSelfLabel = L10N.getStr("breakpointMenuItem.deleteSelf2.label");
+    var deleteAllLabel = L10N.getStr("breakpointMenuItem.deleteAll2.label");
+    var deleteOthersLabel = L10N.getStr("breakpointMenuItem.deleteOthers2.label");
+    var enableSelfLabel = L10N.getStr("breakpointMenuItem.enableSelf2.label");
+    var enableAllLabel = L10N.getStr("breakpointMenuItem.enableAll2.label");
+    var enableOthersLabel = L10N.getStr("breakpointMenuItem.enableOthers2.label");
+    var disableSelfLabel = L10N.getStr("breakpointMenuItem.disableSelf2.label");
+    var disableAllLabel = L10N.getStr("breakpointMenuItem.disableAll2.label");
+    var disableOthersLabel = L10N.getStr("breakpointMenuItem.disableOthers2.label");
+    var removeConditionLabel = L10N.getStr("breakpointMenuItem.removeCondition2.label");
+    var addConditionLabel = L10N.getStr("breakpointMenuItem.addCondition2.label");
+    var editConditionLabel = L10N.getStr("breakpointMenuItem.editCondition2.label");
+
+    var deleteSelfKey = L10N.getStr("breakpointMenuItem.deleteSelf2.accesskey");
+    var deleteAllKey = L10N.getStr("breakpointMenuItem.deleteAll2.accesskey");
+    var deleteOthersKey = L10N.getStr("breakpointMenuItem.deleteOthers2.accesskey");
+    var enableSelfKey = L10N.getStr("breakpointMenuItem.enableSelf2.accesskey");
+    var enableAllKey = L10N.getStr("breakpointMenuItem.enableAll2.accesskey");
+    var enableOthersKey = L10N.getStr("breakpointMenuItem.enableOthers2.accesskey");
+    var disableSelfKey = L10N.getStr("breakpointMenuItem.disableSelf2.accesskey");
+    var disableAllKey = L10N.getStr("breakpointMenuItem.disableAll2.accesskey");
+    var disableOthersKey = L10N.getStr("breakpointMenuItem.disableOthers2.accesskey");
+    var removeConditionKey = L10N.getStr("breakpointMenuItem.removeCondition2.accesskey");
+    var editConditionKey = L10N.getStr("breakpointMenuItem.editCondition2.accesskey");
+    var addConditionKey = L10N.getStr("breakpointMenuItem.addCondition2.accesskey");
 
     var otherBreakpoints = breakpoints.filter(b => b !== breakpoint);
     var enabledBreakpoints = breakpoints.filter(b => !b.disabled);
     var disabledBreakpoints = breakpoints.filter(b => b.disabled);
     var otherEnabledBreakpoints = breakpoints.filter(b => !b.disabled && b !== breakpoint);
     var otherDisabledBreakpoints = breakpoints.filter(b => b.disabled && b !== breakpoint);
 
     var deleteSelf = {
@@ -28254,41 +28338,60 @@ class Breakpoints extends _react.PureCom
     var removeCondition = {
       id: "node-menu-remove-condition",
       label: removeConditionLabel,
       accesskey: removeConditionKey,
       disabled: false,
       click: () => setBreakpointCondition(breakpoint.location)
     };
 
+    var addCondition = {
+      id: "node-menu-add-condition",
+      label: addConditionLabel,
+      accesskey: addConditionKey,
+      click: () => {
+        this.selectBreakpoint(breakpoint);
+        toggleConditionalBreakpointPanel(breakpoint.location.line);
+      }
+    };
+
     var editCondition = {
       id: "node-menu-edit-condition",
       label: editConditionLabel,
       accesskey: editConditionKey,
-      click: () => toggleConditionalBreakpointPanel(breakpoint.location.line)
-    };
-
-    var items = [{ item: enableSelf, hidden: () => !breakpoint.disabled }, { item: disableSelf, hidden: () => breakpoint.disabled }, { item: deleteSelf }, { item: deleteAll }, { item: deleteOthers, hidden: () => breakpoints.size === 1 }, {
-      item: enableAll,
-      hidden: () => disabledBreakpoints.size === 0
+      click: () => {
+        this.selectBreakpoint(breakpoint);
+        toggleConditionalBreakpointPanel(breakpoint.location.line);
+      }
+    };
+
+    var hideEnableSelf = !breakpoint.disabled;
+    var hideEnableAll = disabledBreakpoints.size === 0;
+    var hideEnableOthers = otherDisabledBreakpoints.size === 0;
+    var hideDisableAll = enabledBreakpoints.size === 0;
+    var hideDisableOthers = otherEnabledBreakpoints.size === 0;
+    var hideDisableSelf = breakpoint.disabled;
+
+    var items = [{ item: enableSelf, hidden: () => hideEnableSelf }, { item: enableAll, hidden: () => hideEnableAll }, { item: enableOthers, hidden: () => hideEnableOthers }, {
+      item: { type: "separator" },
+      hidden: () => hideEnableSelf && hideEnableAll && hideEnableOthers
+    }, { item: deleteSelf }, { item: deleteAll }, { item: deleteOthers, hidden: () => breakpoints.size === 1 }, {
+      item: { type: "separator" },
+      hidden: () => hideDisableSelf && hideDisableAll && hideDisableOthers
+    }, { item: disableSelf, hidden: () => hideDisableSelf }, { item: disableAll, hidden: () => hideDisableAll }, { item: disableOthers, hidden: () => hideDisableOthers }, {
+      item: { type: "separator" }
     }, {
-      item: disableAll,
-      hidden: () => enabledBreakpoints.size === 0
+      item: addCondition,
+      hidden: () => breakpoint.condition
     }, {
-      item: enableOthers,
-      hidden: () => otherDisabledBreakpoints.size === 0
-    }, {
-      item: disableOthers,
-      hidden: () => otherEnabledBreakpoints.size === 0
+      item: editCondition,
+      hidden: () => !breakpoint.condition
     }, {
       item: removeCondition,
       hidden: () => !breakpoint.condition
-    }, {
-      item: editCondition,
-      hidden: () => !breakpoint.condition
     }];
 
     (0, _devtoolsLaunchpad.showMenu)(e, (0, _devtoolsLaunchpad.buildMenu)(items));
   }
 
   selectBreakpoint(breakpoint) {
     var sourceId = breakpoint.location.sourceId;
     var line = breakpoint.location.line;
@@ -28371,18 +28474,16 @@ class Breakpoints extends _react.PureCom
     return _react2.default.createElement(
       "div",
       { className: "pane breakpoints-list" },
       children
     );
   }
 }
 
-Breakpoints.displayName = "Breakpoints";
-
 function updateLocation(sources, pause, bp) {
   var source = (0, _selectors.getSourceInSources)(sources, bp.location.sourceId);
   var isCurrentlyPaused = isCurrentlyPausedAtBreakpoint(pause, bp);
   var locationId = (0, _breakpoint.makeLocationId)(bp.location);
 
   var location = Object.assign({}, bp.location, { source });
   var localBP = Object.assign({}, bp, {
     location,
@@ -28409,20 +28510,16 @@ exports.default = (0, _reactRedux.connec
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
-var _reactImmutableProptypes = __webpack_require__(150);
-
-var _reactImmutableProptypes2 = _interopRequireDefault(_reactImmutableProptypes);
-
 var _redux = __webpack_require__(3);
 
 var _reactRedux = __webpack_require__(151);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
@@ -28444,16 +28541,17 @@ var _ManagedTree2 = _interopRequireDefau
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 // check to see if its an object with propertie
 function nodeHasProperties(item) {
   return !nodeHasChildren(item) && item.contents.value.type === "object";
 }
 
+
 function nodeIsPrimitive(item) {}
 
 function nodeHasChildren(item) {
   return Array.isArray(item.contents);
 }
 
 function createNode(name, path, contents) {
   // The path is important to uniquely identify the item in the entire
@@ -28479,23 +28577,20 @@ class Scopes extends _react.Component {
     this.renderItem = this.renderItem.bind(this);
   }
 
   makeNodesForProperties(objProps, parentPath) {
     var ownProperties = objProps.ownProperties,
         prototype = objProps.prototype;
 
 
-    var nodes = Object.keys(ownProperties).sort().filter(name => {
-      // Ignore non-concrete values like getters and setters
-      // for now by making sure we have a value.
-      return "value" in ownProperties[name];
-    }).map(name => {
-      return createNode(name, `${parentPath}/${name}`, ownProperties[name]);
-    });
+    var nodes = Object.keys(ownProperties).sort()
+    // Ignore non-concrete values like getters and setters
+    // for now by making sure we have a value.
+    .filter(name => "value" in ownProperties[name]).map(name => createNode(name, `${parentPath}/${name}`, ownProperties[name]));
 
     // Add the prototype if it exists and is not null
     if (prototype && prototype.type !== "null") {
       nodes.push(createNode("__proto__", `${parentPath}/__proto__`, {
         value: prototype
       }));
     }
 
@@ -28637,25 +28732,16 @@ class Scopes extends _react.Component {
         disabledFocus: true,
         onExpand: this.onExpand,
         renderItem: this.renderItem
       })
     );
   }
 }
 
-Scopes.propTypes = {
-  scopes: _react.PropTypes.array,
-  loadedObjects: _reactImmutableProptypes2.default.map,
-  loadObjectProperties: _react.PropTypes.func,
-  pauseInfo: _react.PropTypes.object
-};
-
-Scopes.displayName = "Scopes";
-
 exports.default = (0, _reactRedux.connect)(state => ({
   pauseInfo: (0, _selectors.getPause)(state),
   loadedObjects: (0, _selectors.getLoadedObjects)(state),
   scopes: (0, _selectors.getChromeScopes)(state)
 }), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(Scopes);
 
 /***/ }),
 /* 729 */,
@@ -28724,18 +28810,17 @@ class Scopes extends _react.PureComponen
       });
     }
   }
 
   render() {
     var _props2 = this.props,
         pauseInfo = _props2.pauseInfo,
         loadObjectProperties = _props2.loadObjectProperties,
-        loadedObjects = _props2.loadedObjects,
-        openLink = _props2.openLink;
+        loadedObjects = _props2.loadedObjects;
     var scopes = this.state.scopes;
 
 
     if (scopes) {
       return _react2.default.createElement(
         "div",
         { className: "pane scopes-list" },
         _react2.default.createElement(_devtoolsReps.ObjectInspector, {
@@ -28743,43 +28828,32 @@ class Scopes extends _react.PureComponen
           autoExpandDepth: 1,
           getObjectProperties: id => loadedObjects[id],
           loadObjectProperties: loadObjectProperties,
           disableWrap: true,
           disabledFocus: true,
           dimTopLevelWindow: true
           // TODO: See https://github.com/devtools-html/debugger.html/issues/3555.
           , getObjectEntries: actor => {},
-          loadObjectEntries: grip => {},
-          openLink: openLink
+          loadObjectEntries: grip => {}
         })
       );
     }
     return _react2.default.createElement(
       "div",
       { className: "pane scopes-list" },
       _react2.default.createElement(
         "div",
         { className: "pane-info" },
         pauseInfo ? L10N.getStr("scopes.notAvailable") : L10N.getStr("scopes.notPaused")
       )
     );
   }
 }
 
-Scopes.propTypes = {
-  pauseInfo: _react.PropTypes.object,
-  loadedObjects: _react.PropTypes.object,
-  loadObjectProperties: _react.PropTypes.func,
-  selectedFrame: _react.PropTypes.object,
-  frameScopes: _react.PropTypes.object
-};
-
-Scopes.displayName = "Scopes";
-
 exports.default = (0, _reactRedux.connect)(state => {
   var selectedFrame = (0, _selectors.getSelectedFrame)(state);
   var frameScopes = selectedFrame ? (0, _selectors.getFrameScopes)(state, selectedFrame.id) : null;
   return {
     selectedFrame,
     pauseInfo: (0, _selectors.getPause)(state),
     frameScopes: frameScopes,
     loadedObjects: (0, _selectors.getLoadedObjects)(state)
@@ -28796,16 +28870,18 @@ exports.default = (0, _reactRedux.connec
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.getSpecialVariables = getSpecialVariables;
 exports.getScopes = getScopes;
 
 var _lodash = __webpack_require__(2);
 
+var _frame = __webpack_require__(1014);
+
 // Create the tree nodes representing all the variables and arguments
 // for the bindings from a scope.
 function getBindingVariables(bindings, parentName) {
   var args = bindings.arguments.map(arg => (0, _lodash.toPairs)(arg)[0]);
   var variables = (0, _lodash.toPairs)(bindings.variables);
 
   return args.concat(variables).map(binding => ({
     name: binding[0],
@@ -28881,17 +28957,17 @@ function getScopes(pauseInfo, selectedFr
         type = _scope.type,
         actor = _scope.actor;
 
     var key = `${actor}-${scopeIndex}`;
     if (type === "function" || type === "block") {
       var bindings = scope.bindings;
       var title = void 0;
       if (type === "function") {
-        title = scope.function.displayName || "(anonymous)";
+        title = scope.function.displayName ? (0, _frame.simplifyDisplayName)(scope.function.displayName) : L10N.getStr("anonymous");
       } else {
         title = L10N.getStr("scopes.block");
       }
 
       var vars = getBindingVariables(bindings, key);
 
       // show exception, return, and this variables in innermost scope
       if (scope.actor === pausedScopeActor) {
@@ -29042,20 +29118,16 @@ class EventListeners extends _react.Comp
 
     return _react2.default.createElement(
       "div",
       { className: "pane event-listeners" },
       listeners.map(this.renderListener)
     );
   }
 }
-
-
-EventListeners.displayName = "EventListeners";
-
 exports.default = (0, _reactRedux.connect)(state => {
   var listeners = (0, _selectors.getEventListeners)(state).map(l => Object.assign({}, l, {
     breakpoint: (0, _selectors.getBreakpoint)(state, {
       sourceId: l.sourceId,
       line: l.line
     })
   }));
 
@@ -29169,18 +29241,16 @@ class Accordion extends _react.Component
     return _react2.default.createElement(
       "div",
       { className: "accordion" },
       this.props.items.map(this.renderContainer)
     );
   }
 }
 
-Accordion.displayName = "Accordion";
-
 exports.default = Accordion;
 
 /***/ }),
 /* 740 */,
 /* 741 */,
 /* 742 */
 /***/ (function(module, exports, __webpack_require__) {
 
@@ -29287,18 +29357,16 @@ function debugBtn(onClick, type, classNa
 
   return _react2.default.createElement(
     "button",
     _extends({ className: (0, _classnames2.default)(type, className) }, props),
     _react2.default.createElement(_Svg2.default, { name: type })
   );
 }
 
-debugBtn.displayName = "CommandBarButton";
-
 class CommandBar extends _react.Component {
 
   componentWillUnmount() {
     var shortcuts = this.context.shortcuts;
     COMMANDS.forEach(action => shortcuts.off(getKey(action)));
     if (isMacOS) {
       COMMANDS.forEach(action => shortcuts.off(getKeyForOS("WINNT", action)));
     }
@@ -29387,18 +29455,16 @@ class CommandBar extends _react.Componen
     );
   }
 }
 
 CommandBar.contextTypes = {
   shortcuts: _react.PropTypes.object
 };
 
-CommandBar.displayName = "CommandBar";
-
 exports.default = (0, _reactRedux.connect)(state => {
   return {
     pause: (0, _selectors.getPause)(state),
     isWaitingOnBreak: (0, _selectors.getIsWaitingOnBreak)(state),
     shouldPauseOnExceptions: (0, _selectors.getShouldPauseOnExceptions)(state),
     shouldIgnoreCaughtExceptions: (0, _selectors.getShouldIgnoreCaughtExceptions)(state)
   };
 }, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(CommandBar);
@@ -29507,18 +29573,16 @@ class WelcomeBox extends _react.Componen
           )
         ),
         this.renderToggleButton()
       )
     );
   }
 }
 
-WelcomeBox.displayName = "WelcomeBox";
-
 exports.default = (0, _reactRedux.connect)(state => ({
   endPanelCollapsed: (0, _selectors.getPaneCollapse)(state, "end")
 }), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(WelcomeBox);
 
 /***/ }),
 /* 748 */,
 /* 749 */,
 /* 750 */
@@ -30012,18 +30076,16 @@ class SourceTabs extends _react.PureComp
       this.renderTabs(),
       this.renderNewButton(),
       this.renderDropdown(),
       this.renderEndPanelToggleButton()
     );
   }
 }
 
-SourceTabs.displayName = "SourceTabs";
-
 exports.default = (0, _reactRedux.connect)(state => {
   return {
     selectedSource: (0, _selectors.getSelectedSource)(state),
     searchTabs: (0, _selectors.getSearchTabs)(state),
     sourceTabs: (0, _selectors.getSourcesForTabs)(state),
     activeSearch: (0, _selectors.getActiveSearch)(state),
     searchOn: (0, _selectors.getActiveSearch)(state) === "source"
   };
@@ -30102,18 +30164,16 @@ class Dropdown extends _react.Component 
       { className: "dropdown-block" },
       this.renderPanel(),
       this.renderButton(),
       this.renderMask()
     );
   }
 }
 
-Dropdown.displayName = "Dropdown";
-
 exports.default = Dropdown;
 
 /***/ }),
 /* 752 */,
 /* 753 */,
 /* 754 */,
 /* 755 */,
 /* 756 */,
@@ -30385,19 +30445,17 @@ class PreviewFunction extends _react.Com
       _react2.default.createElement(
         "span",
         { className: "paren" },
         ")"
       )
     );
   }
 }
-
 exports.default = PreviewFunction;
-PreviewFunction.displayName = "PreviewFunction";
 
 /***/ }),
 /* 799 */,
 /* 800 */,
 /* 801 */,
 /* 802 */,
 /* 803 */,
 /* 804 */
@@ -30629,18 +30687,16 @@ class Preview extends _react.PureCompone
       range: editorRange,
       expression: expression,
       popoverPos: cursorPos,
       onClose: e => this.onClose(e)
     });
   }
 }
 
-Preview.displayName = "Preview";
-
 exports.default = (0, _reactRedux.connect)(state => ({
   preview: (0, _selectors.getPreview)(state),
   selectedSource: (0, _selectors.getSelectedSource)(state),
   linesInScope: (0, _selectors.getInScopeLines)(state),
   selectedFrameVisible: (0, _selectors.isSelectedFrameVisible)(state)
 }), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(Preview);
 
 /***/ }),
@@ -30758,20 +30814,25 @@ class Popup extends _react.Component {
       "div",
       { className: "preview-popup" },
       this.renderObjectInspector(root)
     );
   }
 
   renderSimplePreview(value) {
     var openLink = this.props.openLink;
+
     return _react2.default.createElement(
       "div",
       { className: "preview-popup" },
-      Rep({ object: value, mode: MODE.LONG, openLink: openLink })
+      Rep({
+        object: value,
+        mode: MODE.LONG,
+        openLink
+      })
     );
   }
 
   renderObjectInspector(root) {
     var _props2 = this.props,
         loadObjectProperties = _props2.loadObjectProperties,
         loadedObjects = _props2.loadedObjects,
         openLink = _props2.openLink;
@@ -30784,22 +30845,22 @@ class Popup extends _react.Component {
       return null;
     }
 
     return _react2.default.createElement(ObjectInspector, {
       roots: roots,
       autoExpandDepth: 0,
       disableWrap: true,
       disabledFocus: true,
+      openLink: openLink,
       getObjectProperties: getObjectProperties,
       loadObjectProperties: loadObjectProperties
       // TODO: See https://github.com/devtools-html/debugger.html/issues/3555.
       , getObjectEntries: actor => {},
-      loadObjectEntries: grip => {},
-      openLink: openLink
+      loadObjectEntries: grip => {}
     });
   }
 
   renderAddToExpressionBar(expression) {
     if (!(0, _devtoolsConfig.isEnabled)("previewWatch")) {
       return null;
     }
 
@@ -30848,17 +30909,17 @@ class Popup extends _react.Component {
         this.renderAddToExpressionBar(expression)
       );
     }
 
     return this.renderSimplePreview(value);
   }
 
   getPreviewType(value) {
-    if (typeof value == "boolean" || value.type == "null" || value.type == "undefined" || value.class === "Function") {
+    if (typeof value == "number" || typeof value == "boolean" || value.type == "null" || value.type == "undefined" || value.class === "Function") {
       return "tooltip";
     }
 
     return "popover";
   }
 
   render() {
     var _props3 = this.props,
@@ -30874,18 +30935,16 @@ class Popup extends _react.Component {
       _Popover2.default,
       { targetPosition: popoverPos, onMouseLeave: onClose, type: type },
       this.renderPreview(expression, value)
     );
   }
 }
 
 exports.Popup = Popup;
-Popup.displayName = "Popup";
-
 exports.default = (0, _reactRedux.connect)(state => ({
   loadedObjects: (0, _selectors.getLoadedObjects)(state)
 }), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(Popup);
 
 /***/ }),
 /* 811 */,
 /* 812 */,
 /* 813 */,
@@ -30906,32 +30965,34 @@ exports.default = (0, _reactRedux.connec
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.clearSources = exports.setSource = exports.hasSource = exports.getEmptyLines = exports.getNextStep = exports.clearASTs = exports.clearSymbols = exports.getOutOfScopeLocations = exports.getVariablesInScope = exports.getSymbols = exports.getClosestExpression = exports.stopParserWorker = exports.startParserWorker = undefined;
+exports.clearSources = exports.setSource = exports.hasSource = exports.getEmptyLines = exports.getNextStep = exports.clearASTs = exports.clearScopes = exports.clearSymbols = exports.getOutOfScopeLocations = exports.getVariablesInScope = exports.getScopes = exports.getSymbols = exports.getClosestExpression = exports.stopParserWorker = exports.startParserWorker = undefined;
 
 var _devtoolsUtils = __webpack_require__(900);
 
 var WorkerDispatcher = _devtoolsUtils.workerUtils.WorkerDispatcher;
 
 
 var dispatcher = new WorkerDispatcher();
 var startParserWorker = exports.startParserWorker = dispatcher.start.bind(dispatcher);
 var stopParserWorker = exports.stopParserWorker = dispatcher.stop.bind(dispatcher);
 
 var getClosestExpression = exports.getClosestExpression = dispatcher.task("getClosestExpression");
 var getSymbols = exports.getSymbols = dispatcher.task("getSymbols");
+var getScopes = exports.getScopes = dispatcher.task("getScopes");
 var getVariablesInScope = exports.getVariablesInScope = dispatcher.task("getVariablesInScope");
 var getOutOfScopeLocations = exports.getOutOfScopeLocations = dispatcher.task("getOutOfScopeLocations");
 var clearSymbols = exports.clearSymbols = dispatcher.task("clearSymbols");
+var clearScopes = exports.clearScopes = dispatcher.task("clearScopes");
 var clearASTs = exports.clearASTs = dispatcher.task("clearASTs");
 var getNextStep = exports.getNextStep = dispatcher.task("getNextStep");
 var getEmptyLines = exports.getEmptyLines = dispatcher.task("getEmptyLines");
 var hasSource = exports.hasSource = dispatcher.task("hasSource");
 var setSource = exports.setSource = dispatcher.task("setSource");
 var clearSources = exports.clearSources = dispatcher.task("clearSources");
 
 /***/ }),
@@ -32158,36 +32219,40 @@ module.exports = {
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.onConnect = undefined;
 
 var onConnect = (() => {
-  var _ref = _asyncToGenerator(function* (connection, options) {
+  var _ref = _asyncToGenerator(function* (connection, _ref2) {
+    var services = _ref2.services,
+        toolboxActions = _ref2.toolboxActions;
+
     // NOTE: the landing page does not connect to a JS process
     if (!connection) {
       return;
     }
 
-	var services = options.services;
-	var toolboxActions = options.toolboxActions;
     var client = getClient(connection);
     var commands = client.clientCommands;
 
-    var _bootstrapStore = (0, _bootstrap.bootstrapStore)(commands, options),
+    var _bootstrapStore = (0, _bootstrap.bootstrapStore)(commands, {
+      services,
+      toolboxActions
+    }),
         store = _bootstrapStore.store,
         actions = _bootstrapStore.actions,
         selectors = _bootstrapStore.selectors;
 
     (0, _bootstrap.bootstrapWorkers)();
 
-    var _ref2 = yield client.onConnect(connection, actions),
-        bpClients = _ref2.bpClients;
+    var _ref3 = yield client.onConnect(connection, actions),
+        bpClients = _ref3.bpClients;
 
     yield loadFromPrefs(actions);
 
     window.getGlobalsForTesting = function () {
       return {
         store,
         actions,
         selectors,
@@ -32295,16 +32360,20 @@ var onConnect = exports.onConnect = (() 
     tabTarget.on("will-navigate", actions.willNavigate);
     tabTarget.on("navigate", actions.navigated);
 
     yield threadClient.reconfigure({
       observeAsmJS: true,
       wasmBinarySource: supportsWasm
     });
 
+    threadClient._parent.listWorkers().then(function (workers) {
+      return actions.setWorkers(workers);
+    });
+
     // In Firefox, we need to initially request all of the sources. This
     // usually fires off individual `newSource` notifications as the
     // debugger finds them, but there may be existing sources already in
     // the debugger (if it's paused already, or if loading the page from
     // bfcache) so explicity fire `newSource` events for all returned
     // sources.
     var sources = yield _commands.clientCommands.fetchSources();
     actions.connect(tabTarget.url);
@@ -32653,17 +32722,17 @@ exports.createPause = createPause;
 exports.createBreakpointLocation = createBreakpointLocation;
 
 // This module converts Firefox specific types to the generic types
 
 function createFrame(frame) {
   var title = void 0;
   if (frame.type == "call") {
     var c = frame.callee;
-    title = c.name || c.userDisplayName || c.displayName || "(anonymous)";
+    title = c.name || c.userDisplayName || c.displayName || L10N.getStr("anonymous");
   } else {
     title = `(${frame.type})`;
   }
 
   return {
     id: frame.actor,
     displayName: title,
     location: {
@@ -33248,38 +33317,39 @@ var _selectors2 = _interopRequireDefault
 var _App = __webpack_require__(243);
 
 var _App2 = _interopRequireDefault(_App);
 
 var _prefs = __webpack_require__(226);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-function bootstrapStore(client, options) {
-    var services = options.services;
-    var toolboxActions = options.toolboxActions;
+function bootstrapStore(client, _ref) {
+  var services = _ref.services,
+      toolboxActions = _ref.toolboxActions;
+
   var createStore = (0, _createStore2.default)({
     log: (0, _devtoolsConfig.getValue)("logging.actions"),
     timing: (0, _devtoolsConfig.getValue)("performance.actions"),
     makeThunkArgs: (args, state) => {
       return Object.assign({}, args, { client }, services, toolboxActions);
     }
   });
 
   var store = createStore((0, _redux.combineReducers)(_reducers2.default));
   store.subscribe(() => updatePrefs(store.getState()));
 
   var actions = (0, _redux.bindActionCreators)(__webpack_require__(244).default, store.dispatch);
 
   return { store, actions, selectors: _selectors2.default };
 }
 
-function bootstrapApp(connection, _ref) {
-  var store = _ref.store,
-      actions = _ref.actions;
+function bootstrapApp(connection, _ref2) {
+  var store = _ref2.store,
+      actions = _ref2.actions;
 
   window.appStore = store;
 
   // Expose the bound actions so external things can do things like
   // selecting a source.
   window.actions = {
     selectSource: actions.selectSource,
     selectSourceURL: actions.selectSourceURL
@@ -33324,127 +33394,50 @@ function updatePrefs(state) {
  * 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 {
   originalToGeneratedId,
   generatedToOriginalId,
   isGeneratedId,
   isOriginalId
-} = __webpack_require__(899);
+} = __webpack_require__(1172);
 
 const { workerUtils: { WorkerDispatcher } } = __webpack_require__(1165);
 
 const dispatcher = new WorkerDispatcher();
 
 const getOriginalURLs = dispatcher.task("getOriginalURLs");
 const getGeneratedLocation = dispatcher.task("getGeneratedLocation");
 const getOriginalLocation = dispatcher.task("getOriginalLocation");
+const getLocationScopes = dispatcher.task("getLocationScopes");
 const getOriginalSourceText = dispatcher.task("getOriginalSourceText");
 const applySourceMap = dispatcher.task("applySourceMap");
 const clearSourceMaps = dispatcher.task("clearSourceMaps");
 const hasMappedSource = dispatcher.task("hasMappedSource");
 
 module.exports = {
   originalToGeneratedId,
   generatedToOriginalId,
   isGeneratedId,
   isOriginalId,
   hasMappedSource,
   getOriginalURLs,
   getGeneratedLocation,
   getOriginalLocation,
+  getLocationScopes,
   getOriginalSourceText,
   applySourceMap,
   clearSourceMaps,
   startSourceMapWorker: dispatcher.start.bind(dispatcher),
   stopSourceMapWorker: dispatcher.stop.bind(dispatcher)
 };
 
 /***/ }),
-/* 899 */
-/***/ (function(module, exports, __webpack_require__) {
-
-/* 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 md5 = __webpack_require__(248);
-
-function originalToGeneratedId(originalId) {
-  const match = originalId.match(/(.*)\/originalSource/);
-  return match ? match[1] : "";
-}
-
-function generatedToOriginalId(generatedId, url) {
-  return `${generatedId}/originalSource-${md5(url)}`;
-}
-
-function isOriginalId(id) {
-  return !!id.match(/\/originalSource/);
-}
-
-function isGeneratedId(id) {
-  return !isOriginalId(id);
-}
-
-/**
- * Trims the query part or reference identifier of a URL string, if necessary.
- */
-function trimUrlQuery(url) {
-  let length = url.length;
-  let q1 = url.indexOf("?");
-  let q2 = url.indexOf("&");
-  let q3 = url.indexOf("#");
-  let q = Math.min(q1 != -1 ? q1 : length, q2 != -1 ? q2 : length, q3 != -1 ? q3 : length);
-
-  return url.slice(0, q);
-}
-
-// Map suffix to content type.
-const contentMap = {
-  "js": "text/javascript",
-  "jsm": "text/javascript",
-  "ts": "text/typescript",
-  "tsx": "text/typescript-jsx",
-  "jsx": "text/jsx",
-  "coffee": "text/coffeescript",
-  "elm": "text/elm",
-  "cljs": "text/x-clojure"
-};
-
-/**
- * Returns the content type for the specified URL.  If no specific
- * content type can be determined, "text/plain" is returned.
- *
- * @return String
- *         The content type.
- */
-function getContentType(url) {
-  url = trimUrlQuery(url);
-  let dot = url.lastIndexOf(".");
-  if (dot >= 0) {
-    let name = url.substring(dot + 1);
-    if (name in contentMap) {
-      return contentMap[name];
-    }
-  }
-  return "text/plain";
-}
-
-module.exports = {
-  originalToGeneratedId,
-  generatedToOriginalId,
-  isOriginalId,
-  isGeneratedId,
-  getContentType,
-  contentMapForTesting: contentMap
-};
-
-/***/ }),
+/* 899 */,
 /* 900 */
 /***/ (function(module, exports, __webpack_require__) {
 
 /* 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 networkRequest = __webpack_require__(901);
@@ -33626,20 +33619,19 @@ Object.defineProperty(exports, "__esModu
 });
 exports.prettyPrint = exports.stopPrettyPrintWorker = exports.startPrettyPrintWorker = undefined;
 
 var prettyPrint = exports.prettyPrint = (() => {
   var _ref = _asyncToGenerator(function* (_ref2) {
     var source = _ref2.source,
         url = _ref2.url;
 
-    var contentType = source.contentType;
     var indent = 2;
 
-    (0, _assert2.default)((0, _source.isJavaScript)(source.url, contentType), "Can't prettify non-javascript files.");
+    (0, _assert2.default)((0, _source.isJavaScript)(source), "Can't prettify non-javascript files.");
 
     return yield _prettyPrint({
       url,
       indent,
       source: source.text
     });
   });
 
@@ -38385,17 +38377,17 @@ module.exports = {
   supportsObject,
   maxLengthMap
 };
 
 /***/ }),
 /* 960 */
 /***/ (function(module, exports) {
 
-module.exports = "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n# LOCALIZATION NOTE These strings are used inside the Debugger\n# which is available from the Web Developer sub-menu -> 'Debugger'.\n# The correct localization of this file might be to keep it in\n# English, or another language commonly spoken among web developers.\n# You want to make that choice consistent across the developer tools.\n# A good criteria is the language in which you'd find the best\n# documentation on web development on the web.\n\n# LOCALIZATION NOTE (collapsePanes): This is the tooltip for the button\n# that collapses the left and right panes in the debugger UI.\ncollapsePanes=Collapse panes\n\n# LOCALIZATION NOTE (copySource): This is the text that appears in the\n# context menu to copy the selected source of file open.\ncopySource=Copy\ncopySource.accesskey=y\n\n# LOCALIZATION NOTE (copySourceUrl): This is the text that appears in the\n# context menu to copy the source URL of file open.\ncopySourceUrl=Copy Source URL\ncopySourceUrl.accesskey=u\n\n# LOCALIZATION NOTE (copyFunction): This is the text that appears in the\n# context menu to copy the function the user selected\ncopyFunction.label=Copy Function\ncopyFunction.accesskey=F\n\n# LOCALIZATION NOTE (copyStackTrace): This is the text that appears in the\n# context menu to copy the stack trace methods, file names and row number.\ncopyStackTrace=Copy Stack Trace\ncopyStackTrace.accesskey=c\n\n# LOCALIZATION NOTE (expandPanes): This is the tooltip for the button\n# that expands the left and right panes in the debugger UI.\nexpandPanes=Expand panes\n\n# LOCALIZATION NOTE (pauseButtonTooltip): The tooltip that is displayed for the pause\n# button when the debugger is in a running state.\npauseButtonTooltip=Pause %S\n\n# LOCALIZATION NOTE (pausePendingButtonTooltip): The tooltip that is displayed for\n# the pause button after it's been clicked but before the next JavaScript to run.\npausePendingButtonTooltip=Waiting for next execution\n\n# LOCALIZATION NOTE (resumeButtonTooltip): The label that is displayed on the pause\n# button when the debugger is in a paused state.\nresumeButtonTooltip=Resume %S\n\n# LOCALIZATION NOTE (stepOverTooltip): The label that is displayed on the\n# button that steps over a function call.\nstepOverTooltip=Step Over %S\n\n# LOCALIZATION NOTE (stepInTooltip): The label that is displayed on the\n# button that steps into a function call.\nstepInTooltip=Step In %S\n\n# LOCALIZATION NOTE (stepOutTooltip): The label that is displayed on the\n# button that steps out of a function call.\nstepOutTooltip=Step Out %S\n\n# LOCALIZATION NOTE (workersHeader): The text to display in the events\n# header.\nworkersHeader=Workers\n\n# LOCALIZATION NOTE (noWorkersText): The text to display in the workers list\n# when there are no workers.\nnoWorkersText=This page has no workers.\n\n# LOCALIZATION NOTE (noSourcesText): The text to display in the sources list\n# when there are no sources.\nnoSourcesText=This page has no sources.\n\n# LOCALIZATION NOTE (noEventListenersText): The text to display in the events tab\n# when there are no events.\nnoEventListenersText=No event listeners to display\n\n# LOCALIZATION NOTE (eventListenersHeader): The text to display in the events\n# header.\neventListenersHeader=Event Listeners\n\n# LOCALIZATION NOTE (noStackFramesText): The text to display in the call stack tab\n# when there are no stack frames.\nnoStackFramesText=No stack frames to display\n\n# LOCALIZATION NOTE (eventCheckboxTooltip): The tooltip text to display when\n# the user hovers over the checkbox used to toggle an event breakpoint.\neventCheckboxTooltip=Toggle breaking on this event\n\n# LOCALIZATION NOTE (eventOnSelector): The text to display in the events tab\n# for every event item, between the event type and event selector.\neventOnSelector=on\n\n# LOCALIZATION NOTE (eventInSource): The text to display in the events tab\n# for every event item, between the event selector and listener's owner source.\neventInSource=in\n\n# LOCALIZATION NOTE (eventNodes): The text to display in the events tab when\n# an event is listened on more than one target node.\neventNodes=%S nodes\n\n# LOCALIZATION NOTE (eventNative): The text to display in the events tab when\n# a listener is added from plugins, thus getting translated to native code.\neventNative=[native code]\n\n# LOCALIZATION NOTE (*Events): The text to display in the events tab for\n# each group of sub-level event entries.\nanimationEvents=Animation\naudioEvents=Audio\nbatteryEvents=Battery\nclipboardEvents=Clipboard\ncompositionEvents=Composition\ndeviceEvents=Device\ndisplayEvents=Display\ndragAndDropEvents=Drag and Drop\ngamepadEvents=Gamepad\nindexedDBEvents=IndexedDB\ninteractionEvents=Interaction\nkeyboardEvents=Keyboard\nmediaEvents=HTML5 Media\nmouseEvents=Mouse\nmutationEvents=Mutation\nnavigationEvents=Navigation\npointerLockEvents=Pointer Lock\nsensorEvents=Sensor\nstorageEvents=Storage\ntimeEvents=Time\ntouchEvents=Touch\notherEvents=Other\n\n# LOCALIZATION NOTE (blackboxCheckboxTooltip2): The tooltip text to display when\n# the user hovers over the checkbox used to toggle blackboxing its associated\n# source.\nblackboxCheckboxTooltip2=Toggle blackboxing\n\n# LOCALIZATION NOTE (sources.search.key2): Key shortcut to open the search for\n# searching all the source files the debugger has seen.\nsources.search.key2=CmdOrCtrl+P\n\n# LOCALIZATION NOTE (sources.search.alt.key): A second key shortcut to open the\n# search for searching all the source files the debugger has seen.\nsources.search.alt.key=CmdOrCtrl+O\n\n# LOCALIZATION NOTE (projectTextSearch.key): A key shortcut to open the\n# full project text search for searching all the files the debugger has seen.\nprojectTextSearch.key=CmdOrCtrl+Shift+F\n\n# LOCALIZATION NOTE (functionSearch.key): A key shortcut to open the\n# modal for searching functions in a file.\nfunctionSearch.key=CmdOrCtrl+Shift+O\n\n# LOCALIZATION NOTE (projectTextSearch.placeholder): A placeholder shown\n# when searching across all of the files in a project.\nprojectTextSearch.placeholder=Find in files…\n\n# LOCALIZATION NOTE (projectTextSearch.noResults): The center pane Text Search\n# message when the query did not match any text of all files in a project.\nprojectTextSearch.noResults=No results found\n\n# LOCALIZATION NOTE (sources.noSourcesAvailable): Text shown when the debugger\n# does not have any sources.\nsources.noSourcesAvailable=This page has no sources\n\n# LOCALIZATION NOTE (sourceSearch.search.key2): Key shortcut to open the search\n# for searching within a the currently opened files in the editor\nsourceSearch.search.key2=CmdOrCtrl+F\n\n# LOCALIZATION NOTE (sourceSearch.search.placeholder): placeholder text in\n# the source search input bar\nsourceSearch.search.placeholder=Search in file…\n\n# LOCALIZATION NOTE (sourceSearch.search.again.key2): Key shortcut to highlight\n# the next occurrence of the last search triggered from a source search\nsourceSearch.search.again.key2=CmdOrCtrl+G\n\n# LOCALIZATION NOTE (sourceSearch.search.againPrev.key2): Key shortcut to highlight\n# the previous occurrence of the last search triggered from a source search\nsourceSearch.search.againPrev.key2=CmdOrCtrl+Shift+G\n\n# LOCALIZATION NOTE (sourceSearch.resultsSummary1): Shows a summary of\n# the number of matches for autocomplete\nsourceSearch.resultsSummary1=%d results\n\n# LOCALIZATION NOTE (noMatchingStringsText): The text to display in the\n# global search results when there are no matching strings after filtering.\nnoMatchingStringsText=No matches found\n\n# LOCALIZATION NOTE (emptySearchText): This is the text that appears in the\n# filter text box when it is empty and the scripts container is selected.\nemptySearchText=Search scripts (%S)\n\n# LOCALIZATION NOTE (emptyVariablesFilterText): This is the text that\n# appears in the filter text box for the variables view container.\nemptyVariablesFilterText=Filter variables\n\n# LOCALIZATION NOTE (emptyPropertiesFilterText): This is the text that\n# appears in the filter text box for the editor's variables view bubble.\nemptyPropertiesFilterText=Filter properties\n\n# LOCALIZATION NOTE (searchPanelFilter): This is the text that appears in the\n# filter panel popup for the filter scripts operation.\nsearchPanelFilter=Filter scripts (%S)\n\n# LOCALIZATION NOTE (searchPanelGlobal): This is the text that appears in the\n# filter panel popup for the global search operation.\nsearchPanelGlobal=Search in all files (%S)\n\n# LOCALIZATION NOTE (searchPanelFunction): This is the text that appears in the\n# filter panel popup for the function search operation.\nsearchPanelFunction=Search for function definition (%S)\n\n# LOCALIZATION NOTE (searchPanelToken): This is the text that appears in the\n# filter panel popup for the token search operation.\nsearchPanelToken=Find in this file (%S)\n\n# LOCALIZATION NOTE (searchPanelGoToLine): This is the text that appears in the\n# filter panel popup for the line search operation.\nsearchPanelGoToLine=Go to line (%S)\n\n# LOCALIZATION NOTE (searchPanelVariable): This is the text that appears in the\n# filter panel popup for the variables search operation.\nsearchPanelVariable=Filter variables (%S)\n\n# LOCALIZATION NOTE (breakpointMenuItem): The text for all the elements that\n# are displayed in the breakpoints menu item popup.\nbreakpointMenuItem.setConditional=Configure conditional breakpoint\nbreakpointMenuItem.enableSelf=Enable breakpoint\nbreakpointMenuItem.enableSelf.accesskey=E\nbreakpointMenuItem.disableSelf=Disable breakpoint\nbreakpointMenuItem.disableSelf.accesskey=D\nbreakpointMenuItem.deleteSelf=Remove breakpoint\nbreakpointMenuItem.deleteSelf.accesskey=R\nbreakpointMenuItem.enableOthers=Enable others\nbreakpointMenuItem.enableOthers.accesskey=o\nbreakpointMenuItem.disableOthers=Disable others\nbreakpointMenuItem.disableOthers.accesskey=s\nbreakpointMenuItem.deleteOthers=Remove others\nbreakpointMenuItem.deleteOthers.accesskey=h\nbreakpointMenuItem.enableAll=Enable all breakpoints\nbreakpointMenuItem.enableAll.accesskey=b\nbreakpointMenuItem.disableAll=Disable all breakpoints\nbreakpointMenuItem.disableAll.accesskey=k\nbreakpointMenuItem.deleteAll=Remove all breakpoints\nbreakpointMenuItem.deleteAll.accesskey=a\nbreakpointMenuItem.removeCondition.label=Remove breakpoint condition\nbreakpointMenuItem.removeCondition.accesskey=c\nbreakpointMenuItem.editCondition.label=Edit breakpoint condition\nbreakpointMenuItem.editCondition.accesskey=n\n\n# LOCALIZATION NOTE (breakpoints.header): Breakpoints right sidebar pane header.\nbreakpoints.header=Breakpoints\n\n# LOCALIZATION NOTE (breakpoints.none): The text that appears when there are\n# no breakpoints present\nbreakpoints.none=No Breakpoints\n\n# LOCALIZATION NOTE (breakpoints.enable): The text that may appear as a tooltip\n# when hovering over the 'disable breakpoints' switch button in right sidebar\nbreakpoints.enable=Enable Breakpoints\n\n# LOCALIZATION NOTE (breakpoints.disable): The text that may appear as a tooltip\n# when hovering over the 'disable breakpoints' switch button in right sidebar\nbreakpoints.disable=Disable Breakpoints\n\n# LOCALIZATION NOTE (breakpoints.removeBreakpointTooltip): The tooltip that is displayed\n# for remove breakpoint button in right sidebar\nbreakpoints.removeBreakpointTooltip=Remove Breakpoint\n\n# LOCALIZATION NOTE (callStack.header): Call Stack right sidebar pane header.\ncallStack.header=Call Stack\n\n# LOCALIZATION NOTE (callStack.notPaused): Call Stack right sidebar pane\n# message when not paused.\ncallStack.notPaused=Not Paused\n\n# LOCALIZATION NOTE (callStack.collapse): Call Stack right sidebar pane\n# message to hide some of the frames that are shown.\ncallStack.collapse=Collapse Rows\n\n# LOCALIZATION NOTE (callStack.expand): Call Stack right sidebar pane\n# message to show more of the frames.\ncallStack.expand=Expand Rows\n\n# LOCALIZATION NOTE (editor.searchResults): Editor Search bar message\n# for the summarizing the selected search result. e.g. 5 of 10 results.\neditor.searchResults=%d of %d results\n\n# LOCALIZATION NOTE (sourceSearch.singleResult): Copy shown when there is one result.\neditor.singleResult=1 result\n\n# LOCALIZATION NOTE (editor.noResults): Editor Search bar message\n# for when no results found.\neditor.noResults=no results\n\n# LOCALIZATION NOTE (editor.searchResults.nextResult): Editor Search bar\n# tooltip for traversing to the Next Result\neditor.searchResults.nextResult=Next Result\n\n# LOCALIZATION NOTE (editor.searchResults.prevResult): Editor Search bar\n# tooltip for traversing to the Previous Result\neditor.searchResults.prevResult=Previous Result\n\n# LOCALIZATION NOTE (editor.searchTypeToggleTitle): Search bar title for\n# toggling search type buttons(function search, variable search)\neditor.searchTypeToggleTitle=Search for:\n\n# LOCALIZATION NOTE (editor.continueToHere.label): Editor gutter context\n# menu item for jumping to a new paused location\neditor.continueToHere.label=Continue To Here\neditor.continueToHere.accesskey=H\n\n# LOCALIZATION NOTE (editor.addBreakpoint): Editor gutter context menu item\n# for adding a breakpoint on a line.\neditor.addBreakpoint=Add Breakpoint\n\n# LOCALIZATION NOTE (editor.disableBreakpoint): Editor gutter context menu item\n# for disabling a breakpoint on a line.\neditor.disableBreakpoint=Disable Breakpoint\n\n# LOCALIZATION NOTE (editor.enableBreakpoint): Editor gutter context menu item\n# for enabling a breakpoint on a line.\neditor.enableBreakpoint=Enable Breakpoint\n\n# LOCALIZATION NOTE (editor.removeBreakpoint): Editor gutter context menu item\n# for removing a breakpoint on a line.\neditor.removeBreakpoint=Remove Breakpoint\n\n# LOCALIZATION NOTE (editor.editBreakpoint): Editor gutter context menu item\n# for setting a breakpoint condition on a line.\neditor.editBreakpoint=Edit Breakpoint\n\n# LOCALIZATION NOTE (editor.addConditionalBreakpoint): Editor gutter context\n# menu item for adding a breakpoint condition on a line.\neditor.addConditionalBreakpoint=Add Conditional Breakpoint\n\n# LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Placeholder text for\n# input element inside ConditionalPanel component\neditor.conditionalPanel.placeholder=This breakpoint will pause when the expression is true\n\n# LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Tooltip text for\n# close button inside ConditionalPanel component\neditor.conditionalPanel.close=Cancel edit breakpoint and close\n\n# LOCALIZATION NOTE (editor.jumpToMappedLocation1): Context menu item\n# for navigating to a source mapped location\neditor.jumpToMappedLocation1=Jump to %S Location\n\n# LOCALIZATION NOTE (framework.disableGrouping): This is the text that appears in the\n# context menu to disable framework grouping.\nframework.disableGrouping=Disable Framework Grouping\nframework.disableGrouping.accesskey=u\n\n# LOCALIZATION NOTE (framework.enableGrouping): This is the text that appears in the\n# context menu to enable framework grouping.\nframework.enableGrouping=Enable Framework Grouping\nframework.enableGrouping.accesskey=u\n\n# LOCALIZATION NOTE (generated): Source Map term for a server source location\ngenerated=Generated\n\n# LOCALIZATION NOTE (original): Source Map term for a debugger UI source location\noriginal=Original\n\n# LOCALIZATION NOTE (expressions.placeholder): Placeholder text for expression\n# input element\nexpressions.placeholder=Add Watch Expression\n\n# LOCALIZATION NOTE (sourceTabs.closeTab): Editor source tab context menu item\n# for closing the selected tab below the mouse.\nsourceTabs.closeTab=Close Tab\nsourceTabs.closeTab.accesskey=c\n\n# LOCALIZATION NOTE (sourceTabs.closeOtherTabs): Editor source tab context menu item\n# for closing the other tabs.\nsourceTabs.closeOtherTabs=Close Other Tabs\nsourceTabs.closeOtherTabs.accesskey=o\n\n# LOCALIZATION NOTE (sourceTabs.closeTabsToEnd): Editor source tab context menu item\n# for closing the tabs to the end (the right for LTR languages) of the selected tab.\nsourceTabs.closeTabsToEnd=Close Tabs to the Right\nsourceTabs.closeTabsToEnd.accesskey=e\n\n# LOCALIZATION NOTE (sourceTabs.closeAllTabs): Editor source tab context menu item\n# for closing all tabs.\nsourceTabs.closeAllTabs=Close All Tabs\nsourceTabs.closeAllTabs.accesskey=a\n\n# LOCALIZATION NOTE (sourceTabs.revealInTree): Editor source tab context menu item\n# for revealing source in tree.\nsourceTabs.revealInTree=Reveal in Tree\nsourceTabs.revealInTree.accesskey=r\n\n# LOCALIZATION NOTE (sourceTabs.copyLink): Editor source tab context menu item\n# for copying a link address.\nsourceTabs.copyLink=Copy Link Address\nsourceTabs.copyLink.accesskey=l\n\n# LOCALIZATION NOTE (sourceTabs.prettyPrint): Editor source tab context menu item\n# for pretty printing the source.\nsourceTabs.prettyPrint=Pretty Print Source\nsourceTabs.prettyPrint.accesskey=p\n\n# LOCALIZATION NOTE (sourceFooter.blackbox): Tooltip text associated\n# with the blackbox button\nsourceFooter.blackbox=Blackbox Source\nsourceFooter.blackbox.accesskey=B\n\n# LOCALIZATION NOTE (sourceFooter.unblackbox): Tooltip text associated\n# with the blackbox button\nsourceFooter.unblackbox=Unblackbox Source\nsourceFooter.unblackbox.accesskey=b\n\n# LOCALIZATION NOTE (sourceFooter.blackboxed): Text associated\n# with a blackboxed source\nsourceFooter.blackboxed=Blackboxed Source\n\n# LOCALIZATION NOTE (sourceFooter.codeCoverage): Text associated\n# with a code coverage button\nsourceFooter.codeCoverage=Code Coverage\n\n# LOCALIZATION NOTE (sourceTabs.closeTabButtonTooltip): The tooltip that is displayed\n# for close tab button in source tabs.\nsourceTabs.closeTabButtonTooltip=Close tab\n\n# LOCALIZATION NOTE (sourceTabs.newTabButtonTooltip): The tooltip that is displayed for\n# new tab button in source tabs.\nsourceTabs.newTabButtonTooltip=Search for sources (%S)\n\n# LOCALIZATION NOTE (scopes.header): Scopes right sidebar pane header.\nscopes.header=Scopes\n\n# LOCALIZATION NOTE (scopes.notAvailable): Scopes right sidebar pane message\n# for when the debugger is paused, but there isn't pause data.\nscopes.notAvailable=Scopes Unavailable\n\n# LOCALIZATION NOTE (scopes.notPaused): Scopes right sidebar pane message\n# for when the debugger is not paused.\nscopes.notPaused=Not Paused\n\n# LOCALIZATION NOTE (scopes.block): Refers to a block of code in\n# the scopes pane when the debugger is paused.\nscopes.block=Block\n\n# LOCALIZATION NOTE (sources.header): Sources left sidebar header\nsources.header=Sources\n\n# LOCALIZATION NOTE (outline.header): Outline left sidebar header\noutline.header=Outline\n\n# LOCALIZATION NOTE (outline.noFunctions): Outline text when there are no functions to display\noutline.noFunctions=No functions\n\n# LOCALIZATION NOTE (sources.search): Sources left sidebar prompt\n# e.g. Cmd+P to search. On a mac, we use the command unicode character.\n# On windows, it's ctrl.\nsources.search=%S to search\n\n# LOCALIZATION NOTE (watchExpressions.header): Watch Expressions right sidebar\n# pane header.\nwatchExpressions.header=Watch Expressions\n\n# LOCALIZATION NOTE (watchExpressions.refreshButton): Watch Expressions header\n# button for refreshing the expressions.\nwatchExpressions.refreshButton=Refresh\n\n# LOCALIZATION NOTE (welcome.search): The center pane welcome panel's\n# search prompt. e.g. cmd+p to search for files. On windows, it's ctrl, on\n# a mac we use the unicode character.\nwelcome.search=%S to search for sources\n\n# LOCALIZATION NOTE (welcome.findInFiles): The center pane welcome panel's\n# search prompt. e.g. cmd+f to search for files. On windows, it's ctrl+shift+f, on\n# a mac we use the unicode character.\nwelcome.findInFiles=%S to find in files\n\n# LOCALIZATION NOTE (welcome.searchFunction): Label displayed in the welcome\n# panel. %S is replaced by the keyboard shortcut to search for functions.\nwelcome.searchFunction=%S to search for functions in file\n\n# LOCALIZATION NOTE (sourceSearch.search): The center pane Source Search\n# prompt for searching for files.\nsourceSearch.search=Search sources…\n\n# LOCALIZATION NOTE (sourceSearch.noResults): The center pane Source Search\n# message when the query did not match any of the sources.\nsourceSearch.noResults2=No results found\n\n# LOCALIZATION NOTE (ignoreExceptions): The pause on exceptions button tooltip\n# when the debugger will not pause on exceptions.\nignoreExceptions=Ignore exceptions. Click to pause on uncaught exceptions\n\n# LOCALIZATION NOTE (pauseOnUncaughtExceptions): The pause on exceptions button\n# tooltip when the debugger will pause on uncaught exceptions.\npauseOnUncaughtExceptions=Pause on uncaught exceptions. Click to pause on all exceptions\n\n# LOCALIZATION NOTE (pauseOnExceptions): The pause on exceptions button tooltip\n# when the debugger will pause on all exceptions.\npauseOnExceptions=Pause on all exceptions. Click to ignore exceptions\n\n# LOCALIZATION NOTE (loadingText): The text that is displayed in the script\n# editor when the loading process has started but there is no file to display\n# yet.\nloadingText=Loading\\u2026\n\n# LOCALIZATION NOTE (errorLoadingText2): The text that is displayed in the debugger\n# viewer when there is an error loading a file\nerrorLoadingText2=Error loading this URL: %S\n\n# LOCALIZATION NOTE (addWatchExpressionText): The text that is displayed in the\n# watch expressions list to add a new item.\naddWatchExpressionText=Add watch expression\n\n# LOCALIZATION NOTE (addWatchExpressionButton): The button that is displayed in the\n# variables view popup.\naddWatchExpressionButton=Watch\n\n# LOCALIZATION NOTE (emptyVariablesText): The text that is displayed in the\n# variables pane when there are no variables to display.\nemptyVariablesText=No variables to display\n\n# LOCALIZATION NOTE (scopeLabel): The text that is displayed in the variables\n# pane as a header for each variable scope (e.g. \"Global scope, \"With scope\",\n# etc.).\nscopeLabel=%S scope\n\n# LOCALIZATION NOTE (watchExpressionsScopeLabel): The name of the watch\n# expressions scope. This text is displayed in the variables pane as a header for\n# the watch expressions scope.\nwatchExpressionsScopeLabel=Watch expressions\n\n# LOCALIZATION NOTE (globalScopeLabel): The name of the global scope. This text\n# is added to scopeLabel and displayed in the variables pane as a header for\n# the global scope.\nglobalScopeLabel=Global\n\n# LOCALIZATION NOTE (variablesViewErrorStacktrace): This is the text that is\n# shown before the stack trace in an error.\nvariablesViewErrorStacktrace=Stack trace:\n\n# LOCALIZATION NOTE (variablesViewMoreObjects): the text that is displayed\n# when you have an object preview that does not show all of the elements. At the end of the list\n# you see \"N more...\" in the web console output.\n# This is a semi-colon list of plural forms.\n# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals\n# #1 number of remaining items in the object\n# example: 3 more…\nvariablesViewMoreObjects=#1 more…;#1 more…\n\n# LOCALIZATION NOTE (variablesEditableNameTooltip): The text that is displayed\n# in the variables list on an item with an editable name.\nvariablesEditableNameTooltip=Double click to edit\n\n# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed\n# in the variables list on an item with an editable value.\nvariablesEditableValueTooltip=Click to change value\n\n# LOCALIZATION NOTE (variablesCloseButtonTooltip): The text that is displayed\n# in the variables list on an item which can be removed.\nvariablesCloseButtonTooltip=Click to remove\n\n# LOCALIZATION NOTE (variablesEditButtonTooltip): The text that is displayed\n# in the variables list on a getter or setter which can be edited.\nvariablesEditButtonTooltip=Click to set value\n\n# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed\n# in a tooltip on the \"open in inspector\" button in the the variables list for a\n# DOMNode item.\nvariablesDomNodeValueTooltip=Click to select the node in the inspector\n\n# LOCALIZATION NOTE (configurable|...|Tooltip): The text that is displayed\n# in the variables list on certain variables or properties as tooltips.\n# Expanations of what these represent can be found at the following links:\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed\n# It's probably best to keep these in English.\nconfigurableTooltip=configurable\nenumerableTooltip=enumerable\nwritableTooltip=writable\nfrozenTooltip=frozen\nsealedTooltip=sealed\nextensibleTooltip=extensible\noverriddenTooltip=overridden\nWebIDLTooltip=WebIDL\n\n# LOCALIZATION NOTE (variablesSeparatorLabel): The text that is displayed\n# in the variables list as a separator between the name and value.\nvariablesSeparatorLabel=:\n\n# LOCALIZATION NOTE (watchExpressionsSeparatorLabel2): The text that is displayed\n# in the watch expressions list as a separator between the code and evaluation.\nwatchExpressionsSeparatorLabel2=\\u0020→\n\n# LOCALIZATION NOTE (functionSearchSeparatorLabel): The text that is displayed\n# in the functions search panel as a separator between function's inferred name\n# and its real name (if available).\nfunctionSearchSeparatorLabel=←\n\n# LOCALIZATION NOTE(symbolSearch.search.functionsPlaceholder): The placeholder\n# text displayed when the user searches for functions in a file\nsymbolSearch.search.functionsPlaceholder=Search functions…\n\n# LOCALIZATION NOTE(symbolSearch.search.variablesPlaceholder): The placeholder\n# text displayed when the user searches for variables in a file\nsymbolSearch.search.variablesPlaceholder=Search variables…\n\n# LOCALIZATION NOTE(symbolSearch.search.key2): The Key Shortcut for\n# searching for a function or variable\nsymbolSearch.search.key2=CmdOrCtrl+Shift+O\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.modifiersLabel): A label\n# preceding the group of modifiers\nsymbolSearch.searchModifier.modifiersLabel=Modifiers:\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.regex): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.regex=Regex\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.caseSensitive): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.caseSensitive=Case sensitive\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.wholeWord): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.wholeWord=Whole word\n\n# LOCALIZATION NOTE (resumptionOrderPanelTitle): This is the text that appears\n# as a description in the notification panel popup, when multiple debuggers are\n# open in separate tabs and the user tries to resume them in the wrong order.\n# The substitution parameter is the URL of the last paused window that must be\n# resumed first.\nresumptionOrderPanelTitle=There are one or more paused debuggers. Please resume the most-recently paused debugger first at: %S\n\nvariablesViewOptimizedOut=(optimized away)\nvariablesViewUninitialized=(uninitialized)\nvariablesViewMissingArgs=(unavailable)\n\nanonymousSourcesLabel=Anonymous Sources\n\nexperimental=This is an experimental feature\n\n# LOCALIZATION NOTE (whyPaused.debuggerStatement): The text that is displayed\n# in a info block explaining how the debugger is currently paused due to a `debugger`\n# statement in the code\nwhyPaused.debuggerStatement=Paused on debugger statement\n\n# LOCALIZATION NOTE (whyPaused.breakpoint): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a breakpoint\nwhyPaused.breakpoint=Paused on breakpoint\n\n# LOCALIZATION NOTE (whyPaused.exception): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an exception\nwhyPaused.exception=Paused on exception\n\n# LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed\n# in a info block explaining how the debugger is currently paused while stepping\n# in or out of the stack\nwhyPaused.resumeLimit=Paused while stepping\n\n# LOCALIZATION NOTE (whyPaused.pauseOnDOMEvents): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# dom event\nwhyPaused.pauseOnDOMEvents=Paused on event listener\n\n# LOCALIZATION NOTE (whyPaused.breakpointConditionThrown): The text that is displayed\n# in an info block when evaluating a conditional breakpoint throws an error\nwhyPaused.breakpointConditionThrown=Error with conditional breakpoint\n\n# LOCALIZATION NOTE (whyPaused.xhr): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an\n# xml http request\nwhyPaused.xhr=Paused on XMLHttpRequest\n\n# LOCALIZATION NOTE (whyPaused.promiseRejection): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# promise rejection\nwhyPaused.promiseRejection=Paused on promise rejection\n\n# LOCALIZATION NOTE (whyPaused.assert): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an\n# assert\nwhyPaused.assert=Paused on assertion\n\n# LOCALIZATION NOTE (whyPaused.debugCommand): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# debugger statement\nwhyPaused.debugCommand=Paused on debugged function\n\n# LOCALIZATION NOTE (whyPaused.other): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an event\n# listener breakpoint set\nwhyPaused.other=Debugger paused\n\n# LOCALIZATION NOTE (ctrl): The text that is used for documenting\n# keyboard shortcuts that use the control key\nctrl=Ctrl\n"
+module.exports = "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n# LOCALIZATION NOTE These strings are used inside the Debugger\n# which is available from the Web Developer sub-menu -> 'Debugger'.\n# The correct localization of this file might be to keep it in\n# English, or another language commonly spoken among web developers.\n# You want to make that choice consistent across the developer tools.\n# A good criteria is the language in which you'd find the best\n# documentation on web development on the web.\n\n# LOCALIZATION NOTE (collapsePanes): This is the tooltip for the button\n# that collapses the left and right panes in the debugger UI.\ncollapsePanes=Collapse panes\n\n# LOCALIZATION NOTE (copySource): This is the text that appears in the\n# context menu to copy the selected source of file open.\ncopySource=Copy\ncopySource.accesskey=y\n\n# LOCALIZATION NOTE (copySourceUrl): This is the text that appears in the\n# context menu to copy the source URL of file open.\ncopySourceUrl=Copy source url\ncopySourceUrl.accesskey=u\n\n# LOCALIZATION NOTE (copyFunction): This is the text that appears in the\n# context menu to copy the function the user selected\ncopyFunction.label=Copy function\ncopyFunction.accesskey=F\n\n# LOCALIZATION NOTE (copyStackTrace): This is the text that appears in the\n# context menu to copy the stack trace methods, file names and row number.\ncopyStackTrace=Copy stack trace\ncopyStackTrace.accesskey=c\n\n# LOCALIZATION NOTE (expandPanes): This is the tooltip for the button\n# that expands the left and right panes in the debugger UI.\nexpandPanes=Expand panes\n\n# LOCALIZATION NOTE (pauseButtonTooltip): The tooltip that is displayed for the pause\n# button when the debugger is in a running state.\npauseButtonTooltip=Pause %S\n\n# LOCALIZATION NOTE (pausePendingButtonTooltip): The tooltip that is displayed for\n# the pause button after it's been clicked but before the next JavaScript to run.\npausePendingButtonTooltip=Waiting for next execution\n\n# LOCALIZATION NOTE (resumeButtonTooltip): The label that is displayed on the pause\n# button when the debugger is in a paused state.\nresumeButtonTooltip=Resume %S\n\n# LOCALIZATION NOTE (stepOverTooltip): The label that is displayed on the\n# button that steps over a function call.\nstepOverTooltip=Step over %S\n\n# LOCALIZATION NOTE (stepInTooltip): The label that is displayed on the\n# button that steps into a function call.\nstepInTooltip=Step in %S\n\n# LOCALIZATION NOTE (stepOutTooltip): The label that is displayed on the\n# button that steps out of a function call.\nstepOutTooltip=Step out %S\n\n# LOCALIZATION NOTE (workersHeader): The text to display in the events\n# header.\nworkersHeader=Workers\n\n# LOCALIZATION NOTE (noWorkersText): The text to display in the workers list\n# when there are no workers.\nnoWorkersText=This page has no workers.\n\n# LOCALIZATION NOTE (noSourcesText): The text to display in the sources list\n# when there are no sources.\nnoSourcesText=This page has no sources.\n\n# LOCALIZATION NOTE (noEventListenersText): The text to display in the events tab\n# when there are no events.\nnoEventListenersText=No event listeners to display.\n\n# LOCALIZATION NOTE (eventListenersHeader): The text to display in the events\n# header.\neventListenersHeader=Event listeners\n\n# LOCALIZATION NOTE (noStackFramesText): The text to display in the call stack tab\n# when there are no stack frames.\nnoStackFramesText=No stack frames to display\n\n# LOCALIZATION NOTE (eventCheckboxTooltip): The tooltip text to display when\n# the user hovers over the checkbox used to toggle an event breakpoint.\neventCheckboxTooltip=Toggle breaking on this event\n\n# LOCALIZATION NOTE (eventOnSelector): The text to display in the events tab\n# for every event item, between the event type and event selector.\neventOnSelector=on\n\n# LOCALIZATION NOTE (eventInSource): The text to display in the events tab\n# for every event item, between the event selector and listener's owner source.\neventInSource=in\n\n# LOCALIZATION NOTE (eventNodes): The text to display in the events tab when\n# an event is listened on more than one target node.\neventNodes=%S nodes\n\n# LOCALIZATION NOTE (eventNative): The text to display in the events tab when\n# a listener is added from plugins, thus getting translated to native code.\neventNative=[native code]\n\n# LOCALIZATION NOTE (*Events): The text to display in the events tab for\n# each group of sub-level event entries.\nanimationEvents=Animation\naudioEvents=Audio\nbatteryEvents=Battery\nclipboardEvents=Clipboard\ncompositionEvents=Composition\ndeviceEvents=Device\ndisplayEvents=Display\ndragAndDropEvents=Drag and Drop\ngamepadEvents=Gamepad\nindexedDBEvents=IndexedDB\ninteractionEvents=Interaction\nkeyboardEvents=Keyboard\nmediaEvents=HTML5 Media\nmouseEvents=Mouse\nmutationEvents=Mutation\nnavigationEvents=Navigation\npointerLockEvents=Pointer Lock\nsensorEvents=Sensor\nstorageEvents=Storage\ntimeEvents=Time\ntouchEvents=Touch\notherEvents=Other\n\n# LOCALIZATION NOTE (blackboxCheckboxTooltip2): The tooltip text to display when\n# the user hovers over the checkbox used to toggle blackboxing its associated\n# source.\nblackboxCheckboxTooltip2=Toggle blackboxing\n\n# LOCALIZATION NOTE (sources.search.key2): Key shortcut to open the search for\n# searching all the source files the debugger has seen.\nsources.search.key2=CmdOrCtrl+P\n\n# LOCALIZATION NOTE (sources.search.alt.key): A second key shortcut to open the\n# search for searching all the source files the debugger has seen.\nsources.search.alt.key=CmdOrCtrl+O\n\n# LOCALIZATION NOTE (projectTextSearch.key): A key shortcut to open the\n# full project text search for searching all the files the debugger has seen.\nprojectTextSearch.key=CmdOrCtrl+Shift+F\n\n# LOCALIZATION NOTE (functionSearch.key): A key shortcut to open the\n# modal for searching functions in a file.\nfunctionSearch.key=CmdOrCtrl+Shift+O\n\n# LOCALIZATION NOTE (toggleBreakpoint.key): A key shortcut to toggle\n# breakpoints.\ntoggleBreakpoint.key=CmdOrCtrl+B\n\n# LOCALIZATION NOTE (toggleCondPanel.key): A key shortcut to toggle\n# the conditional breakpoint panel.\ntoggleCondPanel.key=CmdOrCtrl+Shift+B\n\n# LOCALIZATION NOTE (stepOut.key): A key shortcut to\n# step out.\nstepOut.key=Shift+F11\n\n# LOCALIZATION NOTE (shortcuts.header.editor): Sections header in\n# the shortcuts modal for keyboard shortcuts related to editing.\nshortcuts.header.editor=Editor\n\n# LOCALIZATION NOTE (shortcuts.header.stepping): Sections header in\n# the shortcuts modal for keyboard shortcuts related to stepping.\nshortcuts.header.stepping=Stepping\n\n# LOCALIZATION NOTE (shortcuts.header.search): Sections header in\n# the shortcuts modal for keyboard shortcuts related to search.\nshortcuts.header.search=Search\n\n# LOCALIZATION NOTE (projectTextSearch.placeholder): A placeholder shown\n# when searching across all of the files in a project.\nprojectTextSearch.placeholder=Find in files…\n\n# LOCALIZATION NOTE (projectTextSearch.noResults): The center pane Text Search\n# message when the query did not match any text of all files in a project.\nprojectTextSearch.noResults=No results found\n\n# LOCALIZATION NOTE (sources.noSourcesAvailable): Text shown when the debugger\n# does not have any sources.\nsources.noSourcesAvailable=This page has no sources\n\n# LOCALIZATION NOTE (sourceSearch.search.key2): Key shortcut to open the search\n# for searching within a the currently opened files in the editor\nsourceSearch.search.key2=CmdOrCtrl+F\n\n# LOCALIZATION NOTE (sourceSearch.search.placeholder): placeholder text in\n# the source search input bar\nsourceSearch.search.placeholder=Search in file…\n\n# LOCALIZATION NOTE (sourceSearch.search.again.key2): Key shortcut to highlight\n# the next occurrence of the last search triggered from a source search\nsourceSearch.search.again.key2=CmdOrCtrl+G\n\n# LOCALIZATION NOTE (sourceSearch.search.againPrev.key2): Key shortcut to highlight\n# the previous occurrence of the last search triggered from a source search\nsourceSearch.search.againPrev.key2=CmdOrCtrl+Shift+G\n\n# LOCALIZATION NOTE (sourceSearch.resultsSummary1): Shows a summary of\n# the number of matches for autocomplete\nsourceSearch.resultsSummary1=%d results\n\n# LOCALIZATION NOTE (noMatchingStringsText): The text to display in the\n# global search results when there are no matching strings after filtering.\nnoMatchingStringsText=No matches found\n\n# LOCALIZATION NOTE (emptySearchText): This is the text that appears in the\n# filter text box when it is empty and the scripts container is selected.\nemptySearchText=Search scripts (%S)\n\n# LOCALIZATION NOTE (emptyVariablesFilterText): This is the text that\n# appears in the filter text box for the variables view container.\nemptyVariablesFilterText=Filter variables\n\n# LOCALIZATION NOTE (emptyPropertiesFilterText): This is the text that\n# appears in the filter text box for the editor's variables view bubble.\nemptyPropertiesFilterText=Filter properties\n\n# LOCALIZATION NOTE (searchPanelFilter): This is the text that appears in the\n# filter panel popup for the filter scripts operation.\nsearchPanelFilter=Filter scripts (%S)\n\n# LOCALIZATION NOTE (searchPanelGlobal): This is the text that appears in the\n# filter panel popup for the global search operation.\nsearchPanelGlobal=Search in all files (%S)\n\n# LOCALIZATION NOTE (searchPanelFunction): This is the text that appears in the\n# filter panel popup for the function search operation.\nsearchPanelFunction=Search for function definition (%S)\n\n# LOCALIZATION NOTE (searchPanelToken): This is the text that appears in the\n# filter panel popup for the token search operation.\nsearchPanelToken=Find in this file (%S)\n\n# LOCALIZATION NOTE (searchPanelGoToLine): This is the text that appears in the\n# filter panel popup for the line search operation.\nsearchPanelGoToLine=Go to line (%S)\n\n# LOCALIZATION NOTE (searchPanelVariable): This is the text that appears in the\n# filter panel popup for the variables search operation.\nsearchPanelVariable=Filter variables (%S)\n\n# LOCALIZATION NOTE (breakpointMenuItem): The text for all the elements that\n# are displayed in the breakpoints menu item popup.\nbreakpointMenuItem.setConditional=Configure conditional breakpoint\nbreakpointMenuItem.enableSelf2.label=Enable\nbreakpointMenuItem.enableSelf2.accesskey=E\nbreakpointMenuItem.disableSelf2.label=Disable\nbreakpointMenuItem.disableSelf2.accesskey=D\nbreakpointMenuItem.deleteSelf2.label=Remove\nbreakpointMenuItem.deleteSelf2.accesskey=R\nbreakpointMenuItem.enableOthers2.label=Enable others\nbreakpointMenuItem.enableOthers2.accesskey=o\nbreakpointMenuItem.disableOthers2.label=Disable others\nbreakpointMenuItem.disableOthers2.accesskey=s\nbreakpointMenuItem.deleteOthers2.label=Remove others\nbreakpointMenuItem.deleteOthers2.accesskey=h\nbreakpointMenuItem.enableAll2.label=Enable all\nbreakpointMenuItem.enableAll2.accesskey=b\nbreakpointMenuItem.disableAll2.label=Disable all\nbreakpointMenuItem.disableAll2.accesskey=k\nbreakpointMenuItem.deleteAll2.label=Remove all\nbreakpointMenuItem.deleteAll2.accesskey=a\nbreakpointMenuItem.removeCondition2.label=Remove condition\nbreakpointMenuItem.removeCondition2.accesskey=c\nbreakpointMenuItem.addCondition2.label=Add condition\nbreakpointMenuItem.addCondition2.accesskey=A\nbreakpointMenuItem.editCondition2.label=Edit condition\nbreakpointMenuItem.editCondition2.accesskey=n\nbreakpointMenuItem.enableSelf=Enable breakpoint\nbreakpointMenuItem.enableSelf.accesskey=E\nbreakpointMenuItem.disableSelf=Disable breakpoint\nbreakpointMenuItem.disableSelf.accesskey=D\nbreakpointMenuItem.deleteSelf=Remove breakpoint\nbreakpointMenuItem.deleteSelf.accesskey=R\nbreakpointMenuItem.enableOthers=Enable others\nbreakpointMenuItem.enableOthers.accesskey=o\nbreakpointMenuItem.disableOthers=Disable others\nbreakpointMenuItem.disableOthers.accesskey=s\nbreakpointMenuItem.deleteOthers=Remove others\nbreakpointMenuItem.deleteOthers.accesskey=h\nbreakpointMenuItem.enableAll=Enable all breakpoints\nbreakpointMenuItem.enableAll.accesskey=b\nbreakpointMenuItem.disableAll=Disable all breakpoints\nbreakpointMenuItem.disableAll.accesskey=k\nbreakpointMenuItem.deleteAll=Remove all breakpoints\nbreakpointMenuItem.deleteAll.accesskey=a\nbreakpointMenuItem.removeCondition.label=Remove breakpoint condition\nbreakpointMenuItem.removeCondition.accesskey=c\nbreakpointMenuItem.editCondition.label=Edit breakpoint condition\nbreakpointMenuItem.editCondition.accesskey=n\n\n# LOCALIZATION NOTE (breakpoints.header): Breakpoints right sidebar pane header.\nbreakpoints.header=Breakpoints\n\n# LOCALIZATION NOTE (breakpoints.none): The text that appears when there are\n# no breakpoints present\nbreakpoints.none=No breakpoints\n\n# LOCALIZATION NOTE (breakpoints.enable): The text that may appear as a tooltip\n# when hovering over the 'disable breakpoints' switch button in right sidebar\nbreakpoints.enable=Enable breakpoints\n\n# LOCALIZATION NOTE (breakpoints.disable): The text that may appear as a tooltip\n# when hovering over the 'disable breakpoints' switch button in right sidebar\nbreakpoints.disable=Disable breakpoints\n\n# LOCALIZATION NOTE (breakpoints.removeBreakpointTooltip): The tooltip that is displayed\n# for remove breakpoint button in right sidebar\nbreakpoints.removeBreakpointTooltip=Remove breakpoint\n\n# LOCALIZATION NOTE (callStack.header): Call Stack right sidebar pane header.\ncallStack.header=Call stack\n\n# LOCALIZATION NOTE (callStack.notPaused): Call Stack right sidebar pane\n# message when not paused.\ncallStack.notPaused=Not paused\n\n# LOCALIZATION NOTE (callStack.collapse): Call Stack right sidebar pane\n# message to hide some of the frames that are shown.\ncallStack.collapse=Collapse rows\n\n# LOCALIZATION NOTE (callStack.expand): Call Stack right sidebar pane\n# message to show more of the frames.\ncallStack.expand=Expand rows\n\n# LOCALIZATION NOTE (editor.searchResults): Editor Search bar message\n# for the summarizing the selected search result. e.g. 5 of 10 results.\neditor.searchResults=%d of %d results\n\n# LOCALIZATION NOTE (sourceSearch.singleResult): Copy shown when there is one result.\neditor.singleResult=1 result\n\n# LOCALIZATION NOTE (editor.noResults): Editor Search bar message\n# for when no results found.\neditor.noResults=No results\n\n# LOCALIZATION NOTE (editor.searchResults.nextResult): Editor Search bar\n# tooltip for traversing to the Next Result\neditor.searchResults.nextResult=Next result\n\n# LOCALIZATION NOTE (editor.searchResults.prevResult): Editor Search bar\n# tooltip for traversing to the Previous Result\neditor.searchResults.prevResult=Previous result\n\n# LOCALIZATION NOTE (editor.searchTypeToggleTitle): Search bar title for\n# toggling search type buttons(function search, variable search)\neditor.searchTypeToggleTitle=Search for:\n\n# LOCALIZATION NOTE (editor.continueToHere.label): Editor gutter context\n# menu item for jumping to a new paused location\neditor.continueToHere.label=Continue to here\neditor.continueToHere.accesskey=H\n\n# LOCALIZATION NOTE (editor.addBreakpoint): Editor gutter context menu item\n# for adding a breakpoint on a line.\neditor.addBreakpoint=Add breakpoint\n\n# LOCALIZATION NOTE (editor.disableBreakpoint): Editor gutter context menu item\n# for disabling a breakpoint on a line.\neditor.disableBreakpoint=Disable breakpoint\n\n# LOCALIZATION NOTE (editor.enableBreakpoint): Editor gutter context menu item\n# for enabling a breakpoint on a line.\neditor.enableBreakpoint=Enable breakpoint\n\n# LOCALIZATION NOTE (editor.removeBreakpoint): Editor gutter context menu item\n# for removing a breakpoint on a line.\neditor.removeBreakpoint=Remove breakpoint\n\n# LOCALIZATION NOTE (editor.editBreakpoint): Editor gutter context menu item\n# for setting a breakpoint condition on a line.\neditor.editBreakpoint=Edit breakpoint\n\n# LOCALIZATION NOTE (editor.addConditionalBreakpoint): Editor gutter context\n# menu item for adding a breakpoint condition on a line.\neditor.addConditionalBreakpoint=Add conditional breakpoint\n\n# LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Placeholder text for\n# input element inside ConditionalPanel component\neditor.conditionalPanel.placeholder=This breakpoint will pause when the expression is true\n\n# LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Tooltip text for\n# close button inside ConditionalPanel component\neditor.conditionalPanel.close=Cancel edit breakpoint and close\n\n# LOCALIZATION NOTE (editor.jumpToMappedLocation1): Context menu item\n# for navigating to a source mapped location\neditor.jumpToMappedLocation1=Jump to %S location\n\n# LOCALIZATION NOTE (framework.disableGrouping): This is the text that appears in the\n# context menu to disable framework grouping.\nframework.disableGrouping=Disable framework grouping\nframework.disableGrouping.accesskey=u\n\n# LOCALIZATION NOTE (framework.enableGrouping): This is the text that appears in the\n# context menu to enable framework grouping.\nframework.enableGrouping=Enable framework grouping\nframework.enableGrouping.accesskey=u\n\n# LOCALIZATION NOTE (generated): Source Map term for a server source location\ngenerated=Generated\n\n# LOCALIZATION NOTE (original): Source Map term for a debugger UI source location\noriginal=original\n\n# LOCALIZATION NOTE (expressions.placeholder): Placeholder text for expression\n# input element\nexpressions.placeholder=Add watch expression\n\n# LOCALIZATION NOTE (sourceTabs.closeTab): Editor source tab context menu item\n# for closing the selected tab below the mouse.\nsourceTabs.closeTab=Close tab\nsourceTabs.closeTab.accesskey=c\n\n# LOCALIZATION NOTE (sourceTabs.closeOtherTabs): Editor source tab context menu item\n# for closing the other tabs.\nsourceTabs.closeOtherTabs=Close other tabs\nsourceTabs.closeOtherTabs.accesskey=o\n\n# LOCALIZATION NOTE (sourceTabs.closeTabsToEnd): Editor source tab context menu item\n# for closing the tabs to the end (the right for LTR languages) of the selected tab.\nsourceTabs.closeTabsToEnd=Close tabs to the right\nsourceTabs.closeTabsToEnd.accesskey=e\n\n# LOCALIZATION NOTE (sourceTabs.closeAllTabs): Editor source tab context menu item\n# for closing all tabs.\nsourceTabs.closeAllTabs=Close all tabs\nsourceTabs.closeAllTabs.accesskey=a\n\n# LOCALIZATION NOTE (sourceTabs.revealInTree): Editor source tab context menu item\n# for revealing source in tree.\nsourceTabs.revealInTree=Reveal in tree\nsourceTabs.revealInTree.accesskey=r\n\n# LOCALIZATION NOTE (sourceTabs.copyLink): Editor source tab context menu item\n# for copying a link address.\nsourceTabs.copyLink=Copy link address\nsourceTabs.copyLink.accesskey=l\n\n# LOCALIZATION NOTE (sourceTabs.prettyPrint): Editor source tab context menu item\n# for pretty printing the source.\nsourceTabs.prettyPrint=Pretty print source\nsourceTabs.prettyPrint.accesskey=p\n\n# LOCALIZATION NOTE (sourceFooter.blackbox): Tooltip text associated\n# with the blackbox button\nsourceFooter.blackbox=Blackbox source\nsourceFooter.blackbox.accesskey=B\n\n# LOCALIZATION NOTE (sourceFooter.unblackbox): Tooltip text associated\n# with the blackbox button\nsourceFooter.unblackbox=Unblackbox source\nsourceFooter.unblackbox.accesskey=b\n\n# LOCALIZATION NOTE (sourceFooter.blackboxed): Text associated\n# with a blackboxed source\nsourceFooter.blackboxed=Blackboxed source\n\n# LOCALIZATION NOTE (sourceFooter.codeCoverage): Text associated\n# with a code coverage button\nsourceFooter.codeCoverage=Code coverage\n\n# LOCALIZATION NOTE (sourceTabs.closeTabButtonTooltip): The tooltip that is displayed\n# for close tab button in source tabs.\nsourceTabs.closeTabButtonTooltip=Close tab\n\n# LOCALIZATION NOTE (sourceTabs.newTabButtonTooltip): The tooltip that is displayed for\n# new tab button in source tabs.\nsourceTabs.newTabButtonTooltip=Search for sources (%S)\n\n# LOCALIZATION NOTE (scopes.header): Scopes right sidebar pane header.\nscopes.header=Scopes\n\n# LOCALIZATION NOTE (scopes.notAvailable): Scopes right sidebar pane message\n# for when the debugger is paused, but there isn't pause data.\nscopes.notAvailable=Scopes unavailable\n\n# LOCALIZATION NOTE (scopes.notPaused): Scopes right sidebar pane message\n# for when the debugger is not paused.\nscopes.notPaused=Not paused\n\n# LOCALIZATION NOTE (scopes.block): Refers to a block of code in\n# the scopes pane when the debugger is paused.\nscopes.block=Block\n\n# LOCALIZATION NOTE (sources.header): Sources left sidebar header\nsources.header=Sources\n\n# LOCALIZATION NOTE (outline.header): Outline left sidebar header\noutline.header=Outline\n\n# LOCALIZATION NOTE (outline.noFunctions): Outline text when there are no functions to display\noutline.noFunctions=No functions\n\n# LOCALIZATION NOTE (sources.search): Sources left sidebar prompt\n# e.g. Cmd+P to search. On a mac, we use the command unicode character.\n# On windows, it's ctrl.\nsources.search=%S to search\n\n# LOCALIZATION NOTE (watchExpressions.header): Watch Expressions right sidebar\n# pane header.\nwatchExpressions.header=Watch expressions\n\n# LOCALIZATION NOTE (watchExpressions.refreshButton): Watch Expressions header\n# button for refreshing the expressions.\nwatchExpressions.refreshButton=Refresh\n\n# LOCALIZATION NOTE (welcome.search): The center pane welcome panel's\n# search prompt. e.g. cmd+p to search for files. On windows, it's ctrl, on\n# a mac we use the unicode character.\nwelcome.search=%S to search for sources\n\n# LOCALIZATION NOTE (welcome.findInFiles): The center pane welcome panel's\n# search prompt. e.g. cmd+f to search for files. On windows, it's ctrl+shift+f, on\n# a mac we use the unicode character.\nwelcome.findInFiles=%S to find in files\n\n# LOCALIZATION NOTE (welcome.searchFunction): Label displayed in the welcome\n# panel. %S is replaced by the keyboard shortcut to search for functions.\nwelcome.searchFunction=%S to search for functions in file\n\n# LOCALIZATION NOTE (sourceSearch.search): The center pane Source Search\n# prompt for searching for files.\nsourceSearch.search=Search sources…\n\n# LOCALIZATION NOTE (sourceSearch.noResults): The center pane Source Search\n# message when the query did not match any of the sources.\nsourceSearch.noResults2=No results found\n\n# LOCALIZATION NOTE (ignoreExceptions): The pause on exceptions button tooltip\n# when the debugger will not pause on exceptions.\nignoreExceptions=Ignore exceptions. Click to pause on uncaught exceptions\n\n# LOCALIZATION NOTE (pauseOnUncaughtExceptions): The pause on exceptions button\n# tooltip when the debugger will pause on uncaught exceptions.\npauseOnUncaughtExceptions=Pause on uncaught exceptions. Click to pause on all exceptions\n\n# LOCALIZATION NOTE (pauseOnExceptions): The pause on exceptions button tooltip\n# when the debugger will pause on all exceptions.\npauseOnExceptions=Pause on all exceptions. Click to ignore exceptions\n\n# LOCALIZATION NOTE (loadingText): The text that is displayed in the script\n# editor when the loading process has started but there is no file to display\n# yet.\nloadingText=Loading\\u2026\n\n# LOCALIZATION NOTE (errorLoadingText2): The text that is displayed in the debugger\n# viewer when there is an error loading a file\nerrorLoadingText2=Error loading this url: %S\n\n# LOCALIZATION NOTE (addWatchExpressionText): The text that is displayed in the\n# watch expressions list to add a new item.\naddWatchExpressionText=Add watch expression\n\n# LOCALIZATION NOTE (addWatchExpressionButton): The button that is displayed in the\n# variables view popup.\naddWatchExpressionButton=Watch\n\n# LOCALIZATION NOTE (emptyVariablesText): The text that is displayed in the\n# variables pane when there are no variables to display.\nemptyVariablesText=No variables to display\n\n# LOCALIZATION NOTE (scopeLabel): The text that is displayed in the variables\n# pane as a header for each variable scope (e.g. \"Global scope, \"With scope\",\n# etc.).\nscopeLabel=%S scope\n\n# LOCALIZATION NOTE (watchExpressionsScopeLabel): The name of the watch\n# expressions scope. This text is displayed in the variables pane as a header for\n# the watch expressions scope.\nwatchExpressionsScopeLabel=Watch expressions\n\n# LOCALIZATION NOTE (globalScopeLabel): The name of the global scope. This text\n# is added to scopeLabel and displayed in the variables pane as a header for\n# the global scope.\nglobalScopeLabel=Global\n\n# LOCALIZATION NOTE (variablesViewErrorStacktrace): This is the text that is\n# shown before the stack trace in an error.\nvariablesViewErrorStacktrace=Stack trace:\n\n# LOCALIZATION NOTE (variablesViewMoreObjects): the text that is displayed\n# when you have an object preview that does not show all of the elements. At the end of the list\n# you see \"N more...\" in the web console output.\n# This is a semi-colon list of plural forms.\n# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals\n# #1 number of remaining items in the object\n# example: 3 more…\nvariablesViewMoreObjects=#1 more…;#1 more…\n\n# LOCALIZATION NOTE (variablesEditableNameTooltip): The text that is displayed\n# in the variables list on an item with an editable name.\nvariablesEditableNameTooltip=Double click to edit\n\n# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed\n# in the variables list on an item with an editable value.\nvariablesEditableValueTooltip=Click to change value\n\n# LOCALIZATION NOTE (variablesCloseButtonTooltip): The text that is displayed\n# in the variables list on an item which can be removed.\nvariablesCloseButtonTooltip=Click to remove\n\n# LOCALIZATION NOTE (variablesEditButtonTooltip): The text that is displayed\n# in the variables list on a getter or setter which can be edited.\nvariablesEditButtonTooltip=Click to set value\n\n# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed\n# in a tooltip on the \"open in inspector\" button in the the variables list for a\n# DOMNode item.\nvariablesDomNodeValueTooltip=Click to select the node in the inspector\n\n# LOCALIZATION NOTE (configurable|...|Tooltip): The text that is displayed\n# in the variables list on certain variables or properties as tooltips.\n# Expanations of what these represent can be found at the following links:\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed\n# It's probably best to keep these in English.\nconfigurableTooltip=configurable\nenumerableTooltip=enumerable\nwritableTooltip=writable\nfrozenTooltip=frozen\nsealedTooltip=sealed\nextensibleTooltip=extensible\noverriddenTooltip=overridden\nWebIDLTooltip=WebIDL\n\n# LOCALIZATION NOTE (variablesSeparatorLabel): The text that is displayed\n# in the variables list as a separator between the name and value.\nvariablesSeparatorLabel=:\n\n# LOCALIZATION NOTE (watchExpressionsSeparatorLabel2): The text that is displayed\n# in the watch expressions list as a separator between the code and evaluation.\nwatchExpressionsSeparatorLabel2=\\u0020→\n\n# LOCALIZATION NOTE (functionSearchSeparatorLabel): The text that is displayed\n# in the functions search panel as a separator between function's inferred name\n# and its real name (if available).\nfunctionSearchSeparatorLabel=←\n\n# LOCALIZATION NOTE(symbolSearch.search.functionsPlaceholder): The placeholder\n# text displayed when the user searches for functions in a file\nsymbolSearch.search.functionsPlaceholder=Search functions…\n\n# LOCALIZATION NOTE(symbolSearch.search.variablesPlaceholder): The placeholder\n# text displayed when the user searches for variables in a file\nsymbolSearch.search.variablesPlaceholder=Search variables…\n\n# LOCALIZATION NOTE(symbolSearch.search.key2): The Key Shortcut for\n# searching for a function or variable\nsymbolSearch.search.key2=CmdOrCtrl+Shift+O\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.modifiersLabel): A label\n# preceding the group of modifiers\nsymbolSearch.searchModifier.modifiersLabel=Modifiers:\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.regex): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.regex=Regex\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.caseSensitive): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.caseSensitive=Case sensitive\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.wholeWord): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.wholeWord=Whole word\n\n# LOCALIZATION NOTE (resumptionOrderPanelTitle): This is the text that appears\n# as a description in the notification panel popup, when multiple debuggers are\n# open in separate tabs and the user tries to resume them in the wrong order.\n# The substitution parameter is the URL of the last paused window that must be\n# resumed first.\nresumptionOrderPanelTitle=There are one or more paused debuggers. Please resume the most-recently paused debugger first at: %S\n\nvariablesViewOptimizedOut=(optimized away)\nvariablesViewUninitialized=(uninitialized)\nvariablesViewMissingArgs=(unavailable)\n\nanonymousSourcesLabel=Anonymous sources\n\nexperimental=This is an experimental feature\n\n# LOCALIZATION NOTE (whyPaused.debuggerStatement): The text that is displayed\n# in a info block explaining how the debugger is currently paused due to a `debugger`\n# statement in the code\nwhyPaused.debuggerStatement=Paused on debugger statement\n\n# LOCALIZATION NOTE (whyPaused.breakpoint): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a breakpoint\nwhyPaused.breakpoint=Paused on breakpoint\n\n# LOCALIZATION NOTE (whyPaused.exception): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an exception\nwhyPaused.exception=Paused on exception\n\n# LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed\n# in a info block explaining how the debugger is currently paused while stepping\n# in or out of the stack\nwhyPaused.resumeLimit=Paused while stepping\n\n# LOCALIZATION NOTE (whyPaused.pauseOnDOMEvents): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# dom event\nwhyPaused.pauseOnDOMEvents=Paused on event listener\n\n# LOCALIZATION NOTE (whyPaused.breakpointConditionThrown): The text that is displayed\n# in an info block when evaluating a conditional breakpoint throws an error\nwhyPaused.breakpointConditionThrown=Error with conditional breakpoint\n\n# LOCALIZATION NOTE (whyPaused.xhr): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an\n# xml http request\nwhyPaused.xhr=Paused on XMLHttpRequest\n\n# LOCALIZATION NOTE (whyPaused.promiseRejection): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# promise rejection\nwhyPaused.promiseRejection=Paused on promise rejection\n\n# LOCALIZATION NOTE (whyPaused.assert): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an\n# assert\nwhyPaused.assert=Paused on assertion\n\n# LOCALIZATION NOTE (whyPaused.debugCommand): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# debugger statement\nwhyPaused.debugCommand=Paused on debugged function\n\n# LOCALIZATION NOTE (whyPaused.other): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an event\n# listener breakpoint set\nwhyPaused.other=Debugger paused\n\n# LOCALIZATION NOTE (ctrl): The text that is used for documenting\n# keyboard shortcuts that use the control key\nctrl=Ctrl\n\n# LOCALIZATION NOTE (anonymous): The text that is displayed when the\n# display name is null.\nanonymous=(anonymous)\n\n# LOCALIZATION NOTE (shortcuts.toggleBreakpoint): text describing\n# keyboard shortcut action for toggling breakpoint\nshortcuts.toggleBreakpoint=Toggle Breakpoint\n\n# LOCALIZATION NOTE (shortcuts.toggleCondPanel): text describing\n# keyboard shortcut action for toggling conditional panel keyboard\nshortcuts.toggleCondPanel=Toggle Conditional Panel\n\n# LOCALIZATION NOTE (shortcuts.pauseOrResume): text describing\n# keyboard shortcut action for pause of resume\nshortcuts.pauseOrResume=Pause/Resume\n\n# LOCALIZATION NOTE (shortcuts.stepOver): text describing\n# keyboard shortcut action for stepping over\nshortcuts.stepOver=Step Over\n\n# LOCALIZATION NOTE (shortcuts.stepIn): text describing\n# keyboard shortcut action for stepping in\nshortcuts.stepIn=Step In\n\n# LOCALIZATION NOTE (shortcuts.stepOut): text describing\n# keyboard shortcut action for stepping out\nshortcuts.stepOut=Step Out\n\n# LOCALIZATION NOTE (shortcuts.fileSearch): text describing\n# keyboard shortcut action for source file search\nshortcuts.fileSearch=Source File Search\n\n# LOCALIZATION NOTE (shortcuts.searchAgain): text describing\n# keyboard shortcut action for searching again\nshortcuts.searchAgain=Search Again\n\n# LOCALIZATION NOTE (shortcuts.projectSearch): text describing\n# keyboard shortcut action for full project search\nshortcuts.projectSearch=Full Project Search\n\n# LOCALIZATION NOTE (shortcuts.functionSearch): text describing\n# keyboard shortcut action for function search\nshortcuts.functionSearch=Function Search\n"
 
 /***/ }),
 /* 961 */,
 /* 962 */
 /***/ (function(module, exports) {
 
 // removed by extract-text-webpack-plugin
 
@@ -40940,18 +40932,16 @@ Frames.propTypes = {
   frameworkGroupingOn: _react.PropTypes.bool.isRequired,
   toggleFrameworkGrouping: _react.PropTypes.func.isRequired,
   selectedFrame: _react.PropTypes.object,
   selectFrame: _react.PropTypes.func.isRequired,
   toggleBlackBox: _react.PropTypes.func,
   pause: _react.PropTypes.object
 };
 
-Frames.displayName = "Frames";
-
 function getSourceForFrame(sources, frame) {
   return (0, _selectors.getSourceInSources)(sources, frame.location.sourceId);
 }
 
 function appendSource(sources, frame) {
   return Object.assign({}, frame, {
     source: getSourceForFrame(sources, frame).toJS()
   });
@@ -41016,18 +41006,16 @@ function FrameTitle(_ref) {
   var displayName = (0, _frame.formatDisplayName)(frame, options);
   return _react2.default.createElement(
     "div",
     { className: "title" },
     displayName
   );
 }
 
-FrameTitle.displayName = "FrameTitle";
-
 function FrameLocation(_ref2) {
   var frame = _ref2.frame;
 
   if (!frame.source) {
     return;
   }
 
   if (frame.library) {
@@ -41685,20 +41673,16 @@ class HighlightLines extends _react.Comp
       });
     });
   }
 
   render() {
     return null;
   }
 }
-
-
-HighlightLines.displayName = "HighlightLines";
-
 exports.default = HighlightLines;
 
 /***/ }),
 /* 1026 */,
 /* 1027 */,
 /* 1028 */,
 /* 1029 */
 /***/ (function(module, exports, __webpack_require__) {
@@ -41729,18 +41713,16 @@ var BracketArrow = (_ref) => {
       bottom = _ref.bottom;
 
   return _react2.default.createElement("div", {
     className: (0, _classnames2.default)("bracket-arrow", orientation || "up"),
     style: { left, top, bottom }
   });
 };
 
-BracketArrow.displayName = "BracketArrow";
-
 exports.default = BracketArrow;
 
 /***/ }),
 /* 1030 */,
 /* 1031 */,
 /* 1032 */
 /***/ (function(module, exports, __webpack_require__) {
 
@@ -41865,38 +41847,32 @@ module.exports = "<svg viewBox=\"0 0 14 
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.getClosestFunction = exports.findScopeByName = exports.getASTLocation = undefined;
+exports.findScopeByName = exports.getASTLocation = undefined;
 
 var _astBreakpointLocation = __webpack_require__(804);
 
 Object.defineProperty(exports, "getASTLocation", {
   enumerable: true,
   get: function () {
     return _astBreakpointLocation.getASTLocation;
   }
 });
 Object.defineProperty(exports, "findScopeByName", {
   enumerable: true,
   get: function () {
     return _astBreakpointLocation.findScopeByName;
   }
 });
-Object.defineProperty(exports, "getClosestFunction", {
-  enumerable: true,
-  get: function () {
-    return _astBreakpointLocation.getClosestFunction;
-  }
-});
 exports.firstString = firstString;
 exports.locationMoved = locationMoved;
 exports.makeLocationId = makeLocationId;
 exports.makePendingLocationId = makePendingLocationId;
 exports.assertBreakpoint = assertBreakpoint;
 exports.assertPendingBreakpoint = assertPendingBreakpoint;
 exports.assertLocation = assertLocation;
 exports.assertPendingLocation = assertPendingLocation;
@@ -42462,16 +42438,18 @@ var _ManagedTree2 = _interopRequireDefau
 var _SearchInput = __webpack_require__(377);
 
 var _SearchInput2 = _interopRequireDefault(_SearchInput);
 
 __webpack_require__(866);
 
 var _sourcesTree = __webpack_require__(39);
 
+var _highlight = __webpack_require__(1184);
+
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class TextSearch extends _react.Component {
   constructor(props) {
     super(props);
     this.state = {
       inputValue: this.props.query || ""
     };
@@ -42590,41 +42568,17 @@ class TextSearch extends _react.Componen
         { className: "line-number", key: match.line },
         match.line
       ),
       this.renderMatchValue(match)
     );
   }
 
   renderMatchValue(lineMatch) {
-    var value = lineMatch.value,
-        column = lineMatch.column,
-        match = lineMatch.match;
-
-    var len = match.length;
-
-    return _react2.default.createElement(
-      "span",
-      { className: "line-value" },
-      _react2.default.createElement(
-        "span",
-        { className: "line-match", key: 0 },
-        value.slice(0, column)
-      ),
-      _react2.default.createElement(
-        "span",
-        { className: "query-match", key: 1 },
-        value.substr(column, len)
-      ),
-      _react2.default.createElement(
-        "span",
-        { className: "line-match", key: 2 },
-        value.slice(column + len, value.length)
-      )
-    );
+    return (0, _highlight.highlightMatches)(lineMatch);
   }
 
   renderResults() {
     var results = this.getResults();
     results = results.filter(result => result.matches.length > 0);
     function getFilePath(item, index) {
       return item.filepath ? `${item.sourceId}-${index}` : `${item.sourceId}-${item.line}-${item.column}-${index}`;
     }
@@ -42701,18 +42655,16 @@ TextSearch.propTypes = {
   selectSource: _react.PropTypes.func,
   searchBottomBar: _react.PropTypes.object
 };
 
 TextSearch.contextTypes = {
   shortcuts: _react.PropTypes.object
 };
 
-TextSearch.displayName = "TextSearch";
-
 /***/ }),
 /* 1065 */,
 /* 1066 */,
 /* 1067 */,
 /* 1068 */,
 /* 1069 */,
 /* 1070 */,
 /* 1071 */,
@@ -42858,17 +42810,16 @@ function renderMessage(pauseInfo) {
       "div",
       { className: "message warning" },
       renderExceptionSummary(exception)
     );
   }
 
   return null;
 }
-renderMessage.displayName = "whyMessage";
 
 function renderWhyPaused(_ref) {
   var pause = _ref.pause;
 
   var reason = (0, _pause.getPauseReason)(pause);
 
   if (!reason) {
     return null;
@@ -43242,16 +43193,19 @@ function initialState() {
 
 function update() {
   var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState();
   var action = arguments[1];
 
   switch (action.type) {
     case "ADD_BREAKPOINT":
       {
+        if (action.breakpoint.hidden) {
+          return state;
+        }
         return addBreakpoint(state, action);
       }
 
     case "SYNC_BREAKPOINT":
       {
         return syncBreakpoint(state, action);
       }
 
@@ -43267,16 +43221,19 @@ function update() {
 
     case "SET_BREAKPOINT_CONDITION":
       {
         return updateBreakpoint(state, action);
       }
 
     case "REMOVE_BREAKPOINT":
       {
+        if (action.breakpoint.hidden) {
+          return state;
+        }
         return removeBreakpoint(state, action);
       }
   }
 
   return state;
 }
 
 function addBreakpoint(state, action) {
@@ -43946,18 +43903,16 @@ ProjectSearch.propTypes = {
   setSourceSearchQuery: _react.PropTypes.func,
   clearSourceSearchQuery: _react.PropTypes.func
 };
 
 ProjectSearch.contextTypes = {
   shortcuts: _react.PropTypes.object
 };
 
-ProjectSearch.displayName = "ProjectSearch";
-
 exports.default = (0, _reactRedux.connect)(state => ({
   sources: (0, _selectors.getSources)(state),
   activeSearch: (0, _selectors.getActiveSearch)(state),
   results: (0, _selectors.getTextSearchResults)(state),
   textSearchQuery: (0, _selectors.getTextSearchQuery)(state),
   sourceSearchQuery: (0, _selectors.getSourceSearchQuery)(state)
 }), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(ProjectSearch);
 
@@ -44022,18 +43977,16 @@ class SourceSearch extends _react.Compon
   }
 }
 
 exports.default = SourceSearch;
 SourceSearch.contextTypes = {
   shortcuts: _react.PropTypes.object
 };
 
-SourceSearch.displayName = "SourceSearch";
-
 /***/ }),
 /* 1142 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
@@ -44077,17 +44030,17 @@ function _interopRequireDefault(obj) { r
 class PrimaryPanes extends _react.Component {
 
   constructor(props) {
     super(props);
     this.state = { selectedPane: "sources" };
 
     this.renderShortcut = this.renderShortcut.bind(this);
     this.showPane = this.showPane.bind(this);
-    this.renderFooter = this.renderFooter.bind(this);
+    this.renderTabs = this.renderTabs.bind(this);
   }
 
   showPane(selectedPane) {
     this.setState({ selectedPane });
   }
 
   renderOutlineTabs() {
     if (!(0, _devtoolsConfig.isEnabled)("outline")) {
@@ -44116,20 +44069,20 @@ class PrimaryPanes extends _react.Compon
         }),
         onClick: () => this.showPane("outline"),
         key: "outline-tab"
       },
       outline
     )];
   }
 
-  renderFooter() {
-    return _react2.default.createElement(
-      "div",
-      { className: "source-footer" },
+  renderTabs() {
+    return _react2.default.createElement(
+      "div",
+      { className: "source-outline-tabs" },
       this.renderOutlineTabs()
     );
   }
 
   renderShortcut() {
     if (this.props.horizontal) {
       var onClick = () => {
         if (this.props.sourceSearchOn) {
@@ -44140,52 +44093,45 @@ class PrimaryPanes extends _react.Compon
       return _react2.default.createElement(
         "span",
         { className: "sources-header-info", dir: "ltr", onClick: onClick },
         L10N.getFormatStr("sources.search", (0, _text.formatKeyShortcut)(L10N.getStr("sources.search.key2")))
       );
     }
   }
 
-  renderHeader() {
-    return _react2.default.createElement(
-      "div",
-      { className: "sources-header" },
-      this.renderShortcut()
-    );
+  renderOutline() {
+    var selectSource = this.props.selectSource;
+
+
+    var outlineComp = (0, _devtoolsConfig.isEnabled)("outline") ? _react2.default.createElement(_Outline2.default, { selectSource: selectSource }) : null;
+
+    return outlineComp;
+  }
+
+  renderSources() {
+    var _props = this.props,
+        sources = _props.sources,
+        selectSource = _props.selectSource;
+
+    return _react2.default.createElement(_SourcesTree2.default, { sources: sources, selectSource: selectSource });
   }
 
   render() {
     var selectedPane = this.state.selectedPane;
-    var _props = this.props,
-        sources = _props.sources,
-        selectSource = _props.selectSource;
-
-
-    var outlineComp = (0, _devtoolsConfig.isEnabled)("outline") ? _react2.default.createElement(_Outline2.default, {
-      selectSource: selectSource,
-      isHidden: selectedPane === "sources"
-    }) : null;
+
 
     return _react2.default.createElement(
       "div",
       { className: "sources-panel" },
-      this.renderHeader(),
-      _react2.default.createElement(_SourcesTree2.default, {
-        sources: sources,
-        selectSource: selectSource,
-        isHidden: selectedPane === "outline"
-      }),
-      outlineComp,
-      this.renderFooter()
-    );
-  }
-}
-
-PrimaryPanes.displayName = "PrimaryPanes";
+      this.renderTabs(),
+      selectedPane === "sources" ? this.renderSources() : this.renderOutline()
+    );
+  }
+}
 
 exports.default = (0, _reactRedux.connect)(state => ({
   sources: (0, _selectors.getSources)(state),
   sourceSearchOn: (0, _selectors.getActiveSearch)(state) === "source"
 }), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(PrimaryPanes);
 
 /***/ }),
 /* 1143 */
@@ -44198,34 +44144,32 @@ Object.defineProperty(exports, "__esModu
   value: true
 });
 exports.loadSourceText = loadSourceText;
 
 var _promise = __webpack_require__(193);
 
 var _ast = __webpack_require__(1059);
 
-var _source = __webpack_require__(233);
-
 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"); }); }; }
 
 /**
  * @memberof actions/sources
  * @static
  */
 function loadSourceText(source) {
   return (() => {
     var _ref = _asyncToGenerator(function* (_ref2) {
       var dispatch = _ref2.dispatch,
           getState = _ref2.getState,
           client = _ref2.client,
           sourceMaps = _ref2.sourceMaps;
 
       // Fetch the source text only once.
-      if ((0, _source.isLoaded)(source)) {
+      if (source.text) {
         return Promise.resolve(source);
       }
 
       yield dispatch({
         type: "LOAD_SOURCE_TEXT",
         source: source,
         [_promise.PROMISE]: _asyncToGenerator(function* () {
           if (sourceMaps.isOriginalId(source.id)) {
@@ -44302,20 +44246,16 @@ exports.Outline = undefined;
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _redux = __webpack_require__(3);
 
 var _reactRedux = __webpack_require__(151);
 
-var _classnames = __webpack_require__(175);
-
-var _classnames2 = _interopRequireDefault(_classnames);
-
 var _actions = __webpack_require__(244);
 
 var _actions2 = _interopRequireDefault(_actions);
 
 var _selectors = __webpack_require__(242);
 
 __webpack_require__(871);
 
@@ -44369,34 +44309,30 @@ class Outline extends _react.Component {
     return _react2.default.createElement(
       "ul",
       { className: "outline-list" },
       symbols.map(func => this.renderFunction(func))
     );
   }
 
   render() {
-    var _props2 = this.props,
-        isHidden = _props2.isHidden,
-        symbols = _props2.symbols;
+    var symbols = this.props.symbols;
 
 
     var symbolsToDisplay = symbols.functions.filter(func => func.name != "anonymous");
 
     return _react2.default.createElement(
       "div",
-      { className: (0, _classnames2.default)("outline", { hidden: isHidden }) },
+      { className: "outline" },
       symbolsToDisplay.length > 0 ? this.renderFunctions(symbolsToDisplay) : this.renderPlaceholder()
     );
   }
 }
 
 exports.Outline = Outline;
-Outline.displayName = "Outline";
-
 exports.default = (0, _reactRedux.connect)(state => {
   var selectedSource = (0, _selectors.getSelectedSource)(state);
   return {
     symbols: (0, _selectors.getSymbols)(state, selectedSource && selectedSource.toJS()),
     selectedSource
   };
 }, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(Outline);
 
@@ -44465,18 +44401,16 @@ class EmptyLines extends _react.Componen
     });
   }
 
   render() {
     return null;
   }
 }
 
-EmptyLines.displayName = "EmptyLines";
-
 exports.default = (0, _reactRedux.connect)(state => {
   var selectedSource = (0, _selectors.getSelectedSource)(state);
   return {
     selectedSource,
     emptyLines: selectedSource ? (0, _selectors.getEmptyLines)(state, selectedSource.toJS()) : []
   };
 }, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(EmptyLines);
 
@@ -44534,17 +44468,16 @@ var _utils = __webpack_require__(234);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class SourcesTree extends _react.Component {
 
   constructor(props) {
     super(props);
     this.state = (0, _sourcesTree.createTree)(this.props.sources, this.props.debuggeeUrl);
-
     this.focusItem = this.focusItem.bind(this);
     this.selectItem = this.selectItem.bind(this);
     this.getIcon = this.getIcon.bind(this);
     this.onContextMenu = this.onContextMenu.bind(this);
     this.renderItem = this.renderItem.bind(this);
 
     this.queueUpdate = (0, _utils.throttle)(function () {
       if (!this.mounted) {
@@ -44636,16 +44569,20 @@ class SourcesTree extends _react.Compone
 
   selectItem(item) {
     if (!(0, _sourcesTree.nodeHasChildren)(item)) {
       this.props.selectSource(item.contents.get("id"));
     }
   }
 
   getIcon(item, depth) {
+    if (item.path === "/webpack://") {
+      return _react2.default.createElement(_Svg2.default, { name: "webpack" });
+    }
+
     if (depth === 0) {
       return _react2.default.createElement(_Svg2.default, { name: "domain" });
     }
 
     if (!(0, _sourcesTree.nodeHasChildren)(item)) {
       return _react2.default.createElement(_Svg2.default, { name: "file" });
     }
 
@@ -44705,50 +44642,56 @@ class SourcesTree extends _react.Compone
         style: { [paddingDir]: `${depth * 15}px` },
         key: item.path,
         onClick: () => {
           this.selectItem(item);
           setExpanded(item, !expanded);
         },
         onContextMenu: e => this.onContextMenu(e, item)
       },
+      arrow,
+      icon,
       _react2.default.createElement(
-        "div",
-        null,
-        arrow,
-        icon,
-        item.name
+        "span",
+        { className: "label" },
+        " ",
+        item.name,
+        " "
       )
     );
   }
 
   render() {
-    var isHidden = this.props.isHidden;
+    var _props = this.props,
+        setExpandedState = _props.setExpandedState,
+        expanded = _props.expanded;
     var _state = this.state,
         focusedItem = _state.focusedItem,
         sourceTree = _state.sourceTree,
         parentMap = _state.parentMap,
         listItems = _state.listItems,
         highlightItems = _state.highlightItems;
 
 
     var isEmpty = sourceTree.contents.length === 0;
-
     var treeProps = {
       key: isEmpty ? "empty" : "full",
       getParent: item => parentMap.get(item),
       getChildren: item => (0, _sourcesTree.nodeHasChildren)(item) ? item.contents : [],
       getRoots: () => sourceTree.contents,
       getPath: item => `${item.path}/${item.name}`,
       itemHeight: 21,
-      autoExpandDepth: 1,
+      autoExpandDepth: expanded ? 0 : 1,
       autoExpandAll: false,
       onFocus: this.focusItem,
       listItems,
       highlightItems,
+      expanded,
+      onExpand: (item, expandedState) => setExpandedState(expandedState),
+      onCollapse: (item, expandedState) => setExpandedState(expandedState),
       renderItem: this.renderItem
     };
 
     var tree = _react2.default.createElement(_ManagedTree2.default, treeProps);
 
     if (isEmpty) {
       return _react2.default.createElement(
         "div",
@@ -44760,41 +44703,38 @@ class SourcesTree extends _react.Compone
     var onKeyDown = e => {
       if (e.keyCode === 13 && focusedItem) {
         this.selectItem(focusedItem);
       }
     };
 
     return _react2.default.createElement(
       "div",
-      {
-        className: (0, _classnames2.default)("sources-list", { hidden: isHidden }),
-        onKeyDown: onKeyDown
-      },
+      { className: "sources-list", onKeyDown: onKeyDown },
       tree
     );
   }
 }
 
 SourcesTree.propTypes = {
-  isHidden: _react.PropTypes.bool,
   sources: _reactImmutableProptypes2.default.map.isRequired,
   selectSource: _react.PropTypes.func.isRequired,
   shownSource: _react.PropTypes.string,
   selectedSource: _reactImmutableProptypes2.default.map,
-  debuggeeUrl: _react.PropTypes.string.isRequired
-};
-
-SourcesTree.displayName = "SourcesTree";
+  debuggeeUrl: _react.PropTypes.string.isRequired,
+  setExpandedState: _react.PropTypes.func,
+  expanded: _react.PropTypes.any
+};
 
 exports.default = (0, _reactRedux.connect)(state => {
   return {
     shownSource: (0, _selectors.getShownSource)(state),
     selectedSource: (0, _selectors.getSelectedSource)(state),
-    debuggeeUrl: (0, _selectors.getDebuggeeUrl)(state)
+    debuggeeUrl: (0, _selectors.getDebuggeeUrl)(state),
+    expanded: (0, _selectors.getExpandedState)(state)
   };
 }, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(SourcesTree);
 
 /***/ }),
 /* 1149 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -44808,54 +44748,52 @@ exports.Workers = undefined;
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 __webpack_require__(1162);
 
 var _reactRedux = __webpack_require__(151);
 
+var _selectors = __webpack_require__(242);
+
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 class Workers extends _react.PureComponent {
+
   renderWorkers(workers) {
     return workers.map(w => _react2.default.createElement(
       "div",
-      null,
-      w
+      { className: "worker", key: w.url },
+      w.url
     ));
   }
 
   renderNoWorkersPlaceholder() {
-    return L10N.getStr("noWorkersText");
+    return _react2.default.createElement(
+      "div",
+      { className: "pane-info" },
+      L10N.getStr("noWorkersText")
+    );
   }
 
   render() {
     var workers = this.props.workers;
 
     return _react2.default.createElement(
       "div",
-      { className: "pane" },
-      _react2.default.createElement(
-        "div",
-        { className: "pane-info" },
-        workers && workers.length > 0 ? this.renderWorkers(workers) : this.renderNoWorkersPlaceholder()
-      )
+      { className: "pane workers-list" },
+      workers && workers.size > 0 ? this.renderWorkers(workers) : this.renderNoWorkersPlaceholder()
     );
   }
 }
 
 exports.Workers = Workers;
-Workers.displayName = "Workers";
-Workers.propTypes = {
-  workers: _react.PropTypes.array.isRequired
-};
-
 function mapStateToProps(state) {
-  return { workers: [] };
+  return { workers: (0, _selectors.getWorkers)(state) };
 }
 exports.default = (0, _reactRedux.connect)(mapStateToProps)(Workers);
 
 /***/ }),
 /* 1150 */,
 /* 1151 */
 /***/ (function(module, exports, __webpack_require__) {
 
@@ -45854,18 +45792,16 @@ class Breakpoints extends _react.Compone
           selectedSource: selectedSource,
           editor: editor
         });
       })
     );
   }
 }
 
-Breakpoints.displayName = "Breakpoints";
-
 exports.default = (0, _reactRedux.connect)(state => ({
   breakpoints: (0, _visibleBreakpoints2.default)(state),
   selectedSource: (0, _selectors.getSelectedSource)(state)
 }), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(Breakpoints);
 
 /***/ }),
 /* 1159 */
 /***/ (function(module, exports, __webpack_require__) {
@@ -46049,17 +45985,16 @@ class CallSites extends _react.Component
         null,
         childCallSites
       );
     });
     return sites;
   }
 }
 
-CallSites.displayName = "CallSites";
 function getCallSites(symbols, breakpoints) {
   if (!symbols || !symbols.callExpressions) {
     return;
   }
 
   var callSites = symbols.callExpressions;
 
   // NOTE: we create a breakpoint map keyed on location
@@ -46263,19 +46198,17 @@ class CallSite extends _react.Component 
     }
     this.marker.clear();
   }
 
   render() {
     return null;
   }
 }
-
 exports.default = CallSite;
-CallSite.displayName = "CallSite";
 
 /***/ }),
 /* 1168 */
 /***/ (function(module, exports) {
 
 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"); }); }; }
 
 function WorkerDispatcher() {
@@ -46737,17 +46670,16 @@ class SymbolModal extends _react.Compone
       _Modal2.default,
       { "in": enabled, handleClose: this.closeModal },
       this.renderInput(),
       this.renderResults()
     );
   }
 }
 
-SymbolModal.displayName = "SymbolModal";
 SymbolModal.contextTypes = {
   shortcuts: _react.PropTypes.object
 };
 
 function _getFormattedSymbols(state, source) {
   if (!source) {
     return { variables: [], functions: [] };
   }
@@ -46768,18 +46700,618 @@ exports.default = (0, _reactRedux.connec
     enabled: Boolean((0, _selectors.getActiveSearch)(state) === "symbol" && source),
     symbolType: (0, _selectors.getSymbolSearchType)(state),
     symbols: _getFormattedSymbols(state, source)
   };
 }, dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(SymbolModal);
 
 /***/ }),
 /* 1171 */,
-/* 1172 */,
+/* 1172 */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* 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 md5 = __webpack_require__(248);
+
+function originalToGeneratedId(originalId) {
+  const match = originalId.match(/(.*)\/originalSource/);
+  return match ? match[1] : "";
+}
+
+function generatedToOriginalId(generatedId, url) {
+  return `${generatedId}/originalSource-${md5(url)}`;
+}
+
+function isOriginalId(id) {
+  return !!id.match(/\/originalSource/);
+}
+
+function isGeneratedId(id) {
+  return !isOriginalId(id);
+}
+
+/**
+ * Trims the query part or reference identifier of a URL string, if necessary.
+ */
+function trimUrlQuery(url) {
+  let length = url.length;
+  let q1 = url.indexOf("?");
+  let q2 = url.indexOf("&");
+  let q3 = url.indexOf("#");
+  let q = Math.min(q1 != -1 ? q1 : length, q2 != -1 ? q2 : length, q3 != -1 ? q3 : length);
+
+  return url.slice(0, q);
+}
+
+// Map suffix to content type.
+const contentMap = {
+  "js": "text/javascript",
+  "jsm": "text/javascript",
+  "ts": "text/typescript",
+  "tsx": "text/typescript-jsx",
+  "jsx": "text/jsx",
+  "coffee": "text/coffeescript",
+  "elm": "text/elm",
+  "cljs": "text/x-clojure"
+};
+
+/**
+ * Returns the content type for the specified URL.  If no specific
+ * content type can be determined, "text/plain" is returned.
+ *
+ * @return String
+ *         The content type.
+ */
+function getContentType(url) {
+  url = trimUrlQuery(url);
+  let dot = url.lastIndexOf(".");
+  if (dot >= 0) {
+    let name = url.substring(dot + 1);
+    if (name in contentMap) {
+      return contentMap[name];
+    }
+  }
+  return "text/plain";
+}
+
+module.exports = {
+  originalToGeneratedId,
+  generatedToOriginalId,
+  isOriginalId,
+  isGeneratedId,
+  getContentType,
+  contentMapForTesting: contentMap
+};
+
+/***/ }),
 /* 1173 */,
 /* 1174 */
 /***/ (function(module, exports) {
 
 module.exports = "<svg xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:cc=\"http://creativecommons.org/ns#\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 400 400\" xml:space=\"preserve\" id=\"svg2\" version=\"1.1\"><metadata id=\"metadata8\"><rdf:RDF><cc:Work rdf:about><dc:format>image/svg+xml</dc:format><dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\"></dc></cc:Work></rdf:RDF></metadata><defs id=\"defs6\"></defs><g transform=\"matrix(1.3333333,0,0,-1.3333333,0,400)\" id=\"g10\"><g transform=\"translate(178.0626,235.0086)\" id=\"g12\"><path id=\"path14\" style=\"fill:#41b883;fill-opacity:1;fill-rule:nonzero;stroke:none\" d=\"M 0,0 -22.669,-39.264 -45.338,0 h -75.491 L -22.669,-170.017 75.491,0 Z\"></path></g><g transform=\"translate(178.0626,235.0086)\" id=\"g16\"><path id=\"path18\" style=\"fill:#34495e;fill-opacity:1;fill-rule:nonzero;stroke:none\" d=\"M 0,0 -22.669,-39.264 -45.338,0 H -81.565 L -22.669,-102.01 36.227,0 Z\"></path></g></g></svg>"
 
+/***/ }),
+/* 1175 */
+/***/ (function(module, exports, __webpack_require__) {
+