Bug 1586093 - Add engagement pref, join variant and bug fixes to New Tab Page r=k88hudson,fluent-reviewers,flod
authorEd Lee <edilee@mozilla.com>
Fri, 04 Oct 2019 17:06:01 +0000
changeset 496359 be0251572777e4e3498edc4c72d484d8547c4dd7
parent 496358 2a56f91a20b28a77a97a2c70592fcfce0c8bb4e2
child 496360 daec5df56be2cdde62c2e5d3c2e02e339fc5ff9a
push id36652
push userbtara@mozilla.com
push dateSat, 05 Oct 2019 09:47:12 +0000
treeherdermozilla-central@30154d163aca [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersk88hudson, fluent-reviewers, flod
bugs1586093
milestone71.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1586093 - Add engagement pref, join variant and bug fixes to New Tab Page r=k88hudson,fluent-reviewers,flod Differential Revision: https://phabricator.services.mozilla.com/D48110
browser/components/newtab/.eslintrc.js
browser/components/newtab/bin/render-activity-stream-html.js
browser/components/newtab/common/Actions.jsm
browser/components/newtab/common/Reducers.jsm
browser/components/newtab/content-src/asrouter/asrouter-content.jsx
browser/components/newtab/content-src/asrouter/components/ModalOverlay/ModalOverlay.jsx
browser/components/newtab/content-src/asrouter/components/ModalOverlay/_ModalOverlay.scss
browser/components/newtab/content-src/asrouter/docs/targeting-attributes.md
browser/components/newtab/content-src/asrouter/templates/FirstRun/Interrupt.jsx
browser/components/newtab/content-src/asrouter/templates/StartupOverlay/StartupOverlay.jsx
browser/components/newtab/content-src/asrouter/templates/StartupOverlay/_StartupOverlay.scss
browser/components/newtab/content-src/asrouter/templates/Trailhead/_Trailhead.scss
browser/components/newtab/content-src/components/DiscoveryStreamBase/DiscoveryStreamBase.jsx
browser/components/newtab/content-src/components/DiscoveryStreamComponents/CardGrid/CardGrid.jsx
browser/components/newtab/content-src/components/DiscoveryStreamComponents/DSCard/DSCard.jsx
browser/components/newtab/content-src/components/DiscoveryStreamComponents/DSContextFooter/DSContextFooter.jsx
browser/components/newtab/content-src/components/DiscoveryStreamComponents/DSLinkMenu/DSLinkMenu.jsx
browser/components/newtab/content-src/components/DiscoveryStreamComponents/DSPrivacyModal/DSPrivacyModal.jsx
browser/components/newtab/content-src/components/DiscoveryStreamComponents/DSPrivacyModal/_DSPrivacyModal.scss
browser/components/newtab/content-src/components/TopSites/TopSite.jsx
browser/components/newtab/content-src/lib/link-menu-options.js
browser/components/newtab/content-src/styles/_activity-stream.scss
browser/components/newtab/css/activity-stream-linux.css
browser/components/newtab/css/activity-stream-mac.css
browser/components/newtab/css/activity-stream-windows.css
browser/components/newtab/data/content/activity-stream.bundle.js
browser/components/newtab/data/content/assets/fox-tail.png
browser/components/newtab/data/content/assets/sync-devices.svg
browser/components/newtab/data/content/assets/trailhead/benefit-sync.png
browser/components/newtab/docs/v2-system-addon/data_dictionary.md
browser/components/newtab/docs/v2-system-addon/data_events.md
browser/components/newtab/lib/ASRouter.jsm
browser/components/newtab/lib/ASRouterTargeting.jsm
browser/components/newtab/lib/ActivityStream.jsm
browser/components/newtab/lib/OnboardingMessageProvider.jsm
browser/components/newtab/lib/ToolbarPanelHub.jsm
browser/components/newtab/locales-src/newtab.ftl
browser/components/newtab/locales-src/onboarding.ftl
browser/components/newtab/mochitest.sh
browser/components/newtab/prerendered/activity-stream-debug.html
browser/components/newtab/prerendered/activity-stream-noscripts.html
browser/components/newtab/prerendered/activity-stream.html
browser/components/newtab/test/browser/browser_aboutwelcome.js
browser/components/newtab/test/browser/browser_onboarding_rtamo.js
browser/components/newtab/test/schemas/pings.js
browser/components/newtab/test/unit/asrouter/ASRouter.test.js
browser/components/newtab/test/unit/asrouter/ASRouterTargeting.test.js
browser/components/newtab/test/unit/asrouter/ModalOverlay.test.jsx
browser/components/newtab/test/unit/asrouter/templates/Interrupt.test.jsx
browser/components/newtab/test/unit/common/Reducers.test.js
browser/components/newtab/test/unit/content-src/components/DiscoveryStreamComponents/DSContextFooter.test.jsx
browser/components/newtab/test/unit/content-src/components/DiscoveryStreamComponents/DSLinkMenu.test.jsx
browser/components/newtab/test/unit/content-src/components/DiscoveryStreamComponents/DSPrivacyModal.test.jsx
browser/components/newtab/test/unit/content-src/components/LinkMenu.test.jsx
browser/components/newtab/test/unit/content-src/components/StartupOverlay.test.jsx
browser/components/newtab/test/unit/content-src/components/TopSites.test.jsx
browser/components/newtab/test/unit/lib/ToolbarPanelHub.test.js
browser/locales/en-US/browser/newtab/newtab.ftl
browser/locales/en-US/browser/newtab/onboarding.ftl
--- a/browser/components/newtab/.eslintrc.js
+++ b/browser/components/newtab/.eslintrc.js
@@ -40,21 +40,21 @@ module.exports = {
   },
   "overrides": [
     {
       // These files use fluent-dom to insert content
       "files": [
         "content-src/asrouter/templates/OnboardingMessage/**",
         "content-src/asrouter/templates/FirstRun/**",
         "content-src/asrouter/templates/Trailhead/**",
-        "content-src/asrouter/templates/StartupOverlay/StartupOverlay.jsx",
         "content-src/components/TopSites/**",
         "content-src/components/MoreRecommendations/MoreRecommendations.jsx",
         "content-src/components/CollapsibleSection/CollapsibleSection.jsx",
-        "content-src/components/DiscoveryStreamComponents/DSEmptyState/DSEmptyState.jsx"
+        "content-src/components/DiscoveryStreamComponents/DSEmptyState/DSEmptyState.jsx",
+        "content-src/components/DiscoveryStreamComponents/DSPrivacyModal/DSPrivacyModal.jsx"
       ],
       "rules": {
         "jsx-a11y/anchor-has-content": 0,
         "jsx-a11y/heading-has-content": 0,
       }
     },
     {
       // Use a configuration that's more appropriate for JSMs
--- a/browser/components/newtab/bin/render-activity-stream-html.js
+++ b/browser/components/newtab/bin/render-activity-stream-html.js
@@ -50,16 +50,17 @@ function templateHTML(options) {
 
 <!doctype html>
 <html>
   <head>
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
     <title data-l10n-id="newtab-page-title"></title>
     <link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
+    <link rel="localization" href="branding/brand.ftl" />
     <link rel="localization" href="browser/branding/brandings.ftl" />
     <link rel="localization" href="browser/newtab/newtab.ftl" />
     <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
     <link rel="stylesheet" href="${options.baseUrl}css/activity-stream.css" />
   </head>
   <body class="activity-stream">
     <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"></div>
--- a/browser/components/newtab/common/Actions.jsm
+++ b/browser/components/newtab/common/Actions.jsm
@@ -60,16 +60,17 @@ for (const type of [
   "DISCOVERY_STREAM_SPOCS_PLACEMENTS",
   "DISCOVERY_STREAM_SPOCS_UPDATE",
   "DISCOVERY_STREAM_SPOC_BLOCKED",
   "DISCOVERY_STREAM_SPOC_IMPRESSION",
   "DOWNLOAD_CHANGED",
   "FAKE_FOCUS_SEARCH",
   "FILL_SEARCH_TERM",
   "HANDOFF_SEARCH_TO_AWESOMEBAR",
+  "HIDE_PRIVACY_INFO",
   "HIDE_SEARCH",
   "INIT",
   "NEW_TAB_INIT",
   "NEW_TAB_INITIAL_STATE",
   "NEW_TAB_LOAD",
   "NEW_TAB_REHYDRATED",
   "NEW_TAB_STATE_REQUEST",
   "NEW_TAB_UNLOAD",
@@ -107,16 +108,17 @@ for (const type of [
   "SECTION_REGISTER",
   "SECTION_UPDATE",
   "SECTION_UPDATE_CARD",
   "SETTINGS_CLOSE",
   "SETTINGS_OPEN",
   "SET_PREF",
   "SHOW_DOWNLOAD_FILE",
   "SHOW_FIREFOX_ACCOUNTS",
+  "SHOW_PRIVACY_INFO",
   "SHOW_SEARCH",
   "SKIPPED_SIGNIN",
   "SNIPPETS_BLOCKLIST_CLEARED",
   "SNIPPETS_BLOCKLIST_UPDATED",
   "SNIPPETS_DATA",
   "SNIPPETS_PREVIEW_MODE",
   "SNIPPETS_RESET",
   "SNIPPET_BLOCKED",
--- a/browser/components/newtab/common/Reducers.jsm
+++ b/browser/components/newtab/common/Reducers.jsm
@@ -51,16 +51,17 @@ const INITIAL_STATE = {
     waitingForSpoc: true,
   },
   // This is the new pocket configurable layout state.
   DiscoveryStream: {
     // This is a JSON-parsed copy of the discoverystream.config pref value.
     config: { enabled: false, layout_endpoint: "" },
     layout: [],
     lastUpdated: null,
+    isPrivacyInfoModalVisible: false,
     feeds: {
       data: {
         // "https://foo.com/feed1": {lastUpdated: 123, data: []}
       },
       loaded: false,
     },
     spocs: {
       spocs_endpoint: "",
@@ -577,16 +578,26 @@ function DiscoveryStream(prevState = INI
     case at.DISCOVERY_STREAM_CONFIG_SETUP:
       return { ...prevState, config: action.data || {} };
     case at.DISCOVERY_STREAM_LAYOUT_UPDATE:
       return {
         ...prevState,
         lastUpdated: action.data.lastUpdated || null,
         layout: action.data.layout || [],
       };
+    case at.HIDE_PRIVACY_INFO:
+      return {
+        ...prevState,
+        isPrivacyInfoModalVisible: false,
+      };
+    case at.SHOW_PRIVACY_INFO:
+      return {
+        ...prevState,
+        isPrivacyInfoModalVisible: true,
+      };
     case at.DISCOVERY_STREAM_LAYOUT_RESET:
       return { ...INITIAL_STATE.DiscoveryStream, config: prevState.config };
     case at.DISCOVERY_STREAM_FEEDS_UPDATE:
       return {
         ...prevState,
         feeds: {
           ...prevState.feeds,
           loaded: true,
--- a/browser/components/newtab/content-src/asrouter/asrouter-content.jsx
+++ b/browser/components/newtab/content-src/asrouter/asrouter-content.jsx
@@ -16,17 +16,16 @@ import React from "react";
 import ReactDOM from "react-dom";
 import { SnippetsTemplates } from "./templates/template-manifest";
 import { FirstRun } from "./templates/FirstRun/FirstRun";
 
 const INCOMING_MESSAGE_NAME = "ASRouter:parent-to-child";
 const OUTGOING_MESSAGE_NAME = "ASRouter:child-to-parent";
 const TEMPLATES_ABOVE_PAGE = [
   "trailhead",
-  "fxa_overlay",
   "return_to_amo_overlay",
   "extended_triplets",
 ];
 const FIRST_RUN_TEMPLATES = TEMPLATES_ABOVE_PAGE;
 const TEMPLATES_BELOW_SEARCH = ["simple_below_search_snippet"];
 
 export const ASRouterUtils = {
   addListener(listener) {
--- a/browser/components/newtab/content-src/asrouter/components/ModalOverlay/ModalOverlay.jsx
+++ b/browser/components/newtab/content-src/asrouter/components/ModalOverlay/ModalOverlay.jsx
@@ -5,16 +5,18 @@
 import React from "react";
 
 export class ModalOverlayWrapper extends React.PureComponent {
   constructor(props) {
     super(props);
     this.onKeyDown = this.onKeyDown.bind(this);
   }
 
+  // The intended behaviour is to listen for an escape key
+  // but not for a click; see Bug 1582242
   onKeyDown(event) {
     if (event.key === "Escape") {
       this.props.onClose(event);
     }
   }
 
   componentWillMount() {
     this.props.document.addEventListener("keydown", this.onKeyDown);
@@ -46,26 +48,30 @@ export class ModalOverlayWrapper extends
     let className = props.unstyled ? "" : "modalOverlayInner active";
     if (props.innerClassName) {
       className += ` ${props.innerClassName}`;
     }
     return (
       <React.Fragment>
         <div
           className="modalOverlayOuter active"
-          onClick={props.onClose}
           onKeyDown={this.onKeyDown}
           role="presentation"
         />
         <div
           className={className}
           aria-labelledby={props.headerId}
           id={props.id}
           role="dialog"
         >
+          <button
+            className="icon icon-dismiss"
+            onClick={props.onClose}
+            data-l10n-id="onboarding-cards-dismiss"
+          />
           {props.children}
         </div>
       </React.Fragment>
     );
   }
 }
 
 ModalOverlayWrapper.defaultProps = { document: global.document };
--- a/browser/components/newtab/content-src/asrouter/components/ModalOverlay/_ModalOverlay.scss
+++ b/browser/components/newtab/content-src/asrouter/components/ModalOverlay/_ModalOverlay.scss
@@ -32,17 +32,17 @@
   padding-top: 80px;
 }
 
 .modalOverlayInner {
   width: 960px;
   position: fixed;
   top: 15%;
   left: calc(50% - 480px); // halfway across minus half the width of the modal
-  background: $white;
+  background: var(--newtab-modal-color);
   box-shadow: 0 1px 15px 0 $black-30;
   border-radius: 4px;
   display: none;
   z-index: 1101;
 
   // modal takes over entire screen
   @media(max-width: 960px) {
     width: 100%;
@@ -57,16 +57,29 @@
   @media(max-height: 730px) {
     top: 5%;
   }
 
   &.active {
     display: block;
   }
 
+  .icon-dismiss {
+    border: 0;
+    cursor: pointer;
+    inset-inline-end: 0;
+    padding: 20px;
+    fill: $white;
+    position: absolute;
+
+    &:focus {
+      border: 1px dotted;
+    }
+  }
+
   h2 {
     color: $grey-60;
     text-align: center;
     font-weight: 200;
     margin-top: 30px;
     font-size: 28px;
     line-height: 37px;
     letter-spacing: -0.13px;
--- a/browser/components/newtab/content-src/asrouter/docs/targeting-attributes.md
+++ b/browser/components/newtab/content-src/asrouter/docs/targeting-attributes.md
@@ -31,17 +31,16 @@ Please note that some targeting attribut
 * [trailheadInterrupt](#trailheadinterrupt)
 * [trailheadTriplet](#trailheadtriplet)
 * [usesFirefoxSync](#usesfirefoxsync)
 * [isFxAEnabled](#isFxAEnabled)
 * [xpinstallEnabled](#xpinstallEnabled)
 * [hasPinnedTabs](#haspinnedtabs)
 * [hasAccessedFxAPanel](#hasaccessedfxapanel)
 * [isWhatsNewPanelEnabled](#iswhatsnewpanelenabled)
-* [earliestFirefoxVersion](#earliestfirefoxversion)
 * [isFxABadgeEnabled](#isfxabadgeenabled)
 * [totalBlockedCount](#totalblockedcount)
 * [recentBookmarks](#recentbookmarks)
 * [userPrefs](#userprefs)
 
 ## Detailed usage
 
 ### `addonsInfo`
@@ -497,26 +496,16 @@ declare const hasAccessedFxAPanel: boole
 Boolean pref that controls if the What's New panel feature is enabled
 
 #### Definition
 
 ```ts
 declare const isWhatsNewPanelEnabled: boolean;
 ```
 
-### `earliestFirefoxVersion`
-
-Integer value of the first Firefox version the profile ran on
-
-#### Definition
-
-```ts
-declare const earliestFirefoxVersion: boolean;
-```
-
 ### `isFxABadgeEnabled`
 
 Boolean pref that controls if the FxA toolbar button is badged by Messaging System.
 
 #### Definition
 
 ```ts
 declare const isFxABadgeEnabled: boolean;
--- a/browser/components/newtab/content-src/asrouter/templates/FirstRun/Interrupt.jsx
+++ b/browser/components/newtab/content-src/asrouter/templates/FirstRun/Interrupt.jsx
@@ -1,16 +1,15 @@
 /* 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/. */
 
 import React from "react";
 import { Trailhead } from "../Trailhead/Trailhead";
 import { ReturnToAMO } from "../ReturnToAMO/ReturnToAMO";
-import { StartupOverlay } from "../StartupOverlay/StartupOverlay";
 import { LocalizationProvider } from "fluent-react";
 import { generateBundles } from "../../rich-text-strings";
 
 export class Interrupt extends React.PureComponent {
   render() {
     const {
       onDismiss,
       onNextScene,
@@ -34,25 +33,16 @@ export class Interrupt extends React.Pur
               document={this.props.document}
               UISurface="NEWTAB_OVERLAY"
               onBlock={onDismiss}
               onAction={executeAction}
               sendUserActionTelemetry={sendUserActionTelemetry}
             />
           </LocalizationProvider>
         );
-      case "fxa_overlay":
-        return (
-          <StartupOverlay
-            document={this.props.document}
-            onBlock={onDismiss}
-            dispatch={dispatch}
-            fxa_endpoint={fxaEndpoint}
-          />
-        );
       case "trailhead":
         return (
           <Trailhead
             document={this.props.document}
             message={message}
             onNextScene={onNextScene}
             onAction={executeAction}
             sendUserActionTelemetry={sendUserActionTelemetry}
deleted file mode 100644
--- a/browser/components/newtab/content-src/asrouter/templates/StartupOverlay/StartupOverlay.jsx
+++ /dev/null
@@ -1,228 +0,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/. */
-
-import { actionCreators as ac } from "common/Actions.jsm";
-import React from "react";
-
-export class StartupOverlay extends React.PureComponent {
-  constructor(props) {
-    super(props);
-    this.onInputChange = this.onInputChange.bind(this);
-    this.onSubmit = this.onSubmit.bind(this);
-    this.clickSkip = this.clickSkip.bind(this);
-    this.removeOverlay = this.removeOverlay.bind(this);
-    this.onInputInvalid = this.onInputInvalid.bind(this);
-
-    this.utmParams =
-      "utm_source=activity-stream&utm_campaign=firstrun&utm_medium=referral&utm_term=trailhead-control";
-
-    this.state = {
-      show: false,
-      emailInput: "",
-    };
-  }
-
-  componentWillMount() {
-    global.document.body.classList.add("fxa");
-  }
-
-  componentDidMount() {
-    // Timeout to allow the scene to render once before attaching the attribute
-    // to trigger the animation.
-    setTimeout(() => {
-      this.setState({ show: true });
-    }, 10);
-    // Hide the page content from screen readers while the modal is open
-    this.props.document
-      .getElementById("root")
-      .setAttribute("aria-hidden", "true");
-  }
-
-  removeOverlay() {
-    window.removeEventListener("visibilitychange", this.removeOverlay);
-    document.body.classList.remove("hide-main", "fxa");
-    this.setState({ show: false });
-    // Re-enable the document for screen readers
-    this.props.document
-      .getElementById("root")
-      .setAttribute("aria-hidden", "false");
-
-    setTimeout(() => {
-      // Allow scrolling and fully remove overlay after animation finishes.
-      this.props.onBlock();
-      document.body.classList.remove("welcome");
-    }, 400);
-  }
-
-  onInputChange(e) {
-    let error = e.target.previousSibling;
-    this.setState({ emailInput: e.target.value });
-    error.classList.remove("active");
-    e.target.classList.remove("invalid");
-  }
-
-  onSubmit() {
-    this.props.dispatch(
-      ac.UserEvent({ event: "SUBMIT_EMAIL", ...this._getFormInfo() })
-    );
-
-    window.addEventListener("visibilitychange", this.removeOverlay);
-  }
-
-  clickSkip() {
-    this.props.dispatch(
-      ac.UserEvent({ event: "SKIPPED_SIGNIN", ...this._getFormInfo() })
-    );
-    this.removeOverlay();
-  }
-
-  /**
-   * Report to telemetry additional information about the form submission.
-   */
-  _getFormInfo() {
-    const value = {
-      has_flow_params: !!this.props.flowParams.flowId.length,
-    };
-    return { value };
-  }
-
-  onInputInvalid(e) {
-    let error = e.target.previousSibling;
-    error.classList.add("active");
-    e.target.classList.add("invalid");
-    e.preventDefault(); // Override built-in form validation popup
-    e.target.focus();
-  }
-
-  render() {
-    return (
-      <div className={`overlay-wrapper ${this.state.show ? "show" : ""}`}>
-        <div className="background" />
-        <div className="firstrun-scene">
-          <div className="fxaccounts-container">
-            <div className="firstrun-left-divider">
-              <h1
-                className="firstrun-title"
-                data-l10n-id="onboarding-sync-welcome-header"
-              />
-              <p
-                className="firstrun-content"
-                data-l10n-id="onboarding-sync-welcome-content"
-              />
-              <a
-                className="firstrun-link"
-                href={`https://www.mozilla.org/firefox/features/sync/?${
-                  this.utmParams
-                }`}
-                target="_blank"
-                rel="noopener noreferrer"
-                data-l10n-id="onboarding-sync-welcome-learn-more-link"
-              />
-            </div>
-            <div className="firstrun-sign-in">
-              <p className="form-header">
-                <span data-l10n-id="onboarding-sync-form-header" />
-                <span
-                  className="sub-header"
-                  data-l10n-id="onboarding-sync-form-sub-header"
-                />
-              </p>
-              <form
-                method="get"
-                action={this.props.fxa_endpoint}
-                target="_blank"
-                rel="noopener noreferrer"
-                onSubmit={this.onSubmit}
-              >
-                <input name="service" type="hidden" value="sync" />
-                <input name="action" type="hidden" value="email" />
-                <input name="context" type="hidden" value="fx_desktop_v3" />
-                <input
-                  name="entrypoint"
-                  type="hidden"
-                  value="activity-stream-firstrun"
-                />
-                <input
-                  name="utm_source"
-                  type="hidden"
-                  value="activity-stream"
-                />
-                <input name="utm_campaign" type="hidden" value="firstrun" />
-                <input name="utm_medium" type="hidden" value="referral" />
-                <input
-                  name="utm_term"
-                  type="hidden"
-                  value="trailhead-control"
-                />
-                <input
-                  name="device_id"
-                  type="hidden"
-                  value={this.props.flowParams.deviceId}
-                />
-                <input
-                  name="flow_id"
-                  type="hidden"
-                  value={this.props.flowParams.flowId}
-                />
-                <input
-                  name="flow_begin_time"
-                  type="hidden"
-                  value={this.props.flowParams.flowBeginTime}
-                />
-                <span
-                  className="error"
-                  data-l10n-id="onboarding-sync-form-invalid-input"
-                />
-                <input
-                  className="email-input"
-                  name="email"
-                  type="email"
-                  required={true}
-                  onInvalid={this.onInputInvalid}
-                  onChange={this.onInputChange}
-                  data-l10n-id="onboarding-sync-form-input"
-                />
-                <div className="extra-links">
-                  <p data-l10n-id="onboarding-sync-legal-notice">
-                    <a
-                      data-l10n-name="terms"
-                      target="_blank"
-                      rel="noopener noreferrer"
-                      href={`${this.props.fxa_endpoint}/legal/terms?${
-                        this.utmParams
-                      }`}
-                    />
-                    <a
-                      data-l10n-name="privacy"
-                      target="_blank"
-                      rel="noopener noreferrer"
-                      href={`${this.props.fxa_endpoint}/legal/privacy?${
-                        this.utmParams
-                      }`}
-                    />
-                  </p>
-                </div>
-                <button
-                  className="continue-button"
-                  type="submit"
-                  data-l10n-id="onboarding-sync-form-continue-button"
-                />
-              </form>
-              <button
-                className="skip-button"
-                disabled={!!this.state.emailInput}
-                onClick={this.clickSkip}
-                data-l10n-id="onboarding-sync-form-skip-login-button"
-              />
-            </div>
-          </div>
-        </div>
-      </div>
-    );
-  }
-}
-
-StartupOverlay.defaultProps = {
-  flowParams: { deviceId: "", flowId: "", flowBeginTime: "" },
-};
deleted file mode 100644
--- a/browser/components/newtab/content-src/asrouter/templates/StartupOverlay/_StartupOverlay.scss
+++ /dev/null
@@ -1,343 +0,0 @@
-.activity-stream {
-  &.welcome {
-    overflow: hidden;
-  }
-
-  &:not(.welcome) {
-    .overlay-wrapper {
-      display: none;
-    }
-  }
-}
-
-.overlay-wrapper {
-  position: absolute;
-  top: 0;
-  left: 0;
-  width: 100vw;
-  height: 100vh;
-  z-index: 21000;
-  transition: opacity 0.4s;
-  opacity: 0;
-  overflow-x: auto;
-
-  &.show {
-    transition: none;
-    opacity: 1;
-
-    .firstrun-sign-in {
-      transition: opacity 1.5s, transform 1.5s;
-      transition-delay: 0.2s;
-      transform: translateY(-50%) scale(1);
-      opacity: 1;
-
-      @media screen and (max-width: 790px) {
-        float: none;
-        margin: auto;
-        top: 190px;
-        margin-bottom: 100px;
-      }
-    }
-
-    .firstrun-firefox-logo {
-      transition: opacity 2.3s;
-      opacity: 1;
-    }
-
-    .firstrun-title,
-    .firstrun-content,
-    .firstrun-link {
-      transition: transform 0.5s, opacity 0.8s;
-      transform: translateY(0);
-      opacity: 1;
-    }
-
-    .firstrun-title {
-      transition-delay: 0.2s;
-    }
-
-    .firstrun-content {
-      transition-delay: 0.4s;
-    }
-
-    .firstrun-link {
-      transition-delay: 0.6s;
-    }
-
-    .fxaccounts-container {
-      transition: none;
-      opacity: 1;
-    }
-  }
-}
-
-.background,
-.fxa + body.hide-main { // sass-lint:disable-line no-qualifying-elements
-  width: 100%;
-  height: 100%;
-  display: block;
-  background-image: url('#{$image-path}fox-tail.png'), $about-welcome-gradient;
-  background-position-x: center;
-  background-position-y: -200px, top;
-  background-repeat: no-repeat;
-  background-size: cover;
-  position: fixed;
-}
-
-.firstrun-sign-in {
-  transform: translateY(-50%) scale(0.8);
-  position: relative;
-  top: 50%;
-  width: 358px;
-  opacity: 0;
-  background-color: $white;
-  float: inline-end;
-  color: $grey-90;
-  text-align: center;
-  padding: 10px;
-
-  form {
-    position: relative;
-  }
-
-  .extra-links {
-    font-size: 12px;
-    max-width: 340px;
-    margin: 17px 50px;
-    color: $about-welcome-extra-links;
-    cursor: default;
-
-    a {
-      color: $grey-50;
-      cursor: pointer;
-      text-decoration: underline;
-    }
-
-    a:hover,
-    a:active,
-    a:focus {
-      color: $blue-50;
-    }
-  }
-
-  .email-input {
-    box-shadow: none;
-    margin: auto;
-    width: 244px;
-    display: block;
-    height: 40px;
-    padding-inline-start: 20px;
-    border: 1px solid $grey-50;
-    border-radius: 2px;
-    font-size: 16px;
-    transition: border-color 150ms, box-shadow 150ms;
-
-    &:hover {
-      border-color: $grey-90;
-    }
-
-    &:focus {
-      border-color: $blue-50;
-      box-shadow: 0 0 0 3px $email-input-focus;
-    }
-
-    &.invalid {
-      border-color: $red-60;
-    }
-
-    &.invalid:focus {
-      box-shadow: 0 0 0 3px $email-input-invalid;
-    }
-  }
-
-  .form-header {
-    font-size: 22px;
-    margin: 15px auto;
-  }
-
-  .form-header .sub-header {
-    font-size: 14px;
-    margin-top: 4px;
-    display: block;
-  }
-
-  button {
-    display: block;
-    cursor: pointer;
-    margin: 10px auto 0;
-  }
-
-  .continue-button {
-    font-size: 18px;
-    height: 43px;
-    width: 250px;
-    padding: 8px 0;
-    border: 0;
-    border-radius: 4px;
-    color: $white;
-    background-color: $blue-60;
-    transition: background-color 150ms;
-
-    &:not([disabled]):active,
-    &:not([disabled]):hover {
-      background: $blue-70;
-      border-color: $blue-80;
-    }
-  }
-
-  .skip-button {
-    font-size: 13px;
-    margin-top: 20px;
-    margin-bottom: 20px;
-    background-color: $grey-10;
-    color: $blue-50;
-    border: 1px solid $blue-50;
-    border-radius: 2px;
-    min-height: 24px;
-    padding: 5px 10px;
-    transition: background-color 150ms, color 150ms, border-color 150ms;
-
-    &[disabled] {
-      background-color: $grey-20;
-      border-color: $grey-40;
-      color: $grey-50;
-      cursor: default;
-      opacity: 0.5;
-    }
-
-    &:not([disabled]):hover {
-      background-color: $blue-50;
-      border-color: $blue-60;
-      color: $white;
-    }
-  }
-}
-
-.firstrun-left-divider {
-  position: relative;
-  float: inline-start;
-  clear: both;
-  width: 435px;
-
-  @media screen and (max-width: 825px) {
-    width: 400px;
-  }
-
-  @media screen and (max-width: 790px) {
-    margin: auto;
-    float: none;
-    width: 352px;
-    text-align: center;
-  }
-}
-
-.firstrun-content {
-  line-height: 1.5;
-  margin-bottom: 48px;
-  max-width: 352px;
-  background: url('#{$image-path}sync-devices.svg') bottom center no-repeat;
-  padding-bottom: 210px;
-}
-
-a.firstrun-link { // sass-lint:disable-line no-qualifying-elements
-  color: $white;
-  display: block;
-  text-decoration: underline;
-
-  &:hover,
-  &:active,
-  &:focus {
-    color: $white;
-  }
-}
-
-.firstrun-title {
-  background: url('chrome://branding/content/about-logo.png') top left no-repeat;
-  background-size: 90px 90px;
-  margin: 40px 0 10px;
-  padding-top: 110px;
-
-  @media screen and (max-width: 790px) {
-    background: url('chrome://branding/content/about-logo.png') top center no-repeat;
-    background-size: 90px 90px;
-  }
-
-  &:dir(rtl) {
-    background-position: top right;
-  }
-}
-
-.fxaccounts-container {
-  position: absolute;
-  bottom: 0;
-  right: 0;
-  top: 0;
-  left: 0;
-  color: $white;
-  height: 515px;
-  margin: auto;
-  width: 819px;
-  z-index: 10;
-  transition: opacity 0.3s;
-  opacity: 0;
-
-  @media screen and (max-width: 825px) {
-    width: 784px;
-  }
-
-  @media screen and (max-width: 790px) {
-    width: auto;
-    height: 100%;
-  }
-}
-
-.firstrun-title,
-.firstrun-content,
-.firstrun-link {
-  opacity: 0;
-  transform: translateY(-5px);
-}
-
-.error {
-  display: none;
-}
-
-.error.active {
-  display: block;
-  padding: 5px 12px;
-  animation: fade-down 450ms;
-  font-size: 12px;
-  font-weight: 500;
-  color: $white;
-  background-color: $red-60;
-  position: absolute;
-  inset-inline-start: 50px;
-  top: -28px;
-  border-radius: 2px;
-
-  &::before {
-    inset-inline-start: 12px;
-    background: $red-60;
-    bottom: -8px;
-    content: '.';
-    height: 16px;
-    position: absolute;
-    text-indent: -999px;
-    transform: rotate(45deg);
-    white-space: nowrap;
-    width: 16px;
-    z-index: -1;
-  }
-}
-
-@keyframes fade-down {
-  0% {
-    opacity: 0;
-    transform: translateY(-15px);
-  }
-
-  100% {
-    opacity: 1;
-    transform: translateY(0);
-  }
-}
--- a/browser/components/newtab/content-src/asrouter/templates/Trailhead/_Trailhead.scss
+++ b/browser/components/newtab/content-src/asrouter/templates/Trailhead/_Trailhead.scss
@@ -95,27 +95,33 @@
         margin-inline-end: 60px;
         padding-inline-start: $benefit-icon-spacing;
       }
 
       &:dir(rtl) {
         background-position-x: right;
       }
 
-      &.knowledge {
+      &.knowledge,
+      &.monitor {
         background-image: url('#{$image-path}trailhead/benefit-knowledge.png');
       }
 
+      &.lockwise,
       &.privacy {
         background-image: url('#{$image-path}trailhead/benefit-privacy.png');
       }
 
       &.products {
         background-image: url('#{$image-path}trailhead/benefit-products.png');
       }
+
+      &.sync {
+        background-image: url('#{$image-path}trailhead/benefit-sync.png');
+      }
     }
 
     h2 {
       text-align: start;
       line-height: inherit;
       color: $violet-20;
       font-size: 22px;
       font-weight: 400;
@@ -401,16 +407,20 @@
     position: absolute;
     bottom: 16px;
     left: 0;
     width: 100%;
     text-align: center;
   }
 }
 
+.activity-stream.welcome {
+  overflow: hidden;
+}
+
 .inline-onboarding {
   &.activity-stream.welcome {
     overflow-y: hidden;
   }
 
   .modalOverlayInner {
     position: absolute;
   }
@@ -425,8 +435,68 @@
       }
     }
   }
 
   .asrouter-toggle {
     position: absolute;
   }
 }
+
+.error {
+  display: none;
+}
+
+.error.active {
+  display: block;
+  padding: 5px 12px;
+  animation: fade-down 450ms;
+  font-size: 12px;
+  font-weight: 500;
+  color: $white;
+  background-color: $red-60;
+  position: absolute;
+  inset-inline-start: 50px;
+  top: -28px;
+  border-radius: 2px;
+
+  &::before {
+    inset-inline-start: 12px;
+    background: $red-60;
+    bottom: -8px;
+    content: '.';
+    height: 16px;
+    position: absolute;
+    text-indent: -999px;
+    transform: rotate(45deg);
+    white-space: nowrap;
+    width: 16px;
+    z-index: -1;
+  }
+}
+
+@keyframes fade-down {
+  0% {
+    opacity: 0;
+    transform: translateY(-15px);
+  }
+
+  100% {
+    opacity: 1;
+    transform: translateY(0);
+  }
+}
+
+.firstrun-title {
+  background: url('chrome://branding/content/about-logo.png') top left no-repeat;
+  background-size: 90px 90px;
+  margin: 40px 0 10px;
+  padding-top: 110px;
+
+  @media screen and (max-width: 790px) {
+    background: url('chrome://branding/content/about-logo.png') top center no-repeat;
+    background-size: 90px 90px;
+  }
+
+  &:dir(rtl) {
+    background-position: top right;
+  }
+}
--- a/browser/components/newtab/content-src/components/DiscoveryStreamBase/DiscoveryStreamBase.jsx
+++ b/browser/components/newtab/content-src/components/DiscoveryStreamBase/DiscoveryStreamBase.jsx
@@ -3,16 +3,17 @@
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 import { actionCreators as ac } from "common/Actions.jsm";
 import { CardGrid } from "content-src/components/DiscoveryStreamComponents/CardGrid/CardGrid";
 import { CollapsibleSection } from "content-src/components/CollapsibleSection/CollapsibleSection";
 import { connect } from "react-redux";
 import { DSDismiss } from "content-src/components/DiscoveryStreamComponents/DSDismiss/DSDismiss";
 import { DSMessage } from "content-src/components/DiscoveryStreamComponents/DSMessage/DSMessage";
+import { DSPrivacyModal } from "content-src/components/DiscoveryStreamComponents/DSPrivacyModal/DSPrivacyModal";
 import { DSTextPromo } from "content-src/components/DiscoveryStreamComponents/DSTextPromo/DSTextPromo";
 import { Hero } from "content-src/components/DiscoveryStreamComponents/Hero/Hero";
 import { Highlights } from "content-src/components/DiscoveryStreamComponents/Highlights/Highlights";
 import { HorizontalRule } from "content-src/components/DiscoveryStreamComponents/HorizontalRule/HorizontalRule";
 import { List } from "content-src/components/DiscoveryStreamComponents/List/List";
 import { Navigation } from "content-src/components/DiscoveryStreamComponents/Navigation/Navigation";
 import React from "react";
 import { SectionTitle } from "content-src/components/DiscoveryStreamComponents/SectionTitle/SectionTitle";
@@ -106,16 +107,20 @@ export class _DiscoveryStreamBase extend
             console.error(`Bad CSS selector ${selectors}`); // eslint-disable-line no-console
           }
         });
       });
     });
   }
 
   renderComponent(component, embedWidth) {
+    const ENGAGEMENT_LABEL_ENABLED = this.props.Prefs.values[
+      `discoverystream.engagementLabelEnabled`
+    ];
+
     switch (component.type) {
       case "Highlights":
         return <Highlights />;
       case "TopSites":
         let promoAlignment;
         if (
           component.spocs &&
           component.spocs.positions &&
@@ -208,16 +213,17 @@ export class _DiscoveryStreamBase extend
             title={component.header && component.header.title}
             data={component.data}
             feed={component.feed}
             border={component.properties.border}
             type={component.type}
             dispatch={this.props.dispatch}
             items={component.properties.items}
             cta_variant={component.cta_variant}
+            display_engagement_labels={ENGAGEMENT_LABEL_ENABLED}
           />
         );
       case "Hero":
         return (
           <Hero
             subComponentType={embedWidth >= 9 ? `cards` : `list`}
             feed={component.feed}
             title={component.header && component.header.title}
@@ -323,16 +329,19 @@ export class _DiscoveryStreamBase extend
         link_url: topStories.learnMore.link.href,
         title: topStories.title,
       },
     };
 
     // Render a DS-style TopSites then the rest if any in a collapsible section
     return (
       <React.Fragment>
+        {this.props.DiscoveryStream.isPrivacyInfoModalVisible && (
+          <DSPrivacyModal dispatch={this.props.dispatch} />
+        )}
         {topSites &&
           this.renderLayout([
             {
               width: 12,
               components: [topSites],
             },
           ])}
         {!!layoutRender.length && (
--- a/browser/components/newtab/content-src/components/DiscoveryStreamComponents/CardGrid/CardGrid.jsx
+++ b/browser/components/newtab/content-src/components/DiscoveryStreamComponents/CardGrid/CardGrid.jsx
@@ -32,16 +32,17 @@ export class CardGrid extends React.Pure
             context={rec.context}
             sponsor={rec.sponsor}
             dispatch={this.props.dispatch}
             source={rec.domain}
             pocket_id={rec.pocket_id}
             context_type={rec.context_type}
             bookmarkGuid={rec.bookmarkGuid}
             engagement={rec.engagement}
+            display_engagement_labels={this.props.display_engagement_labels}
             cta={rec.cta}
             cta_variant={this.props.cta_variant}
           />
         )
       );
     }
 
     let divisibility = ``;
--- a/browser/components/newtab/content-src/components/DiscoveryStreamComponents/DSCard/DSCard.jsx
+++ b/browser/components/newtab/content-src/components/DiscoveryStreamComponents/DSCard/DSCard.jsx
@@ -7,16 +7,17 @@ import { DSImage } from "../DSImage/DSIm
 import { DSLinkMenu } from "../DSLinkMenu/DSLinkMenu";
 import { ImpressionStats } from "../../DiscoveryStreamImpressionStats/ImpressionStats";
 import React from "react";
 import { SafeAnchor } from "../SafeAnchor/SafeAnchor";
 import { DSContextFooter } from "../DSContextFooter/DSContextFooter.jsx";
 
 // Default Meta that displays CTA as link if cta_variant in layout is set as "link"
 export const DefaultMeta = ({
+  display_engagement_labels,
   source,
   title,
   excerpt,
   context,
   context_type,
   cta,
   engagement,
   cta_variant,
@@ -30,22 +31,24 @@ export const DefaultMeta = ({
         <div role="link" className="cta-link icon icon-arrow" tabIndex="0">
           {cta}
         </div>
       )}
     </div>
     <DSContextFooter
       context_type={context_type}
       context={context}
+      display_engagement_labels={display_engagement_labels}
       engagement={engagement}
     />
   </div>
 );
 
 export const CTAButtonMeta = ({
+  display_engagement_labels,
   source,
   title,
   excerpt,
   context,
   context_type,
   cta,
   engagement,
   sponsor,
@@ -59,16 +62,17 @@ export const CTAButtonMeta = ({
       <header className="title clamp">{title}</header>
       {excerpt && <p className="excerpt clamp">{excerpt}</p>}
     </div>
     {context && cta && <button className="button cta-button">{cta}</button>}
     {!context && (
       <DSContextFooter
         context_type={context_type}
         context={context}
+        display_engagement_labels={display_engagement_labels}
         engagement={engagement}
       />
     )}
   </div>
 );
 
 export class DSCard extends React.PureComponent {
   constructor(props) {
@@ -180,27 +184,29 @@ export class DSCard extends React.PureCo
             <DSImage
               extraClassNames="img"
               source={this.props.image_src}
               rawSource={this.props.raw_image_src}
             />
           </div>
           {isButtonCTA ? (
             <CTAButtonMeta
+              display_engagement_labels={this.props.display_engagement_labels}
               source={this.props.source}
               title={this.props.title}
               excerpt={this.props.excerpt}
               context={this.props.context}
               context_type={this.props.context_type}
               engagement={this.props.engagement}
               cta={this.props.cta}
               sponsor={this.props.sponsor}
             />
           ) : (
             <DefaultMeta
+              display_engagement_labels={this.props.display_engagement_labels}
               source={this.props.source}
               title={this.props.title}
               excerpt={this.props.excerpt}
               context={this.props.context}
               engagement={this.props.engagement}
               context_type={this.props.context_type}
               cta={this.props.cta}
               cta_variant={this.props.cta_variant}
--- a/browser/components/newtab/content-src/components/DiscoveryStreamComponents/DSContextFooter/DSContextFooter.jsx
+++ b/browser/components/newtab/content-src/components/DiscoveryStreamComponents/DSContextFooter/DSContextFooter.jsx
@@ -16,33 +16,40 @@ export const StatusMessage = ({ icon, fl
       className={`story-badge-icon icon icon-${icon}`}
     />
     <div className="story-context-label" data-l10n-id={fluentID} />
   </div>
 );
 
 export class DSContextFooter extends React.PureComponent {
   render() {
-    const { context, context_type, engagement } = this.props;
+    // display_engagement_labels is based on pref `browser.newtabpage.activity-stream.discoverystream.engagementLabelEnabled`
+    const {
+      context,
+      context_type,
+      engagement,
+      display_engagement_labels,
+    } = this.props;
     const { icon, fluentID } = cardContextTypes[context_type] || {};
 
     return (
       <div className="story-footer">
         {context && <p className="story-sponsored-label clamp">{context}</p>}
         <TransitionGroup component={null}>
-          {!context && (context_type || engagement) && (
-            <CSSTransition
-              key={fluentID}
-              timeout={ANIMATION_DURATION}
-              classNames="story-animate"
-            >
-              {engagement && !context_type ? (
-                <div className="story-view-count">{engagement}</div>
-              ) : (
-                <StatusMessage icon={icon} fluentID={fluentID} />
-              )}
-            </CSSTransition>
-          )}
+          {!context &&
+            (context_type || (display_engagement_labels && engagement)) && (
+              <CSSTransition
+                key={fluentID}
+                timeout={ANIMATION_DURATION}
+                classNames="story-animate"
+              >
+                {engagement && !context_type ? (
+                  <div className="story-view-count">{engagement}</div>
+                ) : (
+                  <StatusMessage icon={icon} fluentID={fluentID} />
+                )}
+              </CSSTransition>
+            )}
         </TransitionGroup>
       </div>
     );
   }
 }
--- a/browser/components/newtab/content-src/components/DiscoveryStreamComponents/DSLinkMenu/DSLinkMenu.jsx
+++ b/browser/components/newtab/content-src/components/DiscoveryStreamComponents/DSLinkMenu/DSLinkMenu.jsx
@@ -35,16 +35,17 @@ export class DSLinkMenu extends React.Pu
       dsLinkMenuHostDiv.parentElement.classList.add("last-item");
     }
     dsLinkMenuHostDiv.parentElement.classList.add("active");
   }
 
   render() {
     const { index, dispatch } = this.props;
     const TOP_STORIES_CONTEXT_MENU_OPTIONS = [
+      "ShowPrivacyInfo",
       "CheckBookmarkOrArchive",
       "CheckSavedToPocket",
       "Separator",
       "OpenInNewWindow",
       "OpenInPrivateWindow",
       "Separator",
       "BlockUrl",
     ];
new file mode 100644
--- /dev/null
+++ b/browser/components/newtab/content-src/components/DiscoveryStreamComponents/DSPrivacyModal/DSPrivacyModal.jsx
@@ -0,0 +1,46 @@
+/* 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/. */
+
+import React from "react";
+import { SafeAnchor } from "../SafeAnchor/SafeAnchor";
+import { ModalOverlayWrapper } from "content-src/asrouter/components/ModalOverlay/ModalOverlay";
+
+export class DSPrivacyModal extends React.PureComponent {
+  constructor(props) {
+    super(props);
+    this.closeModal = this.closeModal.bind(this);
+  }
+
+  closeModal() {
+    this.props.dispatch({
+      type: `HIDE_PRIVACY_INFO`,
+      data: {},
+    });
+  }
+
+  render() {
+    return (
+      <ModalOverlayWrapper
+        onClose={this.closeModal}
+        innerClassName="ds-privacy-modal"
+      >
+        <div className="privacy-notice">
+          <h3 data-l10n-id="newtab-privacy-modal-header" />
+          <p data-l10n-id="newtab-privacy-modal-paragraph" />
+          <SafeAnchor url="https://www.mozilla.org/en-US/privacy/firefox/">
+            <span data-l10n-id="newtab-privacy-modal-link" />
+          </SafeAnchor>
+        </div>
+        <section className="actions">
+          <button
+            className="done"
+            type="submit"
+            onClick={this.closeModal}
+            data-l10n-id="newtab-privacy-modal-button-done"
+          />
+        </section>
+      </ModalOverlayWrapper>
+    );
+  }
+}
new file mode 100644
--- /dev/null
+++ b/browser/components/newtab/content-src/components/DiscoveryStreamComponents/DSPrivacyModal/_DSPrivacyModal.scss
@@ -0,0 +1,7 @@
+.ds-privacy-modal {
+  .privacy-notice {
+    width: 492px;
+    padding: 40px 0;
+    margin: auto;
+  }
+}
--- a/browser/components/newtab/content-src/components/TopSites/TopSite.jsx
+++ b/browser/components/newtab/content-src/components/TopSites/TopSite.jsx
@@ -311,16 +311,19 @@ export class TopSite extends React.PureC
     if (this.props.link.isPinned) {
       value.card_type = "pinned";
     }
     if (this.props.link.searchTopSite) {
       // Set the card_type as "search" regardless of its pinning status
       value.card_type = "search";
       value.search_vendor = this.props.link.hostname;
     }
+    if (this.props.link.type === SPOC_TYPE) {
+      value.card_type = "spoc";
+    }
     return { value };
   }
 
   userEvent(event) {
     this.props.dispatch(
       ac.UserEvent(
         Object.assign(
           {
--- a/browser/components/newtab/content-src/lib/link-menu-options.js
+++ b/browser/components/newtab/content-src/lib/link-menu-options.js
@@ -17,16 +17,23 @@ const _OpenInPrivateWindow = site => ({
 /**
  * List of functions that return items that can be included as menu options in a
  * LinkMenu. All functions take the site as the first parameter, and optionally
  * the index of the site.
  */
 export const LinkMenuOptions = {
   Separator: () => ({ type: "separator" }),
   EmptyItem: () => ({ type: "empty" }),
+  ShowPrivacyInfo: site => ({
+    id: "newtab-menu-show-privacy-info",
+    icon: "info",
+    action: {
+      type: at.SHOW_PRIVACY_INFO,
+    },
+  }),
   RemoveBookmark: site => ({
     id: "newtab-menu-remove-bookmark",
     icon: "bookmark-added",
     action: ac.AlsoToMain({
       type: at.DELETE_BOOKMARK_BY_ID,
       data: site.bookmarkGuid,
     }),
     userEvent: "BOOKMARK_DELETE",
--- a/browser/components/newtab/content-src/styles/_activity-stream.scss
+++ b/browser/components/newtab/content-src/styles/_activity-stream.scss
@@ -159,21 +159,21 @@ input {
 @import '../components/DiscoveryStreamComponents/DSCard/DSCard';
 @import '../components/DiscoveryStreamComponents/DSContextFooter/DSContextFooter';
 @import '../components/DiscoveryStreamComponents/DSImage/DSImage';
 @import '../components/DiscoveryStreamComponents/DSDismiss/DSDismiss';
 @import '../components/DiscoveryStreamComponents/DSMessage/DSMessage';
 @import '../components/DiscoveryStreamImpressionStats/ImpressionStats';
 @import '../components/DiscoveryStreamComponents/DSEmptyState/DSEmptyState';
 @import '../components/DiscoveryStreamComponents/DSTextPromo/DSTextPromo';
+@import '../components/DiscoveryStreamComponents/DSPrivacyModal/DSPrivacyModal';
 
 // AS Router
 @import '../asrouter/components/Button/Button';
 @import '../asrouter/components/SnippetBase/SnippetBase';
 @import '../asrouter/components/ModalOverlay/ModalOverlay';
 @import '../asrouter/templates/ReturnToAMO/ReturnToAMO';
 @import '../asrouter/templates/SimpleBelowSearchSnippet/SimpleBelowSearchSnippet';
 @import '../asrouter/templates/SimpleSnippet/SimpleSnippet';
 @import '../asrouter/templates/SubmitFormSnippet/SubmitFormSnippet';
 @import '../asrouter/templates/OnboardingMessage/OnboardingMessage';
 @import '../asrouter/templates/EOYSnippet/EOYSnippet';
-@import '../asrouter/templates/StartupOverlay/StartupOverlay';
 @import '../asrouter/templates/Trailhead/Trailhead';
--- a/browser/components/newtab/css/activity-stream-linux.css
+++ b/browser/components/newtab/css/activity-stream-linux.css
@@ -3095,16 +3095,21 @@ main {
     margin: 0 0 0 4px;
     width: 5px;
     height: 8px;
     text-decoration: none;
     display: inline-block; }
     [lwt-newtab-brighttext] .ds-chevron-link::after {
       background-color: #45A1FF; }
 
+.ds-privacy-modal .privacy-notice {
+  width: 492px;
+  padding: 40px 0;
+  margin: auto; }
+
 .ASRouterButton {
   font-weight: 600;
   font-size: 14px;
   white-space: nowrap;
   border-radius: 2px;
   border: 0;
   font-family: inherit;
   padding: 8px 15px;
@@ -3253,17 +3258,17 @@ body[lwt-newtab-brighttext] .scene2Icon 
 .modal-height {
   padding-top: 80px; }
 
 .modalOverlayInner {
   width: 960px;
   position: fixed;
   top: 15%;
   left: calc(50% - 480px);
-  background: #FFF;
+  background: var(--newtab-modal-color);
   box-shadow: 0 1px 15px 0 rgba(0, 0, 0, 0.3);
   border-radius: 4px;
   display: none;
   z-index: 1101; }
   @media (max-width: 960px) {
     .modalOverlayInner {
       width: 100%;
       height: 100%;
@@ -3271,16 +3276,25 @@ body[lwt-newtab-brighttext] .scene2Icon 
       left: 0;
       box-shadow: none;
       border-radius: 0; } }
   @media (max-height: 730px) {
     .modalOverlayInner {
       top: 5%; } }
   .modalOverlayInner.active {
     display: block; }
+  .modalOverlayInner .icon-dismiss {
+    border: 0;
+    cursor: pointer;
+    inset-inline-end: 0;
+    padding: 20px;
+    fill: #FFF;
+    position: absolute; }
+    .modalOverlayInner .icon-dismiss:focus {
+      border: 1px dotted; }
   .modalOverlayInner h2 {
     color: #4A4A4F;
     text-align: center;
     font-weight: 200;
     margin-top: 30px;
     font-size: 28px;
     line-height: 37px;
     letter-spacing: -0.13px; }
@@ -3917,274 +3931,16 @@ body[lwt-newtab-brighttext] .scene2Icon 
   .EOYSnippetForm .monthly-checkbox-container {
     display: flex;
     width: 100%; }
   .EOYSnippetForm .donation-form-url {
     margin-inline-start: 18px;
     align-self: flex-end;
     display: flex; }
 
-.activity-stream.welcome {
-  overflow: hidden; }
-
-.activity-stream:not(.welcome) .overlay-wrapper {
-  display: none; }
-
-.overlay-wrapper {
-  position: absolute;
-  top: 0;
-  left: 0;
-  width: 100vw;
-  height: 100vh;
-  z-index: 21000;
-  transition: opacity 0.4s;
-  opacity: 0;
-  overflow-x: auto; }
-  .overlay-wrapper.show {
-    transition: none;
-    opacity: 1; }
-    .overlay-wrapper.show .firstrun-sign-in {
-      transition: opacity 1.5s, transform 1.5s;
-      transition-delay: 0.2s;
-      transform: translateY(-50%) scale(1);
-      opacity: 1; }
-      @media screen and (max-width: 790px) {
-        .overlay-wrapper.show .firstrun-sign-in {
-          float: none;
-          margin: auto;
-          top: 190px;
-          margin-bottom: 100px; } }
-    .overlay-wrapper.show .firstrun-firefox-logo {
-      transition: opacity 2.3s;
-      opacity: 1; }
-    .overlay-wrapper.show .firstrun-title,
-    .overlay-wrapper.show .firstrun-content,
-    .overlay-wrapper.show .firstrun-link {
-      transition: transform 0.5s, opacity 0.8s;
-      transform: translateY(0);
-      opacity: 1; }
-    .overlay-wrapper.show .firstrun-title {
-      transition-delay: 0.2s; }
-    .overlay-wrapper.show .firstrun-content {
-      transition-delay: 0.4s; }
-    .overlay-wrapper.show .firstrun-link {
-      transition-delay: 0.6s; }
-    .overlay-wrapper.show .fxaccounts-container {
-      transition: none;
-      opacity: 1; }
-
-.background,
-.fxa + body.hide-main {
-  width: 100%;
-  height: 100%;
-  display: block;
-  background-image: url("../data/content/assets/fox-tail.png"), linear-gradient(to bottom, #003EAA 40%, #004EC2 60%, #0060DF 80%, #0080FF 90%, #00C7FF 100%);
-  background-position-x: center;
-  background-position-y: -200px, top;
-  background-repeat: no-repeat;
-  background-size: cover;
-  position: fixed; }
-
-.firstrun-sign-in {
-  transform: translateY(-50%) scale(0.8);
-  position: relative;
-  top: 50%;
-  width: 358px;
-  opacity: 0;
-  background-color: #FFF;
-  float: inline-end;
-  color: #0C0C0D;
-  text-align: center;
-  padding: 10px; }
-  .firstrun-sign-in form {
-    position: relative; }
-  .firstrun-sign-in .extra-links {
-    font-size: 12px;
-    max-width: 340px;
-    margin: 17px 50px;
-    color: #676F7E;
-    cursor: default; }
-    .firstrun-sign-in .extra-links a {
-      color: #737373;
-      cursor: pointer;
-      text-decoration: underline; }
-    .firstrun-sign-in .extra-links a:hover,
-    .firstrun-sign-in .extra-links a:active,
-    .firstrun-sign-in .extra-links a:focus {
-      color: #0A84FF; }
-  .firstrun-sign-in .email-input {
-    box-shadow: none;
-    margin: auto;
-    width: 244px;
-    display: block;
-    height: 40px;
-    padding-inline-start: 20px;
-    border: 1px solid #737373;
-    border-radius: 2px;
-    font-size: 16px;
-    transition: border-color 150ms, box-shadow 150ms; }
-    .firstrun-sign-in .email-input:hover {
-      border-color: #0C0C0D; }
-    .firstrun-sign-in .email-input:focus {
-      border-color: #0A84FF;
-      box-shadow: 0 0 0 3px rgba(10, 132, 255, 0.3); }
-    .firstrun-sign-in .email-input.invalid {
-      border-color: #D70022; }
-    .firstrun-sign-in .email-input.invalid:focus {
-      box-shadow: 0 0 0 3px rgba(215, 0, 34, 0.3); }
-  .firstrun-sign-in .form-header {
-    font-size: 22px;
-    margin: 15px auto; }
-  .firstrun-sign-in .form-header .sub-header {
-    font-size: 14px;
-    margin-top: 4px;
-    display: block; }
-  .firstrun-sign-in button {
-    display: block;
-    cursor: pointer;
-    margin: 10px auto 0; }
-  .firstrun-sign-in .continue-button {
-    font-size: 18px;
-    height: 43px;
-    width: 250px;
-    padding: 8px 0;
-    border: 0;
-    border-radius: 4px;
-    color: #FFF;
-    background-color: #0060DF;
-    transition: background-color 150ms; }
-    .firstrun-sign-in .continue-button:not([disabled]):active, .firstrun-sign-in .continue-button:not([disabled]):hover {
-      background: #003EAA;
-      border-color: #002275; }
-  .firstrun-sign-in .skip-button {
-    font-size: 13px;
-    margin-top: 20px;
-    margin-bottom: 20px;
-    background-color: #F9F9FA;
-    color: #0A84FF;
-    border: 1px solid #0A84FF;
-    border-radius: 2px;
-    min-height: 24px;
-    padding: 5px 10px;
-    transition: background-color 150ms, color 150ms, border-color 150ms; }
-    .firstrun-sign-in .skip-button[disabled] {
-      background-color: #EDEDF0;
-      border-color: #B1B1B3;
-      color: #737373;
-      cursor: default;
-      opacity: 0.5; }
-    .firstrun-sign-in .skip-button:not([disabled]):hover {
-      background-color: #0A84FF;
-      border-color: #0060DF;
-      color: #FFF; }
-
-.firstrun-left-divider {
-  position: relative;
-  float: inline-start;
-  clear: both;
-  width: 435px; }
-  @media screen and (max-width: 825px) {
-    .firstrun-left-divider {
-      width: 400px; } }
-  @media screen and (max-width: 790px) {
-    .firstrun-left-divider {
-      margin: auto;
-      float: none;
-      width: 352px;
-      text-align: center; } }
-
-.firstrun-content {
-  line-height: 1.5;
-  margin-bottom: 48px;
-  max-width: 352px;
-  background: url("../data/content/assets/sync-devices.svg") bottom center no-repeat;
-  padding-bottom: 210px; }
-
-a.firstrun-link {
-  color: #FFF;
-  display: block;
-  text-decoration: underline; }
-  a.firstrun-link:hover, a.firstrun-link:active, a.firstrun-link:focus {
-    color: #FFF; }
-
-.firstrun-title {
-  background: url("chrome://branding/content/about-logo.png") top left no-repeat;
-  background-size: 90px 90px;
-  margin: 40px 0 10px;
-  padding-top: 110px; }
-  @media screen and (max-width: 790px) {
-    .firstrun-title {
-      background: url("chrome://branding/content/about-logo.png") top center no-repeat;
-      background-size: 90px 90px; } }
-  .firstrun-title:dir(rtl) {
-    background-position: top right; }
-
-.fxaccounts-container {
-  position: absolute;
-  bottom: 0;
-  right: 0;
-  top: 0;
-  left: 0;
-  color: #FFF;
-  height: 515px;
-  margin: auto;
-  width: 819px;
-  z-index: 10;
-  transition: opacity 0.3s;
-  opacity: 0; }
-  @media screen and (max-width: 825px) {
-    .fxaccounts-container {
-      width: 784px; } }
-  @media screen and (max-width: 790px) {
-    .fxaccounts-container {
-      width: auto;
-      height: 100%; } }
-
-.firstrun-title,
-.firstrun-content,
-.firstrun-link {
-  opacity: 0;
-  transform: translateY(-5px); }
-
-.error {
-  display: none; }
-
-.error.active {
-  display: block;
-  padding: 5px 12px;
-  animation: fade-down 450ms;
-  font-size: 12px;
-  font-weight: 500;
-  color: #FFF;
-  background-color: #D70022;
-  position: absolute;
-  inset-inline-start: 50px;
-  top: -28px;
-  border-radius: 2px; }
-  .error.active::before {
-    inset-inline-start: 12px;
-    background: #D70022;
-    bottom: -8px;
-    content: '.';
-    height: 16px;
-    position: absolute;
-    text-indent: -999px;
-    transform: rotate(45deg);
-    white-space: nowrap;
-    width: 16px;
-    z-index: -1; }
-
-@keyframes fade-down {
-  0% {
-    opacity: 0;
-    transform: translateY(-15px); }
-  100% {
-    opacity: 1;
-    transform: translateY(0); } }
-
 .trailhead {
   background: url("../data/content/assets/trailhead/accounts-form-bg.jpg") bottom/cover;
   color: #FFF;
   height: auto; }
   .trailhead a {
     color: #FFF;
     text-decoration: underline; }
   .trailhead input,
@@ -4238,22 +3994,24 @@ a.firstrun-link {
       @media (min-width: 850px) {
         .trailhead .trailheadBenefits li {
           background-position-y: 4px;
           background-size: 62px;
           margin-inline-end: 60px;
           padding-inline-start: 74px; } }
       .trailhead .trailheadBenefits li:dir(rtl) {
         background-position-x: right; }
-      .trailhead .trailheadBenefits li.knowledge {
+      .trailhead .trailheadBenefits li.knowledge, .trailhead .trailheadBenefits li.monitor {
         background-image: url("../data/content/assets/trailhead/benefit-knowledge.png"); }
-      .trailhead .trailheadBenefits li.privacy {
+      .trailhead .trailheadBenefits li.lockwise, .trailhead .trailheadBenefits li.privacy {
         background-image: url("../data/content/assets/trailhead/benefit-privacy.png"); }
       .trailhead .trailheadBenefits li.products {
         background-image: url("../data/content/assets/trailhead/benefit-products.png"); }
+      .trailhead .trailheadBenefits li.sync {
+        background-image: url("../data/content/assets/trailhead/benefit-sync.png"); }
     .trailhead .trailheadBenefits h2 {
       text-align: start;
       line-height: inherit;
       color: #CB9EFF;
       font-size: 22px;
       font-weight: 400;
       margin: 0 0 4px;
       padding-inline-start: 52px; }
@@ -4441,22 +4199,73 @@ a.firstrun-link {
       background: var(--trailhead-card-button-background-active-color); }
   .trailheadCard .onboardingButtonContainer {
     position: absolute;
     bottom: 16px;
     left: 0;
     width: 100%;
     text-align: center; }
 
+.activity-stream.welcome {
+  overflow: hidden; }
+
 .inline-onboarding.activity-stream.welcome {
   overflow-y: hidden; }
 
 .inline-onboarding .modalOverlayInner {
   position: absolute; }
 
 .inline-onboarding .outer-wrapper {
   position: relative;
   display: block; }
   .inline-onboarding .outer-wrapper .prefs-button button {
     position: absolute; }
 
 .inline-onboarding .asrouter-toggle {
   position: absolute; }
+
+.error {
+  display: none; }
+
+.error.active {
+  display: block;
+  padding: 5px 12px;
+  animation: fade-down 450ms;
+  font-size: 12px;
+  font-weight: 500;
+  color: #FFF;
+  background-color: #D70022;
+  position: absolute;
+  inset-inline-start: 50px;
+  top: -28px;
+  border-radius: 2px; }
+  .error.active::before {
+    inset-inline-start: 12px;
+    background: #D70022;
+    bottom: -8px;
+    content: '.';
+    height: 16px;
+    position: absolute;
+    text-indent: -999px;
+    transform: rotate(45deg);
+    white-space: nowrap;
+    width: 16px;
+    z-index: -1; }
+
+@keyframes fade-down {
+  0% {
+    opacity: 0;
+    transform: translateY(-15px); }
+  100% {
+    opacity: 1;
+    transform: translateY(0); } }
+
+.firstrun-title {
+  background: url("chrome://branding/content/about-logo.png") top left no-repeat;
+  background-size: 90px 90px;
+  margin: 40px 0 10px;
+  padding-top: 110px; }
+  @media screen and (max-width: 790px) {
+    .firstrun-title {
+      background: url("chrome://branding/content/about-logo.png") top center no-repeat;
+      background-size: 90px 90px; } }
+  .firstrun-title:dir(rtl) {
+    background-position: top right; }
--- a/browser/components/newtab/css/activity-stream-mac.css
+++ b/browser/components/newtab/css/activity-stream-mac.css
@@ -3098,16 +3098,21 @@ main {
     margin: 0 0 0 4px;
     width: 5px;
     height: 8px;
     text-decoration: none;
     display: inline-block; }
     [lwt-newtab-brighttext] .ds-chevron-link::after {
       background-color: #45A1FF; }
 
+.ds-privacy-modal .privacy-notice {
+  width: 492px;
+  padding: 40px 0;
+  margin: auto; }
+
 .ASRouterButton {
   font-weight: 600;
   font-size: 14px;
   white-space: nowrap;
   border-radius: 2px;
   border: 0;
   font-family: inherit;
   padding: 8px 15px;
@@ -3256,17 +3261,17 @@ body[lwt-newtab-brighttext] .scene2Icon 
 .modal-height {
   padding-top: 80px; }
 
 .modalOverlayInner {
   width: 960px;
   position: fixed;
   top: 15%;
   left: calc(50% - 480px);
-  background: #FFF;
+  background: var(--newtab-modal-color);
   box-shadow: 0 1px 15px 0 rgba(0, 0, 0, 0.3);
   border-radius: 4px;
   display: none;
   z-index: 1101; }
   @media (max-width: 960px) {
     .modalOverlayInner {
       width: 100%;
       height: 100%;
@@ -3274,16 +3279,25 @@ body[lwt-newtab-brighttext] .scene2Icon 
       left: 0;
       box-shadow: none;
       border-radius: 0; } }
   @media (max-height: 730px) {
     .modalOverlayInner {
       top: 5%; } }
   .modalOverlayInner.active {
     display: block; }
+  .modalOverlayInner .icon-dismiss {
+    border: 0;
+    cursor: pointer;
+    inset-inline-end: 0;
+    padding: 20px;
+    fill: #FFF;
+    position: absolute; }
+    .modalOverlayInner .icon-dismiss:focus {
+      border: 1px dotted; }
   .modalOverlayInner h2 {
     color: #4A4A4F;
     text-align: center;
     font-weight: 200;
     margin-top: 30px;
     font-size: 28px;
     line-height: 37px;
     letter-spacing: -0.13px; }
@@ -3920,274 +3934,16 @@ body[lwt-newtab-brighttext] .scene2Icon 
   .EOYSnippetForm .monthly-checkbox-container {
     display: flex;
     width: 100%; }
   .EOYSnippetForm .donation-form-url {
     margin-inline-start: 18px;
     align-self: flex-end;
     display: flex; }
 
-.activity-stream.welcome {
-  overflow: hidden; }
-
-.activity-stream:not(.welcome) .overlay-wrapper {
-  display: none; }
-
-.overlay-wrapper {
-  position: absolute;
-  top: 0;
-  left: 0;
-  width: 100vw;
-  height: 100vh;
-  z-index: 21000;
-  transition: opacity 0.4s;
-  opacity: 0;
-  overflow-x: auto; }
-  .overlay-wrapper.show {
-    transition: none;
-    opacity: 1; }
-    .overlay-wrapper.show .firstrun-sign-in {
-      transition: opacity 1.5s, transform 1.5s;
-      transition-delay: 0.2s;
-      transform: translateY(-50%) scale(1);
-      opacity: 1; }
-      @media screen and (max-width: 790px) {
-        .overlay-wrapper.show .firstrun-sign-in {
-          float: none;
-          margin: auto;
-          top: 190px;
-          margin-bottom: 100px; } }
-    .overlay-wrapper.show .firstrun-firefox-logo {
-      transition: opacity 2.3s;
-      opacity: 1; }
-    .overlay-wrapper.show .firstrun-title,
-    .overlay-wrapper.show .firstrun-content,
-    .overlay-wrapper.show .firstrun-link {
-      transition: transform 0.5s, opacity 0.8s;
-      transform: translateY(0);
-      opacity: 1; }
-    .overlay-wrapper.show .firstrun-title {
-      transition-delay: 0.2s; }
-    .overlay-wrapper.show .firstrun-content {
-      transition-delay: 0.4s; }
-    .overlay-wrapper.show .firstrun-link {
-      transition-delay: 0.6s; }
-    .overlay-wrapper.show .fxaccounts-container {
-      transition: none;
-      opacity: 1; }
-
-.background,
-.fxa + body.hide-main {
-  width: 100%;
-  height: 100%;
-  display: block;
-  background-image: url("../data/content/assets/fox-tail.png"), linear-gradient(to bottom, #003EAA 40%, #004EC2 60%, #0060DF 80%, #0080FF 90%, #00C7FF 100%);
-  background-position-x: center;
-  background-position-y: -200px, top;
-  background-repeat: no-repeat;
-  background-size: cover;
-  position: fixed; }
-
-.firstrun-sign-in {
-  transform: translateY(-50%) scale(0.8);
-  position: relative;
-  top: 50%;
-  width: 358px;
-  opacity: 0;
-  background-color: #FFF;
-  float: inline-end;
-  color: #0C0C0D;
-  text-align: center;
-  padding: 10px; }
-  .firstrun-sign-in form {
-    position: relative; }
-  .firstrun-sign-in .extra-links {
-    font-size: 12px;
-    max-width: 340px;
-    margin: 17px 50px;
-    color: #676F7E;
-    cursor: default; }
-    .firstrun-sign-in .extra-links a {
-      color: #737373;
-      cursor: pointer;
-      text-decoration: underline; }
-    .firstrun-sign-in .extra-links a:hover,
-    .firstrun-sign-in .extra-links a:active,
-    .firstrun-sign-in .extra-links a:focus {
-      color: #0A84FF; }
-  .firstrun-sign-in .email-input {
-    box-shadow: none;
-    margin: auto;
-    width: 244px;
-    display: block;
-    height: 40px;
-    padding-inline-start: 20px;
-    border: 1px solid #737373;
-    border-radius: 2px;
-    font-size: 16px;
-    transition: border-color 150ms, box-shadow 150ms; }
-    .firstrun-sign-in .email-input:hover {
-      border-color: #0C0C0D; }
-    .firstrun-sign-in .email-input:focus {
-      border-color: #0A84FF;
-      box-shadow: 0 0 0 3px rgba(10, 132, 255, 0.3); }
-    .firstrun-sign-in .email-input.invalid {
-      border-color: #D70022; }
-    .firstrun-sign-in .email-input.invalid:focus {
-      box-shadow: 0 0 0 3px rgba(215, 0, 34, 0.3); }
-  .firstrun-sign-in .form-header {
-    font-size: 22px;
-    margin: 15px auto; }
-  .firstrun-sign-in .form-header .sub-header {
-    font-size: 14px;
-    margin-top: 4px;
-    display: block; }
-  .firstrun-sign-in button {
-    display: block;
-    cursor: pointer;
-    margin: 10px auto 0; }
-  .firstrun-sign-in .continue-button {
-    font-size: 18px;
-    height: 43px;
-    width: 250px;
-    padding: 8px 0;
-    border: 0;
-    border-radius: 4px;
-    color: #FFF;
-    background-color: #0060DF;
-    transition: background-color 150ms; }
-    .firstrun-sign-in .continue-button:not([disabled]):active, .firstrun-sign-in .continue-button:not([disabled]):hover {
-      background: #003EAA;
-      border-color: #002275; }
-  .firstrun-sign-in .skip-button {
-    font-size: 13px;
-    margin-top: 20px;
-    margin-bottom: 20px;
-    background-color: #F9F9FA;
-    color: #0A84FF;
-    border: 1px solid #0A84FF;
-    border-radius: 2px;
-    min-height: 24px;
-    padding: 5px 10px;
-    transition: background-color 150ms, color 150ms, border-color 150ms; }
-    .firstrun-sign-in .skip-button[disabled] {
-      background-color: #EDEDF0;
-      border-color: #B1B1B3;
-      color: #737373;
-      cursor: default;
-      opacity: 0.5; }
-    .firstrun-sign-in .skip-button:not([disabled]):hover {
-      background-color: #0A84FF;
-      border-color: #0060DF;
-      color: #FFF; }
-
-.firstrun-left-divider {
-  position: relative;
-  float: inline-start;
-  clear: both;
-  width: 435px; }
-  @media screen and (max-width: 825px) {
-    .firstrun-left-divider {
-      width: 400px; } }
-  @media screen and (max-width: 790px) {
-    .firstrun-left-divider {
-      margin: auto;
-      float: none;
-      width: 352px;
-      text-align: center; } }
-
-.firstrun-content {
-  line-height: 1.5;
-  margin-bottom: 48px;
-  max-width: 352px;
-  background: url("../data/content/assets/sync-devices.svg") bottom center no-repeat;
-  padding-bottom: 210px; }
-
-a.firstrun-link {
-  color: #FFF;
-  display: block;
-  text-decoration: underline; }
-  a.firstrun-link:hover, a.firstrun-link:active, a.firstrun-link:focus {
-    color: #FFF; }
-
-.firstrun-title {
-  background: url("chrome://branding/content/about-logo.png") top left no-repeat;
-  background-size: 90px 90px;
-  margin: 40px 0 10px;
-  padding-top: 110px; }
-  @media screen and (max-width: 790px) {
-    .firstrun-title {
-      background: url("chrome://branding/content/about-logo.png") top center no-repeat;
-      background-size: 90px 90px; } }
-  .firstrun-title:dir(rtl) {
-    background-position: top right; }
-
-.fxaccounts-container {
-  position: absolute;
-  bottom: 0;
-  right: 0;
-  top: 0;
-  left: 0;
-  color: #FFF;
-  height: 515px;
-  margin: auto;
-  width: 819px;
-  z-index: 10;
-  transition: opacity 0.3s;
-  opacity: 0; }
-  @media screen and (max-width: 825px) {
-    .fxaccounts-container {
-      width: 784px; } }
-  @media screen and (max-width: 790px) {
-    .fxaccounts-container {
-      width: auto;
-      height: 100%; } }
-
-.firstrun-title,
-.firstrun-content,
-.firstrun-link {
-  opacity: 0;
-  transform: translateY(-5px); }
-
-.error {
-  display: none; }
-
-.error.active {
-  display: block;
-  padding: 5px 12px;
-  animation: fade-down 450ms;
-  font-size: 12px;
-  font-weight: 500;
-  color: #FFF;
-  background-color: #D70022;
-  position: absolute;
-  inset-inline-start: 50px;
-  top: -28px;
-  border-radius: 2px; }
-  .error.active::before {
-    inset-inline-start: 12px;
-    background: #D70022;
-    bottom: -8px;
-    content: '.';
-    height: 16px;
-    position: absolute;
-    text-indent: -999px;
-    transform: rotate(45deg);
-    white-space: nowrap;
-    width: 16px;
-    z-index: -1; }
-
-@keyframes fade-down {
-  0% {
-    opacity: 0;
-    transform: translateY(-15px); }
-  100% {
-    opacity: 1;
-    transform: translateY(0); } }
-
 .trailhead {
   background: url("../data/content/assets/trailhead/accounts-form-bg.jpg") bottom/cover;
   color: #FFF;
   height: auto; }
   .trailhead a {
     color: #FFF;
     text-decoration: underline; }
   .trailhead input,
@@ -4241,22 +3997,24 @@ a.firstrun-link {
       @media (min-width: 850px) {
         .trailhead .trailheadBenefits li {
           background-position-y: 4px;
           background-size: 62px;
           margin-inline-end: 60px;
           padding-inline-start: 74px; } }
       .trailhead .trailheadBenefits li:dir(rtl) {
         background-position-x: right; }
-      .trailhead .trailheadBenefits li.knowledge {
+      .trailhead .trailheadBenefits li.knowledge, .trailhead .trailheadBenefits li.monitor {
         background-image: url("../data/content/assets/trailhead/benefit-knowledge.png"); }
-      .trailhead .trailheadBenefits li.privacy {
+      .trailhead .trailheadBenefits li.lockwise, .trailhead .trailheadBenefits li.privacy {
         background-image: url("../data/content/assets/trailhead/benefit-privacy.png"); }
       .trailhead .trailheadBenefits li.products {
         background-image: url("../data/content/assets/trailhead/benefit-products.png"); }
+      .trailhead .trailheadBenefits li.sync {
+        background-image: url("../data/content/assets/trailhead/benefit-sync.png"); }
     .trailhead .trailheadBenefits h2 {
       text-align: start;
       line-height: inherit;
       color: #CB9EFF;
       font-size: 22px;
       font-weight: 400;
       margin: 0 0 4px;
       padding-inline-start: 52px; }
@@ -4444,22 +4202,73 @@ a.firstrun-link {
       background: var(--trailhead-card-button-background-active-color); }
   .trailheadCard .onboardingButtonContainer {
     position: absolute;
     bottom: 16px;
     left: 0;
     width: 100%;
     text-align: center; }
 
+.activity-stream.welcome {
+  overflow: hidden; }
+
 .inline-onboarding.activity-stream.welcome {
   overflow-y: hidden; }
 
 .inline-onboarding .modalOverlayInner {
   position: absolute; }
 
 .inline-onboarding .outer-wrapper {
   position: relative;
   display: block; }
   .inline-onboarding .outer-wrapper .prefs-button button {
     position: absolute; }
 
 .inline-onboarding .asrouter-toggle {
   position: absolute; }
+
+.error {
+  display: none; }
+
+.error.active {
+  display: block;
+  padding: 5px 12px;
+  animation: fade-down 450ms;
+  font-size: 12px;
+  font-weight: 500;
+  color: #FFF;
+  background-color: #D70022;
+  position: absolute;
+  inset-inline-start: 50px;
+  top: -28px;
+  border-radius: 2px; }
+  .error.active::before {
+    inset-inline-start: 12px;
+    background: #D70022;
+    bottom: -8px;
+    content: '.';
+    height: 16px;
+    position: absolute;
+    text-indent: -999px;
+    transform: rotate(45deg);
+    white-space: nowrap;
+    width: 16px;
+    z-index: -1; }
+
+@keyframes fade-down {
+  0% {
+    opacity: 0;
+    transform: translateY(-15px); }
+  100% {
+    opacity: 1;
+    transform: translateY(0); } }
+
+.firstrun-title {
+  background: url("chrome://branding/content/about-logo.png") top left no-repeat;
+  background-size: 90px 90px;
+  margin: 40px 0 10px;
+  padding-top: 110px; }
+  @media screen and (max-width: 790px) {
+    .firstrun-title {
+      background: url("chrome://branding/content/about-logo.png") top center no-repeat;
+      background-size: 90px 90px; } }
+  .firstrun-title:dir(rtl) {
+    background-position: top right; }
--- a/browser/components/newtab/css/activity-stream-windows.css
+++ b/browser/components/newtab/css/activity-stream-windows.css
@@ -3095,16 +3095,21 @@ main {
     margin: 0 0 0 4px;
     width: 5px;
     height: 8px;
     text-decoration: none;
     display: inline-block; }
     [lwt-newtab-brighttext] .ds-chevron-link::after {
       background-color: #45A1FF; }
 
+.ds-privacy-modal .privacy-notice {
+  width: 492px;
+  padding: 40px 0;
+  margin: auto; }
+
 .ASRouterButton {
   font-weight: 600;
   font-size: 14px;
   white-space: nowrap;
   border-radius: 2px;
   border: 0;
   font-family: inherit;
   padding: 8px 15px;
@@ -3253,17 +3258,17 @@ body[lwt-newtab-brighttext] .scene2Icon 
 .modal-height {
   padding-top: 80px; }
 
 .modalOverlayInner {
   width: 960px;
   position: fixed;
   top: 15%;
   left: calc(50% - 480px);
-  background: #FFF;
+  background: var(--newtab-modal-color);
   box-shadow: 0 1px 15px 0 rgba(0, 0, 0, 0.3);
   border-radius: 4px;
   display: none;
   z-index: 1101; }
   @media (max-width: 960px) {
     .modalOverlayInner {
       width: 100%;
       height: 100%;
@@ -3271,16 +3276,25 @@ body[lwt-newtab-brighttext] .scene2Icon 
       left: 0;
       box-shadow: none;
       border-radius: 0; } }
   @media (max-height: 730px) {
     .modalOverlayInner {
       top: 5%; } }
   .modalOverlayInner.active {
     display: block; }
+  .modalOverlayInner .icon-dismiss {
+    border: 0;
+    cursor: pointer;
+    inset-inline-end: 0;
+    padding: 20px;
+    fill: #FFF;
+    position: absolute; }
+    .modalOverlayInner .icon-dismiss:focus {
+      border: 1px dotted; }
   .modalOverlayInner h2 {
     color: #4A4A4F;
     text-align: center;
     font-weight: 200;
     margin-top: 30px;
     font-size: 28px;
     line-height: 37px;
     letter-spacing: -0.13px; }
@@ -3917,274 +3931,16 @@ body[lwt-newtab-brighttext] .scene2Icon 
   .EOYSnippetForm .monthly-checkbox-container {
     display: flex;
     width: 100%; }
   .EOYSnippetForm .donation-form-url {
     margin-inline-start: 18px;
     align-self: flex-end;
     display: flex; }
 
-.activity-stream.welcome {
-  overflow: hidden; }
-
-.activity-stream:not(.welcome) .overlay-wrapper {
-  display: none; }
-
-.overlay-wrapper {
-  position: absolute;
-  top: 0;
-  left: 0;
-  width: 100vw;
-  height: 100vh;
-  z-index: 21000;
-  transition: opacity 0.4s;
-  opacity: 0;
-  overflow-x: auto; }
-  .overlay-wrapper.show {
-    transition: none;
-    opacity: 1; }
-    .overlay-wrapper.show .firstrun-sign-in {
-      transition: opacity 1.5s, transform 1.5s;
-      transition-delay: 0.2s;
-      transform: translateY(-50%) scale(1);
-      opacity: 1; }
-      @media screen and (max-width: 790px) {
-        .overlay-wrapper.show .firstrun-sign-in {
-          float: none;
-          margin: auto;
-          top: 190px;
-          margin-bottom: 100px; } }
-    .overlay-wrapper.show .firstrun-firefox-logo {
-      transition: opacity 2.3s;
-      opacity: 1; }
-    .overlay-wrapper.show .firstrun-title,
-    .overlay-wrapper.show .firstrun-content,
-    .overlay-wrapper.show .firstrun-link {
-      transition: transform 0.5s, opacity 0.8s;
-      transform: translateY(0);
-      opacity: 1; }
-    .overlay-wrapper.show .firstrun-title {
-      transition-delay: 0.2s; }
-    .overlay-wrapper.show .firstrun-content {
-      transition-delay: 0.4s; }
-    .overlay-wrapper.show .firstrun-link {
-      transition-delay: 0.6s; }
-    .overlay-wrapper.show .fxaccounts-container {
-      transition: none;
-      opacity: 1; }
-
-.background,
-.fxa + body.hide-main {
-  width: 100%;
-  height: 100%;
-  display: block;
-  background-image: url("../data/content/assets/fox-tail.png"), linear-gradient(to bottom, #003EAA 40%, #004EC2 60%, #0060DF 80%, #0080FF 90%, #00C7FF 100%);
-  background-position-x: center;
-  background-position-y: -200px, top;
-  background-repeat: no-repeat;
-  background-size: cover;
-  position: fixed; }
-
-.firstrun-sign-in {
-  transform: translateY(-50%) scale(0.8);
-  position: relative;
-  top: 50%;
-  width: 358px;
-  opacity: 0;
-  background-color: #FFF;
-  float: inline-end;
-  color: #0C0C0D;
-  text-align: center;
-  padding: 10px; }
-  .firstrun-sign-in form {
-    position: relative; }
-  .firstrun-sign-in .extra-links {
-    font-size: 12px;
-    max-width: 340px;
-    margin: 17px 50px;
-    color: #676F7E;
-    cursor: default; }
-    .firstrun-sign-in .extra-links a {
-      color: #737373;
-      cursor: pointer;
-      text-decoration: underline; }
-    .firstrun-sign-in .extra-links a:hover,
-    .firstrun-sign-in .extra-links a:active,
-    .firstrun-sign-in .extra-links a:focus {
-      color: #0A84FF; }
-  .firstrun-sign-in .email-input {
-    box-shadow: none;
-    margin: auto;
-    width: 244px;
-    display: block;
-    height: 40px;
-    padding-inline-start: 20px;
-    border: 1px solid #737373;
-    border-radius: 2px;
-    font-size: 16px;
-    transition: border-color 150ms, box-shadow 150ms; }
-    .firstrun-sign-in .email-input:hover {
-      border-color: #0C0C0D; }
-    .firstrun-sign-in .email-input:focus {
-      border-color: #0A84FF;
-      box-shadow: 0 0 0 3px rgba(10, 132, 255, 0.3); }
-    .firstrun-sign-in .email-input.invalid {
-      border-color: #D70022; }
-    .firstrun-sign-in .email-input.invalid:focus {
-      box-shadow: 0 0 0 3px rgba(215, 0, 34, 0.3); }
-  .firstrun-sign-in .form-header {
-    font-size: 22px;
-    margin: 15px auto; }
-  .firstrun-sign-in .form-header .sub-header {
-    font-size: 14px;
-    margin-top: 4px;
-    display: block; }
-  .firstrun-sign-in button {
-    display: block;
-    cursor: pointer;
-    margin: 10px auto 0; }
-  .firstrun-sign-in .continue-button {
-    font-size: 18px;
-    height: 43px;
-    width: 250px;
-    padding: 8px 0;
-    border: 0;
-    border-radius: 4px;
-    color: #FFF;
-    background-color: #0060DF;
-    transition: background-color 150ms; }
-    .firstrun-sign-in .continue-button:not([disabled]):active, .firstrun-sign-in .continue-button:not([disabled]):hover {
-      background: #003EAA;
-      border-color: #002275; }
-  .firstrun-sign-in .skip-button {
-    font-size: 13px;
-    margin-top: 20px;
-    margin-bottom: 20px;
-    background-color: #F9F9FA;
-    color: #0A84FF;
-    border: 1px solid #0A84FF;
-    border-radius: 2px;
-    min-height: 24px;
-    padding: 5px 10px;
-    transition: background-color 150ms, color 150ms, border-color 150ms; }
-    .firstrun-sign-in .skip-button[disabled] {
-      background-color: #EDEDF0;
-      border-color: #B1B1B3;
-      color: #737373;
-      cursor: default;
-      opacity: 0.5; }
-    .firstrun-sign-in .skip-button:not([disabled]):hover {
-      background-color: #0A84FF;
-      border-color: #0060DF;
-      color: #FFF; }
-
-.firstrun-left-divider {
-  position: relative;
-  float: inline-start;
-  clear: both;
-  width: 435px; }
-  @media screen and (max-width: 825px) {
-    .firstrun-left-divider {
-      width: 400px; } }
-  @media screen and (max-width: 790px) {
-    .firstrun-left-divider {
-      margin: auto;
-      float: none;
-      width: 352px;
-      text-align: center; } }
-
-.firstrun-content {
-  line-height: 1.5;
-  margin-bottom: 48px;
-  max-width: 352px;
-  background: url("../data/content/assets/sync-devices.svg") bottom center no-repeat;
-  padding-bottom: 210px; }
-
-a.firstrun-link {
-  color: #FFF;
-  display: block;
-  text-decoration: underline; }
-  a.firstrun-link:hover, a.firstrun-link:active, a.firstrun-link:focus {
-    color: #FFF; }
-
-.firstrun-title {
-  background: url("chrome://branding/content/about-logo.png") top left no-repeat;
-  background-size: 90px 90px;
-  margin: 40px 0 10px;
-  padding-top: 110px; }
-  @media screen and (max-width: 790px) {
-    .firstrun-title {
-      background: url("chrome://branding/content/about-logo.png") top center no-repeat;
-      background-size: 90px 90px; } }
-  .firstrun-title:dir(rtl) {
-    background-position: top right; }
-
-.fxaccounts-container {
-  position: absolute;
-  bottom: 0;
-  right: 0;
-  top: 0;
-  left: 0;
-  color: #FFF;
-  height: 515px;
-  margin: auto;
-  width: 819px;
-  z-index: 10;
-  transition: opacity 0.3s;
-  opacity: 0; }
-  @media screen and (max-width: 825px) {
-    .fxaccounts-container {
-      width: 784px; } }
-  @media screen and (max-width: 790px) {
-    .fxaccounts-container {
-      width: auto;
-      height: 100%; } }
-
-.firstrun-title,
-.firstrun-content,
-.firstrun-link {
-  opacity: 0;
-  transform: translateY(-5px); }
-
-.error {
-  display: none; }
-
-.error.active {
-  display: block;
-  padding: 5px 12px;
-  animation: fade-down 450ms;
-  font-size: 12px;
-  font-weight: 500;
-  color: #FFF;
-  background-color: #D70022;
-  position: absolute;
-  inset-inline-start: 50px;
-  top: -28px;
-  border-radius: 2px; }
-  .error.active::before {
-    inset-inline-start: 12px;
-    background: #D70022;
-    bottom: -8px;
-    content: '.';
-    height: 16px;
-    position: absolute;
-    text-indent: -999px;
-    transform: rotate(45deg);
-    white-space: nowrap;
-    width: 16px;
-    z-index: -1; }
-
-@keyframes fade-down {
-  0% {
-    opacity: 0;
-    transform: translateY(-15px); }
-  100% {
-    opacity: 1;
-    transform: translateY(0); } }
-
 .trailhead {
   background: url("../data/content/assets/trailhead/accounts-form-bg.jpg") bottom/cover;
   color: #FFF;
   height: auto; }
   .trailhead a {
     color: #FFF;
     text-decoration: underline; }
   .trailhead input,
@@ -4238,22 +3994,24 @@ a.firstrun-link {
       @media (min-width: 850px) {
         .trailhead .trailheadBenefits li {
           background-position-y: 4px;
           background-size: 62px;
           margin-inline-end: 60px;
           padding-inline-start: 74px; } }
       .trailhead .trailheadBenefits li:dir(rtl) {
         background-position-x: right; }
-      .trailhead .trailheadBenefits li.knowledge {
+      .trailhead .trailheadBenefits li.knowledge, .trailhead .trailheadBenefits li.monitor {
         background-image: url("../data/content/assets/trailhead/benefit-knowledge.png"); }
-      .trailhead .trailheadBenefits li.privacy {
+      .trailhead .trailheadBenefits li.lockwise, .trailhead .trailheadBenefits li.privacy {
         background-image: url("../data/content/assets/trailhead/benefit-privacy.png"); }
       .trailhead .trailheadBenefits li.products {
         background-image: url("../data/content/assets/trailhead/benefit-products.png"); }
+      .trailhead .trailheadBenefits li.sync {
+        background-image: url("../data/content/assets/trailhead/benefit-sync.png"); }
     .trailhead .trailheadBenefits h2 {
       text-align: start;
       line-height: inherit;
       color: #CB9EFF;
       font-size: 22px;
       font-weight: 400;
       margin: 0 0 4px;
       padding-inline-start: 52px; }
@@ -4441,22 +4199,73 @@ a.firstrun-link {
       background: var(--trailhead-card-button-background-active-color); }
   .trailheadCard .onboardingButtonContainer {
     position: absolute;
     bottom: 16px;
     left: 0;
     width: 100%;
     text-align: center; }
 
+.activity-stream.welcome {
+  overflow: hidden; }
+
 .inline-onboarding.activity-stream.welcome {
   overflow-y: hidden; }
 
 .inline-onboarding .modalOverlayInner {
   position: absolute; }
 
 .inline-onboarding .outer-wrapper {
   position: relative;
   display: block; }
   .inline-onboarding .outer-wrapper .prefs-button button {
     position: absolute; }
 
 .inline-onboarding .asrouter-toggle {
   position: absolute; }
+
+.error {
+  display: none; }
+
+.error.active {
+  display: block;
+  padding: 5px 12px;
+  animation: fade-down 450ms;
+  font-size: 12px;
+  font-weight: 500;
+  color: #FFF;
+  background-color: #D70022;
+  position: absolute;
+  inset-inline-start: 50px;
+  top: -28px;
+  border-radius: 2px; }
+  .error.active::before {
+    inset-inline-start: 12px;
+    background: #D70022;
+    bottom: -8px;
+    content: '.';
+    height: 16px;
+    position: absolute;
+    text-indent: -999px;
+    transform: rotate(45deg);
+    white-space: nowrap;
+    width: 16px;
+    z-index: -1; }
+
+@keyframes fade-down {
+  0% {
+    opacity: 0;
+    transform: translateY(-15px); }
+  100% {
+    opacity: 1;
+    transform: translateY(0); } }
+
+.firstrun-title {
+  background: url("chrome://branding/content/about-logo.png") top left no-repeat;
+  background-size: 90px 90px;
+  margin: 40px 0 10px;
+  padding-top: 110px; }
+  @media screen and (max-width: 790px) {
+    .firstrun-title {
+      background: url("chrome://branding/content/about-logo.png") top center no-repeat;
+      background-size: 90px 90px; } }
+  .firstrun-title:dir(rtl) {
+    background-position: top right; }
--- a/browser/components/newtab/data/content/activity-stream.bundle.js
+++ b/browser/components/newtab/data/content/activity-stream.bundle.js
@@ -88,25 +88,25 @@
 /******/ ([
 /* 0 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* WEBPACK VAR INJECTION */(function(global) {/* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
 /* harmony import */ var content_src_components_Base_Base__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3);
-/* harmony import */ var content_src_lib_detect_user_session_start__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(56);
+/* harmony import */ var content_src_lib_detect_user_session_start__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(55);
 /* harmony import */ var content_src_lib_init_store__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6);
-/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(27);
+/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(26);
 /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_4__);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(9);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__);
 /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(12);
 /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_6__);
-/* harmony import */ var common_Reducers_jsm__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(61);
+/* harmony import */ var common_Reducers_jsm__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(60);
 /* 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/. */
 
 
 
 
 
@@ -189,17 +189,17 @@ const globalImportContext = typeof Windo
 
 // Create an object that avoids accidental differing key/value pairs:
 // {
 //   INIT: "INIT",
 //   UNINIT: "UNINIT"
 // }
 const actionTypes = {};
 
-for (const type of ["ADDONS_INFO_REQUEST", "ADDONS_INFO_RESPONSE", "ARCHIVE_FROM_POCKET", "AS_ROUTER_INITIALIZED", "AS_ROUTER_PREF_CHANGED", "AS_ROUTER_TARGETING_UPDATE", "AS_ROUTER_TELEMETRY_USER_EVENT", "BLOCK_URL", "BOOKMARK_URL", "CLEAR_PREF", "COPY_DOWNLOAD_LINK", "DELETE_BOOKMARK_BY_ID", "DELETE_FROM_POCKET", "DELETE_HISTORY_URL", "DIALOG_CANCEL", "DIALOG_OPEN", "DISCOVERY_STREAM_CONFIG_CHANGE", "DISCOVERY_STREAM_CONFIG_RESET_DEFAULTS", "DISCOVERY_STREAM_CONFIG_SETUP", "DISCOVERY_STREAM_CONFIG_SET_VALUE", "DISCOVERY_STREAM_FEEDS_UPDATE", "DISCOVERY_STREAM_FEED_UPDATE", "DISCOVERY_STREAM_IMPRESSION_STATS", "DISCOVERY_STREAM_LAYOUT_RESET", "DISCOVERY_STREAM_LAYOUT_UPDATE", "DISCOVERY_STREAM_LINK_BLOCKED", "DISCOVERY_STREAM_LOADED_CONTENT", "DISCOVERY_STREAM_RETRY_FEED", "DISCOVERY_STREAM_SPOCS_CAPS", "DISCOVERY_STREAM_SPOCS_ENDPOINT", "DISCOVERY_STREAM_SPOCS_FILL", "DISCOVERY_STREAM_SPOCS_PLACEMENTS", "DISCOVERY_STREAM_SPOCS_UPDATE", "DISCOVERY_STREAM_SPOC_BLOCKED", "DISCOVERY_STREAM_SPOC_IMPRESSION", "DOWNLOAD_CHANGED", "FAKE_FOCUS_SEARCH", "FILL_SEARCH_TERM", "HANDOFF_SEARCH_TO_AWESOMEBAR", "HIDE_SEARCH", "INIT", "NEW_TAB_INIT", "NEW_TAB_INITIAL_STATE", "NEW_TAB_LOAD", "NEW_TAB_REHYDRATED", "NEW_TAB_STATE_REQUEST", "NEW_TAB_UNLOAD", "OPEN_DOWNLOAD_FILE", "OPEN_LINK", "OPEN_NEW_WINDOW", "OPEN_PRIVATE_WINDOW", "OPEN_WEBEXT_SETTINGS", "PLACES_BOOKMARK_ADDED", "PLACES_BOOKMARK_REMOVED", "PLACES_HISTORY_CLEARED", "PLACES_LINKS_CHANGED", "PLACES_LINK_BLOCKED", "PLACES_LINK_DELETED", "PLACES_SAVED_TO_POCKET", "POCKET_CTA", "POCKET_LINK_DELETED_OR_ARCHIVED", "POCKET_LOGGED_IN", "POCKET_WAITING_FOR_SPOC", "PREFS_INITIAL_VALUES", "PREF_CHANGED", "PREVIEW_REQUEST", "PREVIEW_REQUEST_CANCEL", "PREVIEW_RESPONSE", "REMOVE_DOWNLOAD_FILE", "RICH_ICON_MISSING", "SAVE_SESSION_PERF_DATA", "SAVE_TO_POCKET", "SCREENSHOT_UPDATED", "SECTION_DEREGISTER", "SECTION_DISABLE", "SECTION_ENABLE", "SECTION_MOVE", "SECTION_OPTIONS_CHANGED", "SECTION_REGISTER", "SECTION_UPDATE", "SECTION_UPDATE_CARD", "SETTINGS_CLOSE", "SETTINGS_OPEN", "SET_PREF", "SHOW_DOWNLOAD_FILE", "SHOW_FIREFOX_ACCOUNTS", "SHOW_SEARCH", "SKIPPED_SIGNIN", "SNIPPETS_BLOCKLIST_CLEARED", "SNIPPETS_BLOCKLIST_UPDATED", "SNIPPETS_DATA", "SNIPPETS_PREVIEW_MODE", "SNIPPETS_RESET", "SNIPPET_BLOCKED", "SUBMIT_EMAIL", "SYSTEM_TICK", "TELEMETRY_IMPRESSION_STATS", "TELEMETRY_PERFORMANCE_EVENT", "TELEMETRY_UNDESIRED_EVENT", "TELEMETRY_USER_EVENT", "TOP_SITES_CANCEL_EDIT", "TOP_SITES_CLOSE_SEARCH_SHORTCUTS_MODAL", "TOP_SITES_EDIT", "TOP_SITES_INSERT", "TOP_SITES_OPEN_SEARCH_SHORTCUTS_MODAL", "TOP_SITES_PIN", "TOP_SITES_PREFS_UPDATED", "TOP_SITES_UNPIN", "TOP_SITES_UPDATED", "TOTAL_BOOKMARKS_REQUEST", "TOTAL_BOOKMARKS_RESPONSE", "TRAILHEAD_ENROLL_EVENT", "UNINIT", "UPDATE_PINNED_SEARCH_SHORTCUTS", "UPDATE_SEARCH_SHORTCUTS", "UPDATE_SECTION_PREFS", "WEBEXT_CLICK", "WEBEXT_DISMISS"]) {
+for (const type of ["ADDONS_INFO_REQUEST", "ADDONS_INFO_RESPONSE", "ARCHIVE_FROM_POCKET", "AS_ROUTER_INITIALIZED", "AS_ROUTER_PREF_CHANGED", "AS_ROUTER_TARGETING_UPDATE", "AS_ROUTER_TELEMETRY_USER_EVENT", "BLOCK_URL", "BOOKMARK_URL", "CLEAR_PREF", "COPY_DOWNLOAD_LINK", "DELETE_BOOKMARK_BY_ID", "DELETE_FROM_POCKET", "DELETE_HISTORY_URL", "DIALOG_CANCEL", "DIALOG_OPEN", "DISCOVERY_STREAM_CONFIG_CHANGE", "DISCOVERY_STREAM_CONFIG_RESET_DEFAULTS", "DISCOVERY_STREAM_CONFIG_SETUP", "DISCOVERY_STREAM_CONFIG_SET_VALUE", "DISCOVERY_STREAM_FEEDS_UPDATE", "DISCOVERY_STREAM_FEED_UPDATE", "DISCOVERY_STREAM_IMPRESSION_STATS", "DISCOVERY_STREAM_LAYOUT_RESET", "DISCOVERY_STREAM_LAYOUT_UPDATE", "DISCOVERY_STREAM_LINK_BLOCKED", "DISCOVERY_STREAM_LOADED_CONTENT", "DISCOVERY_STREAM_RETRY_FEED", "DISCOVERY_STREAM_SPOCS_CAPS", "DISCOVERY_STREAM_SPOCS_ENDPOINT", "DISCOVERY_STREAM_SPOCS_FILL", "DISCOVERY_STREAM_SPOCS_PLACEMENTS", "DISCOVERY_STREAM_SPOCS_UPDATE", "DISCOVERY_STREAM_SPOC_BLOCKED", "DISCOVERY_STREAM_SPOC_IMPRESSION", "DOWNLOAD_CHANGED", "FAKE_FOCUS_SEARCH", "FILL_SEARCH_TERM", "HANDOFF_SEARCH_TO_AWESOMEBAR", "HIDE_PRIVACY_INFO", "HIDE_SEARCH", "INIT", "NEW_TAB_INIT", "NEW_TAB_INITIAL_STATE", "NEW_TAB_LOAD", "NEW_TAB_REHYDRATED", "NEW_TAB_STATE_REQUEST", "NEW_TAB_UNLOAD", "OPEN_DOWNLOAD_FILE", "OPEN_LINK", "OPEN_NEW_WINDOW", "OPEN_PRIVATE_WINDOW", "OPEN_WEBEXT_SETTINGS", "PLACES_BOOKMARK_ADDED", "PLACES_BOOKMARK_REMOVED", "PLACES_HISTORY_CLEARED", "PLACES_LINKS_CHANGED", "PLACES_LINK_BLOCKED", "PLACES_LINK_DELETED", "PLACES_SAVED_TO_POCKET", "POCKET_CTA", "POCKET_LINK_DELETED_OR_ARCHIVED", "POCKET_LOGGED_IN", "POCKET_WAITING_FOR_SPOC", "PREFS_INITIAL_VALUES", "PREF_CHANGED", "PREVIEW_REQUEST", "PREVIEW_REQUEST_CANCEL", "PREVIEW_RESPONSE", "REMOVE_DOWNLOAD_FILE", "RICH_ICON_MISSING", "SAVE_SESSION_PERF_DATA", "SAVE_TO_POCKET", "SCREENSHOT_UPDATED", "SECTION_DEREGISTER", "SECTION_DISABLE", "SECTION_ENABLE", "SECTION_MOVE", "SECTION_OPTIONS_CHANGED", "SECTION_REGISTER", "SECTION_UPDATE", "SECTION_UPDATE_CARD", "SETTINGS_CLOSE", "SETTINGS_OPEN", "SET_PREF", "SHOW_DOWNLOAD_FILE", "SHOW_FIREFOX_ACCOUNTS", "SHOW_PRIVACY_INFO", "SHOW_SEARCH", "SKIPPED_SIGNIN", "SNIPPETS_BLOCKLIST_CLEARED", "SNIPPETS_BLOCKLIST_UPDATED", "SNIPPETS_DATA", "SNIPPETS_PREVIEW_MODE", "SNIPPETS_RESET", "SNIPPET_BLOCKED", "SUBMIT_EMAIL", "SYSTEM_TICK", "TELEMETRY_IMPRESSION_STATS", "TELEMETRY_PERFORMANCE_EVENT", "TELEMETRY_UNDESIRED_EVENT", "TELEMETRY_USER_EVENT", "TOP_SITES_CANCEL_EDIT", "TOP_SITES_CLOSE_SEARCH_SHORTCUTS_MODAL", "TOP_SITES_EDIT", "TOP_SITES_INSERT", "TOP_SITES_OPEN_SEARCH_SHORTCUTS_MODAL", "TOP_SITES_PIN", "TOP_SITES_PREFS_UPDATED", "TOP_SITES_UNPIN", "TOP_SITES_UPDATED", "TOTAL_BOOKMARKS_REQUEST", "TOTAL_BOOKMARKS_RESPONSE", "TRAILHEAD_ENROLL_EVENT", "UNINIT", "UPDATE_PINNED_SEARCH_SHORTCUTS", "UPDATE_SEARCH_SHORTCUTS", "UPDATE_SECTION_PREFS", "WEBEXT_CLICK", "WEBEXT_DISMISS"]) {
   actionTypes[type] = type;
 } // These are acceptable actions for AS Router messages to have. They can show up
 // as call-to-action buttons in snippets, onboarding tour, etc.
 
 
 const ASRouterActions = {};
 
 for (const type of ["INSTALL_ADDON_FROM_URL", "OPEN_APPLICATIONS_MENU", "OPEN_PRIVATE_BROWSER_WINDOW", "OPEN_URL", "OPEN_ABOUT_PAGE", "OPEN_PREFERENCES_PAGE", "SHOW_FIREFOX_ACCOUNTS", "PIN_CURRENT_TAB", "ENABLE_FIREFOX_MONITOR", "OPEN_PROTECTION_PANEL"]) {
@@ -557,25 +557,25 @@ var actionUtils = {
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_Base", function() { return _Base; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BaseContent", function() { return BaseContent; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Base", function() { return Base; });
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
 /* harmony import */ var content_src_components_ASRouterAdmin_ASRouterAdmin__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4);
 /* harmony import */ var _asrouter_asrouter_content__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(5);
-/* harmony import */ var content_src_components_ConfirmDialog_ConfirmDialog__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(29);
-/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(27);
+/* harmony import */ var content_src_components_ConfirmDialog_ConfirmDialog__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(28);
+/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(26);
 /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_4__);
-/* harmony import */ var content_src_components_DiscoveryStreamBase_DiscoveryStreamBase__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(57);
-/* harmony import */ var content_src_components_ErrorBoundary_ErrorBoundary__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(38);
+/* harmony import */ var content_src_components_DiscoveryStreamBase_DiscoveryStreamBase__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(56);
+/* harmony import */ var content_src_components_ErrorBoundary_ErrorBoundary__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(37);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(9);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_7__);
-/* harmony import */ var content_src_components_Search_Search__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(55);
-/* harmony import */ var content_src_components_Sections_Sections__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(43);
+/* harmony import */ var content_src_components_Search_Search__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(54);
+/* harmony import */ var content_src_components_Sections_Sections__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(42);
 function _extends() { _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; }; return _extends.apply(this, arguments); }
 
 /* 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/. */
 
 
 
@@ -754,22 +754,22 @@ const Base = Object(react_redux__WEBPACK
 /* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ToggleStoryButton", function() { return ToggleStoryButton; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TogglePrefCheckbox", function() { return TogglePrefCheckbox; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DiscoveryStreamAdmin", function() { return DiscoveryStreamAdmin; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ASRouterAdminInner", function() { return ASRouterAdminInner; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CollapseToggle", function() { return CollapseToggle; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ASRouterAdmin", function() { return ASRouterAdmin; });
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
 /* harmony import */ var _asrouter_asrouter_content__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5);
-/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(27);
+/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(26);
 /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_2__);
 /* harmony import */ var _asrouter_components_ModalOverlay_ModalOverlay__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(21);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(9);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__);
-/* harmony import */ var _SimpleHashRouter__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(28);
+/* harmony import */ var _SimpleHashRouter__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(27);
 function _extends() { _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; }; return _extends.apply(this, arguments); }
 
 /* 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/. */
 
 
 
@@ -1756,26 +1756,26 @@ const ASRouterAdmin = Object(react_redux
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ASRouterUtils", function() { return ASRouterUtils; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ASRouterUISurface", function() { return ASRouterUISurface; });
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
 /* harmony import */ var content_src_lib_init_store__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6);
-/* harmony import */ var _rich_text_strings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(60);
+/* harmony import */ var _rich_text_strings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(59);
 /* harmony import */ var _components_ImpressionsWrapper_ImpressionsWrapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(8);
-/* harmony import */ var fluent_react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(58);
+/* harmony import */ var fluent_react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(57);
 /* harmony import */ var content_src_lib_constants__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(11);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(9);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_6__);
 /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(12);
 /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_7__);
-/* harmony import */ var _templates_template_manifest__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(59);
-/* harmony import */ var _templates_FirstRun_FirstRun__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(62);
+/* harmony import */ var _templates_template_manifest__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(58);
+/* harmony import */ var _templates_FirstRun_FirstRun__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(61);
 function _extends() { _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; }; return _extends.apply(this, arguments); }
 
 /* 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/. */
 
 
 
@@ -1783,17 +1783,17 @@ function _extends() { _extends = Object.
 
 
 
 
 
 
 const INCOMING_MESSAGE_NAME = "ASRouter:parent-to-child";
 const OUTGOING_MESSAGE_NAME = "ASRouter:child-to-parent";
-const TEMPLATES_ABOVE_PAGE = ["trailhead", "fxa_overlay", "return_to_amo_overlay", "extended_triplets"];
+const TEMPLATES_ABOVE_PAGE = ["trailhead", "return_to_amo_overlay", "extended_triplets"];
 const FIRST_RUN_TEMPLATES = TEMPLATES_ABOVE_PAGE;
 const TEMPLATES_BELOW_SEARCH = ["simple_below_search_snippet"];
 const ASRouterUtils = {
   addListener(listener) {
     if (global.RPMAddMessageListener) {
       global.RPMAddMessageListener(INCOMING_MESSAGE_NAME, listener);
     }
   },
@@ -2580,20 +2580,20 @@ module.exports = {"title":"EOYSnippet","
 /***/ }),
 /* 14 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "convertLinks", function() { return convertLinks; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RichText", function() { return RichText; });
-/* harmony import */ var fluent_react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(58);
+/* harmony import */ var fluent_react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(57);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(9);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
-/* harmony import */ var _rich_text_strings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(60);
+/* harmony import */ var _rich_text_strings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(59);
 /* harmony import */ var _template_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(15);
 function _extends() { _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; }; return _extends.apply(this, arguments); }
 
 /* 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/. */
 
 
@@ -2993,17 +2993,19 @@ Trailhead.defaultProps = {
 /* 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 ModalOverlayWrapper extends react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent {
   constructor(props) {
     super(props);
     this.onKeyDown = this.onKeyDown.bind(this);
-  }
+  } // The intended behaviour is to listen for an escape key
+  // but not for a click; see Bug 1582242
+
 
   onKeyDown(event) {
     if (event.key === "Escape") {
       this.props.onClose(event);
     }
   }
 
   componentWillMount() {
@@ -3034,25 +3036,28 @@ class ModalOverlayWrapper extends react_
     let className = props.unstyled ? "" : "modalOverlayInner active";
 
     if (props.innerClassName) {
       className += ` ${props.innerClassName}`;
     }
 
     return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
       className: "modalOverlayOuter active",
-      onClick: props.onClose,
       onKeyDown: this.onKeyDown,
       role: "presentation"
     }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
       className: className,
       "aria-labelledby": props.headerId,
       id: props.id,
       role: "dialog"
-    }, props.children));
+    }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("button", {
+      className: "icon icon-dismiss",
+      onClick: props.onClose,
+      "data-l10n-id": "onboarding-cards-dismiss"
+    }), props.children));
   }
 
 }
 ModalOverlayWrapper.defaultProps = {
   document: global.document
 };
 class ModalOverlay extends react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent {
   render() {
@@ -3211,257 +3216,20 @@ class ReturnToAMO extends react__WEBPACK
 /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1)))
 
 /***/ }),
 /* 24 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
-/* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "StartupOverlay", function() { return StartupOverlay; });
-/* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(9);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
-/* 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 StartupOverlay extends react__WEBPACK_IMPORTED_MODULE_1___default.a.PureComponent {
-  constructor(props) {
-    super(props);
-    this.onInputChange = this.onInputChange.bind(this);
-    this.onSubmit = this.onSubmit.bind(this);
-    this.clickSkip = this.clickSkip.bind(this);
-    this.removeOverlay = this.removeOverlay.bind(this);
-    this.onInputInvalid = this.onInputInvalid.bind(this);
-    this.utmParams = "utm_source=activity-stream&utm_campaign=firstrun&utm_medium=referral&utm_term=trailhead-control";
-    this.state = {
-      show: false,
-      emailInput: ""
-    };
-  }
-
-  componentWillMount() {
-    global.document.body.classList.add("fxa");
-  }
-
-  componentDidMount() {
-    // Timeout to allow the scene to render once before attaching the attribute
-    // to trigger the animation.
-    setTimeout(() => {
-      this.setState({
-        show: true
-      });
-    }, 10); // Hide the page content from screen readers while the modal is open
-
-    this.props.document.getElementById("root").setAttribute("aria-hidden", "true");
-  }
-
-  removeOverlay() {
-    window.removeEventListener("visibilitychange", this.removeOverlay);
-    document.body.classList.remove("hide-main", "fxa");
-    this.setState({
-      show: false
-    }); // Re-enable the document for screen readers
-
-    this.props.document.getElementById("root").setAttribute("aria-hidden", "false");
-    setTimeout(() => {
-      // Allow scrolling and fully remove overlay after animation finishes.
-      this.props.onBlock();
-      document.body.classList.remove("welcome");
-    }, 400);
-  }
-
-  onInputChange(e) {
-    let error = e.target.previousSibling;
-    this.setState({
-      emailInput: e.target.value
-    });
-    error.classList.remove("active");
-    e.target.classList.remove("invalid");
-  }
-
-  onSubmit() {
-    this.props.dispatch(common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].UserEvent({
-      event: "SUBMIT_EMAIL",
-      ...this._getFormInfo()
-    }));
-    window.addEventListener("visibilitychange", this.removeOverlay);
-  }
-
-  clickSkip() {
-    this.props.dispatch(common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].UserEvent({
-      event: "SKIPPED_SIGNIN",
-      ...this._getFormInfo()
-    }));
-    this.removeOverlay();
-  }
-  /**
-   * Report to telemetry additional information about the form submission.
-   */
-
-
-  _getFormInfo() {
-    const value = {
-      has_flow_params: !!this.props.flowParams.flowId.length
-    };
-    return {
-      value
-    };
-  }
-
-  onInputInvalid(e) {
-    let error = e.target.previousSibling;
-    error.classList.add("active");
-    e.target.classList.add("invalid");
-    e.preventDefault(); // Override built-in form validation popup
-
-    e.target.focus();
-  }
-
-  render() {
-    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
-      className: `overlay-wrapper ${this.state.show ? "show" : ""}`
-    }, react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
-      className: "background"
-    }), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
-      className: "firstrun-scene"
-    }, react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
-      className: "fxaccounts-container"
-    }, react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
-      className: "firstrun-left-divider"
-    }, react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("h1", {
-      className: "firstrun-title",
-      "data-l10n-id": "onboarding-sync-welcome-header"
-    }), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("p", {
-      className: "firstrun-content",
-      "data-l10n-id": "onboarding-sync-welcome-content"
-    }), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("a", {
-      className: "firstrun-link",
-      href: `https://www.mozilla.org/firefox/features/sync/?${this.utmParams}`,
-      target: "_blank",
-      rel: "noopener noreferrer",
-      "data-l10n-id": "onboarding-sync-welcome-learn-more-link"
-    })), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
-      className: "firstrun-sign-in"
-    }, react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("p", {
-      className: "form-header"
-    }, react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("span", {
-      "data-l10n-id": "onboarding-sync-form-header"
-    }), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("span", {
-      className: "sub-header",
-      "data-l10n-id": "onboarding-sync-form-sub-header"
-    })), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("form", {
-      method: "get",
-      action: this.props.fxa_endpoint,
-      target: "_blank",
-      rel: "noopener noreferrer",
-      onSubmit: this.onSubmit
-    }, react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("input", {
-      name: "service",
-      type: "hidden",
-      value: "sync"
-    }), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("input", {
-      name: "action",
-      type: "hidden",
-      value: "email"
-    }), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("input", {
-      name: "context",
-      type: "hidden",
-      value: "fx_desktop_v3"
-    }), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("input", {
-      name: "entrypoint",
-      type: "hidden",
-      value: "activity-stream-firstrun"
-    }), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("input", {
-      name: "utm_source",
-      type: "hidden",
-      value: "activity-stream"
-    }), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("input", {
-      name: "utm_campaign",
-      type: "hidden",
-      value: "firstrun"
-    }), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("input", {
-      name: "utm_medium",
-      type: "hidden",
-      value: "referral"
-    }), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("input", {
-      name: "utm_term",
-      type: "hidden",
-      value: "trailhead-control"
-    }), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("input", {
-      name: "device_id",
-      type: "hidden",
-      value: this.props.flowParams.deviceId
-    }), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("input", {
-      name: "flow_id",
-      type: "hidden",
-      value: this.props.flowParams.flowId
-    }), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("input", {
-      name: "flow_begin_time",
-      type: "hidden",
-      value: this.props.flowParams.flowBeginTime
-    }), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("span", {
-      className: "error",
-      "data-l10n-id": "onboarding-sync-form-invalid-input"
-    }), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("input", {
-      className: "email-input",
-      name: "email",
-      type: "email",
-      required: true,
-      onInvalid: this.onInputInvalid,
-      onChange: this.onInputChange,
-      "data-l10n-id": "onboarding-sync-form-input"
-    }), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
-      className: "extra-links"
-    }, react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("p", {
-      "data-l10n-id": "onboarding-sync-legal-notice"
-    }, react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("a", {
-      "data-l10n-name": "terms",
-      target: "_blank",
-      rel: "noopener noreferrer",
-      href: `${this.props.fxa_endpoint}/legal/terms?${this.utmParams}`
-    }), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("a", {
-      "data-l10n-name": "privacy",
-      target: "_blank",
-      rel: "noopener noreferrer",
-      href: `${this.props.fxa_endpoint}/legal/privacy?${this.utmParams}`
-    }))), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("button", {
-      className: "continue-button",
-      type: "submit",
-      "data-l10n-id": "onboarding-sync-form-continue-button"
-    })), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("button", {
-      className: "skip-button",
-      disabled: !!this.state.emailInput,
-      onClick: this.clickSkip,
-      "data-l10n-id": "onboarding-sync-form-skip-login-button"
-    })))));
-  }
-
-}
-StartupOverlay.defaultProps = {
-  flowParams: {
-    deviceId: "",
-    flowId: "",
-    flowBeginTime: ""
-  }
-};
-/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1)))
-
-/***/ }),
-/* 25 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
 /* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Triplets", function() { return Triplets; });
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
-/* harmony import */ var _templates_OnboardingMessage_OnboardingMessage__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(26);
+/* harmony import */ var _templates_OnboardingMessage_OnboardingMessage__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(25);
 /* harmony import */ var _addUtmParams__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(22);
 function _extends() { _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; }; return _extends.apply(this, arguments); }
 
 /* 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/. */
 
 
@@ -3553,17 +3321,17 @@ class Triplets extends react__WEBPACK_IM
       "data-l10n-id": "onboarding-cards-dismiss"
     })));
   }
 
 }
 /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1)))
 
 /***/ }),
