Merge mozilla-central to autoland a=merge on a CLOSED TREE
authorCoroiu Cristina <ccoroiu@mozilla.com>
Fri, 16 Mar 2018 01:43:13 +0200
changeset 408417 6c6b2501cc21457343fc8d87f1f5d9292ac75450
parent 408416 882a55558a68df546e06e7c9576a35045866e82a (current diff)
parent 408350 16e69d4df5dcef04f1d3f4b6fcf9284d321bce6f (diff)
child 408418 4b819da45df677dda6569d964572919657ea126d
push id33637
push usertoros@mozilla.com
push dateFri, 16 Mar 2018 09:53:55 +0000
treeherdermozilla-central@d8e8ec54ed9d [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone61.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge mozilla-central to autoland a=merge on a CLOSED TREE
browser/base/content/browser.js
browser/components/nsBrowserGlue.js
browser/components/places/content/places.js
dom/ipc/PBrowser.ipdl
dom/ipc/TabChild.h
gfx/layers/apz/public/IAPZCTreeManager.h
gfx/layers/apz/src/APZCTreeManager.cpp
gfx/layers/apz/src/APZCTreeManager.h
gfx/layers/apz/src/AsyncPanZoomController.cpp
gfx/layers/apz/src/AsyncPanZoomController.h
gfx/layers/apz/src/Axis.cpp
gfx/layers/apz/src/GestureEventListener.cpp
gfx/layers/apz/src/InputBlockState.cpp
gfx/layers/apz/util/APZThreadUtils.cpp
gfx/layers/apz/util/APZThreadUtils.h
gfx/layers/apz/util/ChromeProcessController.cpp
gfx/layers/ipc/APZCTreeManagerChild.cpp
gfx/layers/ipc/APZCTreeManagerChild.h
gfx/layers/ipc/APZCTreeManagerParent.cpp
gfx/layers/ipc/APZCTreeManagerParent.h
gfx/layers/ipc/PAPZCTreeManager.ipdl
gfx/layers/ipc/RemoteContentController.cpp
gfx/layers/ipc/RemoteContentController.h
security/nss/lib/freebl/poly1305-donna-x64-sse2-incremental-source.c
security/nss/lib/freebl/poly1305.c
security/nss/lib/freebl/poly1305.h
widget/nsBaseWidget.cpp
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -1277,17 +1277,17 @@ var gBrowserInit = {
         gBrowser.setIcon(gBrowser.selectedTab, "chrome://browser/skin/privatebrowsing/favicon.svg");
       }
     });
 
     this._setInitialFocus();
   },
 
   onLoad() {
-    gBrowser.addEventListener("DOMUpdatePageReport", gPopupBlockerObserver);
+    gBrowser.addEventListener("DOMUpdateBlockedPopups", gPopupBlockerObserver);
 
     Services.obs.addObserver(gPluginHandler.NPAPIPluginCrashed, "plugin-crashed");
 
     window.addEventListener("AppCommand", HandleAppCommandEvent, true);
 
     // These routines add message listeners. They must run before
     // loading the frame script to ensure that we don't miss any
     // message sent between when the frame script is loaded and when
--- a/browser/components/migration/MigrationUtils.jsm
+++ b/browser/components/migration/MigrationUtils.jsm
@@ -369,17 +369,20 @@ var MigratorPrototype = {
       (async function() {
         // Tell nsBrowserGlue we're importing default bookmarks.
         let browserGlue = Cc["@mozilla.org/browser/browserglue;1"].
                           getService(Ci.nsIObserver);
         browserGlue.observe(null, TOPIC_WILL_IMPORT_BOOKMARKS, "");
 
         // Import the default bookmarks. We ignore whether or not we succeed.
         await BookmarkHTMLUtils.importFromURL(
-          "chrome://browser/locale/bookmarks.html", true).catch(r => r);
+          "chrome://browser/locale/bookmarks.html", {
+            replace: true,
+            source: PlacesUtils.bookmarks.SOURCES.RESTORE_ON_STARTUP,
+          }).catch(Cu.reportError);
 
         // We'll tell nsBrowserGlue we've imported bookmarks, but before that
         // we need to make sure we're going to know when it's finished
         // initializing places:
         let placesInitedPromise = new Promise(resolve => {
           let onPlacesInited = function() {
             Services.obs.removeObserver(onPlacesInited, TOPIC_PLACES_DEFAULTS_FINISHED);
             resolve();
--- a/browser/components/nsBrowserGlue.js
+++ b/browser/components/nsBrowserGlue.js
@@ -1596,17 +1596,20 @@ BrowserGlue.prototype = {
 
       // If the user did not require to restore default bookmarks, or import
       // from bookmarks.html, we will try to restore from JSON
       if (importBookmarks && !restoreDefaultBookmarks && !importBookmarksHTML) {
         // get latest JSON backup
         lastBackupFile = await PlacesBackups.getMostRecentBackup();
         if (lastBackupFile) {
           // restore from JSON backup
-          await BookmarkJSONUtils.importFromFile(lastBackupFile, true);
+          await BookmarkJSONUtils.importFromFile(lastBackupFile, {
+            replace: true,
+            source: PlacesUtils.bookmarks.SOURCES.RESTORE_ON_STARTUP,
+          });
           importBookmarks = false;
         } else {
           // We have created a new database but we don't have any backup available
           importBookmarks = true;
           if (await OS.File.exists(BookmarkHTMLUtils.defaultPath)) {
             // If bookmarks.html is available in current profile import it...
             importBookmarksHTML = true;
           } else {
@@ -1644,17 +1647,20 @@ BrowserGlue.prototype = {
           bookmarksUrl = "chrome://browser/locale/bookmarks.html";
         } else if (await OS.File.exists(BookmarkHTMLUtils.defaultPath)) {
           bookmarksUrl = OS.Path.toFileURI(BookmarkHTMLUtils.defaultPath);
         }
 
         if (bookmarksUrl) {
           // Import from bookmarks.html file.
           try {
-            await BookmarkHTMLUtils.importFromURL(bookmarksUrl, true);
+            await BookmarkHTMLUtils.importFromURL(bookmarksUrl, {
+              replace: true,
+              source: PlacesUtils.bookmarks.SOURCES.RESTORE_ON_STARTUP,
+            });
           } catch (e) {
             Cu.reportError("Bookmarks.html file could be corrupt. " + e);
           }
           try {
             // Now apply distribution customized bookmarks.
             // This should always run after Places initialization.
             await this._distributionCustomizer.applyBookmarks();
             // Ensure that smart bookmarks are created once the operation is
--- a/browser/components/places/content/places.js
+++ b/browser/components/places/content/places.js
@@ -403,17 +403,17 @@ var PlacesOrganizer = {
   /**
    * Open a file-picker and import the selected file into the bookmarks store
    */
   importFromFile: function PO_importFromFile() {
     let fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
     let fpCallback = function fpCallback_done(aResult) {
       if (aResult != Ci.nsIFilePicker.returnCancel && fp.fileURL) {
         ChromeUtils.import("resource://gre/modules/BookmarkHTMLUtils.jsm");
-        BookmarkHTMLUtils.importFromURL(fp.fileURL.spec, false)
+        BookmarkHTMLUtils.importFromURL(fp.fileURL.spec)
                          .catch(Cu.reportError);
       }
     };
 
     fp.init(window, PlacesUIUtils.getString("SelectImport"),
             Ci.nsIFilePicker.modeOpen);
     fp.appendFilters(Ci.nsIFilePicker.filterHTML);
     fp.open(fpCallback);
@@ -542,17 +542,19 @@ var PlacesOrganizer = {
     // confirm ok to delete existing bookmarks
     if (!Services.prompt.confirm(null,
            PlacesUIUtils.getString("bookmarksRestoreAlertTitle"),
            PlacesUIUtils.getString("bookmarksRestoreAlert")))
       return;
 
     (async function() {
       try {
-        await BookmarkJSONUtils.importFromFile(aFilePath, true);
+        await BookmarkJSONUtils.importFromFile(aFilePath, {
+          replace: true,
+        });
       } catch (ex) {
         PlacesOrganizer._showErrorAlert(PlacesUIUtils.getString("bookmarksRestoreParseError"));
       }
     })();
   },
 
   _showErrorAlert: function PO__showErrorAlert(aMsg) {
     var brandShortName = document.getElementById("brandStrings").
--- a/browser/components/privatebrowsing/test/browser/browser_privatebrowsing_popupblocker.js
+++ b/browser/components/privatebrowsing/test/browser/browser_privatebrowsing_popupblocker.js
@@ -10,17 +10,17 @@ add_task(async function test() {
   Services.prefs.setBoolPref("dom.disable_open_during_load", true);
 
   registerCleanupFunction(() => {
     Services.prefs.setBoolPref("dom.disable_open_during_load", oldPopupPolicy);
   });
 
   function testPopupBlockerMenuItem(aExpectedDisabled, aWindow, aCallback) {
 
-    aWindow.gBrowser.addEventListener("DOMUpdatePageReport", function() {
+    aWindow.gBrowser.addEventListener("DOMUpdateBlockedPopups", function() {
       executeSoon(function() {
         let notification = aWindow.gBrowser.getNotificationBox().getNotificationWithValue("popup-blocked");
         ok(notification, "The notification box should be displayed");
 
         function checkMenuItem(callback) {
           dump("CMI: in\n");
           aWindow.document.addEventListener("popupshown", function listener(event) {
             dump("CMI: popupshown\n");
--- a/browser/extensions/activity-stream/lib/PlacesFeed.jsm
+++ b/browser/extensions/activity-stream/lib/PlacesFeed.jsm
@@ -108,17 +108,19 @@ class BookmarksObserver extends Observer
    * @param  {str} parent guid
    * @param  {int} source    Used to distinguish bookmarks made by different
    *                         actions: sync, bookmarks import, other.
    */
   onItemAdded(id, folderId, index, type, uri, bookmarkTitle, dateAdded, bookmarkGuid, parentGuid, source) { // eslint-disable-line max-params
     // Skips items that are not bookmarks (like folders), about:* pages or
     // default bookmarks, added when the profile is created.
     if (type !== PlacesUtils.bookmarks.TYPE_BOOKMARK ||
-        source === PlacesUtils.bookmarks.SOURCES.IMPORT_REPLACE ||
+        source === PlacesUtils.bookmarks.SOURCES.IMPORT ||
+        source === PlacesUtils.bookmarks.SOURCES.RESTORE ||
+        source === PlacesUtils.bookmarks.SOURCES.RESTORE_ON_STARTUP ||
         source === PlacesUtils.bookmarks.SOURCES.SYNC ||
         (uri.scheme !== "http" && uri.scheme !== "https")) {
       return;
     }
     this.dispatch({
       type: at.PLACES_BOOKMARK_ADDED,
       data: {
         bookmarkGuid,
@@ -137,17 +139,19 @@ class BookmarksObserver extends Observer
    * @param  {int} index
    * @param  {int} type       Indicates if the bookmark is an actual bookmark,
    *                          a folder, or a separator.
    * @param  {str} uri
    * @param  {str} guid      The unique id of the bookmark
    */
   onItemRemoved(id, folderId, index, type, uri, guid, parentGuid, source) { // eslint-disable-line max-params
     if (type === PlacesUtils.bookmarks.TYPE_BOOKMARK &&
-        source !== PlacesUtils.bookmarks.SOURCES.IMPORT_REPLACE &&
+        source !== PlacesUtils.bookmarks.SOURCES.IMPORT &&
+        source !== PlacesUtils.bookmarks.SOURCES.RESTORE &&
+        source !== PlacesUtils.bookmarks.SOURCES.RESTORE_ON_STARTUP &&
         source !== PlacesUtils.bookmarks.SOURCES.SYNC) {
       this.dispatch({
         type: at.PLACES_BOOKMARK_REMOVED,
         data: {url: uri.spec, bookmarkGuid: guid}
       });
     }
   }
 
--- a/browser/extensions/activity-stream/test/unit/lib/PlacesFeed.test.js
+++ b/browser/extensions/activity-stream/test/unit/lib/PlacesFeed.test.js
@@ -2,18 +2,20 @@ import {actionTypes as at} from "common/
 import {GlobalOverrider} from "test/unit/utils";
 import {PlacesFeed} from "lib/PlacesFeed.jsm";
 const {HistoryObserver, BookmarksObserver} = PlacesFeed;
 
 const FAKE_BOOKMARK = {bookmarkGuid: "xi31", bookmarkTitle: "Foo", dateAdded: 123214232, url: "foo.com"};
 const TYPE_BOOKMARK = 0; // This is fake, for testing
 const SOURCES = {
   DEFAULT: 0,
-  IMPORT_REPLACE: 3,
-  SYNC: 6
+  SYNC: 1,
+  IMPORT: 2,
+  RESTORE: 5,
+  RESTORE_ON_STARTUP: 6
 };
 
 const BLOCKED_EVENT = "newtab-linkBlocked"; // The event dispatched in NewTabUtils when a link is blocked;
 
 describe("PlacesFeed", () => {
   let globals;
   let sandbox;
   let feed;
@@ -350,21 +352,39 @@ describe("PlacesFeed", () => {
         // Yes, onItemAdded has at least 8 arguments. See function definition for docs.
         const args = [null, null, null, TYPE_BOOKMARK,
           {spec: FAKE_BOOKMARK.url, scheme: "places"}, FAKE_BOOKMARK.bookmarkTitle,
           FAKE_BOOKMARK.dateAdded, FAKE_BOOKMARK.bookmarkGuid, "", SOURCES.DEFAULT];
         await observer.onItemAdded(...args);
 
         assert.notCalled(dispatch);
       });
-      it("should not dispatch a PLACES_BOOKMARK_ADDED action - has IMPORT_REPLACE source", async () => {
+      it("should not dispatch a PLACES_BOOKMARK_ADDED action - has IMPORT source", async () => {
         // Yes, onItemAdded has at least 8 arguments. See function definition for docs.
         const args = [null, null, null, TYPE_BOOKMARK,
           {spec: FAKE_BOOKMARK.url, scheme: "http"}, FAKE_BOOKMARK.bookmarkTitle,
-          FAKE_BOOKMARK.dateAdded, FAKE_BOOKMARK.bookmarkGuid, "", SOURCES.IMPORT_REPLACE];
+          FAKE_BOOKMARK.dateAdded, FAKE_BOOKMARK.bookmarkGuid, "", SOURCES.IMPORT];
+        await observer.onItemAdded(...args);
+
+        assert.notCalled(dispatch);
+      });
+      it("should not dispatch a PLACES_BOOKMARK_ADDED action - has RESTORE source", async () => {
+        // Yes, onItemAdded has at least 8 arguments. See function definition for docs.
+        const args = [null, null, null, TYPE_BOOKMARK,
+          {spec: FAKE_BOOKMARK.url, scheme: "http"}, FAKE_BOOKMARK.bookmarkTitle,
+          FAKE_BOOKMARK.dateAdded, FAKE_BOOKMARK.bookmarkGuid, "", SOURCES.RESTORE];
+        await observer.onItemAdded(...args);
+
+        assert.notCalled(dispatch);
+      });
+      it("should not dispatch a PLACES_BOOKMARK_ADDED action - has RESTORE_ON_STARTUP source", async () => {
+        // Yes, onItemAdded has at least 8 arguments. See function definition for docs.
+        const args = [null, null, null, TYPE_BOOKMARK,
+          {spec: FAKE_BOOKMARK.url, scheme: "http"}, FAKE_BOOKMARK.bookmarkTitle,
+          FAKE_BOOKMARK.dateAdded, FAKE_BOOKMARK.bookmarkGuid, "", SOURCES.RESTORE_ON_STARTUP];
         await observer.onItemAdded(...args);
 
         assert.notCalled(dispatch);
       });
       it("should not dispatch a PLACES_BOOKMARK_ADDED action - has SYNC source", async () => {
         // Yes, onItemAdded has at least 8 arguments. See function definition for docs.
         const args = [null, null, null, TYPE_BOOKMARK,
           {spec: FAKE_BOOKMARK.url, scheme: "http"}, FAKE_BOOKMARK.bookmarkTitle,
@@ -385,18 +405,30 @@ describe("PlacesFeed", () => {
         assert.notCalled(dispatch);
       });
       it("should not dispatch a PLACES_BOOKMARK_REMOVED action - has SYNC source", async () => {
         const args = [null, null, null, TYPE_BOOKMARK, {spec: "foo.com"}, "123foo", "", SOURCES.SYNC];
         await observer.onItemRemoved(...args);
 
         assert.notCalled(dispatch);
       });
-      it("should not dispatch a PLACES_BOOKMARK_REMOVED action - has IMPORT_REPLACE source", async () => {
-        const args = [null, null, null, TYPE_BOOKMARK, {spec: "foo.com"}, "123foo", "", SOURCES.IMPORT_REPLACE];
+      it("should not dispatch a PLACES_BOOKMARK_REMOVED action - has IMPORT source", async () => {
+        const args = [null, null, null, TYPE_BOOKMARK, {spec: "foo.com"}, "123foo", "", SOURCES.IMPORT];
+        await observer.onItemRemoved(...args);
+
+        assert.notCalled(dispatch);
+      });
+      it("should not dispatch a PLACES_BOOKMARK_REMOVED action - has RESTORE source", async () => {
+        const args = [null, null, null, TYPE_BOOKMARK, {spec: "foo.com"}, "123foo", "", SOURCES.RESTORE];
+        await observer.onItemRemoved(...args);
+
+        assert.notCalled(dispatch);
+      });
+      it("should not dispatch a PLACES_BOOKMARK_REMOVED action - has RESTORE_ON_STARTUP source", async () => {
+        const args = [null, null, null, TYPE_BOOKMARK, {spec: "foo.com"}, "123foo", "", SOURCES.RESTORE_ON_STARTUP];
         await observer.onItemRemoved(...args);
 
         assert.notCalled(dispatch);
       });
       it("should dispatch a PLACES_BOOKMARK_REMOVED action with the right URL and bookmarkGuid", () => {
         observer.onItemRemoved(null, null, null, TYPE_BOOKMARK, {spec: "foo.com"}, "123foo", "", SOURCES.DEFAULT);
         assert.calledWith(dispatch, {type: at.PLACES_BOOKMARK_REMOVED, data: {bookmarkGuid: "123foo", url: "foo.com"}});
       });
--- a/browser/extensions/formautofill/test/unit/test_sync.js
+++ b/browser/extensions/formautofill/test/unit/test_sync.js
@@ -71,18 +71,19 @@ async function setup() {
   // should always start with no profiles.
   Assert.equal(profileStorage.addresses.getAll({includeDeleted: true}).length, 0);
 
   Services.prefs.setCharPref("services.sync.log.logger.engine.addresses", "Trace");
   let engine = new AddressesEngine(Service);
   await engine.initialize();
   // Avoid accidental automatic sync due to our own changes
   Service.scheduler.syncThreshold = 10000000;
+  let syncID = await engine.resetLocalSyncID();
   let server = serverForUsers({"foo": "password"}, {
-    meta: {global: {engines: {addresses: {version: engine.version, syncID: engine.syncID}}}},
+    meta: {global: {engines: {addresses: {version: engine.version, syncID}}}},
     addresses: {},
   });
 
   Service.engineManager._engines.addresses = engine;
   engine.enabled = true;
   engine._store._storage = profileStorage.addresses;
 
   generateNewKeys(Service.collectionKeys);
@@ -141,17 +142,17 @@ add_task(async function test_outgoing() 
         deleted: true,
       },
     ]);
 
     await engine._tracker.asyncObserver.promiseObserversComplete();
     // The tracker should have a score recorded for the 2 additions we had.
     equal(engine._tracker.score, SCORE_INCREMENT_XLARGE * 2);
 
-    engine.lastSync = 0;
+    await engine.setLastSync(0);
     await engine.sync();
 
     Assert.equal(collection.count(), 2);
     Assert.ok(collection.wbo(existingGUID));
     Assert.ok(collection.wbo(deletedGUID));
 
     expectLocalProfiles(profileStorage, [
       {
@@ -185,17 +186,17 @@ add_task(async function test_incoming_ne
     server.insertWBO("foo", "addresses", new ServerWBO(deletedID, encryptPayload({
       id: deletedID,
       deleted: true,
     }), Date.now() / 1000));
 
     // The tracker should start with no score.
     equal(engine._tracker.score, 0);
 
-    engine.lastSync = 0;
+    await engine.setLastSync(0);
     await engine.sync();
 
     expectLocalProfiles(profileStorage, [
       {
         guid: profileID,
       }, {
         guid: deletedID,
         deleted: true,
@@ -215,33 +216,34 @@ add_task(async function test_incoming_ne
 
 add_task(async function test_incoming_existing() {
   let {profileStorage, server, engine} = await setup();
   try {
     let guid1 = profileStorage.addresses.add(TEST_PROFILE_1);
     let guid2 = profileStorage.addresses.add(TEST_PROFILE_2);
 
     // an initial sync so we don't think they are locally modified.
-    engine.lastSync = 0;
+    await engine.setLastSync(0);
     await engine.sync();
 
     // now server records that modify the existing items.
     let modifiedEntry1 = Object.assign({}, TEST_PROFILE_1, {
       "version": 1,
       "given-name": "NewName",
     });
 
+    let lastSync = await engine.getLastSync();
     server.insertWBO("foo", "addresses", new ServerWBO(guid1, encryptPayload({
       id: guid1,
       entry: modifiedEntry1,
-    }), engine.lastSync + 10));
+    }), lastSync + 10));
     server.insertWBO("foo", "addresses", new ServerWBO(guid2, encryptPayload({
       id: guid2,
       deleted: true,
-    }), engine.lastSync + 10));
+    }), lastSync + 10));
 
     await engine.sync();
 
     expectLocalProfiles(profileStorage, [
       Object.assign({}, modifiedEntry1, {guid: guid1}),
       {guid: guid2, deleted: true},
     ]);
   } finally {
@@ -249,17 +251,17 @@ add_task(async function test_incoming_ex
   }
 });
 
 add_task(async function test_tombstones() {
   let {profileStorage, server, collection, engine} = await setup();
   try {
     let existingGUID = profileStorage.addresses.add(TEST_PROFILE_1);
 
-    engine.lastSync = 0;
+    await engine.setLastSync(0);
     await engine.sync();
 
     Assert.equal(collection.count(), 1);
     let payload = collection.payloads()[0];
     equal(payload.id, existingGUID);
     equal(payload.deleted, undefined);
 
     profileStorage.addresses.remove(existingGUID);
@@ -275,28 +277,29 @@ add_task(async function test_tombstones(
   }
 });
 
 add_task(async function test_applyIncoming_both_deleted() {
   let {profileStorage, server, engine} = await setup();
   try {
     let guid = profileStorage.addresses.add(TEST_PROFILE_1);
 
-    engine.lastSync = 0;
+    await engine.setLastSync(0);
     await engine.sync();
 
     // Delete synced record locally.
     profileStorage.addresses.remove(guid);
 
     // Delete same record remotely.
+    let lastSync = await engine.getLastSync();
     let collection = server.user("foo").collection("addresses");
     collection.insert(guid, encryptPayload({
       id: guid,
       deleted: true,
-    }), engine.lastSync + 10);
+    }), lastSync + 10);
 
     await engine.sync();
 
     ok(!profileStorage.addresses.get(guid),
       "Should not return record for locally deleted item");
 
     let localRecords = profileStorage.addresses.getAll({
       includeDeleted: true,
@@ -315,17 +318,17 @@ add_task(async function test_applyIncomi
   try {
     let guid = profileStorage.addresses._generateGUID();
     let collection = server.user("foo").collection("addresses");
     collection.insert(guid, encryptPayload({
       id: guid,
       deleted: true,
     }), Date.now() / 1000);
 
-    engine.lastSync = 0;
+    await engine.setLastSync(0);
     await engine.sync();
 
     ok(!profileStorage.addresses.get(guid),
       "Should not return record for uknown deleted item");
     let localTombstone = profileStorage.addresses.getAll({
       includeDeleted: true,
     }).find(record => record.guid == guid);
     ok(localTombstone, "Should store tombstone for unknown item");
@@ -334,25 +337,26 @@ add_task(async function test_applyIncomi
   }
 });
 
 add_task(async function test_applyIncoming_incoming_deleted() {
   let {profileStorage, server, engine} = await setup();
   try {
     let guid = profileStorage.addresses.add(TEST_PROFILE_1);
 
-    engine.lastSync = 0;
+    await engine.setLastSync(0);
     await engine.sync();
 
     // Delete the record remotely.
+    let lastSync = await engine.getLastSync();
     let collection = server.user("foo").collection("addresses");
     collection.insert(guid, encryptPayload({
       id: guid,
       deleted: true,
-    }), engine.lastSync + 10);
+    }), lastSync + 10);
 
     await engine.sync();
 
     ok(!profileStorage.addresses.get(guid), "Should delete unmodified item locally");
 
     let localTombstone = profileStorage.addresses.getAll({
       includeDeleted: true,
     }).find(record => record.guid == guid);
@@ -365,27 +369,28 @@ add_task(async function test_applyIncomi
 });
 
 add_task(async function test_applyIncoming_incoming_restored() {
   let {profileStorage, server, engine} = await setup();
   try {
     let guid = profileStorage.addresses.add(TEST_PROFILE_1);
 
     // Upload the record to the server.
-    engine.lastSync = 0;
+    await engine.setLastSync(0);
     await engine.sync();
 
     // Removing a synced record should write a tombstone.
     profileStorage.addresses.remove(guid);
 
     // Modify the deleted record remotely.
     let collection = server.user("foo").collection("addresses");
     let serverPayload = JSON.parse(JSON.parse(collection.payload(guid)).ciphertext);
     serverPayload.entry["street-address"] = "I moved!";
-    collection.insert(guid, encryptPayload(serverPayload), engine.lastSync + 10);
+    let lastSync = await engine.getLastSync();
+    collection.insert(guid, encryptPayload(serverPayload), lastSync + 10);
 
     // Sync again.
     await engine.sync();
 
     // We should replace our tombstone with the server's version.
     let localRecord = profileStorage.addresses.get(guid);
     ok(objectMatches(localRecord, {
       "given-name": "Timothy",
@@ -401,30 +406,31 @@ add_task(async function test_applyIncomi
 });
 
 add_task(async function test_applyIncoming_outgoing_restored() {
   let {profileStorage, server, engine} = await setup();
   try {
     let guid = profileStorage.addresses.add(TEST_PROFILE_1);
 
     // Upload the record to the server.
-    engine.lastSync = 0;
+    await engine.setLastSync(0);
     await engine.sync();
 
     // Modify the local record.
     let localCopy = Object.assign({}, TEST_PROFILE_1);
     localCopy["street-address"] = "I moved!";
     profileStorage.addresses.update(guid, localCopy);
 
     // Replace the record with a tombstone on the server.
+    let lastSync = await engine.getLastSync();
     let collection = server.user("foo").collection("addresses");
     collection.insert(guid, encryptPayload({
       id: guid,
       deleted: true,
-    }), engine.lastSync + 10);
+    }), lastSync + 10);
 
     // Sync again.
     await engine.sync();
 
     // We should resurrect the record on the server.
     let serverPayload = JSON.parse(JSON.parse(collection.payload(guid)).ciphertext);
     ok(!serverPayload.deleted, "Should resurrect record on server");
     ok(objectMatches(serverPayload.entry, {
@@ -449,54 +455,55 @@ add_task(async function test_reconcile_b
     let guid = profileStorage.addresses.add(TEST_PROFILE_1);
 
     // and an identical record on the server.
     server.insertWBO("foo", "addresses", new ServerWBO(guid, encryptPayload({
       id: guid,
       entry: TEST_PROFILE_1,
     }), Date.now() / 1000));
 
-    engine.lastSync = 0;
+    await engine.setLastSync(0);
     await engine.sync();
 
     expectLocalProfiles(profileStorage, [{guid}]);
   } finally {
     await cleanup(server);
   }
 });
 
 add_task(async function test_incoming_dupes() {
   let {profileStorage, server, engine} = await setup();
   try {
     // Create a profile locally, then sync to upload the new profile to the
     // server.
     let guid1 = profileStorage.addresses.add(TEST_PROFILE_1);
 
-    engine.lastSync = 0;
+    await engine.setLastSync(0);
     await engine.sync();
 
     // Create another profile locally, but don't sync it yet.
     profileStorage.addresses.add(TEST_PROFILE_2);
 
     // Now create two records on the server with the same contents as our local
     // profiles, but different GUIDs.
+    let lastSync = await engine.getLastSync();
     let guid1_dupe = Utils.makeGUID();
     server.insertWBO("foo", "addresses", new ServerWBO(guid1_dupe, encryptPayload({
       id: guid1_dupe,
       entry: Object.assign({
         version: 1,
       }, TEST_PROFILE_1),
-    }), engine.lastSync + 10));
+    }), lastSync + 10));
     let guid2_dupe = Utils.makeGUID();
     server.insertWBO("foo", "addresses", new ServerWBO(guid2_dupe, encryptPayload({
       id: guid2_dupe,
       entry: Object.assign({
         version: 1,
       }, TEST_PROFILE_2),
-    }), engine.lastSync + 10));
+    }), lastSync + 10));
 
     // Sync again. We should download `guid1_dupe` and `guid2_dupe`, then
     // reconcile changes.
     await engine.sync();
 
     expectLocalProfiles(profileStorage, [
       // We uploaded `guid1` during the first sync. Even though its contents
       // are the same as `guid1_dupe`, we keep both.
@@ -522,17 +529,17 @@ add_task(async function test_dedupe_iden
     notEqual(localGuid, remoteGuid);
     server.insertWBO("foo", "addresses", new ServerWBO(remoteGuid, encryptPayload({
       id: remoteGuid,
       entry: Object.assign({
         version: 1,
       }, TEST_PROFILE_1),
     }), Date.now() / 1000));
 
-    engine.lastSync = 0;
+    await engine.setLastSync(0);
     await engine.sync();
 
     // Should have 1 item locally with GUID changed to the remote one.
     // There's no tombstone as the original was unsynced.
     expectLocalProfiles(profileStorage, [
       {
         guid: remoteGuid,
       },
@@ -544,27 +551,28 @@ add_task(async function test_dedupe_iden
 
 add_task(async function test_dedupe_identical_synced() {
   let {profileStorage, server, engine} = await setup();
   try {
     // create a record locally.
     let localGuid = profileStorage.addresses.add(TEST_PROFILE_1);
 
     // sync it - it will no longer be a candidate for de-duping.
-    engine.lastSync = 0;
+    await engine.setLastSync(0);
     await engine.sync();
 
     // and an identical record on the server but different GUID.
+    let lastSync = await engine.getLastSync();
     let remoteGuid = Utils.makeGUID();
     server.insertWBO("foo", "addresses", new ServerWBO(remoteGuid, encryptPayload({
       id: remoteGuid,
       entry: Object.assign({
         version: 1,
       }, TEST_PROFILE_1),
-    }), engine.lastSync + 10));
+    }), lastSync + 10));
 
     await engine.sync();
 
     // Should have 2 items locally, since the first was synced.
     expectLocalProfiles(profileStorage, [
       {guid: localGuid},
       {guid: remoteGuid},
     ]);
@@ -603,17 +611,17 @@ add_task(async function test_dedupe_mult
       id: bGuid,
       entry: serverRecord,
     }), Date.now() / 1000));
     server.insertWBO("foo", "addresses", new ServerWBO(aGuid, encryptPayload({
       id: aGuid,
       entry: serverRecord,
     }), Date.now() / 1000));
 
-    engine.lastSync = 0;
+    await engine.setLastSync(0);
     await engine.sync();
 
     expectLocalProfiles(profileStorage, [
       {
         "guid": aGuid,
         "given-name": "Mark",
         "family-name": "Hammond",
         "organization": "Mozilla",
@@ -643,31 +651,32 @@ add_task(async function test_dedupe_mult
 // and if materially different, create a duplicate.
 add_task(async function test_reconcile_both_modified_conflict() {
   let {profileStorage, server, engine} = await setup();
   try {
     // create a record locally.
     let guid = profileStorage.addresses.add(TEST_PROFILE_1);
 
     // Upload the record to the server.
-    engine.lastSync = 0;
+    await engine.setLastSync(0);
     await engine.sync();
 
     strictEqual(getSyncChangeCounter(profileStorage.addresses, guid), 0,
       "Original record should be marked as syncing");
 
     // Change the same field locally and on the server.
     let localCopy = Object.assign({}, TEST_PROFILE_1);
     localCopy["street-address"] = "I moved!";
     profileStorage.addresses.update(guid, localCopy);
 
+    let lastSync = await engine.getLastSync();
     let collection = server.user("foo").collection("addresses");
     let serverPayload = JSON.parse(JSON.parse(collection.payload(guid)).ciphertext);
     serverPayload.entry["street-address"] = "I moved, too!";
-    collection.insert(guid, encryptPayload(serverPayload), engine.lastSync + 10);
+    collection.insert(guid, encryptPayload(serverPayload), lastSync + 10);
 
     // Sync again.
     await engine.sync();
 
     // Since we wait to pull changes until we're ready to upload, both records
     // should now exist on the server; we don't need a follow-up sync.
     let serverPayloads = collection.payloads();
     equal(serverPayloads.length, 2, "Both records should exist on server");
--- a/devtools/client/debugger/new/README.mozilla
+++ b/devtools/client/debugger/new/README.mozilla
@@ -1,13 +1,13 @@
 This is the debugger.html project output.
 See https://github.com/devtools-html/debugger.html
 
-Version 21.0
+Version 22.0
 
-Comparison: https://github.com/devtools-html/debugger.html/compare/release-20...release-21
+Comparison: https://github.com/devtools-html/debugger.html/compare/release-21...release-22
 
 Packages:
 - babel-plugin-transform-es2015-modules-commonjs @6.26.0
 - babel-preset-react @6.24.1
 - react @16.2.0
 - react-dom @16.2.0
 - webpack @3.11.0
--- a/devtools/client/debugger/new/debugger.css
+++ b/devtools/client/debugger/new/debugger.css
@@ -1654,34 +1654,45 @@ html[dir="rtl"] .arrow svg,
   .tree-indent:last-of-type {
   margin-inline-end: 4px;
 }
 /* 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/>. */
 
 .outline {
-  overflow-y: auto;
+  overflow-y: hidden;
+}
+
+.outline > div {
+  width: 100%;
+  position: relative;
 }
 
 .outline .outline-pane-info {
   width: 100%;
   font-style: italic;
   text-align: center;
   padding: 0.5em;
   user-select: none;
   font-size: 12px;
+  overflow: hidden;
 }
 
 .outline-list {
   list-style-type: none;
-  flex: 1 0 100%;
-  padding: 10px 0px;
+  padding: 10px 0;
   margin: 0;
   font-family: var(--monospace-font-family);
+  overflow: auto;
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 25px;
 }
 
 .outline-list__class-list {
   list-style: none;
   margin: 0;
   padding: 0;
 }
 
@@ -1721,16 +1732,37 @@ html[dir="rtl"] .arrow svg,
 .outline-list__element-icon {
   padding-right: 0.4rem;
   padding-left: 1rem;
 }
 
 .outline-list__element:hover {
   background: var(--theme-toolbar-background-hover);
 }
+
+.outline-footer {
+  background: var(--theme-body-background);
+  border-top: 1px solid var(--theme-splitter-color);
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  opacity: 1;
+  z-index: 1;
+  -moz-user-select: none;
+  user-select: none;
+  height: 25px;
+  box-sizing: border-box;
+  display: flex;
+}
+
+.outline-footer button.active {
+  background: var(--theme-highlight-blue);
+  color: #ffffff;
+}
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 
 .function-signature {
   align-self: center;
 }
 
@@ -3049,21 +3081,29 @@ html .breakpoints-list .breakpoint.pause
 }
 
 .expression-container > .tree {
   width: 100%;
   overflow: hidden;
 }
 
 :root.theme-light .expression-container:hover {
-  background-color: var(--theme-tab-toolbar-background);
+  background-color: var(--theme-selection-background-hover);
 }
 
 :root.theme-dark .expression-container:hover {
-  background-color: var(--search-overlays-semitransparent);
+  background-color: var(--theme-selection-background-hover);
+}
+
+:root.theme-firebug .expression-container:hover {
+  background-color: var(--theme-selection-background-hover);
+}
+
+.tree  .tree-node:not(.focused):hover {
+  background-color: transparent;
 }
 
 .expression-container__close-btn {
   position: absolute;
   offset-inline-end: 0px;
   top: 0px;
 }
 
@@ -3566,16 +3606,23 @@ img.resume {
 
 .command-bar.bottom > button {
   color: var(--theme-comment);
   width: 26px;
 }
 .command-bar.bottom > button:hover {
   color: var(--theme-body-color);
 }
+
+.command-bar .divider {
+  width: 1px;
+  background: var(--theme-splitter-color);
+  height: 10px;
+  margin: 11px 6px 0 6px;
+}
 /* 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/>. */
 
 .dropdown {
   --width: 150px;
   background: var(--theme-body-background);
   border: 1px solid var(--theme-splitter-color);
@@ -4128,8 +4175,13 @@ html .welcomebox .toggle-button-end.coll
   color: var(--grey-90);
   font-weight: 500;
 }
 
 .theme-dark .result-item .title .highlight,
 .theme-dark .result-item .subtitle .highlight {
   color: white;
 }
+
+.loading-indicator {
+  padding: 5px 0 5px 0;
+  text-align: center;
+}
--- a/devtools/client/debugger/new/debugger.js
+++ b/devtools/client/debugger/new/debugger.js
@@ -3875,19 +3875,30 @@ function getSourceLineCount(source) {
 function getMode(source, symbols) {
   const { contentType, text, isWasm, url } = source;
 
   if (!text || isWasm) {
     return { name: "text" };
   }
 
   if (url && url.match(/\.jsx$/i) || symbols && symbols.hasJsx) {
+    if (symbols && symbols.hasTypes) {
+      return { name: "text/typescript-jsx" };
+    }
     return { name: "jsx" };
   }
 
+  if (symbols && symbols.hasTypes) {
+    if (symbols.hasJsx) {
+      return { name: "text/typescript-jsx" };
+    }
+
+    return { name: "text/typescript" };
+  }
+
   const languageMimeMap = [{ ext: ".c", mode: "text/x-csrc" }, { ext: ".kt", mode: "text/x-kotlin" }, { ext: ".cpp", mode: "text/x-c++src" }, { ext: ".m", mode: "text/x-objectivec" }, { ext: ".rs", mode: "text/x-rustsrc" }];
 
   // check for C and other non JS languages
   if (url) {
     const result = languageMimeMap.find(({ ext }) => url.endsWith(ext));
 
     if (result !== undefined) {
       return { name: result.mode };
@@ -5806,16 +5817,26 @@ function update(state = initialBreakpoin
         return addBreakpoint(state, action);
       }
 
     case "DISABLE_BREAKPOINT":
       {
         return updateBreakpoint(state, action);
       }
 
+    case "DISABLE_ALL_BREAKPOINTS":
+      {
+        return updateAllBreakpoints(state, action);
+      }
+
+    case "ENABLE_ALL_BREAKPOINTS":
+      {
+        return updateAllBreakpoints(state, action);
+      }
+
     case "SET_BREAKPOINT_CONDITION":
       {
         return updateBreakpoint(state, action);
       }
 
     case "REMOVE_BREAKPOINT":
       {
         return removeBreakpoint(state, action);
@@ -5872,16 +5893,25 @@ function syncBreakpoint(state, data) {
 }
 
 function updateBreakpoint(state, action) {
   const { breakpoint } = action;
   const locationId = (0, _breakpoint.makeLocationId)(breakpoint.location);
   return state.setIn(["breakpoints", locationId], breakpoint);
 }
 
+function updateAllBreakpoints(state, action) {
+  const { breakpoints } = action;
+  breakpoints.forEach(breakpoint => {
+    const locationId = (0, _breakpoint.makeLocationId)(breakpoint.location);
+    state = state.setIn(["breakpoints", locationId], breakpoint);
+  });
+  return state;
+}
+
 function remapBreakpoints(state, action) {
   const breakpoints = action.breakpoints.reduce((updatedBreakpoints, breakpoint) => {
     const locationId = (0, _breakpoint.makeLocationId)(breakpoint.location);
     return _extends({}, updatedBreakpoints, { [locationId]: breakpoint });
   }, {});
 
   return state.set("breakpoints", I.Map(breakpoints));
 }
@@ -7781,25 +7811,36 @@ function disableBreakpoint(location) {
 
 /**
  * Toggle All Breakpoints
  *
  * @memberof actions/breakpoints
  * @static
  */
 function toggleAllBreakpoints(shouldDisableBreakpoints) {
-  return async ({ dispatch, getState }) => {
+  return async ({ dispatch, getState, client }) => {
     const breakpoints = (0, _selectors.getBreakpoints)(getState());
+
+    const modifiedBreakpoints = [];
+
     for (const [, breakpoint] of breakpoints) {
       if (shouldDisableBreakpoints) {
-        await dispatch(disableBreakpoint(breakpoint.location));
+        await client.removeBreakpoint(breakpoint.generatedLocation);
+        const newBreakpoint = _extends({}, breakpoint, { disabled: true });
+        modifiedBreakpoints.push(newBreakpoint);
       } else {
-        await dispatch(enableBreakpoint(breakpoint.location));
-      }
-    }
+        const newBreakpoint = _extends({}, breakpoint, { disabled: false });
+        modifiedBreakpoints.push(newBreakpoint);
+      }
+    }
+
+    return dispatch({
+      type: shouldDisableBreakpoints ? "DISABLE_ALL_BREAKPOINTS" : "ENABLE_ALL_BREAKPOINTS",
+      breakpoints: modifiedBreakpoints
+    });
   };
 }
 
 /**
  * Toggle Breakpoints
  *
  * @memberof actions/breakpoints
  * @static
@@ -8541,37 +8582,39 @@ function buildQuery(originalQuery, modif
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.Modal = exports.transitionTimeout = undefined;
 exports.default = Slide;
 
+var _propTypes = __webpack_require__(20);
+
+var _propTypes2 = _interopRequireDefault(_propTypes);
+
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _Transition = __webpack_require__(333);
 
 var _Transition2 = _interopRequireDefault(_Transition);
 
 __webpack_require__(1303);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
-
-const transitionTimeout = exports.transitionTimeout = 175;
+const transitionTimeout = exports.transitionTimeout = 175; /* 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/>. */
 
 class Modal extends _react2.default.Component {
   constructor(...args) {
     var _temp;
 
     return _temp = super(...args), this.onClick = e => {
       e.stopPropagation();
     }, _temp;
@@ -8592,17 +8635,17 @@ class Modal extends _react2.default.Comp
         this.props.children
       )
     );
   }
 }
 
 exports.Modal = Modal;
 Modal.contextTypes = {
-  shortcuts: Object
+  shortcuts: _propTypes2.default.object
 };
 
 function Slide({
   in: inProp,
   children,
   additionalClass,
   handleClose
 }) {
@@ -9987,16 +10030,26 @@ function update(state = initialPendingBr
         return addBreakpoint(state, action);
       }
 
     case "DISABLE_BREAKPOINT":
       {
         return updateBreakpoint(state, action);
       }
 
+    case "DISABLE_ALL_BREAKPOINTS":
+      {
+        return updateAllBreakpoints(state, action);
+      }
+
+    case "ENABLE_ALL_BREAKPOINTS":
+      {
+        return updateAllBreakpoints(state, action);
+      }
+
     case "SET_BREAKPOINT_CONDITION":
       {
         return updateBreakpoint(state, action);
       }
 
     case "REMOVE_BREAKPOINT":
       {
         if (action.breakpoint.hidden) {
@@ -10041,16 +10094,25 @@ function syncBreakpoint(state, action) {
 function updateBreakpoint(state, action) {
   const { breakpoint } = action;
   const locationId = (0, _breakpoint.makePendingLocationId)(breakpoint.location);
   const pendingBreakpoint = (0, _breakpoint.createPendingBreakpoint)(breakpoint);
 
   return state.setIn(["pendingBreakpoints", locationId], pendingBreakpoint);
 }
 
+function updateAllBreakpoints(state, action) {
+  const { breakpoints } = action;
+  breakpoints.forEach(breakpoint => {
+    const locationId = (0, _breakpoint.makePendingLocationId)(breakpoint.location);
+    state = state.setIn(["pendingBreakpoints", locationId], breakpoint);
+  });
+  return state;
+}
+
 function removeBreakpoint(state, action) {
   const { breakpoint } = action;
 
   const locationId = (0, _breakpoint.makePendingLocationId)(breakpoint.location);
   const pendingBp = state.getIn(["pendingBreakpoints", locationId]);
 
   if (!pendingBp && action.status == "start") {
     return state.set("pendingBreakpoints", I.Map());
@@ -22874,16 +22936,20 @@ exports.default = update;
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
+var _propTypes = __webpack_require__(20);
+
+var _propTypes2 = _interopRequireDefault(_propTypes);
+
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _reactRedux = __webpack_require__(1189);
 
 var _redux = __webpack_require__(3);
 
@@ -22936,21 +23002,19 @@ var _Tabs = __webpack_require__(1614);
 var _Tabs2 = _interopRequireDefault(_Tabs);
 
 var _QuickOpenModal = __webpack_require__(1652);
 
 var _QuickOpenModal2 = _interopRequireDefault(_QuickOpenModal);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
-
-const shortcuts = new _devtoolsModules.KeyShortcuts({ window });
+const shortcuts = new _devtoolsModules.KeyShortcuts({ window }); /* 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 { appinfo } = _devtoolsModules.Services;
 
 const isMacOS = appinfo.OS === "Darwin";
 
 const horizontalLayoutBreakpoint = window.matchMedia("(min-width: 800px)");
 const verticalLayoutBreakpoint = window.matchMedia("(min-width: 10px) and (max-width: 800px)");
 
@@ -23152,17 +23216,17 @@ class App extends _react.Component {
         shortcutsModalEnabled: this.state.shortcutsModalEnabled,
         toggleShortcutsModal: () => this.toggleShortcutsModal()
       }),
       this.renderShortcutsModal()
     );
   }
 }
 
-App.childContextTypes = { shortcuts: Object };
+App.childContextTypes = { shortcuts: _propTypes2.default.object };
 
 function mapStateToProps(state) {
   return {
     selectedSource: (0, _selectors.getSelectedSource)(state),
     startPanelCollapsed: (0, _selectors.getPaneCollapse)(state, "start"),
     endPanelCollapsed: (0, _selectors.getPaneCollapse)(state, "end"),
     activeSearch: (0, _selectors.getActiveSearch)(state),
     quickOpenEnabled: (0, _selectors.getQuickOpenEnabled)(state),
@@ -25951,16 +26015,22 @@ class PrimaryPanes extends _react.Compon
 
   constructor(props) {
     super(props);
 
     this.showPane = selectedPane => {
       this.props.setPrimaryPaneTab(selectedPane);
     };
 
+    this.onAlphabetizeClick = () => {
+      const alphabetizeOutline = !_prefs.prefs.alphabetizeOutline;
+      _prefs.prefs.alphabetizeOutline = alphabetizeOutline;
+      this.setState({ alphabetizeOutline });
+    };
+
     this.renderTabs = () => {
       return _react2.default.createElement(
         "div",
         { className: "source-outline-tabs" },
         this.renderOutlineTabs()
       );
     };
 
@@ -25974,16 +26044,20 @@ 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")))
         );
       }
     };
+
+    this.state = {
+      alphabetizeOutline: _prefs.prefs.alphabetizeOutline
+    };
   }
 
   renderOutlineTabs() {
     if (!_prefs.features.outline) {
       return;
     }
 
     const sources = (0, _text.formatKeyShortcut)(L10N.getStr("sources.header"));
@@ -26015,17 +26089,20 @@ class PrimaryPanes extends _react.Compon
 
   render() {
     const { selectedTab } = this.props;
 
     return _react2.default.createElement(
       "div",
       { className: "sources-panel" },
       this.renderTabs(),
-      selectedTab === "sources" ? _react2.default.createElement(_SourcesTree2.default, null) : _react2.default.createElement(_Outline2.default, null)
+      selectedTab === "sources" ? _react2.default.createElement(_SourcesTree2.default, null) : _react2.default.createElement(_Outline2.default, {
+        alphabetizeOutline: this.state.alphabetizeOutline,
+        onAlphabetizeClick: this.onAlphabetizeClick
+      })
     );
   }
 } /* This Source Code Form is subject to the terms of the Mozilla Public
    * License, v. 2.0. If a copy of the MPL was not distributed with this
    * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 
 exports.default = (0, _reactRedux.connect)(state => ({
   selectedTab: (0, _selectors.getSelectedPrimaryPaneTab)(state),
@@ -26149,26 +26226,50 @@ class Outline extends _react.Component {
         "ul",
         { className: "outline-list__class-list" },
         classFunctions.map(func => this.renderFunction(func))
       )
     );
   }
 
   renderFunctions(functions) {
-    const classes = (0, _lodash.uniq)(functions.map(func => func.klass));
-    const namedFunctions = functions.filter(func => func.name != "anonymous" && !func.klass && !classes.includes(func.name));
-
-    const classFunctions = functions.filter(func => func.name != "anonymous" && !!func.klass);
-
-    return _react2.default.createElement(
-      "ul",
-      { className: "outline-list" },
-      namedFunctions.map(func => this.renderFunction(func)),
-      classes.map(klass => this.renderClassFunctions(klass, classFunctions))
+    let classes = (0, _lodash.uniq)(functions.map(func => func.klass));
+    let namedFunctions = functions.filter(func => func.name != "anonymous" && !func.klass && !classes.includes(func.name));
+
+    let classFunctions = functions.filter(func => func.name != "anonymous" && !!func.klass);
+
+    if (this.props.alphabetizeOutline) {
+      namedFunctions = (0, _lodash.sortBy)(namedFunctions, "name");
+      classes = (0, _lodash.sortBy)(classes, "klass");
+      classFunctions = (0, _lodash.sortBy)(classFunctions, "name");
+    }
+
+    return _react2.default.createElement(
+      "div",
+      null,
+      _react2.default.createElement(
+        "ul",
+        { className: "outline-list" },
+        namedFunctions.map(func => this.renderFunction(func)),
+        classes.map(klass => this.renderClassFunctions(klass, classFunctions))
+      ),
+      _react2.default.createElement(
+        "div",
+        { className: "outline-footer bottom" },
+        _react2.default.createElement(
+          "button",
+          {
+            onClick: () => {
+              this.props.onAlphabetizeClick();
+            },
+            className: this.props.alphabetizeOutline ? "active" : ""
+          },
+          L10N.getStr("outline.sortLabel")
+        )
+      )
     );
   }
 
   render() {
     const { symbols } = this.props;
 
     const symbolsToDisplay = symbols.functions.filter(func => func.name != "anonymous");
 
@@ -26555,16 +26656,20 @@ exports.default = (0, _reactRedux.connec
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
+var _propTypes = __webpack_require__(20);
+
+var _propTypes2 = _interopRequireDefault(_propTypes);
+
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _reactDom = __webpack_require__(4);
 
 var _reactDom2 = _interopRequireDefault(_reactDom);
 
@@ -26649,26 +26754,28 @@ var _editor = __webpack_require__(1358);
 var _ui = __webpack_require__(1439);
 
 __webpack_require__(1332);
 
 __webpack_require__(1333);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
 const cssVars = {
   searchbarHeight: "var(--editor-searchbar-height)",
   secondSearchbarHeight: "var(--editor-second-searchbar-height)",
   footerHeight: "var(--editor-footer-height)"
 };
 
 // Redux actions
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
 
 class Editor extends _react.PureComponent {
   constructor(props) {
     super(props);
 
     this.onToggleBreakpoint = (key, e) => {
       e.preventDefault();
       e.stopPropagation();
@@ -27116,17 +27223,17 @@ class Editor extends _react.PureComponen
         style: this.getInlineEditorStyles()
       }),
       this.renderItems()
     );
   }
 }
 
 Editor.contextTypes = {
-  shortcuts: Object
+  shortcuts: _propTypes2.default.object
 };
 
 const mapStateToProps = state => {
   const selectedSource = (0, _selectors.getSelectedSource)(state);
   const sourceId = selectedSource ? selectedSource.get("id") : "";
   return {
     selectedLocation: (0, _selectors.getSelectedLocation)(state),
     selectedSource,
@@ -27369,16 +27476,20 @@ exports.default = (0, _reactRedux.connec
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
+var _propTypes = __webpack_require__(20);
+
+var _propTypes2 = _interopRequireDefault(_propTypes);
+
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _reactRedux = __webpack_require__(1189);
 
 var _redux = __webpack_require__(3);
 
@@ -27405,31 +27516,29 @@ var _SearchInput = __webpack_require__(1
 var _SearchInput2 = _interopRequireDefault(_SearchInput);
 
 var _lodash = __webpack_require__(2);
 
 __webpack_require__(1323);
 
 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/>. */
-
 function getShortcuts() {
   const searchAgainKey = L10N.getStr("sourceSearch.search.again.key2");
   const searchAgainPrevKey = L10N.getStr("sourceSearch.search.againPrev.key2");
   const searchKey = L10N.getStr("sourceSearch.search.key2");
 
   return {
     shiftSearchAgainShortcut: searchAgainPrevKey,
     searchAgainShortcut: searchAgainKey,
     searchShortcut: searchKey
   };
-}
+} /* 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/>. */
 
 class SearchBar extends _react.Component {
   constructor(props) {
     super(props);
 
     this.onEscape = e => {
       this.closeSearch(e);
     };
@@ -27676,17 +27785,17 @@ class SearchBar extends _react.Component
         { className: "search-bottom-bar" },
         this.renderSearchModifiers()
       )
     );
   }
 }
 
 SearchBar.contextTypes = {
-  shortcuts: Object
+  shortcuts: _propTypes2.default.object
 };
 
 exports.default = (0, _reactRedux.connect)(state => {
   return {
     searchOn: (0, _selectors.getActiveSearch)(state) === "file",
     selectedSource: (0, _selectors.getSelectedSource)(state),
     selectedLocation: (0, _selectors.getSelectedLocation)(state),
     query: (0, _selectors.getFileSearchQuery)(state),
@@ -31869,17 +31978,17 @@ function gutterMenu({
       click: () => toggleDisabledBreakpoint(line)
     }, breakpoint.disabled ? gutterItems.enableBreakpoint : gutterItems.disableBreakpoint);
     items.push(disableBreakpoint);
   }
 
   (0, _devtoolsContextmenu.showMenu)(event, items);
 }
 
-class GutterContextMenuComponent extends _react.PureComponent {
+class GutterContextMenuComponent extends _react.Component {
 
   constructor() {
     super();
   }
 
   shouldComponentUpdate(nextProps) {
     return nextProps.contextMenu.type === "Gutter";
   }
@@ -32093,17 +32202,17 @@ function getMenuItems(event, {
   // TODO: Find a new way to only add this for mapped sources?
   if (isTextSelected) {
     menuItems.push(watchExpressionItem, evaluateInConsoleItem);
   }
 
   return menuItems;
 }
 
-class EditorMenu extends _react.PureComponent {
+class EditorMenu extends _react.Component {
 
   constructor() {
     super();
   }
 
   shouldComponentUpdate(nextProps) {
     return nextProps.contextMenu.type === "Editor";
   }
@@ -32407,16 +32516,20 @@ exports.default = (0, _reactRedux.connec
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
+var _propTypes = __webpack_require__(20);
+
+var _propTypes2 = _interopRequireDefault(_propTypes);
+
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _reactRedux = __webpack_require__(1189);
 
 var _redux = __webpack_require__(3);
 
@@ -32479,19 +32592,21 @@ var _ChromeScopes2 = _interopRequireDefa
 var _Scopes2 = __webpack_require__(1611);
 
 var _Scopes3 = _interopRequireDefault(_Scopes2);
 
 __webpack_require__(1342);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-const Scopes = _prefs.features.chromeScopes ? _ChromeScopes2.default : _Scopes3.default; /* 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/>. */
+/* 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 Scopes = _prefs.features.chromeScopes ? _ChromeScopes2.default : _Scopes3.default;
 
 function debugBtn(onClick, type, className, tooltip) {
   return _react2.default.createElement(
     "button",
     {
       onClick: onClick,
       className: `${type} ${className}`,
       key: type,
@@ -32718,17 +32833,17 @@ class SecondaryPanes extends _react.Comp
         this.props.horizontal ? this.renderHorizontalLayout() : this.renderVerticalLayout()
       ),
       this.renderUtilsBar()
     );
   }
 }
 
 SecondaryPanes.contextTypes = {
-  shortcuts: Object
+  shortcuts: _propTypes2.default.object
 };
 
 exports.default = (0, _reactRedux.connect)(state => ({
   hasFrames: !!(0, _selectors.getTopFrame)(state),
   breakpoints: (0, _selectors.getBreakpoints)(state),
   breakpointsDisabled: (0, _selectors.getBreakpointsDisabled)(state),
   breakpointsLoading: (0, _selectors.getBreakpointsLoading)(state),
   isWaitingOnBreak: (0, _selectors.getIsWaitingOnBreak)(state),
@@ -32829,17 +32944,17 @@ function renderSourceLocation(source, li
 
   return _react2.default.createElement(
     "div",
     { className: "location" },
     `${(0, _utils.endTruncateStr)(filename, 30)}: ${bpLocation}`
   );
 }
 
-class Breakpoints extends _react.PureComponent {
+class Breakpoints extends _react.Component {
   shouldComponentUpdate(nextProps, nextState) {
     const { breakpoints } = this.props;
     return breakpoints !== nextProps.breakpoints;
   }
 
   handleCheckbox(breakpoint) {
     if (breakpoint.loading) {
       return;
@@ -32984,17 +33099,17 @@ var _Close2 = _interopRequireDefault(_Cl
 __webpack_require__(1335);
 
 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/>. */
 
-class Expressions extends _react.PureComponent {
+class Expressions extends _react.Component {
 
   constructor(props) {
     super(props);
 
     this.clear = () => {
       this.setState(() => {
         this.props.clearExpressionError();
         return { editing: false, editIndex: -1, inputValue: "" };
@@ -33042,26 +33157,29 @@ class Expressions extends _react.PureCom
       const root = {
         name: expression.input,
         path: input,
         contents: { value }
       };
 
       return _react2.default.createElement(
         "li",
-        { className: "expression-container", key: input },
+        {
+          className: "expression-container",
+          key: input,
+          onDoubleClick: (items, options) => this.editExpression(expression, index)
+        },
         _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, index, options),
             openLink: openLink,
             createObjectClient: grip => (0, _firefox.createObjectClient)(grip)
           }),
           _react2.default.createElement(
             "div",
             { className: "expression-container__close-btn" },
             _react2.default.createElement(_Close2.default, {
               handleClick: e => this.deleteExpression(e, expression)
@@ -33096,20 +33214,17 @@ class Expressions extends _react.PureCom
   componentDidUpdate(prevProps, prevState) {
     if (this._input && !prevState.editing) {
       const input = this._input;
       input.setSelectionRange(0, input.value.length);
       input.focus();
     }
   }
 
-  editExpression(expression, index, { depth }) {
-    if (depth > 0) {
-      return;
-    }
+  editExpression(expression, index) {
     this.setState({
       inputValue: expression.input,
       editing: true,
       editIndex: index
     });
   }
 
   deleteExpression(e, expression) {
@@ -33906,16 +34021,20 @@ exports.default = Accordion;
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
+var _propTypes = __webpack_require__(20);
+
+var _propTypes2 = _interopRequireDefault(_propTypes);
+
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _reactRedux = __webpack_require__(1189);
 
 var _redux = __webpack_require__(3);
 
@@ -33938,20 +34057,22 @@ var _CommandBarButton = __webpack_requir
 var _CommandBarButton2 = _interopRequireDefault(_CommandBarButton);
 
 __webpack_require__(1295);
 
 var _devtoolsModules = __webpack_require__(1376);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-const { appinfo } = _devtoolsModules.Services; /* -*- indent-tabs-mode: nil; js-indent-level: 2; js-indent-level: 2 -*- */
-/* 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/>. */
+/* -*- indent-tabs-mode: nil; js-indent-level: 2; js-indent-level: 2 -*- */
+/* 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 { appinfo } = _devtoolsModules.Services;
 
 const isMacOS = appinfo.OS === "Darwin";
 
 const COMMANDS = ["resume", "stepOver", "stepIn", "stepOut"];
 
 const KEYS = {
   WINNT: {
     resume: "F8",
@@ -34039,34 +34160,38 @@ class CommandBar extends _react.Componen
     this.props[action]();
   }
 
   setHistory(offset) {
     this.props.timeTravelTo(this.props.historyPosition + offset);
   }
 
   renderStepButtons() {
-    const { isPaused } = this.props;
+    const { isPaused, canRewind } = this.props;
     const className = isPaused ? "active" : "disabled";
     const isDisabled = !isPaused;
 
-    if (!isPaused && _prefs.features.removeCommandBarOptions) {
+    if (canRewind || !isPaused && _prefs.features.removeCommandBarOptions) {
       return;
     }
 
     return [debugBtn(this.props.stepOver, "stepOver", className, L10N.getFormatStr("stepOverTooltip", formatKey("stepOver")), isDisabled), debugBtn(this.props.stepIn, "stepIn", className, L10N.getFormatStr("stepInTooltip", formatKey("stepIn")), isDisabled), debugBtn(this.props.stepOut, "stepOut", className, L10N.getFormatStr("stepOutTooltip", formatKey("stepOut")), isDisabled)];
   }
 
   resume() {
     this.props.resume();
     this.props.clearHistory();
   }
 
   renderPauseButton() {
-    const { isPaused, breakOnNext, isWaitingOnBreak } = this.props;
+    const { isPaused, breakOnNext, isWaitingOnBreak, canRewind } = this.props;
+
+    if (canRewind) {
+      return;
+    }
 
     if (isPaused) {
       return debugBtn(() => this.resume(), "resume", "active", L10N.getFormatStr("resumeButtonTooltip", formatKey("resume")));
     }
 
     if (_prefs.features.removeCommandBarOptions && !this.props.canRewind) {
       return;
     }
@@ -34080,79 +34205,86 @@ class CommandBar extends _react.Componen
 
   /*
    * The pause on exception button has three states in this order:
    *  1. don't pause on exceptions      [false, false]
    *  2. pause on uncaught exceptions   [true, true]
    *  3. pause on all exceptions        [true, false]
   */
   renderPauseOnExceptions() {
-    if (_prefs.features.breakpointsDropdown) {
-      return;
-    }
-
     const {
       shouldPauseOnExceptions,
       shouldIgnoreCaughtExceptions,
-      pauseOnExceptions
+      pauseOnExceptions,
+      canRewind
     } = this.props;
 
+    if (canRewind || _prefs.features.breakpointsDropdown) {
+      return;
+    }
+
     if (!shouldPauseOnExceptions && !shouldIgnoreCaughtExceptions) {
       return debugBtn(() => pauseOnExceptions(true, true), "pause-exceptions", "enabled", L10N.getStr("ignoreExceptions"), false, false);
     }
 
     if (shouldPauseOnExceptions && shouldIgnoreCaughtExceptions) {
       return debugBtn(() => pauseOnExceptions(true, false), "pause-exceptions", "uncaught enabled", L10N.getStr("pauseOnUncaughtExceptions"), false, true);
     }
 
     return debugBtn(() => pauseOnExceptions(false, false), "pause-exceptions", "all enabled", L10N.getStr("pauseOnExceptions"), false, true);
   }
 
-  renderRewindButton() {
-    if (!this.props.canRewind || !this.props.isPaused) {
-      return;
-    }
-
-    return debugBtn(this.props.rewind, "rewind", "active", "Rewind Execution");
-  }
-
-  renderReverseStepButtons() {
-    if (!this.props.canRewind || !this.props.isPaused) {
-      return;
-    }
-
-    return [debugBtn(this.props.reverseStepOver, "reverseStepOver", "active", "Reverse step over"), debugBtn(this.props.reverseStepIn, "reverseStepIn", "active", "Reverse step in"), debugBtn(this.props.reverseStepOut, "reverseStepOut", "active", "Reverse step out")];
+  renderTimeTravelButtons() {
+    const { isPaused, canRewind } = this.props;
+
+    if (!canRewind || !isPaused) {
+      return null;
+    }
+
+    const isDisabled = !isPaused;
+
+    return [debugBtn(this.props.rewind, "rewind", "active", "Rewind Execution"), debugBtn(() => this.props.resume, "resume", "active", L10N.getFormatStr("resumeButtonTooltip", formatKey("resume"))), _react2.default.createElement("div", { className: "divider" }), debugBtn(this.props.reverseStepOver, "reverseStepOver", "active", "Reverse step over"), debugBtn(this.props.stepOver, "stepOver", "active", L10N.getFormatStr("stepOverTooltip", formatKey("stepOver")), isDisabled), _react2.default.createElement("div", { className: "divider" }), debugBtn(this.props.stepOut, "stepOut", "active", L10N.getFormatStr("stepOutTooltip", formatKey("stepOut")), isDisabled), debugBtn(this.props.stepIn, "stepIn", "active", L10N.getFormatStr("stepInTooltip", formatKey("stepIn")), isDisabled)];
   }
 
   replayPreviousButton() {
-    const historyLength = this.props.history.length;
-    if (!historyLength || !_prefs.features.replay) {
+    const { history, historyPosition, canRewind } = this.props;
+    const historyLength = history.length;
+
+    if (canRewind || !historyLength || !_prefs.features.replay) {
       return null;
     }
-    const enabled = this.props.historyPosition === 0;
+
+    const enabled = historyPosition === 0;
     const activeClass = enabled ? "replay-inactive" : "";
     return debugBtn(() => this.setHistory(-1), `replay-previous ${activeClass}`, "active", L10N.getStr("replayPrevious"), enabled);
   }
 
   replayNextButton() {
-    const historyLength = this.props.history.length;
-    if (!historyLength || !_prefs.features.replay) {
+    const { history, historyPosition, canRewind } = this.props;
+    const historyLength = history.length;
+
+    if (canRewind || !historyLength || !_prefs.features.replay) {
       return null;
     }
-    const enabled = this.props.historyPosition + 1 === historyLength;
+
+    const enabled = historyPosition + 1 === historyLength;
     const activeClass = enabled ? "replay-inactive" : "";
     return debugBtn(() => this.setHistory(1), `replay-next ${activeClass}`, "active", L10N.getStr("replayNext"), enabled);
   }
 
   renderStepPosition() {
-    if (!this.props.history.length || !_prefs.features.replay) {
+    const { history, historyPosition, canRewind } = this.props;
+    const historyLength = history.length;
+
+    if (canRewind || !historyLength || !_prefs.features.replay) {
       return null;
     }
-    const position = this.props.historyPosition + 1;
-    const total = this.props.history.length;
+
+    const position = historyPosition + 1;
+    const total = historyLength;
     const activePrev = position > 1 ? "replay-active" : "replay-inactive";
     const activeNext = position < total ? "replay-active" : "replay-inactive";
     return _react2.default.createElement(
       "div",
       { className: "step-position" },
       _react2.default.createElement(
         "span",
         { className: activePrev },
@@ -34175,30 +34307,29 @@ class CommandBar extends _react.Componen
     return _react2.default.createElement(
       "div",
       {
         className: (0, _classnames2.default)("command-bar", {
           vertical: !this.props.horizontal
         })
       },
       this.renderPauseButton(),
-      this.renderRewindButton(),
       this.renderStepButtons(),
       this.renderPauseOnExceptions(),
-      this.renderReverseStepButtons(),
+      this.renderTimeTravelButtons(),
       _react2.default.createElement("div", { className: "filler" }),
       this.replayPreviousButton(),
       this.renderStepPosition(),
       this.replayNextButton()
     );
   }
 }
 
 CommandBar.contextTypes = {
-  shortcuts: Object
+  shortcuts: _propTypes2.default.object
 };
 
 exports.default = (0, _reactRedux.connect)(state => {
   return {
     isPaused: (0, _selectors.isPaused)(state),
     history: (0, _selectors.getHistory)(state),
     historyPosition: (0, _selectors.getHistoryPosition)(state),
     isWaitingOnBreak: (0, _selectors.getIsWaitingOnBreak)(state),
@@ -34731,17 +34862,17 @@ class Scopes extends _react.PureComponen
 } /* This Source Code Form is subject to the terms of the Mozilla Public
    * License, v. 2.0. If a copy of the MPL was not distributed with this
    * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
 
 exports.default = (0, _reactRedux.connect)(state => {
   const selectedFrame = (0, _selectors.getSelectedFrame)(state);
   const selectedSource = (0, _selectors.getSelectedSource)(state);
 
-  const { scope: frameScopes, pending } = (0, _selectors.getFrameScope)(state, selectedSource && selectedSource.get("id"), selectedFrame.id) || { scope: null, pending: false };
+  const { scope: frameScopes, pending } = (0, _selectors.getFrameScope)(state, selectedSource && selectedSource.get("id"), selectedFrame && selectedFrame.id) || { scope: null, pending: false };
 
   return {
     selectedFrame,
     isPaused: (0, _selectors.isPaused)(state),
     isLoading: pending,
     why: (0, _selectors.getPauseReason)(state),
     frameScopes: frameScopes
   };
@@ -36699,23 +36830,35 @@ var _selectors = __webpack_require__(359
 var _breakpoints = __webpack_require__(1396);
 
 var _commands = __webpack_require__(1637);
 
 function continueToHere(line) {
   return async function ({ dispatch, getState }) {
     const source = (0, _selectors.getSelectedSource)(getState()).toJS();
 
+    if (!(0, _selectors.isPaused)(getState())) {
+      return;
+    }
+
+    const selectedFrame = (0, _selectors.getSelectedFrame)(getState());
+    const debugLine = selectedFrame.location.line;
+    if (debugLine == line) {
+      return;
+    }
+
+    const action = (0, _selectors.getCanRewind)(getState()) && line < debugLine ? _commands.rewind : _commands.resume;
+
     await dispatch((0, _breakpoints.addHiddenBreakpoint)({
       line,
       column: undefined,
       sourceId: source.id
     }));
 
-    dispatch((0, _commands.resume)());
+    dispatch(action());
   };
 } /* 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/>. */
 
 /***/ }),
 
 /***/ 1643:
@@ -37241,18 +37384,16 @@ class QuickOpenModal extends _react.Comp
         return _extends({}, result, {
           title: this.renderHighlight(result.title, (0, _path.basename)(newQuery), "title")
         }, result.subtitle != null && !this.isSymbolSearch() ? {
           subtitle: this.renderHighlight(result.subtitle, newQuery, "subtitle")
         } : null);
       });
     };
 
-    this.hasPrefix = () => /^[:#@]/.test(this.props.query);
-
     this.state = { results: null, selectedIndex: 0 };
   }
 
   componentDidMount() {
     const { query, shortcutsModalEnabled, toggleShortcutsModal } = this.props;
 
     this.updateResults(query);
 
@@ -37284,17 +37425,17 @@ class QuickOpenModal extends _react.Comp
     const { query } = this.props;
     if (this.isGotoQuery()) {
       return !/^:\d*$/.test(query);
     }
     return !this.getResultCount() && !!query;
   }
 
   render() {
-    const { enabled, query } = this.props;
+    const { enabled, query, symbols } = this.props;
     const { selectedIndex, results } = this.state;
 
     if (!enabled) {
       return null;
     }
     const newResults = results && results.slice(0, 100);
     const items = this.highlightMatching(query, newResults || []);
     const expanded = !!items && items.length > 0;
@@ -37305,20 +37446,24 @@ class QuickOpenModal extends _react.Comp
         query: query,
         count: this.getResultCount(),
         placeholder: L10N.getStr("sourceSearch.search"),
         summaryMsg: "",
         showErrorEmoji: this.shouldShowErrorEmoji(),
         onChange: this.onChange,
         onKeyDown: this.onKeyDown,
         handleClose: this.closeModal,
-        hasPrefix: this.hasPrefix(),
         expanded: expanded,
         selectedItemId: expanded && items[selectedIndex] ? items[selectedIndex].id : ""
       }),
+      !symbols || symbols.functions.length == 0 && _react2.default.createElement(
+        "div",
+        { className: "loading-indicator" },
+        L10N.getStr("loadingText")
+      ),
       newResults && _react2.default.createElement(_ResultList2.default, _extends({
         key: "results",
         items: items,
         selected: selectedIndex,
         selectItem: this.selectResultItem,
         ref: "resultList",
         expanded: expanded
       }, this.isSourceSearch() ? { size: "big" } : {}))
@@ -37913,30 +38058,30 @@ var _extends = Object.assign || function
                                                                                                                                                                                                                                                                    * 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/. */
 /* global window */
 
 exports.log = log;
 
 var _devtoolsConfig = __webpack_require__(1355);
 
-const blacklist = ["SET_POPUP_OBJECT_PROPERTIES", "SET_SYMBOLS", "OUT_OF_SCOPE_LOCATIONS"];
+const blacklist = ["SET_POPUP_OBJECT_PROPERTIES", "SET_SYMBOLS", "OUT_OF_SCOPE_LOCATIONS", "MAP_SCOPES", "ADD_SCOPES", "IN_SCOPE_LINES", "SET_EMPTY_LINES"];
 
 function cloneAction(action) {
   action = action || {};
   action = _extends({}, action);
 
   // ADD_TAB, ...
   if (action.source && action.source.text) {
     const source = _extends({}, action.source, { text: "" });
     action.source = source;
   }
 
   if (action.sources) {
-    const sources = action.sources.slice(0, 30).map(source => {
+    const sources = action.sources.slice(0, 20).map(source => {
       const url = !source.url || source.url.includes("data:") ? "" : source.url;
       return _extends({}, source, { url });
     });
     action.sources = sources;
   }
 
   // LOAD_SOURCE_TEXT
   if (action.text) {
@@ -41262,16 +41407,20 @@ function isInvalidTarget(target) {
 
 function updatePreview(target, editor) {
   return ({ dispatch, getState, client, sourceMaps }) => {
     const tokenText = target.innerText ? target.innerText.trim() : "";
     const tokenPos = (0, _editor.getTokenLocation)(editor.codeMirror, target);
     const cursorPos = target.getBoundingClientRect();
     const preview = (0, _selectors.getPreview)(getState());
 
+    if ((0, _selectors.getCanRewind)(getState())) {
+      return;
+    }
+
     if (preview) {
       // Return early if we are currently showing another preview or
       // if we are mousing over the same token as before
       if (preview.updating || (0, _lodash.isEqual)(preview.tokenPos, tokenPos)) {
         return;
       }
 
       // We are mousing over a new token that is not in the preview
@@ -41685,38 +41834,39 @@ Object.defineProperty(exports, "__esModu
 });
 
 var _lodash = __webpack_require__(2);
 
 let newSources;
 let createSource;
 let supportsWasm = false;
 let queuedSources;
+let currentWork;
 
 async function dispatchNewSources() {
   const sources = queuedSources;
   queuedSources = [];
 
-  await newSources(sources.map(source => createSource(source, { supportsWasm })));
+  currentWork = await newSources(sources.map(source => createSource(source, { supportsWasm })));
 }
 
 const queue = (0, _lodash.throttle)(dispatchNewSources, 100);
 
 exports.default = {
   initialize: options => {
     newSources = options.actions.newSources;
     createSource = options.createSource;
     supportsWasm = options.supportsWasm;
     queuedSources = [];
   },
   queue: source => {
     queuedSources.push(source);
     queue();
   },
-  flush: () => queue.flush(),
+  flush: () => Promise.all([queue.flush(), currentWork]),
   clear: () => queue.cancel()
 };
 
 /***/ }),
 
 /***/ 1796:
 /***/ (function(module, exports, __webpack_require__) {
 
@@ -43897,16 +44047,20 @@ Object.defineProperty(exports, "__esModu
   value: true
 });
 exports.ProjectSearch = 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/>. */
 
+var _propTypes = __webpack_require__(20);
+
+var _propTypes2 = _interopRequireDefault(_propTypes);
+
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _reactRedux = __webpack_require__(1189);
 
 var _classnames = __webpack_require__(175);
 
@@ -44166,17 +44320,17 @@ class ProjectSearch extends _react.Compo
         ),
         this.renderResults()
       )
     );
   }
 }
 exports.ProjectSearch = ProjectSearch;
 ProjectSearch.contextTypes = {
-  shortcuts: Object
+  shortcuts: _propTypes2.default.object
 };
 
 exports.default = (0, _reactRedux.connect)(state => ({
   sources: (0, _selectors.getSources)(state),
   activeSearch: (0, _selectors.getActiveSearch)(state),
   results: (0, _selectors.getTextSearchResults)(state),
   query: (0, _selectors.getTextSearchQuery)(state),
   status: (0, _selectors.getTextSearchStatus)(state)
@@ -44858,16 +45012,17 @@ Object.defineProperty(__webpack_exports_
 const { isDevelopment } = __webpack_require__(1355);
 const { Services, PrefsHelper } = __webpack_require__(1376);
 
 const prefsSchemaVersion = "1.0.3";
 
 const pref = Services.pref;
 
 if (isDevelopment()) {
+  pref("devtools.debugger.alphabetize-outline", false);
   pref("devtools.debugger.auto-pretty-print", 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", true);
   pref("devtools.debugger.scopes-visible", true);
   pref("devtools.debugger.workers-visible", true);
   pref("devtools.debugger.expressions-visible", true);
@@ -44898,16 +45053,17 @@ if (isDevelopment()) {
   pref("devtools.debugger.features.event-listeners", false);
   pref("devtools.debugger.features.code-folding", false);
   pref("devtools.debugger.features.outline", true);
   pref("devtools.debugger.features.column-breakpoints", true);
   pref("devtools.debugger.features.replay", true);
 }
 
 const prefs = new PrefsHelper("devtools", {
+  alphabetizeOutline: ["Bool", "debugger.alphabetize-outline"],
   autoPrettyPrint: ["Bool", "debugger.auto-pretty-print"],
   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"],
   workersVisible: ["Bool", "debugger.workers-visible"],
   breakpointsVisible: ["Bool", "debugger.breakpoints-visible"],
@@ -50681,17 +50837,17 @@ function assocIndexOf(array, key) {
 module.exports = assocIndexOf;
 
 
 /***/ }),
 
 /***/ 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 (copySourceUri2): This is the text that appears in the\n# context menu to copy the source URI of file open.\ncopySourceUri2=Copy source URI\ncopySourceUri2.accesskey=u\n\n# LOCALIZATION NOTE (setDirectoryRoot.label): This is the text that appears in the\n# context menu to set a directory as root directory\nsetDirectoryRoot.label=Set directory root\nsetDirectoryRoot.accesskey=r\n\n# LOCALIZATION NOTE (removeDirectoryRoot.label): This is the text that appears in the\n# context menu to remove a directory as root directory\nremoveDirectoryRoot.label=Remove directory root\nremoveDirectoryRoot.accesskey=d\n\n# LOCALIZATION NOTE (copyFunction.label): 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 (evaluateInConsole.label): Editor right-click menu item\n# to execute selected text in browser console.\nevaluateInConsole.label=Evaluate in console\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 (pauseButtonItem): The label that is displayed for the dropdown pause\n# list item when the debugger is in a running state.\npauseButtonItem=Pause on Next Statement\n\n# LOCALIZATION NOTE (ignoreExceptionsItem): The pause on exceptions button description\n# when the debugger will not pause on exceptions.\nignoreExceptionsItem=Ignore exceptions\n\n# LOCALIZATION NOTE (pauseOnUncaughtExceptionsItem): The pause on exceptions dropdown\n# item shown when a user is adding a new breakpoint.\npauseOnUncaughtExceptionsItem=Pause on uncaught exceptions\n\n# LOCALIZATION NOTE (pauseOnExceptionsItem): The pause on exceptions button description\n# when the debugger will pause on all exceptions.\npauseOnExceptionsItem=Pause on all exceptions\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.\n# Do not localize \"CmdOrCtrl+P\", or change the format of the string. These are\n# key identifiers, not messages displayed to the user.\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.\n# Do not localize \"CmdOrCtrl+O\", or change the format of the string. These are\n# key identifiers, not messages displayed to the user.\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.\n# Do not localize \"CmdOrCtrl+Shift+F\", or change the format of the string. These are\n# key identifiers, not messages displayed to the user.\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.\n# Do not localize \"CmdOrCtrl+Shift+O\", or change the format of the string. These are\n# key identifiers, not messages displayed to the user.\nfunctionSearch.key=CmdOrCtrl+Shift+O\n\n# LOCALIZATION NOTE (toggleBreakpoint.key): A key shortcut to toggle\n# breakpoints.\n# Do not localize \"CmdOrCtrl+B\", or change the format of the string. These are\n# key identifiers, not messages displayed to the user.\ntoggleBreakpoint.key=CmdOrCtrl+B\n\n# LOCALIZATION NOTE (toggleCondPanel.key): A key shortcut to toggle\n# the conditional breakpoint panel.\n# Do not localize \"CmdOrCtrl+Shift+B\", or change the format of the string. These are\n# key identifiers, not messages displayed to the user.\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\n# Do not localize \"CmdOrCtrl+F\", or change the format of the string. These are\n# key identifiers, not messages displayed to the user.\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\n# Do not localize \"CmdOrCtrl+G\", or change the format of the string. These are\n# key identifiers, not messages displayed to the user.\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\n# Do not localize \"CmdOrCtrl+Shift+G\", or change the format of the string. These are\n# key identifiers, not messages displayed to the user.\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 (editor.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\neditor.disableBreakpoint.accesskey=D\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\neditor.addConditionalBreakpoint.accesskey=c\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.close): 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\neditor.jumpToMappedLocation1.accesskey=m\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# LOCALIZATION NOTE (expressions.errorMsg): Error text for expression\n# input element\nexpressions.errorMsg=Invalid expression…\nexpressions.label=Add watch expression\nexpressions.accesskey=e\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.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.mappedSource): Text associated\n# with a mapped source. %S is replaced by the source map origin.\nsourceFooter.mappedSource=(From %S)\n\n# LOCALIZATION NOTE (sourceFooter.mappedSourceTooltip): Tooltip text associated\n# with a mapped source. %S is replaced by the source map origin.\nsourceFooter.mappedSourceTooltip=(Source mapped from %S)\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 (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 (outline.noFileSelected): Outline text when there are no files selected\noutline.noFileSelected=No file selected\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.noResults2): 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 (replayPrevious): The replay previous button tooltip\n# when the debugger will go back in stepping history.\nreplayPrevious=Go back one step in history\n\n# LOCALIZATION NOTE (replayNext): The replay next button tooltip\n# when the debugger will go forward in stepping history.\nreplayNext=Go forward one step in history\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 (wasmIsNotAvailable): The text that is displayed in the\n# script editor when the WebAssembly source is not available.\nwasmIsNotAvailable=Please refresh to debug this module\n\n# LOCALIZATION NOTE (errorLoadingText3): The text that is displayed in the debugger\n# viewer when there is an error loading a file\nerrorLoadingText3=Error loading this URI: %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 (variablesDomNodeValueTooltip): 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(gotoLineModal.placeholder): The placeholder\n# text displayed when the user searches for specific lines in a file\ngotoLineModal.placeholder=Go to line…\n\n# LOCALIZATION NOTE(gotoLineModal.title): The message shown to users\n# to open the go to line modal\ngotoLineModal.title=Go to a line number in a file\n\n# LOCALIZATION NOTE(gotoLineModal.key2): The shortcut for opening the\n# go to line modal\n# Do not localize \"CmdOrCtrl+;\", or change the format of the string. These are\n# key identifiers, not messages displayed to the user.\ngotoLineModal.key2=CmdOrCtrl+;\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…\nsymbolSearch.search.functionsPlaceholder.title=Search for a function in a file\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…\nsymbolSearch.search.variablesPlaceholder.title=Search for a variable in a file\n\n# LOCALIZATION NOTE(symbolSearch.search.key2): The Key Shortcut for\n# searching for a function or variable\n# Do not localize \"CmdOrCtrl+Shift+O\", or change the format of the string. These are\n# key identifiers, not messages displayed to the user.\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\nshortcuts.toggleBreakpoint.accesskey=B\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.gotoLine): text describing\n# keyboard shortcut for jumping to a specific line\nshortcuts.gotoLine=Go to line\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\n# LOCALIZATION NOTE (shortcuts.buttonName): text describing\n# keyboard shortcut button text\nshortcuts.buttonName=Keyboard shortcuts\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 (copySourceUri2): This is the text that appears in the\n# context menu to copy the source URI of file open.\ncopySourceUri2=Copy source URI\ncopySourceUri2.accesskey=u\n\n# LOCALIZATION NOTE (setDirectoryRoot.label): This is the text that appears in the\n# context menu to set a directory as root directory\nsetDirectoryRoot.label=Set directory root\nsetDirectoryRoot.accesskey=r\n\n# LOCALIZATION NOTE (removeDirectoryRoot.label): This is the text that appears in the\n# context menu to remove a directory as root directory\nremoveDirectoryRoot.label=Remove directory root\nremoveDirectoryRoot.accesskey=d\n\n# LOCALIZATION NOTE (copyFunction.label): 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 (evaluateInConsole.label): Editor right-click menu item\n# to execute selected text in browser console.\nevaluateInConsole.label=Evaluate in console\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 (pauseButtonItem): The label that is displayed for the dropdown pause\n# list item when the debugger is in a running state.\npauseButtonItem=Pause on Next Statement\n\n# LOCALIZATION NOTE (ignoreExceptionsItem): The pause on exceptions button description\n# when the debugger will not pause on exceptions.\nignoreExceptionsItem=Ignore exceptions\n\n# LOCALIZATION NOTE (pauseOnUncaughtExceptionsItem): The pause on exceptions dropdown\n# item shown when a user is adding a new breakpoint.\npauseOnUncaughtExceptionsItem=Pause on uncaught exceptions\n\n# LOCALIZATION NOTE (pauseOnExceptionsItem): The pause on exceptions button description\n# when the debugger will pause on all exceptions.\npauseOnExceptionsItem=Pause on all exceptions\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.\n# Do not localize \"CmdOrCtrl+P\", or change the format of the string. These are\n# key identifiers, not messages displayed to the user.\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.\n# Do not localize \"CmdOrCtrl+O\", or change the format of the string. These are\n# key identifiers, not messages displayed to the user.\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.\n# Do not localize \"CmdOrCtrl+Shift+F\", or change the format of the string. These are\n# key identifiers, not messages displayed to the user.\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.\n# Do not localize \"CmdOrCtrl+Shift+O\", or change the format of the string. These are\n# key identifiers, not messages displayed to the user.\nfunctionSearch.key=CmdOrCtrl+Shift+O\n\n# LOCALIZATION NOTE (toggleBreakpoint.key): A key shortcut to toggle\n# breakpoints.\n# Do not localize \"CmdOrCtrl+B\", or change the format of the string. These are\n# key identifiers, not messages displayed to the user.\ntoggleBreakpoint.key=CmdOrCtrl+B\n\n# LOCALIZATION NOTE (toggleCondPanel.key): A key shortcut to toggle\n# the conditional breakpoint panel.\n# Do not localize \"CmdOrCtrl+Shift+B\", or change the format of the string. These are\n# key identifiers, not messages displayed to the user.\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\n# Do not localize \"CmdOrCtrl+F\", or change the format of the string. These are\n# key identifiers, not messages displayed to the user.\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\n# Do not localize \"CmdOrCtrl+G\", or change the format of the string. These are\n# key identifiers, not messages displayed to the user.\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\n# Do not localize \"CmdOrCtrl+Shift+G\", or change the format of the string. These are\n# key identifiers, not messages displayed to the user.\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 (editor.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\neditor.disableBreakpoint.accesskey=D\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\neditor.addConditionalBreakpoint.accesskey=c\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.close): 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\neditor.jumpToMappedLocation1.accesskey=m\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# LOCALIZATION NOTE (expressions.errorMsg): Error text for expression\n# input element\nexpressions.errorMsg=Invalid expression…\nexpressions.label=Add watch expression\nexpressions.accesskey=e\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.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.mappedSource): Text associated\n# with a mapped source. %S is replaced by the source map origin.\nsourceFooter.mappedSource=(From %S)\n\n# LOCALIZATION NOTE (sourceFooter.mappedSourceTooltip): Tooltip text associated\n# with a mapped source. %S is replaced by the source map origin.\nsourceFooter.mappedSourceTooltip=(Source mapped from %S)\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 (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.sortLabel): Label for the sort button\noutline.sortLabel=Sort by name\n\n# LOCALIZATION NOTE (outline.noFunctions): Outline text when there are no functions to display\noutline.noFunctions=No functions\n\n# LOCALIZATION NOTE (outline.noFileSelected): Outline text when there are no files selected\noutline.noFileSelected=No file selected\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.noResults2): 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 (replayPrevious): The replay previous button tooltip\n# when the debugger will go back in stepping history.\nreplayPrevious=Go back one step in history\n\n# LOCALIZATION NOTE (replayNext): The replay next button tooltip\n# when the debugger will go forward in stepping history.\nreplayNext=Go forward one step in history\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 (wasmIsNotAvailable): The text that is displayed in the\n# script editor when the WebAssembly source is not available.\nwasmIsNotAvailable=Please refresh to debug this module\n\n# LOCALIZATION NOTE (errorLoadingText3): The text that is displayed in the debugger\n# viewer when there is an error loading a file\nerrorLoadingText3=Error loading this URI: %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 (variablesDomNodeValueTooltip): 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(gotoLineModal.placeholder): The placeholder\n# text displayed when the user searches for specific lines in a file\ngotoLineModal.placeholder=Go to line…\n\n# LOCALIZATION NOTE(gotoLineModal.title): The message shown to users\n# to open the go to line modal\ngotoLineModal.title=Go to a line number in a file\n\n# LOCALIZATION NOTE(gotoLineModal.key2): The shortcut for opening the\n# go to line modal\n# Do not localize \"CmdOrCtrl+;\", or change the format of the string. These are\n# key identifiers, not messages displayed to the user.\ngotoLineModal.key2=CmdOrCtrl+;\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…\nsymbolSearch.search.functionsPlaceholder.title=Search for a function in a file\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…\nsymbolSearch.search.variablesPlaceholder.title=Search for a variable in a file\n\n# LOCALIZATION NOTE(symbolSearch.search.key2): The Key Shortcut for\n# searching for a function or variable\n# Do not localize \"CmdOrCtrl+Shift+O\", or change the format of the string. These are\n# key identifiers, not messages displayed to the user.\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\nshortcuts.toggleBreakpoint.accesskey=B\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.gotoLine): text describing\n# keyboard shortcut for jumping to a specific line\nshortcuts.gotoLine=Go to line\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\n# LOCALIZATION NOTE (shortcuts.buttonName): text describing\n# keyboard shortcut button text\nshortcuts.buttonName=Keyboard shortcuts\n"
 
 /***/ }),
 
 /***/ 965:
 /***/ (function(module, exports) {
 
 
 /**
--- a/devtools/client/debugger/new/parser-worker.js
+++ b/devtools/client/debugger/new/parser-worker.js
@@ -1703,16 +1703,20 @@ function extractSymbol(path, symbols) {
       identifier: path.node.id
     });
   }
 
   if (t.isJSXElement(path)) {
     symbols.hasJsx = true;
   }
 
+  if (t.isGenericTypeAnnotation(path)) {
+    symbols.hasTypes = true;
+  }
+
   if (t.isClassDeclaration(path)) {
     symbols.classes.push({
       name: path.node.id.name,
       parent: path.node.superClass,
       location: path.node.loc
     });
   }
 
@@ -1811,17 +1815,18 @@ function extractSymbols(sourceId) {
     variables: [],
     callExpressions: [],
     memberExpressions: [],
     objectProperties: [],
     comments: [],
     identifiers: [],
     classes: [],
     imports: [],
-    hasJsx: false
+    hasJsx: false,
+    hasTypes: false
   };
 
   const ast = (0, _ast.traverseAst)(sourceId, {
     enter(node, ancestors) {
       try {
         const path = (0, _simplePath2.default)(ancestors);
         if (path) {
           extractSymbol(path, symbols);
--- a/devtools/client/debugger/new/test/mochitest/browser.ini
+++ b/devtools/client/debugger/new/test/mochitest/browser.ini
@@ -69,32 +69,35 @@ support-files =
   examples/wasm-sourcemaps/average.js
   examples/wasm-sourcemaps/average.wasm
   examples/wasm-sourcemaps/average.wasm.map
   examples/wasm-sourcemaps/average.c
   examples/wasm-sourcemaps/utils.js
   examples/sum/sum.js
   examples/sum/sum.min.js
   examples/sum/sum.min.js.map
+  examples/big-sourcemap_files/bundle.js
+  examples/big-sourcemap_files/bundle.js.map
   examples/reload/code_reload_1.js
   examples/reload/code_reload_2.js
   examples/reload/doc-reload.html
   examples/reload/sjs_code_reload.sjs
   examples/doc-async.html
   examples/doc-asm.html
   examples/doc-babel.html
   examples/doc-content-script-sources.html
   examples/doc-scripts.html
   examples/doc-script-mutate.html
   examples/doc-script-switching.html
   examples/doc-exceptions.html
   examples/doc-iframes.html
   examples/doc-frames.html
   examples/doc-debugger-statements.html
   examples/doc-minified.html
+  examples/big-sourcemap.html
   examples/doc-minified2.html
   examples/doc-sourcemaps.html
   examples/doc-sourcemaps2.html
   examples/doc-sourcemaps3.html
   examples/doc-sourcemap-bogus.html
   examples/doc-sources.html
   examples/doc-return-values.html
   examples/doc-wasm-sourcemaps.html
@@ -116,17 +119,16 @@ support-files =
   examples/script-switching-02.js
   examples/script-switching-01.js
   examples/times2.js
 
 [browser_dbg-asm.js]
 [browser_dbg-async-stepping.js]
 [browser_dbg-babel-scopes.js]
 [browser_dbg-babel-stepping.js]
-skip-if = true
 [browser_dbg-breaking.js]
 [browser_dbg-breaking-from-console.js]
 [browser_dbg-breakpoints.js]
 [browser_dbg-breakpoints-toggle.js]
 [browser_dbg-breakpoints-reloading.js]
 [browser_dbg-breakpoints-cond.js]
 [browser_dbg-browser-content-toolbox.js]
 skip-if = !e10s # This test is only valid in e10s
@@ -176,13 +178,15 @@ skip-if = os == "win"
 [browser_dbg-sourcemaps-reload.js]
 skip-if = os == "win" # Bug 1434792
 [browser_dbg-sourcemaps-reloading.js]
 [browser_dbg-sourcemaps2.js]
 [browser_dbg-sourcemaps3.js]
 [browser_dbg-sourcemaps-bogus.js]
 [browser_dbg-sources.js]
 [browser_dbg-sources-named-eval.js]
+[browser_dbg-stepping.js]
+skip-if = debug
 [browser_dbg-tabs.js]
 [browser_dbg-tabs-pretty-print.js]
 [browser_dbg-toggling-tools.js]
 [browser_dbg-wasm-sourcemaps.js]
 skip-if = true
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg-babel-scopes.js
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-babel-scopes.js
@@ -1,12 +1,12 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
-// This test can be really slow on debug platforms and should be split
+// This test can be really slow on debug platforms and should be split.
 requestLongerTimeout(4);
 
 // Tests loading sourcemapped sources for Babel's compile output.
 
 async function breakpointScopes(dbg, fixture, { line, column }, scopes) {
   const { selectors: { getBreakpoint, getBreakpoints }, getState } = dbg;
 
   const filename = `fixtures/${fixture}/input.js`;
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg-babel-stepping.js
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-babel-stepping.js
@@ -109,18 +109,16 @@ function testStepOverForOfArray(dbg) {
 // and Babel doesn't map the _loop() call, so we step past it automatically.
 function testStepOveForOfClosure(dbg) {
   return breakpointSteps(
     dbg,
     "step-over-for-of-closure",
     { line: 6, column: 2 },
     [
       ["stepOver", { line: 8, column: 2 }],
-      ["stepOver", { line: 8, column: 2 }],
-      ["stepOver", { line: 8, column: 2 }],
       ["stepOver", { line: 12, column: 2 }]
     ]
   );
 }
 
 // Same as the previous, not possible to step into the body. The less
 // complicated array logic makes it possible to step into the header at least,
 // but this does end up double-visiting the for head.
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg-breakpoints-toggle.js
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-breakpoints-toggle.js
@@ -23,23 +23,23 @@ async function enableBreakpoint(dbg, ind
   await enabled;
 }
 
 function toggleBreakpoints(dbg, count) {
   clickElement(dbg, "toggleBreakpoints");
 }
 
 function disableBreakpoints(dbg, count) {
-  const toggled = waitForDispatch(dbg, "DISABLE_BREAKPOINT", count);
+  const toggled = waitForDispatch(dbg, "DISABLE_ALL_BREAKPOINTS", count);
   toggleBreakpoints(dbg);
   return toggled;
 }
 
 function enableBreakpoints(dbg, count) {
-  const enabled = waitForDispatch(dbg, "ENABLE_BREAKPOINT", count);
+  const enabled = waitForDispatch(dbg, "ENABLE_ALL_BREAKPOINTS", count);
   toggleBreakpoints(dbg);
   return enabled;
 }
 
 function findBreakpoint(dbg, url, line) {
   const { selectors: { getBreakpoint }, getState } = dbg;
   const source = findSource(dbg, url);
   return getBreakpoint(getState(), { sourceId: source.id, line });
@@ -55,33 +55,35 @@ add_task(async function() {
   const dbg = await initDebugger("doc-scripts.html", "simple2");
 
   // Create two breakpoints
   await selectSource(dbg, "simple2");
   await addBreakpoint(dbg, "simple2", 3);
   await addBreakpoint(dbg, "simple2", 5);
 
   // Disable all of the breakpoints
-  await disableBreakpoints(dbg, 2);
+  await disableBreakpoints(dbg, 1);
   let bp1 = findBreakpoint(dbg, "simple2", 3);
   let bp2 = findBreakpoint(dbg, "simple2", 5);
 
   if (!bp2) {
     debugger;
   }
 
   is(bp1.disabled, true, "first breakpoint is disabled");
   is(bp2.disabled, true, "second breakpoint is disabled");
 
   // Enable all of the breakpoints
-  await enableBreakpoints(dbg, 2);
+  await enableBreakpoints(dbg, 1);
   bp1 = findBreakpoint(dbg, "simple2", 3);
   bp2 = findBreakpoint(dbg, "simple2", 5);
 
   is(bp1.disabled, false, "first breakpoint is enabled");
   is(bp2.disabled, false, "second breakpoint is enabled");
 
   // Remove the breakpoints
   await removeBreakpoint(dbg, 1);
   await removeBreakpoint(dbg, 1);
+
   const bps = findBreakpoints(dbg);
+
   is(bps.size, 0, "breakpoints are removed");
 });
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg-outline.js
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-outline.js
@@ -22,9 +22,20 @@ add_task(async function() {
   findElementWithSelector(dbg, ".outline-tab").click();
   is(getItems(dbg).length, 5, "5 items in the list");
 
   // click on an element
   const item = getNthItem(dbg, 3);
   is(item.innerText, "evaledFunc()", "got evaled func");
   item.click();
   assertHighlightLocation(dbg, "simple1", 15);
+
+  // Ensure "main()" is the first function listed
+  const firstFunction = findElementWithSelector(dbg, '.outline-list__element .function-signature');
+  is(firstFunction.innerText, "main()", "Natural first function is first listed");
+  // Sort the list
+  findElementWithSelector(dbg, ".outline-footer button").click();
+  // Button becomes active to show alphabetization
+  is(findElementWithSelector(dbg, ".outline-footer button").className, "active", "Alphabetize button is highlighted when active");
+  // Ensure "doEval()" is the first function listed after alphabetization
+  const firstAlphaFunction = findElementWithSelector(dbg, '.outline-list__element .function-signature');
+  is(firstAlphaFunction.innerText.replace("λ", ""), "doEval()", "Alphabetized first function is correct");
 });
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-stepping.js
@@ -0,0 +1,39 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+ // This test can be really slow on debug platforms
+ requestLongerTimeout(3);
+
+function assertSelectedFile(dbg, url) {
+  const selectedLocation = dbg.selectors.getSelectedSource(dbg.getState());
+  ok(selectedLocation, "The debugger should be at the paused location")
+  const selectedUrl = selectedLocation.get("url");
+  return ok( selectedUrl.includes(url), `The debugger should be paused at ${url}"`);
+}
+
+add_task(async function test() {
+  const dbg = await initDebugger("big-sourcemap.html", "big-sourcemap");
+  invokeInTab("hitDebugStatement");
+  await waitForPaused(dbg);
+  assertSelectedFile(dbg, "bundle.js");
+
+  await stepIn(dbg);
+  await stepIn(dbg);
+  await stepIn(dbg);
+  await stepIn(dbg);
+  await stepIn(dbg);
+  await stepIn(dbg);
+  await stepIn(dbg);
+  await stepIn(dbg);
+  await stepIn(dbg);
+
+  await stepIn(dbg);
+  await stepIn(dbg);
+  await stepIn(dbg);
+  await stepIn(dbg);
+  await stepIn(dbg);
+
+  assertSelectedFile(dbg, "bundle.js");
+  assertDebugLine(dbg, 42309);
+  assertPausedLocation(dbg);
+});
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/big-sourcemap.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html lang="en"><head>
+<meta http-equiv="content-type" content="text/html; charset=UTF-8">
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+    <meta name="theme-color" content="#000000">
+    <!--
+      manifest.json provides metadata used when your web app is added to the
+      homescreen on Android. See https://developers.google.com/web/fundamentals/engage-and-retain/web-app-manifest/
+    -->
+    <link rel="manifest" href="http://localhost:3000/manifest.json">
+    <!--
+      Notice the use of  in the tags above.
+      It will be replaced with the URL of the `public` folder during the build.
+      Only files inside the `public` folder can be referenced from the HTML.
+
+      Unlike "/favicon.ico" or "favicon.ico", "/favicon.ico" will
+      work correctly both with client-side routing and a non-root public URL.
+      Learn how to configure a non-root public URL by running `npm run build`.
+    -->
+    <title>React App</title>
+  </head>
+  <body>
+    <noscript>
+      You need to enable JavaScript to run this app.
+    </noscript>
+    <div id="root"><div class="App"><header class="App-header"><h1 class="App-title">Welcome to React</h1></header><p class="App-intro">To get started, edit <code>src/App.js</code> and save to reload.</p></div></div>
+    <!--
+      This HTML file is a template.
+      If you open it directly in the browser, you will see an empty page.
+
+      You can add webfonts, meta tags, or analytics to this file.
+      The build step will place the bundled scripts into the <body> tag.
+
+      To begin the development, run `npm start` or `yarn start`.
+      To create a production bundle, use `npm run build` or `yarn build`.
+    -->
+  <script type="text/javascript" src="big-sourcemap_files/bundle.js"></script>
+
+</body></html>
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/big-sourcemap_files/bundle.js
@@ -0,0 +1,53505 @@
+/******/ (function(modules) {
+  // webpackBootstrap
+  /******/ function hotDisposeChunk(chunkId) {
+    /******/ delete installedChunks[chunkId];
+    /******/
+  }
+  /******/ var parentHotUpdateCallback = this["webpackHotUpdate"];
+  /******/ this[
+    "webpackHotUpdate"
+  ] = /******/ function webpackHotUpdateCallback(chunkId, moreModules) {
+    // eslint-disable-line no-unused-vars
+    /******/ hotAddUpdateChunk(chunkId, moreModules);
+    /******/ if (parentHotUpdateCallback)
+      parentHotUpdateCallback(chunkId, moreModules);
+    /******/
+  };
+  /******/
+
+  /******/ function hotDownloadUpdateChunk(chunkId) {
+    // eslint-disable-line no-unused-vars
+    /******/ var head = document.getElementsByTagName("head")[0];
+    /******/ var script = document.createElement("script");
+    /******/ script.type = "text/javascript";
+    /******/ script.charset = "utf-8";
+    /******/ script.src =
+      __webpack_require__.p +
+      "" +
+      chunkId +
+      "." +
+      hotCurrentHash +
+      ".hot-update.js";
+    /******/ /******/ head.appendChild(script);
+    /******/
+  }
+  /******/
+
+  /******/ function hotDownloadManifest(requestTimeout) {
+    // eslint-disable-line no-unused-vars
+    /******/ requestTimeout = requestTimeout || 10000;
+    /******/ return new Promise(function(resolve, reject) {
+      /******/ if (typeof XMLHttpRequest === "undefined")
+        /******/ return reject(new Error("No browser support"));
+      /******/ try {
+        /******/ var request = new XMLHttpRequest();
+        /******/ var requestPath =
+          __webpack_require__.p + "" + hotCurrentHash + ".hot-update.json";
+        /******/ request.open("GET", requestPath, true);
+        /******/ request.timeout = requestTimeout;
+        /******/ request.send(null);
+        /******/
+      } catch (err) {
+        /******/ return reject(err);
+        /******/
+      }
+      /******/ request.onreadystatechange = function() {
+        /******/ if (request.readyState !== 4) return;
+        /******/ if (request.status === 0) {
+          /******/ // timeout
+          /******/ reject(
+            new Error("Manifest request to " + requestPath + " timed out.")
+          );
+          /******/
+        } else if (request.status === 404) {
+          /******/ // no update available
+          /******/ resolve();
+          /******/
+        } else if (request.status !== 200 && request.status !== 304) {
+          /******/ // other failure
+          /******/ reject(
+            new Error("Manifest request to " + requestPath + " failed.")
+          );
+          /******/
+        } else {
+          /******/ // success
+          /******/ try {
+            /******/ var update = JSON.parse(request.responseText);
+            /******/
+          } catch (e) {
+            /******/ reject(e);
+            /******/ return;
+            /******/
+          }
+          /******/ resolve(update);
+          /******/
+        }
+        /******/
+      };
+      /******/
+    });
+    /******/
+  }
+  /******/
+  /******/
+
+  /******/
+
+  /******/ var hotApplyOnUpdate = true;
+  /******/ var hotCurrentHash = "cbd3f28b2666e547679d"; // eslint-disable-line no-unused-vars
+  /******/ var hotRequestTimeout = 10000;
+  /******/ var hotCurrentModuleData = {};
+  /******/ var hotCurrentChildModule; // eslint-disable-line no-unused-vars
+  /******/ var hotCurrentParents = []; // eslint-disable-line no-unused-vars
+  /******/ var hotCurrentParentsTemp = []; // eslint-disable-line no-unused-vars
+  /******/
+
+  /******/ function hotCreateRequire(moduleId) {
+    // eslint-disable-line no-unused-vars
+    /******/ var me = installedModules[moduleId];
+    /******/ if (!me) return __webpack_require__;
+    /******/ var fn = function(request) {
+      /******/ if (me.hot.active) {
+        /******/ if (installedModules[request]) {
+          /******/ if (installedModules[request].parents.indexOf(moduleId) < 0)
+            /******/ installedModules[request].parents.push(moduleId);
+          /******/
+        } else {
+          /******/ hotCurrentParents = [moduleId];
+          /******/ hotCurrentChildModule = request;
+          /******/
+        }
+        /******/ if (me.children.indexOf(request) < 0)
+          /******/ me.children.push(request);
+        /******/
+      } else {
+        /******/ console.warn(
+          "[HMR] unexpected require(" +
+            request +
+            ") from disposed module " +
+            moduleId
+        );
+        /******/ hotCurrentParents = [];
+        /******/
+      }
+      /******/ return __webpack_require__(request);
+      /******/
+    };
+    /******/ var ObjectFactory = function ObjectFactory(name) {
+      /******/ return {
+        /******/ configurable: true,
+        /******/ enumerable: true,
+        /******/ get: function() {
+          /******/ return __webpack_require__[name];
+          /******/
+        },
+        /******/ set: function(value) {
+          /******/ __webpack_require__[name] = value;
+          /******/
+        }
+        /******/
+      };
+      /******/
+    };
+    /******/ for (var name in __webpack_require__) {
+      /******/ if (
+        Object.prototype.hasOwnProperty.call(__webpack_require__, name) &&
+        name !== "e"
+      ) {
+        /******/ Object.defineProperty(fn, name, ObjectFactory(name));
+        /******/
+      }
+      /******/
+    }
+    /******/ fn.e = function(chunkId) {
+      /******/ if (hotStatus === "ready") /******/ hotSetStatus("prepare");
+      /******/ hotChunksLoading++;
+      /******/ return __webpack_require__
+        .e(chunkId)
+        .then(finishChunkLoading, function(err) {
+          /******/ finishChunkLoading();
+          /******/ throw err;
+          /******/
+        });
+      /******/
+
+      /******/ function finishChunkLoading() {
+        /******/ hotChunksLoading--;
+        /******/ if (hotStatus === "prepare") {
+          /******/ if (!hotWaitingFilesMap[chunkId]) {
+            /******/ hotEnsureUpdateChunk(chunkId);
+            /******/
+          }
+          /******/ if (hotChunksLoading === 0 && hotWaitingFiles === 0) {
+            /******/ hotUpdateDownloaded();
+            /******/
+          }
+          /******/
+        }
+        /******/
+      }
+      /******/
+    };
+    /******/ return fn;
+    /******/
+  }
+  /******/
+
+  /******/ function hotCreateModule(moduleId) {
+    // eslint-disable-line no-unused-vars
+    /******/ var hot = {
+      /******/ // private stuff
+      /******/ _acceptedDependencies: {},
+      /******/ _declinedDependencies: {},
+      /******/ _selfAccepted: false,
+      /******/ _selfDeclined: false,
+      /******/ _disposeHandlers: [],
+      /******/ _main: hotCurrentChildModule !== moduleId, // Module API
+      /******/
+
+      /******/ /******/ active: true,
+      /******/ accept: function(dep, callback) {
+        /******/ if (typeof dep === "undefined")
+          /******/ hot._selfAccepted = true;
+        else if (typeof dep === "function")
+          /******/ /******/ hot._selfAccepted = dep;
+        else if (typeof dep === "object")
+          /******/ /******/ for (var i = 0; i < dep.length; i++)
+            /******/ hot._acceptedDependencies[dep[i]] =
+              callback || function() {};
+        else
+          /******/ /******/ hot._acceptedDependencies[dep] =
+            callback || function() {};
+        /******/
+      },
+      /******/ decline: function(dep) {
+        /******/ if (typeof dep === "undefined")
+          /******/ hot._selfDeclined = true;
+        else if (typeof dep === "object")
+          /******/ /******/ for (var i = 0; i < dep.length; i++)
+            /******/ hot._declinedDependencies[dep[i]] = true;
+        else /******/ /******/ hot._declinedDependencies[dep] = true;
+        /******/
+      },
+      /******/ dispose: function(callback) {
+        /******/ hot._disposeHandlers.push(callback);
+        /******/
+      },
+      /******/ addDisposeHandler: function(callback) {
+        /******/ hot._disposeHandlers.push(callback);
+        /******/
+      },
+      /******/ removeDisposeHandler: function(callback) {
+        /******/ var idx = hot._disposeHandlers.indexOf(callback);
+        /******/ if (idx >= 0) hot._disposeHandlers.splice(idx, 1);
+        /******/
+      }, // Management API
+      /******/
+
+      /******/ /******/ check: hotCheck,
+      /******/ apply: hotApply,
+      /******/ status: function(l) {
+        /******/ if (!l) return hotStatus;
+        /******/ hotStatusHandlers.push(l);
+        /******/
+      },
+      /******/ addStatusHandler: function(l) {
+        /******/ hotStatusHandlers.push(l);
+        /******/
+      },
+      /******/ removeStatusHandler: function(l) {
+        /******/ var idx = hotStatusHandlers.indexOf(l);
+        /******/ if (idx >= 0) hotStatusHandlers.splice(idx, 1);
+        /******/
+      }, //inherit from previous dispose call
+      /******/
+
+      /******/ /******/ data: hotCurrentModuleData[moduleId]
+      /******/
+    };
+    /******/ hotCurrentChildModule = undefined;
+    /******/ return hot;
+    /******/
+  }
+  /******/
+
+  /******/ var hotStatusHandlers = [];
+  /******/ var hotStatus = "idle";
+  /******/
+
+  /******/ function hotSetStatus(newStatus) {
+    /******/ hotStatus = newStatus;
+    /******/ for (var i = 0; i < hotStatusHandlers.length; i++)
+      /******/ hotStatusHandlers[i].call(null, newStatus);
+    /******/
+  } // while downloading
+  /******/
+
+  /******/ /******/ var hotWaitingFiles = 0;
+  /******/ var hotChunksLoading = 0;
+  /******/ var hotWaitingFilesMap = {};
+  /******/ var hotRequestedFilesMap = {};
+  /******/ var hotAvailableFilesMap = {};
+  /******/ var hotDeferred; // The update info
+  /******/
+
+  /******/ /******/ var hotUpdate, hotUpdateNewHash;
+  /******/
+
+  /******/ function toModuleId(id) {
+    /******/ var isNumber = +id + "" === id;
+    /******/ return isNumber ? +id : id;
+    /******/
+  }
+  /******/
+
+  /******/ function hotCheck(apply) {
+    /******/ if (hotStatus !== "idle")
+      throw new Error("check() is only allowed in idle status");
+    /******/ hotApplyOnUpdate = apply;
+    /******/ hotSetStatus("check");
+    /******/ return hotDownloadManifest(hotRequestTimeout).then(function(
+      update
+    ) {
+      /******/ if (!update) {
+        /******/ hotSetStatus("idle");
+        /******/ return null;
+        /******/
+      }
+      /******/ hotRequestedFilesMap = {};
+      /******/ hotWaitingFilesMap = {};
+      /******/ hotAvailableFilesMap = update.c;
+      /******/ hotUpdateNewHash = update.h;
+      /******/
+
+      /******/ hotSetStatus("prepare");
+      /******/ var promise = new Promise(function(resolve, reject) {
+        /******/ hotDeferred = {
+          /******/ resolve: resolve,
+          /******/ reject: reject
+          /******/
+        };
+        /******/
+      });
+      /******/ hotUpdate = {};
+      /******/ var chunkId = 0;
+      /******/ {
+        // eslint-disable-line no-lone-blocks
+        /******/ /*globals chunkId */
+        /******/ hotEnsureUpdateChunk(chunkId);
+        /******/
+      }
+      /******/ if (
+        hotStatus === "prepare" &&
+        hotChunksLoading === 0 &&
+        hotWaitingFiles === 0
+      ) {
+        /******/ hotUpdateDownloaded();
+        /******/
+      }
+      /******/ return promise;
+      /******/
+    });
+    /******/
+  }
+  /******/
+
+  /******/ function hotAddUpdateChunk(chunkId, moreModules) {
+    // eslint-disable-line no-unused-vars
+    /******/ if (
+      !hotAvailableFilesMap[chunkId] ||
+      !hotRequestedFilesMap[chunkId]
+    )
+      /******/ return;
+    /******/ hotRequestedFilesMap[chunkId] = false;
+    /******/ for (var moduleId in moreModules) {
+      /******/ if (
+        Object.prototype.hasOwnProperty.call(moreModules, moduleId)
+      ) {
+        /******/ hotUpdate[moduleId] = moreModules[moduleId];
+        /******/
+      }
+      /******/
+    }
+    /******/ if (--hotWaitingFiles === 0 && hotChunksLoading === 0) {
+      /******/ hotUpdateDownloaded();
+      /******/
+    }
+    /******/
+  }
+  /******/
+
+  /******/ function hotEnsureUpdateChunk(chunkId) {
+    /******/ if (!hotAvailableFilesMap[chunkId]) {
+      /******/ hotWaitingFilesMap[chunkId] = true;
+      /******/
+    } else {
+      /******/ hotRequestedFilesMap[chunkId] = true;
+      /******/ hotWaitingFiles++;
+      /******/ hotDownloadUpdateChunk(chunkId);
+      /******/
+    }
+    /******/
+  }
+  /******/
+
+  /******/ function hotUpdateDownloaded() {
+    /******/ hotSetStatus("ready");
+    /******/ var deferred = hotDeferred;
+    /******/ hotDeferred = null;
+    /******/ if (!deferred) return;
+    /******/ if (hotApplyOnUpdate) {
+      /******/ // Wrap deferred object in Promise to mark it as a well-handled Promise to
+      /******/ // avoid triggering uncaught exception warning in Chrome.
+      /******/ // See https://bugs.chromium.org/p/chromium/issues/detail?id=465666
+      /******/ Promise.resolve()
+        .then(function() {
+          /******/ return hotApply(hotApplyOnUpdate);
+          /******/
+        })
+        .then(
+          /******/ function(result) {
+            /******/ deferred.resolve(result);
+            /******/
+          },
+          /******/ function(err) {
+            /******/ deferred.reject(err);
+            /******/
+          }
+          /******/
+        );
+      /******/
+    } else {
+      /******/ var outdatedModules = [];
+      /******/ for (var id in hotUpdate) {
+        /******/ if (Object.prototype.hasOwnProperty.call(hotUpdate, id)) {
+          /******/ outdatedModules.push(toModuleId(id));
+          /******/
+        }
+        /******/
+      }
+      /******/ deferred.resolve(outdatedModules);
+      /******/
+    }
+    /******/
+  }
+  /******/
+
+  /******/ function hotApply(options) {
+    /******/ if (hotStatus !== "ready")
+      throw new Error("apply() is only allowed in ready status");
+    /******/ options = options || {};
+    /******/
+
+    /******/ var cb;
+    /******/ var i;
+    /******/ var j;
+    /******/ var module;
+    /******/ var moduleId;
+    /******/
+
+    /******/ function getAffectedStuff(updateModuleId) {
+      /******/ var outdatedModules = [updateModuleId];
+      /******/ var outdatedDependencies = {};
+      /******/
+
+      /******/ var queue = outdatedModules.slice().map(function(id) {
+        /******/ return {
+          /******/ chain: [id],
+          /******/ id: id
+          /******/
+        };
+        /******/
+      });
+      /******/ while (queue.length > 0) {
+        /******/ var queueItem = queue.pop();
+        /******/ var moduleId = queueItem.id;
+        /******/ var chain = queueItem.chain;
+        /******/ module = installedModules[moduleId];
+        /******/ if (!module || module.hot._selfAccepted) /******/ continue;
+        /******/ if (module.hot._selfDeclined) {
+          /******/ return {
+            /******/ type: "self-declined",
+            /******/ chain: chain,
+            /******/ moduleId: moduleId
+            /******/
+          };
+          /******/
+        }
+        /******/ if (module.hot._main) {
+          /******/ return {
+            /******/ type: "unaccepted",
+            /******/ chain: chain,
+            /******/ moduleId: moduleId
+            /******/
+          };
+          /******/
+        }
+        /******/ for (var i = 0; i < module.parents.length; i++) {
+          /******/ var parentId = module.parents[i];
+          /******/ var parent = installedModules[parentId];
+          /******/ if (!parent) continue;
+          /******/ if (parent.hot._declinedDependencies[moduleId]) {
+            /******/ return {
+              /******/ type: "declined",
+              /******/ chain: chain.concat([parentId]),
+              /******/ moduleId: moduleId,
+              /******/ parentId: parentId
+              /******/
+            };
+            /******/
+          }
+          /******/ if (outdatedModules.indexOf(parentId) >= 0) continue;
+          /******/ if (parent.hot._acceptedDependencies[moduleId]) {
+            /******/ if (!outdatedDependencies[parentId])
+              /******/ outdatedDependencies[parentId] = [];
+            /******/ addAllToSet(outdatedDependencies[parentId], [moduleId]);
+            /******/ continue;
+            /******/
+          }
+          /******/ delete outdatedDependencies[parentId];
+          /******/ outdatedModules.push(parentId);
+          /******/ queue.push({
+            /******/ chain: chain.concat([parentId]),
+            /******/ id: parentId
+            /******/
+          });
+          /******/
+        }
+        /******/
+      }
+      /******/
+
+      /******/ return {
+        /******/ type: "accepted",
+        /******/ moduleId: updateModuleId,
+        /******/ outdatedModules: outdatedModules,
+        /******/ outdatedDependencies: outdatedDependencies
+        /******/
+      };
+      /******/
+    }
+    /******/
+
+    /******/ function addAllToSet(a, b) {
+      /******/ for (var i = 0; i < b.length; i++) {
+        /******/ var item = b[i];
+        /******/ if (a.indexOf(item) < 0) /******/ a.push(item);
+        /******/
+      }
+      /******/
+    } // at begin all updates modules are outdated // the "outdated" status can propagate to parents if they don't accept the children
+    /******/
+
+    /******/ /******/ /******/ var outdatedDependencies = {};
+    /******/ var outdatedModules = [];
+    /******/ var appliedUpdate = {};
+    /******/
+
+    /******/ var warnUnexpectedRequire = function warnUnexpectedRequire() {
+      /******/ console.warn(
+        "[HMR] unexpected require(" + result.moduleId + ") to disposed module"
+      );
+      /******/
+    };
+    /******/
+
+    /******/ for (var id in hotUpdate) {
+      /******/ if (Object.prototype.hasOwnProperty.call(hotUpdate, id)) {
+        /******/ moduleId = toModuleId(id);
+        /******/ var result;
+        /******/ if (hotUpdate[id]) {
+          /******/ result = getAffectedStuff(moduleId);
+          /******/
+        } else {
+          /******/ result = {
+            /******/ type: "disposed",
+            /******/ moduleId: id
+            /******/
+          };
+          /******/
+        }
+        /******/ var abortError = false;
+        /******/ var doApply = false;
+        /******/ var doDispose = false;
+        /******/ var chainInfo = "";
+        /******/ if (result.chain) {
+          /******/ chainInfo =
+            "\nUpdate propagation: " + result.chain.join(" -> ");
+          /******/
+        }
+        /******/ switch (result.type) {
+          /******/ case "self-declined":
+            /******/ if (options.onDeclined)
+              /******/ options.onDeclined(result);
+            /******/ if (!options.ignoreDeclined)
+              /******/ abortError = new Error(
+                "Aborted because of self decline: " +
+                  result.moduleId +
+                  chainInfo
+              );
+            /******/ break;
+          /******/ case "declined":
+            /******/ if (options.onDeclined)
+              /******/ options.onDeclined(result);
+            /******/ if (!options.ignoreDeclined)
+              /******/ abortError = new Error(
+                "Aborted because of declined dependency: " +
+                  result.moduleId +
+                  " in " +
+                  result.parentId +
+                  chainInfo
+              );
+            /******/ break;
+          /******/ case "unaccepted":
+            /******/ if (options.onUnaccepted)
+              /******/ options.onUnaccepted(result);
+            /******/ if (!options.ignoreUnaccepted)
+              /******/ abortError = new Error(
+                "Aborted because " + moduleId + " is not accepted" + chainInfo
+              );
+            /******/ break;
+          /******/ case "accepted":
+            /******/ if (options.onAccepted)
+              /******/ options.onAccepted(result);
+            /******/ doApply = true;
+            /******/ break;
+          /******/ case "disposed":
+            /******/ if (options.onDisposed)
+              /******/ options.onDisposed(result);
+            /******/ doDispose = true;
+            /******/ break;
+          /******/ default:
+            /******/ throw new Error("Unexception type " + result.type);
+          /******/
+        }
+        /******/ if (abortError) {
+          /******/ hotSetStatus("abort");
+          /******/ return Promise.reject(abortError);
+          /******/
+        }
+        /******/ if (doApply) {
+          /******/ appliedUpdate[moduleId] = hotUpdate[moduleId];
+          /******/ addAllToSet(outdatedModules, result.outdatedModules);
+          /******/ for (moduleId in result.outdatedDependencies) {
+            /******/ if (
+              Object.prototype.hasOwnProperty.call(
+                result.outdatedDependencies,
+                moduleId
+              )
+            ) {
+              /******/ if (!outdatedDependencies[moduleId])
+                /******/ outdatedDependencies[moduleId] = [];
+              /******/ addAllToSet(
+                outdatedDependencies[moduleId],
+                result.outdatedDependencies[moduleId]
+              );
+              /******/
+            }
+            /******/
+          }
+          /******/
+        }
+        /******/ if (doDispose) {
+          /******/ addAllToSet(outdatedModules, [result.moduleId]);
+          /******/ appliedUpdate[moduleId] = warnUnexpectedRequire;
+          /******/
+        }
+        /******/
+      }
+      /******/
+    } // Store self accepted outdated modules to require them later by the module system
+    /******/
+
+    /******/ /******/ var outdatedSelfAcceptedModules = [];
+    /******/ for (i = 0; i < outdatedModules.length; i++) {
+      /******/ moduleId = outdatedModules[i];
+      /******/ if (
+        installedModules[moduleId] &&
+        installedModules[moduleId].hot._selfAccepted
+      )
+        /******/ outdatedSelfAcceptedModules.push({
+          /******/ module: moduleId,
+          /******/ errorHandler: installedModules[moduleId].hot._selfAccepted
+          /******/
+        });
+      /******/
+    } // Now in "dispose" phase
+    /******/
+
+    /******/ /******/ hotSetStatus("dispose");
+    /******/ Object.keys(hotAvailableFilesMap).forEach(function(chunkId) {
+      /******/ if (hotAvailableFilesMap[chunkId] === false) {
+        /******/ hotDisposeChunk(chunkId);
+        /******/
+      }
+      /******/
+    });
+    /******/
+
+    /******/ var idx;
+    /******/ var queue = outdatedModules.slice();
+    /******/ while (queue.length > 0) {
+      /******/ moduleId = queue.pop();
+      /******/ module = installedModules[moduleId];
+      /******/ if (!module) continue;
+      /******/
+
+      /******/ var data = {}; // Call dispose handlers
+      /******/
+
+      /******/ /******/ var disposeHandlers = module.hot._disposeHandlers;
+      /******/ for (j = 0; j < disposeHandlers.length; j++) {
+        /******/ cb = disposeHandlers[j];
+        /******/ cb(data);
+        /******/
+      }
+      /******/ hotCurrentModuleData[moduleId] = data; // disable module (this disables requires from this module)
+      /******/
+
+      /******/ /******/ module.hot.active = false; // remove module from cache
+      /******/
+
+      /******/ /******/ delete installedModules[moduleId]; // when disposing there is no need to call dispose handler
+      /******/
+
+      /******/ /******/ delete outdatedDependencies[moduleId]; // remove "parents" references from all children
+      /******/
+
+      /******/ /******/ for (j = 0; j < module.children.length; j++) {
+        /******/ var child = installedModules[module.children[j]];
+        /******/ if (!child) continue;
+        /******/ idx = child.parents.indexOf(moduleId);
+        /******/ if (idx >= 0) {
+          /******/ child.parents.splice(idx, 1);
+          /******/
+        }
+        /******/
+      }
+      /******/
+    } // remove outdated dependency from module children
+    /******/
+
+    /******/ /******/ var dependency;
+    /******/ var moduleOutdatedDependencies;
+    /******/ for (moduleId in outdatedDependencies) {
+      /******/ if (
+        Object.prototype.hasOwnProperty.call(outdatedDependencies, moduleId)
+      ) {
+        /******/ module = installedModules[moduleId];
+        /******/ if (module) {
+          /******/ moduleOutdatedDependencies = outdatedDependencies[moduleId];
+          /******/ for (j = 0; j < moduleOutdatedDependencies.length; j++) {
+            /******/ dependency = moduleOutdatedDependencies[j];
+            /******/ idx = module.children.indexOf(dependency);
+            /******/ if (idx >= 0) module.children.splice(idx, 1);
+            /******/
+          }
+          /******/
+        }
+        /******/
+      }
+      /******/
+    } // Not in "apply" phase
+    /******/
+
+    /******/ /******/ hotSetStatus("apply");
+    /******/
+
+    /******/ hotCurrentHash = hotUpdateNewHash; // insert new code
+    /******/
+
+    /******/ /******/ for (moduleId in appliedUpdate) {
+      /******/ if (
+        Object.prototype.hasOwnProperty.call(appliedUpdate, moduleId)
+      ) {
+        /******/ modules[moduleId] = appliedUpdate[moduleId];
+        /******/
+      }
+      /******/
+    } // call accept handlers
+    /******/
+
+    /******/ /******/ var error = null;
+    /******/ for (moduleId in outdatedDependencies) {
+      /******/ if (
+        Object.prototype.hasOwnProperty.call(outdatedDependencies, moduleId)
+      ) {
+        /******/ module = installedModules[moduleId];
+        /******/ if (module) {
+          /******/ moduleOutdatedDependencies = outdatedDependencies[moduleId];
+          /******/ var callbacks = [];
+          /******/ for (i = 0; i < moduleOutdatedDependencies.length; i++) {
+            /******/ dependency = moduleOutdatedDependencies[i];
+            /******/ cb = module.hot._acceptedDependencies[dependency];
+            /******/ if (cb) {
+              /******/ if (callbacks.indexOf(cb) >= 0) continue;
+              /******/ callbacks.push(cb);
+              /******/
+            }
+            /******/
+          }
+          /******/ for (i = 0; i < callbacks.length; i++) {
+            /******/ cb = callbacks[i];
+            /******/ try {
+              /******/ cb(moduleOutdatedDependencies);
+              /******/
+            } catch (err) {
+              /******/ if (options.onErrored) {
+                /******/ options.onErrored({
+                  /******/ type: "accept-errored",
+                  /******/ moduleId: moduleId,
+                  /******/ dependencyId: moduleOutdatedDependencies[i],
+                  /******/ error: err
+                  /******/
+                });
+                /******/
+              }
+              /******/ if (!options.ignoreErrored) {
+                /******/ if (!error) /******/ error = err;
+                /******/
+              }
+              /******/
+            }
+            /******/
+          }
+          /******/
+        }
+        /******/
+      }
+      /******/
+    } // Load self accepted modules
+    /******/
+
+    /******/ /******/ for (i = 0; i < outdatedSelfAcceptedModules.length; i++) {
+      /******/ var item = outdatedSelfAcceptedModules[i];
+      /******/ moduleId = item.module;
+      /******/ hotCurrentParents = [moduleId];
+      /******/ try {
+        /******/ __webpack_require__(moduleId);
+        /******/
+      } catch (err) {
+        /******/ if (typeof item.errorHandler === "function") {
+          /******/ try {
+            /******/ item.errorHandler(err);
+            /******/
+          } catch (err2) {
+            /******/ if (options.onErrored) {
+              /******/ options.onErrored({
+                /******/ type: "self-accept-error-handler-errored",
+                /******/ moduleId: moduleId,
+                /******/ error: err2,
+                /******/ orginalError: err, // TODO remove in webpack 4
+                /******/ originalError: err
+                /******/
+              });
+              /******/
+            }
+            /******/ if (!options.ignoreErrored) {
+              /******/ if (!error) /******/ error = err2;
+              /******/
+            }
+            /******/ if (!error) /******/ error = err;
+            /******/
+          }
+          /******/
+        } else {
+          /******/ if (options.onErrored) {
+            /******/ options.onErrored({
+              /******/ type: "self-accept-errored",
+              /******/ moduleId: moduleId,
+              /******/ error: err
+              /******/
+            });
+            /******/
+          }
+          /******/ if (!options.ignoreErrored) {
+            /******/ if (!error) /******/ error = err;
+            /******/
+          }
+          /******/
+        }
+        /******/
+      }
+      /******/
+    } // handle errors in accept handlers and self accepted module load
+    /******/
+
+    /******/ /******/ if (error) {
+      /******/ hotSetStatus("fail");
+      /******/ return Promise.reject(error);
+      /******/
+    }
+    /******/
+
+    /******/ hotSetStatus("idle");
+    /******/ return new Promise(function(resolve) {
+      /******/ resolve(outdatedModules);
+      /******/
+    });
+    /******/
+  } // The module cache
+  /******/
+  /******/ /******/ var installedModules = {}; // The require function
+  /******/
+  /******/ /******/ function __webpack_require__(moduleId) {
+    /******/
+    /******/ // Check if module is in cache
+    /******/ if (installedModules[moduleId]) {
+      /******/ return installedModules[moduleId].exports;
+      /******/
+    } // Create a new module (and put it into the cache)
+    /******/ /******/ var module = (installedModules[moduleId] = {
+      /******/ i: moduleId,
+      /******/ l: false,
+      /******/ exports: {},
+      /******/ hot: hotCreateModule(moduleId),
+      /******/ parents: ((hotCurrentParentsTemp = hotCurrentParents),
+      (hotCurrentParents = []),
+      hotCurrentParentsTemp),
+      /******/ children: []
+      /******/
+    }); // Execute the module function
+    /******/
+    /******/ /******/ modules[moduleId].call(
+      module.exports,
+      module,
+      module.exports,
+      hotCreateRequire(moduleId)
+    ); // Flag the module as loaded
+    /******/
+    /******/ /******/ module.l = true; // Return the exports of the module
+    /******/
+    /******/ /******/ return module.exports;
+    /******/
+  } // expose the modules object (__webpack_modules__)
+  /******/
+  /******/
+  /******/ /******/ __webpack_require__.m = modules; // expose the module cache
+  /******/
+  /******/ /******/ __webpack_require__.c = installedModules; // define getter function for harmony exports
+  /******/
+  /******/ /******/ __webpack_require__.d = function(exports, name, getter) {
+    /******/ if (!__webpack_require__.o(exports, name)) {
+      /******/ Object.defineProperty(exports, name, {
+        /******/ configurable: false,
+        /******/ enumerable: true,
+        /******/ get: getter
+        /******/
+      });
+      /******/
+    }
+    /******/
+  }; // getDefaultExport function for compatibility with non-harmony modules
+  /******/
+  /******/ /******/ __webpack_require__.n = function(module) {
+    /******/ var getter =
+      module && module.__esModule
+        ? /******/ function getDefault() {
+            return module["default"];
+          }
+        : /******/ function getModuleExports() {
+            return module;
+          };
+    /******/ __webpack_require__.d(getter, "a", getter);
+    /******/ return getter;
+    /******/
+  }; // Object.prototype.hasOwnProperty.call
+  /******/
+  /******/ /******/ __webpack_require__.o = function(object, property) {
+    return Object.prototype.hasOwnProperty.call(object, property);
+  }; // __webpack_public_path__
+  /******/
+  /******/ /******/ __webpack_require__.p = "/"; // __webpack_hash__
+  /******/
+  /******/ /******/ __webpack_require__.h = function() {
+    return hotCurrentHash;
+  }; // Load entry module and return exports
+  /******/
+  /******/ /******/ return hotCreateRequire(0)((__webpack_require__.s = 0));
+  /******/
+})(
+  /************************************************************************/
+  /******/ {
+    /***/ "./node_modules/ansi-regex/index.js":
+      /*!******************************************!*\
+  !*** ./node_modules/ansi-regex/index.js ***!
+  \******************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+
+        module.exports = function() {
+          return /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-PRZcf-nqry=><]/g;
+        };
+
+        /***/
+      },
+
+    /***/ "./node_modules/ansi-styles/index.js":
+      /*!*******************************************!*\
+  !*** ./node_modules/ansi-styles/index.js ***!
+  \*******************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+        /* WEBPACK VAR INJECTION */ (function(module) {
+          function assembleStyles() {
+            var styles = {
+              modifiers: {
+                reset: [0, 0],
+                bold: [1, 22], // 21 isn't widely supported and 22 does the same thing
+                dim: [2, 22],
+                italic: [3, 23],
+                underline: [4, 24],
+                inverse: [7, 27],
+                hidden: [8, 28],
+                strikethrough: [9, 29]
+              },
+              colors: {
+                black: [30, 39],
+                red: [31, 39],
+                green: [32, 39],
+                yellow: [33, 39],
+                blue: [34, 39],
+                magenta: [35, 39],
+                cyan: [36, 39],
+                white: [37, 39],
+                gray: [90, 39]
+              },
+              bgColors: {
+                bgBlack: [40, 49],
+                bgRed: [41, 49],
+                bgGreen: [42, 49],
+                bgYellow: [43, 49],
+                bgBlue: [44, 49],
+                bgMagenta: [45, 49],
+                bgCyan: [46, 49],
+                bgWhite: [47, 49]
+              }
+            };
+
+            // fix humans
+            styles.colors.grey = styles.colors.gray;
+
+            Object.keys(styles).forEach(function(groupName) {
+              var group = styles[groupName];
+
+              Object.keys(group).forEach(function(styleName) {
+                var style = group[styleName];
+
+                styles[styleName] = group[styleName] = {
+                  open: "\u001b[" + style[0] + "m",
+                  close: "\u001b[" + style[1] + "m"
+                };
+              });
+
+              Object.defineProperty(styles, groupName, {
+                value: group,
+                enumerable: false
+              });
+            });
+
+            return styles;
+          }
+
+          Object.defineProperty(module, "exports", {
+            enumerable: true,
+            get: assembleStyles
+          });
+
+          /* WEBPACK VAR INJECTION */
+        }.call(
+          exports,
+          __webpack_require__(
+            /*! ./../webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js"
+          )(module)
+        ));
+
+        /***/
+      },
+
+    /***/ "./node_modules/asap/browser-raw.js":
+      /*!******************************************!*\
+  !*** ./node_modules/asap/browser-raw.js ***!
+  \******************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+        /* WEBPACK VAR INJECTION */ (function(global) {
+          // Use the fastest means possible to execute a task in its own turn, with
+          // priority over other events including IO, animation, reflow, and redraw
+          // events in browsers.
+          //
+          // An exception thrown by a task will permanently interrupt the processing of
+          // subsequent tasks. The higher level `asap` function ensures that if an
+          // exception is thrown by a task, that the task queue will continue flushing as
+          // soon as possible, but if you use `rawAsap` directly, you are responsible to
+          // either ensure that no exceptions are thrown from your task, or to manually
+          // call `rawAsap.requestFlush` if an exception is thrown.
+          module.exports = rawAsap;
+          function rawAsap(task) {
+            if (!queue.length) {
+              requestFlush();
+              flushing = true;
+            }
+            // Equivalent to push, but avoids a function call.
+            queue[queue.length] = task;
+          }
+
+          var queue = [];
+          // Once a flush has been requested, no further calls to `requestFlush` are
+          // necessary until the next `flush` completes.
+          var flushing = false;
+          // `requestFlush` is an implementation-specific method that attempts to kick
+          // off a `flush` event as quickly as possible. `flush` will attempt to exhaust
+          // the event queue before yielding to the browser's own event loop.
+          var requestFlush;
+          // The position of the next task to execute in the task queue. This is
+          // preserved between calls to `flush` so that it can be resumed if
+          // a task throws an exception.
+          var index = 0;
+          // If a task schedules additional tasks recursively, the task queue can grow
+          // unbounded. To prevent memory exhaustion, the task queue will periodically
+          // truncate already-completed tasks.
+          var capacity = 1024;
+
+          // The flush function processes all tasks that have been scheduled with
+          // `rawAsap` unless and until one of those tasks throws an exception.
+          // If a task throws an exception, `flush` ensures that its state will remain
+          // consistent and will resume where it left off when called again.
+          // However, `flush` does not make any arrangements to be called again if an
+          // exception is thrown.
+          function flush() {
+            while (index < queue.length) {
+              var currentIndex = index;
+              // Advance the index before calling the task. This ensures that we will
+              // begin flushing on the next task the task throws an error.
+              index = index + 1;
+              queue[currentIndex].call();
+              // Prevent leaking memory for long chains of recursive calls to `asap`.
+              // If we call `asap` within tasks scheduled by `asap`, the queue will
+              // grow, but to avoid an O(n) walk for every task we execute, we don't
+              // shift tasks off the queue after they have been executed.
+              // Instead, we periodically shift 1024 tasks off the queue.
+              if (index > capacity) {
+                // Manually shift all values starting at the index back to the
+                // beginning of the queue.
+                for (
+                  var scan = 0, newLength = queue.length - index;
+                  scan < newLength;
+                  scan++
+                ) {
+                  queue[scan] = queue[scan + index];
+                }
+                queue.length -= index;
+                index = 0;
+              }
+            }
+            queue.length = 0;
+            index = 0;
+            flushing = false;
+          }
+
+          // `requestFlush` is implemented using a strategy based on data collected from
+          // every available SauceLabs Selenium web driver worker at time of writing.
+          // https://docs.google.com/spreadsheets/d/1mG-5UYGup5qxGdEMWkhP6BWCz053NUb2E1QoUTU16uA/edit#gid=783724593
+
+          // Safari 6 and 6.1 for desktop, iPad, and iPhone are the only browsers that
+          // have WebKitMutationObserver but not un-prefixed MutationObserver.
+          // Must use `global` or `self` instead of `window` to work in both frames and web
+          // workers. `global` is a provision of Browserify, Mr, Mrs, or Mop.
+
+          /* globals self */
+          var scope = typeof global !== "undefined" ? global : self;
+          var BrowserMutationObserver =
+            scope.MutationObserver || scope.WebKitMutationObserver;
+
+          // MutationObservers are desirable because they have high priority and work
+          // reliably everywhere they are implemented.
+          // They are implemented in all modern browsers.
+          //
+          // - Android 4-4.3
+          // - Chrome 26-34
+          // - Firefox 14-29
+          // - Internet Explorer 11
+          // - iPad Safari 6-7.1
+          // - iPhone Safari 7-7.1
+          // - Safari 6-7
+          if (typeof BrowserMutationObserver === "function") {
+            requestFlush = makeRequestCallFromMutationObserver(flush);
+
+            // MessageChannels are desirable because they give direct access to the HTML
+            // task queue, are implemented in Internet Explorer 10, Safari 5.0-1, and Opera
+            // 11-12, and in web workers in many engines.
+            // Although message channels yield to any queued rendering and IO tasks, they
+            // would be better than imposing the 4ms delay of timers.
+            // However, they do not work reliably in Internet Explorer or Safari.
+
+            // Internet Explorer 10 is the only browser that has setImmediate but does
+            // not have MutationObservers.
+            // Although setImmediate yields to the browser's renderer, it would be
+            // preferrable to falling back to setTimeout since it does not have
+            // the minimum 4ms penalty.
+            // Unfortunately there appears to be a bug in Internet Explorer 10 Mobile (and
+            // Desktop to a lesser extent) that renders both setImmediate and
+            // MessageChannel useless for the purposes of ASAP.
+            // https://github.com/kriskowal/q/issues/396
+
+            // Timers are implemented universally.
+            // We fall back to timers in workers in most engines, and in foreground
+            // contexts in the following browsers.
+            // However, note that even this simple case requires nuances to operate in a
+            // broad spectrum of browsers.
+            //
+            // - Firefox 3-13
+            // - Internet Explorer 6-9
+            // - iPad Safari 4.3
+            // - Lynx 2.8.7
+          } else {
+            requestFlush = makeRequestCallFromTimer(flush);
+          }
+
+          // `requestFlush` requests that the high priority event queue be flushed as
+          // soon as possible.
+          // This is useful to prevent an error thrown in a task from stalling the event
+          // queue if the exception handled by Node.js’s
+          // `process.on("uncaughtException")` or by a domain.
+          rawAsap.requestFlush = requestFlush;
+
+          // To request a high priority event, we induce a mutation observer by toggling
+          // the text of a text node between "1" and "-1".
+          function makeRequestCallFromMutationObserver(callback) {
+            var toggle = 1;
+            var observer = new BrowserMutationObserver(callback);
+            var node = document.createTextNode("");
+            observer.observe(node, { characterData: true });
+            return function requestCall() {
+              toggle = -toggle;
+              node.data = toggle;
+            };
+          }
+
+          // The message channel technique was discovered by Malte Ubl and was the
+          // original foundation for this library.
+          // http://www.nonblocking.io/2011/06/windownexttick.html
+
+          // Safari 6.0.5 (at least) intermittently fails to create message ports on a
+          // page's first load. Thankfully, this version of Safari supports
+          // MutationObservers, so we don't need to fall back in that case.
+
+          // function makeRequestCallFromMessageChannel(callback) {
+          //     var channel = new MessageChannel();
+          //     channel.port1.onmessage = callback;
+          //     return function requestCall() {
+          //         channel.port2.postMessage(0);
+          //     };
+          // }
+
+          // For reasons explained above, we are also unable to use `setImmediate`
+          // under any circumstances.
+          // Even if we were, there is another bug in Internet Explorer 10.
+          // It is not sufficient to assign `setImmediate` to `requestFlush` because
+          // `setImmediate` must be called *by name* and therefore must be wrapped in a
+          // closure.
+          // Never forget.
+
+          // function makeRequestCallFromSetImmediate(callback) {
+          //     return function requestCall() {
+          //         setImmediate(callback);
+          //     };
+          // }
+
+          // Safari 6.0 has a problem where timers will get lost while the user is
+          // scrolling. This problem does not impact ASAP because Safari 6.0 supports
+          // mutation observers, so that implementation is used instead.
+          // However, if we ever elect to use timers in Safari, the prevalent work-around
+          // is to add a scroll event listener that calls for a flush.
+
+          // `setTimeout` does not call the passed callback if the delay is less than
+          // approximately 7 in web workers in Firefox 8 through 18, and sometimes not
+          // even then.
+
+          function makeRequestCallFromTimer(callback) {
+            return function requestCall() {
+              // We dispatch a timeout with a specified delay of 0 for engines that
+              // can reliably accommodate that request. This will usually be snapped
+              // to a 4 milisecond delay, but once we're flushing, there's no delay
+              // between events.
+              var timeoutHandle = setTimeout(handleTimer, 0);
+              // However, since this timer gets frequently dropped in Firefox
+              // workers, we enlist an interval handle that will try to fire
+              // an event 20 times per second until it succeeds.
+              var intervalHandle = setInterval(handleTimer, 50);
+
+              function handleTimer() {
+                // Whichever timer succeeds will cancel both timers and
+                // execute the callback.
+                clearTimeout(timeoutHandle);
+                clearInterval(intervalHandle);
+                callback();
+              }
+            };
+          }
+
+          // This is for `asap.js` only.
+          // Its name will be periodically randomized to break any code that depends on
+          // its existence.
+          rawAsap.makeRequestCallFromTimer = makeRequestCallFromTimer;
+
+          // ASAP was originally a nextTick shim included in Q. This was factored out
+          // into this ASAP package. It was later adapted to RSVP which made further
+          // amendments. These decisions, particularly to marginalize MessageChannel and
+          // to capture the MutationObserver implementation in a closure, were integrated
+          // back into ASAP proper.
+          // https://github.com/tildeio/rsvp.js/blob/cddf7232546a9cf858524b75cde6f9edf72620a7/lib/rsvp/asap.js
+
+          /* WEBPACK VAR INJECTION */
+        }.call(
+          exports,
+          __webpack_require__(
+            /*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"
+          )
+        ));
+
+        /***/
+      },
+
+    /***/ "./node_modules/escape-string-regexp/index.js":
+      /*!****************************************************!*\
+  !*** ./node_modules/escape-string-regexp/index.js ***!
+  \****************************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+
+        var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g;
+
+        module.exports = function(str) {
+          if (typeof str !== "string") {
+            throw new TypeError("Expected a string");
+          }
+
+          return str.replace(matchOperatorsRe, "\\$&");
+        };
+
+        /***/
+      },
+
+    /***/ "./node_modules/fbjs/lib/EventListener.js":
+      /*!************************************************!*\
+  !*** ./node_modules/fbjs/lib/EventListener.js ***!
+  \************************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+
+        /**
+         * 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.
+         *
+         * @typechecks
+         */
+
+        var emptyFunction = __webpack_require__(
+          /*! ./emptyFunction */ "./node_modules/fbjs/lib/emptyFunction.js"
+        );
+
+        /**
+         * Upstream version of event listener. Does not take into account specific
+         * nature of platform.
+         */
+        var EventListener = {
+          /**
+           * Listen to DOM events during the bubble phase.
+           *
+           * @param {DOMEventTarget} target DOM element to register listener on.
+           * @param {string} eventType Event type, e.g. 'click' or 'mouseover'.
+           * @param {function} callback Callback function.
+           * @return {object} Object with a `remove` method.
+           */
+          listen: function listen(target, eventType, callback) {
+            if (target.addEventListener) {
+              target.addEventListener(eventType, callback, false);
+              return {
+                remove: function remove() {
+                  target.removeEventListener(eventType, callback, false);
+                }
+              };
+            } else if (target.attachEvent) {
+              target.attachEvent("on" + eventType, callback);
+              return {
+                remove: function remove() {
+                  target.detachEvent("on" + eventType, callback);
+                }
+              };
+            }
+          },
+
+          /**
+           * Listen to DOM events during the capture phase.
+           *
+           * @param {DOMEventTarget} target DOM element to register listener on.
+           * @param {string} eventType Event type, e.g. 'click' or 'mouseover'.
+           * @param {function} callback Callback function.
+           * @return {object} Object with a `remove` method.
+           */
+          capture: function capture(target, eventType, callback) {
+            if (target.addEventListener) {
+              target.addEventListener(eventType, callback, true);
+              return {
+                remove: function remove() {
+                  target.removeEventListener(eventType, callback, true);
+                }
+              };
+            } else {
+              if (true) {
+                console.error(
+                  "Attempted to listen to events during the capture phase on a " +
+                    "browser that does not support the capture phase. Your application " +
+                    "will not receive some events."
+                );
+              }
+              return {
+                remove: emptyFunction
+              };
+            }
+          },
+
+          registerDefault: function registerDefault() {}
+        };
+
+        module.exports = EventListener;
+
+        /***/
+      },
+
+    /***/ "./node_modules/fbjs/lib/ExecutionEnvironment.js":
+      /*!*******************************************************!*\
+  !*** ./node_modules/fbjs/lib/ExecutionEnvironment.js ***!
+  \*******************************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+        /**
+         * 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 canUseDOM = !!(
+          typeof window !== "undefined" &&
+          window.document &&
+          window.document.createElement
+        );
+
+        /**
+         * Simple, lightweight module assisting with the detection and context of
+         * Worker. Helps avoid circular dependencies and allows code to reason about
+         * whether or not they are in a Worker, even if they never include the main
+         * `ReactWorker` dependency.
+         */
+        var ExecutionEnvironment = {
+          canUseDOM: canUseDOM,
+
+          canUseWorkers: typeof Worker !== "undefined",
+
+          canUseEventListeners:
+            canUseDOM && !!(window.addEventListener || window.attachEvent),
+
+          canUseViewport: canUseDOM && !!window.screen,
+
+          isInWorker: !canUseDOM // For now, this is true - might change in the future.
+        };
+
+        module.exports = ExecutionEnvironment;
+
+        /***/
+      },
+
+    /***/ "./node_modules/fbjs/lib/camelize.js":
+      /*!*******************************************!*\
+  !*** ./node_modules/fbjs/lib/camelize.js ***!
+  \*******************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+
+        /**
+         * 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.
+         *
+         * @typechecks
+         */
+
+        var _hyphenPattern = /-(.)/g;
+
+        /**
+         * Camelcases a hyphenated string, for example:
+         *
+         *   > camelize('background-color')
+         *   < "backgroundColor"
+         *
+         * @param {string} string
+         * @return {string}
+         */
+        function camelize(string) {
+          return string.replace(_hyphenPattern, function(_, character) {
+            return character.toUpperCase();
+          });
+        }
+
+        module.exports = camelize;
+
+        /***/
+      },
+
+    /***/ "./node_modules/fbjs/lib/camelizeStyleName.js":
+      /*!****************************************************!*\
+  !*** ./node_modules/fbjs/lib/camelizeStyleName.js ***!
+  \****************************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+        /**
+         * 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.
+         *
+         * @typechecks
+         */
+
+        var camelize = __webpack_require__(
+          /*! ./camelize */ "./node_modules/fbjs/lib/camelize.js"
+        );
+
+        var msPattern = /^-ms-/;
+
+        /**
+         * Camelcases a hyphenated CSS property name, for example:
+         *
+         *   > camelizeStyleName('background-color')
+         *   < "backgroundColor"
+         *   > camelizeStyleName('-moz-transition')
+         *   < "MozTransition"
+         *   > camelizeStyleName('-ms-transition')
+         *   < "msTransition"
+         *
+         * As Andi Smith suggests
+         * (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix
+         * is converted to lowercase `ms`.
+         *
+         * @param {string} string
+         * @return {string}
+         */
+        function camelizeStyleName(string) {
+          return camelize(string.replace(msPattern, "ms-"));
+        }
+
+        module.exports = camelizeStyleName;
+
+        /***/
+      },
+
+    /***/ "./node_modules/fbjs/lib/containsNode.js":
+      /*!***********************************************!*\
+  !*** ./node_modules/fbjs/lib/containsNode.js ***!
+  \***********************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+
+        /**
+         * 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 isTextNode = __webpack_require__(
+          /*! ./isTextNode */ "./node_modules/fbjs/lib/isTextNode.js"
+        );
+
+        /*eslint-disable no-bitwise */
+
+        /**
+         * Checks if a given DOM node contains or is another DOM node.
+         */
+        function containsNode(outerNode, innerNode) {
+          if (!outerNode || !innerNode) {
+            return false;
+          } else if (outerNode === innerNode) {
+            return true;
+          } else if (isTextNode(outerNode)) {
+            return false;
+          } else if (isTextNode(innerNode)) {
+            return containsNode(outerNode, innerNode.parentNode);
+          } else if ("contains" in outerNode) {
+            return outerNode.contains(innerNode);
+          } else if (outerNode.compareDocumentPosition) {
+            return !!(outerNode.compareDocumentPosition(innerNode) & 16);
+          } else {
+            return false;
+          }
+        }
+
+        module.exports = containsNode;
+
+        /***/
+      },
+
+    /***/ "./node_modules/fbjs/lib/emptyFunction.js":
+      /*!************************************************!*\
+  !*** ./node_modules/fbjs/lib/emptyFunction.js ***!
+  \************************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+
+        /**
+         * 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.
+         *
+         *
+         */
+
+        function makeEmptyFunction(arg) {
+          return function() {
+            return arg;
+          };
+        }
+
+        /**
+         * This function accepts and discards inputs; it has no side effects. This is
+         * primarily useful idiomatically for overridable function endpoints which
+         * always need to be callable, since JS lacks a null-call idiom ala Cocoa.
+         */
+        var emptyFunction = function emptyFunction() {};
+
+        emptyFunction.thatReturns = makeEmptyFunction;
+        emptyFunction.thatReturnsFalse = makeEmptyFunction(false);
+        emptyFunction.thatReturnsTrue = makeEmptyFunction(true);
+        emptyFunction.thatReturnsNull = makeEmptyFunction(null);
+        emptyFunction.thatReturnsThis = function() {
+          return this;
+        };
+        emptyFunction.thatReturnsArgument = function(arg) {
+          return arg;
+        };
+
+        module.exports = emptyFunction;
+
+        /***/
+      },
+
+    /***/ "./node_modules/fbjs/lib/emptyObject.js":
+      /*!**********************************************!*\
+  !*** ./node_modules/fbjs/lib/emptyObject.js ***!
+  \**********************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+        /**
+         * 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 emptyObject = {};
+
+        if (true) {
+          Object.freeze(emptyObject);
+        }
+
+        module.exports = emptyObject;
+
+        /***/
+      },
+
+    /***/ "./node_modules/fbjs/lib/focusNode.js":
+      /*!********************************************!*\
+  !*** ./node_modules/fbjs/lib/focusNode.js ***!
+  \********************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+        /**
+         * 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.
+         *
+         */
+
+        /**
+         * @param {DOMElement} node input/textarea to focus
+         */
+
+        function focusNode(node) {
+          // IE8 can throw "Can't move focus to the control because it is invisible,
+          // not enabled, or of a type that does not accept the focus." for all kinds of
+          // reasons that are too expensive and fragile to test.
+          try {
+            node.focus();
+          } catch (e) {}
+        }
+
+        module.exports = focusNode;
+
+        /***/
+      },
+
+    /***/ "./node_modules/fbjs/lib/getActiveElement.js":
+      /*!***************************************************!*\
+  !*** ./node_modules/fbjs/lib/getActiveElement.js ***!
+  \***************************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+
+        /**
+         * 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.
+         *
+         * @typechecks
+         */
+
+        /* eslint-disable fb-www/typeof-undefined */
+
+        /**
+         * Same as document.activeElement but wraps in a try-catch block. In IE it is
+         * not safe to call document.activeElement if there is nothing focused.
+         *
+         * The activeElement will be null only if the document or document body is not
+         * yet defined.
+         *
+         * @param {?DOMDocument} doc Defaults to current document.
+         * @return {?DOMElement}
+         */
+        function getActiveElement(doc) /*?DOMElement*/ {
+          doc = doc || (typeof document !== "undefined" ? document : undefined);
+          if (typeof doc === "undefined") {
+            return null;
+          }
+          try {
+            return doc.activeElement || doc.body;
+          } catch (e) {
+            return doc.body;
+          }
+        }
+
+        module.exports = getActiveElement;
+
+        /***/
+      },
+
+    /***/ "./node_modules/fbjs/lib/hyphenate.js":
+      /*!********************************************!*\
+  !*** ./node_modules/fbjs/lib/hyphenate.js ***!
+  \********************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+
+        /**
+         * 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.
+         *
+         * @typechecks
+         */
+
+        var _uppercasePattern = /([A-Z])/g;
+
+        /**
+         * Hyphenates a camelcased string, for example:
+         *
+         *   > hyphenate('backgroundColor')
+         *   < "background-color"
+         *
+         * For CSS style names, use `hyphenateStyleName` instead which works properly
+         * with all vendor prefixes, including `ms`.
+         *
+         * @param {string} string
+         * @return {string}
+         */
+        function hyphenate(string) {
+          return string.replace(_uppercasePattern, "-$1").toLowerCase();
+        }
+
+        module.exports = hyphenate;
+
+        /***/
+      },
+
+    /***/ "./node_modules/fbjs/lib/hyphenateStyleName.js":
+      /*!*****************************************************!*\
+  !*** ./node_modules/fbjs/lib/hyphenateStyleName.js ***!
+  \*****************************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+        /**
+         * 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.
+         *
+         * @typechecks
+         */
+
+        var hyphenate = __webpack_require__(
+          /*! ./hyphenate */ "./node_modules/fbjs/lib/hyphenate.js"
+        );
+
+        var msPattern = /^ms-/;
+
+        /**
+         * Hyphenates a camelcased CSS property name, for example:
+         *
+         *   > hyphenateStyleName('backgroundColor')
+         *   < "background-color"
+         *   > hyphenateStyleName('MozTransition')
+         *   < "-moz-transition"
+         *   > hyphenateStyleName('msTransition')
+         *   < "-ms-transition"
+         *
+         * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix
+         * is converted to `-ms-`.
+         *
+         * @param {string} string
+         * @return {string}
+         */
+        function hyphenateStyleName(string) {
+          return hyphenate(string).replace(msPattern, "-ms-");
+        }
+
+        module.exports = hyphenateStyleName;
+
+        /***/
+      },
+
+    /***/ "./node_modules/fbjs/lib/invariant.js":
+      /*!********************************************!*\
+  !*** ./node_modules/fbjs/lib/invariant.js ***!
+  \********************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+        /**
+         * 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.
+         *
+         */
+
+        /**
+         * Use invariant() to assert state which your program assumes to be true.
+         *
+         * Provide sprintf-style format (only %s is supported) and arguments
+         * to provide information about what broke and what you were
+         * expecting.
+         *
+         * The invariant message will be stripped in production, but the invariant
+         * will remain to ensure logic does not differ in production.
+         */
+
+        var validateFormat = function validateFormat(format) {};
+
+        if (true) {
+          validateFormat = function validateFormat(format) {
+            if (format === undefined) {
+              throw new Error("invariant requires an error message argument");
+            }
+          };
+        }
+
+        function invariant(condition, format, a, b, c, d, e, f) {
+          validateFormat(format);
+
+          if (!condition) {
+            var error;
+            if (format === undefined) {
+              error = new Error(
+                "Minified exception occurred; use the non-minified dev environment " +
+                  "for the full error message and additional helpful warnings."
+              );
+            } else {
+              var args = [a, b, c, d, e, f];
+              var argIndex = 0;
+              error = new Error(
+                format.replace(/%s/g, function() {
+                  return args[argIndex++];
+                })
+              );
+              error.name = "Invariant Violation";
+            }
+
+            error.framesToPop = 1; // we don't care about invariant's own frame
+            throw error;
+          }
+        }
+
+        module.exports = invariant;
+
+        /***/
+      },
+
+    /***/ "./node_modules/fbjs/lib/isNode.js":
+      /*!*****************************************!*\
+  !*** ./node_modules/fbjs/lib/isNode.js ***!
+  \*****************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+
+        /**
+         * 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.
+         *
+         * @typechecks
+         */
+
+        /**
+         * @param {*} object The object to check.
+         * @return {boolean} Whether or not the object is a DOM node.
+         */
+        function isNode(object) {
+          var doc = object ? object.ownerDocument || object : document;
+          var defaultView = doc.defaultView || window;
+          return !!(
+            object &&
+            (typeof defaultView.Node === "function"
+              ? object instanceof defaultView.Node
+              : typeof object === "object" &&
+                typeof object.nodeType === "number" &&
+                typeof object.nodeName === "string")
+          );
+        }
+
+        module.exports = isNode;
+
+        /***/
+      },
+
+    /***/ "./node_modules/fbjs/lib/isTextNode.js":
+      /*!*********************************************!*\
+  !*** ./node_modules/fbjs/lib/isTextNode.js ***!
+  \*********************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+
+        /**
+         * 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.
+         *
+         * @typechecks
+         */
+
+        var isNode = __webpack_require__(
+          /*! ./isNode */ "./node_modules/fbjs/lib/isNode.js"
+        );
+
+        /**
+         * @param {*} object The object to check.
+         * @return {boolean} Whether or not the object is a DOM text node.
+         */
+        function isTextNode(object) {
+          return isNode(object) && object.nodeType == 3;
+        }
+
+        module.exports = isTextNode;
+
+        /***/
+      },
+
+    /***/ "./node_modules/fbjs/lib/shallowEqual.js":
+      /*!***********************************************!*\
+  !*** ./node_modules/fbjs/lib/shallowEqual.js ***!
+  \***********************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+        /**
+         * 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.
+         *
+         * @typechecks
+         *
+         */
+
+        /*eslint-disable no-self-compare */
+
+        var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+        /**
+         * inlined Object.is polyfill to avoid requiring consumers ship their own
+         * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
+         */
+        function is(x, y) {
+          // SameValue algorithm
+          if (x === y) {
+            // Steps 1-5, 7-10
+            // Steps 6.b-6.e: +0 != -0
+            // Added the nonzero y check to make Flow happy, but it is redundant
+            return x !== 0 || y !== 0 || 1 / x === 1 / y;
+          } else {
+            // Step 6.a: NaN == NaN
+            return x !== x && y !== y;
+          }
+        }
+
+        /**
+         * Performs equality by iterating through keys on an object and returning false
+         * when any key has values which are not strictly equal between the arguments.
+         * Returns true when the values of all keys are strictly equal.
+         */
+        function shallowEqual(objA, objB) {
+          if (is(objA, objB)) {
+            return true;
+          }
+
+          if (
+            typeof objA !== "object" ||
+            objA === null ||
+            typeof objB !== "object" ||
+            objB === null
+          ) {
+            return false;
+          }
+
+          var keysA = Object.keys(objA);
+          var keysB = Object.keys(objB);
+
+          if (keysA.length !== keysB.length) {
+            return false;
+          }
+
+          // Test for A's keys different from B.
+          for (var i = 0; i < keysA.length; i++) {
+            if (
+              !hasOwnProperty.call(objB, keysA[i]) ||
+              !is(objA[keysA[i]], objB[keysA[i]])
+            ) {
+              return false;
+            }
+          }
+
+          return true;
+        }
+
+        module.exports = shallowEqual;
+
+        /***/
+      },
+
+    /***/ "./node_modules/fbjs/lib/warning.js":
+      /*!******************************************!*\
+  !*** ./node_modules/fbjs/lib/warning.js ***!
+  \******************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+        /**
+         * Copyright (c) 2014-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__(
+          /*! ./emptyFunction */ "./node_modules/fbjs/lib/emptyFunction.js"
+        );
+
+        /**
+         * Similar to invariant but only logs a warning if the condition is not met.
+         * This can be used to log issues in development environments in critical
+         * paths. Removing the logging code for production environments will keep the
+         * same logic and follow the same code paths.
+         */
+
+        var warning = emptyFunction;
+
+        if (true) {
+          var printWarning = function printWarning(format) {
+            for (
+              var _len = arguments.length,
+                args = Array(_len > 1 ? _len - 1 : 0),
+                _key = 1;
+              _key < _len;
+              _key++
+            ) {
+              args[_key - 1] = arguments[_key];
+            }
+
+            var argIndex = 0;
+            var message =
+              "Warning: " +
+              format.replace(/%s/g, function() {
+                return args[argIndex++];
+              });
+            if (typeof console !== "undefined") {
+              console.error(message);
+            }
+            try {
+              // --- Welcome to debugging React ---
+              // This error was thrown as a convenience so that you can use this stack
+              // to find the callsite that caused this warning to fire.
+              throw new Error(message);
+            } catch (x) {}
+          };
+
+          warning = function warning(condition, format) {
+            if (format === undefined) {
+              throw new Error(
+                "`warning(condition, format, ...args)` requires a warning " +
+                  "message argument"
+              );
+            }
+
+            if (format.indexOf("Failed Composite propType: ") === 0) {
+              return; // Ignore CompositeComponent proptype check.
+            }
+
+            if (!condition) {
+              for (
+                var _len2 = arguments.length,
+                  args = Array(_len2 > 2 ? _len2 - 2 : 0),
+                  _key2 = 2;
+                _key2 < _len2;
+                _key2++
+              ) {
+                args[_key2 - 2] = arguments[_key2];
+              }
+
+              printWarning.apply(undefined, [format].concat(args));
+            }
+          };
+        }
+
+        module.exports = warning;
+
+        /***/
+      },
+
+    /***/ "./node_modules/has-ansi/index.js":
+      /*!****************************************!*\
+  !*** ./node_modules/has-ansi/index.js ***!
+  \****************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+
+        var ansiRegex = __webpack_require__(
+          /*! ansi-regex */ "./node_modules/ansi-regex/index.js"
+        );
+        var re = new RegExp(ansiRegex().source); // remove the `g` flag
+        module.exports = re.test.bind(re);
+
+        /***/
+      },
+
+    /***/ "./node_modules/inherits/inherits_browser.js":
+      /*!***************************************************!*\
+  !*** ./node_modules/inherits/inherits_browser.js ***!
+  \***************************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports) {
+        if (typeof Object.create === "function") {
+          // implementation from standard node.js 'util' module
+          module.exports = function inherits(ctor, superCtor) {
+            ctor.super_ = superCtor;
+            ctor.prototype = Object.create(superCtor.prototype, {
+              constructor: {
+                value: ctor,
+                enumerable: false,
+                writable: true,
+                configurable: true
+              }
+            });
+          };
+        } else {
+          // old school shim for old browsers
+          module.exports = function inherits(ctor, superCtor) {
+            ctor.super_ = superCtor;
+            var TempCtor = function() {};
+            TempCtor.prototype = superCtor.prototype;
+            ctor.prototype = new TempCtor();
+            ctor.prototype.constructor = ctor;
+          };
+        }
+
+        /***/
+      },
+
+    /***/ "./node_modules/json3/lib/json3.js":
+      /*!*****************************************!*\
+  !*** ./node_modules/json3/lib/json3.js ***!
+  \*****************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        /* WEBPACK VAR INJECTION */ (function(module, global) {
+          var __WEBPACK_AMD_DEFINE_RESULT__; /*! JSON v3.3.2 | http://bestiejs.github.io/json3 | Copyright 2012-2014, Kit Cambridge | http://kit.mit-license.org */
+          (function() {
+            // Detect the `define` function exposed by asynchronous module loaders. The
+            // strict `define` check is necessary for compatibility with `r.js`.
+            var isLoader =
+              "function" === "function" &&
+              __webpack_require__(
+                /*! !webpack amd options */ "./node_modules/webpack/buildin/amd-options.js"
+              );
+
+            // A set of types used to distinguish objects from primitives.
+            var objectTypes = {
+              function: true,
+              object: true
+            };
+
+            // Detect the `exports` object exposed by CommonJS implementations.
+            var freeExports =
+              objectTypes[typeof exports] &&
+              exports &&
+              !exports.nodeType &&
+              exports;
+
+            // Use the `global` object exposed by Node (including Browserify via
+            // `insert-module-globals`), Narwhal, and Ringo as the default context,
+            // and the `window` object in browsers. Rhino exports a `global` function
+            // instead.
+            var root = (objectTypes[typeof window] && window) || this,
+              freeGlobal =
+                freeExports &&
+                objectTypes[typeof module] &&
+                module &&
+                !module.nodeType &&
+                typeof global == "object" &&
+                global;
+
+            if (
+              freeGlobal &&
+              (freeGlobal["global"] === freeGlobal ||
+                freeGlobal["window"] === freeGlobal ||
+                freeGlobal["self"] === freeGlobal)
+            ) {
+              root = freeGlobal;
+            }
+
+            // Public: Initializes JSON 3 using the given `context` object, attaching the
+            // `stringify` and `parse` functions to the specified `exports` object.
+            function runInContext(context, exports) {
+              context || (context = root["Object"]());
+              exports || (exports = root["Object"]());
+
+              // Native constructor aliases.
+              var Number = context["Number"] || root["Number"],
+                String = context["String"] || root["String"],
+                Object = context["Object"] || root["Object"],
+                Date = context["Date"] || root["Date"],
+                SyntaxError = context["SyntaxError"] || root["SyntaxError"],
+                TypeError = context["TypeError"] || root["TypeError"],
+                Math = context["Math"] || root["Math"],
+                nativeJSON = context["JSON"] || root["JSON"];
+
+              // Delegate to the native `stringify` and `parse` implementations.
+              if (typeof nativeJSON == "object" && nativeJSON) {
+                exports.stringify = nativeJSON.stringify;
+                exports.parse = nativeJSON.parse;
+              }
+
+              // Convenience aliases.
+              var objectProto = Object.prototype,
+                getClass = objectProto.toString,
+                isProperty,
+                forEach,
+                undef;
+
+              // Test the `Date#getUTC*` methods. Based on work by @Yaffle.
+              var isExtended = new Date(-3509827334573292);
+              try {
+                // The `getUTCFullYear`, `Month`, and `Date` methods return nonsensical
+                // results for certain dates in Opera >= 10.53.
+                isExtended =
+                  isExtended.getUTCFullYear() == -109252 &&
+                  isExtended.getUTCMonth() === 0 &&
+                  isExtended.getUTCDate() === 1 &&
+                  // Safari < 2.0.2 stores the internal millisecond time value correctly,
+                  // but clips the values returned by the date methods to the range of
+                  // signed 32-bit integers ([-2 ** 31, 2 ** 31 - 1]).
+                  isExtended.getUTCHours() == 10 &&
+                  isExtended.getUTCMinutes() == 37 &&
+                  isExtended.getUTCSeconds() == 6 &&
+                  isExtended.getUTCMilliseconds() == 708;
+              } catch (exception) {}
+
+              // Internal: Determines whether the native `JSON.stringify` and `parse`
+              // implementations are spec-compliant. Based on work by Ken Snyder.
+              function has(name) {
+                if (has[name] !== undef) {
+                  // Return cached feature test result.
+                  return has[name];
+                }
+                var isSupported;
+                if (name == "bug-string-char-index") {
+                  // IE <= 7 doesn't support accessing string characters using square
+                  // bracket notation. IE 8 only supports this for primitives.
+                  isSupported = "a"[0] != "a";
+                } else if (name == "json") {
+                  // Indicates whether both `JSON.stringify` and `JSON.parse` are
+                  // supported.
+                  isSupported = has("json-stringify") && has("json-parse");
+                } else {
+                  var value,
+                    serialized =
+                      '{"a":[1,true,false,null,"\\u0000\\b\\n\\f\\r\\t"]}';
+                  // Test `JSON.stringify`.
+                  if (name == "json-stringify") {
+                    var stringify = exports.stringify,
+                      stringifySupported =
+                        typeof stringify == "function" && isExtended;
+                    if (stringifySupported) {
+                      // A test function object with a custom `toJSON` method.
+                      (value = function() {
+                        return 1;
+                      }).toJSON = value;
+                      try {
+                        stringifySupported =
+                          // Firefox 3.1b1 and b2 serialize string, number, and boolean
+                          // primitives as object literals.
+                          stringify(0) === "0" &&
+                          // FF 3.1b1, b2, and JSON 2 serialize wrapped primitives as object
+                          // literals.
+                          stringify(new Number()) === "0" &&
+                          stringify(new String()) == '""' &&
+                          // FF 3.1b1, 2 throw an error if the value is `null`, `undefined`, or
+                          // does not define a canonical JSON representation (this applies to
+                          // objects with `toJSON` properties as well, *unless* they are nested
+                          // within an object or array).
+                          stringify(getClass) === undef &&
+                          // IE 8 serializes `undefined` as `"undefined"`. Safari <= 5.1.7 and
+                          // FF 3.1b3 pass this test.
+                          stringify(undef) === undef &&
+                          // Safari <= 5.1.7 and FF 3.1b3 throw `Error`s and `TypeError`s,
+                          // respectively, if the value is omitted entirely.
+                          stringify() === undef &&
+                          // FF 3.1b1, 2 throw an error if the given value is not a number,
+                          // string, array, object, Boolean, or `null` literal. This applies to
+                          // objects with custom `toJSON` methods as well, unless they are nested
+                          // inside object or array literals. YUI 3.0.0b1 ignores custom `toJSON`
+                          // methods entirely.
+                          stringify(value) === "1" &&
+                          stringify([value]) == "[1]" &&
+                          // Prototype <= 1.6.1 serializes `[undefined]` as `"[]"` instead of
+                          // `"[null]"`.
+                          stringify([undef]) == "[null]" &&
+                          // YUI 3.0.0b1 fails to serialize `null` literals.
+                          stringify(null) == "null" &&
+                          // FF 3.1b1, 2 halts serialization if an array contains a function:
+                          // `[1, true, getClass, 1]` serializes as "[1,true,],". FF 3.1b3
+                          // elides non-JSON values from objects and arrays, unless they
+                          // define custom `toJSON` methods.
+                          stringify([undef, getClass, null]) ==
+                            "[null,null,null]" &&
+                          // Simple serialization test. FF 3.1b1 uses Unicode escape sequences
+                          // where character escape codes are expected (e.g., `\b` => `\u0008`).
+                          stringify({
+                            a: [value, true, false, null, "\x00\b\n\f\r\t"]
+                          }) == serialized &&
+                          // FF 3.1b1 and b2 ignore the `filter` and `width` arguments.
+                          stringify(null, value) === "1" &&
+                          stringify([1, 2], null, 1) == "[\n 1,\n 2\n]" &&
+                          // JSON 2, Prototype <= 1.7, and older WebKit builds incorrectly
+                          // serialize extended years.
+                          stringify(new Date(-8.64e15)) ==
+                            '"-271821-04-20T00:00:00.000Z"' &&
+                          // The milliseconds are optional in ES 5, but required in 5.1.
+                          stringify(new Date(8.64e15)) ==
+                            '"+275760-09-13T00:00:00.000Z"' &&
+                          // Firefox <= 11.0 incorrectly serializes years prior to 0 as negative
+                          // four-digit years instead of six-digit years. Credits: @Yaffle.
+                          stringify(new Date(-621987552e5)) ==
+                            '"-000001-01-01T00:00:00.000Z"' &&
+                          // Safari <= 5.1.5 and Opera >= 10.53 incorrectly serialize millisecond
+                          // values less than 1000. Credits: @Yaffle.
+                          stringify(new Date(-1)) ==
+                            '"1969-12-31T23:59:59.999Z"';
+                      } catch (exception) {
+                        stringifySupported = false;
+                      }
+                    }
+                    isSupported = stringifySupported;
+                  }
+                  // Test `JSON.parse`.
+                  if (name == "json-parse") {
+                    var parse = exports.parse;
+                    if (typeof parse == "function") {
+                      try {
+                        // FF 3.1b1, b2 will throw an exception if a bare literal is provided.
+                        // Conforming implementations should also coerce the initial argument to
+                        // a string prior to parsing.
+                        if (parse("0") === 0 && !parse(false)) {
+                          // Simple parsing test.
+                          value = parse(serialized);
+                          var parseSupported =
+                            value["a"].length == 5 && value["a"][0] === 1;
+                          if (parseSupported) {
+                            try {
+                              // Safari <= 5.1.2 and FF 3.1b1 allow unescaped tabs in strings.
+                              parseSupported = !parse('"\t"');
+                            } catch (exception) {}
+                            if (parseSupported) {
+                              try {
+                                // FF 4.0 and 4.0.1 allow leading `+` signs and leading
+                                // decimal points. FF 4.0, 4.0.1, and IE 9-10 also allow
+                                // certain octal literals.
+                                parseSupported = parse("01") !== 1;
+                              } catch (exception) {}
+                            }
+                            if (parseSupported) {
+                              try {
+                                // FF 4.0, 4.0.1, and Rhino 1.7R3-R4 allow trailing decimal
+                                // points. These environments, along with FF 3.1b1 and 2,
+                                // also allow trailing commas in JSON objects and arrays.
+                                parseSupported = parse("1.") !== 1;
+                              } catch (exception) {}
+                            }
+                          }
+                        }
+                      } catch (exception) {
+                        parseSupported = false;
+                      }
+                    }
+                    isSupported = parseSupported;
+                  }
+                }
+                return (has[name] = !!isSupported);
+              }
+
+              if (!has("json")) {
+                // Common `[[Class]]` name aliases.
+                var functionClass = "[object Function]",
+                  dateClass = "[object Date]",
+                  numberClass = "[object Number]",
+                  stringClass = "[object String]",
+                  arrayClass = "[object Array]",
+                  booleanClass = "[object Boolean]";
+
+                // Detect incomplete support for accessing string characters by index.
+                var charIndexBuggy = has("bug-string-char-index");
+
+                // Define additional utility methods if the `Date` methods are buggy.
+                if (!isExtended) {
+                  var floor = Math.floor;
+                  // A mapping between the months of the year and the number of days between
+                  // January 1st and the first of the respective month.
+                  var Months = [
+                    0,
+                    31,
+                    59,
+                    90,
+                    120,
+                    151,
+                    181,
+                    212,
+                    243,
+                    273,
+                    304,
+                    334
+                  ];
+                  // Internal: Calculates the number of days between the Unix epoch and the
+                  // first day of the given month.
+                  var getDay = function(year, month) {
+                    return (
+                      Months[month] +
+                      365 * (year - 1970) +
+                      floor((year - 1969 + (month = +(month > 1))) / 4) -
+                      floor((year - 1901 + month) / 100) +
+                      floor((year - 1601 + month) / 400)
+                    );
+                  };
+                }
+
+                // Internal: Determines if a property is a direct property of the given
+                // object. Delegates to the native `Object#hasOwnProperty` method.
+                if (!(isProperty = objectProto.hasOwnProperty)) {
+                  isProperty = function(property) {
+                    var members = {},
+                      constructor;
+                    if (
+                      ((members.__proto__ = null),
+                      (members.__proto__ = {
+                        // The *proto* property cannot be set multiple times in recent
+                        // versions of Firefox and SeaMonkey.
+                        toString: 1
+                      }),
+                      members).toString != getClass
+                    ) {
+                      // Safari <= 2.0.3 doesn't implement `Object#hasOwnProperty`, but
+                      // supports the mutable *proto* property.
+                      isProperty = function(property) {
+                        // Capture and break the object's prototype chain (see section 8.6.2
+                        // of the ES 5.1 spec). The parenthesized expression prevents an
+                        // unsafe transformation by the Closure Compiler.
+                        var original = this.__proto__,
+                          result = property in ((this.__proto__ = null), this);
+                        // Restore the original prototype chain.
+                        this.__proto__ = original;
+                        return result;
+                      };
+                    } else {
+                      // Capture a reference to the top-level `Object` constructor.
+                      constructor = members.constructor;
+                      // Use the `constructor` property to simulate `Object#hasOwnProperty` in
+                      // other environments.
+                      isProperty = function(property) {
+                        var parent = (this.constructor || constructor)
+                          .prototype;
+                        return (
+                          property in this &&
+                          !(
+                            property in parent &&
+                            this[property] === parent[property]
+                          )
+                        );
+                      };
+                    }
+                    members = null;
+                    return isProperty.call(this, property);
+                  };
+                }
+
+                // Internal: Normalizes the `for...in` iteration algorithm across
+                // environments. Each enumerated key is yielded to a `callback` function.
+                forEach = function(object, callback) {
+                  var size = 0,
+                    Properties,
+                    members,
+                    property;
+
+                  // Tests for bugs in the current environment's `for...in` algorithm. The
+                  // `valueOf` property inherits the non-enumerable flag from
+                  // `Object.prototype` in older versions of IE, Netscape, and Mozilla.
+                  (Properties = function() {
+                    this.valueOf = 0;
+                  }).prototype.valueOf = 0;
+
+                  // Iterate over a new instance of the `Properties` class.
+                  members = new Properties();
+                  for (property in members) {
+                    // Ignore all properties inherited from `Object.prototype`.
+                    if (isProperty.call(members, property)) {
+                      size++;
+                    }
+                  }
+                  Properties = members = null;
+
+                  // Normalize the iteration algorithm.
+                  if (!size) {
+                    // A list of non-enumerable properties inherited from `Object.prototype`.
+                    members = [
+                      "valueOf",
+                      "toString",
+                      "toLocaleString",
+                      "propertyIsEnumerable",
+                      "isPrototypeOf",
+                      "hasOwnProperty",
+                      "constructor"
+                    ];
+                    // IE <= 8, Mozilla 1.0, and Netscape 6.2 ignore shadowed non-enumerable
+                    // properties.
+                    forEach = function(object, callback) {
+                      var isFunction = getClass.call(object) == functionClass,
+                        property,
+                        length;
+                      var hasProperty =
+                        (!isFunction &&
+                          typeof object.constructor != "function" &&
+                          objectTypes[typeof object.hasOwnProperty] &&
+                          object.hasOwnProperty) ||
+                        isProperty;
+                      for (property in object) {
+                        // Gecko <= 1.0 enumerates the `prototype` property of functions under
+                        // certain conditions; IE does not.
+                        if (
+                          !(isFunction && property == "prototype") &&
+                          hasProperty.call(object, property)
+                        ) {
+                          callback(property);
+                        }
+                      }
+                      // Manually invoke the callback for each non-enumerable property.
+                      for (
+                        length = members.length;
+                        (property = members[--length]);
+                        hasProperty.call(object, property) && callback(property)
+                      );
+                    };
+                  } else if (size == 2) {
+                    // Safari <= 2.0.4 enumerates shadowed properties twice.
+                    forEach = function(object, callback) {
+                      // Create a set of iterated properties.
+                      var members = {},
+                        isFunction = getClass.call(object) == functionClass,
+                        property;
+                      for (property in object) {
+                        // Store each property name to prevent double enumeration. The
+                        // `prototype` property of functions is not enumerated due to cross-
+                        // environment inconsistencies.
+                        if (
+                          !(isFunction && property == "prototype") &&
+                          !isProperty.call(members, property) &&
+                          (members[property] = 1) &&
+                          isProperty.call(object, property)
+                        ) {
+                          callback(property);
+                        }
+                      }
+                    };
+                  } else {
+                    // No bugs detected; use the standard `for...in` algorithm.
+                    forEach = function(object, callback) {
+                      var isFunction = getClass.call(object) == functionClass,
+                        property,
+                        isConstructor;
+                      for (property in object) {
+                        if (
+                          !(isFunction && property == "prototype") &&
+                          isProperty.call(object, property) &&
+                          !(isConstructor = property === "constructor")
+                        ) {
+                          callback(property);
+                        }
+                      }
+                      // Manually invoke the callback for the `constructor` property due to
+                      // cross-environment inconsistencies.
+                      if (
+                        isConstructor ||
+                        isProperty.call(object, (property = "constructor"))
+                      ) {
+                        callback(property);
+                      }
+                    };
+                  }
+                  return forEach(object, callback);
+                };
+
+                // Public: Serializes a JavaScript `value` as a JSON string. The optional
+                // `filter` argument may specify either a function that alters how object and
+                // array members are serialized, or an array of strings and numbers that
+                // indicates which properties should be serialized. The optional `width`
+                // argument may be either a string or number that specifies the indentation
+                // level of the output.
+                if (!has("json-stringify")) {
+                  // Internal: A map of control characters and their escaped equivalents.
+                  var Escapes = {
+                    92: "\\\\",
+                    34: '\\"',
+                    8: "\\b",
+                    12: "\\f",
+                    10: "\\n",
+                    13: "\\r",
+                    9: "\\t"
+                  };
+
+                  // Internal: Converts `value` into a zero-padded string such that its
+                  // length is at least equal to `width`. The `width` must be <= 6.
+                  var leadingZeroes = "000000";
+                  var toPaddedString = function(width, value) {
+                    // The `|| 0` expression is necessary to work around a bug in
+                    // Opera <= 7.54u2 where `0 == -0`, but `String(-0) !== "0"`.
+                    return (leadingZeroes + (value || 0)).slice(-width);
+                  };
+
+                  // Internal: Double-quotes a string `value`, replacing all ASCII control
+                  // characters (characters with code unit values between 0 and 31) with
+                  // their escaped equivalents. This is an implementation of the
+                  // `Quote(value)` operation defined in ES 5.1 section 15.12.3.
+                  var unicodePrefix = "\\u00";
+                  var quote = function(value) {
+                    var result = '"',
+                      index = 0,
+                      length = value.length,
+                      useCharIndex = !charIndexBuggy || length > 10;
+                    var symbols =
+                      useCharIndex &&
+                      (charIndexBuggy ? value.split("") : value);
+                    for (; index < length; index++) {
+                      var charCode = value.charCodeAt(index);
+                      // If the character is a control character, append its Unicode or
+                      // shorthand escape sequence; otherwise, append the character as-is.
+                      switch (charCode) {
+                        case 8:
+                        case 9:
+                        case 10:
+                        case 12:
+                        case 13:
+                        case 34:
+                        case 92:
+                          result += Escapes[charCode];
+                          break;
+                        default:
+                          if (charCode < 32) {
+                            result +=
+                              unicodePrefix +
+                              toPaddedString(2, charCode.toString(16));
+                            break;
+                          }
+                          result += useCharIndex
+                            ? symbols[index]
+                            : value.charAt(index);
+                      }
+                    }
+                    return result + '"';
+                  };
+
+                  // Internal: Recursively serializes an object. Implements the
+                  // `Str(key, holder)`, `JO(value)`, and `JA(value)` operations.
+                  var serialize = function(
+                    property,
+                    object,
+                    callback,
+                    properties,
+                    whitespace,
+                    indentation,
+                    stack
+                  ) {
+                    var value,
+                      className,
+                      year,
+                      month,
+                      date,
+                      time,
+                      hours,
+                      minutes,
+                      seconds,
+                      milliseconds,
+                      results,
+                      element,
+                      index,
+                      length,
+                      prefix,
+                      result;
+                    try {
+                      // Necessary for host object support.
+                      value = object[property];
+                    } catch (exception) {}
+                    if (typeof value == "object" && value) {
+                      className = getClass.call(value);
+                      if (
+                        className == dateClass &&
+                        !isProperty.call(value, "toJSON")
+                      ) {
+                        if (value > -1 / 0 && value < 1 / 0) {
+                          // Dates are serialized according to the `Date#toJSON` method
+                          // specified in ES 5.1 section 15.9.5.44. See section 15.9.1.15
+                          // for the ISO 8601 date time string format.
+                          if (getDay) {
+                            // Manually compute the year, month, date, hours, minutes,
+                            // seconds, and milliseconds if the `getUTC*` methods are
+                            // buggy. Adapted from @Yaffle's `date-shim` project.
+                            date = floor(value / 864e5);
+                            for (
+                              year = floor(date / 365.2425) + 1970 - 1;
+                              getDay(year + 1, 0) <= date;
+                              year++
+                            );
+                            for (
+                              month = floor((date - getDay(year, 0)) / 30.42);
+                              getDay(year, month + 1) <= date;
+                              month++
+                            );
+                            date = 1 + date - getDay(year, month);
+                            // The `time` value specifies the time within the day (see ES
+                            // 5.1 section 15.9.1.2). The formula `(A % B + B) % B` is used
+                            // to compute `A modulo B`, as the `%` operator does not
+                            // correspond to the `modulo` operation for negative numbers.
+                            time = (value % 864e5 + 864e5) % 864e5;
+                            // The hours, minutes, seconds, and milliseconds are obtained by
+                            // decomposing the time within the day. See section 15.9.1.10.
+                            hours = floor(time / 36e5) % 24;
+                            minutes = floor(time / 6e4) % 60;
+                            seconds = floor(time / 1e3) % 60;
+                            milliseconds = time % 1e3;
+                          } else {
+                            year = value.getUTCFullYear();
+                            month = value.getUTCMonth();
+                            date = value.getUTCDate();
+                            hours = value.getUTCHours();
+                            minutes = value.getUTCMinutes();
+                            seconds = value.getUTCSeconds();
+                            milliseconds = value.getUTCMilliseconds();
+                          }
+                          // Serialize extended years correctly.
+                          value =
+                            (year <= 0 || year >= 1e4
+                              ? (year < 0 ? "-" : "+") +
+                                toPaddedString(6, year < 0 ? -year : year)
+                              : toPaddedString(4, year)) +
+                            "-" +
+                            toPaddedString(2, month + 1) +
+                            "-" +
+                            toPaddedString(2, date) +
+                            // Months, dates, hours, minutes, and seconds should have two
+                            // digits; milliseconds should have three.
+                            "T" +
+                            toPaddedString(2, hours) +
+                            ":" +
+                            toPaddedString(2, minutes) +
+                            ":" +
+                            toPaddedString(2, seconds) +
+                            // Milliseconds are optional in ES 5.0, but required in 5.1.
+                            "." +
+                            toPaddedString(3, milliseconds) +
+                            "Z";
+                        } else {
+                          value = null;
+                        }
+                      } else if (
+                        typeof value.toJSON == "function" &&
+                        ((className != numberClass &&
+                          className != stringClass &&
+                          className != arrayClass) ||
+                          isProperty.call(value, "toJSON"))
+                      ) {
+                        // Prototype <= 1.6.1 adds non-standard `toJSON` methods to the
+                        // `Number`, `String`, `Date`, and `Array` prototypes. JSON 3
+                        // ignores all `toJSON` methods on these objects unless they are
+                        // defined directly on an instance.
+                        value = value.toJSON(property);
+                      }
+                    }
+                    if (callback) {
+                      // If a replacement function was provided, call it to obtain the value
+                      // for serialization.
+                      value = callback.call(object, property, value);
+                    }
+                    if (value === null) {
+                      return "null";
+                    }
+                    className = getClass.call(value);
+                    if (className == booleanClass) {
+                      // Booleans are represented literally.
+                      return "" + value;
+                    } else if (className == numberClass) {
+                      // JSON numbers must be finite. `Infinity` and `NaN` are serialized as
+                      // `"null"`.
+                      return value > -1 / 0 && value < 1 / 0
+                        ? "" + value
+                        : "null";
+                    } else if (className == stringClass) {
+                      // Strings are double-quoted and escaped.
+                      return quote("" + value);
+                    }
+                    // Recursively serialize objects and arrays.
+                    if (typeof value == "object") {
+                      // Check for cyclic structures. This is a linear search; performance
+                      // is inversely proportional to the number of unique nested objects.
+                      for (length = stack.length; length--; ) {
+                        if (stack[length] === value) {
+                          // Cyclic structures cannot be serialized by `JSON.stringify`.
+                          throw TypeError();
+                        }
+                      }
+                      // Add the object to the stack of traversed objects.
+                      stack.push(value);
+                      results = [];
+                      // Save the current indentation level and indent one additional level.
+                      prefix = indentation;
+                      indentation += whitespace;
+                      if (className == arrayClass) {
+                        // Recursively serialize array elements.
+                        for (
+                          index = 0, length = value.length;
+                          index < length;
+                          index++
+                        ) {
+                          element = serialize(
+                            index,
+                            value,
+                            callback,
+                            properties,
+                            whitespace,
+                            indentation,
+                            stack
+                          );
+                          results.push(element === undef ? "null" : element);
+                        }
+                        result = results.length
+                          ? whitespace
+                            ? "[\n" +
+                              indentation +
+                              results.join(",\n" + indentation) +
+                              "\n" +
+                              prefix +
+                              "]"
+                            : "[" + results.join(",") + "]"
+                          : "[]";
+                      } else {
+                        // Recursively serialize object members. Members are selected from
+                        // either a user-specified list of property names, or the object
+                        // itself.
+                        forEach(properties || value, function(property) {
+                          var element = serialize(
+                            property,
+                            value,
+                            callback,
+                            properties,
+                            whitespace,
+                            indentation,
+                            stack
+                          );
+                          if (element !== undef) {
+                            // According to ES 5.1 section 15.12.3: "If `gap` {whitespace}
+                            // is not the empty string, let `member` {quote(property) + ":"}
+                            // be the concatenation of `member` and the `space` character."
+                            // The "`space` character" refers to the literal space
+                            // character, not the `space` {width} argument provided to
+                            // `JSON.stringify`.
+                            results.push(
+                              quote(property) +
+                                ":" +
+                                (whitespace ? " " : "") +
+                                element
+                            );
+                          }
+                        });
+                        result = results.length
+                          ? whitespace
+                            ? "{\n" +
+                              indentation +
+                              results.join(",\n" + indentation) +
+                              "\n" +
+                              prefix +
+                              "}"
+                            : "{" + results.join(",") + "}"
+                          : "{}";
+                      }
+                      // Remove the object from the traversed object stack.
+                      stack.pop();
+                      return result;
+                    }
+                  };
+
+                  // Public: `JSON.stringify`. See ES 5.1 section 15.12.3.
+                  exports.stringify = function(source, filter, width) {
+                    var whitespace, callback, properties, className;
+                    if (objectTypes[typeof filter] && filter) {
+                      if (
+                        (className = getClass.call(filter)) == functionClass
+                      ) {
+                        callback = filter;
+                      } else if (className == arrayClass) {
+                        // Convert the property names array into a makeshift set.
+                        properties = {};
+                        for (
+                          var index = 0, length = filter.length, value;
+                          index < length;
+                          value = filter[index++],
+                            ((className = getClass.call(value)),
+                            className == stringClass ||
+                              className == numberClass) &&
+                              (properties[value] = 1)
+                        );
+                      }
+                    }
+                    if (width) {
+                      if ((className = getClass.call(width)) == numberClass) {
+                        // Convert the `width` to an integer and create a string containing
+                        // `width` number of space characters.
+                        if ((width -= width % 1) > 0) {
+                          for (
+                            whitespace = "", width > 10 && (width = 10);
+                            whitespace.length < width;
+                            whitespace += " "
+                          );
+                        }
+                      } else if (className == stringClass) {
+                        whitespace =
+                          width.length <= 10 ? width : width.slice(0, 10);
+                      }
+                    }
+                    // Opera <= 7.54u2 discards the values associated with empty string keys
+                    // (`""`) only if they are used directly within an object member list
+                    // (e.g., `!("" in { "": 1})`).
+                    return serialize(
+                      "",
+                      ((value = {}), (value[""] = source), value),
+                      callback,
+                      properties,
+                      whitespace,
+                      "",
+                      []
+                    );
+                  };
+                }
+
+                // Public: Parses a JSON source string.
+                if (!has("json-parse")) {
+                  var fromCharCode = String.fromCharCode;
+
+                  // Internal: A map of escaped control characters and their unescaped
+                  // equivalents.
+                  var Unescapes = {
+                    92: "\\",
+                    34: '"',
+                    47: "/",
+                    98: "\b",
+                    116: "\t",
+                    110: "\n",
+                    102: "\f",
+                    114: "\r"
+                  };
+
+                  // Internal: Stores the parser state.
+                  var Index, Source;
+
+                  // Internal: Resets the parser state and throws a `SyntaxError`.
+                  var abort = function() {
+                    Index = Source = null;
+                    throw SyntaxError();
+                  };
+
+                  // Internal: Returns the next token, or `"$"` if the parser has reached
+                  // the end of the source string. A token may be a string, number, `null`
+                  // literal, or Boolean literal.
+                  var lex = function() {
+                    var source = Source,
+                      length = source.length,
+                      value,
+                      begin,
+                      position,
+                      isSigned,
+                      charCode;
+                    while (Index < length) {
+                      charCode = source.charCodeAt(Index);
+                      switch (charCode) {
+                        case 9:
+                        case 10:
+                        case 13:
+                        case 32:
+                          // Skip whitespace tokens, including tabs, carriage returns, line
+                          // feeds, and space characters.
+                          Index++;
+                          break;
+                        case 123:
+                        case 125:
+                        case 91:
+                        case 93:
+                        case 58:
+                        case 44:
+                          // Parse a punctuator token (`{`, `}`, `[`, `]`, `:`, or `,`) at
+                          // the current position.
+                          value = charIndexBuggy
+                            ? source.charAt(Index)
+                            : source[Index];
+                          Index++;
+                          return value;
+                        case 34:
+                          // `"` delimits a JSON string; advance to the next character and
+                          // begin parsing the string. String tokens are prefixed with the
+                          // sentinel `@` character to distinguish them from punctuators and
+                          // end-of-string tokens.
+                          for (value = "@", Index++; Index < length; ) {
+                            charCode = source.charCodeAt(Index);
+                            if (charCode < 32) {
+                              // Unescaped ASCII control characters (those with a code unit
+                              // less than the space character) are not permitted.
+                              abort();
+                            } else if (charCode == 92) {
+                              // A reverse solidus (`\`) marks the beginning of an escaped
+                              // control character (including `"`, `\`, and `/`) or Unicode
+                              // escape sequence.
+                              charCode = source.charCodeAt(++Index);
+                              switch (charCode) {
+                                case 92:
+                                case 34:
+                                case 47:
+                                case 98:
+                                case 116:
+                                case 110:
+                                case 102:
+                                case 114:
+                                  // Revive escaped control characters.
+                                  value += Unescapes[charCode];
+                                  Index++;
+                                  break;
+                                case 117:
+                                  // `\u` marks the beginning of a Unicode escape sequence.
+                                  // Advance to the first character and validate the
+                                  // four-digit code point.
+                                  begin = ++Index;
+                                  for (
+                                    position = Index + 4;
+                                    Index < position;
+                                    Index++
+                                  ) {
+                                    charCode = source.charCodeAt(Index);
+                                    // A valid sequence comprises four hexdigits (case-
+                                    // insensitive) that form a single hexadecimal value.
+                                    if (
+                                      !(
+                                        (charCode >= 48 && charCode <= 57) ||
+                                        (charCode >= 97 && charCode <= 102) ||
+                                        (charCode >= 65 && charCode <= 70)
+                                      )
+                                    ) {
+                                      // Invalid Unicode escape sequence.
+                                      abort();
+                                    }
+                                  }
+                                  // Revive the escaped character.
+                                  value += fromCharCode(
+                                    "0x" + source.slice(begin, Index)
+                                  );
+                                  break;
+                                default:
+                                  // Invalid escape sequence.
+                                  abort();
+                              }
+                            } else {
+                              if (charCode == 34) {
+                                // An unescaped double-quote character marks the end of the
+                                // string.
+                                break;
+                              }
+                              charCode = source.charCodeAt(Index);
+                              begin = Index;
+                              // Optimize for the common case where a string is valid.
+                              while (
+                                charCode >= 32 &&
+                                charCode != 92 &&
+                                charCode != 34
+                              ) {
+                                charCode = source.charCodeAt(++Index);
+                              }
+                              // Append the string as-is.
+                              value += source.slice(begin, Index);
+                            }
+                          }
+                          if (source.charCodeAt(Index) == 34) {
+                            // Advance to the next character and return the revived string.
+                            Index++;
+                            return value;
+                          }
+                          // Unterminated string.
+                          abort();
+                        default:
+                          // Parse numbers and literals.
+                          begin = Index;
+                          // Advance past the negative sign, if one is specified.
+                          if (charCode == 45) {
+                            isSigned = true;
+                            charCode = source.charCodeAt(++Index);
+                          }
+                          // Parse an integer or floating-point value.
+                          if (charCode >= 48 && charCode <= 57) {
+                            // Leading zeroes are interpreted as octal literals.
+                            if (
+                              charCode == 48 &&
+                              ((charCode = source.charCodeAt(Index + 1)),
+                              charCode >= 48 && charCode <= 57)
+                            ) {
+                              // Illegal octal literal.
+                              abort();
+                            }
+                            isSigned = false;
+                            // Parse the integer component.
+                            for (
+                              ;
+                              Index < length &&
+                              ((charCode = source.charCodeAt(Index)),
+                              charCode >= 48 && charCode <= 57);
+                              Index++
+                            );
+                            // Floats cannot contain a leading decimal point; however, this
+                            // case is already accounted for by the parser.
+                            if (source.charCodeAt(Index) == 46) {
+                              position = ++Index;
+                              // Parse the decimal component.
+                              for (
+                                ;
+                                position < length &&
+                                ((charCode = source.charCodeAt(position)),
+                                charCode >= 48 && charCode <= 57);
+                                position++
+                              );
+                              if (position == Index) {
+                                // Illegal trailing decimal.
+                                abort();
+                              }
+                              Index = position;
+                            }
+                            // Parse exponents. The `e` denoting the exponent is
+                            // case-insensitive.
+                            charCode = source.charCodeAt(Index);
+                            if (charCode == 101 || charCode == 69) {
+                              charCode = source.charCodeAt(++Index);
+                              // Skip past the sign following the exponent, if one is
+                              // specified.
+                              if (charCode == 43 || charCode == 45) {
+                                Index++;
+                              }
+                              // Parse the exponential component.
+                              for (
+                                position = Index;
+                                position < length &&
+                                ((charCode = source.charCodeAt(position)),
+                                charCode >= 48 && charCode <= 57);
+                                position++
+                              );
+                              if (position == Index) {
+                                // Illegal empty exponent.
+                                abort();
+                              }
+                              Index = position;
+                            }
+                            // Coerce the parsed value to a JavaScript number.
+                            return +source.slice(begin, Index);
+                          }
+                          // A negative sign may only precede numbers.
+                          if (isSigned) {
+                            abort();
+                          }
+                          // `true`, `false`, and `null` literals.
+                          if (source.slice(Index, Index + 4) == "true") {
+                            Index += 4;
+                            return true;
+                          } else if (
+                            source.slice(Index, Index + 5) == "false"
+                          ) {
+                            Index += 5;
+                            return false;
+                          } else if (source.slice(Index, Index + 4) == "null") {
+                            Index += 4;
+                            return null;
+                          }
+                          // Unrecognized token.
+                          abort();
+                      }
+                    }
+                    // Return the sentinel `$` character if the parser has reached the end
+                    // of the source string.
+                    return "$";
+                  };
+
+                  // Internal: Parses a JSON `value` token.
+                  var get = function(value) {
+                    var results, hasMembers;
+                    if (value == "$") {
+                      // Unexpected end of input.
+                      abort();
+                    }
+                    if (typeof value == "string") {
+                      if (
+                        (charIndexBuggy ? value.charAt(0) : value[0]) == "@"
+                      ) {
+                        // Remove the sentinel `@` character.
+                        return value.slice(1);
+                      }
+                      // Parse object and array literals.
+                      if (value == "[") {
+                        // Parses a JSON array, returning a new JavaScript array.
+                        results = [];
+                        for (; ; hasMembers || (hasMembers = true)) {
+                          value = lex();
+                          // A closing square bracket marks the end of the array literal.
+                          if (value == "]") {
+                            break;
+                          }
+                          // If the array literal contains elements, the current token
+                          // should be a comma separating the previous element from the
+                          // next.
+                          if (hasMembers) {
+                            if (value == ",") {
+                              value = lex();
+                              if (value == "]") {
+                                // Unexpected trailing `,` in array literal.
+                                abort();
+                              }
+                            } else {
+                              // A `,` must separate each array element.
+                              abort();
+                            }
+                          }
+                          // Elisions and leading commas are not permitted.
+                          if (value == ",") {
+                            abort();
+                          }
+                          results.push(get(value));
+                        }
+                        return results;
+                      } else if (value == "{") {
+                        // Parses a JSON object, returning a new JavaScript object.
+                        results = {};
+                        for (; ; hasMembers || (hasMembers = true)) {
+                          value = lex();
+                          // A closing curly brace marks the end of the object literal.
+                          if (value == "}") {
+                            break;
+                          }
+                          // If the object literal contains members, the current token
+                          // should be a comma separator.
+                          if (hasMembers) {
+                            if (value == ",") {
+                              value = lex();
+                              if (value == "}") {
+                                // Unexpected trailing `,` in object literal.
+                                abort();
+                              }
+                            } else {
+                              // A `,` must separate each object member.
+                              abort();
+                            }
+                          }
+                          // Leading commas are not permitted, object property names must be
+                          // double-quoted strings, and a `:` must separate each property
+                          // name and value.
+                          if (
+                            value == "," ||
+                            typeof value != "string" ||
+                            (charIndexBuggy ? value.charAt(0) : value[0]) !=
+                              "@" ||
+                            lex() != ":"
+                          ) {
+                            abort();
+                          }
+                          results[value.slice(1)] = get(lex());
+                        }
+                        return results;
+                      }
+                      // Unexpected token encountered.
+                      abort();
+                    }
+                    return value;
+                  };
+
+                  // Internal: Updates a traversed object member.
+                  var update = function(source, property, callback) {
+                    var element = walk(source, property, callback);
+                    if (element === undef) {
+                      delete source[property];
+                    } else {
+                      source[property] = element;
+                    }
+                  };
+
+                  // Internal: Recursively traverses a parsed JSON object, invoking the
+                  // `callback` function for each value. This is an implementation of the
+                  // `Walk(holder, name)` operation defined in ES 5.1 section 15.12.2.
+                  var walk = function(source, property, callback) {
+                    var value = source[property],
+                      length;
+                    if (typeof value == "object" && value) {
+                      // `forEach` can't be used to traverse an array in Opera <= 8.54
+                      // because its `Object#hasOwnProperty` implementation returns `false`
+                      // for array indices (e.g., `![1, 2, 3].hasOwnProperty("0")`).
+                      if (getClass.call(value) == arrayClass) {
+                        for (length = value.length; length--; ) {
+                          update(value, length, callback);
+                        }
+                      } else {
+                        forEach(value, function(property) {
+                          update(value, property, callback);
+                        });
+                      }
+                    }
+                    return callback.call(source, property, value);
+                  };
+
+                  // Public: `JSON.parse`. See ES 5.1 section 15.12.2.
+                  exports.parse = function(source, callback) {
+                    var result, value;
+                    Index = 0;
+                    Source = "" + source;
+                    result = get(lex());
+                    // If a JSON string contains multiple tokens, it is invalid.
+                    if (lex() != "$") {
+                      abort();
+                    }
+                    // Reset the parser state.
+                    Index = Source = null;
+                    return callback && getClass.call(callback) == functionClass
+                      ? walk(
+                          ((value = {}), (value[""] = result), value),
+                          "",
+                          callback
+                        )
+                      : result;
+                  };
+                }
+              }
+
+              exports["runInContext"] = runInContext;
+              return exports;
+            }
+
+            if (freeExports && !isLoader) {
+              // Export for CommonJS environments.
+              runInContext(root, freeExports);
+            } else {
+              // Export for web browsers and JavaScript engines.
+              var nativeJSON = root.JSON,
+                previousJSON = root["JSON3"],
+                isRestored = false;
+
+              var JSON3 = runInContext(
+                root,
+                (root["JSON3"] = {
+                  // Public: Restores the original value of the global `JSON` object and
+                  // returns a reference to the `JSON3` object.
+                  noConflict: function() {
+                    if (!isRestored) {
+                      isRestored = true;
+                      root.JSON = nativeJSON;
+                      root["JSON3"] = previousJSON;
+                      nativeJSON = previousJSON = null;
+                    }
+                    return JSON3;
+                  }
+                })
+              );
+
+              root.JSON = {
+                parse: JSON3.parse,
+                stringify: JSON3.stringify
+              };
+            }
+
+            // Export for asynchronous module loaders.
+            if (isLoader) {
+              !((__WEBPACK_AMD_DEFINE_RESULT__ = function() {
+                return JSON3;
+              }.call(exports, __webpack_require__, exports, module)),
+              __WEBPACK_AMD_DEFINE_RESULT__ !== undefined &&
+                (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+            }
+          }.call(this));
+
+          /* WEBPACK VAR INJECTION */
+        }.call(
+          exports,
+          __webpack_require__(
+            /*! ./../../webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js"
+          )(module),
+          __webpack_require__(
+            /*! ./../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"
+          )
+        ));
+
+        /***/
+      },
+
+    /***/ "./node_modules/ms/index.js":
+      /*!**********************************!*\
+  !*** ./node_modules/ms/index.js ***!
+  \**********************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports) {
+        /**
+         * Helpers.
+         */
+
+        var s = 1000;
+        var m = s * 60;
+        var h = m * 60;
+        var d = h * 24;
+        var y = d * 365.25;
+
+        /**
+         * Parse or format the given `val`.
+         *
+         * Options:
+         *
+         *  - `long` verbose formatting [false]
+         *
+         * @param {String|Number} val
+         * @param {Object} [options]
+         * @throws {Error} throw an error if val is not a non-empty string or a number
+         * @return {String|Number}
+         * @api public
+         */
+
+        module.exports = function(val, options) {
+          options = options || {};
+          var type = typeof val;
+          if (type === "string" && val.length > 0) {
+            return parse(val);
+          } else if (type === "number" && isNaN(val) === false) {
+            return options.long ? fmtLong(val) : fmtShort(val);
+          }
+          throw new Error(
+            "val is not a non-empty string or a valid number. val=" +
+              JSON.stringify(val)
+          );
+        };
+
+        /**
+         * Parse the given `str` and return milliseconds.
+         *
+         * @param {String} str
+         * @return {Number}
+         * @api private
+         */
+
+        function parse(str) {
+          str = String(str);
+          if (str.length > 100) {
+            return;
+          }
+          var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(
+            str
+          );
+          if (!match) {
+            return;
+          }
+          var n = parseFloat(match[1]);
+          var type = (match[2] || "ms").toLowerCase();
+          switch (type) {
+            case "years":
+            case "year":
+            case "yrs":
+            case "yr":
+            case "y":
+              return n * y;
+            case "days":
+            case "day":
+            case "d":
+              return n * d;
+            case "hours":
+            case "hour":
+            case "hrs":
+            case "hr":
+            case "h":
+              return n * h;
+            case "minutes":
+            case "minute":
+            case "mins":
+            case "min":
+            case "m":
+              return n * m;
+            case "seconds":
+            case "second":
+            case "secs":
+            case "sec":
+            case "s":
+              return n * s;
+            case "milliseconds":
+            case "millisecond":
+            case "msecs":
+            case "msec":
+            case "ms":
+              return n;
+            default:
+              return undefined;
+          }
+        }
+
+        /**
+         * Short format for `ms`.
+         *
+         * @param {Number} ms
+         * @return {String}
+         * @api private
+         */
+
+        function fmtShort(ms) {
+          if (ms >= d) {
+            return Math.round(ms / d) + "d";
+          }
+          if (ms >= h) {
+            return Math.round(ms / h) + "h";
+          }
+          if (ms >= m) {
+            return Math.round(ms / m) + "m";
+          }
+          if (ms >= s) {
+            return Math.round(ms / s) + "s";
+          }
+          return ms + "ms";
+        }
+
+        /**
+         * Long format for `ms`.
+         *
+         * @param {Number} ms
+         * @return {String}
+         * @api private
+         */
+
+        function fmtLong(ms) {
+          return (
+            plural(ms, d, "day") ||
+            plural(ms, h, "hour") ||
+            plural(ms, m, "minute") ||
+            plural(ms, s, "second") ||
+            ms + " ms"
+          );
+        }
+
+        /**
+         * Pluralization helper.
+         */
+
+        function plural(ms, n, name) {
+          if (ms < n) {
+            return;
+          }
+          if (ms < n * 1.5) {
+            return Math.floor(ms / n) + " " + name;
+          }
+          return Math.ceil(ms / n) + " " + name + "s";
+        }
+
+        /***/
+      },
+
+    /***/ "./node_modules/object-assign/index.js":
+      /*!*********************************************!*\
+  !*** ./node_modules/object-assign/index.js ***!
+  \*********************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+        /*
+object-assign
+(c) Sindre Sorhus
+@license MIT
+*/
+
+        /* eslint-disable no-unused-vars */
+        var getOwnPropertySymbols = Object.getOwnPropertySymbols;
+        var hasOwnProperty = Object.prototype.hasOwnProperty;
+        var propIsEnumerable = Object.prototype.propertyIsEnumerable;
+
+        function toObject(val) {
+          if (val === null || val === undefined) {
+            throw new TypeError(
+              "Object.assign cannot be called with null or undefined"
+            );
+          }
+
+          return Object(val);
+        }
+
+        function shouldUseNative() {
+          try {
+            if (!Object.assign) {
+              return false;
+            }
+
+            // Detect buggy property enumeration order in older V8 versions.
+
+            // https://bugs.chromium.org/p/v8/issues/detail?id=4118
+            var test1 = new String("abc"); // eslint-disable-line no-new-wrappers
+            test1[5] = "de";
+            if (Object.getOwnPropertyNames(test1)[0] === "5") {
+              return false;
+            }
+
+            // https://bugs.chromium.org/p/v8/issues/detail?id=3056
+            var test2 = {};
+            for (var i = 0; i < 10; i++) {
+              test2["_" + String.fromCharCode(i)] = i;
+            }
+            var order2 = Object.getOwnPropertyNames(test2).map(function(n) {
+              return test2[n];
+            });
+            if (order2.join("") !== "0123456789") {
+              return false;
+            }
+
+            // https://bugs.chromium.org/p/v8/issues/detail?id=3056
+            var test3 = {};
+            "abcdefghijklmnopqrst".split("").forEach(function(letter) {
+              test3[letter] = letter;
+            });
+            if (
+              Object.keys(Object.assign({}, test3)).join("") !==
+              "abcdefghijklmnopqrst"
+            ) {
+              return false;
+            }
+
+            return true;
+          } catch (err) {
+            // We don't expect any of the above to throw, but better to be safe.
+            return false;
+          }
+        }
+
+        module.exports = shouldUseNative()
+          ? Object.assign
+          : function(target, source) {
+              var from;
+              var to = toObject(target);
+              var symbols;
+
+              for (var s = 1; s < arguments.length; s++) {
+                from = Object(arguments[s]);
+
+                for (var key in from) {
+                  if (hasOwnProperty.call(from, key)) {
+                    to[key] = from[key];
+                  }
+                }
+
+                if (getOwnPropertySymbols) {
+                  symbols = getOwnPropertySymbols(from);
+                  for (var i = 0; i < symbols.length; i++) {
+                    if (propIsEnumerable.call(from, symbols[i])) {
+                      to[symbols[i]] = from[symbols[i]];
+                    }
+                  }
+                }
+              }
+
+              return to;
+            };
+
+        /***/
+      },
+
+    /***/ "./node_modules/process/browser.js":
+      /*!*****************************************!*\
+  !*** ./node_modules/process/browser.js ***!
+  \*****************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports) {
+        // shim for using process in browser
+        var process = (module.exports = {});
+
+        // cached from whatever global is present so that test runners that stub it
+        // don't break things.  But we need to wrap it in a try catch in case it is
+        // wrapped in strict mode code which doesn't define any globals.  It's inside a
+        // function because try/catches deoptimize in certain engines.
+
+        var cachedSetTimeout;
+        var cachedClearTimeout;
+
+        function defaultSetTimout() {
+          throw new Error("setTimeout has not been defined");
+        }
+        function defaultClearTimeout() {
+          throw new Error("clearTimeout has not been defined");
+        }
+        (function() {
+          try {
+            if (typeof setTimeout === "function") {
+              cachedSetTimeout = setTimeout;
+            } else {
+              cachedSetTimeout = defaultSetTimout;
+            }
+          } catch (e) {
+            cachedSetTimeout = defaultSetTimout;
+          }
+          try {
+            if (typeof clearTimeout === "function") {
+              cachedClearTimeout = clearTimeout;
+            } else {
+              cachedClearTimeout = defaultClearTimeout;
+            }
+          } catch (e) {
+            cachedClearTimeout = defaultClearTimeout;
+          }
+        })();
+        function runTimeout(fun) {
+          if (cachedSetTimeout === setTimeout) {
+            //normal enviroments in sane situations
+            return setTimeout(fun, 0);
+          }
+          // if setTimeout wasn't available but was latter defined
+          if (
+            (cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) &&
+            setTimeout
+          ) {
+            cachedSetTimeout = setTimeout;
+            return setTimeout(fun, 0);
+          }
+          try {
+            // when when somebody has screwed with setTimeout but no I.E. maddness
+            return cachedSetTimeout(fun, 0);
+          } catch (e) {
+            try {
+              // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+              return cachedSetTimeout.call(null, fun, 0);
+            } catch (e) {
+              // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
+              return cachedSetTimeout.call(this, fun, 0);
+            }
+          }
+        }
+        function runClearTimeout(marker) {
+          if (cachedClearTimeout === clearTimeout) {
+            //normal enviroments in sane situations
+            return clearTimeout(marker);
+          }
+          // if clearTimeout wasn't available but was latter defined
+          if (
+            (cachedClearTimeout === defaultClearTimeout ||
+              !cachedClearTimeout) &&
+            clearTimeout
+          ) {
+            cachedClearTimeout = clearTimeout;
+            return clearTimeout(marker);
+          }
+          try {
+            // when when somebody has screwed with setTimeout but no I.E. maddness
+            return cachedClearTimeout(marker);
+          } catch (e) {
+            try {
+              // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
+              return cachedClearTimeout.call(null, marker);
+            } catch (e) {
+              // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
+              // Some versions of I.E. have different rules for clearTimeout vs setTimeout
+              return cachedClearTimeout.call(this, marker);
+            }
+          }
+        }
+        var queue = [];
+        var draining = false;
+        var currentQueue;
+        var queueIndex = -1;
+
+        function cleanUpNextTick() {
+          if (!draining || !currentQueue) {
+            return;
+          }
+          draining = false;
+          if (currentQueue.length) {
+            queue = currentQueue.concat(queue);
+          } else {
+            queueIndex = -1;
+          }
+          if (queue.length) {
+            drainQueue();
+          }
+        }
+
+        function drainQueue() {
+          if (draining) {
+            return;
+          }
+          var timeout = runTimeout(cleanUpNextTick);
+          draining = true;
+
+          var len = queue.length;
+          while (len) {
+            currentQueue = queue;
+            queue = [];
+            while (++queueIndex < len) {
+              if (currentQueue) {
+                currentQueue[queueIndex].run();
+              }
+            }
+            queueIndex = -1;
+            len = queue.length;
+          }
+          currentQueue = null;
+          draining = false;
+          runClearTimeout(timeout);
+        }
+
+        process.nextTick = function(fun) {
+          var args = new Array(arguments.length - 1);
+          if (arguments.length > 1) {
+            for (var i = 1; i < arguments.length; i++) {
+              args[i - 1] = arguments[i];
+            }
+          }
+          queue.push(new Item(fun, args));
+          if (queue.length === 1 && !draining) {
+            runTimeout(drainQueue);
+          }
+        };
+
+        // v8 likes predictible objects
+        function Item(fun, array) {
+          this.fun = fun;
+          this.array = array;
+        }
+        Item.prototype.run = function() {
+          this.fun.apply(null, this.array);
+        };
+        process.title = "browser";
+        process.browser = true;
+        process.env = {};
+        process.argv = [];
+        process.version = ""; // empty string to avoid regexp issues
+        process.versions = {};
+
+        function noop() {}
+
+        process.on = noop;
+        process.addListener = noop;
+        process.once = noop;
+        process.off = noop;
+        process.removeListener = noop;
+        process.removeAllListeners = noop;
+        process.emit = noop;
+        process.prependListener = noop;
+        process.prependOnceListener = noop;
+
+        process.listeners = function(name) {
+          return [];
+        };
+
+        process.binding = function(name) {
+          throw new Error("process.binding is not supported");
+        };
+
+        process.cwd = function() {
+          return "/";
+        };
+        process.chdir = function(dir) {
+          throw new Error("process.chdir is not supported");
+        };
+        process.umask = function() {
+          return 0;
+        };
+
+        /***/
+      },
+
+    /***/ "./node_modules/prop-types/checkPropTypes.js":
+      /*!***************************************************!*\
+  !*** ./node_modules/prop-types/checkPropTypes.js ***!
+  \***************************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+        /**
+         * 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 (true) {
+          var invariant = __webpack_require__(
+            /*! fbjs/lib/invariant */ "./node_modules/fbjs/lib/invariant.js"
+          );
+          var warning = __webpack_require__(
+            /*! fbjs/lib/warning */ "./node_modules/fbjs/lib/warning.js"
+          );
+          var ReactPropTypesSecret = __webpack_require__(
+            /*! ./lib/ReactPropTypesSecret */ "./node_modules/prop-types/lib/ReactPropTypesSecret.js"
+          );
+          var loggedTypeFailures = {};
+        }
+
+        /**
+         * Assert that the values match with the type specs.
+         * Error messages are memorized and will only be shown once.
+         *
+         * @param {object} typeSpecs Map of name to a ReactPropType
+         * @param {object} values Runtime values that need to be type-checked
+         * @param {string} location e.g. "prop", "context", "child context"
+         * @param {string} componentName Name of the component for error messages.
+         * @param {?Function} getStack Returns the component stack.
+         * @private
+         */
+        function checkPropTypes(
+          typeSpecs,
+          values,
+          location,
+          componentName,
+          getStack
+        ) {
+          if (true) {
+            for (var typeSpecName in typeSpecs) {
+              if (typeSpecs.hasOwnProperty(typeSpecName)) {
+                var error;
+                // Prop type validation may throw. In case they do, we don't want to
+                // fail the render phase where it didn't fail before. So we log it.
+                // After these have been cleaned up, we'll let them throw.
+                try {
+                  // This is intentionally an invariant that gets caught. It's the same
+                  // behavior as without this statement except with a better message.
+                  invariant(
+                    typeof typeSpecs[typeSpecName] === "function",
+                    "%s: %s type `%s` is invalid; it must be a function, usually from " +
+                      "the `prop-types` package, but received `%s`.",
+                    componentName || "React class",
+                    location,
+                    typeSpecName,
+                    typeof typeSpecs[typeSpecName]
+                  );
+                  error = typeSpecs[typeSpecName](
+                    values,
+                    typeSpecName,
+                    componentName,
+                    location,
+                    null,
+                    ReactPropTypesSecret
+                  );
+                } catch (ex) {
+                  error = ex;
+                }
+                warning(
+                  !error || error instanceof Error,
+                  "%s: type specification of %s `%s` is invalid; the type checker " +
+                    "function must return `null` or an `Error` but returned a %s. " +
+                    "You may have forgotten to pass an argument to the type checker " +
+                    "creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and " +
+                    "shape all require an argument).",
+                  componentName || "React class",
+                  location,
+                  typeSpecName,
+                  typeof error
+                );
+                if (
+                  error instanceof Error &&
+                  !(error.message in loggedTypeFailures)
+                ) {
+                  // Only monitor this failure once because there tends to be a lot of the
+                  // same error.
+                  loggedTypeFailures[error.message] = true;
+
+                  var stack = getStack ? getStack() : "";
+
+                  warning(
+                    false,
+                    "Failed %s type: %s%s",
+                    location,
+                    error.message,
+                    stack != null ? stack : ""
+                  );
+                }
+              }
+            }
+          }
+        }
+
+        module.exports = checkPropTypes;
+
+        /***/
+      },
+
+    /***/ "./node_modules/prop-types/lib/ReactPropTypesSecret.js":
+      /*!*************************************************************!*\
+  !*** ./node_modules/prop-types/lib/ReactPropTypesSecret.js ***!
+  \*************************************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+        /**
+         * 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;
+
+        /***/
+      },
+
+    /***/ "./node_modules/punycode/punycode.js":
+      /*!*******************************************!*\
+  !*** ./node_modules/punycode/punycode.js ***!
+  \*******************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        /* WEBPACK VAR INJECTION */ (function(module, global) {
+          var __WEBPACK_AMD_DEFINE_RESULT__; /*! https://mths.be/punycode v1.4.1 by @mathias */
+          (function(root) {
+            /** Detect free variables */
+            var freeExports =
+              typeof exports == "object" &&
+              exports &&
+              !exports.nodeType &&
+              exports;
+            var freeModule =
+              typeof module == "object" && module && !module.nodeType && module;
+            var freeGlobal = typeof global == "object" && global;
+            if (
+              freeGlobal.global === freeGlobal ||
+              freeGlobal.window === freeGlobal ||
+              freeGlobal.self === freeGlobal
+            ) {
+              root = freeGlobal;
+            }
+
+            /**
+             * The `punycode` object.
+             * @name punycode
+             * @type Object
+             */
+            var punycode,
+              /** Highest positive signed 32-bit float value */
+              maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1
+              /** Bootstring parameters */
+              base = 36,
+              tMin = 1,
+              tMax = 26,
+              skew = 38,
+              damp = 700,
+              initialBias = 72,
+              initialN = 128, // 0x80
+              delimiter = "-", // '\x2D'
+              /** Regular expressions */
+              regexPunycode = /^xn--/,
+              regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars
+              regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators
+              /** Error messages */
+              errors = {
+                overflow: "Overflow: input needs wider integers to process",
+                "not-basic": "Illegal input >= 0x80 (not a basic code point)",
+                "invalid-input": "Invalid input"
+              },
+              /** Convenience shortcuts */
+              baseMinusTMin = base - tMin,
+              floor = Math.floor,
+              stringFromCharCode = String.fromCharCode,
+              /** Temporary variable */
+              key;
+
+            /*--------------------------------------------------------------------------*/
+
+            /**
+             * A generic error utility function.
+             * @private
+             * @param {String} type The error type.
+             * @returns {Error} Throws a `RangeError` with the applicable error message.
+             */
+            function error(type) {
+              throw new RangeError(errors[type]);
+            }
+
+            /**
+             * A generic `Array#map` utility function.
+             * @private
+             * @param {Array} array The array to iterate over.
+             * @param {Function} callback The function that gets called for every array
+             * item.
+             * @returns {Array} A new array of values returned by the callback function.
+             */
+            function map(array, fn) {
+              var length = array.length;
+              var result = [];
+              while (length--) {
+                result[length] = fn(array[length]);
+              }
+              return result;
+            }
+
+            /**
+             * A simple `Array#map`-like wrapper to work with domain name strings or email
+             * addresses.
+             * @private
+             * @param {String} domain The domain name or email address.
+             * @param {Function} callback The function that gets called for every
+             * character.
+             * @returns {Array} A new string of characters returned by the callback
+             * function.
+             */
+            function mapDomain(string, fn) {
+              var parts = string.split("@");
+              var result = "";
+              if (parts.length > 1) {
+                // In email addresses, only the domain name should be punycoded. Leave
+                // the local part (i.e. everything up to `@`) intact.
+                result = parts[0] + "@";
+                string = parts[1];
+              }
+              // Avoid `split(regex)` for IE8 compatibility. See #17.
+              string = string.replace(regexSeparators, "\x2E");
+              var labels = string.split(".");
+              var encoded = map(labels, fn).join(".");
+              return result + encoded;
+            }
+
+            /**
+             * Creates an array containing the numeric code points of each Unicode
+             * character in the string. While JavaScript uses UCS-2 internally,
+             * this function will convert a pair of surrogate halves (each of which
+             * UCS-2 exposes as separate characters) into a single code point,
+             * matching UTF-16.
+             * @see `punycode.ucs2.encode`
+             * @see <https://mathiasbynens.be/notes/javascript-encoding>
+             * @memberOf punycode.ucs2
+             * @name decode
+             * @param {String} string The Unicode input string (UCS-2).
+             * @returns {Array} The new array of code points.
+             */
+            function ucs2decode(string) {
+              var output = [],
+                counter = 0,
+                length = string.length,
+                value,
+                extra;
+              while (counter < length) {
+                value = string.charCodeAt(counter++);
+                if (value >= 0xd800 && value <= 0xdbff && counter < length) {
+                  // high surrogate, and there is a next character
+                  extra = string.charCodeAt(counter++);
+                  if ((extra & 0xfc00) == 0xdc00) {
+                    // low surrogate
+                    output.push(
+                      ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000
+                    );
+                  } else {
+                    // unmatched surrogate; only append this code unit, in case the next
+                    // code unit is the high surrogate of a surrogate pair
+                    output.push(value);
+                    counter--;
+                  }
+                } else {
+                  output.push(value);
+                }
+              }
+              return output;
+            }
+
+            /**
+             * Creates a string based on an array of numeric code points.
+             * @see `punycode.ucs2.decode`
+             * @memberOf punycode.ucs2
+             * @name encode
+             * @param {Array} codePoints The array of numeric code points.
+             * @returns {String} The new Unicode string (UCS-2).
+             */
+            function ucs2encode(array) {
+              return map(array, function(value) {
+                var output = "";
+                if (value > 0xffff) {
+                  value -= 0x10000;
+                  output += stringFromCharCode(
+                    ((value >>> 10) & 0x3ff) | 0xd800
+                  );
+                  value = 0xdc00 | (value & 0x3ff);
+                }
+                output += stringFromCharCode(value);
+                return output;
+              }).join("");
+            }
+
+            /**
+             * Converts a basic code point into a digit/integer.
+             * @see `digitToBasic()`
+             * @private
+             * @param {Number} codePoint The basic numeric code point value.
+             * @returns {Number} The numeric value of a basic code point (for use in
+             * representing integers) in the range `0` to `base - 1`, or `base` if
+             * the code point does not represent a value.
+             */
+            function basicToDigit(codePoint) {
+              if (codePoint - 48 < 10) {
+                return codePoint - 22;
+              }
+              if (codePoint - 65 < 26) {
+                return codePoint - 65;
+              }
+              if (codePoint - 97 < 26) {
+                return codePoint - 97;
+              }
+              return base;
+            }
+
+            /**
+             * Converts a digit/integer into a basic code point.
+             * @see `basicToDigit()`
+             * @private
+             * @param {Number} digit The numeric value of a basic code point.
+             * @returns {Number} The basic code point whose value (when used for
+             * representing integers) is `digit`, which needs to be in the range
+             * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
+             * used; else, the lowercase form is used. The behavior is undefined
+             * if `flag` is non-zero and `digit` has no uppercase form.
+             */
+            function digitToBasic(digit, flag) {
+              //  0..25 map to ASCII a..z or A..Z
+              // 26..35 map to ASCII 0..9
+              return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
+            }
+
+            /**
+             * Bias adaptation function as per section 3.4 of RFC 3492.
+             * https://tools.ietf.org/html/rfc3492#section-3.4
+             * @private
+             */
+            function adapt(delta, numPoints, firstTime) {
+              var k = 0;
+              delta = firstTime ? floor(delta / damp) : delta >> 1;
+              delta += floor(delta / numPoints);
+              for (
+                ;
+                /* no initialization */ delta > (baseMinusTMin * tMax) >> 1;
+                k += base
+              ) {
+                delta = floor(delta / baseMinusTMin);
+              }
+              return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
+            }
+
+            /**
+             * Converts a Punycode string of ASCII-only symbols to a string of Unicode
+             * symbols.
+             * @memberOf punycode
+             * @param {String} input The Punycode string of ASCII-only symbols.
+             * @returns {String} The resulting string of Unicode symbols.
+             */
+            function decode(input) {
+              // Don't use UCS-2
+              var output = [],
+                inputLength = input.length,
+                out,
+                i = 0,
+                n = initialN,
+                bias = initialBias,
+                basic,
+                j,
+                index,
+                oldi,
+                w,
+                k,
+                digit,
+                t,
+                /** Cached calculation results */
+                baseMinusT;
+
+              // Handle the basic code points: let `basic` be the number of input code
+              // points before the last delimiter, or `0` if there is none, then copy
+              // the first basic code points to the output.
+
+              basic = input.lastIndexOf(delimiter);
+              if (basic < 0) {
+                basic = 0;
+              }
+
+              for (j = 0; j < basic; ++j) {
+                // if it's not a basic code point
+                if (input.charCodeAt(j) >= 0x80) {
+                  error("not-basic");
+                }
+                output.push(input.charCodeAt(j));
+              }
+
+              // Main decoding loop: start just after the last delimiter if any basic code
+              // points were copied; start at the beginning otherwise.
+
+              for (
+                index = basic > 0 ? basic + 1 : 0;
+                index < inputLength /* no final expression */;
+
+              ) {
+                // `index` is the index of the next character to be consumed.
+                // Decode a generalized variable-length integer into `delta`,
+                // which gets added to `i`. The overflow checking is easier
+                // if we increase `i` as we go, then subtract off its starting
+                // value at the end to obtain `delta`.
+                for (
+                  oldi = i, w = 1, k = base /* no condition */;
+                  ;
+                  k += base
+                ) {
+                  if (index >= inputLength) {
+                    error("invalid-input");
+                  }
+
+                  digit = basicToDigit(input.charCodeAt(index++));
+
+                  if (digit >= base || digit > floor((maxInt - i) / w)) {
+                    error("overflow");
+                  }
+
+                  i += digit * w;
+                  t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;
+
+                  if (digit < t) {
+                    break;
+                  }
+
+                  baseMinusT = base - t;
+                  if (w > floor(maxInt / baseMinusT)) {
+                    error("overflow");
+                  }
+
+                  w *= baseMinusT;
+                }
+
+                out = output.length + 1;
+                bias = adapt(i - oldi, out, oldi == 0);
+
+                // `i` was supposed to wrap around from `out` to `0`,
+                // incrementing `n` each time, so we'll fix that now:
+                if (floor(i / out) > maxInt - n) {
+                  error("overflow");
+                }
+
+                n += floor(i / out);
+                i %= out;
+
+                // Insert `n` at position `i` of the output
+                output.splice(i++, 0, n);
+              }
+
+              return ucs2encode(output);
+            }
+
+            /**
+             * Converts a string of Unicode symbols (e.g. a domain name label) to a
+             * Punycode string of ASCII-only symbols.
+             * @memberOf punycode
+             * @param {String} input The string of Unicode symbols.
+             * @returns {String} The resulting Punycode string of ASCII-only symbols.
+             */
+            function encode(input) {
+              var n,
+                delta,
+                handledCPCount,
+                basicLength,
+                bias,
+                j,
+                m,
+                q,
+                k,
+                t,
+                currentValue,
+                output = [],
+                /** `inputLength` will hold the number of code points in `input`. */
+                inputLength,
+                /** Cached calculation results */
+                handledCPCountPlusOne,
+                baseMinusT,
+                qMinusT;
+
+              // Convert the input in UCS-2 to Unicode
+              input = ucs2decode(input);
+
+              // Cache the length
+              inputLength = input.length;
+
+              // Initialize the state
+              n = initialN;
+              delta = 0;
+              bias = initialBias;
+
+              // Handle the basic code points
+              for (j = 0; j < inputLength; ++j) {
+                currentValue = input[j];
+                if (currentValue < 0x80) {
+                  output.push(stringFromCharCode(currentValue));
+                }
+              }
+
+              handledCPCount = basicLength = output.length;
+
+              // `handledCPCount` is the number of code points that have been handled;
+              // `basicLength` is the number of basic code points.
+
+              // Finish the basic string - if it is not empty - with a delimiter
+              if (basicLength) {
+                output.push(delimiter);
+              }
+
+              // Main encoding loop:
+              while (handledCPCount < inputLength) {
+                // All non-basic code points < n have been handled already. Find the next
+                // larger one:
+                for (m = maxInt, j = 0; j < inputLength; ++j) {
+                  currentValue = input[j];
+                  if (currentValue >= n && currentValue < m) {
+                    m = currentValue;
+                  }
+                }
+
+                // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
+                // but guard against overflow
+                handledCPCountPlusOne = handledCPCount + 1;
+                if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
+                  error("overflow");
+                }
+
+                delta += (m - n) * handledCPCountPlusOne;
+                n = m;
+
+                for (j = 0; j < inputLength; ++j) {
+                  currentValue = input[j];
+
+                  if (currentValue < n && ++delta > maxInt) {
+                    error("overflow");
+                  }
+
+                  if (currentValue == n) {
+                    // Represent delta as a generalized variable-length integer
+                    for (q = delta, k = base /* no condition */; ; k += base) {
+                      t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;
+                      if (q < t) {
+                        break;
+                      }
+                      qMinusT = q - t;
+                      baseMinusT = base - t;
+                      output.push(
+                        stringFromCharCode(
+                          digitToBasic(t + qMinusT % baseMinusT, 0)
+                        )
+                      );
+                      q = floor(qMinusT / baseMinusT);
+                    }
+
+                    output.push(stringFromCharCode(digitToBasic(q, 0)));
+                    bias = adapt(
+                      delta,
+                      handledCPCountPlusOne,
+                      handledCPCount == basicLength
+                    );
+                    delta = 0;
+                    ++handledCPCount;
+                  }
+                }
+
+                ++delta;
+                ++n;
+              }
+              return output.join("");
+            }
+
+            /**
+             * Converts a Punycode string representing a domain name or an email address
+             * to Unicode. Only the Punycoded parts of the input will be converted, i.e.
+             * it doesn't matter if you call it on a string that has already been
+             * converted to Unicode.
+             * @memberOf punycode
+             * @param {String} input The Punycoded domain name or email address to
+             * convert to Unicode.
+             * @returns {String} The Unicode representation of the given Punycode
+             * string.
+             */
+            function toUnicode(input) {
+              return mapDomain(input, function(string) {
+                return regexPunycode.test(string)
+                  ? decode(string.slice(4).toLowerCase())
+                  : string;
+              });
+            }
+
+            /**
+             * Converts a Unicode string representing a domain name or an email address to
+             * Punycode. Only the non-ASCII parts of the domain name will be converted,
+             * i.e. it doesn't matter if you call it with a domain that's already in
+             * ASCII.
+             * @memberOf punycode
+             * @param {String} input The domain name or email address to convert, as a
+             * Unicode string.
+             * @returns {String} The Punycode representation of the given domain name or
+             * email address.
+             */
+            function toASCII(input) {
+              return mapDomain(input, function(string) {
+                return regexNonASCII.test(string)
+                  ? "xn--" + encode(string)
+                  : string;
+              });
+            }
+
+            /*--------------------------------------------------------------------------*/
+
+            /** Define the public API */
+            punycode = {
+              /**
+               * A string representing the current Punycode.js version number.
+               * @memberOf punycode
+               * @type String
+               */
+              version: "1.4.1",
+              /**
+               * An object of methods to convert from JavaScript's internal character
+               * representation (UCS-2) to Unicode code points, and back.
+               * @see <https://mathiasbynens.be/notes/javascript-encoding>
+               * @memberOf punycode
+               * @type Object
+               */
+              ucs2: {
+                decode: ucs2decode,
+                encode: ucs2encode
+              },
+              decode: decode,
+              encode: encode,
+              toASCII: toASCII,
+              toUnicode: toUnicode
+            };
+
+            /** Expose `punycode` */
+            // Some AMD build optimizers, like r.js, check for specific condition patterns
+            // like the following:
+            if (true) {
+              !((__WEBPACK_AMD_DEFINE_RESULT__ = function() {
+                return punycode;
+              }.call(exports, __webpack_require__, exports, module)),
+              __WEBPACK_AMD_DEFINE_RESULT__ !== undefined &&
+                (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+            } else if (freeExports && freeModule) {
+              if (module.exports == freeExports) {
+                // in Node.js, io.js, or RingoJS v0.8.0+
+                freeModule.exports = punycode;
+              } else {
+                // in Narwhal or RingoJS v0.7.0-
+                for (key in punycode) {
+                  punycode.hasOwnProperty(key) &&
+                    (freeExports[key] = punycode[key]);
+                }
+              }
+            } else {
+              // in Rhino or a web browser
+              root.punycode = punycode;
+            }
+          })(this);
+
+          /* WEBPACK VAR INJECTION */
+        }.call(
+          exports,
+          __webpack_require__(
+            /*! ./../webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js"
+          )(module),
+          __webpack_require__(
+            /*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"
+          )
+        ));
+
+        /***/
+      },
+
+    /***/ "./node_modules/querystring-es3/decode.js":
+      /*!************************************************!*\
+  !*** ./node_modules/querystring-es3/decode.js ***!
+  \************************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+        // Copyright Joyent, Inc. and other Node contributors.
+        //
+        // Permission is hereby granted, free of charge, to any person obtaining a
+        // copy of this software and associated documentation files (the
+        // "Software"), to deal in the Software without restriction, including
+        // without limitation the rights to use, copy, modify, merge, publish,
+        // distribute, sublicense, and/or sell copies of the Software, and to permit
+        // persons to whom the Software is furnished to do so, subject to the
+        // following conditions:
+        //
+        // The above copyright notice and this permission notice shall be included
+        // in all copies or substantial portions of the Software.
+        //
+        // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+        // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+        // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+        // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+        // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+        // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+        // USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+        // If obj.hasOwnProperty has been overridden, then calling
+        // obj.hasOwnProperty(prop) will break.
+        // See: https://github.com/joyent/node/issues/1707
+        function hasOwnProperty(obj, prop) {
+          return Object.prototype.hasOwnProperty.call(obj, prop);
+        }
+
+        module.exports = function(qs, sep, eq, options) {
+          sep = sep || "&";
+          eq = eq || "=";
+          var obj = {};
+
+          if (typeof qs !== "string" || qs.length === 0) {
+            return obj;
+          }
+
+          var regexp = /\+/g;
+          qs = qs.split(sep);
+
+          var maxKeys = 1000;
+          if (options && typeof options.maxKeys === "number") {
+            maxKeys = options.maxKeys;
+          }
+
+          var len = qs.length;
+          // maxKeys <= 0 means that we should not limit keys count
+          if (maxKeys > 0 && len > maxKeys) {
+            len = maxKeys;
+          }
+
+          for (var i = 0; i < len; ++i) {
+            var x = qs[i].replace(regexp, "%20"),
+              idx = x.indexOf(eq),
+              kstr,
+              vstr,
+              k,
+              v;
+
+            if (idx >= 0) {
+              kstr = x.substr(0, idx);
+              vstr = x.substr(idx + 1);
+            } else {
+              kstr = x;
+              vstr = "";
+            }
+
+            k = decodeURIComponent(kstr);
+            v = decodeURIComponent(vstr);
+
+            if (!hasOwnProperty(obj, k)) {
+              obj[k] = v;
+            } else if (isArray(obj[k])) {
+              obj[k].push(v);
+            } else {
+              obj[k] = [obj[k], v];
+            }
+          }
+
+          return obj;
+        };
+
+        var isArray =
+          Array.isArray ||
+          function(xs) {
+            return Object.prototype.toString.call(xs) === "[object Array]";
+          };
+
+        /***/
+      },
+
+    /***/ "./node_modules/querystring-es3/encode.js":
+      /*!************************************************!*\
+  !*** ./node_modules/querystring-es3/encode.js ***!
+  \************************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+        // Copyright Joyent, Inc. and other Node contributors.
+        //
+        // Permission is hereby granted, free of charge, to any person obtaining a
+        // copy of this software and associated documentation files (the
+        // "Software"), to deal in the Software without restriction, including
+        // without limitation the rights to use, copy, modify, merge, publish,
+        // distribute, sublicense, and/or sell copies of the Software, and to permit
+        // persons to whom the Software is furnished to do so, subject to the
+        // following conditions:
+        //
+        // The above copyright notice and this permission notice shall be included
+        // in all copies or substantial portions of the Software.
+        //
+        // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+        // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+        // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+        // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+        // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+        // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+        // USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+        var stringifyPrimitive = function(v) {
+          switch (typeof v) {
+            case "string":
+              return v;
+
+            case "boolean":
+              return v ? "true" : "false";
+
+            case "number":
+              return isFinite(v) ? v : "";
+
+            default:
+              return "";
+          }
+        };
+
+        module.exports = function(obj, sep, eq, name) {
+          sep = sep || "&";
+          eq = eq || "=";
+          if (obj === null) {
+            obj = undefined;
+          }
+
+          if (typeof obj === "object") {
+            return map(objectKeys(obj), function(k) {
+              var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;
+              if (isArray(obj[k])) {
+                return map(obj[k], function(v) {
+                  return ks + encodeURIComponent(stringifyPrimitive(v));
+                }).join(sep);
+              } else {
+                return ks + encodeURIComponent(stringifyPrimitive(obj[k]));
+              }
+            }).join(sep);
+          }
+
+          if (!name) return "";
+          return (
+            encodeURIComponent(stringifyPrimitive(name)) +
+            eq +
+            encodeURIComponent(stringifyPrimitive(obj))
+          );
+        };
+
+        var isArray =
+          Array.isArray ||
+          function(xs) {
+            return Object.prototype.toString.call(xs) === "[object Array]";
+          };
+
+        function map(xs, f) {
+          if (xs.map) return xs.map(f);
+          var res = [];
+          for (var i = 0; i < xs.length; i++) {
+            res.push(f(xs[i], i));
+          }
+          return res;
+        }
+
+        var objectKeys =
+          Object.keys ||
+          function(obj) {
+            var res = [];
+            for (var key in obj) {
+              if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);
+            }
+            return res;
+          };
+
+        /***/
+      },
+
+    /***/ "./node_modules/querystring-es3/index.js":
+      /*!***********************************************!*\
+  !*** ./node_modules/querystring-es3/index.js ***!
+  \***********************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+
+        exports.decode = exports.parse = __webpack_require__(
+          /*! ./decode */ "./node_modules/querystring-es3/decode.js"
+        );
+        exports.encode = exports.stringify = __webpack_require__(
+          /*! ./encode */ "./node_modules/querystring-es3/encode.js"
+        );
+
+        /***/
+      },
+
+    /***/ "./node_modules/react-dev-utils/formatWebpackMessages.js":
+      /*!***************************************************************!*\
+  !*** ./node_modules/react-dev-utils/formatWebpackMessages.js ***!
+  \***************************************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+        /**
+         * Copyright (c) 2015-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.
+         */
+
+        // WARNING: this code is untranspiled and is used in browser too.
+        // Please make sure any changes are in ES5 or contribute a Babel compile step.
+
+        // Some custom utilities to prettify Webpack output.
+        // This is quite hacky and hopefully won't be needed when Webpack fixes this.
+        // https://github.com/webpack/webpack/issues/2878
+
+        var chalk = __webpack_require__(
+          /*! chalk */ "./node_modules/react-dev-utils/node_modules/chalk/index.js"
+        );
+        var friendlySyntaxErrorLabel = "Syntax error:";
+
+        function isLikelyASyntaxError(message) {
+          return message.indexOf(friendlySyntaxErrorLabel) !== -1;
+        }
+
+        // Cleans up webpack error messages.
+        // eslint-disable-next-line no-unused-vars
+        function formatMessage(message, isError) {
+          var lines = message.split("\n");
+
+          if (lines.length > 2 && lines[1] === "") {
+            // Remove extra newline.
+            lines.splice(1, 1);
+          }
+
+          // Remove webpack-specific loader notation from filename.
+          // Before:
+          // ./~/css-loader!./~/postcss-loader!./src/App.css
+          // After:
+          // ./src/App.css
+          if (lines[0].lastIndexOf("!") !== -1) {
+            lines[0] = lines[0].substr(lines[0].lastIndexOf("!") + 1);
+          }
+
+          lines = lines.filter(function(line) {
+            // Webpack adds a list of entry points to warning messages:
+            //  @ ./src/index.js
+            //  @ multi react-scripts/~/react-dev-utils/webpackHotDevClient.js ...
+            // It is misleading (and unrelated to the warnings) so we clean it up.
+            // It is only useful for syntax errors but we have beautiful frames for them.
+            return line.indexOf(" @ ") !== 0;
+          });
+
+          // line #0 is filename
+          // line #1 is the main error message
+          if (!lines[0] || !lines[1]) {
+            return lines.join("\n");
+          }
+
+          // Cleans up verbose "module not found" messages for files and packages.
+          if (lines[1].indexOf("Module not found: ") === 0) {
+            lines = [
+              lines[0],
+              // Clean up message because "Module not found: " is descriptive enough.
+              lines[1]
+                .replace("Cannot resolve 'file' or 'directory' ", "")
+                .replace("Cannot resolve module ", "")
+                .replace("Error: ", "")
+                .replace("[CaseSensitivePathsPlugin] ", "")
+            ];
+          }
+
+          // Cleans up syntax error messages.
+          if (lines[1].indexOf("Module build failed: ") === 0) {
+            lines[1] = lines[1].replace(
+              "Module build failed: SyntaxError:",
+              friendlySyntaxErrorLabel
+            );
+          }
+
+          // Clean up export errors.
+          // TODO: we should really send a PR to Webpack for this.
+          var exportError = /\s*(.+?)\s*(")?export '(.+?)' was not found in '(.+?)'/;
+          if (lines[1].match(exportError)) {
+            lines[1] = lines[1].replace(
+              exportError,
+              "$1 '$4' does not contain an export named '$3'."
+            );
+          }
+
+          lines[0] = chalk.inverse(lines[0]);
+
+          // Reassemble the message.
+          message = lines.join("\n");
+          // Internal stacks are generally useless so we strip them... with the
+          // exception of stacks containing `webpack:` because they're normally
+          // from user code generated by WebPack. For more information see
+          // https://github.com/facebookincubator/create-react-app/pull/1050
+          message = message.replace(
+            /^\s*at\s((?!webpack:).)*:\d+:\d+[\s)]*(\n|$)/gm,
+            ""
+          ); // at ... ...:x:y
+
+          return message.trim();
+        }
+
+        function formatWebpackMessages(json) {
+          var formattedErrors = json.errors.map(function(message) {
+            return formatMessage(message, true);
+          });
+          var formattedWarnings = json.warnings.map(function(message) {
+            return formatMessage(message, false);
+          });
+          var result = {
+            errors: formattedErrors,
+            warnings: formattedWarnings
+          };
+          if (result.errors.some(isLikelyASyntaxError)) {
+            // If there are any syntax errors, show just them.
+            // This prevents a confusing ESLint parsing error
+            // preceding a much more useful Babel syntax error.
+            result.errors = result.errors.filter(isLikelyASyntaxError);
+          }
+          return result;
+        }
+
+        module.exports = formatWebpackMessages;
+
+        /***/
+      },
+
+    /***/ "./node_modules/react-dev-utils/launchEditorEndpoint.js":
+      /*!**************************************************************!*\
+  !*** ./node_modules/react-dev-utils/launchEditorEndpoint.js ***!
+  \**************************************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+        /**
+         * Copyright (c) 2015-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.
+         */
+
+        // TODO: we might want to make this injectable to support DEV-time non-root URLs.
+        module.exports = "/__open-stack-frame-in-editor";
+
+        /***/
+      },
+
+    /***/ "./node_modules/react-dev-utils/node_modules/chalk/index.js":
+      /*!******************************************************************!*\
+  !*** ./node_modules/react-dev-utils/node_modules/chalk/index.js ***!
+  \******************************************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+        /* WEBPACK VAR INJECTION */ (function(process) {
+          var escapeStringRegexp = __webpack_require__(
+            /*! escape-string-regexp */ "./node_modules/escape-string-regexp/index.js"
+          );
+          var ansiStyles = __webpack_require__(
+            /*! ansi-styles */ "./node_modules/ansi-styles/index.js"
+          );
+          var stripAnsi = __webpack_require__(
+            /*! strip-ansi */ "./node_modules/react-dev-utils/node_modules/strip-ansi/index.js"
+          );
+          var hasAnsi = __webpack_require__(
+            /*! has-ansi */ "./node_modules/has-ansi/index.js"
+          );
+          var supportsColor = __webpack_require__(
+            /*! supports-color */ "./node_modules/supports-color/index.js"
+          );
+          var defineProps = Object.defineProperties;
+          var isSimpleWindowsTerm =
+            process.platform === "win32" &&
+            !/^xterm/i.test(
+              Object({ NODE_ENV: "development", PUBLIC_URL: "" }).TERM
+            );
+
+          function Chalk(options) {
+            // detect mode if not set manually
+            this.enabled =
+              !options || options.enabled === undefined
+                ? supportsColor
+                : options.enabled;
+          }
+
+          // use bright blue on Windows as the normal blue color is illegible
+          if (isSimpleWindowsTerm) {
+            ansiStyles.blue.open = "\u001b[94m";
+          }
+
+          var styles = (function() {
+            var ret = {};
+
+            Object.keys(ansiStyles).forEach(function(key) {
+              ansiStyles[key].closeRe = new RegExp(
+                escapeStringRegexp(ansiStyles[key].close),
+                "g"
+              );
+
+              ret[key] = {
+                get: function() {
+                  return build.call(this, this._styles.concat(key));
+                }
+              };
+            });
+
+            return ret;
+          })();
+
+          var proto = defineProps(function chalk() {}, styles);
+
+          function build(_styles) {
+            var builder = function() {
+              return applyStyle.apply(builder, arguments);
+            };
+
+            builder._styles = _styles;
+            builder.enabled = this.enabled;
+            // __proto__ is used because we must return a function, but there is
+            // no way to create a function with a different prototype.
+            /* eslint-disable no-proto */
+            builder.__proto__ = proto;
+
+            return builder;
+          }
+
+          function applyStyle() {
+            // support varags, but simply cast to string in case there's only one arg
+            var args = arguments;
+            var argsLen = args.length;
+            var str = argsLen !== 0 && String(arguments[0]);
+
+            if (argsLen > 1) {
+              // don't slice `arguments`, it prevents v8 optimizations
+              for (var a = 1; a < argsLen; a++) {
+                str += " " + args[a];
+              }
+            }
+
+            if (!this.enabled || !str) {
+              return str;
+            }
+
+            var nestedStyles = this._styles;
+            var i = nestedStyles.length;
+
+            // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe,
+            // see https://github.com/chalk/chalk/issues/58
+            // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop.
+            var originalDim = ansiStyles.dim.open;
+            if (
+              isSimpleWindowsTerm &&
+              (nestedStyles.indexOf("gray") !== -1 ||
+                nestedStyles.indexOf("grey") !== -1)
+            ) {
+              ansiStyles.dim.open = "";
+            }
+
+            while (i--) {
+              var code = ansiStyles[nestedStyles[i]];
+
+              // Replace any instances already present with a re-opening code
+              // otherwise only the part of the string until said closing code
+              // will be colored, and the rest will simply be 'plain'.
+              str =
+                code.open + str.replace(code.closeRe, code.open) + code.close;
+            }
+
+            // Reset the original 'dim' if we changed it to work around the Windows dimmed gray issue.
+            ansiStyles.dim.open = originalDim;
+
+            return str;
+          }
+
+          function init() {
+            var ret = {};
+
+            Object.keys(styles).forEach(function(name) {
+              ret[name] = {
+                get: function() {
+                  return build.call(this, [name]);
+                }
+              };
+            });
+
+            return ret;
+          }
+
+          defineProps(Chalk.prototype, init());
+
+          module.exports = new Chalk();
+          module.exports.styles = ansiStyles;
+          module.exports.hasColor = hasAnsi;
+          module.exports.stripColor = stripAnsi;
+          module.exports.supportsColor = supportsColor;
+
+          /* WEBPACK VAR INJECTION */
+        }.call(
+          exports,
+          __webpack_require__(
+            /*! ./../../../process/browser.js */ "./node_modules/process/browser.js"
+          )
+        ));
+
+        /***/
+      },
+
+    /***/ "./node_modules/react-dev-utils/node_modules/strip-ansi/index.js":
+      /*!***********************************************************************!*\
+  !*** ./node_modules/react-dev-utils/node_modules/strip-ansi/index.js ***!
+  \***********************************************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+
+        var ansiRegex = __webpack_require__(
+          /*! ansi-regex */ "./node_modules/ansi-regex/index.js"
+        )();
+
+        module.exports = function(str) {
+          return typeof str === "string" ? str.replace(ansiRegex, "") : str;
+        };
+
+        /***/
+      },
+
+    /***/ "./node_modules/react-dev-utils/webpackHotDevClient.js":
+      /*!*************************************************************!*\
+  !*** ./node_modules/react-dev-utils/webpackHotDevClient.js ***!
+  \*************************************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+        /**
+         * Copyright (c) 2015-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.
+         */
+
+        // This alternative WebpackDevServer combines the functionality of:
+        // https://github.com/webpack/webpack-dev-server/blob/webpack-1/client/index.js
+        // https://github.com/webpack/webpack/blob/webpack-1/hot/dev-server.js
+
+        // It only supports their simplest configuration (hot updates on same server).
+        // It makes some opinionated choices on top, like adding a syntax error overlay
+        // that looks similar to our console output. The error overlay is inspired by:
+        // https://github.com/glenjamin/webpack-hot-middleware
+
+        var SockJS = __webpack_require__(
+          /*! sockjs-client */ "./node_modules/sockjs-client/lib/entry.js"
+        );
+        var stripAnsi = __webpack_require__(
+          /*! strip-ansi */ "./node_modules/react-dev-utils/node_modules/strip-ansi/index.js"
+        );
+        var url = __webpack_require__(/*! url */ "./node_modules/url/url.js");
+        var launchEditorEndpoint = __webpack_require__(
+          /*! ./launchEditorEndpoint */ "./node_modules/react-dev-utils/launchEditorEndpoint.js"
+        );
+        var formatWebpackMessages = __webpack_require__(
+          /*! ./formatWebpackMessages */ "./node_modules/react-dev-utils/formatWebpackMessages.js"
+        );
+        var ErrorOverlay = __webpack_require__(
+          /*! react-error-overlay */ "./node_modules/react-error-overlay/lib/index.js"
+        );
+
+        ErrorOverlay.setEditorHandler(function editorHandler(errorLocation) {
+          // Keep this sync with errorOverlayMiddleware.js
+          fetch(
+            launchEditorEndpoint +
+              "?fileName=" +
+              window.encodeURIComponent(errorLocation.fileName) +
+              "&lineNumber=" +
+              window.encodeURIComponent(errorLocation.lineNumber || 1)
+          );
+        });
+
+        // We need to keep track of if there has been a runtime error.
+        // Essentially, we cannot guarantee application state was not corrupted by the
+        // runtime error. To prevent confusing behavior, we forcibly reload the entire
+        // application. This is handled below when we are notified of a compile (code
+        // change).
+        // See https://github.com/facebookincubator/create-react-app/issues/3096
+        var hadRuntimeError = false;
+        ErrorOverlay.startReportingRuntimeErrors({
+          onError: function() {
+            hadRuntimeError = true;
+          },
+          filename: "/static/js/bundle.js"
+        });
+
+        if (module.hot && typeof module.hot.dispose === "function") {
+          module.hot.dispose(function() {
+            // TODO: why do we need this?
+            ErrorOverlay.stopReportingRuntimeErrors();
+          });
+        }
+
+        // Connect to WebpackDevServer via a socket.
+        var connection = new SockJS(
+          url.format({
+            protocol: window.location.protocol,
+            hostname: window.location.hostname,
+            port: window.location.port,
+            // Hardcoded in WebpackDevServer
+            pathname: "/sockjs-node"
+          })
+        );
+
+        // Unlike WebpackDevServer client, we won't try to reconnect
+        // to avoid spamming the console. Disconnect usually happens
+        // when developer stops the server.
+        connection.onclose = function() {
+          if (
+            typeof console !== "undefined" &&
+            typeof console.info === "function"
+          ) {
+            console.info(
+              "The development server has disconnected.\nRefresh the page if necessary."
+            );
+          }
+        };
+
+        // Remember some state related to hot module replacement.
+        var isFirstCompilation = true;
+        var mostRecentCompilationHash = null;
+        var hasCompileErrors = false;
+
+        function clearOutdatedErrors() {
+          // Clean up outdated compile errors, if any.
+          if (
+            typeof console !== "undefined" &&
+            typeof console.clear === "function"
+          ) {
+            if (hasCompileErrors) {
+              console.clear();
+            }
+          }
+        }
+
+        // Successful compilation.
+        function handleSuccess() {
+          clearOutdatedErrors();
+
+          var isHotUpdate = !isFirstCompilation;
+          isFirstCompilation = false;
+          hasCompileErrors = false;
+
+          // Attempt to apply hot updates or reload.
+          if (isHotUpdate) {
+            tryApplyUpdates(function onHotUpdateSuccess() {
+              // Only dismiss it when we're sure it's a hot update.
+              // Otherwise it would flicker right before the reload.
+              ErrorOverlay.dismissBuildError();
+            });
+          }
+        }
+
+        // Compilation with warnings (e.g. ESLint).
+        function handleWarnings(warnings) {
+          clearOutdatedErrors();
+
+          var isHotUpdate = !isFirstCompilation;
+          isFirstCompilation = false;
+          hasCompileErrors = false;
+
+          function printWarnings() {
+            // Print warnings to the console.
+            var formatted = formatWebpackMessages({
+              warnings: warnings,
+              errors: []
+            });
+
+            if (
+              typeof console !== "undefined" &&
+              typeof console.warn === "function"
+            ) {
+              for (var i = 0; i < formatted.warnings.length; i++) {
+                if (i === 5) {
+                  console.warn(
+                    "There were more warnings in other files.\n" +
+                      "You can find a complete log in the terminal."
+                  );
+                  break;
+                }
+                console.warn(stripAnsi(formatted.warnings[i]));
+              }
+            }
+          }
+
+          // Attempt to apply hot updates or reload.
+          if (isHotUpdate) {
+            tryApplyUpdates(function onSuccessfulHotUpdate() {
+              // Only print warnings if we aren't refreshing the page.
+              // Otherwise they'll disappear right away anyway.
+              printWarnings();
+              // Only dismiss it when we're sure it's a hot update.
+              // Otherwise it would flicker right before the reload.
+              ErrorOverlay.dismissBuildError();
+            });
+          } else {
+            // Print initial warnings immediately.
+            printWarnings();
+          }
+        }
+
+        // Compilation with errors (e.g. syntax error or missing modules).
+        function handleErrors(errors) {
+          clearOutdatedErrors();
+
+          isFirstCompilation = false;
+          hasCompileErrors = true;
+
+          // "Massage" webpack messages.
+          var formatted = formatWebpackMessages({
+            errors: errors,
+            warnings: []
+          });
+
+          // Only show the first error.
+          ErrorOverlay.reportBuildError(formatted.errors[0]);
+
+          // Also log them to the console.
+          if (
+            typeof console !== "undefined" &&
+            typeof console.error === "function"
+          ) {
+            for (var i = 0; i < formatted.errors.length; i++) {
+              console.error(stripAnsi(formatted.errors[i]));
+            }
+          }
+
+          // Do not attempt to reload now.
+          // We will reload on next success instead.
+        }
+
+        // There is a newer version of the code available.
+        function handleAvailableHash(hash) {
+          // Update last known compilation hash.
+          mostRecentCompilationHash = hash;
+        }
+
+        // Handle messages from the server.
+        connection.onmessage = function(e) {
+          var message = JSON.parse(e.data);
+          switch (message.type) {
+            case "hash":
+              handleAvailableHash(message.data);
+              break;
+            case "still-ok":
+            case "ok":
+              handleSuccess();
+              break;
+            case "content-changed":
+              // Triggered when a file from `contentBase` changed.
+              window.location.reload();
+              break;
+            case "warnings":
+              handleWarnings(message.data);
+              break;
+            case "errors":
+              handleErrors(message.data);
+              break;
+            default:
+            // Do nothing.
+          }
+        };
+
+        // Is there a newer version of this code available?
+        function isUpdateAvailable() {
+          /* globals __webpack_hash__ */
+          // __webpack_hash__ is the hash of the current compilation.
+          // It's a global variable injected by Webpack.
+          return mostRecentCompilationHash !== __webpack_require__.h();
+        }
+
+        // Webpack disallows updates in other states.
+        function canApplyUpdates() {
+          return module.hot.status() === "idle";
+        }
+
+        // Attempt to update code on the fly, fall back to a hard reload.
+        function tryApplyUpdates(onHotUpdateSuccess) {
+          if (false) {
+            // HotModuleReplacementPlugin is not in Webpack configuration.
+            window.location.reload();
+            return;
+          }
+
+          if (!isUpdateAvailable() || !canApplyUpdates()) {
+            return;
+          }
+
+          function handleApplyUpdates(err, updatedModules) {
+            if (err || !updatedModules || hadRuntimeError) {
+              window.location.reload();
+              return;
+            }
+
+            if (typeof onHotUpdateSuccess === "function") {
+              // Maybe we want to do something.
+              onHotUpdateSuccess();
+            }
+
+            if (isUpdateAvailable()) {
+              // While we were updating, there was a new update! Do it again.
+              tryApplyUpdates();
+            }
+          }
+
+          // https://webpack.github.io/docs/hot-module-replacement.html#check
+          var result = module.hot.check(
+            /* autoApply */ true,
+            handleApplyUpdates
+          );
+
+          // // Webpack 2 returns a Promise instead of invoking a callback
+          if (result && result.then) {
+            result.then(
+              function(updatedModules) {
+                handleApplyUpdates(null, updatedModules);
+              },
+              function(err) {
+                handleApplyUpdates(err, null);
+              }
+            );
+          }
+        }
+
+        /***/
+      },
+
+    /***/ "./node_modules/react-dom/cjs/react-dom.development.js":
+      /*!*************************************************************!*\
+  !*** ./node_modules/react-dom/cjs/react-dom.development.js ***!
+  \*************************************************************/
+      /*! dynamic exports provided */
+      /*! all exports used */
+      /***/ function(module, exports, __webpack_require__) {
+        "use strict";
+        /** @license React v16.2.0
+         * react-dom.development.js
+         *
+         * 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 (true) {
+          (function() {
+            "use strict";
+
+            var React = __webpack_require__(
+              /*! react */ "./node_modules/react/index.js"
+            );
+            var invariant = __webpack_require__(
+              /*! fbjs/lib/invariant */ "./node_modules/fbjs/lib/invariant.js"
+            );
+            var warning = __webpack_require__(
+              /*! fbjs/lib/warning */ "./node_modules/fbjs/lib/warning.js"
+            );
+            var ExecutionEnvironment = __webpack_require__(
+              /*! fbjs/lib/ExecutionEnvironment */ "./node_modules/fbjs/lib/ExecutionEnvironment.js"
+            );
+            var _assign = __webpack_require__(
+              /*! object-assign */ "./node_modules/object-assign/index.js"
+            );
+            var emptyFunction = __webpack_require__(
+              /*! fbjs/lib/emptyFunction */ "./node_modules/fbjs/lib/emptyFunction.js"
+            );
+            var EventListener = __webpack_require__(
+              /*! fbjs/lib/EventListener */ "./node_modules/fbjs/lib/EventListener.js"
+            );
+            var getActiveElement = __webpack_require__(
+              /*! fbjs/lib/getActiveElement */ "./node_modules/fbjs/lib/getActiveElement.js"
+            );
+            var shallowEqual = __webpack_require__(
+              /*! fbjs/lib/shallowEqual */ "./node_modules/fbjs/lib/shallowEqual.js"
+            );
+            var containsNode = __webpack_require__(
+              /*! fbjs/lib/containsNode */ "./node_modules/fbjs/lib/containsNode.js"
+            );
+            var focusNode = __webpack_require__(
+              /*! fbjs/lib/focusNode */ "./node_modules/fbjs/lib/focusNode.js"
+            );
+            var emptyObject = __webpack_require__(
+              /*! fbjs/lib/emptyObject */ "./node_modules/fbjs/lib/emptyObject.js"
+            );
+            var checkPropTypes = __webpack_require__(
+              /*! prop-types/checkPropTypes */ "./node_modules/prop-types/checkPropTypes.js"
+            );
+            var hyphenateStyleName = __webpack_require__(
+              /*! fbjs/lib/hyphenateStyleName */ "./node_modules/fbjs/lib/hyphenateStyleName.js"
+            );
+            var camelizeStyleName = __webpack_require__(
+              /*! fbjs/lib/camelizeStyleName */ "./node_modules/fbjs/lib/camelizeStyleName.js"
+            );
+
+            /**
+             * WARNING: DO NOT manually require this module.
+             * This is a replacement for `invariant(...)` used by the error code system
+             * and will _only_ be required by the corresponding babel pass.
+             * It always throws.
+             */
+
+            !React
+              ? invariant(
+                  false,
+                  "ReactDOM was loaded before React. Make sure you load the React package before loading ReactDOM."
+                )
+              : void 0;
+
+            // These attributes should be all lowercase to allow for
+            // case insensitive checks
+            var RESERVED_PROPS = {
+              children: true,
+              dangerouslySetInnerHTML: true,
+              defaultValue: true,
+              defaultChecked: true,
+              innerHTML: true,
+              suppressContentEditableWarning: true,
+              suppressHydrationWarning: true,
+              style: true
+            };
+
+            function checkMask(value, bitmask) {
+              return (value & bitmask) === bitmask;
+            }
+
+            var DOMPropertyInjection = {
+              /**
+               * Mapping from normalized, camelcased property names to a configuration that
+               * specifies how the associated DOM property should be accessed or rendered.
+               */
+              MUST_USE_PROPERTY: 0x1,
+              HAS_BOOLEAN_VALUE: 0x4,
+              HAS_NUMERIC_VALUE: 0x8,
+              HAS_POSITIVE_NUMERIC_VALUE: 0x10 | 0x8,
+              HAS_OVERLOADED_BOOLEAN_VALUE: 0x20,
+              HAS_STRING_BOOLEAN_VALUE: 0x40,
+
+              /**
+               * Inject some specialized knowledge about the DOM. This takes a config object
+               * with the following properties:
+               *
+               * Properties: object mapping DOM property name to one of the
+               * DOMPropertyInjection constants or null. If your attribute isn't in here,
+               * it won't get written to the DOM.
+               *
+               * DOMAttributeNames: object mapping React attribute name to the DOM
+               * attribute name. Attribute names not specified use the **lowercase**
+               * normalized name.
+               *
+               * DOMAttributeNamespaces: object mapping React attribute name to the DOM
+               * attribute namespace URL. (Attribute names not specified use no namespace.)
+               *
+               * DOMPropertyNames: similar to DOMAttributeNames but for DOM properties.
+               * Property names not specified use the normalized name.
+               *
+               * DOMMutationMethods: Properties that require special mutation methods. If
+               * `value` is undefined, the mutation method should unset the property.
+               *
+               * @param {object} domPropertyConfig the config as described above.
+               */
+              injectDOMPropertyConfig: function(domPropertyConfig) {
+                var Injection = DOMPropertyInjection;
+                var Properties = domPropertyConfig.Properties || {};
+                var DOMAttributeNamespaces =
+                  domPropertyConfig.DOMAttributeNamespaces || {};
+                var DOMAttributeNames =
+                  domPropertyConfig.DOMAttributeNames || {};
+                var DOMMutationMethods =
+                  domPropertyConfig.DOMMutationMethods || {};
+
+                for (var propName in Properties) {
+                  !!properties.hasOwnProperty(propName)
+                    ? invariant(
+                        false,
+                        "injectDOMPropertyConfig(...): You're trying to inject DOM property '%s' which has already been injected. You may be accidentally injecting the same DOM property config twice, or you may be injecting two configs that have conflicting property names.",
+                        propName
+                      )
+                    : void 0;
+
+                  var lowerCased = propName.toLowerCase();
+                  var propConfig = Properties[propName];
+
+                  var propertyInfo = {
+                    attributeName: lowerCased,
+                    attributeNamespace: null,
+                    propertyName: propName,
+                    mutationMethod: null,
+
+                    mustUseProperty: checkMask(
+                      propConfig,
+                      Injection.MUST_USE_PROPERTY
+                    ),
+                    hasBooleanValue: checkMask(
+                      propConfig,
+                      Injection.HAS_BOOLEAN_VALUE
+                    ),
+                    hasNumericValue: checkMask(
+                      propConfig,
+                      Injection.HAS_NUMERIC_VALUE
+                    ),
+                    hasPositiveNumericValue: checkMask(
+                      propConfig,
+                      Injection.HAS_POSITIVE_NUMERIC_VALUE
+                    ),
+                    hasOverloadedBooleanValue: checkMask(
+                      propConfig,
+                      Injection.HAS_OVERLOADED_BOOLEAN_VALUE
+                    ),
+                    hasStringBooleanValue: checkMask(
+                      propConfig,
+                      Injection.HAS_STRING_BOOLEAN_VALUE
+                    )
+                  };
+                  !(
+                    propertyInfo.hasBooleanValue +
+                      propertyInfo.hasNumericValue +
+                      propertyInfo.hasOverloadedBooleanValue <=
+                    1
+                  )
+                    ? invariant(
+                        false,
+                        "DOMProperty: Value can be one of boolean, overloaded boolean, or numeric value, but not a combination: %s",
+                        propName
+                      )
+                    : void 0;
+
+                  if (DOMAttributeNames.hasOwnProperty(propName)) {
+                    var attributeName = DOMAttributeNames[propName];
+
+                    propertyInfo.attributeName = attributeName;
+                  }
+
+                  if (DOMAttributeNamespaces.hasOwnProperty(propName)) {
+                    propertyInfo.attributeNamespace =
+                      DOMAttributeNamespaces[propName];
+                  }
+
+                  if (DOMMutationMethods.hasOwnProperty(propName)) {
+                    propertyInfo.mutationMethod = DOMMutationMethods[propName];
+                  }
+
+                  // Downcase references to whitelist properties to check for membership
+                  // without case-sensitivity. This allows the whitelist to pick up
+                  // `allowfullscreen`, which should be written using the property configuration
+                  // for `allowFullscreen`
+                  properties[propName] = propertyInfo;
+                }
+              }
+            };
+
+            /* eslint-disable max-len */
+            var ATTRIBUTE_NAME_START_CHAR =
+              ":A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD";
+            /* eslint-enable max-len */
+            var ATTRIBUTE_NAME_CHAR =
+              ATTRIBUTE_NAME_START_CHAR +
+              "\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040";
+
+            var ROOT_ATTRIBUTE_NAME = "data-reactroot";
+
+            /**
+             * Map from property "standard name" to an object with info about how to set
+             * the property in the DOM. Each object contains:
+             *
+             * attributeName:
+             *   Used when rendering markup or with `*Attribute()`.
+             * attributeNamespace
+             * propertyName:
+             *   Used on DOM node instances. (This includes properties that mutate due to
+             *   external factors.)
+             * mutationMethod:
+             *   If non-null, used instead of the property or `setAttribute()` after
+             *   initial render.
+             * mustUseProperty:
+             *   Whether the property must be accessed and mutated as an object property.
+             * hasBooleanValue:
+             *   Whether the property should be removed when set to a falsey value.
+             * hasNumericValue:
+             *   Whether the property must be numeric or parse as a numeric and should be
+             *   removed when set to a falsey value.
+             * hasPositiveNumericValue:
+             *   Whether the property must be positive numeric or parse as a positive
+             *   numeric and should be removed when set to a falsey value.
+             * hasOverloadedBooleanValue:
+             *   Whether the property can be used as a flag as well as with a value.
+             *   Removed when strictly equal to false; present without a value when
+             *   strictly equal to true; present with a value otherwise.
+             */
+            var properties = {};
+
+            /**
+             * Checks whether a property name is a writeable attribute.
+             * @method
+             */
+            function shouldSetAttribute(name, value) {
+              if (isReservedProp(name)) {
+                return false;
+              }
+              if (
+                name.length > 2 &&
+                (name[0] === "o" || name[0] === "O") &&
+                (name[1] === "n" || name[1] === "N")
+              ) {
+                return false;
+              }
+              if (value === null) {
+                return true;
+              }
+              switch (typeof value) {
+                case "boolean":
+                  return shouldAttributeAcceptBooleanValue(name);
+                case "undefined":
+                case "number":
+                case "string":
+                case "object":
+                  return true;
+                default:
+                  // function, symbol
+                  return false;
+              }
+            }
+
+            function getPropertyInfo(name) {
+              return properties.hasOwnProperty(name) ? properties[name] : null;
+            }
+
+            function shouldAttributeAcceptBooleanValue(name) {
+              if (isReservedProp(name)) {
+                return true;
+              }
+              var propertyInfo = getPropertyInfo(name);
+              if (propertyInfo) {
+                return (
+                  propertyInfo.hasBooleanValue ||
+                  propertyInfo.hasStringBooleanValue ||
+                  propertyInfo.hasOverloadedBooleanValue
+                );
+              }
+              var prefix = name.toLowerCase().slice(0, 5);
+              return prefix === "data-" || prefix === "aria-";
+            }
+
+            /**
+             * Checks to see if a property name is within the list of properties
+             * reserved for internal React operations. These properties should
+             * not be set on an HTML element.
+             *
+             * @private
+             * @param {string} name
+             * @return {boolean} If the name is within reserved props
+             */
+            function isReservedProp(name) {
+              return RESERVED_PROPS.hasOwnProperty(name);
+            }
+
+            var injection = DOMPropertyInjection;
+
+            var MUST_USE_PROPERTY = injection.MUST_USE_PROPERTY;
+            var HAS_BOOLEAN_VALUE = injection.HAS_BOOLEAN_VALUE;
+            var HAS_NUMERIC_VALUE = injection.HAS_NUMERIC_VALUE;
+            var HAS_POSITIVE_NUMERIC_VALUE =
+              injection.HAS_POSITIVE_NUMERIC_VALUE;
+            var HAS_OVERLOADED_BOOLEAN_VALUE =
+              injection.HAS_OVERLOADED_BOOLEAN_VALUE;
+            var HAS_STRING_BOOLEAN_VALUE = injection.HAS_STRING_BOOLEAN_VALUE;
+
+            var HTMLDOMPropertyConfig = {
+              // When adding attributes to this list, be sure to also add them to
+              // the `possibleStandardNames` module to ensure casing and incorrect
+              // name warnings.
+              Properties: {
+                allowFullScreen: HAS_BOOLEAN_VALUE,
+                // specifies target context for links with `preload` type
+                async: HAS_BOOLEAN_VALUE,
+                // Note: there is a special case that prevents it from being written to the DOM
+                // on the client side because the browsers are inconsistent. Instead we call focus().
+                autoFocus: HAS_BOOLEAN_VALUE,
+                autoPlay: HAS_BOOLEAN_VALUE,
+                capture: HAS_OVERLOADED_BOOLEAN_VALUE,
+                checked: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
+                cols: HAS_POSITIVE_NUMERIC_VALUE,
+                contentEditable: HAS_STRING_BOOLEAN_VALUE,
+                controls: HAS_BOOLEAN_VALUE,
+                default: HAS_BOOLEAN_VALUE,
+                defer: HAS_BOOLEAN_VALUE,
+                disabled: HAS_BOOLEAN_VALUE,
+                download: HAS_OVERLOADED_BOOLEAN_VALUE,
+                draggable: HAS_STRING_BOOLEAN_VALUE,
+                formNoValidate: HAS_BOOLEAN_VALUE,
+                hidden: HAS_BOOLEAN_VALUE,
+                loop: HAS_BOOLEAN_VALUE,
+                // Caution; `option.selected` is not updated if `select.multiple` is
+                // disabled with `removeAttribute`.
+                multiple: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
+                muted: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
+                noValidate: HAS_BOOLEAN_VALUE,
+                open: HAS_BOOLEAN_VALUE,
+                playsInline: HAS_BOOLEAN_VALUE,
+                readOnly: HAS_BOOLEAN_VALUE,
+                required: HAS_BOOLEAN_VALUE,
+                reversed: HAS_BOOLEAN_VALUE,
+                rows: HAS_POSITIVE_NUMERIC_VALUE,
+                rowSpan: HAS_NUMERIC_VALUE,
+                scoped: HAS_BOOLEAN_VALUE,
+                seamless: HAS_BOOLEAN_VALUE,
+                selected: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
+                size: HAS_POSITIVE_NUMERIC_VALUE,
+                start: HAS_NUMERIC_VALUE,
+                // support for projecting regular DOM Elements via V1 named slots ( shadow dom )
+                span: HAS_POSITIVE_NUMERIC_VALUE,
+                spellCheck: HAS_STRING_BOOLEAN_VALUE,
+                // Style must be explicitly set in the attribute list. React components
+                // expect a style object
+                style: 0,
+                // Keep it in the whitelist because it is case-sensitive for SVG.
+                tabIndex: 0,
+                // itemScope is for for Microdata support.
+                // See http://schema.org/docs/gs.html
+                itemScope: HAS_BOOLEAN_VALUE,
+                // These attributes must stay in the white-list because they have
+                // different attribute names (see DOMAttributeNames below)
+                acceptCharset: 0,
+                className: 0,
+                htmlFor: 0,
+                httpEquiv: 0,
+                // Attributes with mutation methods must be specified in the whitelist
+                // Set the string boolean flag to allow the behavior
+                value: HAS_STRING_BOOLEAN_VALUE
+              },
+              DOMAttributeNames: {
+                acceptCharset: "accept-charset",
+                className: "class",
+                htmlFor: "for",
+                httpEquiv: "http-equiv"
+              },
+              DOMMutationMethods: {
+                value: function(node, value) {
+                  if (value == null) {
+                    return node.removeAttribute("value");
+                  }
+
+                  // Number inputs get special treatment due to some edge cases in
+                  // Chrome. Let everything else assign the value attribute as normal.
+                  // https://github.com/facebook/react/issues/7253#issuecomment-236074326
+                  if (
+                    node.type !== "number" ||
+                    node.hasAttribute("value") === false
+                  ) {
+                    node.setAttribute("value", "" + value);
+                  } else if (
+                    node.validity &&
+                    !node.validity.badInput &&
+                    node.ownerDocument.activeElement !== node
+                  ) {
+                    // Don't assign an attribute if validation reports bad
+                    // input. Chrome will clear the value. Additionally, don't
+                    // operate on inputs that have focus, otherwise Chrome might
+                    // strip off trailing decimal places and cause the user's
+                    // cursor position to jump to the beginning of the input.
+                    //
+                    // In ReactDOMInput, we have an onBlur event that will trigger
+                    // this function again when focus is lost.
+                    node.setAttribute("value", "" + value);
+                  }
+                }
+              }
+            };
+
+            var HAS_STRING_BOOLEAN_VALUE$1 = injection.HAS_STRING_BOOLEAN_VALUE;
+
+            var NS = {
+              xlink: "http://www.w3.org/1999/xlink",
+              xml: "http://www.w3.org/XML/1998/namespace"
+            };
+
+            /**
+             * This is a list of all SVG attributes that need special casing,
+             * namespacing, or boolean value assignment.
+             *
+             * When adding attributes to this list, be sure to also add them to
+             * the `possibleStandardNames` module to ensure casing and incorrect
+             * name warnings.
+             *
+             * SVG Attributes List:
+             * https://www.w3.org/TR/SVG/attindex.html
+             * SMIL Spec:
+             * https://www.w3.org/TR/smil
+             */
+            var ATTRS = [
+              "accent-height",
+              "alignment-baseline",
+              "arabic-form",
+              "baseline-shift",
+              "cap-height",
+              "clip-path",
+              "clip-rule",
+              "color-interpolation",
+              "color-interpolation-filters",
+              "color-profile",
+              "color-rendering",
+              "dominant-baseline",
+              "enable-background",
+              "fill-opacity",
+              "fill-rule",
+              "flood-color",
+              "flood-opacity",
+              "font-family",
+              "font-size",
+              "font-size-adjust",
+              "font-stretch",
+              "font-style",
+              "font-variant",
+              "font-weight",
+              "glyph-name",
+              "glyph-orientation-horizontal",
+              "glyph-orientation-vertical",
+              "horiz-adv-x",
+              "horiz-origin-x",
+              "image-rendering",
+              "letter-spacing",
+              "lighting-color",
+              "marker-end",
+              "marker-mid",
+              "marker-start",
+              "overline-position",
+              "overline-thickness",
+              "paint-order",
+              "panose-1",
+              "pointer-events",
+              "rendering-intent",
+              "shape-rendering",
+              "stop-color",
+              "stop-opacity",
+              "strikethrough-position",
+              "strikethrough-thickness",
+              "stroke-dasharray",
+              "stroke-dashoffset",
+              "stroke-linecap",
+              "stroke-linejoin",
+              "stroke-miterlimit",
+              "stroke-opacity",
+              "stroke-width",
+              "text-anchor",
+              "text-decoration",
+              "text-rendering",
+              "underline-position",
+              "underline-thickness",
+              "unicode-bidi",
+              "unicode-range",
+              "units-per-em",
+              "v-alphabetic",
+              "v-hanging",
+              "v-ideographic",
+              "v-mathematical",
+              "vector-effect",
+              "vert-adv-y",
+              "vert-origin-x",
+              "vert-origin-y",
+              "word-spacing",
+              "writing-mode",
+              "x-height",
+              "xlink:actuate",
+              "xlink:arcrole",
+              "xlink:href",
+              "xlink:role",
+              "xlink:show",
+              "xlink:title",
+              "xlink:type",
+              "xml:base",
+              "xmlns:xlink",
+              "xml:lang",
+              "xml:space"
+            ];
+
+            var SVGDOMPropertyConfig = {
+              Properties: {
+                autoReverse: HAS_STRING_BOOLEAN_VALUE$1,
+                externalResourcesRequired: HAS_STRING_BOOLEAN_VALUE$1,
+                preserveAlpha: HAS_STRING_BOOLEAN_VALUE$1
+              },
+              DOMAttributeNames: {
+                autoReverse: "autoReverse",
+                externalResourcesRequired: "externalResourcesRequired",
+                preserveAlpha: "preserveAlpha"
+              },
+              DOMAttributeNamespaces: {
+                xlinkActuate: NS.xlink,
+                xlinkArcrole: NS.xlink,
+                xlinkHref: NS.xlink,
+                xlinkRole: NS.xlink,
+                xlinkShow: NS.xlink,
+                xlinkTitle: NS.xlink,
+                xlinkType: NS.xlink,
+                xmlBase: NS.xml,
+                xmlLang: NS.xml,
+                xmlSpace: NS.xml
+              }
+            };
+
+            var CAMELIZE = /[\-\:]([a-z])/g;
+            var capitalize = function(token) {
+              return token[1].toUpperCase();
+            };
+
+            ATTRS.forEach(function(original) {
+              var reactName = original.replace(CAMELIZE, capitalize);
+
+              SVGDOMPropertyConfig.Properties[reactName] = 0;
+              SVGDOMPropertyConfig.DOMAttributeNames[reactName] = original;
+            });
+
+            injection.injectDOMPropertyConfig(HTMLDOMPropertyConfig);
+            injection.injectDOMPropertyConfig(SVGDOMPropertyConfig);
+
+            var ReactErrorUtils = {
+              // Used by Fiber to simulate a try-catch.
+              _caughtError: null,
+              _hasCaughtError: false,
+
+              // Used by event system to capture/rethrow the first error.
+              _rethrowError: null,
+              _hasRethrowError: false,
+
+              injection: {
+                injectErrorUtils: function(injectedErrorUtils) {
+                  !(
+                    typeof injectedErrorUtils.invokeGuardedCallback ===
+                    "function"
+                  )
+                    ? invariant(
+                        false,
+                        "Injected invokeGuardedCallback() must be a function."
+                      )
+                    : void 0;
+                  invokeGuardedCallback =
+                    injectedErrorUtils.invokeGuardedCallback;
+                }
+              },
+
+              /**
+               * Call a function while guarding against errors that happens within it.
+               * Returns an error if it throws, otherwise null.
+               *
+               * In production, this is implemented using a try-catch. The reason we don't
+               * use a try-catch directly is so that we can swap out a different
+               * implementation in DEV mode.
+               *
+               * @param {String} name of the guard to use for logging or debugging
+               * @param {Function} func The function to invoke
+               * @param {*} context The context to use when calling the function
+               * @param {...*} args Arguments for function
+               */
+              invokeGuardedCallback: function(
+                name,
+                func,
+                context,
+                a,
+                b,
+                c,
+                d,
+                e,
+                f
+              ) {
+                invokeGuardedCallback.apply(ReactErrorUtils, arguments);
+              },
+
+              /**
+               * Same as invokeGuardedCallback, but instead of returning an error, it stores
+               * it in a global so it can be rethrown by `rethrowCaughtError` later.
+               * TODO: See if _caughtError and _rethrowError can be unified.
+               *
+               * @param {String} name of the guard to use for logging or debugging
+               * @param {Function} func The function to invoke
+               * @param {*} context The context to use when calling the function
+               * @param {...*} args Arguments for function
+               */
+              invokeGuardedCallbackAndCatchFirstError: function(
+                name,
+                func,
+                context,
+                a,
+                b,
+                c,
+                d,
+                e,
+                f
+              ) {
+                ReactErrorUtils.invokeGuardedCallback.apply(this, arguments);
+                if (ReactErrorUtils.hasCaughtError()) {
+                  var error = ReactErrorUtils.clearCaughtError();
+                  if (!ReactErrorUtils._hasRethrowError) {
+                    ReactErrorUtils._hasRethrowError = true;