-/* 26 */
+/* 25 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OnboardingCard", function() { return OnboardingCard; });
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
 /* This Source Code Form is subject to the terms of the Mozilla Public
@@ -3613,23 +3381,23 @@ class OnboardingCard extends react__WEBP
       className: "button onboardingButton",
       onClick: this.onClick
     }))));
   }
 
 }
 
 /***/ }),
-/* 27 */
+/* 26 */
 /***/ (function(module, exports) {
 
 module.exports = ReactRedux;
 
 /***/ }),
-/* 28 */
+/* 27 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SimpleHashRouter", function() { return SimpleHashRouter; });
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
 /* This Source Code Form is subject to the terms of the Mozilla Public
@@ -3668,25 +3436,25 @@ class SimpleHashRouter extends react__WE
       }
     });
   }
 
 }
 /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1)))
 
 /***/ }),
-/* 29 */
+/* 28 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_ConfirmDialog", function() { return _ConfirmDialog; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ConfirmDialog", function() { return ConfirmDialog; });
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
-/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(27);
+/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(26);
 /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(9);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_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/. */
 
 
@@ -3773,28 +3541,28 @@ class _ConfirmDialog extends react__WEBP
       "data-l10n-id": this.props.data.confirm_button_string_id
     }))));
   }
 
 }
 const ConfirmDialog = Object(react_redux__WEBPACK_IMPORTED_MODULE_1__["connect"])(state => state.Dialog)(_ConfirmDialog);
 
 /***/ }),
-/* 30 */
+/* 29 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_LinkMenu", function() { return _LinkMenu; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LinkMenu", function() { return LinkMenu; });
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
-/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(27);
+/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(26);
 /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_1__);
-/* harmony import */ var content_src_components_ContextMenu_ContextMenu__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(31);
-/* harmony import */ var content_src_lib_link_menu_options__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(32);
+/* harmony import */ var content_src_components_ContextMenu_ContextMenu__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(30);
+/* harmony import */ var content_src_lib_link_menu_options__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(31);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(9);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__);
 /* 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/. */
 
 
 
@@ -3868,17 +3636,17 @@ class _LinkMenu extends react__WEBPACK_I
 const getState = state => ({
   isPrivateBrowsingEnabled: state.Prefs.values.isPrivateBrowsingEnabled,
   platform: state.Prefs.values.platform
 });
 
 const LinkMenu = Object(react_redux__WEBPACK_IMPORTED_MODULE_1__["connect"])(getState)(_LinkMenu);
 
 /***/ }),
-/* 31 */
+/* 30 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ContextMenu", function() { return ContextMenu; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ContextMenuItem", function() { return ContextMenuItem; });
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
@@ -4046,17 +3814,17 @@ class ContextMenuItem extends react__WEB
       "data-l10n-id": option.string_id || option.id
     })));
   }
 
 }
 /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1)))
 
 /***/ }),
-/* 32 */
+/* 31 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LinkMenuOptions", function() { return LinkMenuOptions; });
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(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,
@@ -4084,16 +3852,23 @@ const _OpenInPrivateWindow = site => ({
 
 const LinkMenuOptions = {
   Separator: () => ({
     type: "separator"
   }),
   EmptyItem: () => ({
     type: "empty"
   }),
+  ShowPrivacyInfo: site => ({
+    id: "newtab-menu-show-privacy-info",
+    icon: "info",
+    action: {
+      type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].SHOW_PRIVACY_INFO
+    }
+  }),
   RemoveBookmark: site => ({
     id: "newtab-menu-remove-bookmark",
     icon: "bookmark-added",
     action: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].AlsoToMain({
       type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].DELETE_BOOKMARK_BY_ID,
       data: site.bookmarkGuid
     }),
     userEvent: "BOOKMARK_DELETE"
@@ -4344,17 +4119,17 @@ const LinkMenuOptions = {
   CheckBookmark: site => site.bookmarkGuid ? LinkMenuOptions.RemoveBookmark(site) : LinkMenuOptions.AddBookmark(site),
   CheckPinTopSite: (site, index) => site.isPinned ? LinkMenuOptions.UnpinTopSite(site) : LinkMenuOptions.PinTopSite(site, index),
   CheckSavedToPocket: (site, index) => site.pocket_id ? LinkMenuOptions.DeleteFromPocket(site) : LinkMenuOptions.SaveToPocket(site, index),
   CheckBookmarkOrArchive: site => site.pocket_id ? LinkMenuOptions.ArchiveFromPocket(site) : LinkMenuOptions.CheckBookmark(site),
   OpenInPrivateWindow: (site, index, eventSource, isEnabled) => isEnabled ? _OpenInPrivateWindow(site) : LinkMenuOptions.EmptyItem()
 };
 
 /***/ }),
-/* 33 */
+/* 32 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ContextMenuButton", function() { return ContextMenuButton; });
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
 /* This Source Code Form is subject to the terms of the Mozilla Public
@@ -4429,17 +4204,17 @@ class ContextMenuButton extends react__W
       keyboardAccess: contextMenuKeyboard,
       onUpdate: this.onUpdate
     }) : null);
   }
 
 }
 
 /***/ }),
-/* 34 */
+/* 33 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "INTERSECTION_RATIO", function() { return INTERSECTION_RATIO; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ImpressionStats", function() { return ImpressionStats; });
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(9);
@@ -4651,17 +4426,17 @@ ImpressionStats.defaultProps = {
   IntersectionObserver: global.IntersectionObserver,
   document: global.document,
   rows: [],
   source: ""
 };
 /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1)))
 
 /***/ }),
-/* 35 */
+/* 34 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cardContextTypes", function() { return cardContextTypes; });
 /* 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/. */
@@ -4688,36 +4463,36 @@ const cardContextTypes = {
   },
   download: {
     fluentID: "newtab-label-download",
     icon: "download"
   }
 };
 
 /***/ }),
-/* 36 */
+/* 35 */
 /***/ (function(module, exports) {
 
 module.exports = ReactTransitionGroup;
 
 /***/ }),
-/* 37 */
+/* 36 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CollapsibleSection", function() { return CollapsibleSection; });
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
-/* harmony import */ var content_src_components_ErrorBoundary_ErrorBoundary__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(38);
-/* harmony import */ var content_src_components_FluentOrText_FluentOrText__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(40);
+/* harmony import */ var content_src_components_ErrorBoundary_ErrorBoundary__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(37);
+/* harmony import */ var content_src_components_FluentOrText_FluentOrText__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(39);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(9);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);
-/* harmony import */ var content_src_components_SectionMenu_SectionMenu__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(41);
-/* harmony import */ var content_src_lib_section_menu_options__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(42);
-/* harmony import */ var content_src_components_ContextMenu_ContextMenuButton__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(33);
+/* harmony import */ var content_src_components_SectionMenu_SectionMenu__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(40);
+/* harmony import */ var content_src_lib_section_menu_options__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(41);
+/* harmony import */ var content_src_components_ContextMenu_ContextMenuButton__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(32);
 /* 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/. */
 
 
 
 
 
@@ -4983,24 +4758,24 @@ CollapsibleSection.defaultProps = {
   },
   Prefs: {
     values: {}
   }
 };
 /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1)))
 
 /***/ }),
-/* 38 */
+/* 37 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ErrorBoundaryFallback", function() { return ErrorBoundaryFallback; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ErrorBoundary", function() { return ErrorBoundary; });
-/* harmony import */ var content_src_components_A11yLinkButton_A11yLinkButton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(39);
+/* harmony import */ var content_src_components_A11yLinkButton_A11yLinkButton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(38);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(9);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
 /* 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 ErrorBoundaryFallback extends react__WEBPACK_IMPORTED_MODULE_1___default.a.PureComponent {
@@ -5070,17 +4845,17 @@ class ErrorBoundary extends react__WEBPA
   }
 
 }
 ErrorBoundary.defaultProps = {
   FallbackComponent: ErrorBoundaryFallback
 };
 
 /***/ }),
-/* 39 */
+/* 38 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "A11yLinkButton", function() { return A11yLinkButton; });
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
 function _extends() { _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; }; return _extends.apply(this, arguments); }
@@ -5100,17 +4875,17 @@ function A11yLinkButton(props) {
   return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("button", _extends({
     type: "button"
   }, props, {
     className: className
   }), props.children);
 }
 
 /***/ }),
-/* 40 */
+/* 39 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FluentOrText", function() { return FluentOrText; });
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
 /* This Source Code Form is subject to the terms of the Mozilla Public
@@ -5146,28 +4921,28 @@ class FluentOrText extends react__WEBPAC
 
 
     return react__WEBPACK_IMPORTED_MODULE_0___default.a.cloneElement(child, extraProps, grandChildren);
   }
 
 }
 
 /***/ }),
-/* 41 */
+/* 40 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_SectionMenu", function() { return _SectionMenu; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SectionMenu", function() { return SectionMenu; });
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
-/* harmony import */ var content_src_components_ContextMenu_ContextMenu__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(31);
+/* harmony import */ var content_src_components_ContextMenu_ContextMenu__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(30);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(9);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
-/* harmony import */ var content_src_lib_section_menu_options__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(42);
+/* harmony import */ var content_src_lib_section_menu_options__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(41);
 /* 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 DEFAULT_SECTION_MENU_OPTIONS = ["MoveUp", "MoveDown", "Separator", "RemoveSection", "CheckCollapsed", "Separator", "ManageSection"];
@@ -5252,17 +5027,17 @@ class _SectionMenu extends react__WEBPAC
       keyboardAccess: this.props.keyboardAccess
     });
   }
 
 }
 const SectionMenu = _SectionMenu;
 
 /***/ }),
-/* 42 */
+/* 41 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SectionMenuOptions", function() { return SectionMenuOptions; });
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(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,
@@ -5382,38 +5157,38 @@ const SectionMenuOptions = {
       }
     }),
     userEvent: "MENU_PRIVACY_NOTICE"
   }),
   CheckCollapsed: section => section.collapsed ? SectionMenuOptions.ExpandSection(section) : SectionMenuOptions.CollapseSection(section)
 };
 
 /***/ }),
-/* 43 */
+/* 42 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Section", function() { return Section; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SectionIntl", function() { return SectionIntl; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_Sections", function() { return _Sections; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Sections", function() { return Sections; });
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
-/* harmony import */ var content_src_components_Card_Card__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(44);
-/* harmony import */ var content_src_components_CollapsibleSection_CollapsibleSection__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(37);
-/* harmony import */ var content_src_components_ComponentPerfTimer_ComponentPerfTimer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(46);
-/* harmony import */ var content_src_components_FluentOrText_FluentOrText__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(40);
-/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(27);
+/* harmony import */ var content_src_components_Card_Card__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(43);
+/* harmony import */ var content_src_components_CollapsibleSection_CollapsibleSection__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(36);
+/* harmony import */ var content_src_components_ComponentPerfTimer_ComponentPerfTimer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(45);
+/* harmony import */ var content_src_components_FluentOrText_FluentOrText__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(39);
+/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(26);
 /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_5__);
-/* harmony import */ var content_src_components_MoreRecommendations_MoreRecommendations__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(48);
-/* harmony import */ var content_src_components_PocketLoggedInCta_PocketLoggedInCta__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(49);
+/* harmony import */ var content_src_components_MoreRecommendations_MoreRecommendations__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(47);
+/* harmony import */ var content_src_components_PocketLoggedInCta_PocketLoggedInCta__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(48);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(9);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_8__);
-/* harmony import */ var content_src_components_Topics_Topics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(50);
-/* harmony import */ var content_src_components_TopSites_TopSites__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(51);
+/* harmony import */ var content_src_components_Topics_Topics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(49);
+/* harmony import */ var content_src_components_TopSites_TopSites__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(50);
 function _extends() { _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; }; return _extends.apply(this, arguments); }
 
 /* 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/. */
 
 
 
@@ -5753,33 +5528,33 @@ class _Sections extends react__WEBPACK_I
 }
 const Sections = Object(react_redux__WEBPACK_IMPORTED_MODULE_5__["connect"])(state => ({
   Sections: state.Sections,
   Prefs: state.Prefs
 }))(_Sections);
 /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1)))
 
 /***/ }),
-/* 44 */
+/* 43 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_Card", function() { return _Card; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Card", function() { return Card; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PlaceholderCard", function() { return PlaceholderCard; });
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
-/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(35);
-/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(27);
+/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(34);
+/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(26);
 /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_2__);
-/* harmony import */ var content_src_components_ContextMenu_ContextMenuButton__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(33);
-/* harmony import */ var content_src_components_LinkMenu_LinkMenu__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(30);
+/* harmony import */ var content_src_components_ContextMenu_ContextMenuButton__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(32);
+/* harmony import */ var content_src_components_LinkMenu_LinkMenu__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(29);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(9);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__);
-/* harmony import */ var content_src_lib_screenshot_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(45);
+/* harmony import */ var content_src_lib_screenshot_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(44);
 /* 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/. */
 
 
 
 
 
@@ -6098,17 +5873,17 @@ const Card = Object(react_redux__WEBPACK
   platform: state.Prefs.values.platform
 }))(_Card);
 const PlaceholderCard = props => react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(Card, {
   placeholder: true,
   className: props.className
 });
 
 /***/ }),
-/* 45 */
+/* 44 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ScreenshotUtils", function() { return ScreenshotUtils; });
 /* 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/. */
@@ -6167,24 +5942,24 @@ const ScreenshotUtils = {
 
     return !remoteImage && !localImage;
   }
 
 };
 /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1)))
 
 /***/ }),
-/* 46 */
+/* 45 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ComponentPerfTimer", function() { return ComponentPerfTimer; });
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
-/* harmony import */ var common_PerfService_jsm__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(47);
+/* harmony import */ var common_PerfService_jsm__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(46);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(9);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_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/. */
 
 
  // Currently record only a fixed set of sections. This will prevent data
@@ -6347,17 +6122,17 @@ class ComponentPerfTimer extends react__
     }
 
     return this.props.children;
   }
 
 }
 
 /***/ }),
-/* 47 */
+/* 46 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_PerfService", function() { return _PerfService; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "perfService", function() { return perfService; });
 /* 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,
@@ -6479,17 +6254,17 @@ function _PerfService(options) {
     let mostRecentEntry = entries[entries.length - 1];
     return this._perf.timeOrigin + mostRecentEntry.startTime;
   }
 
 };
 var perfService = new _PerfService();
 
 /***/ }),
-/* 48 */
+/* 47 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MoreRecommendations", function() { return MoreRecommendations; });
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
 /* This Source Code Form is subject to the terms of the Mozilla Public
@@ -6511,24 +6286,24 @@ class MoreRecommendations extends react_
     }
 
     return null;
   }
 
 }
 
 /***/ }),
-/* 49 */
+/* 48 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_PocketLoggedInCta", function() { return _PocketLoggedInCta; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PocketLoggedInCta", function() { return PocketLoggedInCta; });
-/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(27);
+/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(26);
 /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_0__);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(9);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
 /* 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/. */
 
 
@@ -6554,17 +6329,17 @@ class _PocketLoggedInCta extends react__
   }
 
 }
 const PocketLoggedInCta = Object(react_redux__WEBPACK_IMPORTED_MODULE_0__["connect"])(state => ({
   Pocket: state.Pocket
 }))(_PocketLoggedInCta);
 
 /***/ }),
-/* 50 */
+/* 49 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Topic", function() { return Topic; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Topics", function() { return Topics; });
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
@@ -6599,36 +6374,36 @@ class Topics extends react__WEBPACK_IMPO
       url: t.url,
       name: t.name
     }))));
   }
 
 }
 
 /***/ }),
-/* 51 */
+/* 50 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_TopSites", function() { return _TopSites; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TopSites", function() { return TopSites; });
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
-/* harmony import */ var _TopSitesConstants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(52);
-/* harmony import */ var content_src_components_CollapsibleSection_CollapsibleSection__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(37);
-/* harmony import */ var content_src_components_ComponentPerfTimer_ComponentPerfTimer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(46);
-/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(27);
+/* harmony import */ var _TopSitesConstants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(51);
+/* harmony import */ var content_src_components_CollapsibleSection_CollapsibleSection__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(36);
+/* harmony import */ var content_src_components_ComponentPerfTimer_ComponentPerfTimer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(45);
+/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(26);
 /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_4__);
 /* harmony import */ var _asrouter_components_ModalOverlay_ModalOverlay__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(21);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(9);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_6__);
-/* harmony import */ var _SearchShortcutsForm__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(53);
-/* harmony import */ var common_Reducers_jsm__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(61);
-/* harmony import */ var _TopSiteForm__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(63);
-/* harmony import */ var _TopSite__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(54);
+/* harmony import */ var _SearchShortcutsForm__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(52);
+/* harmony import */ var common_Reducers_jsm__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(60);
+/* harmony import */ var _TopSiteForm__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(62);
+/* harmony import */ var _TopSite__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(53);
 function _extends() { _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; }; return _extends.apply(this, arguments); }
 
 /* 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/. */
 
 
 
@@ -6826,17 +6601,17 @@ const TopSites = Object(react_redux__WEB
   // For SPOC Experiment only, take TopSites from DiscoveryStream TopSites that takes in SPOC Data
   TopSites: props.TopSitesWithSpoc || state.TopSites,
   Prefs: state.Prefs,
   TopSitesRows: state.Prefs.values.topSitesRows
 }))(_TopSites);
 /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1)))
 
 /***/ }),
-/* 52 */
+/* 51 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TOP_SITES_SOURCE", function() { return TOP_SITES_SOURCE; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TOP_SITES_CONTEXT_MENU_OPTIONS", function() { return TOP_SITES_CONTEXT_MENU_OPTIONS; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TOP_SITES_SPOC_CONTEXT_MENU_OPTIONS", function() { return TOP_SITES_SPOC_CONTEXT_MENU_OPTIONS; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TOP_SITES_SEARCH_SHORTCUTS_CONTEXT_MENU_OPTIONS", function() { return TOP_SITES_SEARCH_SHORTCUTS_CONTEXT_MENU_OPTIONS; });
@@ -6851,27 +6626,27 @@ const TOP_SITES_SPOC_CONTEXT_MENU_OPTION
 
 const TOP_SITES_SEARCH_SHORTCUTS_CONTEXT_MENU_OPTIONS = ["CheckPinTopSite", "Separator", "BlockUrl"]; // minimum size necessary to show a rich icon instead of a screenshot
 
 const MIN_RICH_FAVICON_SIZE = 96; // minimum size necessary to show any icon in the top left corner with a screenshot
 
 const MIN_CORNER_FAVICON_SIZE = 16;
 
 /***/ }),
-/* 53 */
+/* 52 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SelectableSearchShortcut", function() { return SelectableSearchShortcut; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SearchShortcutsForm", function() { return SearchShortcutsForm; });
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(9);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
-/* harmony import */ var _TopSitesConstants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(52);
+/* harmony import */ var _TopSitesConstants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(51);
 /* 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 SelectableSearchShortcut extends react__WEBPACK_IMPORTED_MODULE_1___default.a.PureComponent {
   render() {
@@ -7042,34 +6817,34 @@ class SearchShortcutsForm extends react_
       onClick: this.onSaveButtonClick,
       "data-l10n-id": "newtab-topsites-save-button"
     })));
   }
 
 }
 
 /***/ }),
-/* 54 */
+/* 53 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TopSiteLink", function() { return TopSiteLink; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TopSite", function() { return TopSite; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TopSitePlaceholder", function() { return TopSitePlaceholder; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TopSiteList", function() { return TopSiteList; });
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
-/* harmony import */ var _TopSitesConstants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(52);
-/* harmony import */ var content_src_components_LinkMenu_LinkMenu__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(30);
-/* harmony import */ var _DiscoveryStreamImpressionStats_ImpressionStats__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(34);
+/* harmony import */ var _TopSitesConstants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(51);
+/* harmony import */ var content_src_components_LinkMenu_LinkMenu__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(29);
+/* harmony import */ var _DiscoveryStreamImpressionStats_ImpressionStats__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(33);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(9);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__);
-/* harmony import */ var content_src_lib_screenshot_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(45);
-/* harmony import */ var common_Reducers_jsm__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(61);
-/* harmony import */ var content_src_components_ContextMenu_ContextMenuButton__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(33);
+/* harmony import */ var content_src_lib_screenshot_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(44);
+/* harmony import */ var common_Reducers_jsm__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(60);
+/* harmony import */ var content_src_components_ContextMenu_ContextMenuButton__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(32);
 function _extends() { _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; }; return _extends.apply(this, arguments); }
 
 /* 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/. */
 
 
 
@@ -7366,16 +7141,20 @@ class TopSite extends react__WEBPACK_IMP
     }
 
     if (this.props.link.searchTopSite) {
       // Set the card_type as "search" regardless of its pinning status
       value.card_type = "search";
       value.search_vendor = this.props.link.hostname;
     }
 
+    if (this.props.link.type === SPOC_TYPE) {
+      value.card_type = "spoc";
+    }
+
     return {
       value
     };
   }
 
   userEvent(event) {
     this.props.dispatch(common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].UserEvent(Object.assign({
       event,
@@ -7715,25 +7494,25 @@ class TopSiteList extends react__WEBPACK
     return react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("ul", {
       className: `top-sites-list${this.state.draggedSite ? " dnd-active" : ""}`
     }, topSitesUI);
   }
 
 }
 
 /***/ }),
-/* 55 */
+/* 54 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_Search", function() { return _Search; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Search", function() { return Search; });
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
-/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(27);
+/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(26);
 /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var content_src_lib_constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(11);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(9);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);
 /* 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/. */
 
@@ -7908,24 +7687,24 @@ class _Search extends react__WEBPACK_IMP
 
 const getState = state => ({
   permanentPrivateBrowsing: state.App.permanentPrivateBrowsing
 });
 
 const Search = Object(react_redux__WEBPACK_IMPORTED_MODULE_1__["connect"])(getState)(_Search);
 
 /***/ }),
-/* 56 */
+/* 55 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DetectUserSessionStart", function() { return DetectUserSessionStart; });
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
-/* harmony import */ var common_PerfService_jsm__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(47);
+/* harmony import */ var common_PerfService_jsm__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(46);
 /* 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 VISIBLE = "visible";
 const VISIBILITY_CHANGE_EVENT = "visibilitychange";
 class DetectUserSessionStart {
@@ -7990,17 +7769,17 @@ class DetectUserSessionStart {
       this.document.removeEventListener(VISIBILITY_CHANGE_EVENT, this._onVisibilityChange);
     }
   }
 
 }
 /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1)))
 
 /***/ }),
-/* 57 */
+/* 56 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 
 // EXTERNAL MODULE: ./common/Actions.jsm
 var Actions = __webpack_require__(2);
 
@@ -8151,20 +7930,20 @@ DSImage_DSImage.defaultProps = {
   // Unadulterated image URL to filter through Thumbor
   extraClassNames: null,
   // Additional classnames to append to component
   optimize: true,
   // Measure parent container to request exact sizes
   alt_text: null
 };
 // EXTERNAL MODULE: ./content-src/components/LinkMenu/LinkMenu.jsx
-var LinkMenu = __webpack_require__(30);
+var LinkMenu = __webpack_require__(29);
 
 // EXTERNAL MODULE: ./content-src/components/ContextMenu/ContextMenuButton.jsx
-var ContextMenuButton = __webpack_require__(33);
+var ContextMenuButton = __webpack_require__(32);
 
 // CONCATENATED MODULE: ./content-src/components/DiscoveryStreamComponents/DSLinkMenu/DSLinkMenu.jsx
 /* 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/. */
 
 
 
@@ -8199,17 +7978,17 @@ class DSLinkMenu_DSLinkMenu extends exte
     dsLinkMenuHostDiv.parentElement.classList.add("active");
   }
 
   render() {
     const {
       index,
       dispatch
     } = this.props;
-    const TOP_STORIES_CONTEXT_MENU_OPTIONS = ["CheckBookmarkOrArchive", "CheckSavedToPocket", "Separator", "OpenInNewWindow", "OpenInPrivateWindow", "Separator", "BlockUrl"];
+    const TOP_STORIES_CONTEXT_MENU_OPTIONS = ["ShowPrivacyInfo", "CheckBookmarkOrArchive", "CheckSavedToPocket", "Separator", "OpenInNewWindow", "OpenInPrivateWindow", "Separator", "BlockUrl"];
     const type = this.props.type || "DISCOVERY_STREAM";
     const title = this.props.title || this.props.source;
     return external_React_default.a.createElement("div", null, external_React_default.a.createElement(ContextMenuButton["ContextMenuButton"], {
       refFunction: this.contextMenuButtonRef,
       tooltip: "newtab-menu-content-tooltip",
       tooltipArgs: {
         title
       },
@@ -8235,17 +8014,17 @@ class DSLinkMenu_DSLinkMenu extends exte
   }
 
 }
 DSLinkMenu_DSLinkMenu.defaultProps = {
   windowObj: window // Added to support unit tests
 
 };
 // EXTERNAL MODULE: ./content-src/components/DiscoveryStreamImpressionStats/ImpressionStats.jsx
-var ImpressionStats = __webpack_require__(34);
+var ImpressionStats = __webpack_require__(33);
 
 // CONCATENATED MODULE: ./content-src/components/DiscoveryStreamComponents/SafeAnchor/SafeAnchor.jsx
 /* 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 SafeAnchor_SafeAnchor extends external_React_default.a.PureComponent {
@@ -8317,20 +8096,20 @@ class SafeAnchor_SafeAnchor extends exte
       href: this.safeURI(url),
       className: className,
       onClick: this.onClick
     }, this.props.children);
   }
 
 }
 // EXTERNAL MODULE: ./content-src/components/Card/types.js
-var types = __webpack_require__(35);
+var types = __webpack_require__(34);
 
 // EXTERNAL MODULE: external "ReactTransitionGroup"
-var external_ReactTransitionGroup_ = __webpack_require__(36);
+var external_ReactTransitionGroup_ = __webpack_require__(35);
 
 // CONCATENATED MODULE: ./content-src/components/DiscoveryStreamComponents/DSContextFooter/DSContextFooter.jsx
 /* 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/. */
 
 
  // Animation time is mirrored in DSContextFooter.scss
@@ -8345,32 +8124,34 @@ const StatusMessage = ({
   "aria-haspopup": "true",
   className: `story-badge-icon icon icon-${icon}`
 }), external_React_default.a.createElement("div", {
   className: "story-context-label",
   "data-l10n-id": fluentID
 }));
 class DSContextFooter_DSContextFooter extends external_React_default.a.PureComponent {
   render() {
+    // display_engagement_labels is based on pref `browser.newtabpage.activity-stream.discoverystream.engagementLabelEnabled`
     const {
       context,
       context_type,
-      engagement
+      engagement,
+      display_engagement_labels
     } = this.props;
     const {
       icon,
       fluentID
     } = types["cardContextTypes"][context_type] || {};
     return external_React_default.a.createElement("div", {
       className: "story-footer"
     }, context && external_React_default.a.createElement("p", {
       className: "story-sponsored-label clamp"
     }, context), external_React_default.a.createElement(external_ReactTransitionGroup_["TransitionGroup"], {
       component: null
-    }, !context && (context_type || engagement) && external_React_default.a.createElement(external_ReactTransitionGroup_["CSSTransition"], {
+    }, !context && (context_type || display_engagement_labels && engagement) && external_React_default.a.createElement(external_ReactTransitionGroup_["CSSTransition"], {
       key: fluentID,
       timeout: ANIMATION_DURATION,
       classNames: "story-animate"
     }, engagement && !context_type ? external_React_default.a.createElement("div", {
       className: "story-view-count"
     }, engagement) : external_React_default.a.createElement(StatusMessage, {
       icon: icon,
       fluentID: fluentID
@@ -8386,16 +8167,17 @@ class DSContextFooter_DSContextFooter ex
 
 
 
 
 
  // Default Meta that displays CTA as link if cta_variant in layout is set as "link"
 
 const DefaultMeta = ({
+  display_engagement_labels,
   source,
   title,
   excerpt,
   context,
   context_type,
   cta,
   engagement,
   cta_variant
@@ -8411,19 +8193,21 @@ const DefaultMeta = ({
   className: "excerpt clamp"
 }, excerpt), cta_variant === "link" && cta && external_React_default.a.createElement("div", {
   role: "link",
   className: "cta-link icon icon-arrow",
   tabIndex: "0"
 }, cta)), external_React_default.a.createElement(DSContextFooter_DSContextFooter, {
   context_type: context_type,
   context: context,
+  display_engagement_labels: display_engagement_labels,
   engagement: engagement
 }));
 const CTAButtonMeta = ({
+  display_engagement_labels,
   source,
   title,
   excerpt,
   context,
   context_type,
   cta,
   engagement,
   sponsor
@@ -8437,16 +8221,17 @@ const CTAButtonMeta = ({
   className: "title clamp"
 }, title), excerpt && external_React_default.a.createElement("p", {
   className: "excerpt clamp"
 }, excerpt)), context && cta && external_React_default.a.createElement("button", {
   className: "button cta-button"
 }, cta), !context && external_React_default.a.createElement(DSContextFooter_DSContextFooter, {
   context_type: context_type,
   context: context,
+  display_engagement_labels: display_engagement_labels,
   engagement: engagement
 }));
 class DSCard_DSCard extends external_React_default.a.PureComponent {
   constructor(props) {
     super(props);
     this.onLinkClick = this.onLinkClick.bind(this);
 
     this.setPlaceholderRef = element => {
@@ -8546,25 +8331,27 @@ class DSCard_DSCard extends external_Rea
       url: this.props.url
     }, external_React_default.a.createElement("div", {
       className: "img-wrapper"
     }, external_React_default.a.createElement(DSImage_DSImage, {
       extraClassNames: "img",
       source: this.props.image_src,
       rawSource: this.props.raw_image_src
     })), isButtonCTA ? external_React_default.a.createElement(CTAButtonMeta, {
+      display_engagement_labels: this.props.display_engagement_labels,
       source: this.props.source,
       title: this.props.title,
       excerpt: this.props.excerpt,
       context: this.props.context,
       context_type: this.props.context_type,
       engagement: this.props.engagement,
       cta: this.props.cta,
       sponsor: this.props.sponsor
     }) : external_React_default.a.createElement(DefaultMeta, {
+      display_engagement_labels: this.props.display_engagement_labels,
       source: this.props.source,
       title: this.props.title,
       excerpt: this.props.excerpt,
       context: this.props.context,
       engagement: this.props.engagement,
       context_type: this.props.context_type,
       cta: this.props.cta,
       cta_variant: this.props.cta_variant
@@ -8726,16 +8513,17 @@ class CardGrid_CardGrid extends external
         context: rec.context,
         sponsor: rec.sponsor,
         dispatch: this.props.dispatch,
         source: rec.domain,
         pocket_id: rec.pocket_id,
         context_type: rec.context_type,
         bookmarkGuid: rec.bookmarkGuid,
         engagement: rec.engagement,
+        display_engagement_labels: this.props.display_engagement_labels,
         cta: rec.cta,
         cta_variant: this.props.cta_variant
       }));
     }
 
     let divisibility = ``;
 
     if (this.props.items % 4 === 0) {
@@ -8773,23 +8561,23 @@ class CardGrid_CardGrid extends external
 
 }
 CardGrid_CardGrid.defaultProps = {
   border: `border`,
   items: 4 // Number of stories to display
 
 };
 // EXTERNAL MODULE: ./content-src/components/CollapsibleSection/CollapsibleSection.jsx
-var CollapsibleSection = __webpack_require__(37);
+var CollapsibleSection = __webpack_require__(36);
 
 // EXTERNAL MODULE: external "ReactRedux"
-var external_ReactRedux_ = __webpack_require__(27);
+var external_ReactRedux_ = __webpack_require__(26);
 
 // EXTERNAL MODULE: ./content-src/lib/link-menu-options.js
-var link_menu_options = __webpack_require__(32);
+var link_menu_options = __webpack_require__(31);
 
 // CONCATENATED MODULE: ./content-src/components/DiscoveryStreamComponents/DSDismiss/DSDismiss.jsx
 /* 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/. */
 
 
 
@@ -8878,16 +8666,64 @@ class DSMessage_DSMessage extends extern
       className: "title-text"
     }, this.props.title), this.props.link_text && this.props.link_url && external_React_default.a.createElement(SafeAnchor_SafeAnchor, {
       className: "link",
       url: this.props.link_url
     }, this.props.link_text)));
   }
 
 }
+// EXTERNAL MODULE: ./content-src/asrouter/components/ModalOverlay/ModalOverlay.jsx
+var ModalOverlay = __webpack_require__(21);
+
+// CONCATENATED MODULE: ./content-src/components/DiscoveryStreamComponents/DSPrivacyModal/DSPrivacyModal.jsx
+/* 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 DSPrivacyModal_DSPrivacyModal extends external_React_default.a.PureComponent {
+  constructor(props) {
+    super(props);
+    this.closeModal = this.closeModal.bind(this);
+  }
+
+  closeModal() {
+    this.props.dispatch({
+      type: `HIDE_PRIVACY_INFO`,
+      data: {}
+    });
+  }
+
+  render() {
+    return external_React_default.a.createElement(ModalOverlay["ModalOverlayWrapper"], {
+      onClose: this.closeModal,
+      innerClassName: "ds-privacy-modal"
+    }, external_React_default.a.createElement("div", {
+      className: "privacy-notice"
+    }, external_React_default.a.createElement("h3", {
+      "data-l10n-id": "newtab-privacy-modal-header"
+    }), external_React_default.a.createElement("p", {
+      "data-l10n-id": "newtab-privacy-modal-paragraph"
+    }), external_React_default.a.createElement(SafeAnchor_SafeAnchor, {
+      url: "https://www.mozilla.org/en-US/privacy/firefox/"
+    }, external_React_default.a.createElement("span", {
+      "data-l10n-id": "newtab-privacy-modal-link"
+    }))), external_React_default.a.createElement("section", {
+      className: "actions"
+    }, external_React_default.a.createElement("button", {
+      className: "done",
+      type: "submit",
+      onClick: this.closeModal,
+      "data-l10n-id": "newtab-privacy-modal-button-done"
+    })));
+  }
+
+}
 // CONCATENATED MODULE: ./content-src/components/DiscoveryStreamComponents/DSTextPromo/DSTextPromo.jsx
 /* 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/. */
 
 
 
 
@@ -9297,17 +9133,17 @@ class Hero_Hero extends external_React_d
 }
 Hero_Hero.defaultProps = {
   data: {},
   border: `border`,
   items: 1 // Number of stories to display
 
 };
 // EXTERNAL MODULE: ./content-src/components/Sections/Sections.jsx
-var Sections = __webpack_require__(43);
+var Sections = __webpack_require__(42);
 
 // CONCATENATED MODULE: ./content-src/components/DiscoveryStreamComponents/Highlights/Highlights.jsx
 function _extends() { _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; }; return _extends.apply(this, arguments); }
 
 /* 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/. */
 
@@ -9641,20 +9477,20 @@ const selectLayoutRender = (state, prefs
   }
 
   return {
     spocsFill,
     layoutRender
   };
 };
 // EXTERNAL MODULE: ./content-src/components/TopSites/TopSites.jsx
-var TopSites_TopSites = __webpack_require__(51);
+var TopSites_TopSites = __webpack_require__(50);
 
 // EXTERNAL MODULE: ./common/Reducers.jsm + 1 modules
-var Reducers = __webpack_require__(61);
+var Reducers = __webpack_require__(60);
 
 // CONCATENATED MODULE: ./content-src/components/DiscoveryStreamComponents/TopSites/TopSites.jsx
 /* 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/. */
 
 
 
@@ -9806,16 +9642,17 @@ const DiscoveryStreamComponents_TopSites
 
 
 
 
 
 
 
 
+
 const ALLOWED_CSS_URL_PREFIXES = ["chrome://", "resource://", "https://img-getpocket.cdn.mozilla.net/"];
 const DUMMY_CSS_SELECTOR = "DUMMY#CSS.SELECTOR";
 let rickRollCache = []; // Cache of random probability values for a spoc position
 
 /**
  * Validate a CSS declaration. The values are assumed to be normalized by CSSOM.
  */
 
@@ -9881,16 +9718,18 @@ class DiscoveryStreamBase_DiscoveryStrea
             console.error(`Bad CSS selector ${selectors}`); // eslint-disable-line no-console
           }
         });
       });
     });
   }
 
   renderComponent(component, embedWidth) {
+    const ENGAGEMENT_LABEL_ENABLED = this.props.Prefs.values[`discoverystream.engagementLabelEnabled`];
+
     switch (component.type) {
       case "Highlights":
         return external_React_default.a.createElement(Highlights, null);
 
       case "TopSites":
         let promoAlignment;
 
         if (component.spocs && component.spocs.positions && component.spocs.positions.length) {
@@ -9972,17 +9811,18 @@ class DiscoveryStreamBase_DiscoveryStrea
         return external_React_default.a.createElement(CardGrid_CardGrid, {
           title: component.header && component.header.title,
           data: component.data,
           feed: component.feed,
           border: component.properties.border,
           type: component.type,
           dispatch: this.props.dispatch,
           items: component.properties.items,
-          cta_variant: component.cta_variant
+          cta_variant: component.cta_variant,
+          display_engagement_labels: ENGAGEMENT_LABEL_ENABLED
         });
 
       case "Hero":
         return external_React_default.a.createElement(Hero_Hero, {
           subComponentType: embedWidth >= 9 ? `cards` : `list`,
           feed: component.feed,
           title: component.header && component.header.title,
           data: component.data,
@@ -10087,17 +9927,19 @@ class DiscoveryStreamBase_DiscoveryStrea
     const message = extractComponent("Message") || {
       header: {
         link_text: topStories.learnMore.link.message,
         link_url: topStories.learnMore.link.href,
         title: topStories.title
       }
     }; // Render a DS-style TopSites then the rest if any in a collapsible section
 
-    return external_React_default.a.createElement(external_React_default.a.Fragment, null, topSites && this.renderLayout([{
+    return external_React_default.a.createElement(external_React_default.a.Fragment, null, this.props.DiscoveryStream.isPrivacyInfoModalVisible && external_React_default.a.createElement(DSPrivacyModal_DSPrivacyModal, {
+      dispatch: this.props.dispatch
+    }), topSites && this.renderLayout([{
       width: 12,
       components: [topSites]
     }]), !!layoutRender.length && external_React_default.a.createElement(CollapsibleSection["CollapsibleSection"], {
       className: "ds-layout",
       collapsed: topStories.pref.collapsed,
       dispatch: this.props.dispatch,
       icon: topStories.icon,
       id: topStories.id,
@@ -10143,17 +9985,17 @@ class DiscoveryStreamBase_DiscoveryStrea
 }
 const DiscoveryStreamBase = Object(external_ReactRedux_["connect"])(state => ({
   DiscoveryStream: state.DiscoveryStream,
   Prefs: state.Prefs,
   Sections: state.Sections
 }))(DiscoveryStreamBase_DiscoveryStreamBase);
 
 /***/ }),
-/* 58 */
+/* 57 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 
 // EXTERNAL MODULE: external "React"
 var external_React_ = __webpack_require__(9);
 
@@ -10940,17 +10782,17 @@ localized_Localized.propTypes = {
  * components for more information.
  */
 
 
 
 
 
 /***/ }),
-/* 59 */
+/* 58 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 
 // EXTERNAL MODULE: external "React"
 var external_React_ = __webpack_require__(9);
 var external_React_default = /*#__PURE__*/__webpack_require__.n(external_React_);
@@ -12109,17 +11951,17 @@ const SnippetsTemplates = {
   newsletter_snippet: NewsletterSnippet,
   fxa_signup_snippet: FXASignupSnippet,
   send_to_device_snippet: SendToDeviceSnippet,
   eoy_snippet: EOYSnippet,
   simple_below_search_snippet: SimpleBelowSearchSnippet_SimpleBelowSearchSnippet
 };
 
 /***/ }),
-/* 60 */
+/* 59 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 
 // CONCATENATED MODULE: ./node_modules/fluent/src/types.js
 /* global Intl */
 
@@ -13529,17 +13371,17 @@ function generateBundles(content) {
     }
 
     bundle.addMessages(`${key} = ${string}`);
   });
   return [bundle];
 }
 
 /***/ }),
-/* 61 */
+/* 60 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 
 // EXTERNAL MODULE: ./common/Actions.jsm
 var Actions = __webpack_require__(2);
 
@@ -13645,16 +13487,17 @@ const INITIAL_STATE = {
   DiscoveryStream: {
     // This is a JSON-parsed copy of the discoverystream.config pref value.
     config: {
       enabled: false,
       layout_endpoint: ""
     },
     layout: [],
     lastUpdated: null,
+    isPrivacyInfoModalVisible: false,
     feeds: {
       data: {// "https://foo.com/feed1": {lastUpdated: 123, data: []}
       },
       loaded: false
     },
     spocs: {
       spocs_endpoint: "",
       spocs_per_domain: 1,
@@ -14263,16 +14106,26 @@ function DiscoveryStream(prevState = INI
       };
 
     case Actions["actionTypes"].DISCOVERY_STREAM_LAYOUT_UPDATE:
       return { ...prevState,
         lastUpdated: action.data.lastUpdated || null,
         layout: action.data.layout || []
       };
 
+    case Actions["actionTypes"].HIDE_PRIVACY_INFO:
+      return { ...prevState,
+        isPrivacyInfoModalVisible: false
+      };
+
+    case Actions["actionTypes"].SHOW_PRIVACY_INFO:
+      return { ...prevState,
+        isPrivacyInfoModalVisible: true
+      };
+
     case Actions["actionTypes"].DISCOVERY_STREAM_LAYOUT_RESET:
       return { ...INITIAL_STATE.DiscoveryStream,
         config: prevState.config
       };
 
     case Actions["actionTypes"].DISCOVERY_STREAM_FEEDS_UPDATE:
       return { ...prevState,
         feeds: { ...prevState.feeds,
@@ -14433,53 +14286,49 @@ var reducers = {
   Dialog,
   Sections,
   Pocket,
   DiscoveryStream,
   Search
 };
 
 /***/ }),
-/* 62 */
+/* 61 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 
 // EXTERNAL MODULE: external "React"
 var external_React_ = __webpack_require__(9);
 var external_React_default = /*#__PURE__*/__webpack_require__.n(external_React_);
 
 // EXTERNAL MODULE: ./content-src/asrouter/templates/Trailhead/Trailhead.jsx
 var Trailhead = __webpack_require__(20);
 
 // EXTERNAL MODULE: ./content-src/asrouter/templates/ReturnToAMO/ReturnToAMO.jsx
 var ReturnToAMO = __webpack_require__(23);
 
-// EXTERNAL MODULE: ./content-src/asrouter/templates/StartupOverlay/StartupOverlay.jsx
-var StartupOverlay = __webpack_require__(24);
-
 // EXTERNAL MODULE: ./node_modules/fluent-react/src/index.js + 14 modules
-var src = __webpack_require__(58);
+var src = __webpack_require__(57);
 
 // EXTERNAL MODULE: ./content-src/asrouter/rich-text-strings.js + 8 modules
-var rich_text_strings = __webpack_require__(60);
+var rich_text_strings = __webpack_require__(59);
 
 // CONCATENATED MODULE: ./content-src/asrouter/templates/FirstRun/Interrupt.jsx
 function _extends() { _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; }; return _extends.apply(this, arguments); }
 
 /* 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 Interrupt_Interrupt extends external_React_default.a.PureComponent {
   render() {
     const {
       onDismiss,
       onNextScene,
       message,
       sendUserActionTelemetry,
       executeAction,
@@ -14498,24 +14347,16 @@ class Interrupt_Interrupt extends extern
         }, external_React_default.a.createElement(ReturnToAMO["ReturnToAMO"], _extends({}, message, {
           document: this.props.document,
           UISurface: "NEWTAB_OVERLAY",
           onBlock: onDismiss,
           onAction: executeAction,
           sendUserActionTelemetry: sendUserActionTelemetry
         })));
 
-      case "fxa_overlay":
-        return external_React_default.a.createElement(StartupOverlay["StartupOverlay"], {
-          document: this.props.document,
-          onBlock: onDismiss,
-          dispatch: dispatch,
-          fxa_endpoint: fxaEndpoint
-        });
-
       case "trailhead":
         return external_React_default.a.createElement(Trailhead["Trailhead"], {
           document: this.props.document,
           message: message,
           onNextScene: onNextScene,
           onAction: executeAction,
           sendUserActionTelemetry: sendUserActionTelemetry,
           dispatch: dispatch,
@@ -14526,17 +14367,17 @@ class Interrupt_Interrupt extends extern
 
       default:
         throw new Error(`${message.template} is not a valid FirstRun message`);
     }
   }
 
 }
 // EXTERNAL MODULE: ./content-src/asrouter/templates/FirstRun/Triplets.jsx
-var Triplets = __webpack_require__(25);
+var Triplets = __webpack_require__(24);
 
 // EXTERNAL MODULE: ./content-src/asrouter/templates/FirstRun/addUtmParams.js
 var addUtmParams = __webpack_require__(22);
 
 // CONCATENATED MODULE: ./content-src/asrouter/templates/FirstRun/FirstRun.jsx
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FLUENT_FILES", function() { return FLUENT_FILES; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "helpers", function() { return helpers; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FirstRun", function() { return FirstRun_FirstRun; });
@@ -14725,34 +14566,34 @@ class FirstRun_FirstRun extends external
       flowParams: flowParams,
       onAction: executeAction
     }) : null);
   }
 
 }
 
 /***/ }),
-/* 63 */
+/* 62 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 
 // EXTERNAL MODULE: ./common/Actions.jsm
 var Actions = __webpack_require__(2);
 
 // EXTERNAL MODULE: ./content-src/components/A11yLinkButton/A11yLinkButton.jsx
-var A11yLinkButton = __webpack_require__(39);
+var A11yLinkButton = __webpack_require__(38);
 
 // EXTERNAL MODULE: external "React"
 var external_React_ = __webpack_require__(9);
 var external_React_default = /*#__PURE__*/__webpack_require__.n(external_React_);
 
 // EXTERNAL MODULE: ./content-src/components/TopSites/TopSitesConstants.js
-var TopSitesConstants = __webpack_require__(52);
+var TopSitesConstants = __webpack_require__(51);
 
 // CONCATENATED MODULE: ./content-src/components/TopSites/TopSiteFormInput.jsx
 /* 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 TopSiteFormInput_TopSiteFormInput extends external_React_default.a.PureComponent {
   constructor(props) {
@@ -14857,17 +14698,17 @@ class TopSiteFormInput_TopSiteFormInput 
 
 }
 TopSiteFormInput_TopSiteFormInput.defaultProps = {
   showClearButton: false,
   value: "",
   validationError: false
 };
 // EXTERNAL MODULE: ./content-src/components/TopSites/TopSite.jsx
-var TopSite = __webpack_require__(54);
+var TopSite = __webpack_require__(53);
 
 // CONCATENATED MODULE: ./content-src/components/TopSites/TopSiteForm.jsx
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TopSiteForm", function() { return TopSiteForm_TopSiteForm; });
 /* 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/. */
 
 
deleted file mode 100644
index e9a1d92c520ff655b865e2e7b9eaa7c565440f97..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/browser/components/newtab/data/content/assets/sync-devices.svg
+++ /dev/null
@@ -1,1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 201.1 102.5"><style>.st0{fill:#eaeaee}.st2{fill:#fff}.st3{fill:#90e8f0}</style><g id="RingRightInner"><path d="M142.1 93.3c-3 0-5.9-.3-8.8-.9-.3-.1-.4-.3-.4-.6.1-.3.3-.4.6-.4 2.8.6 5.6.9 8.5.9.7 0 1.5 0 2.2-.1.3 0 .5.2.5.4 0 .3-.2.5-.5.5-.7.2-1.4.2-2.1.2zm8.6-.9c-.3 0-.5-.2-.5-.5 0-.2.2-.4.4-.5.7-.1 1.4-.3 2.1-.5.3-.1.5.1.6.4.1.3-.1.5-.4.6-.7.2-1.4.4-2.1.5h-.1zm6.2-1.8c-.3 0-.5-.2-.5-.5 0-.2.1-.4.3-.5 2.7-1 5.2-2.3 7.6-3.9.2-.2.5-.1.7.1s.1.5-.1.7c-2.5 1.6-5.1 2.9-7.8 4-.1.1-.1.1-.2.1zm-31.8-.8h-.2c-2.7-1.2-5.2-2.7-7.6-4.4-.2-.2-.3-.5-.1-.7.2-.2.5-.3.7-.1 2.3 1.7 4.8 3.1 7.4 4.3.3.1.4.4.3.7-.1 0-.3.2-.5.2zm-10.9-7.1c-.1 0-.2 0-.3-.1-.5-.5-1.1-1-1.6-1.5-.2-.2-.2-.5 0-.7.2-.2.5-.2.7 0 .5.5 1 1 1.6 1.5.2.2.2.5 0 .7-.1 0-.2.1-.4.1zm57.2-1.6c-.3 0-.5-.2-.5-.5 0-.1.1-.3.1-.4 2.5-2.5 4.7-5.4 6.5-8.5.1-.2.4-.3.7-.2.2.1.3.4.2.7-1.8 3.2-4.1 6.1-6.7 8.7 0 .2-.2.2-.3.2zm-63-4.9c-.2 0-.3-.1-.4-.2-2.2-3-3.9-6.2-5.3-9.6-.1-.3 0-.5.3-.6s.5 0 .6.3c1.3 3.3 3 6.5 5.1 9.4.2.2.1.5-.1.7h-.2zm72.4-9.5c-.3 0-.5-.2-.5-.5V66c.3-.7.5-1.3.7-2 .1-.3.4-.4.6-.3.3.1.4.4.3.6-.2.7-.5 1.4-.7 2.1 0 .1-.2.3-.4.3zm1.9-6.3h-.1c-.3-.1-.4-.3-.4-.6.6-2.8.9-5.7.9-8.5v-.2c0-.3.2-.5.5-.5s.5.2.5.5v.2c0 2.9-.3 5.9-.9 8.7-.1.2-.3.4-.5.4zM101 58.3c-.2 0-.5-.2-.5-.4-.3-2.2-.5-4.4-.5-6.7 0-.7 0-1.4.1-2.1 0-.3.2-.5.5-.5s.5.2.5.5c0 .7-.1 1.4-.1 2.1 0 2.2.2 4.4.5 6.5 0 .3-.2.6-.5.6zm82.3-11c-.3 0-.5-.2-.5-.4-.3-2.9-.9-5.7-1.8-8.4-.1-.3.1-.5.3-.6s.5.1.6.3c.9 2.8 1.5 5.7 1.9 8.6 0 .2-.2.4-.5.5.1 0 .1 0 0 0 .1 0 0 0 0 0zm-82.4-2c-.3 0-.5-.3-.5-.6.1-.7.2-1.5.4-2.2.1-.3.3-.4.6-.4.3.1.4.3.4.6-.1.7-.3 1.4-.4 2.1 0 .4-.2.5-.5.5zm2.3-8.4c-.3 0-.5-.2-.5-.5v-.2c1.3-3.4 3.1-6.7 5.2-9.7.2-.2.5-.3.7-.1s.3.5.1.7c-2.1 2.9-3.8 6.1-5.1 9.4 0 .3-.2.4-.4.4zm74.7-6.1c-.2 0-.3-.1-.4-.2-1.8-3.1-4-5.9-6.6-8.5-.2-.2-.2-.5 0-.7.2-.2.5-.2.7 0 2.6 2.6 4.9 5.5 6.7 8.7.1.2.1.5-.2.7h-.2zm-63.8-9.9c-.3 0-.5-.2-.5-.5 0-.1.1-.3.2-.4 2.2-2 4.6-3.7 7.1-5.2.2-.1.5-.1.7.2s.1.5-.2.7c-2.5 1.4-4.8 3.1-6.9 5.1-.1.1-.3.1-.4.1zm52.2-2.8c-.1 0-.2 0-.3-.1l-1.8-1.2c-.2-.1-.3-.5-.1-.7.1-.2.5-.3.7-.1l1.8 1.2c.2.2.3.5.1.7-.1.1-.2.2-.4.2zm-5.6-3.4c-.1 0-.2 0-.2-.1-2.6-1.3-5.2-2.3-8-3.1-.3-.1-.4-.3-.4-.6.1-.3.3-.4.6-.4 2.8.8 5.6 1.8 8.2 3.1.2.1.3.4.2.7 0 .3-.2.4-.4.4zm-35.7-.9c-.3 0-.5-.2-.5-.5 0-.2.1-.4.3-.5.7-.3 1.3-.6 2-.8.3-.1.5 0 .6.3.1.3 0 .5-.3.6-.7.3-1.3.5-2 .8 0 .1 0 .1-.1.1zm8.2-2.7c-.3 0-.5-.2-.5-.5 0-.2.2-.4.4-.5 3.6-.8 7.3-1.1 10.9-.9.3 0 .5.2.5.5s-.2.5-.5.5c-3.6-.2-7.2.1-10.7.9h-.1z" class="st0"/><animateTransform attributeName="transform" attributeType="XML" dur="10s" from="0 142 51" repeatCount="indefinite" to="-360 142 51" type="rotate"/></g><g id="RingLeftInner"><path d="M62.8 93.3c-3 0-5.9-.3-8.8-.9-.3-.1-.4-.3-.4-.6.1-.3.3-.4.6-.4 2.8.6 5.6.9 8.5.9.7 0 1.5 0 2.2-.1.3 0 .5.2.5.4 0 .3-.2.5-.5.5-.6.2-1.3.2-2.1.2zm8.6-.9c-.3 0-.5-.2-.5-.5 0-.2.2-.4.4-.5.7-.1 1.4-.3 2.1-.5.3-.1.5.1.6.4.1.3-.1.5-.4.6-.7.2-1.4.4-2.1.5h-.1zm6.3-1.8c-.3 0-.5-.2-.5-.5 0-.2.1-.4.3-.5 2.7-1 5.2-2.3 7.6-3.9.2-.2.5-.1.7.1s.1.5-.1.7c-2.5 1.6-5.1 2.9-7.8 4-.1.1-.2.1-.2.1zm-31.8-.8h-.2c-2.7-1.2-5.2-2.7-7.6-4.4-.2-.2-.3-.5-.1-.7.2-.2.5-.3.7-.1 2.3 1.7 4.8 3.1 7.4 4.3.3.1.4.4.3.7-.1 0-.3.2-.5.2zM35 82.7c-.1 0-.2 0-.3-.1-.5-.5-1.1-1-1.6-1.5-.2-.2-.2-.5 0-.7.2-.2.5-.2.7 0 .5.5 1 1 1.6 1.5.2.2.2.5 0 .7-.1 0-.3.1-.4.1zm57.2-1.6c-.3 0-.5-.2-.5-.5 0-.1.1-.3.1-.4 2.5-2.5 4.7-5.4 6.5-8.5.1-.2.4-.3.7-.2.2.1.3.4.2.7-1.8 3.2-4.1 6.1-6.7 8.7-.1.2-.2.2-.3.2zm-63-4.9c-.2 0-.3-.1-.4-.2-2.2-3-3.9-6.2-5.3-9.6-.1-.3 0-.5.3-.6s.5 0 .6.3c1.3 3.3 3 6.5 5.1 9.4.2.2.1.5-.1.7h-.2zm72.4-9.5c-.3 0-.5-.2-.5-.5V66c.3-.7.5-1.3.7-2 .1-.3.4-.4.6-.3.3.1.4.4.3.6-.2.7-.5 1.4-.7 2.1 0 .1-.2.3-.4.3zm1.8-6.3h-.1c-.3-.1-.4-.3-.4-.6.6-2.8.9-5.7.9-8.5v-.2c0-.3.2-.5.5-.5s.5.2.5.5v.2c0 2.9-.3 5.9-.9 8.7 0 .2-.2.4-.5.4zm-81.7-2.1c-.2 0-.5-.2-.5-.4-.3-2.2-.5-4.4-.5-6.7 0-.7 0-1.4.1-2.1 0-.3.2-.5.5-.5s.5.2.5.5c0 .7-.1 1.4-.1 2.1 0 2.2.2 4.4.5 6.5.1.3-.1.6-.5.6.1 0 0 0 0 0zm82.4-11c-.3 0-.5-.2-.5-.4-.3-2.9-.9-5.7-1.8-8.4-.1-.3.1-.5.3-.6s.5.1.6.3c.9 2.8 1.5 5.7 1.9 8.6 0 .2-.2.4-.5.5zm-82.4-2s-.1 0 0 0c-.3 0-.5-.3-.5-.6.1-.7.2-1.5.4-2.2.1-.3.3-.4.6-.4.3.1.4.3.4.6-.1.7-.3 1.4-.4 2.1 0 .4-.3.5-.5.5zm2.2-8.4c-.3 0-.5-.2-.5-.5v-.2c1.3-3.4 3.1-6.7 5.2-9.7.2-.2.5-.3.7-.1s.3.5.1.7c-2.1 2.9-3.8 6.1-5.1 9.4 0 .3-.2.4-.4.4zm74.8-6.1c-.2 0-.3-.1-.4-.2-1.8-3.1-4-5.9-6.6-8.5-.2-.2-.2-.5 0-.7.2-.2.5-.2.7 0 2.6 2.6 4.9 5.5 6.7 8.7.1.2.1.5-.2.7h-.2zm-63.8-9.9c-.3 0-.5-.2-.5-.5 0-.1.1-.3.2-.4 2.2-2 4.6-3.7 7.1-5.2.2-.1.5-.1.7.2s.1.5-.2.7c-2.5 1.4-4.8 3.1-6.9 5.1-.2.1-.3.1-.4.1zm52.2-2.8c-.1 0-.2 0-.3-.1L85 16.8c-.2-.1-.3-.5-.1-.7.1-.2.5-.3.7-.1l1.8 1.2c.2.2.3.5.1.7-.1.1-.3.2-.4.2zm-5.6-3.4c-.1 0-.2 0-.2-.1-2.6-1.3-5.2-2.3-8-3.1-.3-.1-.4-.3-.4-.6.1-.3.3-.4.6-.4 2.8.8 5.6 1.8 8.2 3.1.2.1.3.4.2.7 0 .3-.2.4-.4.4zm-35.7-.9c-.3 0-.5-.2-.5-.5 0-.2.1-.4.3-.5.7-.3 1.3-.6 2-.8.3-.1.5 0 .6.3.1.3 0 .5-.3.6-.7.3-1.3.5-2 .8 0 .1-.1.1-.1.1zm8.2-2.7c-.3 0-.5-.2-.5-.5 0-.2.2-.4.4-.5 3.6-.8 7.3-1.1 10.9-.9.3 0 .5.2.5.5s-.2.5-.5.5c-3.6-.2-7.2.1-10.7.9H54z" class="st0"/><animateTransform attributeName="transform" attributeType="XML" dur="10s" from="0 62 51" repeatCount="indefinite" to="360 62 51" type="rotate"/></g><g id="RingLeftOuter"><path d="M62.6 102.5c-.9 0-1.7 0-2.6-.1-.3 0-.5-.2-.5-.5s.3-.5.5-.5c3.8.2 7.6 0 11.3-.7.3 0 .5.1.6.4 0 .3-.1.5-.4.6-2.9.5-5.9.8-8.9.8zm-10.1-1h-.1c-.9-.2-1.9-.4-2.8-.7-.3-.1-.4-.3-.4-.6s.3-.4.6-.4c.9.2 1.8.5 2.8.6.3.1.4.3.4.6-.1.3-.3.5-.5.5zM46 99.7h-.2l-.9-.3c-.3-.1-.4-.4-.3-.6s.4-.4.6-.3l.9.3c.3.1.4.4.3.6 0 .2-.2.3-.4.3zm33.8-.2c-.3 0-.5-.2-.5-.5 0-.2.1-.4.3-.5l.9-.3c.3-.1.5 0 .6.3s0 .5-.3.6l-.9.3c0 .1 0 .1-.1.1zm4.4-1.8c-.3 0-.5-.2-.5-.5 0-.2.1-.4.3-.5.9-.4 1.7-.8 2.5-1.3.2-.1.5 0 .7.2s0 .5-.2.7c-.8.5-1.7.9-2.6 1.3 0 .1-.1.1-.2.1zm-46.9-2c-.1 0-.2 0-.2-.1-3.4-1.9-6.5-4.2-9.3-6.9-.2-.2-.2-.5 0-.7.2-.2.5-.2.7 0 2.8 2.6 5.8 4.8 9.1 6.7.2.1.3.4.2.7-.1.3-.3.4-.5.3zm55.9-3.4c-.3 0-.5-.2-.5-.5 0-.2.1-.3.2-.4 3-2.3 5.8-4.9 8.2-7.8.2-.2.5-.2.7-.1s.2.5.1.7c-2.5 3-5.3 5.6-8.4 8-.1 0-.2.1-.3.1zm-70.3-9c-.2 0-.3-.1-.4-.2-.6-.7-1.2-1.5-1.7-2.3-.2-.2-.1-.5.1-.7.2-.2.5-.1.7.1.5.8 1.1 1.5 1.7 2.3.2.2.1.5-.1.7-.1.1-.2.1-.3.1zm-3.8-5.5c-.2 0-.3-.1-.4-.2-.2-.3-.3-.6-.5-.8-.1-.2-.1-.5.2-.7s.5-.1.7.2c.2.3.3.5.5.8.1.2.1.5-.2.7h-.3zm87.4-.5c-.3 0-.5-.2-.5-.5 0-.1 0-.2.1-.3.2-.3.3-.5.5-.8.1-.2.4-.3.7-.2.2.1.3.4.2.7-.2.3-.3.6-.5.8-.2.2-.3.3-.5.3zm2.2-4.2h-.2c-.3-.1-.4-.4-.2-.7.4-.9.8-1.7 1.1-2.6.1-.3.4-.4.7-.3.3.1.4.4.3.6-.4.9-.7 1.8-1.1 2.7-.2.2-.4.3-.6.3zM15 69.2c-.2 0-.4-.1-.5-.3-1.3-3.6-2.2-7.4-2.7-11.2 0-.3.2-.5.4-.6.3 0 .5.2.6.4.5 3.8 1.4 7.5 2.7 11 .1.3 0 .5-.3.6-.1.1-.2.1-.2.1zm97.1-6.1h-.1c-.3-.1-.4-.3-.4-.6.8-3.7 1.3-7.5 1.3-11.3V51c0-.3.2-.5.5-.5s.5.2.5.5v.2c0 3.9-.4 7.7-1.3 11.5-.1.3-.3.4-.5.4zM11.9 50.4c-.3 0-.5-.2-.5-.5 0-1 .1-1.9.2-2.9 0-.3.3-.5.5-.5.3 0 .5.3.5.5-.1.9-.1 1.9-.2 2.8 0 .4-.2.6-.5.6zm.6-6.6c-.4 0-.5-.3-.5-.6.1-.3.1-.6.2-1 0-.3.3-.5.6-.4s.5.3.4.6c-.1.3-.1.6-.2.9 0 .3-.2.5-.5.5zm100.1-.8c-.2 0-.5-.2-.5-.4-.1-.3-.1-.6-.2-.9-.1-.3.1-.5.4-.6s.5.1.6.4c.1.3.1.6.2 1 .1.2-.1.4-.5.5.1 0 .1 0 0 0 .1 0 .1 0 0 0zm-1-4.7c-.2 0-.4-.2-.5-.4-.2-.9-.5-1.8-.8-2.7-.1-.3.1-.5.3-.6.3-.1.5.1.6.3.3.9.6 1.8.8 2.8.1.3-.1.5-.4.6.1 0 0 0 0 0zm-96.7-3.8h-.2c-.3-.1-.4-.4-.3-.6 1.3-3.6 3-7.1 5.1-10.4.1-.2.5-.3.7-.1.2.1.3.5.1.7-2.1 3.2-3.8 6.6-5 10.2 0 .1-.2.2-.4.2zm92.9-6c-.2 0-.4-.1-.4-.3-1.7-3.4-3.9-6.5-6.3-9.4-.2-.2-.2-.5.1-.7s.5-.2.7.1c2.5 3 4.7 6.2 6.4 9.6.1.2 0 .5-.2.7h-.3zM24.6 18.1c-.3 0-.5-.2-.5-.5 0-.1 0-.2.1-.3.6-.7 1.3-1.4 2-2.1.2-.2.5-.2.7 0 .2.2.2.5 0 .7-.7.7-1.3 1.4-1.9 2.1-.1.1-.2.1-.4.1zm4.8-4.7c-.3 0-.5-.2-.5-.5 0-.1.1-.3.2-.4.2-.2.5-.4.7-.6.2-.2.5-.1.7.1.2.2.1.5-.1.7-.2.2-.5.4-.7.6-.1.1-.2.1-.3.1zm65.9-.5c-.1 0-.2 0-.3-.1-.2-.2-.5-.4-.7-.6-.3-.2-.3-.5-.1-.7s.5-.2.7-.1c.3.2.5.4.7.6.2.2.2.5.1.7-.1.2-.2.2-.4.2zM91.5 10c-.1 0-.2 0-.3-.1-.8-.5-1.6-1.1-2.4-1.6-.2-.1-.3-.5-.2-.7s.5-.3.7-.2c.8.5 1.6 1 2.4 1.6.2.2.3.5.1.7 0 .2-.1.3-.3.3zM37.1 7.9c-.3 0-.5-.2-.5-.5 0-.2.1-.3.2-.4 3.3-1.9 6.9-3.5 10.6-4.7.3-.1.5.1.6.3.1.3-.1.5-.3.6-3.6 1.1-7.1 2.7-10.4 4.6 0 0-.1.1-.2.1zM82.3 5h-.2c-3.5-1.5-7.2-2.5-10.9-3.2-.3 0-.5-.3-.4-.6 0-.3.3-.5.6-.4 3.8.7 7.5 1.7 11.1 3.2.3.1.4.4.3.7-.1.1-.3.3-.5.3zM55.1 1.6c-.3 0-.5-.2-.5-.5 0-.2.2-.5.4-.5.9-.1 1.9-.3 2.9-.3.3 0 .5.2.5.5s-.2.5-.5.5c-.9 0-1.8.1-2.8.3zm6.7-.6c-.3 0-.5-.2-.5-.5s.2-.5.5-.5h.9c.3 0 .5.2.5.5s-.2.5-.5.5h-.9z" class="st0"/><animateTransform attributeName="transform" attributeType="XML" dur="10s" from="0 62 51" repeatCount="indefinite" to="-360 62 51" type="rotate"/></g><g id="RingRightOuter"><path d="M142.1 102.5c-.9 0-1.7 0-2.6-.1-.3 0-.5-.2-.5-.5s.3-.5.5-.5c3.8.2 7.6 0 11.3-.7.3 0 .5.1.6.4 0 .3-.1.5-.4.6-2.9.5-5.9.8-8.9.8zm-10.2-1h-.1c-.9-.2-1.9-.4-2.8-.7-.3-.1-.4-.3-.4-.6s.3-.4.6-.4c.9.2 1.8.5 2.8.6.3.1.4.3.4.6s-.2.5-.5.5zm-6.4-1.8h-.2l-.9-.3c-.3-.1-.4-.4-.3-.6s.4-.4.6-.3l.9.3c.3.1.4.4.3.6 0 .2-.2.3-.4.3zm33.8-.2c-.3 0-.5-.2-.5-.5 0-.2.1-.4.3-.5l.9-.3c.3-.1.5 0 .6.3s0 .5-.3.6l-.9.3c0 .1-.1.1-.1.1zm4.4-1.8c-.3 0-.5-.2-.5-.5 0-.2.1-.4.3-.5.9-.4 1.7-.8 2.5-1.3.2-.1.5 0 .7.2s0 .5-.2.7c-.8.5-1.7.9-2.6 1.3-.1.1-.1.1-.2.1zm-46.9-2c-.1 0-.2 0-.2-.1-3.4-1.9-6.5-4.2-9.3-6.9-.2-.2-.2-.5 0-.7.2-.2.5-.2.7 0 2.8 2.6 5.8 4.8 9.1 6.7.2.1.3.4.2.7-.2.2-.3.3-.5.3zm55.9-3.4c-.3 0-.5-.2-.5-.5 0-.2.1-.3.2-.4 3-2.3 5.8-4.9 8.2-7.8.2-.2.5-.2.7-.1s.2.5.1.7c-2.5 3-5.3 5.6-8.4 8-.1 0-.2.1-.3.1zm-70.3-9c-.2 0-.3-.1-.4-.2-.6-.7-1.2-1.5-1.7-2.3-.2-.2-.1-.5.1-.7.2-.2.5-.1.7.1.5.8 1.1 1.5 1.7 2.3.2.2.1.5-.1.7-.1.1-.2.1-.3.1zm-3.9-5.5c-.2 0-.3-.1-.4-.2-.2-.3-.3-.6-.5-.8-.1-.2-.1-.5.2-.7s.5-.1.7.2c.2.3.3.5.5.8.1.2.1.5-.2.7h-.3zm87.4-.5c-.3 0-.5-.2-.5-.5 0-.1 0-.2.1-.3.2-.3.3-.5.5-.8.1-.2.4-.3.7-.2.2.1.3.4.2.7-.2.3-.3.6-.5.8-.1.2-.3.3-.5.3zm2.3-4.2h-.2c-.3-.1-.4-.4-.2-.7.4-.9.8-1.7 1.1-2.6.1-.3.4-.4.7-.3.3.1.4.4.3.6-.4.9-.7 1.8-1.1 2.7-.3.2-.4.3-.6.3zm-93.8-3.9c-.2 0-.4-.1-.5-.3-1.3-3.6-2.2-7.4-2.7-11.2 0-.3.2-.5.4-.6.3 0 .5.2.6.4.5 3.8 1.4 7.5 2.7 11 .1.3 0 .5-.3.6-.1.1-.1.1-.2.1zm97.2-6.1h-.1c-.3-.1-.4-.3-.4-.6.8-3.7 1.3-7.5 1.3-11.3V51c0-.3.2-.5.5-.5s.5.2.5.5v.2c0 3.9-.4 7.7-1.3 11.5-.1.3-.3.4-.5.4zM91.4 50.4c-.3 0-.5-.2-.5-.5 0-1 .1-1.9.2-2.9 0-.3.3-.5.5-.5.3 0 .5.3.5.5-.1.9-.1 1.9-.2 2.8 0 .4-.3.6-.5.6zm.6-6.6c-.1 0-.1 0 0 0-.4 0-.5-.3-.5-.6.1-.3.1-.6.2-1 0-.3.3-.5.6-.4s.5.3.4.6c-.1.3-.1.6-.2.9-.1.3-.3.5-.5.5zm100.1-.8c-.2 0-.5-.2-.5-.4-.1-.3-.1-.6-.2-.9-.1-.3.1-.5.4-.6s.5.1.6.4c.1.3.1.6.2 1 0 .2-.1.4-.5.5.1 0 .1 0 0 0zm-1.1-4.7c-.2 0-.4-.2-.5-.4-.2-.9-.5-1.8-.8-2.7-.1-.3.1-.5.3-.6.3-.1.5.1.6.3.3.9.6 1.8.8 2.8.1.3-.1.5-.4.6.1 0 .1 0 0 0zm-96.6-3.8h-.2c-.3-.1-.4-.4-.3-.6 1.3-3.6 3-7.1 5.1-10.4.1-.2.5-.3.7-.1.2.1.3.5.1.7-2.1 3.2-3.8 6.6-5 10.2 0 .1-.2.2-.4.2zm92.8-6c-.2 0-.4-.1-.4-.3-1.7-3.4-3.9-6.5-6.3-9.4-.2-.2-.2-.5.1-.7s.5-.2.7.1c2.5 3 4.7 6.2 6.4 9.6.1.2 0 .5-.2.7h-.3zm-83.1-10.4c-.3 0-.5-.2-.5-.5 0-.1 0-.2.1-.3.6-.7 1.3-1.4 2-2.1.2-.2.5-.2.7 0 .2.2.2.5 0 .7-.7.7-1.3 1.4-1.9 2.1-.1.1-.3.1-.4.1zm4.7-4.7c-.3 0-.5-.2-.5-.5 0-.1.1-.3.2-.4.2-.2.5-.4.7-.6.2-.2.5-.1.7.1.2.2.1.5-.1.7-.2.2-.5.4-.7.6 0 .1-.2.1-.3.1zm66-.5c-.1 0-.2 0-.3-.1-.2-.2-.5-.4-.7-.6-.2-.2-.2-.5-.1-.7s.5-.2.7-.1c.3.2.5.4.7.6.2.2.2.5.1.7-.1.1-.3.2-.4.2zM171 10c-.1 0-.2 0-.3-.1-.8-.5-1.6-1.1-2.4-1.6-.2-.1-.3-.5-.2-.7s.5-.3.7-.2c.8.5 1.6 1 2.4 1.6.2.2.3.5.1.7 0 .2-.2.3-.3.3zm-54.4-2.1c-.3 0-.5-.2-.5-.5 0-.2.1-.3.2-.4 3.3-1.9 6.9-3.5 10.6-4.7.3-.1.5.1.6.3.1.3-.1.5-.3.6-3.6 1.1-7.1 2.7-10.4 4.6 0 0-.1.1-.2.1zm45.2-3h-.2c-3.5-1.5-7.2-2.5-10.9-3.2-.3 0-.5-.3-.4-.6 0-.3.3-.5.6-.4 3.8.7 7.5 1.7 11.1 3.2.3.1.4.4.3.7-.2.2-.3.3-.5.3zm-27.3-3.3c-.3 0-.5-.2-.5-.5 0-.2.2-.5.4-.5.9-.1 1.9-.3 2.9-.3.3 0 .5.2.5.5s-.2.5-.5.5c-.8 0-1.7.1-2.8.3.1 0 .1 0 0 0zm6.7-.6c-.3 0-.5-.2-.5-.5s.2-.5.5-.5h.9c.3 0 .5.2.5.5s-.2.5-.4.5h-1z" class="st0"/><animateTransform attributeName="transform" attributeType="XML" dur="10s" from="0 142 51" repeatCount="indefinite" to="360 142 51" type="rotate"/></g><g id="Layer_1"><path fill="url(#SVGID_1_)" d="M195.6 19.3h-.2v-.9c0-.5-.4-.9-.9-.9h-4.8c-.5 0-.9.4-.9.9v.9H170c-3 0-5.4 2.4-5.4 5.4V75c0 3 2.4 5.4 5.4 5.4h25.6c3 0 5.5-2.4 5.5-5.4V24.7c0-3-2.5-5.4-5.5-5.4zM40.1 86.8h6.5c3.1 0 5.7-2.5 5.7-5.7V17.8c0-3-2.3-5.4-5.3-5.6H5.7c-3.1 0-5.7 2.5-5.7 5.6v63.3c0 3.1 2.5 5.7 5.7 5.7h34.4zm81.8 1.4h22.4c2.3.1 4.2-1.7 4.2-4v-1c0-.5-.1-1.1-.3-1.6l-7.3-16.1c-.3-.8-.9-1.4-1.6-1.8 1.2-1.1 1.9-2.6 1.9-4.2V18.8c0-3.1-2.5-5.5-5.6-5.6H74.2c-3.1 0-5.5 2.5-5.6 5.6v40.7c0 1.5.6 3 1.7 4-.9.4-1.6 1.1-2 2l-6.8 16.2c-.2.5-.3 1-.3 1.5v1.1c.1 2.3 1.9 4.1 4.2 4l56.5-.1z"/><path fill="#ccedf0" d="M195.6 21.3H170c-1.9 0-3.4 1.5-3.4 3.5V75c0 1.9 1.5 3.4 3.4 3.4h25.6c1.9 0 3.4-1.5 3.4-3.4V24.7c.1-1.9-1.5-3.4-3.4-3.4zm-8.7 52.8c0 .9-.7 1.6-1.6 1.6h-5c-.9 0-1.6-.7-1.6-1.5v-.1c0-.9.7-1.6 1.6-1.6h5c.9 0 1.6.7 1.6 1.6zM5.7 84.8h41c2 0 3.7-1.6 3.7-3.7V17.8c0-2-1.6-3.7-3.7-3.7h-41c-2 0-3.7 1.6-3.7 3.7v63.3c0 2.1 1.6 3.7 3.7 3.7zm14.4-4v-1.2c0-.7.6-1.3 1.3-1.3h9.5c.7 0 1.3.6 1.3 1.3v1.3c0 .7-.6 1.3-1.3 1.3h-9.5c-.7 0-1.3-.6-1.3-1.4zM74.2 63h61.4c2 0 3.6-1.6 3.6-3.5V18.8c0-2-1.6-3.6-3.6-3.6H74.2c-2 0-3.6 1.6-3.6 3.5v40.7c0 2.1 1.6 3.7 3.6 3.6zm29.5-45c0-.6.5-1.1 1.2-1.1.6 0 1.2.5 1.2 1.1 0 .6-.5 1.1-1.2 1.1-.6 0-1.1-.5-1.1-1l-.1-.1zm40.7 68.2c1.2.1 2.2-.8 2.2-2v-1c0-.3-.1-.5-.2-.7l-7.3-16.1c-.4-.8-1.2-1.3-2.1-1.2H72.3c-.9 0-1.7.5-2.1 1.3l-6.9 16.1c-.1.2-.1.5-.1.7v1.1c.1 1.2 1 2.1 2.2 2l79-.2zm-8.5-15c.1.4.3.8.3 1.1.1.3-.4.6-.9.6h-3.7c-.3 0-.6-.1-.6-.3-.1-.4-.2-.8-.3-1.1-.1-.3.3-.6.8-.6h3.7c.3-.1.5.1.7.3zm-5.5-4h3.5c.3 0 .5.1.6.3.1.4.2.7.3 1.1.1.3-.3.6-.8.6h-3.4c-.3 0-.5-.1-.6-.3-.1-.4-.3-.7-.4-1.1-.1-.2.3-.5.8-.6zm-3.2 4l.2 1.2c.1.3-.4.6-.9.6h-3.8c-.3 0-.6-.1-.7-.3l-.3-1.2c-.1-.3.4-.7.9-.7h3.9c.4.1.7.2.7.4zm-5.2-4h3.7c.3 0 .6.1.6.3l.2 1.1c.1.3-.4.6-.9.6H122c-.3 0-.6-.1-.6-.3l-.3-1.1c-.1-.2.3-.5.9-.6zm-4.4 4c.1.5.1.7.2 1.2 0 .3-.4.6-.9.6H113c-.4 0-.7-.2-.7-.4l-.3-1.2c-.1-.3.4-.6.9-.6h4.1c.3.1.6.3.6.4zm-5-4h3.9c.4 0 .7.2.7.4l.2 1.1c0 .3-.4.6-.8.6h-3.8c-.4 0-.7-.2-.7-.4l-.2-1.1c-.2-.2.2-.5.7-.6zm-10 .5c.1-.2.4-.4.8-.4h3.5c.4 0 .7.2.7.4l.2 1.1c0 .3-.3.5-.8.5h-3.9c-.5 0-.8-.2-.8-.5.1-.4.2-.6.3-1.1zm-.2 3.7c.1-.2.4-.4.8-.4h3.7c.4 0 .8.2.8.4l.2 1.2c.1.3-.3.6-.8.6H103c-.5 0-.9-.3-.8-.6 0-.5.1-.7.2-1.2zm-8.6-4.1h3.9c.5 0 .9.3.8.6-.1.3-.2.7-.3 1.1-.1.3-.4.4-.7.4h-3.8c-.5 0-.9-.3-.8-.6.1-.3.2-.7.3-1.1 0-.2.3-.3.6-.4zm-1.4 4.1c0-.2.3-.4.7-.4h4.1c.5 0 .9.3.8.6-.1.5-.2.7-.3 1.2-.1.3-.4.4-.7.4h-3.9c-.5 0-.9-.3-.9-.6.1-.4.1-.7.2-1.2zm-13.2.3c-.2.4-.3.8-.4 1.2-.1.2-.3.3-.6.4h-3.7c-.5 0-1-.3-.9-.7.1-.4.2-.8.4-1.1.1-.2.4-.4.7-.4h3.7c.6 0 .9.3.8.6zm.9-2.6c-.1.2-.4.4-.7.3H76c-.5 0-.8-.3-.7-.6.1-.4.3-.7.4-1.1.1-.2.3-.4.6-.3h3.5c.5 0 .9.3.8.6-.1.3-.3.7-.5 1.1zm7.8 3.8c-.1.2-.3.3-.7.3h-3.8c-.5 0-1-.3-.9-.7.1-.4.2-.7.3-1.2.1-.2.3-.4.7-.4h3.9c.5 0 1 .3.9.7-.1.4-.3.8-.4 1.3zm.9-3.9c-.1.2-.4.4-.7.3h-3.6c-.5 0-.9-.3-.8-.6.1-.3.2-.7.3-1.1.1-.2.4-.4.6-.3h3.7c.5 0 .9.3.8.6-.1.3-.2.8-.3 1.1zM91 80c.3-1.7.5-2.6.8-4.4 0-.2.3-.4.7-.4l25.3-.2c.4 0 .7.2.7.4.2 1.5.4 3 .4 4.5 0 .3-.4.6-.9.6H91.8c-.4 0-.8-.2-.8-.5z"/><path d="M142.1 6c12 0 23.5 4.8 32 13.3h2.8c-16.3-17.8-43.3-20.4-62.7-6.1h3.5c7.2-4.7 15.7-7.2 24.4-7.2zm0 90.5c-9.3 0-18.4-2.9-26.1-8.3h-3.3c20.3 16.2 50 12.9 66.2-7.4.1-.1.2-.2.2-.3h-2.6c-8.5 10.1-21.1 16-34.4 16zM62.6 6c8.7 0 17.2 2.5 24.5 7.2h3.5C74.5 1.3 52.7.9 36.1 12.1h3.8C46.8 8.1 54.6 6 62.6 6zm0 90.5c-10.1 0-20-3.4-27.9-9.7h-3.1c17.2 15.1 42.6 15.6 60.5 1.4h-3.3c-7.7 5.4-16.9 8.3-26.2 8.3z" class="st0"/><path d="M194 25.1h-22.3c-.9 0-1.7.8-1.7 1.7v41.9c0 .9.8 1.7 1.7 1.7H194c.9 0 1.7-.8 1.7-1.7V26.8c0-.9-.8-1.7-1.7-1.7zm-11.5 3.7c3.2 0 5.7 2.6 5.7 5.7s-2.6 5.7-5.7 5.7-5.7-2.6-5.7-5.7c0-3.2 2.6-5.8 5.7-5.7 0-.1.1-.1 0 0zM177 45.9c.1-.3.4-.6.7-.6l2.7-.5 1.5-3.1h.6c.4 0 .7.2.9.5l1.3 2.6 3.2.6.2.5c.1.3 0 .7-.2.9l-2 2.1.5 3.5-.5.4c-.3.2-.7.2-1 .1l-2.5-1.3-2.9 1.5-.5-.3c-.3-.2-.4-.6-.4-.9l.4-2.9-2.3-2.5.3-.6zm6.1 12.9c0-.5.4-.9.9-.9h1c-.6-.6-1.5-1-2.4-1-1.5 0-2.8 1-3.2 2.5-.1.4-.4.7-.9.7h-.2c-.5-.1-.8-.6-.6-1 .7-2.7 3.4-4.3 6.1-3.6.8.2 1.5.6 2.1 1.1V56c.1-.5.5-.8 1-.8.4 0 .7.4.8.8v2.8c0 .5-.4.9-.9.9H184c-.5.1-.9-.3-1-.8l.1-.1zm-.5 6.4c-1.2 0-2.4-.5-3.3-1.2v.4c-.1.5-.5.8-1 .8-.4 0-.7-.4-.8-.8v-2.8c0-.5.4-.9.9-.9h2.8c.5.1.8.5.8 1 0 .4-.4.7-.8.8h-1c.6.6 1.5 1 2.4 1 1.5 0 2.8-1 3.2-2.5.2-.5.7-.7 1.1-.5.4.1.6.5.6 1-.6 2.1-2.6 3.7-4.9 3.7z" class="st2"/><path d="M182.6 38.4c2.2 0 4-1.8 4-4s-1.8-4-4-4-4 1.8-4 4 1.8 4 4 4zm-.9-6.4c0-.3.2-.5.5-.5s.5.2.5.5v2.3h2.3c.3 0 .5.2.5.5s-.2.5-.5.5h-2.8c-.3 0-.5-.2-.5-.5V32zm-1 18.6l1.9-1 1.9 1-.3-2.2 1.5-1.6-2.1-.4-1-1.9-1 1.9-2.1.4 1.5 1.6-.3 2.2z" class="st2"/><path d="M178.7 51.9c0 .3.1.7.4.9l.5.3 2.9-1.5 2.4 1.3c.3.2.7.2 1-.1l.5-.4-.4-3.4 2-2.1c.2-.3.3-.6.2-.9l-.2-.5-3.2-.6-1.3-2.6c-.2-.3-.5-.5-.9-.5h-.6l-1.5 3.1-2.7.5c-.3.1-.6.3-.7.6l-.1.6 2.3 2.5-.6 2.8zm2.9-5.6l1-1.9 1 1.9 2.1.4-1.5 1.6.3 2.2-1.9-1-1.9 1 .3-2.2-1.5-1.6 2.1-.4z" class="st3"/><path d="M25.8 44.4l-1 2.1-2.3.4 1.6 1.8-.4 2.3 2-1.1 2 1.1-.3-2.4 1.6-1.8-2.3-.4c.1.1-.9-2-.9-2z" class="st2"/><path d="M7.3 76.3H45c1 0 1.8-.8 1.8-1.8V20c0-1-.8-1.8-1.8-1.8H7.3c-1 0-1.8.8-1.8 1.8v54.4c0 1 .8 1.8 1.8 1.9zm23.8-10.8c-.7 3-3.7 4.8-6.6 4.1-.9-.2-1.7-.6-2.4-1.2v.3c0 .6-.4 1-1 1s-1-.4-1-1v-3c0-.6.4-1 1-1h3c.6 0 1 .4 1 1s-.4 1-1 1h-1c.7.7 1.6 1 2.5 1 1.7 0 3.2-1.1 3.5-2.7.2-.5.7-.8 1.2-.7.7.2 1 .7.8 1.2zm.2-2.9c0 .6-.4 1-1 1h-3c-.6 0-1-.4-1-1s.4-1 1-1h1c-.7-.7-1.6-1-2.5-1-1.6 0-3.1 1.1-3.5 2.7-.1.5-.5.8-1 .8h-.2c-.5-.1-.9-.7-.7-1.2.7-3 3.7-4.8 6.6-4.1.9.2 1.7.6 2.4 1.2v-.3c0-.6.4-1 1-1s1 .4 1 1l-.1 2.9zm.4-15.6l-2.1 2.3.5 3.8-.5.4c-.3.2-.8.3-1.1.1l-2.7-1.4-3.2 1.7-.6-.4c-.3-.2-.5-.6-.4-1l.5-3.2-2.6-2.8.2-.6c.1-.4.4-.6.8-.7l3-.5 1.7-3.4h.7c.4 0 .8.2 1 .6l1.4 2.8 3.6.6.1.7c.1.3 0 .7-.3 1zm-6-22.5c3.5 0 6.3 2.8 6.3 6.3s-2.8 6.3-6.3 6.3-6.3-2.8-6.3-6.3c0-3.4 2.9-6.3 6.3-6.3z" class="st2"/><path d="M21.4 30.9c0 2.4 1.9 4.3 4.3 4.3s4.3-1.9 4.3-4.3-1.9-4.3-4.3-4.3c-2.3 0-4.3 1.9-4.3 4.3zm3.5-2.7c0-.3.2-.5.5-.5s.5.2.5.5v2.5h2.5c.3 0 .5.2.5.5s-.2.5-.5.5h-3c-.3 0-.5-.2-.5-.5v-3z" class="st2"/><path d="M31.7 45.3l-3.6-.6-1.4-2.8c-.2-.4-.6-.6-1-.6H25l-1.7 3.4-3 .5c-.4.1-.7.3-.8.7l-.2.6 2.6 2.8-.5 3.2c0 .4.1.8.4 1l.6.4 3.2-1.7 2.7 1.4c.4.2.8.2 1.1-.1l.5-.4-.5-3.8 2.2-2.3c.3-.3.4-.7.3-1l-.2-.7zm-4.2 3.4l.3 2.3-2-1.1-2 1.1.3-2.4-1.6-1.8 2.3-.4 1-2.1 1 2.1 2.3.4-1.6 1.9z" class="st3"/><path d="M88.4 43.8c2.4 0 4.3-1.9 4.3-4.3s-1.9-4.3-4.3-4.3-4.3 1.9-4.3 4.3c0 2.3 1.9 4.3 4.3 4.3zm-.9-7c0-.3.2-.5.5-.5s.5.2.5.5v2.5h2.6c.3 0 .5.2.5.5s-.2.5-.5.5H88c-.3 0-.5-.2-.5-.5v-3zm18.8 1.6l-1-2.1-1 2.1-2.3.4 1.7 1.8-.3 2.4 2-1.1 2 1.1-.3-2.4 1.7-1.8c-.2 0-2.5-.4-2.5-.4z" class="st2"/><path d="M76.1 59.8h57.7c1.2 0 2.1-.9 2.1-2.1V23.3c0-1.2-.9-2.1-2.1-2.1H76.1c-1.2 0-2.1.9-2.1 2.1v34.4c0 1.1.9 2.1 2.1 2.1zm33-18.5l.5 3.8-.5.4c-.3.2-.8.3-1.1.1l-2.7-1.4-3.2 1.7-.6-.4c-.3-.2-.5-.6-.4-1l.4-3.2-2.6-2.8.2-.6c.1-.4.4-.6.8-.7l3-.5 1.7-3.4h.7c.4 0 .8.2 1 .6l1.4 2.8 3.6.6.2.6c.1.4 0 .8-.2 1.1l-2.2 2.3zm7.6-3.2c.7-3 3.7-4.8 6.6-4.1.9.2 1.7.6 2.4 1.2v-.3c0-.6.4-1 1-1s1 .4 1 1v3c0 .6-.4 1-1 1h-3c-.6 0-1-.4-1-1s.4-1 1-1h1c-.7-.7-1.6-1-2.5-1-1.6 0-3.1 1.1-3.4 2.7-.1.5-.5.8-1 .8h-.2c-.6-.2-1-.7-.9-1.3 0 .1 0 0 0 0zm-.2 2.9c0-.6.4-1 1-1h3c.6 0 1 .4 1 1s-.4 1-1 1h-1c.7.7 1.6 1 2.5 1 1.6 0 3.1-1.1 3.4-2.7.2-.5.7-.8 1.2-.7.5.1.8.7.7 1.2-.7 3-3.7 4.8-6.6 4.1-.9-.2-1.7-.6-2.4-1.2v.3c0 .6-.4 1-1 1s-1-.4-1-1l.2-3zm-28.1-7.9c3.5 0 6.3 2.8 6.3 6.3s-2.8 6.3-6.3 6.3-6.3-2.8-6.3-6.3 2.8-6.3 6.3-6.3z" class="st2"/><linearGradient id="SVGID_1_" x1="-5.898" x2="221.772" y1="157.462" y2="-70.198" gradientTransform="matrix(1 0 0 -1 0 104)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#00c8d7"/><stop offset="1" stop-color="#0a84ff"/></linearGradient><path d="M111.5 37.9l-.2-.6-3.6-.6-1.4-2.8c-.2-.4-.6-.6-1-.6h-.7l-1.7 3.4-3 .5c-.4.1-.7.3-.8.7l-.2.6 2.6 2.8-.4 3.2c0 .4.1.8.4 1l.6.4 3.2-1.7 2.7 1.4c.4.2.8.2 1.1-.1l.5-.4-.5-3.8 2.2-2.3c.2-.3.3-.8.2-1.1zm-4.5 2.7l.3 2.4-2-1.1-2 1.1.3-2.4-1.7-1.8 2.3-.4 1-2.1 1 2.1 2.3.4-1.5 1.8z" class="st3"/><linearGradient id="SVGID_2_" x1="3.801" x2="219.401" y1="153.841" y2="-61.759" gradientTransform="matrix(1 0 0 -1 0 104)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#00c8d7"/><stop offset="1" stop-color="#0a84ff"/></linearGradient><path fill="url(#SVGID_2_)" d="M176.8 34.5c0 3.2 2.6 5.7 5.7 5.7s5.7-2.6 5.7-5.7-2.6-5.7-5.7-5.7-5.7 2.5-5.7 5.7zm5.8-4c2.2 0 4 1.8 4 4s-1.8 4-4 4-4-1.8-4-4 1.8-4 4-4zm-.9 4.3V32c0-.3.2-.5.5-.5s.5.2.5.5v2.3h2.3c.3 0 .5.2.5.5s-.2.5-.5.5h-2.8c-.2 0-.5-.2-.5-.5zm2.2 24.8c-.5-.1-.8-.5-.8-1 0-.4.4-.7.8-.8h1c-.6-.6-1.5-1-2.4-1-1.5 0-2.8 1-3.2 2.5-.1.4-.4.7-.9.7h-.2c-.5-.1-.8-.6-.6-1 .7-2.7 3.4-4.3 6.1-3.6.8.2 1.5.6 2.1 1.1V56c.1-.5.5-.8 1-.8.4 0 .7.4.8.8v2.8c0 .5-.4.9-.9.9l-2.8-.1zm-1.3 5.5c-1.2 0-2.4-.5-3.3-1.2v.4c-.1.5-.5.8-1 .8-.4 0-.7-.4-.8-.8v-2.7c0-.5.4-.9.9-.9h2.8c.5.1.8.5.8 1 0 .4-.4.7-.8.8h-1c.6.6 1.5 1 2.4 1 1.5 0 2.8-1 3.2-2.5.2-.5.7-.7 1.1-.5.4.1.6.5.6 1-.6 2.1-2.6 3.7-4.9 3.6zm-156.8-28c3.5 0 6.3-2.8 6.3-6.3s-2.8-6.3-6.3-6.3-6.3 2.8-6.3 6.3c-.1 3.5 2.7 6.4 6.3 6.3-.1.1-.1.1 0 0zm0-10.6c2.4 0 4.3 1.9 4.3 4.3s-1.9 4.3-4.3 4.3-4.3-1.9-4.3-4.3 1.9-4.2 4.3-4.3zm-.9 4.7v-3c0-.3.2-.5.5-.5s.5.2.5.5v2.5h2.5c.3 0 .5.2.5.5s-.2.5-.5.5h-3c-.3 0-.5-.2-.5-.4v-.1zm6.4 28.3v3c0 .6-.4 1-1 1h-3c-.6 0-1-.4-1-1s.4-1 1-1h1c-.7-.7-1.6-1-2.5-1-1.6 0-3.1 1.1-3.5 2.7-.1.5-.5.8-1 .8h-.2c-.5-.1-.9-.7-.7-1.2.7-3 3.7-4.8 6.6-4.1.9.2 1.7.6 2.4 1.2v-.3c0-.6.4-1 1-1s1 .4.9.9zm-.2 5.9c-.7 3-3.7 4.8-6.6 4.1-.9-.2-1.7-.6-2.4-1.2v.3c0 .6-.4 1-1 1s-1-.4-1-1v-3c0-.6.4-1 1-1h3c.6 0 1 .4 1 1s-.4 1-1 1h-1c.7.7 1.6 1 2.5 1 1.6.1 3.1-1 3.6-2.6.2-.5.7-.8 1.2-.7.6.2.9.7.7 1.1zm57.3-19.6c3.5 0 6.3-2.8 6.3-6.3s-2.8-6.3-6.3-6.3-6.3 2.8-6.3 6.3c0 3.4 2.8 6.3 6.3 6.3zm0-10.7c2.4 0 4.3 1.9 4.3 4.3s-1.9 4.3-4.3 4.3-4.3-1.9-4.3-4.3 1.9-4.3 4.3-4.3zm-.9 4.7v-3c0-.3.2-.5.5-.5s.5.2.5.5v2.5h2.6c.3 0 .5.2.5.5s-.2.5-.5.5H88c-.3 0-.5-.2-.5-.5zm29 4.2v-3c0-.6.4-1 1-1h3c.6 0 1 .4 1 1s-.4 1-1 1h-1c.7.7 1.6 1 2.5 1 1.6 0 3.1-1.1 3.4-2.7.2-.5.7-.8 1.2-.7.5.1.8.7.7 1.2-.7 3-3.7 4.8-6.6 4.1-.9-.2-1.7-.6-2.4-1.2v.3c0 .6-.4 1-1 1s-.9-.4-.8-1zm.2-5.9c.7-3 3.7-4.8 6.6-4.1.9.2 1.7.6 2.4 1.2v-.3c0-.6.4-1 1-1s1 .4 1 1v3c0 .6-.4 1-1 1h-3c-.6 0-1-.4-1-1s.4-1 1-1h1c-.7-.7-1.6-1-2.5-1-1.6 0-3.1 1.1-3.4 2.7-.1.5-.5.8-1 .8h-.2c-.6-.2-1-.7-.9-1.3z"/></g></svg>
\ No newline at end of file
new file mode 100644
index 0000000000000000000000000000000000000000..bcbd97a43b05118b8bfcdb58ebaff8d13d235d9e
GIT binary patch
literal 7301
zc${5Vc{~*V|DQeBb<em7jalW&EjhE+V5x|xP$>~Qgbs2w&PKUbm#f33!zUf+c6^F0
zTS-N7<OqwBBS&=6Z`9}W_<p~?{bTku^M1ddujl)9Jl`{EYh9frM3qGW0FZEIqaFZ2
z0tx#uU6{BQW?r)a0F~9wsGVn2$4J-HP+u>V`fxS%tZXN~4EE7F;H*>7PDjM&e1O_&
z>E(fIeRQZ~Ax|%_70y@XMfLW$Na)!+Yo1yw&(YGANBzAtR~(*i)y#}*bRLdzEB$0T
zbocAZgwd?Skxg-FIN0HHq@L9o@@(<3>l@yi<(IB4VV6W{c&B-kc;vmid1X@xtE6cU
z+w-F5HP3!Ct-rkfTKAWmDR@!%;!Th3+<5nOE-zg4O1?OhEWgNb*;DexvBc)0<VDwu
z*Y6%bV0)K-y0See%fQxn{MAOaI%puc`sWGJPRHYNI&x2q)SkMWa5?#`Gu2_hMb719
zs6AKb;?9f8ckSG-d7SZx<C3`l&k1z<(tfl=@Aek%%n8dAmII1e0bL=L4FhEGgtm3Q
zd0$@`0O^9>eUkva!-vNB6a_$55DDhXW^D>hW5E7;$T5JLcL0ts%cRlJQb&OzU>85Z
z@8wJ28?*QbaYND`q~ieRcErR5X7{_rY4-?3xO_d`R#YGcW@2=ZKvM)^G78X*g{e3I
z0f|5Fj-N4ynZykkK&3nVF~o_P$QvPMw)(;d4$vo?w~!W|0aPVYEkqb9fZYyk0bCxi
zTiL+?NC=aP!3?H3`M0s1NjNK#1QNwb#0W}dW}iDK#{5G7$ey4xSpV&DtrcLGx`2j|
zVZK`>^?&HBUG(3BH$<7c9e8<`Ze{gueR?kqz!c3rPK3k5SXcl9X-u1%9`Rm%RJ|-N
zjQ{}f6r49d@AR-pklwKID18B_EfwDv?V4)ur+x|{6SP=l@HzOp^+*kC8H>PaX30Q~
z$s=~C_u_&Z;PdN^1Pq<-WTq}1lfP+k$a*|*ff*fNg0nx>^^2B?FNARVD8Q3Oi@)@S
zr)*68?IkRLf;5&Kla^H5fICE%k{6Z;Ei7?s{G9GUKnO0M7J{u*p&-lqE5+C2YhDtL
z1X5t;L1o1C*U+uWk6u3a_n-F9I?IN0Wq<S=_|)8I>M9KO4>_#2vTX~;b19Q8-75O%
zhFR5q#K&*E^~d1DC!4LVM9yV*-#zjrRPd>5*{cGBH<ez+vzyDhN2RNSOFCx*qis(-
z?<#p!>8m}v{baXWON4DJf6n7-<PF!c*68~w!uNk{tEOc{NEM)d)96RuB6Qu}XJ<U4
zBd^tL;ePMklf>WovR;txcmCwQyIM1!-HzAEPR-95)VQv{-l;y+P%8G^m8l_6$gEIV
z;%{h{{`%EFSJPXH5_*pI$NtweFDA@X`=kG5_GT|kkktM!Qy3j{ujuTTzu)6?ylV`$
zw9HmTbuI;e`#uL`8`=uIZRXu?;?t`^3Aer7^x5ypG_;C5IdIlG)QChQ3Uws}y-<-*
z=3o<sewuI0l~fRWabD2S*+q=Lz_jG5_nbPt2!Sw)@lSz=#;?JUh$3aG@O2&_859c`
zTb~&WdtwE1sA@zZ22eSZuL1B-5g_up5D#KD70OIV@}(DQG(eogpLpn6s_z%`*<YnL
zS(9?lvVT#wDPBwwJR7stmlP(LDA^18c0JnMr)T9{)^jd&{7d)_Gi+7WAoc-|qG|9J
zx=P6b1*8>`tG(;S{{A_`>#u7E_L`Z{P$wR3p(g@lArkv0zCVtuo)c$1SRPjYR}j;>
zQ?n0R=xO7l{7rYUI)C)5e#=O;vHvR*I0T%aFSM-^O5iHLlt;Ylw|{%WlJB<KPGwu7
zO+dt<4JyCarqL-mEkQwrvj%}OS<7mwp3z`?W7rZ=BlRvQN;-l7Wi&`NYZ=m~1WLVZ
zjG|KUpD(+sXB^!f!+~F-@v>Ep_qDibuyjXX=<Qql8R3-CH7+-vfW9ueuTJ@r?8Jnk
zFM{qnO;4Q{A(!zKxO=CCILW9VdzF`dh{ehZO^Gvskwd!=&9t}Y{W|tbp)GGN@Zga3
zkQ90gG2Zkf>Z=g6vglK$@)`>`krKsPkdoJ_bV^^o7tnm!;G&w;f#K7WK3&a^b!j{j
z^jo%q9g<1T3`CgJd++M2%CdE2e5)J=F6{OeQj6Uqb7-ycD=6$OS7X2skkW_YGH{Sz
z20%tJd_9`_jIUSlLao!Z!ZY~N#JVSS5;&g}&O`xRlmx+CIY^i%f#()jjw)_5Z#ssn
zWIvI7w8P{-eoc@aN1k1Bi+{eVKmzs;uE<mQ*Kx5bCof-Zp9$=jWdfgNp}!O411WW~
zZxvgN;;R=|ZWRY_kDi(MERPuf-se#wHwV#6M-1{dDf7ajgdq_)=#=Av<f590ID6Ft
zsI0nnIjDbQQkIZ3Pa<E?HQW&X=$P!+yY!o^QCw_;a>BU{m(z7_PD&#Ye=zwEg}IOQ
zK00cIm<O*ZxMu9Xqm}KE-C%mopIMcF|A#FES-?BBP3oY(t6Zoel&1QqC<^iD-+fvk
zv%k)|(Ch0G8;f_EdIj#N%?OfuUU~o3I}@D#Tl;khiXBj1h}92sl?$SoKd*m_oDe?9
zOGXb&bcj~lV1Im>626x045uM2Hl|(s5_WXFG**cgtyaoO8e-%&jHs#mJY8_C4Kr?_
zz#rH-aU4P$6r$f%G|5Y;BUCiypI{N?thP`BD8}~7zGAC@n==UT-6SM0W5HPtz?r(5
zwo?~>c1L=TM@c7Zza@Z5tJh)xr@;vori0EHdwcGcTc?8Uuc>lgFN39}I5i$A^#|dc
ziQjt)2Q45Co$Cx8_cX_Vy>#24zCVi{QAs+Omc-s{;qJb9H~LkZid$#WDU(ga$}*fy
zvY3mYg0M7&(|x|h)zx$3;>Db5^{O*zDZeQz6O?tRs6Xtnu2Etj4J>K%pL;5bav=*Z
z|6bBRThb8a^gn9fA|8a!BpYhhrV)pDfZ0My*|JEBTvgMWME1QW(V`@z&<U%$r~1zz
zzi^rwR39~f?@uxI_y5w$*gWmfJiFg;T48jvRiN9v>}bWnIrfYKuQB1kzNx($UF*9m
zhTeCU-ktQ*I5N1DXQ6V2r5pM2_y^gpi;VDyOYfz=>qi!bRv!|_t(AT|P+{umep~z@
z0Bmn?QxA0zT%J49a(c$C<9MV~;L(}Vfhal7g~zkVw}{cb@*2#5?%#1tr^m?)qzvwA
zA0lGK^TIoST*6X!#TV;~NoKwTdpAjLA|p>32oMnEOvJ6WC~V2$s42Su8QYY56zEBR
zz*mLg=-Esmd>nGO-G#9yadQfnRf86<IC910+=mMYw_GR1UUh=@^U-njCfTJO-m8Zf
z@o1kL82)wkLWHOtLJ%si8K1s}SjxiRZ{}W!t{`vK^|P+onx!v%__JFg`)Ap#vXJLK
zC8@Jt1}C;v$s!TgdyxY=rk)G&UeP^FLyS=Y7A4J@A#+QY)~Ihex3B11V!jhkO)X_y
z>uo0gMUCTdY>-E<kqD94CSP;sS-)L0gpBgAC`ry3@RIsjqHjHF{zLROGI?muLF{*R
ze)7H$^;nmQisM6|w%8Qrz7%d+TQoY<Ah<6*yf*9#z@g$-ydm*|G!P>9S)eR0>*`z)
z{EcVGkL_Q+7j?<25v9+c3mj!?ND|pel{bO6*bA6geUS-?bH`)P-k|ulLxq+Rnh8V@
ze04LojdYP92-Xoeqh_Zn7jsfYuNAxyzIwxlc<Uk|wl~xsw=2;WD9dxcc#Sy}*KGQs
zgFX7|>Mg5CX`Bw;KV_0iiOM8WI<X9?)5Xg_b*0kJol%PR?cx2U3c?6e;4`D>I$;ST
zM7b)W#SN)P%uvN_U4kc11QMoR1qvY!iHwS?mv7U3{XYN1$qf=HkOv^Hgo?Fk_NDX5
z5M09)2z0oC@0yPBALgGhd+&{nh`IuhCaMT7TjG+=PYy)=nZgQ2aJ-!$_~3W&W24)l
zj6r4~b%8*Db&Pny3u#9A8Y-dR99c#L+=D8NFI&(Ee$-pVw~QxF0jvRSBcj7n@R64*
z)_&MSq2lI5UvI778H<*;(beIVX!7YF`a7L%5F0x&2^qYBOhyaAZOofjEX<Hk?MF0#
z301`Y`8B=XrNq-3pKWB0H<LJ35OMmQ>UYrnqOsnKyX|wZuacZN(sfnC1oke7;ty~V
zj_TerF(jddkUO@CAl!3T!E3jhsxzg}3e6Y8w*)Uw;@|Oj!Z?Yy5lv%^B72p<Okrkh
zGXIn`cgXhzEPXw|+#{V%iD<8-;5hM$-Lb&r(723E>rP?LfdlEOBqH4Jm>OybfSSM*
zF(vSC^_<PCrbi_A;pzG-64|zd07<KpnbTyVf$Rkz&A34abL|CaCWL-}ZqQtx@NOYf
z09OI@Q#bx9{5sLB0#}hRgiDAc;M=+C%9zkT%YO5DgAZ=64)i?P5O=@XL9;n6W7os%
z)NIeKzLN2e5^F%0hsL14mBa;Rf6h{w<T6zk`%lLtn}MgLdRtUFz}qK2t~oi8e!pZ*
zPM~;>YWlhP#<T5@lzqET?r-!C->+X2nU_`(G<*Ey^vK!48xlx7XoTUE;!B`&pa1-p
z!yoaV_Y^jsj{q$?Yd>da;9|HPPX?mkYneMmIj!e3zmG9P@T$%i=LY9Mh41t0x4!mO
zMri)xk{|K(aHcp?L%{I?^f3BhJKCf4`3QT_d-HcUqkEKupYH9z9;+Y5c{7Hl#f(}&
z2~cTC=8yXoUe1b<|1fMI|8Y)LD#?ilAP_hQ^<uFxTjNk4pgt^VRx(QAtdPdFZhT~P
z>sG!aPpEh&s6<vXNvl6mx2;h^x_$1sX_Jo-uE;DVacz<Mg0!0D_soz*vru)*rtfC?
z+cVJ3n;%0K@_~z@S2+cg9;0~Z;l=&OP9)V^sQ4&wc8_};h%Ge2=zt(;aX53Q1m|rd
z3sv@0cQM=WplHRB;>xQa=T!CA%3&qAocNM#4cR)?>XpC;ftykW>&6tXu>`Tp6ig9e
z&>e&Saz<TSD=Hz*qG$zH#7?n!)kPM{)<k$Lu~;uTyg0Idte^fcDr3ERj?FDk3BOWh
zCQ9<Cz(4aC9=XP-B0L9Z1f$);<bwudD<#*tqmA`y!s$57Tv||fqFdT7{K13ez57Qk
zy1$%T^5Mx;xNK3$o^3@6v!iz`zeg_X-GABUC@X>F556Wt3fT`K=SaP^`XsIISG17!
zq*af8@_e=7x0ftWoKJfpj{tpCW+8yf0O4eWurT^_uA3kG{DX3Xk;Atyfh33wy8=AN
z0|@|uN8!A7m1Jk*;-r)xv{TwWtIp!@^)=Y&Ps*h8I>jYrzdoBHKrIChL|8!b@--{&
zYI1&69zT3X12SSBg{9X^;&!MQY7Q6Fh{|&I*OLeQmONXmVSsj4W}gQqgat0!sW*<^
zTKj0}U?QXr)Ruo3H*kDA7qhYly42w6kCi5|T`XW>NDmAriHLLVws+O9?2J=^dk7Zj
za-<vE)D1eWf3)gq3(R8jSiJ~_f`?##Z5j{e(h%|N)&wUI7w_lJ?QcZ}{7A|_o~}UJ
zH=GVG9!OxJ*1-KY*;-L-BSm!M)n7Hf?le#eeM9*jMIa)BgvfD@f6bjF={G*NnmiHW
zSG;>jdSI5E=EwCbit{u^#v+m3JHOb{)GW4-553#BdwMg1q+stQuS*7srcNa~Y1sdY
z(yo#QQ8oO^0wEzpAFhS&Q<s&iW(D8*VKmTx>w%4iIJ9ziYB%%mCFQi!+VAe7hd+6P
z>3kVxm`Xv|&)qaB&p^D5nS6M~Wcy21rZwnJ=eJ3z5=|Ek8+SY+L1}!?PqjLRZ;-@p
zv_8CgOztQ<(Om6yV*kc7I0&X0Gl_U`<v~;!vH_L0VY`2NXdr4~T282-K98Ci_{Qce
z8GH(hVQ`RZfQmPu!2mh36dncof+?cY%w$r8IEJHw`LTh&>;eWqY~R+C7CS%q>RwFj
zb5w)El-BCo=YLxg<GEjAq5MCqZZWCYra+AD5WrnB-Upf^D`w*ug4VoaKWz2QYnC86
zEV(tYWR4-=tnN!jhDk<vZ~`GYVQA=Md5TlOrE#MzuG8oH&PBaE&~xeW-=<~#n{*Iu
z0NMXc1`A{J5Uv`Sgsb7{BYoJ1RQ~G3UL%75*MPCz1u>m-h(9IEYw<d&y)+4KP6XYh
zi1L#{8;zOyH7AI<Lpc%X2;=$4iyf@)vgnFmHjxrP5&xoWQ*%*Bgp?gl`je>Nl>^|*
z(C&_%x(>WC-%Ax%YV<?yQ+YE6o&Dnq(ERGOK7jof>)&co0QJDK7z;IS_e}h3wb~uE
zcnCUjB>F$YOYp5aUdqU<lzwyAbiz$N#(dRKYURp!aN-_tQr-V#8Xirg)CVRro5UrT
z;Dt|wGL#@~d{g>B@|e}W*{-hGJylSiqk5j<*0yCw?J8vb4K(`Jm`yeLMs2uTZX7so
zc>&CRz1aMB(gMB)3iE9O@t={cjMT(nG&yw3$)kZ?w<nX>sItmA)0DN2kJ>7In4l86
zpP5XFn7%ygsovL}Kz9;!jZW2qPsP=SJ_$1LH{&*jWtP`Jv@88dD^CcOL-d7fAq#~#
zt=)@WJhpvXaeIozbKDjZwJAhgHx_WS`KMRi6Zu;Dt}rab(JiaWu8uO`-KhLDn1a8l
zlmevPzslbDv)w*2m&%bc$`t~N;ha!Eu)JvY&FjdoKG6*6Q=<F<2^DbpzZt0;4Y4Gf
zdcyvr0;%?=OpVHz60Ssb*Vx(NfKMM%*p51CD%sh!vuPS9|HNF9-EXr5?+orWP|iu<
zua=?}vrvFd^R+iX`<h6-xP~0;f8l1tzck3utmdW={Jp~qIYy4nw_SJcY{AX526th6
z)0}%{vh_$xsazn~qKs@TTwdpYQcnJE)Z&(_EFvT#NX6#)rS9##VZRCa>9WzOd8hXY
z{Ka=(Y)I#)oZS^$eT>14A3m{H38KLw@`UIT>Y5z1r*F;f!8K-9BydZwS^k=c*(a*s
z;$`I=xP##R=Ii<}ci2_1`iDl6y%2Jiep88)cIJ@TOwFX~)rT5GyTs=^S4k<satz}G
zf;aj2vbm3WLV(AHPX$3ggm{htpoln8aD{1WntGpD$l;}8M}*9Cu<d8=R>!a+cKoOk
z!?UfR*g~R}&$|w_=FPsV`EcWa%1_>B{9cqIN+zK#k%&sR#6BJH(cz92LJC!*wImgn
zPGkQTRCnt{hvPb4A)EU)TuTH@VxPyZFn<T3o|Kq!?AQ8tTuS|`eFxirG!_D)r@wWZ
zn6}(uj=!&^!8wo-c7lrAX{=>>E<{`uYJV5}%#jCph!RC3s{*@#&I>OSpVYY&;;{OB
z)Gw${YndvT#Fs%0_YX{jO5D(sty=NmV4ahg!#;vwjl@1-$N)X-&-^U2HzLCVTI6t%
zOyvG>+p?BH;_RA8;y2UjgQ#`t3#17kR3?i~E8f-!my<b*;_Po3POdJyZBTQkTk8GA
zwQM8!PCak<o+&}#J0l{WsG;81XI4auH42H~ZO_0*^7$*Dbnj8Z-l!Wd00DXD(YiuA
zYE<F4OXbj!-Kd8PaK9;cdTJ!S)cH+F5<ZWIF?UEH9~$4Q9}Fczw4Tbpl|}o!%$q=X
z2Xj{-mwgvRJa{m2bfju+BA!V5oFBXL@uJfdx|2pSSIgZ6C@RI0#)0G;VMysBSMir&
zwXzbLYhQ=4<RmmVz7DG;{(AF!i#M5IWjh|$edOJF*PQm<JBglep|m}W?})xo<zEy&
zM(U$Ly;JaVTjvd{zPx?uBMv6fY1CiM?g?y<;Ro@aJya$>kibrzn-T`sIbg6cZcThH
zBT9gD4(>!>!<bB9cLM&>Wa5qRAc>QLOIUlb)zs+68?<Rsf&@H+MJx-%te+Dq4rI&h
z5zmYOoxSRO`k=HcKXQ|$(83ZQ3SPpMB!MtX7?PydoHtP51fSn^XhIVr5Gc?hELj|0
zO2U4=BqIUfAu_)?m993N4uFd|ZfIep6a{yt!?-x|Ywys!_XT>NVdmc{aUzFAW`&cl
zaT6b(l$XD{QSjilbVhAQTU#lvr5$kG@zG#6W*Bl!K9+K9O=8M**fGaHHZ*l0)O<xu
z!I?ap!pmQC^i=}Jj?YaM7y(L&>_Me0UYk;P1|B`dV&-}=aXN6Q1Sm`3t60QsJerXW
zWyWb`*Iu9@GUVD)3JW!b6@zc3ut$ea2~#j5pd^30b_~qDo=K-yylpN}29a_qPZ@b2
zdgI_VW}--+Vidi9_30Oo`@0ztdW9rC2Q5D3w;Y~<?3l$Yi{S%e31zb)F7AONfx}1G
zX$ZNtki<eyVf$eZUq!R4MgdFL&p51cFZCIVk<Q(Ct<`MRj8icxD)nbxyeYO{J%^M@
zb`}JVHvp(h@n;xr(1uYeCYW7e5z4Z`sVW~&F^u;vJok1B4QApvSx|1WXEoClS?9S|
z9r<oT_*9`p=wP@8qKn;P_>;L%T6UW>s#EOhtqC_Qg4xlIXx!5tjlWx?kEM_0S3j6~
zz7kmqZ^m=6+zpHt91nPC-&GERgR0<5{K}(iSyBPxnL893ucI~AJv{=vaVAePZh1~o
z2Llo62w6!XZQJs0FEEjS+b|2^$@uZFP5a^vGOy1)dO7xMQaOhjb|MojA+a+}RdDQP
zIB-9n;5MC#t1=7K6R&2kM_1a$ypGA22^%>to0fokYSGl1TYB7>Z67fBqa4Q$E3`U%
z^ZUnMt8Y{9Po+}gV&Z(`b5#veUkLx*1t3Q6+3u-4<bA^ahZjl!HKn7R@QZfLwzs4{
zDb6-bg`5o?c~SnVRgAPv5BrJ+fN+098VHhW-^O$TeG1T*K$}jho~pdD_ucKebvr^n
zd`iI#WwN`Di{pHK)O`1)qxOCV)MRx^Hq{v^hY<JQ69NEfb!XHP(zf^0r6%82H`YYX
z;2K3Yh?1IbztD9&DuD)tI24P<Wq{z@6t*ks1LdXGtfbRFku_LLAaDC(dfXlmbVRQw
z(<fkfL<grMlV{dlrY1{Z8YDF@45yol%#FJ-b5CORvT|3xXF-sbQ*s^aFzL+H;*7_W
R=N$mz=j`B$UT1Ah{692J@+klS
--- a/browser/components/newtab/docs/v2-system-addon/data_dictionary.md
+++ b/browser/components/newtab/docs/v2-system-addon/data_dictionary.md
@@ -203,17 +203,17 @@ Schema definitions/validations that can 
 ```
 
 | KEY | DESCRIPTION | &nbsp; |
 |-----|-------------|:-----:|
 | `action_position` | [Optional] The index of the element in the `source` that was clicked. | :one:
 | `action` | [Required] Either `activity_stream_event`, `activity_stream_session`, or `activity_stream_performance`. | :one:
 | `addon_version` | [Required] Firefox build ID, i.e. `Services.appinfo.appBuildID`. | :one:
 | `client_id` | [Required] An identifier for this client. | :one:
-| `card_type` | [Optional] ("bookmark", "pocket", "trending", "pinned", "search") | :one:
+| `card_type` | [Optional] ("bookmark", "pocket", "trending", "pinned", "search", "spoc") | :one:
 | `search_vendor` | [Optional] the vendor of the search shortcut, one of ("google", "amazon", "wikipedia", "duckduckgo", "bing", etc.). This field only exists when `card_type = "search"` | :one:
 | `date` | [Auto populated by Onyx] The date in YYYY-MM-DD format. | :three:
 | `experiment_id` | [Optional] The unique identifier for a specific experiment. | :one:
 | `event_id` | [Required] An identifier shared by multiple performance pings that describe an entire request flow. | :one:
 | `event` | [Required] The type of event. Any user defined string ("click", "share", "delete", "more_items") | :one:
 | `highlight_type` | [Optional] Either ["bookmarks", "recommendation", "history"]. | :one:
 | `impression_id` | [Optional] The unique impression identifier for a specific client. | :one:
 | `ip` | [Auto populated by Onyx] The IP address of the client. | :two:
@@ -251,17 +251,17 @@ and losing focus. | :one:
 | `topsites_search_shortcuts` | [Optional] Number of search shortcut topsites. | :one:
 | `visibility_event_rcvd_ts` | [Optional][Server Counter][Server Alert for too many omissions] DOMHighResTimeStamp of when the page itself receives an event that document.visibilityState == visible. | :one:
 | `tiles` | [Required] A list of tile objects for the Pocket articles. Each tile object mush have a ID, optionally a "pos" property to indicate the tile position, and optionally a "shim" property unique to the impression from the Ad server | :one:
 | `click` | [Optional] An integer to record the 0-based index when user clicks on a Pocket tile. | :one:
 | `block` | [Optional] An integer to record the 0-based index when user blocks a Pocket tile. | :one:
 | `pocket` | [Optional] An integer to record the 0-based index when user saves a Pocket tile to Pocket. | :one:
 | `user_prefs` | [Required] The encoded integer of user's preferences. | :one: & :four:
 | `is_preloaded` | [Required] A boolean to signify whether the page is preloaded or not | :one:
-| `icon_type` | [Optional] ("tippytop", "rich_icon", "screenshot_with_icon", "screenshot", "no_image") | :one:
+| `icon_type` | [Optional] ("tippytop", "rich_icon", "screenshot_with_icon", "screenshot", "no_image", "custom_screenshot") | :one:
 | `region` | [Optional] A string maps to pref "browser.search.region", which is essentially the two letter ISO 3166-1 country code populated by the Firefox search service. Note that: 1). it reports "OTHER" for those regions with smaller Firefox user base (less than 10000) so that users cannot be uniquely identified; 2). it reports "UNSET" if this pref is missing; 3). it reports "EMPTY" if the value of this pref is an empty string. | :one:
 | `profile_creation_date` | [Optional] An integer to record the age of the Firefox profile as the total number of days since the UNIX epoch. | :one:
 | `message_id` | [required] A string identifier of the message in Activity Stream Router. | :one:
 | `has_flow_params` | [required] One of [true, false]. A boolean identifier that indicates if Firefox Accounts flow parameters are set or unset. | :one:
 | `displayed` | [required] 1: a SPOC is displayed; 0: non-displayed | :one:
 | `reason` | [required] The reason if a SPOC is not displayed, "n/a" for the displayed, one of ("frequency_cap", "blocked_by_user", "campaign_duplicate", "probability_selection", "below_min_score", "out_of_position", "n/a") | :one:
 | `full_recalc` | [required] Is it a full SPOCS recalculation: 0: false; 1: true. Recalculation case: 1). fetch SPOCS from Pocket endpoint. Non-recalculation cases: 1). An impression updates the SPOCS; 2). Any action that triggers the `selectLayoutRender ` | :one:
 
--- a/browser/components/newtab/docs/v2-system-addon/data_events.md
+++ b/browser/components/newtab/docs/v2-system-addon/data_events.md
@@ -126,18 +126,18 @@ A user event ping includes some basic me
 #### Clicking a top site item
 
 ```js
 {
   "event": "CLICK",
   "source": "TOP_SITES",
   "action_position": 2,
   "value": {
-    "card_type": ["pinned" | "search"],
-    "icon_type": ["screenshot_with_icon" | "screenshot" | "tippytop" | "rich_icon" | "no_image"],
+    "card_type": ["pinned" | "search" | "spoc"],
+    "icon_type": ["screenshot_with_icon" | "screenshot" | "tippytop" | "rich_icon" | "no_image" | "custom_screenshot"],
     // only exists if its card_type = "search"
     "search_vendor": "google"
   }
 
   // Basic metadata
   "action": "activity_stream_event",
   "page": ["about:newtab" | "about:home" | "about:welcome" | "unknown"],
   "client_id": "26288a14-5cc4-d14f-ae0a-bb01ef45be9c",
@@ -194,17 +194,17 @@ A user event ping includes some basic me
 
 ```js
 {
   "event": "DELETE",
   "source": "TOP_SITES",
   "action_position": 2,
   "value": {
     "card_type": "pinned",
-    "icon_type": ["screenshot_with_icon" | "screenshot" | "tippytop" | "rich_icon" | "no_image"]
+    "icon_type": ["screenshot_with_icon" | "screenshot" | "tippytop" | "rich_icon" | "no_image" | "custom_screenshot"]
   }
 
   // Basic metadata
   "action": "activity_stream_event",
   "page": ["about:newtab" | "about:home" | "about:welcome" | "unknown"],
   "client_id": "26288a14-5cc4-d14f-ae0a-bb01ef45be9c",
   "session_id": "005deed0-e3e4-4c02-a041-17405fd703f6",
   "addon_version": "20180710100040",
@@ -216,18 +216,18 @@ A user event ping includes some basic me
 #### Blocking a site
 
 ```js
 {
   "event": "BLOCK",
   "source": "TOP_SITES",
   "action_position": 2,
   "value": {
-    "card_type": ["pinned" | "search"],
-    "icon_type": ["screenshot_with_icon" | "screenshot" | "tippytop" | "rich_icon" | "no_image"],
+    "card_type": ["pinned" | "search" | "spoc"],
+    "icon_type": ["screenshot_with_icon" | "screenshot" | "tippytop" | "rich_icon" | "no_image" | "custom_screenshot"],
     // only exists if its card_type = "search"
     "search_vendor": "google"
   }
 
   // Basic metadata
   "action": "activity_stream_event",
   "page": ["about:newtab" | "about:home" | "about:welcome" | "unknown"],
   "client_id": "26288a14-5cc4-d14f-ae0a-bb01ef45be9c",
@@ -286,17 +286,17 @@ A user event ping includes some basic me
 
 ```js
 {
   "event": "OPEN_NEW_WINDOW",
   "source": "TOP_SITES",
   "action_position": 2,
   "value": {
     "card_type": "pinned",
-    "icon_type": ["screenshot_with_icon" | "screenshot" | "tippytop" | "rich_icon" | "no_image"]
+    "icon_type": ["screenshot_with_icon" | "screenshot" | "tippytop" | "rich_icon" | "no_image" | "custom_screenshot"]
   }
 
   // Basic metadata
   "action": "activity_stream_event",
   "page": ["about:newtab" | "about:home" | "about:welcome" | "unknown"],
   "client_id": "26288a14-5cc4-d14f-ae0a-bb01ef45be9c",
   "session_id": "005deed0-e3e4-4c02-a041-17405fd703f6",
   "addon_version": "20180710100040",
@@ -309,17 +309,17 @@ A user event ping includes some basic me
 
 ```js
 {
   "event": "OPEN_PRIVATE_WINDOW",
   "source": "TOP_SITES",
   "action_position": 2,
   "value": {
     "card_type": "pinned",
-    "icon_type": ["screenshot_with_icon" | "screenshot" | "tippytop" | "rich_icon" | "no_image"]
+    "icon_type": ["screenshot_with_icon" | "screenshot" | "tippytop" | "rich_icon" | "no_image" | "custom_screenshot"]
   }
 
   // Basic metadata
   "action": "activity_stream_event",
   "page": ["about:newtab" | "about:home" | "about:welcome" | "unknown"],
   "client_id": "26288a14-5cc4-d14f-ae0a-bb01ef45be9c",
   "session_id": "005deed0-e3e4-4c02-a041-17405fd703f6",
   "addon_version": "20180710100040",
--- a/browser/components/newtab/lib/ASRouter.jsm
+++ b/browser/components/newtab/lib/ASRouter.jsm
@@ -57,17 +57,17 @@ const { AttributionCode } = ChromeUtils.
 );
 
 const TRAILHEAD_CONFIG = {
   OVERRIDE_PREF: "trailhead.firstrun.branches",
   DID_SEE_ABOUT_WELCOME_PREF: "trailhead.firstrun.didSeeAboutWelcome",
   INTERRUPTS_EXPERIMENT_PREF: "trailhead.firstrun.interruptsExperiment",
   TRIPLETS_ENROLLED_PREF: "trailhead.firstrun.tripletsEnrolled",
   BRANCHES: {
-    interrupts: [["control"], ["join"], ["sync"], ["nofirstrun"], ["cards"]],
+    interrupts: [["join"], ["sync"], ["nofirstrun"], ["cards"]],
     triplets: [["supercharge"], ["payoff"], ["multidevice"], ["privacy"]],
   },
   LOCALES: ["en-US", "en-GB", "en-CA", "de", "de-DE", "fr", "fr-FR"],
   EXPERIMENT_RATIOS: [["", 0], ["interrupts", 1], ["triplets", 3]],
   // Per bug 1574003, for those who meet the targeting criteria of extended
   // triplets, 95% users (control group) will see the extended triplets, and
   // the rest 5% (holdback group) won't.
   EXPERIMENT_RATIOS_FOR_EXTENDED_TRIPLETS: [["control", 95], ["holdback", 5]],
@@ -990,21 +990,21 @@ class _ASRouter {
     const overrideValue = Services.prefs.getStringPref(
       TRAILHEAD_CONFIG.OVERRIDE_PREF,
       ""
     );
     if (overrideValue) {
       [interrupt, triplet] = overrideValue.split("-");
     }
 
-    // Use control Trailhead Branch (for cards) if we are showing RTAMO.
+    // Use join Trailhead Branch (for cards) if we are showing RTAMO.
     if (await this._hasAddonAttributionData()) {
       return {
         experiment,
-        interrupt: "control",
+        interrupt: "join",
         triplet: triplet || "privacy",
       };
     }
 
     // If a value is set in TRAILHEAD_OVERRIDE_PREF, it will be returned and no experiment will be set.
     if (overrideValue) {
       return { experiment, interrupt, triplet: triplet || "" };
     }
@@ -1034,18 +1034,19 @@ class _ASRouter {
       } else {
         interrupt = "join";
         triplet = await chooseBranch(
           `${userId}-triplets-branch`,
           TRAILHEAD_CONFIG.BRANCHES.triplets
         );
       }
     } else {
-      // If the user is not in a trailhead-compabtible locale, return the control experience and no experiment.
-      interrupt = "control";
+      // If the user is not in a trailhead-compabtible locale, return the join + supercharge (default) experience and no experiment.
+      interrupt = "join";
+      triplet = "supercharge";
     }
 
     return { experiment, interrupt, triplet };
   }
 
   // Dispatch a TRAILHEAD_ENROLL_EVENT action
   _sendTrailheadEnrollEvent(data) {
     this.dispatchToAS({
--- a/browser/components/newtab/lib/ASRouterTargeting.jsm
+++ b/browser/components/newtab/lib/ASRouterTargeting.jsm
@@ -18,23 +18,16 @@ XPCOMUtils.defineLazyModuleGetters(this,
   ShellService: "resource:///modules/ShellService.jsm",
   TelemetryEnvironment: "resource://gre/modules/TelemetryEnvironment.jsm",
   AppConstants: "resource://gre/modules/AppConstants.jsm",
   AttributionCode: "resource:///modules/AttributionCode.jsm",
   FilterExpressions:
     "resource://gre/modules/components-utils/FilterExpressions.jsm",
 });
 
-XPCOMUtils.defineLazyServiceGetter(
-  this,
-  "UpdateManager",
-  "@mozilla.org/updates/update-manager;1",
-  "nsIUpdateManager"
-);
-
 XPCOMUtils.defineLazyPreferenceGetter(
   this,
   "cfrFeaturesUserPref",
   "browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features",
   true
 );
 XPCOMUtils.defineLazyPreferenceGetter(
   this,
@@ -449,26 +442,16 @@ const TargetingGetters = {
     return false;
   },
   get hasAccessedFxAPanel() {
     return hasAccessedFxAPanel;
   },
   get isWhatsNewPanelEnabled() {
     return isWhatsNewPanelEnabled;
   },
-  get earliestFirefoxVersion() {
-    if (UpdateManager.updateCount) {
-      const earliestFirefoxVersion = UpdateManager.getUpdateAt(
-        UpdateManager.updateCount - 1
-      ).previousAppVersion;
-      return parseInt(earliestFirefoxVersion.match(/\d+/), 10);
-    }
-
-    return null;
-  },
   get isFxABadgeEnabled() {
     return isFxABadgeEnabled;
   },
   get userPrefs() {
     return {
       cfrFeatures: cfrFeaturesUserPref,
       cfrAddons: cfrAddonsUserPref,
       snippets: snippetsUserPref,
--- a/browser/components/newtab/lib/ActivityStream.jsm
+++ b/browser/components/newtab/lib/ActivityStream.jsm
@@ -501,16 +501,24 @@ const PREFS_CONFIG = new Map([
     "discoverystream.endpoints",
     {
       title:
         "Endpoint prefixes (comma-separated) that are allowed to be requested",
       value: "https://getpocket.cdn.mozilla.net/,https://spocs.getpocket.com/",
     },
   ],
   [
+    "discoverystream.engagementLabelEnabled",
+    {
+      title:
+        "Allow the display of engagement labels for discovery stream components (eg: Trending, Popular, etc)",
+      value: false,
+    },
+  ],
+  [
     "discoverystream.spoc.impressions",
     {
       title: "Track spoc impressions",
       skipBroadcast: true,
       value: "{}",
     },
   ],
   [
--- a/browser/components/newtab/lib/OnboardingMessageProvider.jsm
+++ b/browser/components/newtab/lib/OnboardingMessageProvider.jsm
@@ -19,60 +19,81 @@ const ONE_MINUTE = 60 * 1000;
 
 const L10N = new Localization([
   "branding/brand.ftl",
   "browser/branding/brandings.ftl",
   "browser/branding/sync-brand.ftl",
   "browser/newtab/onboarding.ftl",
 ]);
 
+const TRAILHEAD_ONBOARDING_TEMPLATE = {
+  trigger: { id: "firstRun" },
+  template: "trailhead",
+  includeBundle: {
+    length: 3,
+    template: "onboarding",
+    trigger: { id: "showOnboarding" },
+  },
+};
+
+const TRAILHEAD_MODAL_VARIANT_CONTENT = {
+  className: "joinCohort",
+  benefits: ["sync", "monitor", "lockwise"].map(id => ({
+    id,
+    title: { string_id: `onboarding-benefit-${id}-title` },
+    text: { string_id: `onboarding-benefit-${id}-text` },
+  })),
+  learn: {
+    text: { string_id: "onboarding-welcome-modal-family-learn-more" },
+    url: "https://www.mozilla.org/firefox/accounts/",
+  },
+  form: {
+    title: { string_id: "onboarding-welcome-form-header" },
+    text: { string_id: "onboarding-join-form-body" },
+    email: { string_id: "onboarding-join-form-email" },
+    button: { string_id: "onboarding-join-form-continue" },
+  },
+  skipButton: { string_id: "onboarding-start-browsing-button-label" },
+};
+
+const JOIN_CONTENT = {
+  className: "joinCohort",
+  title: { string_id: "onboarding-welcome-body" },
+  benefits: ["products", "knowledge", "privacy"].map(id => ({
+    id,
+    title: { string_id: `onboarding-benefit-${id}-title` },
+    text: { string_id: `onboarding-benefit-${id}-text` },
+  })),
+  learn: {
+    text: { string_id: "onboarding-welcome-learn-more" },
+    url: "https://www.mozilla.org/firefox/accounts/",
+  },
+  form: {
+    title: { string_id: "onboarding-join-form-header" },
+    text: { string_id: "onboarding-join-form-body" },
+    email: { string_id: "onboarding-join-form-email" },
+    button: { string_id: "onboarding-join-form-continue" },
+  },
+  skipButton: { string_id: "onboarding-start-browsing-button-label" },
+};
+
 const ONBOARDING_MESSAGES = () => [
   {
     id: "TRAILHEAD_1",
-    template: "trailhead",
-    targeting: "trailheadInterrupt == 'join'",
-    trigger: { id: "firstRun" },
-    includeBundle: {
-      length: 3,
-      template: "onboarding",
-      trigger: { id: "showOnboarding" },
-    },
     utm_term: "trailhead-join",
+    ...TRAILHEAD_ONBOARDING_TEMPLATE,
     content: {
-      className: "joinCohort",
-      title: { string_id: "onboarding-welcome-body" },
-      benefits: ["products", "knowledge", "privacy"].map(id => ({
-        id,
-        title: { string_id: `onboarding-benefit-${id}-title` },
-        text: { string_id: `onboarding-benefit-${id}-text` },
-      })),
-      learn: {
-        text: { string_id: "onboarding-welcome-learn-more" },
-        url: "https://www.mozilla.org/firefox/accounts/",
-      },
-      form: {
-        title: { string_id: "onboarding-join-form-header" },
-        text: { string_id: "onboarding-join-form-body" },
-        email: { string_id: "onboarding-join-form-email" },
-        button: { string_id: "onboarding-join-form-continue" },
-      },
-      skipButton: { string_id: "onboarding-start-browsing-button-label" },
+      ...JOIN_CONTENT,
     },
   },
   {
     id: "TRAILHEAD_2",
-    template: "trailhead",
     targeting: "trailheadInterrupt == 'sync'",
-    trigger: { id: "firstRun" },
-    includeBundle: {
-      length: 3,
-      template: "onboarding",
-      trigger: { id: "showOnboarding" },
-    },
     utm_term: "trailhead-sync",
+    ...TRAILHEAD_ONBOARDING_TEMPLATE,
     content: {
       className: "syncCohort",
       title: { string_id: "onboarding-sync-welcome-header" },
       subtitle: { string_id: "onboarding-sync-welcome-content" },
       benefits: [],
       learn: {
         text: { string_id: "onboarding-sync-welcome-learn-more-link" },
         url: "https://www.mozilla.org/firefox/accounts/",
@@ -83,33 +104,66 @@ const ONBOARDING_MESSAGES = () => [
         email: { string_id: "onboarding-sync-form-input" },
         button: { string_id: "onboarding-sync-form-continue-button" },
       },
       skipButton: { string_id: "onboarding-sync-form-skip-login-button" },
     },
   },
   {
     id: "TRAILHEAD_3",
-    template: "trailhead",
     targeting: "trailheadInterrupt == 'cards'",
-    trigger: { id: "firstRun" },
-    includeBundle: {
-      length: 3,
-      template: "onboarding",
-      trigger: { id: "showOnboarding" },
-    },
     utm_term: "trailhead-cards",
+    ...TRAILHEAD_ONBOARDING_TEMPLATE,
   },
   {
     id: "TRAILHEAD_4",
     template: "trailhead",
     targeting: "trailheadInterrupt == 'nofirstrun'",
     trigger: { id: "firstRun" },
   },
   {
+    id: "TRAILHEAD_5",
+    targeting: "trailheadInterrupt == 'modal_control'",
+    utm_term: "trailhead-modal_control",
+    ...TRAILHEAD_ONBOARDING_TEMPLATE,
+    content: {
+      ...JOIN_CONTENT,
+    },
+  },
+  {
+    id: "TRAILHEAD_6",
+    targeting: "trailheadInterrupt == 'modal_variant_a'",
+    utm_term: "trailhead-modal_variant_a",
+    ...TRAILHEAD_ONBOARDING_TEMPLATE,
+    content: {
+      ...TRAILHEAD_MODAL_VARIANT_CONTENT,
+      title: { string_id: "onboarding-welcome-modal-get-body" },
+    },
+  },
+  {
+    id: "TRAILHEAD_7",
+    targeting: "trailheadInterrupt == 'modal_variant_b'",
+    utm_term: "trailhead-modal_variant_b",
+    ...TRAILHEAD_ONBOARDING_TEMPLATE,
+    content: {
+      ...TRAILHEAD_MODAL_VARIANT_CONTENT,
+      title: { string_id: "onboarding-welcome-modal-supercharge-body" },
+    },
+  },
+  {
+    id: "TRAILHEAD_8",
+    targeting: "trailheadInterrupt == 'modal_variant_c'",
+    utm_term: "trailhead-modal_variant_c",
+    ...TRAILHEAD_ONBOARDING_TEMPLATE,
+    content: {
+      ...TRAILHEAD_MODAL_VARIANT_CONTENT,
+      title: { string_id: "onboarding-welcome-modal-privacy-body" },
+    },
+  },
+  {
     id: "EXTENDED_TRIPLETS_1",
     template: "extended_triplets",
     campaign: "firstrun_triplets",
     targeting:
       "trailheadTriplet && ((currentDate|date - profileAgeCreated) / 86400000) < 7",
     includeBundle: {
       length: 3,
       template: "onboarding",
@@ -339,27 +393,16 @@ const ONBOARDING_MESSAGES = () => [
           },
         },
       },
     },
     targeting: "trailheadTriplet == 'payoff'",
     trigger: { id: "showOnboarding" },
   },
   {
-    id: "FXA_1",
-    template: "fxa_overlay",
-    content: {},
-    trigger: { id: "firstRun" },
-    includeBundle: {
-      length: 3,
-      template: "onboarding",
-      trigger: { id: "showOnboarding" },
-    },
-  },
-  {
     id: "RETURN_TO_AMO_1",
     template: "return_to_amo_overlay",
     content: {
       header: { string_id: "onboarding-welcome-header" },
       title: { string_id: "return-to-amo-sub-header" },
       addon_icon: null,
       icon: "gift-extension",
       text: {
--- a/browser/components/newtab/lib/ToolbarPanelHub.jsm
+++ b/browser/components/newtab/lib/ToolbarPanelHub.jsm
@@ -155,17 +155,24 @@ class _ToolbarPanelHub {
 
   // Render what's new messages into the panel.
   async renderMessages(win, doc, containerId, options = {}) {
     const messages =
       (options.force && options.messages) ||
       (await this.messages).sort(this._sortWhatsNewMessages);
     const container = doc.getElementById(containerId);
 
-    if (messages && !container.querySelector(".whatsNew-message")) {
+    if (messages) {
+      // Targeting attribute state might have changed making new messages
+      // available and old messages invalid, we need to refresh
+      for (const prevMessageEl of container.querySelectorAll(
+        ".whatsNew-message"
+      )) {
+        container.removeChild(prevMessageEl);
+      }
       let previousDate = 0;
       // Get and store any variable part of the message content
       this.state.contentArguments = await this._contentArguments();
       for (let message of messages) {
         container.appendChild(
           this._createMessageElements(win, doc, message, previousDate)
         );
         previousDate = message.content.published_date;
--- a/browser/components/newtab/locales-src/newtab.ftl
+++ b/browser/components/newtab/locales-src/newtab.ftl
@@ -78,16 +78,30 @@ newtab-menu-open-new-window = Open in a 
 newtab-menu-open-new-private-window = Open in a New Private Window
 newtab-menu-dismiss = Dismiss
 newtab-menu-pin = Pin
 newtab-menu-unpin = Unpin
 newtab-menu-delete-history = Delete from History
 newtab-menu-save-to-pocket = Save to { -pocket-brand-name }
 newtab-menu-delete-pocket = Delete from { -pocket-brand-name }
 newtab-menu-archive-pocket = Archive in { -pocket-brand-name }
+newtab-menu-show-privacy-info = Our sponsors & your privacy
+
+## Message displayed in a modal window to explain privacy and provide context for sponsored content.
+
+newtab-privacy-modal-button-done = Done
+newtab-privacy-modal-header = Your privacy matters.
+newtab-privacy-modal-paragraph =
+    In addition to dishing up captivating stories, we also show you relevant,
+    highly-vetted content from select sponsors. Rest assured, your browsing
+    data never leaves your personal copy of { -brand-product-name } — we don’t see it, and our
+    sponsors don’t either.
+newtab-privacy-modal-link = Learn how privacy works on the new tab
+
+##
 
 # Bookmark is a noun in this case, "Remove bookmark".
 newtab-menu-remove-bookmark = Remove Bookmark
 # Bookmark is a verb here.
 newtab-menu-bookmark = Bookmark
 
 ## Context Menu - Downloaded Menu. "Download" in these cases is not a verb,
 ## it is a noun. As in, "Copy the link that belongs to this downloaded item".
--- a/browser/components/newtab/locales-src/onboarding.ftl
+++ b/browser/components/newtab/locales-src/onboarding.ftl
@@ -13,16 +13,21 @@
 onboarding-button-label-learn-more = Learn More
 onboarding-button-label-get-started = Get Started
 
 ## Welcome modal dialog strings
 
 onboarding-welcome-header = Welcome to { -brand-short-name }
 onboarding-welcome-body = You’ve got the browser.<br/>Meet the rest of { -brand-product-name }.
 onboarding-welcome-learn-more = Learn more about the benefits.
+onboarding-welcome-modal-get-body = You’ve got the browser.<br/>Now get the most out of { -brand-product-name }.
+onboarding-welcome-modal-supercharge-body = Supercharge your privacy protection.
+onboarding-welcome-modal-privacy-body = You’ve got the browser. Let’s add more privacy protection.
+onboarding-welcome-modal-family-learn-more = Learn about the { -brand-product-name } family of products.
+onboarding-welcome-form-header = Start Here
 
 onboarding-join-form-header = Join { -brand-product-name }
 onboarding-join-form-body = Enter your email address to get started.
 onboarding-join-form-email =
     .placeholder = Enter email
 onboarding-join-form-email-error = Valid email required
 onboarding-join-form-legal = By proceeding, you agree to the <a data-l10n-name="terms">Terms of Service</a> and <a data-l10n-name="privacy">Privacy Notice</a>.
 onboarding-join-form-continue = Continue
@@ -32,18 +37,16 @@ onboarding-cards-dismiss =
     .title = Dismiss
     .aria-label = Dismiss
 
 ## Firefox Sync modal dialog strings.
 
 onboarding-sync-welcome-header = Take { -brand-product-name } with You
 onboarding-sync-welcome-content = Get your bookmarks, history, passwords and other settings on all your devices.
 onboarding-sync-welcome-learn-more-link = Learn more about Firefox Accounts
-onboarding-sync-form-invalid-input = Valid email required
-onboarding-sync-legal-notice = By proceeding, you agree to the <a data-l10n-name="terms">Terms of Service</a> and <a data-l10n-name="privacy">Privacy Notice</a>.
 
 onboarding-sync-form-input =
     .placeholder = Email
 
 onboarding-sync-form-continue-button = Continue
 onboarding-sync-form-skip-login-button = Skip this step
 
 ## This is part of the line "Enter your email to continue to Firefox Sync"
@@ -64,16 +67,25 @@ onboarding-benefit-knowledge-text = Learn everything you need to know to stay smarter and safer online.
 onboarding-benefit-privacy-title = True Privacy
 # "Personal Data Promise" is a concept that should be translated consistently
 # across the product. It refers to a concept shown elsewhere to the user: "The
 # Firefox Personal Data Promise is the way we honor your data in everything we
 # make and do. We take less data. We keep it safe. And we make sure that we are
 # transparent about how we use it."
 onboarding-benefit-privacy-text = Everything we do honors our Personal Data Promise: Take less. Keep it safe. No secrets.
 
+onboarding-benefit-sync-title = { -sync-brand-short-name }
+onboarding-benefit-sync-text = Take your bookmarks, passwords, history, and more everywhere you use { -brand-product-name }.
+
+onboarding-benefit-monitor-title = { -monitor-brand-short-name }
+onboarding-benefit-monitor-text = Get notified when your personal info is in a known data breach.
+
+onboarding-benefit-lockwise-title = { -lockwise-brand-short-name }
+onboarding-benefit-lockwise-text = Manage passwords that are protected and portable.
+
 
 ## These strings belong to the individual onboarding messages.
 
 ## Each message has a title and a description of what the browser feature is.
 ## Each message also has an associated button for the user to try the feature.
 ## The string for the button is found above, in the UI strings section
 
 onboarding-tracking-protection-title2 = Protection From Tracking
--- a/browser/components/newtab/mochitest.sh
+++ b/browser/components/newtab/mochitest.sh
@@ -1,14 +1,16 @@
 #!/bin/bash
 
 export SHELL=/bin/bash
 export TASKCLUSTER_ROOT_URL="https://taskcluster.net"
 # Display required for `browser_parsable_css` tests
 export DISPLAY=:99.0
+# Required to support the unicode in the output
+export LC_ALL=C.UTF-8
 /sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_99.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -ac -screen 0 1280x1024x16 -extension RANDR
 
 # Pull latest m-c and update tip
 cd /mozilla-central && hg pull && hg update -C
 
 # Build Activity Stream and copy the output to m-c
 cd /activity-stream && npm install . && npm run buildmc
 
--- a/browser/components/newtab/prerendered/activity-stream-debug.html
+++ b/browser/components/newtab/prerendered/activity-stream-debug.html
@@ -4,16 +4,17 @@
 
 <!doctype html>
 <html>
   <head>
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
     <title data-l10n-id="newtab-page-title"></title>
     <link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
+    <link rel="localization" href="branding/brand.ftl" />
     <link rel="localization" href="browser/branding/brandings.ftl" />
     <link rel="localization" href="browser/newtab/newtab.ftl" />
     <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
     <link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
     <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"></div>
--- a/browser/components/newtab/prerendered/activity-stream-noscripts.html
+++ b/browser/components/newtab/prerendered/activity-stream-noscripts.html
@@ -4,16 +4,17 @@
 
 <!doctype html>
 <html>
   <head>
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
     <title data-l10n-id="newtab-page-title"></title>
     <link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
+    <link rel="localization" href="branding/brand.ftl" />
     <link rel="localization" href="browser/branding/brandings.ftl" />
     <link rel="localization" href="browser/newtab/newtab.ftl" />
     <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
     <link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
     <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"></div>
--- a/browser/components/newtab/prerendered/activity-stream.html
+++ b/browser/components/newtab/prerendered/activity-stream.html
@@ -4,16 +4,17 @@
 
 <!doctype html>
 <html>
   <head>
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
     <title data-l10n-id="newtab-page-title"></title>
     <link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
+    <link rel="localization" href="branding/brand.ftl" />
     <link rel="localization" href="browser/branding/brandings.ftl" />
     <link rel="localization" href="browser/newtab/newtab.ftl" />
     <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
     <link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
     <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"></div>
--- a/browser/components/newtab/test/browser/browser_aboutwelcome.js
+++ b/browser/components/newtab/test/browser/browser_aboutwelcome.js
@@ -87,16 +87,27 @@ add_task(async function test_trailhead_b
       ".trailhead.syncCohort",
       "button[data-l10n-id=onboarding-data-sync-button2]",
       "button[data-l10n-id=onboarding-firefox-monitor-button]",
       "button[data-l10n-id=onboarding-mobile-phone-button]",
     ]
   );
 
   await test_trailhead_branch(
+    "modal_variant_a-supercharge",
+    // Expected selectors:
+    [
+      ".trailhead.joinCohort",
+      "p[data-l10n-id=onboarding-benefit-sync-text]",
+      "p[data-l10n-id=onboarding-benefit-monitor-text]",
+      "p[data-l10n-id=onboarding-benefit-lockwise-text]",
+    ]
+  );
+
+  await test_trailhead_branch(
     "cards-multidevice",
     // Expected selectors:
     [
       "button[data-l10n-id=onboarding-mobile-phone-button]",
       "button[data-l10n-id=onboarding-pocket-anywhere-button]",
       "button[data-l10n-id=onboarding-send-tabs-button]",
     ],
     // Unexpected selectors:
@@ -115,17 +126,9 @@ add_task(async function test_trailhead_b
   );
 
   await test_trailhead_branch(
     "nofirstrun",
     [],
     // Unexpected selectors:
     ["#trailheadDialog", ".trailheadCards"]
   );
-
-  await test_trailhead_branch(
-    "control",
-    // Expected selectors:
-    [".firstrun-scene"],
-    // Unexpected selectors:
-    ["#trailheadDialog", ".trailheadCards"]
-  );
 });
--- a/browser/components/newtab/test/browser/browser_onboarding_rtamo.js
+++ b/browser/components/newtab/test/browser/browser_onboarding_rtamo.js
@@ -19,17 +19,17 @@ async function setRTAMOOnboarding() {
   AttributionCode._clearCache();
   const data = await AttributionCode.getAttrDataAsync();
   Assert.equal(
     data.source,
     "addons.mozilla.org",
     "Attribution data should be set"
   );
 
-  Services.prefs.setCharPref(BRANCH_PREF, "control");
+  Services.prefs.setCharPref(BRANCH_PREF, "join-supercharge");
 
   // Reset trailhead so it loads the new branch.
   Services.prefs.clearUserPref("trailhead.firstrun.didSeeAboutWelcome");
   await ASRouter.setState({ trailheadInitialized: false });
   await ASRouter.setupTrailhead();
   ASRouter._updateMessageProviders();
   await ASRouter.loadMessagesFromAllProviders();
 
--- a/browser/components/newtab/test/schemas/pings.js
+++ b/browser/components/newtab/test/schemas/pings.js
@@ -125,23 +125,25 @@ export const UserEventAction = Joi.objec
       action_position: Joi.number().integer(),
       value: Joi.object().keys({
         icon_type: Joi.valid([
           "tippytop",
           "rich_icon",
           "screenshot_with_icon",
           "screenshot",
           "no_image",
+          "custom_screenshot",
         ]),
         card_type: Joi.valid([
           "bookmark",
           "trending",
           "pinned",
           "pocket",
           "search",
+          "spoc",
         ]),
         search_vendor: Joi.valid(["google", "amazon"]),
         has_flow_params: Joi.bool(),
       }),
     })
     .required(),
   meta: Joi.object()
     .keys({
--- a/browser/components/newtab/test/unit/asrouter/ASRouter.test.js
+++ b/browser/components/newtab/test/unit/asrouter/ASRouter.test.js
@@ -2878,18 +2878,18 @@ describe("ASRouter", () => {
       };
       const configWithTripletsExperiment = {
         experiment: "triplets",
         interrupt: "join",
         triplet: "privacy",
       };
       const configWithoutExperiment = {
         experiment: "",
-        interrupt: "control",
-        triplet: "",
+        interrupt: "join",
+        triplet: "supercharge",
       };
 
       it("should generates an experiment/branch configuration and update Router.state", async () => {
         const config = configWithoutExperiment;
         sandbox.stub(Router, "_generateTrailheadBranches").resolves(config);
 
         await Router.setupTrailhead();
 
@@ -3008,27 +3008,35 @@ describe("ASRouter", () => {
           .withArgs(TRAILHEAD_CONFIG.OVERRIDE_PREF)
           .returns("nofirstrun");
         checkReturnValue({
           experiment: "",
           interrupt: "nofirstrun",
           triplet: "",
         });
       });
-      it("should return control experience with no experiment if locale is NOT in TRAILHEAD_LOCALES", async () => {
+      it("should return default experience with no experiment if locale is NOT in TRAILHEAD_LOCALES", async () => {
         sandbox
           .stub(global.Services.locale, "appLocaleAsLangTag")
           .get(() => "zh-CN");
-        checkReturnValue({ experiment: "", interrupt: "control", triplet: "" });
+        checkReturnValue({
+          experiment: "",
+          interrupt: "join",
+          triplet: "supercharge",
+        });
       });
-      it("should return control experience with no experiment if locale is NOT in TRAILHEAD_LOCALES", async () => {
+      it("should return default experience with no experiment if locale is NOT in TRAILHEAD_LOCALES", async () => {
         sandbox
           .stub(global.Services.locale, "appLocaleAsLangTag")
           .get(() => "zh-CN");
-        checkReturnValue({ experiment: "", interrupt: "control", triplet: "" });
+        checkReturnValue({
+          experiment: "",
+          interrupt: "join",
+          triplet: "supercharge",
+        });
       });
       it("should roll for experiment if locale is in TRAILHEAD_LOCALES", async () => {
         sandbox.stub(global.Sampling, "ratioSample").resolves(1); // 1 = interrupts experiment
         sandbox
           .stub(global.Services.locale, "appLocaleAsLangTag")
           .get(() => "en-US");
         checkReturnValue({
           experiment: "interrupts",
--- a/browser/components/newtab/test/unit/asrouter/ASRouterTargeting.test.js
+++ b/browser/components/newtab/test/unit/asrouter/ASRouterTargeting.test.js
@@ -75,39 +75,24 @@ describe("#CachedTargetingGetter", () =>
       },
     };
     await ASRouterTargeting.findMatchingMessage({
       messages,
       trigger: { id: "firstRun" },
       context,
     });
 
-    assert.equal(stub.callCount, 6);
+    const messageCount = messages.filter(
+      message => message.trigger && message.trigger.id === "firstRun"
+    ).length;
+
+    assert.equal(stub.callCount, messageCount);
     const calls = stub.getCalls().map(call => call.args[0]);
     const lastCall = calls[calls.length - 1];
-    assert.equal(lastCall.id, "FXA_1");
-  });
-  it("should return FxA message (is fallback)", async () => {
-    const messages = (await OnboardingMessageProvider.getUntranslatedMessages()).filter(
-      m => m.id !== "RETURN_TO_AMO_1"
-    );
-    const context = {
-      attributionData: {
-        campaign: "non-fx-button",
-        source: "addons.mozilla.org",
-      },
-    };
-    const result = await ASRouterTargeting.findMatchingMessage({
-      messages,
-      trigger: { id: "firstRun" },
-      context,
-    });
-
-    assert.isDefined(result);
-    assert.equal(result.id, "FXA_1");
+    assert.equal(lastCall.id, "TRAILHEAD_1");
   });
   describe("sortMessagesByPriority", () => {
     it("should sort messages in descending priority order", async () => {
       const [
         m1,
         m2,
         m3,
       ] = await OnboardingMessageProvider.getUntranslatedMessages();
--- a/browser/components/newtab/test/unit/asrouter/ModalOverlay.test.jsx
+++ b/browser/components/newtab/test/unit/asrouter/ModalOverlay.test.jsx
@@ -52,9 +52,18 @@ describe("ModalOverlayWrapper", () => {
     mount(<ModalOverlayWrapper document={fakeDoc} onClose={onClose} />);
 
     // Simulate onkeydown being called
     const [, callback] = fakeDoc.addEventListener.firstCall.args;
     callback({ key: "Ctrl" });
 
     assert.notCalled(onClose);
   });
+
+  it("should not call props.onClose when clicked outside dialog", async () => {
+    const onClose = sandbox.stub();
+    const wrapper = mount(
+      <ModalOverlayWrapper document={fakeDoc} onClose={onClose} />
+    );
+    wrapper.find("div.modalOverlayOuter.active").simulate("click");
+    assert.notCalled(onClose);
+  });
 });
--- a/browser/components/newtab/test/unit/asrouter/templates/Interrupt.test.jsx
+++ b/browser/components/newtab/test/unit/asrouter/templates/Interrupt.test.jsx
@@ -1,11 +1,10 @@
 import { Interrupt } from "content-src/asrouter/templates/FirstRun/Interrupt";
 import { ReturnToAMO } from "content-src/asrouter/templates/ReturnToAMO/ReturnToAMO";
-import { StartupOverlay } from "content-src/asrouter/templates/StartupOverlay/StartupOverlay";
 import { Trailhead } from "content-src/asrouter/templates//Trailhead/Trailhead";
 import { shallow } from "enzyme";
 import React from "react";
 
 describe("<Interrupt>", () => {
   let wrapper;
   it("should render Return TO AMO when the message has a template of return_to_amo_overlay", () => {
     wrapper = shallow(
@@ -16,22 +15,16 @@ describe("<Interrupt>", () => {
     assert.lengthOf(wrapper.find(ReturnToAMO), 1);
   });
   it("should render Trailhead when the message has a template of trailhead", () => {
     wrapper = shallow(
       <Interrupt message={{ id: "FOO", content: {}, template: "trailhead" }} />
     );
     assert.lengthOf(wrapper.find(Trailhead), 1);
   });
-  it("should render StartupOverlay when the message has a template of fxa_overlay", () => {
-    wrapper = shallow(
-      <Interrupt message={{ id: "FOO", template: "fxa_overlay" }} />
-    );
-    assert.lengthOf(wrapper.find(StartupOverlay), 1);
-  });
   it("should throw an error if another type of message is dispatched", () => {
     assert.throws(() => {
       wrapper = shallow(
         <Interrupt message={{ id: "FOO", template: "something" }} />
       );
     });
   });
 });
--- a/browser/components/newtab/test/unit/common/Reducers.test.js
+++ b/browser/components/newtab/test/unit/common/Reducers.test.js
@@ -895,16 +895,28 @@ describe("Reducers", () => {
   });
   describe("DiscoveryStream", () => {
     it("should return INITIAL_STATE by default", () => {
       assert.equal(
         DiscoveryStream(undefined, { type: "some_action" }),
         INITIAL_STATE.DiscoveryStream
       );
     });
+    it("should set isPrivacyInfoModalVisible to true with SHOW_PRIVACY_INFO", () => {
+      const state = DiscoveryStream(undefined, {
+        type: at.SHOW_PRIVACY_INFO,
+      });
+      assert.equal(state.isPrivacyInfoModalVisible, true);
+    });
+    it("should set isPrivacyInfoModalVisible to false with HIDE_PRIVACY_INFO", () => {
+      const state = DiscoveryStream(undefined, {
+        type: at.HIDE_PRIVACY_INFO,
+      });
+      assert.equal(state.isPrivacyInfoModalVisible, false);
+    });
     it("should set layout data with DISCOVERY_STREAM_LAYOUT_UPDATE", () => {
       const state = DiscoveryStream(undefined, {
         type: at.DISCOVERY_STREAM_LAYOUT_UPDATE,
         data: { layout: ["test"], lastUpdated: 123 },
       });
       assert.equal(state.layout[0], "test");
       assert.equal(state.lastUpdated, 123);
     });
--- a/browser/components/newtab/test/unit/content-src/components/DiscoveryStreamComponents/DSContextFooter.test.jsx
+++ b/browser/components/newtab/test/unit/content-src/components/DiscoveryStreamComponents/DSContextFooter.test.jsx
@@ -22,18 +22,34 @@ describe("<DSContextFooter>", () => {
   afterEach(() => {
     sandbox.restore();
   });
 
   it("should render", () => {
     assert.isTrue(wrapper.exists());
     assert.isOk(wrapper.find(".story-footer"));
   });
+  it("should not render an engagement status if display_engagement_labels is false", () => {
+    wrapper = mount(
+      <DSContextFooter
+        display_engagement_labels={false}
+        engagement={engagement}
+      />
+    );
+
+    const engagementLabel = wrapper.find(".story-view-count");
+    assert.equal(engagementLabel.length, 0);
+  });
   it("should render an engagement status if no badge and spoc passed", () => {
-    wrapper = mount(<DSContextFooter engagement={engagement} />);
+    wrapper = mount(
+      <DSContextFooter
+        display_engagement_labels={true}
+        engagement={engagement}
+      />
+    );
 
     const engagementLabel = wrapper.find(".story-view-count");
     assert.equal(engagementLabel.text(), engagement);
   });
   it("should render a badge if a proper badge prop is passed", () => {
     wrapper = mount(
       <DSContextFooter context_type={bookmarkBadge} engagement={engagement} />
     );
--- a/browser/components/newtab/test/unit/content-src/components/DiscoveryStreamComponents/DSLinkMenu.test.jsx
+++ b/browser/components/newtab/test/unit/content-src/components/DiscoveryStreamComponents/DSLinkMenu.test.jsx
@@ -129,16 +129,17 @@ describe("<DSLinkMenu>", () => {
     });
 
     it("should pass through the correct menu options to LinkMenu", () => {
       wrapper
         .find(ContextMenuButton)
         .simulate("click", { preventDefault: () => {} });
       const linkMenuProps = wrapper.find(LinkMenu).props();
       assert.deepEqual(linkMenuProps.options, [
+        "ShowPrivacyInfo",
         "CheckBookmarkOrArchive",
         "CheckSavedToPocket",
         "Separator",
         "OpenInNewWindow",
         "OpenInPrivateWindow",
         "Separator",
         "BlockUrl",
       ]);
new file mode 100644
--- /dev/null
+++ b/browser/components/newtab/test/unit/content-src/components/DiscoveryStreamComponents/DSPrivacyModal.test.jsx
@@ -0,0 +1,25 @@
+import { DSPrivacyModal } from "content-src/components/DiscoveryStreamComponents/DSPrivacyModal/DSPrivacyModal";
+import { shallow, mount } from "enzyme";
+import React from "react";
+
+describe("Discovery Stream <DSPrivacyModal>", () => {
+  let sandbox;
+  beforeEach(() => {
+    sandbox = sinon.createSandbox();
+  });
+
+  it("should contain a privacy notice", () => {
+    const modal = mount(<DSPrivacyModal />);
+    const child = modal.find(".privacy-notice");
+
+    assert.lengthOf(child, 1);
+  });
+
+  it("should call dispatch when modal is closed", () => {
+    let dispatch = sandbox.stub();
+    let wrapper = shallow(<DSPrivacyModal dispatch={dispatch} />);
+
+    wrapper.instance().closeModal();
+    assert.calledOnce(dispatch);
+  });
+});
--- a/browser/components/newtab/test/unit/content-src/components/LinkMenu.test.jsx
+++ b/browser/components/newtab/test/unit/content-src/components/LinkMenu.test.jsx
@@ -317,16 +317,17 @@ describe("<LinkMenu>", () => {
     };
     const dispatch = sinon.stub();
     const propOptions = [
       "ShowFile",
       "CopyDownloadLink",
       "GoToDownloadPage",
       "RemoveDownload",
       "Separator",
+      "ShowPrivacyInfo",
       "RemoveBookmark",
       "AddBookmark",
       "OpenInNewWindow",
       "OpenInPrivateWindow",
       "BlockUrl",
       "DeleteUrl",
       "PinTopSite",
       "UnpinTopSite",
deleted file mode 100644
--- a/browser/components/newtab/test/unit/content-src/components/StartupOverlay.test.jsx
+++ /dev/null
@@ -1,100 +0,0 @@
-import { actionCreators as ac, actionTypes as at } from "common/Actions.jsm";
-import { mount } from "enzyme";
-import React from "react";
-import { StartupOverlay } from "content-src/asrouter/templates/StartupOverlay/StartupOverlay";
-
-describe("<StartupOverlay>", () => {
-  let wrapper;
-  let fakeDocument;
-  let dummyNode;
-  let dispatch;
-  let onBlock;
-  let sandbox;
-  beforeEach(() => {
-    sandbox = sinon.createSandbox();
-    dispatch = sandbox.stub();
-    onBlock = sandbox.stub();
-
-    dummyNode = document.createElement("body");
-    sandbox.stub(dummyNode, "querySelector").returns(dummyNode);
-    fakeDocument = {
-      get activeElement() {
-        return dummyNode;
-      },
-      get body() {
-        return dummyNode;
-      },
-      getElementById() {
-        return dummyNode;
-      },
-    };
-
-    wrapper = mount(
-      <StartupOverlay
-        onBlock={onBlock}
-        dispatch={dispatch}
-        document={fakeDocument}
-      />
-    );
-  });
-
-  afterEach(() => {
-    sandbox.restore();
-  });
-
-  it("should add show class after mount and timeout", async () => {
-    const clock = sandbox.useFakeTimers();
-    // We need to mount here to trigger ComponentDidMount after the FakeTimers are added.
-    wrapper = mount(
-      <StartupOverlay
-        onBlock={onBlock}
-        dispatch={dispatch}
-        document={fakeDocument}
-      />
-    );
-    assert.isFalse(
-      wrapper.find(".overlay-wrapper").hasClass("show"),
-      ".overlay-wrapper does not have .show class"
-    );
-
-    clock.tick(10);
-    wrapper.update();
-
-    assert.isTrue(
-      wrapper.find(".overlay-wrapper").hasClass("show"),
-      ".overlay-wrapper has .show class"
-    );
-  });
-
-  it("should emit UserEvent SKIPPED_SIGNIN when you click the skip button", () => {
-    let skipButton = wrapper.find(".skip-button");
-    assert.ok(skipButton.exists());
-    skipButton.simulate("click");
-
-    assert.calledOnce(dispatch);
-    assert.isUserEventAction(dispatch.firstCall.args[0]);
-    assert.calledWith(
-      dispatch,
-      ac.UserEvent({
-        event: at.SKIPPED_SIGNIN,
-        value: { has_flow_params: false },
-      })
-    );
-  });
-
-  it("should emit UserEvent SUBMIT_EMAIL when you submit the form", () => {
-    let form = wrapper.find("form");
-    assert.ok(form.exists());
-    form.simulate("submit");
-
-    assert.calledOnce(dispatch);
-    assert.isUserEventAction(dispatch.firstCall.args[0]);
-    assert.calledWith(
-      dispatch,
-      ac.UserEvent({
-        event: at.SUBMIT_EMAIL,
-        value: { has_flow_params: false },
-      })
-    );
-  });
-});
--- a/browser/components/newtab/test/unit/content-src/components/TopSites.test.jsx
+++ b/browser/components/newtab/test/unit/content-src/components/TopSites.test.jsx
@@ -812,16 +812,41 @@ describe("<TopSite>", () => {
 
       assert.propertyVal(action.data, "event", "CLICK");
       assert.propertyVal(action.data, "source", "TOP_SITES");
       assert.propertyVal(action.data, "action_position", 3);
       assert.propertyVal(action.data.value, "card_type", "search");
       assert.propertyVal(action.data.value, "icon_type", "tippytop");
       assert.propertyVal(action.data.value, "search_vendor", "google");
     });
+    it("should dispatch a UserEventAction with the right data for SPOC top site", () => {
+      const dispatch = sinon.stub();
+      const siteInfo = {
+        iconType: "custom_screenshot",
+        type: "SPOC",
+      };
+      const wrapper = shallow(
+        <TopSite
+          link={Object.assign({}, link, siteInfo)}
+          index={0}
+          dispatch={dispatch}
+        />
+      );
+
+      wrapper.find(TopSiteLink).simulate("click", { preventDefault() {} });
+
+      const [action] = dispatch.firstCall.args;
+      assert.isUserEventAction(action);
+
+      assert.propertyVal(action.data, "event", "CLICK");
+      assert.propertyVal(action.data, "source", "TOP_SITES");
+      assert.propertyVal(action.data, "action_position", 0);
+      assert.propertyVal(action.data.value, "card_type", "spoc");
+      assert.propertyVal(action.data.value, "icon_type", "custom_screenshot");
+    });
     it("should dispatch OPEN_LINK with the right data", () => {
       const dispatch = sinon.stub();
       const wrapper = shallow(
         <TopSite
           link={Object.assign({}, link, { typedBonus: true })}
           index={3}
           dispatch={dispatch}
         />
--- a/browser/components/newtab/test/unit/lib/ToolbarPanelHub.test.js
+++ b/browser/components/newtab/test/unit/lib/ToolbarPanelHub.test.js
@@ -34,16 +34,17 @@ describe("ToolbarPanelHub", () => {
       removeAttribute: sandbox.stub(),
       querySelector: sandbox.stub().returns(null),
       querySelectorAll: sandbox.stub().returns([]),
       appendChild: sandbox.stub(),
       addEventListener: sandbox.stub(),
       hasAttribute: sandbox.stub(),
       toggleAttribute: sandbox.stub(),
       remove: sandbox.stub(),
+      removeChild: sandbox.stub(),
     };
     fakeDocument = {
       l10n: {
         setAttributes: sandbox.stub(),
       },
       getElementById: sandbox.stub().returns(fakeElementById),
       querySelector: sandbox.stub().returns({}),
       createElementNS: (ns, tagName) => {
@@ -281,16 +282,32 @@ describe("ToolbarPanelHub", () => {
           assert.ok(createdElements.find(el => el.tagName === "h4"));
         }
         assert.ok(createdElements.find(el => el.tagName === "p"));
       }
       // Call the click handler to make coverage happy.
       eventListeners.mouseup();
       assert.calledOnce(handleUserActionStub);
     });
+    it("should clear previous messages on 2nd renderMessages()", async () => {
+      const messages = (await PanelTestProvider.getMessages()).filter(
+        m => m.template === "whatsnew_panel_message"
+      );
+      fakeElementById.querySelectorAll.onCall(0).returns([]);
+      fakeElementById.querySelectorAll.onCall(1).returns(["a", "b", "c"]);
+
+      getMessagesStub.returns(messages);
+
+      await instance.renderMessages(fakeWindow, fakeDocument, "container-id");
+      await instance.renderMessages(fakeWindow, fakeDocument, "container-id");
+
+      assert.calledThrice(fakeElementById.removeChild);
+      assert.equal(fakeElementById.removeChild.firstCall.args[0], "a");
+      assert.equal(fakeElementById.removeChild.secondCall.args[0], "b");
+    });
     it("should sort based on order field value", async () => {
       const messages = (await PanelTestProvider.getMessages()).filter(
         m =>
           m.template === "whatsnew_panel_message" &&
           m.content.published_date === 1560969794394
       );
 
       messages.forEach(m => (m.content.title = m.order));
@@ -639,22 +656,27 @@ describe("ToolbarPanelHub", () => {
       });
     });
   });
   describe("#insertProtectionPanelMessage", () => {
     const fakeInsert = () =>
       instance.insertProtectionPanelMessage({
         target: { ownerGlobal: fakeWindow, ownerDocument: fakeDocument },
       });
+    let getMessagesStub;
     beforeEach(async () => {
       const onboardingMsgs = await OnboardingMessageProvider.getUntranslatedMessages();
+      getMessagesStub = sandbox
+        .stub()
+        .resolves(
+          onboardingMsgs.find(msg => msg.template === "protections_panel")
+        );
       await instance.init(waitForInitializedStub, {
         dispatch: fakeDispatch,
-        getMessages: () =>
-          onboardingMsgs.find(msg => msg.template === "protections_panel"),
+        getMessages: getMessagesStub,
         handleUserAction: handleUserActionStub,
       });
     });
     it("should remember it showed", async () => {
       await fakeInsert();
 
       assert.calledWithExactly(
         setBoolPrefStub,
@@ -671,17 +693,40 @@ describe("ToolbarPanelHub", () => {
     });
     it("should toggle again when popup hides", async () => {
       fakeElementById.addEventListener.callsArg(1);
 
       await fakeInsert();
 
       assert.callCount(fakeElementById.toggleAttribute, 6);
     });
-    it("should open link on click", async () => {
+    it("should open link on click (separate link element)", async () => {
+      await fakeInsert();
+
+      eventListeners.mouseup();
+
+      assert.calledOnce(handleUserActionStub);
+      assert.calledWithExactly(handleUserActionStub, {
+        target: fakeWindow,
+        data: {
+          type: "OPEN_URL",
+          data: {
+            args: sinon.match.string,
+            where: "tabshifted",
+          },
+        },
+      });
+    });
+    it("should open link on click (directly attached to the message)", async () => {
+      const onboardingMsgs = await OnboardingMessageProvider.getUntranslatedMessages();
+      const msg = onboardingMsgs.find(m => m.template === "protections_panel");
+      getMessagesStub.resolves({
+        ...msg,
+        content: { ...msg.content, link_text: null },
+      });
       await fakeInsert();
 
       eventListeners.mouseup();
 
       assert.calledOnce(handleUserActionStub);
       assert.calledWithExactly(handleUserActionStub, {
         target: fakeWindow,
         data: {
--- a/browser/locales/en-US/browser/newtab/newtab.ftl
+++ b/browser/locales/en-US/browser/newtab/newtab.ftl
@@ -78,16 +78,30 @@ newtab-menu-open-new-window = Open in a 
 newtab-menu-open-new-private-window = Open in a New Private Window
 newtab-menu-dismiss = Dismiss
 newtab-menu-pin = Pin
 newtab-menu-unpin = Unpin
 newtab-menu-delete-history = Delete from History
 newtab-menu-save-to-pocket = Save to { -pocket-brand-name }
 newtab-menu-delete-pocket = Delete from { -pocket-brand-name }
 newtab-menu-archive-pocket = Archive in { -pocket-brand-name }
+newtab-menu-show-privacy-info = Our sponsors & your privacy
+
+## Message displayed in a modal window to explain privacy and provide context for sponsored content.
+
+newtab-privacy-modal-button-done = Done
+newtab-privacy-modal-header = Your privacy matters.
+newtab-privacy-modal-paragraph =
+    In addition to dishing up captivating stories, we also show you relevant,
+    highly-vetted content from select sponsors. Rest assured, your browsing
+    data never leaves your personal copy of { -brand-product-name } — we don’t see it, and our
+    sponsors don’t either.
+newtab-privacy-modal-link = Learn how privacy works on the new tab
+
+##
 
 # Bookmark is a noun in this case, "Remove bookmark".
 newtab-menu-remove-bookmark = Remove Bookmark
 # Bookmark is a verb here.
 newtab-menu-bookmark = Bookmark
 
 ## Context Menu - Downloaded Menu. "Download" in these cases is not a verb,
 ## it is a noun. As in, "Copy the link that belongs to this downloaded item".
--- a/browser/locales/en-US/browser/newtab/onboarding.ftl
+++ b/browser/locales/en-US/browser/newtab/onboarding.ftl
@@ -13,16 +13,21 @@
 onboarding-button-label-learn-more = Learn More
 onboarding-button-label-get-started = Get Started
 
 ## Welcome modal dialog strings
 
 onboarding-welcome-header = Welcome to { -brand-short-name }
 onboarding-welcome-body = You’ve got the browser.<br/>Meet the rest of { -brand-product-name }.
 onboarding-welcome-learn-more = Learn more about the benefits.
+onboarding-welcome-modal-get-body = You’ve got the browser.<br/>Now get the most out of { -brand-product-name }.
+onboarding-welcome-modal-supercharge-body = Supercharge your privacy protection.
+onboarding-welcome-modal-privacy-body = You’ve got the browser. Let’s add more privacy protection.
+onboarding-welcome-modal-family-learn-more = Learn about the { -brand-product-name } family of products.
+onboarding-welcome-form-header = Start Here
 
 onboarding-join-form-header = Join { -brand-product-name }
 onboarding-join-form-body = Enter your email address to get started.
 onboarding-join-form-email =
     .placeholder = Enter email
 onboarding-join-form-email-error = Valid email required
 onboarding-join-form-legal = By proceeding, you agree to the <a data-l10n-name="terms">Terms of Service</a> and <a data-l10n-name="privacy">Privacy Notice</a>.
 onboarding-join-form-continue = Continue
@@ -32,18 +37,16 @@ onboarding-cards-dismiss =
     .title = Dismiss
     .aria-label = Dismiss
 
 ## Firefox Sync modal dialog strings.
 
 onboarding-sync-welcome-header = Take { -brand-product-name } with You
 onboarding-sync-welcome-content = Get your bookmarks, history, passwords and other settings on all your devices.
 onboarding-sync-welcome-learn-more-link = Learn more about Firefox Accounts
-onboarding-sync-form-invalid-input = Valid email required
-onboarding-sync-legal-notice = By proceeding, you agree to the <a data-l10n-name="terms">Terms of Service</a> and <a data-l10n-name="privacy">Privacy Notice</a>.
 
 onboarding-sync-form-input =
     .placeholder = Email
 
 onboarding-sync-form-continue-button = Continue
 onboarding-sync-form-skip-login-button = Skip this step
 
 ## This is part of the line "Enter your email to continue to Firefox Sync"
@@ -64,16 +67,25 @@ onboarding-benefit-knowledge-text = Learn everything you need to know to stay smarter and safer online.
 onboarding-benefit-privacy-title = True Privacy
 # "Personal Data Promise" is a concept that should be translated consistently
 # across the product. It refers to a concept shown elsewhere to the user: "The
 # Firefox Personal Data Promise is the way we honor your data in everything we
 # make and do. We take less data. We keep it safe. And we make sure that we are
 # transparent about how we use it."
 onboarding-benefit-privacy-text = Everything we do honors our Personal Data Promise: Take less. Keep it safe. No secrets.
 
+onboarding-benefit-sync-title = { -sync-brand-short-name }
+onboarding-benefit-sync-text = Take your bookmarks, passwords, history, and more everywhere you use { -brand-product-name }.
+
+onboarding-benefit-monitor-title = { -monitor-brand-short-name }
+onboarding-benefit-monitor-text = Get notified when your personal info is in a known data breach.
+
+onboarding-benefit-lockwise-title = { -lockwise-brand-short-name }
+onboarding-benefit-lockwise-text = Manage passwords that are protected and portable.
+
 
 ## These strings belong to the individual onboarding messages.
 
 ## Each message has a title and a description of what the browser feature is.
 ## Each message also has an associated button for the user to try the feature.
 ## The string for the button is found above, in the UI strings section
 
 onboarding-tracking-protection-title2 = Protection From Tracking